aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--LICENSE39
-rw-r--r--README86
-rw-r--r--addon/LICENSE10
-rw-r--r--addon/README186
-rw-r--r--addon/calc/calc.php363
-rw-r--r--addon/convert/UnitConvertor.php283
-rw-r--r--addon/convert/convert.php228
-rw-r--r--addon/facebook/README39
-rw-r--r--addon/facebook/facebook.css13
-rw-r--r--addon/facebook/facebook.php1046
-rw-r--r--addon/fortunate/fortunate.css7
-rw-r--r--addon/fortunate/fortunate.php27
-rw-r--r--addon/impressum/README27
-rw-r--r--addon/impressum/admin.tpl6
-rw-r--r--addon/impressum/impressum.php76
-rw-r--r--addon/js_upload/file-uploader/client/demo.htm38
-rw-r--r--addon/js_upload/file-uploader/client/do-nothing.htm1
-rw-r--r--addon/js_upload/file-uploader/client/fileuploader.css31
-rw-r--r--addon/js_upload/file-uploader/client/fileuploader.js1247
-rw-r--r--addon/js_upload/file-uploader/client/loading.gifbin1688 -> 0 bytes
-rw-r--r--addon/js_upload/file-uploader/gpl-2.0.txt339
-rw-r--r--addon/js_upload/file-uploader/license.txt24
-rw-r--r--addon/js_upload/file-uploader/readme.md152
-rw-r--r--addon/js_upload/file-uploader/server/OctetStreamReader.java125
-rw-r--r--addon/js_upload/file-uploader/server/coldfusion/coldfusion.cfc1
-rw-r--r--addon/js_upload/file-uploader/server/coldfusion/demo.cfm1
-rw-r--r--addon/js_upload/file-uploader/server/coldfusion/readme.txt9
-rw-r--r--addon/js_upload/file-uploader/server/perl.cgi62
-rw-r--r--addon/js_upload/file-uploader/server/php.php162
-rw-r--r--addon/js_upload/file-uploader/server/readme.txt18
-rw-r--r--addon/js_upload/file-uploader/server/uploads/.gitignore2
-rw-r--r--addon/js_upload/file-uploader/tests/action-acceptance.php46
-rw-r--r--addon/js_upload/file-uploader/tests/action-handler-queue-test.php31
-rw-r--r--addon/js_upload/file-uploader/tests/action-handler-test.php31
-rw-r--r--addon/js_upload/file-uploader/tests/action-slow-response.php2
-rw-r--r--addon/js_upload/file-uploader/tests/browser-bugs/safari-bug1.htm9
-rw-r--r--addon/js_upload/file-uploader/tests/browser-bugs/safari-bug2.htm19
-rw-r--r--addon/js_upload/file-uploader/tests/iframe-content-tests/application-javascript.php1
-rw-r--r--addon/js_upload/file-uploader/tests/iframe-content-tests/application-json.php1
-rw-r--r--addon/js_upload/file-uploader/tests/iframe-content-tests/header-404.php2
-rw-r--r--addon/js_upload/file-uploader/tests/iframe-content-tests/somepage.php1
-rw-r--r--addon/js_upload/file-uploader/tests/iframe-content-tests/text-html-large.php6
-rw-r--r--addon/js_upload/file-uploader/tests/iframe-content-tests/text-html.php7
-rw-r--r--addon/js_upload/file-uploader/tests/iframe-content-tests/text-javascript.php1
-rw-r--r--addon/js_upload/file-uploader/tests/iframe-content-tests/text-plain.php2
-rw-r--r--addon/js_upload/file-uploader/tests/jquery-1.4.2.min.js154
-rw-r--r--addon/js_upload/file-uploader/tests/jquery-ui/jquery-ui-1.8.4.custom.min.js200
-rw-r--r--addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.pngbin260 -> 0 bytes
-rw-r--r--addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.pngbin251 -> 0 bytes
-rw-r--r--addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_flat_10_000000_40x100.pngbin178 -> 0 bytes
-rw-r--r--addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.pngbin104 -> 0 bytes
-rw-r--r--addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.pngbin125 -> 0 bytes
-rw-r--r--addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.pngbin105 -> 0 bytes
-rw-r--r--addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.pngbin4427 -> 0 bytes
-rw-r--r--addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.pngbin90 -> 0 bytes
-rw-r--r--addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.pngbin129 -> 0 bytes
-rw-r--r--addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_222222_256x240.pngbin4369 -> 0 bytes
-rw-r--r--addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_228ef1_256x240.pngbin4369 -> 0 bytes
-rw-r--r--addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_ef8c08_256x240.pngbin4369 -> 0 bytes
-rw-r--r--addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_ffd27a_256x240.pngbin4369 -> 0 bytes
-rw-r--r--addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_ffffff_256x240.pngbin4369 -> 0 bytes
-rw-r--r--addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/jquery-ui-1.8.4.custom.css334
-rw-r--r--addon/js_upload/file-uploader/tests/qunit/package.json21
-rw-r--r--addon/js_upload/file-uploader/tests/qunit/qunit/qunit.css119
-rw-r--r--addon/js_upload/file-uploader/tests/qunit/qunit/qunit.js1069
-rw-r--r--addon/js_upload/file-uploader/tests/qunit/test/index.html17
-rw-r--r--addon/js_upload/file-uploader/tests/qunit/test/same.js1423
-rw-r--r--addon/js_upload/file-uploader/tests/qunit/test/test.js171
-rw-r--r--addon/js_upload/file-uploader/tests/sample-files/1imagelonglonglonglonglonglongname.gifbin1688 -> 0 bytes
-rw-r--r--addon/js_upload/file-uploader/tests/sample-files/2larger.txt1
-rw-r--r--addon/js_upload/file-uploader/tests/sample-files/3empty.txt0
-rw-r--r--addon/js_upload/file-uploader/tests/sample-files/4text.txt1
-rw-r--r--addon/js_upload/file-uploader/tests/sample-files/5text.txt1
-rw-r--r--addon/js_upload/file-uploader/tests/sample-files/6text.txt1
-rw-r--r--addon/js_upload/file-uploader/tests/sample-files/7small.txt1
-rw-r--r--addon/js_upload/file-uploader/tests/sample-files/8text.txt1
-rw-r--r--addon/js_upload/file-uploader/tests/separate-file-list.htm24
-rw-r--r--addon/js_upload/file-uploader/tests/test-acceptance.htm106
-rw-r--r--addon/js_upload/file-uploader/tests/test-drop-zone.htm48
-rw-r--r--addon/js_upload/file-uploader/tests/test-handler-queue.htm81
-rw-r--r--addon/js_upload/file-uploader/tests/test-upload-handlers.htm382
-rw-r--r--addon/js_upload/js_upload.php339
-rw-r--r--addon/ldapauth/README17
-rw-r--r--addon/ldapauth/ldapauth.php130
-rw-r--r--addon/oembed/oembed.js6
-rw-r--r--addon/oembed/oembed.php89
-rw-r--r--addon/oembed/oembed.pngbin417 -> 0 bytes
-rw-r--r--addon/oembed/settings.tpl7
-rw-r--r--addon/piwik/README43
-rw-r--r--addon/piwik/admin.tpl4
-rw-r--r--addon/piwik/piwik.css8
-rw-r--r--addon/piwik/piwik.php95
-rw-r--r--addon/poormancron/poormancron.php64
-rw-r--r--addon/randplace/randplace.css14
-rw-r--r--addon/randplace/randplace.php180
-rw-r--r--addon/sniper/100x100.gifbin6870 -> 0 bytes
-rw-r--r--addon/sniper/100x100.jpgbin30484 -> 0 bytes
-rw-r--r--addon/sniper/100x75.jpgbin12010 -> 0 bytes
-rw-r--r--addon/sniper/100x80.jpgbin12524 -> 0 bytes
-rw-r--r--addon/sniper/120x90hotshotsniper.jpgbin16122 -> 0 bytes
-rw-r--r--addon/sniper/125x125.jpgbin31696 -> 0 bytes
-rw-r--r--addon/sniper/140x90.jpgbin17690 -> 0 bytes
-rw-r--r--addon/sniper/150x150.jpgbin43762 -> 0 bytes
-rw-r--r--addon/sniper/160x86.gifbin9420 -> 0 bytes
-rw-r--r--addon/sniper/180x135.jpgbin10466 -> 0 bytes
-rw-r--r--addon/sniper/250x180.jpgbin39574 -> 0 bytes
-rw-r--r--addon/sniper/300x200.jpgbin16466 -> 0 bytes
-rw-r--r--addon/sniper/300x300.jpgbin19530 -> 0 bytes
-rw-r--r--addon/sniper/32x32.jpgbin13904 -> 0 bytes
-rw-r--r--addon/sniper/335x185.jpgbin15345 -> 0 bytes
-rw-r--r--addon/sniper/60x60.jpgbin19531 -> 0 bytes
-rw-r--r--addon/sniper/64x64.gifbin3663 -> 0 bytes
-rw-r--r--addon/sniper/70x45.jpgbin15510 -> 0 bytes
-rw-r--r--addon/sniper/70x60.jpgbin8167 -> 0 bytes
-rw-r--r--addon/sniper/73x80.jpgbin9456 -> 0 bytes
-rw-r--r--addon/sniper/75x57.jpgbin8298 -> 0 bytes
-rw-r--r--addon/sniper/80x60.jpgbin7889 -> 0 bytes
-rw-r--r--addon/sniper/80x70.jpgbin5218 -> 0 bytes
-rw-r--r--addon/sniper/80x80hotshotsniper.jpgbin23760 -> 0 bytes
-rw-r--r--addon/sniper/81x67.jpgbin9805 -> 0 bytes
-rw-r--r--addon/sniper/description_etc.txt11
-rw-r--r--addon/sniper/hotshotsniper.html15
-rw-r--r--addon/sniper/hotshotsniper.swfbin927817 -> 0 bytes
-rw-r--r--addon/sniper/sniper.php43
-rw-r--r--addon/statusnet/README75
-rw-r--r--addon/statusnet/admin.tpl16
-rw-r--r--addon/statusnet/signinwithstatusnet.pngbin5808 -> 0 bytes
-rw-r--r--addon/statusnet/statusnet.css74
-rw-r--r--addon/statusnet/statusnet.php480
-rw-r--r--addon/tictac/tictac.php665
-rw-r--r--addon/twitter/README77
-rw-r--r--addon/twitter/admin.tpl3
-rw-r--r--addon/twitter/lighter.pngbin2490 -> 0 bytes
-rw-r--r--addon/twitter/twitter.css41
-rw-r--r--addon/twitter/twitter.php285
-rw-r--r--addon/widgets/settings.tpl19
-rw-r--r--addon/widgets/widget_friends.php32
-rw-r--r--addon/widgets/widget_like.php22
-rw-r--r--addon/widgets/widgets.js64
-rw-r--r--addon/widgets/widgets.php170
-rw-r--r--boot.php11
-rw-r--r--database.sql10
-rw-r--r--images/icons.pngbin11885 -> 12389 bytes
-rw-r--r--images/larrow.gifbin212 -> 211 bytes
-rw-r--r--images/logo.pngbin0 -> 9787 bytes
-rw-r--r--images/lrarrow.gifbin236 -> 236 bytes
-rw-r--r--include/EmailNotification.php7
-rw-r--r--include/Scrape.php22
-rw-r--r--include/api.php2
-rw-r--r--include/auth.php4
-rw-r--r--include/bb2diaspora.php27
-rw-r--r--include/bbcode.php15
-rw-r--r--include/conversation.php29
-rw-r--r--include/delivery.php147
-rw-r--r--include/diaspora.php311
-rw-r--r--include/email.php15
-rw-r--r--include/group.php30
-rw-r--r--include/items.php18
-rw-r--r--include/network.php73
-rw-r--r--include/notifier.php33
-rw-r--r--include/pgettext.php23
-rw-r--r--include/poller.php17
-rw-r--r--include/profile_advanced.php76
-rw-r--r--include/queue.php3
-rw-r--r--include/template_processor.php20
-rw-r--r--include/text.php66
-rw-r--r--index.php8
-rw-r--r--library/markdown.php2
-rw-r--r--mod/contacts.php23
-rw-r--r--mod/dfrn_notify.php25
-rw-r--r--mod/display.php2
-rw-r--r--mod/editpost.php2
-rw-r--r--mod/follow.php5
-rw-r--r--mod/friendika.php2
-rw-r--r--mod/group.php5
-rw-r--r--mod/hostxrd.php3
-rw-r--r--mod/item.php19
-rw-r--r--mod/like.php27
-rw-r--r--mod/message.php16
-rw-r--r--mod/network.php251
-rw-r--r--mod/oexchange.php13
-rw-r--r--mod/openid.php2
-rw-r--r--mod/parse_url.php132
-rw-r--r--mod/photos.php64
-rw-r--r--mod/profile.php1
-rw-r--r--mod/pubsub.php4
-rw-r--r--mod/receive.php34
-rw-r--r--mod/register.php3
-rw-r--r--mod/salmon.php4
-rw-r--r--mod/search.php6
-rw-r--r--mod/xrd.php1
-rw-r--r--update.php46
-rw-r--r--util/po2php.php11
-rw-r--r--view/cs/strings.php2
-rw-r--r--view/de/strings.php8
-rw-r--r--view/es/strings.php536
-rw-r--r--view/follow.tpl15
-rw-r--r--view/fr/strings.php2
-rw-r--r--view/it/strings.php2
-rw-r--r--view/it/wall_received_html_body_eml.tpl24
-rw-r--r--view/it/wall_received_text_body_eml.tpl18
-rw-r--r--view/jot-header.tpl2
-rw-r--r--view/like.tpl4
-rw-r--r--view/pt-br/strings.php2
-rw-r--r--view/ru/strings.php2
-rw-r--r--view/theme/dispy/jot-header.tpl2
-rw-r--r--view/theme/dispy/jot.tpl2
-rw-r--r--view/theme/duepuntozero/style.css15
-rw-r--r--view/theme/greenzero/greenicons.pngbin11888 -> 12317 bytes
-rw-r--r--view/theme/loozah/style.css21
-rw-r--r--view/theme/testbubble/calendar.pngbin0 -> 3779 bytes
-rw-r--r--view/theme/testbubble/connect.pngbin0 -> 443 bytes
-rw-r--r--view/theme/testbubble/contact_edit.tpl67
-rw-r--r--view/theme/testbubble/group_drop.tpl8
-rw-r--r--view/theme/testbubble/group_edit.tpl19
-rw-r--r--view/theme/testbubble/groups.pngbin0 -> 911 bytes
-rw-r--r--view/theme/testbubble/icons.pngbin0 -> 22600 bytes
-rw-r--r--view/theme/testbubble/icons.svg1442
-rw-r--r--view/theme/testbubble/jot-header.tpl251
-rw-r--r--view/theme/testbubble/jot.tpl75
-rw-r--r--view/theme/testbubble/login-bg.gifbin0 -> 237 bytes
-rw-r--r--view/theme/testbubble/login.tpl25
-rw-r--r--view/theme/testbubble/lrarrow.gifbin0 -> 236 bytes
-rw-r--r--view/theme/testbubble/mail_head.tpl7
-rw-r--r--view/theme/testbubble/menu-user-pin.jpgbin0 -> 385 bytes
-rw-r--r--view/theme/testbubble/menu-user-pin.pngbin0 -> 276 bytes
-rw-r--r--view/theme/testbubble/nav.tpl54
-rw-r--r--view/theme/testbubble/next.pngbin0 -> 891 bytes
-rw-r--r--view/theme/testbubble/notifications.pngbin0 -> 6225 bytes
-rw-r--r--view/theme/testbubble/photo-menu.jpgbin0 -> 2801 bytes
-rw-r--r--view/theme/testbubble/photo_view.tpl40
-rw-r--r--view/theme/testbubble/photography.pngbin0 -> 766 bytes
-rw-r--r--view/theme/testbubble/premium.pngbin0 -> 2317 bytes
-rw-r--r--view/theme/testbubble/prev.pngbin0 -> 853 bytes
-rw-r--r--view/theme/testbubble/profile_entry.tpl11
-rw-r--r--view/theme/testbubble/profile_tabs.tpl9
-rw-r--r--view/theme/testbubble/search.pngbin0 -> 808 bytes
-rw-r--r--view/theme/testbubble/search_item.tpl39
-rw-r--r--view/theme/testbubble/star.pngbin0 -> 2129 bytes
-rw-r--r--view/theme/testbubble/style.css3277
-rw-r--r--view/theme/testbubble/user.pngbin0 -> 664 bytes
-rw-r--r--view/theme/testbubble/wall_item.tpl51
-rw-r--r--view/theme/testbubble/wallwall_item.tpl51
-rw-r--r--view/xrd_host.tpl13
-rw-r--r--view/xrd_person.tpl11
246 files changed, 7153 insertions, 12676 deletions
diff --git a/.gitignore b/.gitignore
index a2d1ffa54..cbdf03673 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,4 +7,4 @@ include/jquery-1.4.2.min.js
*.version*
favicon.*
home.html
-*~
+addon
diff --git a/LICENSE b/LICENSE
index 33579fe08..3136dd4f8 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,25 +1,20 @@
-The Friendika project is distributed under the following license terms:
+Copyright (c) 2010, 2011 the Friendika Project
+All rights reserved.
-* This software is provided for any use with no license terms or restrictions.
-
-No guarantee is provided. Use at your own risk.
-
-Components packaged with this software may fall under different license terms.
-
-cropper - BSD
-TwitterOAuth - BSD
-markdown - BSD
-slinky - BSD
-ajax-upload - MIT
-simplepie - MIT
-LightOpenID - MIT
-HTML5 - MIT
-jQuery - MIT
-TinyMCE - LGPL
-phpsec - LGPL
-HTMLPurifer - LGPL
-Facebook SDK - Apache
-
-Addons, plugins, and themes may also be provided under their own license terms.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/README b/README
deleted file mode 100644
index 598b6d292..000000000
--- a/README
+++ /dev/null
@@ -1,86 +0,0 @@
-
- *************
- * Friendika *
- *************
-
- Friendika Communications Server
-
- http://project.friendika.com
-
-
- Friendika is a web application for managing social communications. Some
-would call it a "social network" or "distributed social network". We think
-both terms have been over-used, and don't adequately describe Friendika's
-capabilities - though Friendika can also fill those roles.
-
- At its essence, Friendika is a web application which can monitor various
-information and social activity streams, and which also lets you participate
-in online conversations with friends and associates, using a variety of network
-protocols. These are combined into an overview of your various communications
-and activities - regardless of network origin.
-
- Friendika also manages your personal profiles and photo albums and lets
-you securely present each of these to specific audiences. Your communications
-can be either open and public, or closed and private. You can easily create
-"groups" of contacts with which you can partition your conversations into
-private social circles, and which cannot be seen outside the circle.
-
- Friendika is decentralised. Any account on any Friendika server can connect
-with any account on any other Friendika server. You can also connect to and
-interact directly with friends on Facebook, Status.Net, and other federated
-social web services (e.g. identi.ca, GNU-Social, etc.).
-
- Outgoing communications can be directed to Friendika, existing accounts on
-Facebook and Twitter, federated social web providers - or even delivered to
-email contacts.
-
- Incoming data streams aren't limited to traditional social networks.
-They may include most any service which provides a syndication feed (both RSS
-and Atom). This allows you to view communications from friends in other
-diverse social networks - such as Diaspora, Google Buzz, and millions of
-blogs, news services, and other websites. You can also import
-contacts from (and write to) anybody that is accessible from your email
-INBOX and view them in your social stream. Over time we will try to
-build two-way bridges to other services so that you can freely
-interact in both directions with anybody on an accessible network that
-allows it.
-
- Communications between Friendika servers are private and encrypted,
-using military grade encryption - and require mutual identity provenance
-before any data is exchanged. These same crypto mechanisms provide remote
-password-less authentication; allowing you to post to profiles and view private
-photo collections on other servers - without encountering any login and/or
-authorisation dialogues when visiting these sites.
-
- Friendika has no boundaries and no central ownership of the data generated
-within the network. Anybody with a commodity PHP/MySQL web server or hosting
-account can provide a server, and each individual server can then support
-up to several thousand participating members - each with their own unique
-communication and privacy needs. This allows Friendika to scale to global
-levels and mimics the decentralised architecture of the web itself.
-
- If you are creating a website which requires social interaction, Friendika
-can also take the place of blog software, forum software and feed readers, and
-also provide individualised communications and content management - or
-simply be used as an alternative to traditional "monolithic" social networks.
-
- Friendika is also free - in every sense of the word.
-
- Choose freedom - join us.
-
- Find out more about the project at http://project.friendika.com
-
- *******************
- Friendika Demo Site
- *******************
-
- http://demo.friendika.com
-
- *******************
- Friendika Downloads
- *******************
-
- http://github.com/friendika/friendika/tarball/master
-
-
-
diff --git a/addon/LICENSE b/addon/LICENSE
deleted file mode 100644
index 02cff9320..000000000
--- a/addon/LICENSE
+++ /dev/null
@@ -1,10 +0,0 @@
-Friendika addons/plugins license terms are under the control of the project
-author or authors.
-
-Developers are free to set their own license terms on addons/plugins as
-standalone works. These license terms apply only to the covered addon or
-plugin.
-
-Addons/plugins may be licensed under copyleft or other license terms. Although
-these projects may require Friendika to operate, no addon or plugin may
-mandate any changes to the Friendika project license.
diff --git a/addon/README b/addon/README
deleted file mode 100644
index fb1c6340a..000000000
--- a/addon/README
+++ /dev/null
@@ -1,186 +0,0 @@
-Friendika Addon/Plugin development
-
-This is an early specification and hook details may be subject to change.
-
-Please see the sample addon 'randplace' for a working example of using these features.
-
-
-You must register plugins with the system in the .htconfig.php file.
-
-$a->config['system']['addon'] = 'plugin1name, plugin2name, another_name';
-
-Plugin names cannot contain spaces and are used as filenames.
-
-
-Register your plugin hooks during installation.
-
- register_hook($hookname, $file, $function);
-
- $hookname is a string and corresponds to a known Friendika hook
- $file is a pathname relative to the top-level Friendika directory.
- This *should* be 'addon/plugin_name/plugin_name.php' in most cases.
- $function is a string and is the name of the function which will be executed
- when the hook is called.
-
-
-Your hook functions will be called with at least one and possibly two arguments
-
- function myhook_function(&$a, &$b) {
-
-
- }
-
-If you wish to make changes to the calling data, you must declare them as
-reference variables (with '&') during function declaration.
-
-$a is the Friendika 'App' class - which contains a wealth of information
-about the current state of Friendika, such as which module has been called,
-configuration info, the page contents at the point the hook was invoked, profile
-and user information, etc. It is recommeded you call this '$a' to match its usage
-elsewhere.
-
-$b can be called anything you like. This is information which is specific to the hook
-currently being processed, and generally contains information that is being immediately
-processed or acted on that you can use, display, or alter. Remember to declare it with
-'&' if you wish to alter it.
-
-
-Current hooks:
-
-'authenticate' - called when a user attempts to login.
- $b is an array
- 'username' => the supplied username
- 'password' => the supplied password
- 'authenticated' => set this to non-zero to authenticate the user.
- 'user_record' => successful authentication must also return a valid user record from the database
-
-
-'logged_in' - called after a user has successfully logged in.
- $b contains the $a->user array
-
-
-'display_item' - called when formatting a post for display.
- $b is an array
- 'item' => The item (array) details pulled from the database
- 'output' => the (string) HTML representation of this item prior to adding it
- to the page
-
-'post_local' - called when a status post or comment is entered on the local system
- $b is the item array of the information to be stored in the database
- {Please note: body contents are bbcode - not HTML)
-
-'post_local_end' - called when a local status post or comment has been stored on the local system
- $b is the item array of the information which has just been stored in the database
- {Please note: body contents are bbcode - not HTML)
-
-
-'post_remote' - called when receiving a post from another source. This may also be used
- to post local activity or system generated messages.
- $b is the item array of information to be stored in the database and the item
- body is bbcode.
-
-'settings_form' - called when generating the HTML for the user Settings page
- $b is the (string) HTML of the settings page before the final '</form>' tag.
-
-'settings_post' - called when the Settings pages are submitted.
- $b is the $_POST array
-
-'plugin_settings' - called when generating the HTML for the addon settings page
- $b is the (string) HTML of the addon settings page before the final '</form>' tag.
-
-'plugin_settings_post' - called when the Addon Settings pages are submitted.
- $b is the $_POST array
-
-'profile_post' - called when posting a profile page.
- $b is the $_POST array
-
-'profile_edit' - called prior to output of profile edit page
- $b is array
- 'profile' => profile (array) record from the database
- 'entry' => the (string) HTML of the generated entry
-
-'profile_advanced' - called when the HTML is generated for the 'Advanced profile',
- corresponding to the 'Profile' tab within a person's profile page.
- $b is the (string) HTML representation of the generated profile
-
-'directory_item' - called from the Directory page when formatting an item for display
- $b is an array
- 'contact' => contact (array) record for the person from the database
- 'entry' => the (string) HTML of the generated entry
-
-'profile_sidebar_enter' - called prior to generating the sidebar "short" profile for a page
- $b is (array) the person's profile array
-
-'profile_sidebar' - called when generating the sidebar "short" profile for a page
- $b is an array
- 'profile' => profile (array) record for the person from the database
- 'entry' => the (string) HTML of the generated entry
-
-'contact_block_end' - called when formatting the block of contacts/friends on a
- profile sidebar has completed
- $b is an array
- 'contacts' => contact array of entries
- 'output' => the (string) generated HTML of the contact block
-
-'bbcode' - called during conversion of bbcode to html
- $b is (string) converted text
-
-'html2bbcode' - called during conversion of html to bbcode (e.g. remote message posting)
- $b is (string) converted text
-
-
-'page_header' - called after building the page navigation section
- $b is (string) HTML of nav region
-
-
-'personal_xrd' - called prior to output of personal XRD file.
- $b is an array
- 'user' => the user record for the person
- 'xml' => the complete XML to be output
-
-
-'home_content' - called prior to output home page content, shown to unlogged users
- $b is (string) HTML of section region
-
-'contact_edit' - called when editing contact details on an individual from the Contacts page
- $b is (array)
- 'contact' => contact record (array) of target contact
- 'output' => the (string) generated HTML of the contact edit page
-
-'contact_edit_post' - called when posting the contact edit page
- $b is the $_POST array
-
-'init_1' - called just after DB has been opened and before session start
- $b is not used or passed
-
-'page_end' - called after HTML content functions have completed
- $b is (string) HTML of content div
-
-'jot_plugin' - add tools to jot toolbar
- $b is (string) HTML for tool icon
-
-
-*** = subject to change
-
-
-
-
-
-Not yet documented:
-
-'atom_feed' ***
-
-'atom_feed_end' ***
-
-'parse_atom' ***
-
-'atom_author' ***
-
-'atom_entry' ***
-
-'parse_link' ***
-
-
-
-
-
diff --git a/addon/calc/calc.php b/addon/calc/calc.php
deleted file mode 100644
index 47fb22d33..000000000
--- a/addon/calc/calc.php
+++ /dev/null
@@ -1,363 +0,0 @@
-<?php
-/**
- * Name: Calculator App
- * Description: Simple Calculator Application
- * Version: 1.0
- * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
- */
-
-
-function calc_install() {
- register_hook('app_menu', 'addon/calc/calc.php', 'calc_app_menu');
-}
-
-function calc_uninstall() {
- unregister_hook('app_menu', 'addon/calc/calc.php', 'calc_app_menu');
-
-}
-
-function calc_app_menu($a,&$b) {
- $b['app_menu'][] = Array('url'=>'calc', 'name'=>'Calculator');
-}
-
-
-function calc_module() {}
-
-
-
-
-function calc_init($a) {
-
-$x = <<< EOT
-
-<script language="JavaScript">
-/**************************************
- * www.FemaleNerd.com *
- **************************************/
-
-// Declare global variables
-var displayText = ""
-var num1
-var num2
-var operatorType
-
-// Write to display
-function addDisplay(n){
- id = document.getElementById("display");
-id.value = ""
-displayText += n
-id.value = displayText
-}
-
-// Addition
-function addNumbers() {
-if (displayText == "") {
- displayText = result
- }
-num1 = parseFloat(displayText)
-operatorType = "add"
-displayText = ""
-}
-
-// Subtraction
-function subtractNumbers() {
-if (displayText == "") {
- displayText = result
- }
-num1 = parseFloat(displayText)
-operatorType = "subtract"
-displayText = ""
-}
-
-// Multiplication
-function multiplyNumbers() {
-if (displayText == "") {
- displayText = result
- }
-num1 = parseFloat(displayText)
-operatorType = "multiply"
-displayText = ""
-}
-
-// Division
-function divideNumbers() {
-if (displayText == "") {
- displayText = result
- }
-num1 = parseFloat(displayText)
-operatorType = "divide"
-displayText = ""
-}
-
-// Sine
-function sin() {
- id = document.getElementById("display");
-if (displayText == "") {
- num1 = result
- }
-else {
- num1 = parseFloat(displayText)
- }
-if (num1 != "") {
- result = Math.sin(num1)
- id.value = result
- displayText = ""
- }
-else {
- alert("Please write the number first")
- }
-}
-
-// Cosine
-function cos() {
- id = document.getElementById("display");
-if (displayText == "") {
- num1 = result
- }
-else {
- num1 = parseFloat(displayText)
- }
-if (num1 != "") {
- result = Math.cos(num1)
- id.value = result
- displayText = ""
- }
-else {
- alert("Please write the number first")
- }
-}
-
-// ArcSine
-function arcSin() {
- id = document.getElementById("display");
-if (displayText == "") {
- num1 = result
- }
-else {
- num1 = parseFloat(displayText)
- }
-if (num1 != "") {
- result = Math.asin(num1)
- id.value = result
- displayText = ""
- }
-else {
- alert("Please write the number first")
- }
-}
-
-// ArcCosine
-function arcCos() {
- id = document.getElementById("display");
-if (displayText == "") {
- num1 = result
- }
-else {
- num1 = parseFloat(displayText)
- }
-if (num1 != "") {
- result = Math.acos(num1)
- id.value = result
- displayText = ""
- }
-else {
- alert("Please write the number first")
- }
-}
-
-// Square root
-function sqrt() {
- id = document.getElementById("display");
-if (displayText == "") {
- num1 = result
- }
-else {
- num1 = parseFloat(displayText)
- }
-if (num1 != "") {
- result = Math.sqrt(num1)
- id.value = result
- displayText = ""
- }
-else {
- alert("Please write the number first")
- }
-}
-
-// Square number (number to the power of two)
-function square() {
- id = document.getElementById("display");
-if (displayText == "") {
- num1 = result
- }
-else {
- num1 = parseFloat(displayText)
- }
-if (num1 != "") {
- result = num1 * num1
- id.value = result
- displayText = ""
- }
-else {
- alert("Please write the number first")
- }
-}
-
-// Convert degrees to radians
-function degToRad() {
- id = document.getElementById("display");
-if (displayText == "") {
- num1 = result
- }
-else {
- num1 = parseFloat(displayText)
- }
-if (num1 != "") {
- result = num1 * Math.PI / 180
- id.value = result
- displayText = ""
- }
-else {
- alert("Please write the number first")
- }
-}
-
-// Convert radians to degrees
-function radToDeg() {
- id = document.getElementById("display");
-if (displayText == "") {
- num1 = result
- }
-else {
- num1 = parseFloat(displayText)
- }
-if (num1 != "") {
- result = num1 * 180 / Math.PI
- id.value = result
- displayText = ""
- }
-else {
- alert("Please write the number first")
- }
-}
-
-// Calculations
-function calculate() {
- id = document.getElementById("display");
-
-if (displayText != "") {
- num2 = parseFloat(displayText)
-// Calc: Addition
- if (operatorType == "add") {
- result = num1 + num2
- id.value = result
- }
-// Calc: Subtraction
- if (operatorType == "subtract") {
- result = num1 - num2
- id.value = result
- }
-// Calc: Multiplication
- if (operatorType == "multiply") {
- result = num1 * num2
- id.value = result
- }
-// Calc: Division
- if (operatorType == "divide") {
- result = num1 / num2
- id.value = result
- }
- displayText = ""
- }
- else {
- id.value = "Oops! Error!"
- }
-}
-
-// Clear the display
-function clearDisplay() {
- id = document.getElementById("display");
-
-displayText = ""
-id.value = ""
-}
-</script>
-
-EOT;
-$a->page['htmlhead'] .= $x;
-}
-
-function calc_content($app) {
-
-$o = '';
-
-$o .= <<< EOT
-
-<h3>Calculator</h3>
-<br /><br />
-<table>
-<tbody><tr><td>
-<table bgcolor="#af9999" border="1">
-<tbody><tr><td>
-<table border="1" cellpadding="2" cellspacing="2">
-<form name="calc">
-<!--
-<TR><TD VALIGN=top colspan=6 ALIGN="center"> <H2>Calculator</H2> </TD>
--->
-<tbody><tr>
- <td colspan="5"><input size="22" id="display" name="display" type="text"></td>
-</tr><tr align="left" valign="middle">
- <td><input name="one" value="&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;" onclick="addDisplay(1)" type="button"></td>
- <td><input name="two" value="&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;" onclick="addDisplay(2)" type="button"></td>
- <td><input name="three" value="&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;" onclick="addDisplay(3)" type="button"></td>
- <td><input name="plus" value="&nbsp;&nbsp;+&nbsp;&nbsp;&nbsp;" onclick="addNumbers()" type="button"></td>
-</tr><tr align="left" valign="middle">
- <td><input name="four" value="&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;" onclick="addDisplay(4)" type="button"></td>
- <td><input name="five" value="&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;" onclick="addDisplay(5)" type="button"></td>
- <td><input name="six" value="&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;" onclick="addDisplay(6)" type="button"></td>
- <td><input name="minus" value="&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;" onclick="subtractNumbers()" type="button"></td>
-</tr><tr align="left" valign="middle">
- <td><input name="seven" value="&nbsp;&nbsp;7&nbsp;&nbsp;&nbsp;" onclick="addDisplay(7)" type="button"></td>
- <td><input name="eight" value="&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;" onclick="addDisplay(8)" type="button"></td>
- <td><input name="nine" value="&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;" onclick="addDisplay(9)" type="button"></td>
- <td><input name="multiplication" value="&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;" onclick="multiplyNumbers()" type="button"></td>
-</tr><tr align="left" valign="middle">
- <td><input name="zero" value="&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;" onclick="addDisplay(0)" type="button"></td>
- <td><input name="pi" value="&nbsp;Pi&nbsp;&nbsp;" onclick="addDisplay(Math.PI)" type="button"> </td>
- <td><input name="dot" value="&nbsp;&nbsp;&nbsp;.&nbsp;&nbsp;&nbsp;" onclick='addDisplay(".")' type="button"></td>
- <td><input name="division" value="&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;" onclick="divideNumbers()" type="button"></td>
-</tr><tr align="left" valign="middle">
- <td><input name="sqareroot" value="sqrt" onclick="sqrt()" type="button"></td>
- <td><input name="squarex" value=" x^2" onclick="square()" type="button"></td>
- <td><input name="deg-rad" value="d2r&nbsp;" onclick="degToRad()" type="button"></td>
- <td><input name="rad-deg" value="r2d&nbsp;" onclick="radToDeg()" type="button"></td>
-</tr><tr align="left" valign="middle">
- <td><input name="sine" value="&nbsp;sin&nbsp;" onclick="sin()" type="button"></td>
- <td><input name="arcsine" value="asin" onclick="arcSin()" type="button"></td>
- <td><input name="cosine" value="cos" onclick="cos()" type="button"></td>
- <td><input name="arccosine" value="acs" onclick="arcCos()" type="button"></td>
-
-</tr><tr align="left" valign="middle">
- <td colspan="2"><input name="clear" value="&nbsp;&nbsp;Clear&nbsp;&nbsp;" onclick="clearDisplay()" type="button"></td>
- <td colspan="3"><input name="enter" value="&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" onclick="calculate()" type="button"></td>
-
-</tr></tbody></table>
-</form>
-
- <!--
- <TD VALIGN=top>
- <B>NOTE:</B> All sine and cosine calculations are
- <br>done in radians. Remember to convert first
- <br>if using degrees.
- </TD>
- -->
-
-</td></tr></tbody></table>
-
-
-</td></tr></tbody></table>
-
-EOT;
-return $o;
-
-}
diff --git a/addon/convert/UnitConvertor.php b/addon/convert/UnitConvertor.php
deleted file mode 100644
index d7933a8fb..000000000
--- a/addon/convert/UnitConvertor.php
+++ /dev/null
@@ -1,283 +0,0 @@
-<?php
-// +----------------------------------------------------------------------+
-// | 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: Stanislav Okhvat <stanis@ngs.ru> |
-// | Co-authored by : CVH, Chris Hansel <chris@cpi-service.com> |
-// +----------------------------------------------------------------------+
-//
-// $Id: UnitConvertor.php,v 1.00 2002/02/20 11:40:00 stasokhvat Exp $
-
-/**
-* UnitConvertor is able to convert between different units and currencies.
-*
-* @author Stanislav Okhvat <stanis@sibfair.nsk.su, stanis@ngs.ru>
-* @version $Id: UnitConvertor.php,v 1.00 2002/03/01 17:00:00 stasokhvat Exp $
-* @package UnitConvertor
-* @access public
-* @history 01.03.2002 Implemented the code for regular and offset-based
-* conversions
-*
-* 13.12.2004
-* By Chris Hansel (CVH): changed getConvSpecs in order to have it look up
-* intermediary conversions (also see comments in check_key).
-*
-* Intermediary conversions are useful when no conversion ratio is specified
-* between two units when we calculate between the two. For example, we want
-* to convert between Fahrenheit and Kelvin, and we have only
-* specified how to convert Centigrade<->Fahrenheit and
-* Centigrade<->Kelvin. While a direct (Fahrenheit->Kelvin) or
-* reverse (Kelvin->Fahrenheit) lookups fail, looking for an intermediary
-* unit linking the two (Centigrade) helps us do the conversion.
-*
-* 13.12.2004
-* Chris Hansel (CVH): $to_array argument of addConversion method can now
-* contain units as 'unit1/unit2/unit3', when all units stand for the same
-* thing. See examples in unitconv.php
-*/
-class UnitConvertor
-{
- /**
- * Stores conversion ratios.
- *
- * @var array
- * @access private
- */
- var $conversion_table = array();
-
- /**
- * Decimal point character (default is "." - American - set in constructor).
- *
- * @var string
- * @access private
- */
- var $decimal_point;
-
- /**
- * Thousands separator (default is "," - American - set in constructor).
- *
- * @var string
- * @access private
- */
- var $thousand_separator;
-
- /**
- * For future use
- *
- * @var array
- * @access private
- */
- var $bases = array();
-
- /**
- * Constructor. Initializes the UnitConvertor object with the most important
- * properties.
- *
- * @param string decimal point character
- * @param string thousand separator character
- * @return void
- * @access public
- */
- function UnitConvertor($dec_point = '.', $thousand_sep = ',')
- {
- $this->decimal_point = $dec_point;
- $this->thousand_separator = $thousand_sep;
-
- } // end func UnitConvertor
-
- /**
- * Adds a conversion ratio to the conversion table.
- *
- * @param string the name of unit from which to convert
- * @param array array(
- * "pound"=>array("ratio"=>'', "offset"=>'')
- * )
- * "pound" - name of unit to set conversion ration to
- * "ratio" - 'double' conversion ratio which, when
- * multiplied by the number of $from_unit units produces
- * the result
- * "offset" - an offset from 0 which will be added to
- * the result when converting (needed for temperature
- * conversions and defaults to 0).
- * @return boolean true if successful, false otherwise
- * @access public
- */
- function addConversion($from_unit, $to_array)
- {
- if (!isset($this->conversion_table[$from_unit])) {
- while(list($key, $val) = each($to_array))
- {
- if (strstr($key, '/'))
- {
- $to_units = explode('/', $key);
- foreach ($to_units as $to_unit)
- {
- $this->bases[$from_unit][] = $to_unit;
-
- if (!is_array($val))
- {
- $this->conversion_table[$from_unit."_".$to_unit] = array("ratio"=>$val, "offset"=>0);
- }
- else
- {
- $this->conversion_table[$from_unit."_".$to_unit] =
- array(
- "ratio"=>$val['ratio'],
- "offset"=>(isset($val['offset']) ? $val['offset'] : 0)
- );
- }
- }
- }
- else
- {
- $this->bases[$from_unit][] = $key;
-
- if (!is_array($val))
- {
- $this->conversion_table[$from_unit."_".$key] = array("ratio"=>$val, "offset"=>0);
- }
- else
- {
- $this->conversion_table[$from_unit."_".$key] =
- array(
- "ratio"=>$val['ratio'],
- "offset"=>(isset($val['offset']) ? $val['offset'] : 0)
- );
- }
- }
- }
- return true;
- }
- return false;
-
- } // end func addConversion
-
- /**
- * Converts from one unit to another using specified precision.
- *
- * @param double value to convert
- * @param string name of the source unit from which to convert
- * @param string name of the target unit to which we are converting
- * @param integer double precision of the end result
- * @return void
- * @access public
- */
- function convert($value, $from_unit, $to_unit, $precision)
- {
- if ($this->getConvSpecs($from_unit, $to_unit, $value, $converted ))
- {
- return number_format($converted , (int)$precision, $this->decimal_point, $this->thousand_separator);
- } else {
- return false;
- }
- } // end func
-
- /**
- * CVH : changed this Function getConvSpecs in order to have it look up
- * intermediary Conversions from the
- * "base" unit being that one that has the highest hierarchical order in one
- * "logical" Conversion_Array
- * when taking $conv->addConversion('km',
- * array('meter'=>1000, 'dmeter'=>10000, 'centimeter'=>100000,
- * 'millimeter'=>1000000, 'mile'=>0.62137, 'naut.mile'=>0.53996,
- * 'inch(es)/zoll'=>39370, 'ft/foot/feet'=>3280.8, 'yd/yard'=>1093.6));
- * "km" would be the logical base unit for all units of dinstance, thus,
- * if the function fails to find a direct or reverse conversion in the table
- * it is only logical to suspect that if there is a chance
- * converting the value it only is via the "base" unit, and so
- * there is not even a need for a recursive search keeping the perfomance
- * acceptable and the ressource small...
- *
- * CVH check_key checks for a key in the Conversiontable and returns a value
- */
- function check_key( $key) {
- if ( array_key_exists ($key,$this->conversion_table)) {
- if (! empty($this->conversion_table[$key])) {
- return $this->conversion_table[$key];
- }
- }
- return false;
- }
-
- /**
- * Key function. Finds the conversion ratio and offset from one unit to another.
- *
- * @param string name of the source unit from which to convert
- * @param string name of the target unit to which we are converting
- * @param double conversion ratio found. Returned by reference.
- * @param double offset which needs to be added (or subtracted, if negative)
- * to the result to convert correctly.
- * For temperature or some scientific conversions,
- * i.e. Fahrenheit -> Celcius
- * @return boolean true if ratio and offset are found for the supplied
- * units, false otherwise
- * @access private
- */
- function getConvSpecs($from_unit, $to_unit, $value, &$converted)
- {
- $key = $from_unit."_".$to_unit;
- $revkey = $to_unit."_".$from_unit;
- $found = false;
- if ($ct_arr = $this->check_key($key)) {
- // Conversion Specs found directly
- $ratio = (double)$ct_arr['ratio'];
- $offset = $ct_arr['offset'];
- $converted = (double)(($value * $ratio)+ $offset);
-
- return true;
- } // not found in direct order, try reverse order
- elseif ($ct_arr = $this->check_key($revkey)) {
- $ratio = (double)(1/$ct_arr['ratio']);
- $offset = -$ct_arr['offset'];
- $converted = (double)(($value + $offset) * $ratio);
-
- return true;
- } // not found test for intermediary conversion
- else {
- // return ratio = 1 if keyparts match
- if ($key == $revkey) {
- $ratio = 1;
- $offset = 0;
- $converted = $value;
- return true;
- }
- // otherwise search intermediary
- reset($this->conversion_table);
- while (list($convk, $i1_value) = each($this->conversion_table)) {
- // split the key into parts
- $keyparts = preg_split("/_/",$convk);
- // return ratio = 1 if keyparts match
-
- // Now test if either part matches the from or to unit
- if ($keyparts[1] == $to_unit && ($i2_value = $this->check_key($keyparts[0]."_".$from_unit))) {
- // an intermediary $keyparts[0] was found
- // now let us put things together intermediary 1 and 2
- $converted = (double)(((($value - $i2_value['offset']) / $i2_value['ratio']) * $i1_value['ratio'])+ $i1_value['offset']);
-
- $found = true;
-
- } elseif ($keyparts[1] == $from_unit && ($i2_value = $this->check_key($keyparts[0]."_".$to_unit))) {
- // an intermediary $keyparts[0] was found
- // now let us put things together intermediary 2 and 1
- $converted = (double)(((($value - $i1_value['offset']) / $i1_value['ratio']) + $i2_value['offset']) * $i2_value['ratio']);
-
- $found = true;
- }
- }
- return $found;
- }
-
- } // end func getConvSpecs
-
-} // end class UnitConvertor
-?> \ No newline at end of file
diff --git a/addon/convert/convert.php b/addon/convert/convert.php
deleted file mode 100644
index aaa56a43e..000000000
--- a/addon/convert/convert.php
+++ /dev/null
@@ -1,228 +0,0 @@
-<?php
-/**
- * Name: Converter App
- * Description: Unit converter application
- * Version: 1.0
- * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
- */
-
-function convert_install() {
- register_hook('app_menu', 'addon/convert/convert.php', 'convert_app_menu');
-}
-
-function convert_uninstall() {
- unregister_hook('app_menu', 'addon/convert/convert.php', 'convert_app_menu');
-}
-
-function convert_app_menu($a,&$b) {
- $b['app_menu'][] = Array('url'=>'convert', 'name'=>'Units Conversion');
-}
-
-
-function convert_module() {}
-
-
-
-
-
-
-
-function convert_content($app) {
-
-include("UnitConvertor.php");
-
- class TP_Converter extends UnitConvertor {
- function TP_Converter($lang = "en")
- {
- if ($lang != 'en' ) {
- $dec_point = '.'; $thousand_sep = "'";
- } else {
- $dec_point = '.'; $thousand_sep = ",";
- }
-
- $this->UnitConvertor($dec_point , $thousand_sep );
-
- } // end func UnitConvertor
-
- function find_base_unit($from,$to) {
- while (list($skey,$sval) = each($this->bases)) {
- if ($skey == $from || $to == $skey || in_array($to,$sval) || in_array($from,$sval)) {
- return $skey;
- }
- }
- return false;
- }
-
- function getTable($value, $from_unit, $to_unit, $precision) {
-
- if ($base_unit = $this->find_base_unit($from_unit,$to_unit)) {
-
- // A baseunit was found now lets convert from -> $base_unit
-
- $cell ['value'] = $this->convert($value, $from_unit, $base_unit, $precision)." ".$base_unit;
- $cell ['class'] = ($base_unit == $from_unit || $base_unit == $to_unit) ? "framedred": "";
- $cells[] = $cell;
- // We now have the base unit and value now lets produce the table;
- while (list($key,$val) = each($this->bases[$base_unit])) {
- $cell ['value'] = $this->convert($value, $from_unit, $val, $precision)." ".$val;
- $cell ['class'] = ($val == $from_unit || $val == $to_unit) ? "framedred": "";
- $cells[] = $cell;
- }
-
- $cc = count($cells);
- $string = "<table class=\"framed grayish\" border=\"1\" cellpadding=\"5\" width=\"80%\" align=\"center\"><tr>";
- $string .= "<td rowspan=\"$cc\" align=\"center\">$value $from_unit</td>";
- $i=0;
- foreach ($cells as $cell) {
- if ($i==0) {
- $string .= "<td class=\"".$cell['class']."\">".$cell['value']."</td>";
- $i++;
- } else {
- $string .= "</tr><tr><td class=\"".$cell['class']."\">".$cell['value']."</td>";
- }
- }
- $string .= "</tr></table>";
- return $string;
- }
-
- }
-}
-
-
-$conv = new TP_Converter('en');
-
-
-$conversions = array(
- 'Temperature'=>array('base' =>'Celsius',
- 'conv'=>array(
- 'Fahrenheit'=>array('ratio'=>1.8, 'offset'=>32),
- 'Kelvin'=>array('ratio'=>1, 'offset'=>273),
- 'Reaumur'=>0.8
- )
- ),
- 'Weight' => array('base' =>'kg',
- 'conv'=>array(
- 'g'=>1000,
- 'mg'=>1000000,
- 't'=>0.001,
- 'grain'=>15432,
- 'oz'=>35.274,
- 'lb'=>2.2046,
- 'cwt(UK)' => 0.019684,
- 'cwt(US)' => 0.022046,
- 'ton (US)' => 0.0011023,
- 'ton (UK)' => 0.0009842
- )
- ),
- 'Distance' => array('base' =>'km',
- 'conv'=>array(
- 'm'=>1000,
- 'dm'=>10000,
- 'cm'=>100000,
- 'mm'=>1000000,
- 'mile'=>0.62137,
- 'naut.mile'=>0.53996,
- 'inch(es)'=>39370,
- 'ft'=>3280.8,
- 'yd'=>1093.6,
- 'furlong'=>4.970969537898672,
- 'fathom'=>546.8066491688539
- )
- ),
- 'Area' => array('base' =>'km 2',
- 'conv'=>array(
- 'ha'=>100,
- 'acre'=>247.105,
- 'm 2'=>pow(1000,2),
- 'dm 2'=>pow(10000,2),
- 'cm 2'=>pow(100000,2),
- 'mm 2'=>pow(1000000,2),
- 'mile 2'=>pow(0.62137,2),
- 'naut.miles 2'=>pow(0.53996,2),
- 'in 2'=>pow(39370,2),
- 'ft 2'=>pow(3280.8,2),
- 'yd 2'=>pow(1093.6,2),
- )
- ),
- 'Volume' => array('base' =>'m 3',
- 'conv'=>array(
- 'in 3'=>61023.6,
- 'ft 3'=>35.315,
- 'cm 3'=>pow(10,6),
- 'dm 3'=>1000,
- 'litre'=>1000,
- 'hl'=>10,
- 'yd 3'=>1.30795,
- 'gal(US)'=>264.172,
- 'gal(UK)'=>219.969,
- 'pint' => 2113.376,
- 'quart' => 1056.688,
- 'cup' => 4266.753,
- 'fl oz' => 33814.02,
- 'tablespoon' => 67628.04,
- 'teaspoon' => 202884.1,
- 'pt (UK)'=>1000/0.56826,
- 'barrel petroleum'=>1000/158.99,
- 'Register Tons'=>2.832,
- 'Ocean Tons'=>1.1327
- )
- ),
- 'Speed' =>array('base' =>'kmph',
- 'conv'=>array(
- 'mps'=>0.0001726031,
- 'milesph'=>0.62137,
- 'knots'=>0.53996,
- 'mach STP'=>0.0008380431,
- 'c (warp)'=>9.265669e-10
- )
- )
-);
-
-
-while (list($key,$val) = each($conversions)) {
- $conv->addConversion($val['base'], $val['conv']);
- $list[$key][] = $val['base'];
- while (list($ukey,$uval) = each($val['conv'])) {
- $list[$key][] = $ukey;
- }
-}
-
- $o .= '<h3>Unit Conversions</h3>';
-
-
- if (isset($_POST['from_unit']) && isset($_POST['value'])) {
- $_POST['value'] = $_POST['value'] + 0;
-
-
- $o .= ($conv->getTable($_POST['value'], $_POST['from_unit'], $_POST['to_unit'], 5))."</p>";
- } else {
- $o .= "<p>Select:</p>";
- }
-
- if(isset($_POST['value']))
- $value = $_POST['value'];
- else
- $value = '';
-
- $o .= '<form action="convert" method="post" name="conversion">';
- $o .= '<input name="value" type="text" id="value" value="' . $value . '" size="10" maxlength="10" />';
- $o .= '<select name="from_unit" size="12">';
-
-
-
- reset($list);
- while(list($key,$val) = each($list)) {
- $o .= "\n\t<optgroup label=\"$key\">";
- while(list($ukey,$uval) = each($val)) {
- $selected = (($uval == $_POST['from_unit']) ? ' selected="selected" ' : '');
- $o .= "\n\t\t<option value=\"$uval\" $selected >$uval</option>";
- }
- $o .= "\n\t</optgroup>";
- }
-
- $o .= '</select>';
-
- $o .= '<input type="submit" name="Submit" value="Submit" /></form>';
-
- return $o;
-}
diff --git a/addon/facebook/README b/addon/facebook/README
deleted file mode 100644
index 325f18dd1..000000000
--- a/addon/facebook/README
+++ /dev/null
@@ -1,39 +0,0 @@
-Installing the Friendika/Facebook connector
-
-1. register an API key for your site from developer.facebook.com
- a. We'd be very happy if you include "Friendika" in the application name
- to increase name recognition. The Friendika icons are also present
- in the images directory and may be uploaded as a Facebook app icon.
- Use images/friendika-16.jpg for the Icon and images/friendika-128.jpg for the Logo.
- b. The url should be your site URL with a trailing slash.
- You may use http://portal.friendika.com/privacy as the privacy policy
- URL unless your site has different requirements, and
- http://portal.friendika.com as the Terms of Service URL unless
- you have different requirements. (Friendika is a software application
- and does not require Terms of Service, though your installation of it might).
- c. Set the following values in your .htconfig.php file
- $a->config['facebook']['appid'] = 'xxxxxxxxxxx';
- $a->config['facebook']['appsecret'] = 'xxxxxxxxxxxxxxx';
- Replace with the settings Facebook gives you.
- d. Navigate to Set Web->Site URL & Domain -> Website Settings. Set Site URL
- to yoursubdomain.yourdomain.com. Set Site Domain to your yourdomain.com.
-2. Enable the facebook plugin by including it in .htconfig.php - e.g.
- $a->config['system']['addon'] = 'plugin1,plugin2,facebook';
-3. Visit the Facebook Settings section of the "Settings->Plugin Settings" page.
- and click 'Install Facebook Connector'.
-4. This will ask you to login to Facebook and grant permission to the
- plugin to do its stuff. Allow it to do so.
-5. You're done. To turn it off visit the Plugin Settings page again and
- 'Remove Facebook posting'.
-
-Vidoes and embeds will not be posted if there is no other content. Links
-and images will be converted to a format suitable for the Facebook API and
-long posts truncated - with a link to view the full post.
-
-Facebook contacts will not be able to view private photos, as they are not able to
-authenticate to your site to establish identity. We will address this
-in a future release.
-
-Info: please make sure that you understand all aspects due to Friendika's
-default licence which is: Creative Commons Attribution 3.0 (further info:
-http://creativecommons.org/licenses/by/3.0/ )
diff --git a/addon/facebook/facebook.css b/addon/facebook/facebook.css
deleted file mode 100644
index 0c164331e..000000000
--- a/addon/facebook/facebook.css
+++ /dev/null
@@ -1,13 +0,0 @@
-
-#facebook-enable-wrapper {
- margin-top: 20px;
-}
-
-#facebook-disable-wrapper {
- margin-top: 20px;
-}
-
-#facebook-post-default-form input {
- margin-top: 20px;
- margin-right: 20px;
-} \ No newline at end of file
diff --git a/addon/facebook/facebook.php b/addon/facebook/facebook.php
deleted file mode 100644
index fe348f689..000000000
--- a/addon/facebook/facebook.php
+++ /dev/null
@@ -1,1046 +0,0 @@
-<?php
-/**
- * Name: Facebook Connector
- * Version: 1.0
- * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
- */
-
-/**
- * Installing the Friendika/Facebook connector
- *
- * 1. register an API key for your site from developer.facebook.com
- * a. We'd be very happy if you include "Friendika" in the application name
- * to increase name recognition. The Friendika icons are also present
- * in the images directory and may be uploaded as a Facebook app icon.
- * Use images/friendika-16.jpg for the Icon and images/friendika-128.jpg for the Logo.
- * b. The url should be your site URL with a trailing slash.
- * You may use http://portal.friendika.com/privacy as the privacy policy
- * URL unless your site has different requirements, and
- * http://portal.friendika.com as the Terms of Service URL unless
- * you have different requirements. (Friendika is a software application
- * and does not require Terms of Service, though your installation of it might).
- * c. Set the following values in your .htconfig.php file
- * $a->config['facebook']['appid'] = 'xxxxxxxxxxx';
- * $a->config['facebook']['appsecret'] = 'xxxxxxxxxxxxxxx';
- * Replace with the settings Facebook gives you.
- * d. Navigate to Set Web->Site URL & Domain -> Website Settings. Set
- * Site URL to yoursubdomain.yourdomain.com. Set Site Domain to your
- * yourdomain.com.
- * 2. Enable the facebook plugin by including it in .htconfig.php - e.g.
- * $a->config['system']['addon'] = 'plugin1,plugin2,facebook';
- * 3. Visit the Facebook Settings section of the "Settings->Plugin Settings" page.
- * and click 'Install Facebook Connector'.
- * 4. This will ask you to login to Facebook and grant permission to the
- * plugin to do its stuff. Allow it to do so.
- * 5. You're done. To turn it off visit the Plugin Settings page again and
- * 'Remove Facebook posting'.
- *
- * Vidoes and embeds will not be posted if there is no other content. Links
- * and images will be converted to a format suitable for the Facebook API and
- * long posts truncated - with a link to view the full post.
- *
- * Facebook contacts will not be able to view private photos, as they are not able to
- * authenticate to your site to establish identity. We will address this
- * in a future release.
- */
-
-define('FACEBOOK_MAXPOSTLEN', 420);
-
-
-function facebook_install() {
- register_hook('post_local_end', 'addon/facebook/facebook.php', 'facebook_post_hook');
- register_hook('jot_networks', 'addon/facebook/facebook.php', 'facebook_jot_nets');
- register_hook('plugin_settings', 'addon/facebook/facebook.php', 'facebook_plugin_settings');
- register_hook('cron', 'addon/facebook/facebook.php', 'facebook_cron');
- register_hook('queue_predeliver', 'addon/facebook/facebook.php', 'fb_queue_hook');
-}
-
-
-function facebook_uninstall() {
- unregister_hook('post_local_end', 'addon/facebook/facebook.php', 'facebook_post_hook');
- unregister_hook('jot_networks', 'addon/facebook/facebook.php', 'facebook_jot_nets');
- unregister_hook('plugin_settings', 'addon/facebook/facebook.php', 'facebook_plugin_settings');
- unregister_hook('cron', 'addon/facebook/facebook.php', 'facebook_cron');
- unregister_hook('queue_predeliver', 'addon/facebook/facebook.php', 'fb_queue_hook');
-}
-
-
-/* declare the facebook_module function so that /facebook url requests will land here */
-
-function facebook_module() {}
-
-
-
-/* If a->argv[1] is a nickname, this is a callback from Facebook oauth requests. */
-
-function facebook_init(&$a) {
-
- if($a->argc != 2)
- return;
- $nick = $a->argv[1];
- if(strlen($nick))
- $r = q("SELECT `uid` FROM `user` WHERE `nickname` = '%s' LIMIT 1",
- dbesc($nick)
- );
- if(! count($r))
- return;
-
- $uid = $r[0]['uid'];
- $auth_code = (($_GET['code']) ? $_GET['code'] : '');
- $error = (($_GET['error_description']) ? $_GET['error_description'] : '');
-
-
- if($error)
- logger('facebook_init: Error: ' . $error);
-
- if($auth_code && $uid) {
-
- $appid = get_config('facebook','appid');
- $appsecret = get_config('facebook', 'appsecret');
-
- $x = fetch_url('https://graph.facebook.com/oauth/access_token?client_id='
- . $appid . '&client_secret=' . $appsecret . '&redirect_uri='
- . urlencode($a->get_baseurl() . '/facebook/' . $nick)
- . '&code=' . $auth_code);
-
- logger('facebook_init: returned access token: ' . $x, LOGGER_DATA);
-
- if(strpos($x,'access_token=') !== false) {
- $token = str_replace('access_token=', '', $x);
- if(strpos($token,'&') !== false)
- $token = substr($token,0,strpos($token,'&'));
- set_pconfig($uid,'facebook','access_token',$token);
- set_pconfig($uid,'facebook','post','1');
- if(get_pconfig($uid,'facebook','no_linking') === false)
- set_pconfig($uid,'facebook','no_linking',1);
- fb_get_self($uid);
- fb_get_friends($uid);
- fb_consume_all($uid);
-
- }
-
- }
-
-}
-
-
-function fb_get_self($uid) {
- $access_token = get_pconfig($uid,'facebook','access_token');
- if(! $access_token)
- return;
- $s = fetch_url('https://graph.facebook.com/me/?access_token=' . $access_token);
- if($s) {
- $j = json_decode($s);
- set_pconfig($uid,'facebook','self_id',(string) $j->id);
- }
-}
-
-
-
-function fb_get_friends($uid) {
-
- $access_token = get_pconfig($uid,'facebook','access_token');
-
- $no_linking = get_pconfig($uid,'facebook','no_linking');
- if($no_linking)
- return;
-
- if(! $access_token)
- return;
- $s = fetch_url('https://graph.facebook.com/me/friends?access_token=' . $access_token);
- if($s) {
- logger('facebook: fb_get_friends: ' . $s, LOGGER_DATA);
- $j = json_decode($s);
- logger('facebook: fb_get_friends: json: ' . print_r($j,true), LOGGER_DATA);
- if(! $j->data)
- return;
- foreach($j->data as $person) {
- $s = fetch_url('https://graph.facebook.com/' . $person->id . '?access_token=' . $access_token);
- if($s) {
- $jp = json_decode($s);
- logger('fb_get_friends: info: ' . print_r($jp,true), LOGGER_DATA);
-
- // always use numeric link for consistency
-
- $jp->link = 'http://facebook.com/profile.php?id=' . $person->id;
-
- // check if we already have a contact
-
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `url` = '%s' LIMIT 1",
- intval($uid),
- dbesc($jp->link)
- );
-
- if(count($r)) {
-
- // check that we have all the photos, this has been known to fail on occasion
-
- if((! $r[0]['photo']) || (! $r[0]['thumb']) || (! $r[0]['micro'])) {
- require_once("Photo.php");
-
- $photos = import_profile_photo('https://graph.facebook.com/' . $jp->id . '/picture', $uid, $r[0]['id']);
-
- $r = q("UPDATE `contact` SET `photo` = '%s',
- `thumb` = '%s',
- `micro` = '%s',
- `name-date` = '%s',
- `uri-date` = '%s',
- `avatar-date` = '%s'
- WHERE `id` = %d LIMIT 1
- ",
- dbesc($photos[0]),
- dbesc($photos[1]),
- dbesc($photos[2]),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- intval($r[0]['id'])
- );
- }
- continue;
- }
- else {
-
- // create contact record
- $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `addr`, `alias`, `notify`, `poll`,
- `name`, `nick`, `photo`, `network`, `rel`, `priority`,
- `writable`, `blocked`, `readonly`, `pending` )
- VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ",
- intval($uid),
- dbesc(datetime_convert()),
- dbesc($jp->link),
- dbesc(''),
- dbesc(''),
- dbesc($jp->id),
- dbesc('facebook ' . $jp->id),
- dbesc($jp->name),
- dbesc(($jp->nickname) ? $jp->nickname : strtolower($jp->first_name)),
- dbesc('https://graph.facebook.com/' . $jp->id . '/picture'),
- dbesc(NETWORK_FACEBOOK),
- intval(CONTACT_IS_FRIEND),
- intval(1),
- intval(1)
- );
- }
-
- $r = q("SELECT * FROM `contact` WHERE `url` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($jp->link),
- intval($uid)
- );
-
- if(! count($r)) {
- continue;
- }
-
- $contact = $r[0];
- $contact_id = $r[0]['id'];
-
- require_once("Photo.php");
-
- $photos = import_profile_photo($r[0]['photo'],$uid,$contact_id);
-
- $r = q("UPDATE `contact` SET `photo` = '%s',
- `thumb` = '%s',
- `micro` = '%s',
- `name-date` = '%s',
- `uri-date` = '%s',
- `avatar-date` = '%s'
- WHERE `id` = %d LIMIT 1
- ",
- dbesc($photos[0]),
- dbesc($photos[1]),
- dbesc($photos[2]),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- intval($contact_id)
- );
-
- }
- }
- }
-}
-
-// This is the POST method to the facebook settings page
-// Content is posted to Facebook in the function facebook_post_hook()
-
-function facebook_post(&$a) {
-
- $uid = local_user();
- if($uid){
-
- $value = ((x($_POST,'post_by_default')) ? intval($_POST['post_by_default']) : 0);
- set_pconfig($uid,'facebook','post_by_default', $value);
-
- $no_linking = get_pconfig($uid,'facebook','no_linking');
-
- $no_wall = ((x($_POST,'facebook_no_wall')) ? intval($_POST['facebook_no_wall']) : 0);
- set_pconfig($uid,'facebook','no_wall',$no_wall);
-
- $private_wall = ((x($_POST,'facebook_private_wall')) ? intval($_POST['facebook_private_wall']) : 0);
- set_pconfig($uid,'facebook','private_wall',$private_wall);
-
-
- $linkvalue = ((x($_POST,'facebook_linking')) ? intval($_POST['facebook_linking']) : 0);
- set_pconfig($uid,'facebook','no_linking', (($linkvalue) ? 0 : 1));
-
- // FB linkage was allowed but has just been turned off - remove all FB contacts and posts
-
- if((! intval($no_linking)) && (! intval($linkvalue))) {
- $r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `network` = '%s' ",
- intval($uid),
- dbesc(NETWORK_FACEBOOK)
- );
- if(count($r)) {
- require_once('include/Contact.php');
- foreach($r as $rr)
- contact_remove($rr['id']);
- }
- }
- elseif(intval($no_linking) && intval($linkvalue)) {
- // FB linkage is now allowed - import stuff.
- fb_get_self($uid);
- fb_get_friends($uid);
- fb_consume_all($uid);
- }
-
- info( t('Settings updated.') . EOL);
- }
-
- return;
-}
-
-// Facebook settings form
-
-function facebook_content(&$a) {
-
- if(! local_user()) {
- notice( t('Permission denied.') . EOL);
- return '';
- }
-
- if($a->argc > 1 && $a->argv[1] === 'remove') {
- del_pconfig(local_user(),'facebook','post');
- info( t('Facebook disabled') . EOL);
- }
-
- if($a->argc > 1 && $a->argv[1] === 'friends') {
- fb_get_friends(local_user());
- info( t('Updating contacts') . EOL);
- }
-
-
- $fb_installed = get_pconfig(local_user(),'facebook','post');
-
- $appid = get_config('facebook','appid');
-
- if(! $appid) {
- notice( t('Facebook API key is missing.') . EOL);
- return '';
- }
-
- $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'
- . $a->get_baseurl() . '/addon/facebook/facebook.css' . '" media="all" />' . "\r\n";
-
- $o .= '<h3>' . t('Facebook Connect') . '</h3>';
-
- if(! $fb_installed) {
- $o .= '<div id="facebook-enable-wrapper">';
-
- $o .= '<a href="https://www.facebook.com/dialog/oauth?client_id=' . $appid . '&redirect_uri='
- . $a->get_baseurl() . '/facebook/' . $a->user['nickname'] . '&scope=publish_stream,read_stream,offline_access">' . t('Install Facebook connector for this account.') . '</a>';
- $o .= '</div>';
- }
-
- if($fb_installed) {
- $o .= '<div id="facebook-disable-wrapper">';
-
- $o .= '<a href="' . $a->get_baseurl() . '/facebook/remove' . '">' . t('Remove Facebook connector') . '</a></div>';
-
- $o .= '<div id="facebook-enable-wrapper">';
-
- $o .= '<a href="https://www.facebook.com/dialog/oauth?client_id=' . $appid . '&redirect_uri='
- . $a->get_baseurl() . '/facebook/' . $a->user['nickname'] . '&scope=publish_stream,read_stream,offline_access">' . t('Re-authenticate [This is necessary whenever your Facebook password is changed.]') . '</a>';
- $o .= '</div>';
-
- $o .= '<div id="facebook-post-default-form">';
- $o .= '<form action="facebook" method="post" >';
- $post_by_default = get_pconfig(local_user(),'facebook','post_by_default');
- $checked = (($post_by_default) ? ' checked="checked" ' : '');
- $o .= '<input type="checkbox" name="post_by_default" value="1"' . $checked . '/>' . ' ' . t('Post to Facebook by default') . EOL;
-
- $no_linking = get_pconfig(local_user(),'facebook','no_linking');
- $checked = (($no_linking) ? '' : ' checked="checked" ');
- $o .= '<input type="checkbox" name="facebook_linking" value="1"' . $checked . '/>' . ' ' . t('Link all your Facebook friends and conversations on this website') . EOL ;
-
- $o .= '<p>' . t('Facebook conversations consist of your <em>profile wall</em> and your friend <em>stream</em>.');
- $o .= ' ' . t('On this website, your Facebook friend stream is only visible to you.');
- $o .= ' ' . t('The following settings determine the privacy of your Facebook profile wall on this website.') . '</p>';
-
- $private_wall = get_pconfig(local_user(),'facebook','private_wall');
- $checked = (($private_wall) ? ' checked="checked" ' : '');
- $o .= '<input type="checkbox" name="facebook_private_wall" value="1"' . $checked . '/>' . ' ' . t('On this website your Facebook profile wall conversations will only be visible to you') . EOL ;
-
-
- $no_wall = get_pconfig(local_user(),'facebook','no_wall');
- $checked = (($no_wall) ? ' checked="checked" ' : '');
- $o .= '<input type="checkbox" name="facebook_no_wall" value="1"' . $checked . '/>' . ' ' . t('Do not import your Facebook profile wall conversations') . EOL ;
-
- $o .= '<p>' . t('If you choose to link conversations and leave both of these boxes unchecked, your Facebook profile wall will be merged with your profile wall on this website and your privacy settings on this website will be used to determine who may see the conversations.') . '</p>';
-
- $o .= '<input type="submit" name="submit" value="' . t('Submit') . '" /></form></div>';
- }
-
- return $o;
-}
-
-
-
-function facebook_cron($a,$b) {
-
- $last = get_config('facebook','last_poll');
-
- $poll_interval = intval(get_config('facebook','poll_interval'));
- if(! $poll_interval)
- $poll_interval = 3600;
-
- if($last) {
- $next = $last + $poll_interval;
- if($next > time())
- return;
- }
-
- logger('facebook_cron');
-
-
- // Find the FB users on this site and randomize in case one of them
- // uses an obscene amount of memory. It may kill this queue run
- // but hopefully we'll get a few others through on each run.
-
- $r = q("SELECT * FROM `pconfig` WHERE `cat` = 'facebook' AND `k` = 'post' AND `v` = '1' ORDER BY RAND() ");
- if(count($r)) {
- foreach($r as $rr) {
- if(get_pconfig($rr['uid'],'facebook','no_linking'))
- continue;
- // check for new friends once a day
- $last_friend_check = get_pconfig($rr['uid'],'facebook','friend_check');
- if($last_friend_check)
- $next_friend_check = $last_friend_check + 86400;
- if($next_friend_check <= time()) {
- fb_get_friends($rr['uid']);
- set_pconfig($rr['uid'],'facebook','friend_check',time());
- }
- fb_consume_all($rr['uid']);
- }
- }
-
- set_config('facebook','last_poll', time());
-
-}
-
-
-
-function facebook_plugin_settings(&$a,&$b) {
-
- $b .= '<div class="settings-block">';
- $b .= '<h3>' . t('Facebook') . '</h3>';
- $b .= '<a href="facebook">' . t('Facebook Connector Settings') . '</a><br />';
- $b .= '</div>';
-
-}
-
-function facebook_jot_nets(&$a,&$b) {
- if(! local_user())
- return;
-
- $fb_post = get_pconfig(local_user(),'facebook','post');
- if(intval($fb_post) == 1) {
- $fb_defpost = get_pconfig(local_user(),'facebook','post_by_default');
- $selected = ((intval($fb_defpost) == 1) ? ' checked="checked" ' : '');
- $b .= '<div class="profile-jot-net"><input type="checkbox" name="facebook_enable"' . $selected . 'value="1" /> '
- . t('Post to Facebook') . '</div>';
- }
-}
-
-
-function facebook_post_hook(&$a,&$b) {
-
- /**
- * Post to Facebook stream
- */
-
- require_once('include/group.php');
-
- logger('Facebook post');
-
- $reply = false;
- $likes = false;
-
- if((local_user()) && (local_user() == $b['uid'])) {
-
- // Facebook is not considered a private network
- if($b['prvnets'] && $b['private'])
- return;
-
- if($b['parent']) {
- $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($b['parent']),
- intval(local_user())
- );
- if(count($r) && substr($r[0]['uri'],0,4) === 'fb::')
- $reply = substr($r[0]['uri'],4);
- elseif(count($r) && substr($r[0]['extid'],0,4) === 'fb::')
- $reply = substr($r[0]['extid'],4);
- else
- return;
- logger('facebook reply id=' . $reply);
- }
-
- if($b['private'] && $reply === false) {
- $allow_people = expand_acl($b['allow_cid']);
- $allow_groups = expand_groups(expand_acl($b['allow_gid']));
- $deny_people = expand_acl($b['deny_cid']);
- $deny_groups = expand_groups(expand_acl($b['deny_gid']));
-
- $recipients = array_unique(array_merge($allow_people,$allow_groups));
- $deny = array_unique(array_merge($deny_people,$deny_groups));
-
- $allow_str = dbesc(implode(', ',$recipients));
- if($allow_str) {
- $r = q("SELECT `notify` FROM `contact` WHERE `id` IN ( $allow_str ) AND `network` = 'face'");
- $allow_arr = array();
- if(count($r))
- foreach($r as $rr)
- $allow_arr[] = $rr['notify'];
- }
-
- $deny_str = dbesc(implode(', ',$deny));
- if($deny_str) {
- $r = q("SELECT `notify` FROM `contact` WHERE `id` IN ( $deny_str ) AND `network` = 'face'");
- $deny_arr = array();
- if(count($r))
- foreach($r as $rr)
- $deny_arr[] = $rr['notify'];
- }
-
- if(count($deny_arr) && (! count($allow_arr))) {
-
- // One or more FB folks were denied access but nobody on FB was specifically allowed access.
- // This might cause the post to be open to public on Facebook, but only to selected members
- // on another network. Since this could potentially leak a post to somebody who was denied,
- // we will skip posting it to Facebook with a slightly vague but relevant message that will
- // hopefully lead somebody to this code comment for a better explanation of what went wrong.
-
- notice( t('Post to Facebook cancelled because of multi-network access permission conflict.') . EOL);
- return;
- }
-
-
- // if it's a private message but no Facebook members are allowed or denied, skip Facebook post
-
- if((! count($allow_arr)) && (! count($deny_arr)))
- return;
- }
-
- if($b['verb'] == ACTIVITY_LIKE)
- $likes = true;
-
-
- $appid = get_config('facebook', 'appid' );
- $secret = get_config('facebook', 'appsecret' );
-
- if($appid && $secret) {
-
- logger('facebook: have appid+secret');
-
- $fb_post = intval(get_pconfig(local_user(),'facebook','post'));
- $fb_enable = (($fb_post && x($_POST,'facebook_enable')) ? intval($_POST['facebook_enable']) : 0);
- $fb_token = get_pconfig(local_user(),'facebook','access_token');
-
- // if API is used, default to the chosen settings
- if($_POST['api_source'] && intval(get_pconfig(local_user(),'facebook','post_by_default')))
- $fb_enable = 1;
-
-
-
-
- logger('facebook: $fb_post: ' . $fb_post . ' $fb_enable: ' . $fb_enable . ' $fb_token: ' . $fb_token,LOGGER_DEBUG);
-
- // post to facebook if it's a public post and we've ticked the 'post to Facebook' box,
- // or it's a private message with facebook participants
- // or it's a reply or likes action to an existing facebook post
-
- if($fb_post && $fb_token && ($fb_enable || $b['private'] || $reply)) {
- logger('facebook: able to post');
- require_once('library/facebook.php');
- require_once('include/bbcode.php');
-
- $msg = $b['body'];
-
- logger('Facebook post: original msg=' . $msg, LOGGER_DATA);
-
- // make links readable before we strip the code
-
- // unless it's a dislike - just send the text as a comment
-
- if($b['verb'] == ACTIVITY_DISLIKE)
- $msg = trim(strip_tags(bbcode($msg)));
-
- $search_str = $a->get_baseurl() . '/search';
-
- if(preg_match("/\[url=(.*?)\](.*?)\[\/url\]/is",$msg,$matches)) {
-
- // don't use hashtags for message link
-
- if(strpos($matches[2],$search_str) === false) {
- $link = $matches[1];
- if(substr($matches[2],0,5) != '[img]')
- $linkname = $matches[2];
- }
- }
-
- $msg = preg_replace("/\[url=(.*?)\](.*?)\[\/url\]/is",'$2 $1',$msg);
-
- if(preg_match("/\[img\](.*?)\[\/img\]/is",$msg,$matches))
- $image = $matches[1];
-
- $msg = preg_replace("/\[img\](.*?)\[\/img\]/is", t('Image: ') . '$1', $msg);
-
- if((strpos($link,z_root()) !== false) && (! $image))
- $image = $a->get_baseurl() . '/images/friendika-64.jpg';
-
- $msg = trim(strip_tags(bbcode($msg)));
- $msg = html_entity_decode($msg,ENT_QUOTES,'UTF-8');
-
- // add any attachments as text urls
-
- $arr = explode(',',$b['attach']);
-
- if(count($arr)) {
- $msg .= "\n";
- foreach($arr as $r) {
- $matches = false;
- $cnt = preg_match('|\[attach\]href=\"(.*?)\" size=\"(.*?)\" type=\"(.*?)\" title=\"(.*?)\"\[\/attach\]|',$r,$matches);
- if($cnt) {
- $msg .= $matches[1];
- }
- }
- }
-
- if (strlen($msg) > FACEBOOK_MAXPOSTLEN) {
- $shortlink = "";
- require_once('library/slinky.php');
-
- $display_url = $a->get_baseurl() . '/display/' . $a->user['nickname'] . '/' . $b['id'];
- $slinky = new Slinky( $display_url );
- // setup a cascade of shortening services
- // try to get a short link from these services
- // in the order ur1.ca, trim, id.gd, tinyurl
- $slinky->set_cascade( array( new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) );
- $shortlink = $slinky->short();
- // the new message will be shortened such that "... $shortlink"
- // will fit into the character limit
- $msg = substr($msg, 0, FACEBOOK_MAXPOSTLEN - strlen($shortlink) - 4);
- $msg .= '... ' . $shortlink;
- }
- if(! strlen($msg))
- return;
-
- logger('Facebook post: msg=' . $msg, LOGGER_DATA);
-
- if($likes) {
- $postvars = array('access_token' => $fb_token);
- }
- else {
- $postvars = array(
- 'access_token' => $fb_token,
- 'message' => $msg
- );
- if(isset($image))
- $postvars['picture'] = $image;
- if(isset($link))
- $postvars['link'] = $link;
- if(isset($linkname))
- $postvars['name'] = $linkname;
- }
-
- if(($b['private']) && (! $b['parent'])) {
- $postvars['privacy'] = '{"value": "CUSTOM", "friends": "SOME_FRIENDS"';
- if(count($allow_arr))
- $postvars['privacy'] .= ',"allow": "' . implode(',',$allow_arr) . '"';
- if(count($deny_arr))
- $postvars['privacy'] .= ',"deny": "' . implode(',',$deny_arr) . '"';
- $postvars['privacy'] .= '}';
-
- }
-
- if($reply) {
- $url = 'https://graph.facebook.com/' . $reply . '/' . (($likes) ? 'likes' : 'comments');
- }
- else {
- $url = 'https://graph.facebook.com/me/feed';
- if($b['plink'])
- $postvars['actions'] = '{"name": "' . t('View on Friendika') . '", "link": "' . $b['plink'] . '"}';
- }
-
- logger('facebook: post to ' . $url);
- logger('facebook: postvars: ' . print_r($postvars,true));
-
- // "test_mode" prevents anything from actually being posted.
- // Otherwise, let's do it.
-
- if(! get_config('facebook','test_mode')) {
- $x = post_url($url, $postvars);
-
- $retj = json_decode($x);
- if($retj->id) {
- q("UPDATE `item` SET `extid` = '%s' WHERE `id` = %d LIMIT 1",
- dbesc('fb::' . $retj->id),
- intval($b['id'])
- );
- }
- else {
- if(! $likes) {
- $s = serialize(array('url' => $url, 'item' => $b['id'], 'post' => $postvars));
- q("INSERT INTO `queue` ( `network`, `cid`, `created`, `last`, `content`)
- VALUES ( '%s', %d, '%s', '%s', '%s') ",
- dbesc(NETWORK_FACEBOOK),
- intval($a->contact),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc($s)
- );
-
- notice( t('Facebook post failed. Queued for retry.') . EOL);
- }
- }
-
- logger('Facebook post returns: ' . $x, LOGGER_DEBUG);
- }
- }
- }
- }
-}
-
-
-function fb_queue_hook(&$a,&$b) {
-
- $qi = q("SELECT * FROM `queue` WHERE `network` = '%s'",
- dbesc(NETWORK_FACEBOOK)
- );
- if(! count($qi))
- return;
-
- require_once('include/queue_fn.php');
-
- foreach($qi as $x) {
- if($x['network'] !== NETWORK_FACEBOOK)
- continue;
-
- logger('facebook_queue: run');
-
- $r = q("SELECT `user`.* FROM `user` LEFT JOIN `contact` on `contact`.`uid` = `user`.`uid`
- WHERE `contact`.`self` = 1 AND `contact`.`id` = %d LIMIT 1",
- intval($x['cid'])
- );
- if(! count($r))
- continue;
-
- $user = $r[0];
-
- $appid = get_config('facebook', 'appid' );
- $secret = get_config('facebook', 'appsecret' );
-
- if($appid && $secret) {
- $fb_post = intval(get_pconfig($user['uid'],'facebook','post'));
- $fb_token = get_pconfig($user['uid'],'facebook','access_token');
-
- if($fb_post && $fb_token) {
- logger('facebook_queue: able to post');
- require_once('library/facebook.php');
-
- $z = unserialize($x['content']);
- $item = $z['item'];
- $j = post_url($z['url'],$z['post']);
-
- $retj = json_decode($j);
- if($retj->id) {
- q("UPDATE `item` SET `extid` = '%s' WHERE `id` = %d LIMIT 1",
- dbesc('fb::' . $retj->id),
- intval($item)
- );
- logger('facebook_queue: success: ' . $j);
- remove_queue_item($x['id']);
- }
- else {
- logger('facebook_queue: failed: ' . $j);
- update_queue_time($x['id']);
- }
- }
- }
- }
-}
-
-function fb_consume_all($uid) {
-
- require_once('include/items.php');
-
- $access_token = get_pconfig($uid,'facebook','access_token');
- if(! $access_token)
- return;
-
- if(! get_pconfig($uid,'facebook','no_wall')) {
- $private_wall = intval(get_pconfig($uid,'facebook','private_wall'));
- $s = fetch_url('https://graph.facebook.com/me/feed?access_token=' . $access_token);
- if($s) {
- $j = json_decode($s);
- logger('fb_consume_stream: wall: ' . print_r($j,true), LOGGER_DATA);
- fb_consume_stream($uid,$j,($private_wall) ? false : true);
- }
- }
- $s = fetch_url('https://graph.facebook.com/me/home?access_token=' . $access_token);
- if($s) {
- $j = json_decode($s);
- logger('fb_consume_stream: feed: ' . print_r($j,true), LOGGER_DATA);
- fb_consume_stream($uid,$j,false);
- }
-
-}
-
-function fb_consume_stream($uid,$j,$wall = false) {
- $a = get_app();
-
- $no_linking = get_pconfig($uid,'facebook','no_linking');
- if($no_linking)
- return;
-
- $self = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
- intval($uid)
- );
-
- $user = q("SELECT `nickname`, `blockwall` FROM `user` WHERE `uid` = %d LIMIT 1",
- intval($uid)
- );
- if(count($user))
- $my_local_url = $a->get_baseurl() . '/profile/' . $user[0]['nickname'];
-
- $self_id = get_pconfig($uid,'facebook','self_id');
- if(! count($j->data) || (! strlen($self_id)))
- return;
-
- foreach($j->data as $entry) {
- logger('fb_consume: entry: ' . print_r($entry,true), LOGGER_DATA);
- $datarray = array();
-
- $r = q("SELECT * FROM `item` WHERE ( `uri` = '%s' OR `extid` = '%s') AND `uid` = %d LIMIT 1",
- dbesc('fb::' . $entry->id),
- dbesc('fb::' . $entry->id),
- intval($uid)
- );
- if(count($r)) {
- $post_exists = true;
- $orig_post = $r[0];
- $top_item = $r[0]['id'];
- }
- else {
- $post_exists = false;
- $orig_post = null;
- }
-
- if(! $orig_post) {
- $datarray['gravity'] = 0;
- $datarray['uid'] = $uid;
- $datarray['wall'] = (($wall) ? 1 : 0);
- $datarray['uri'] = $datarray['parent-uri'] = 'fb::' . $entry->id;
- $from = $entry->from;
- if($from->id == $self_id)
- $datarray['contact-id'] = $self[0]['id'];
- else {
- $r = q("SELECT * FROM `contact` WHERE `notify` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1",
- dbesc($from->id),
- intval($uid)
- );
- if(count($r))
- $datarray['contact-id'] = $r[0]['id'];
- }
-
- // don't store post if we don't have a contact
-
- if(! x($datarray,'contact-id')) {
- logger('no contact: post ignored');
- continue;
- }
-
- $datarray['verb'] = ACTIVITY_POST;
- if($wall) {
- $datarray['owner-name'] = $self[0]['name'];
- $datarray['owner-link'] = $self[0]['url'];
- $datarray['owner-avatar'] = $self[0]['thumb'];
- }
- if(isset($entry->application) && isset($entry->application->name) && strlen($entry->application->name))
- $datarray['app'] = strip_tags($entry->application->name);
- else
- $datarray['app'] = 'facebook';
- $datarray['author-name'] = $from->name;
- $datarray['author-link'] = 'http://facebook.com/profile.php?id=' . $from->id;
- $datarray['author-avatar'] = 'https://graph.facebook.com/' . $from->id . '/picture';
- $datarray['plink'] = $datarray['author-link'] . '&v=wall&story_fbid=' . substr($entry->id,strpos($entry->id,'_') + 1);
-
- $datarray['body'] = $entry->message;
- if($entry->picture)
- $datarray['body'] .= "\n\n" . '[img]' . $entry->picture . '[/img]';
- if($entry->link)
- $datarray['body'] .= "\n" . linkify($entry->link);
- if($entry->name)
- $datarray['body'] .= "\n" . $entry->name;
- if($entry->caption)
- $datarray['body'] .= "\n" . $entry->caption;
- if($entry->description)
- $datarray['body'] .= "\n" . $entry->description;
- $datarray['created'] = datetime_convert('UTC','UTC',$entry->created_time);
- $datarray['edited'] = datetime_convert('UTC','UTC',$entry->updated_time);
-
- // If the entry has a privacy policy, we cannot assume who can or cannot see it,
- // as the identities are from a foreign system. Mark it as private to the owner.
-
- if($entry->privacy && $entry->privacy->value !== 'EVERYONE') {
- $datarray['private'] = 1;
- $datarray['allow_cid'] = '<' . $uid . '>';
- }
-
- $top_item = item_store($datarray);
- $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($top_item),
- intval($uid)
- );
- if(count($r)) {
- $orig_post = $r[0];
- logger('fb: new top level item posted');
- }
- }
-
- if(isset($entry->likes) && isset($entry->likes->data))
- $likers = $entry->likes->data;
- else
- $likers = null;
-
- if(isset($entry->comments) && isset($entry->comments->data))
- $comments = $entry->comments->data;
- else
- $comments = null;
-
- if(is_array($likers)) {
- foreach($likers as $likes) {
-
- if(! $orig_post)
- continue;
-
- // If we posted the like locally, it will be found with our url, not the FB url.
-
- $second_url = (($likes->id == $self_id) ? $self[0]['url'] : 'http://facebook.com/profile.php?id=' . $likes->id);
-
- $r = q("SELECT * FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `verb` = '%s'
- AND ( `author-link` = '%s' OR `author-link` = '%s' ) LIMIT 1",
- dbesc($orig_post['uri']),
- intval($uid),
- dbesc(ACTIVITY_LIKE),
- dbesc('http://facebook.com/profile.php?id=' . $likes->id),
- dbesc($second_url)
- );
-
- if(count($r))
- continue;
-
- $likedata = array();
- $likedata['parent'] = $top_item;
- $likedata['verb'] = ACTIVITY_LIKE;
- $likedata['gravity'] = 3;
- $likedata['uid'] = $uid;
- $likedata['wall'] = (($wall) ? 1 : 0);
- $likedata['uri'] = item_new_uri($a->get_baseurl(), $uid);
- $likedata['parent-uri'] = $orig_post['uri'];
- if($likes->id == $self_id)
- $likedata['contact-id'] = $self[0]['id'];
- else {
- $r = q("SELECT * FROM `contact` WHERE `notify` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1",
- dbesc($likes->id),
- intval($uid)
- );
- if(count($r))
- $likedata['contact-id'] = $r[0]['id'];
- }
- if(! x($likedata,'contact-id'))
- $likedata['contact-id'] = $orig_post['contact-id'];
-
- $likedata['app'] = 'facebook';
- $likedata['verb'] = ACTIVITY_LIKE;
- $likedata['author-name'] = $likes->name;
- $likedata['author-link'] = 'http://facebook.com/profile.php?id=' . $likes->id;
- $likedata['author-avatar'] = 'https://graph.facebook.com/' . $likes->id . '/picture';
-
- $author = '[url=' . $likedata['author-link'] . ']' . $likedata['author-name'] . '[/url]';
- $objauthor = '[url=' . $orig_post['author-link'] . ']' . $orig_post['author-name'] . '[/url]';
- $post_type = t('status');
- $plink = '[url=' . $orig_post['plink'] . ']' . $post_type . '[/url]';
- $likedata['object-type'] = ACTIVITY_OBJ_NOTE;
-
- $likedata['body'] = sprintf( t('%1$s likes %2$s\'s %3$s'), $author, $objauthor, $plink);
- $likedata['object'] = '<object><type>' . ACTIVITY_OBJ_NOTE . '</type><local>1</local>' .
- '<id>' . $orig_post['uri'] . '</id><link>' . xmlify('<link rel="alternate" type="text/html" href="' . xmlify($orig_post['plink']) . '" />') . '</link><title>' . $orig_post['title'] . '</title><content>' . $orig_post['body'] . '</content></object>';
-
- $item = item_store($likedata);
- }
- }
- if(is_array($comments)) {
- foreach($comments as $cmnt) {
-
- if(! $orig_post)
- continue;
-
- $r = q("SELECT * FROM `item` WHERE `uid` = %d AND ( `uri` = '%s' OR `extid` = '%s' ) LIMIT 1",
- intval($uid),
- dbesc('fb::' . $cmnt->id),
- dbesc('fb::' . $cmnt->id)
- );
- if(count($r))
- continue;
-
- $cmntdata = array();
- $cmntdata['parent'] = $top_item;
- $cmntdata['verb'] = ACTIVITY_POST;
- $cmntdata['gravity'] = 6;
- $cmntdata['uid'] = $uid;
- $cmntdata['wall'] = (($wall) ? 1 : 0);
- $cmntdata['uri'] = 'fb::' . $cmnt->id;
- $cmntdata['parent-uri'] = $orig_post['uri'];
- if($cmnt->from->id == $self_id) {
- $cmntdata['contact-id'] = $self[0]['id'];
- }
- else {
- $r = q("SELECT * FROM `contact` WHERE `notify` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($cmnt->from->id),
- intval($uid)
- );
- if(count($r)) {
- $cmntdata['contact-id'] = $r[0]['id'];
- if($r[0]['blocked'] || $r[0]['readonly'])
- continue;
- }
- }
- if(! x($cmntdata,'contact-id'))
- $cmntdata['contact-id'] = $orig_post['contact-id'];
-
- $cmntdata['app'] = 'facebook';
- $cmntdata['created'] = datetime_convert('UTC','UTC',$cmnt->created_time);
- $cmntdata['edited'] = datetime_convert('UTC','UTC',$cmnt->created_time);
- $cmntdata['verb'] = ACTIVITY_POST;
- $cmntdata['author-name'] = $cmnt->from->name;
- $cmntdata['author-link'] = 'http://facebook.com/profile.php?id=' . $cmnt->from->id;
- $cmntdata['author-avatar'] = 'https://graph.facebook.com/' . $cmnt->from->id . '/picture';
- $cmntdata['body'] = $cmnt->message;
- $item = item_store($cmntdata);
- }
- }
- }
-}
-
diff --git a/addon/fortunate/fortunate.css b/addon/fortunate/fortunate.css
deleted file mode 100644
index 61813b7d7..000000000
--- a/addon/fortunate/fortunate.css
+++ /dev/null
@@ -1,7 +0,0 @@
-.fortunate {
- margin-top: 25px;
- margin-left: 100px;
- margin-bottom: 25px;
- color: #000088;
- font-size: 14px;
-} \ No newline at end of file
diff --git a/addon/fortunate/fortunate.php b/addon/fortunate/fortunate.php
deleted file mode 100644
index 5a6302e58..000000000
--- a/addon/fortunate/fortunate.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-/**
- * Name: Fortunate
- * Description: Add a random fortune cookie at the bottom of every pages.
- * Version: 1.0
- * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
- */
-
-
-function fortunate_install() {
- register_hook('page_end', 'addon/fortunate/fortunate.php', 'fortunate_fetch');
-}
-
-function fortunate_uninstall() {
- unregister_hook('page_end', 'addon/fortunate/fortunate.php', 'fortunate_fetch');
-}
-
-
-function fortunate_fetch($a,&$b) {
-
- $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'
- . $a->get_baseurl() . '/addon/fortunate/fortunate.css' . '" media="all" />' . "\r\n";
-
- $s = fetch_url('http://fortunemod.com/cookie.php?numlines=2&equal=1&rand=' . mt_rand());
- $b .= '<div class="fortunate">' . $s . '</div>';
-}
-
diff --git a/addon/impressum/README b/addon/impressum/README
deleted file mode 100644
index 8e4255bd1..000000000
--- a/addon/impressum/README
+++ /dev/null
@@ -1,27 +0,0 @@
-Impressum Plugin for Friendika
-
-Author: Tobias Diekershoff
- tobias.diekershoff@gmx.net
-
-License: 3-clause BSD license (same as Friendika)
-
-About
- This plugin adds an Impressum block to the /friendika page with informations
- about the page operator/owner and how to contact you in case of any questions.
-
- In the notes and postal fields you can use HTML tags for formatting.
-
-Configuration:
- For configuration you can set the following variables in the .htconfig file
- * $a->config['impressum']['owner'] this is the Name of the Operator
- * $a->config['impressum']['ownerprofile'] this is an optional Friendika account
- where the above owner name will link to
- * $a->config['impressum']['email'] a contact email address (optional)
- will be displayed slightly obfuscated
- as name(at)example(dot)com
- * $a->config['impressum']['postal'] should contain a postal address where
- you can be reached at (optional)
- * $a->config['impressum']['notes'] additional informations that should
- be displayed in the Impressum block
-
-
diff --git a/addon/impressum/admin.tpl b/addon/impressum/admin.tpl
deleted file mode 100644
index cfba8df76..000000000
--- a/addon/impressum/admin.tpl
+++ /dev/null
@@ -1,6 +0,0 @@
-{{ inc field_input.tpl with $field=$owner }}{{ endinc }}
-{{ inc field_input.tpl with $field=$ownerprofile }}{{ endinc }}
-{{ inc field_input.tpl with $field=$postal }}{{ endinc }}
-{{ inc field_input.tpl with $field=$notes }}{{ endinc }}
-{{ inc field_input.tpl with $field=$email }}{{ endinc }}
-<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
diff --git a/addon/impressum/impressum.php b/addon/impressum/impressum.php
deleted file mode 100644
index b760c7e0d..000000000
--- a/addon/impressum/impressum.php
+++ /dev/null
@@ -1,76 +0,0 @@
-<?php
-/**
- * Name: Impressum
- * Description: Plugin to add contact information to the about page (/friendika)
- * Version: 1.0
- * Author: Tobias Diekershoff <https://diekershoff.homeunix.net/friendika/profile/tobias>
- * License: 3-clause BSD license
- */
-
-function impressum_install() {
- register_hook('about_hook', 'addon/impressum/impressum.php', 'impressum_show');
- logger("installed impressum plugin");
-}
-
-function impressum_uninstall() {
- unregister_hook('about_hook', 'addon/impressum/impressum.php', 'impressum_show');
- logger("uninstalled impressum plugin");
-}
-function obfuscate_email ($s) {
- $s = str_replace('@','(at)',$s);
- $s = str_replace('.','(dot)',$s);
- return $s;
-}
-function impressum_show($a,&$b) {
- $b .= '<h3>'.t('Impressum').'</h3>';
- $owner = get_config('impressum', 'owner');
- $owner_profile = get_config('impressum','ownerprofile');
- $postal = get_config('impressum', 'postal');
- $notes = get_config('impressum', 'notes');
- $email = obfuscate_email( get_config('impressum','email') );
- if (strlen($owner)) {
- if (strlen($owner_profile)) {
- $tmp = '<a href="'.$owner_profile.'">'.$owner.'</a>';
- } else {
- $tmp = $owner;
- }
- if (strlen($email)) {
- $b .= '<p><strong>'.t('Site Owner').'</strong>: '. $tmp .'<br /><strong>'.t('Email Address').'</strong>: '.$email.'</p>';
- } else {
- $b .= '<p><strong>'.t('Site Owner').'</strong>: '. $tmp .'</p>';
- }
- if (strlen($postal)) {
- $b .= '<p><strong>'.t('Postal Address').'</strong><br />'. $postal .'</p>';
- }
- if (strlen($notes)) {
- $b .= '<p>'.$notes.'</p>';
- }
- } else {
- $b .= '<p>'.t('The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon.').'</p>';
- }
-}
-
-function impressum_plugin_admin_post (&$a) {
- $owner = ((x($_POST, 'owner')) ? notags(trim($_POST['owner'])) : '');
- $ownerprofile = ((x($_POST, 'ownerprofile')) ? notags(trim($_POST['ownerprofile'])) : '');
- $postal = ((x($_POST, 'postal')) ? (trim($_POST['postal'])) : '');
- $notes = ((x($_POST, 'notes')) ? (trim($_POST['notes'])) : '');
- $email = ((x($_POST, 'email')) ? notags(trim($_POST['email'])) : '');
- set_config('impressum','owner',$owner);
- set_config('impressum','ownerprofile',$ownerprofile);
- set_config('impressum','postal',$postal);
- set_config('impressum','email',$email);
- set_config('impressum','notes',$notes);
- info( t('Settings updated.'). EOL );
-}
-function impressum_plugin_admin (&$a, &$o) {
- $t = file_get_contents( dirname(__file__). "/admin.tpl" );
- $o = replace_macros($t, array(
- '$submit' => t('Submit'),
- '$owner' => array('owner', t('Site Owner'), get_config('impressum','owner'), ''),
- '$ownerprofile' => array('ownerprofile', t('Site Owners Profile'), get_config('impressum','ownerprofile'), ''),
- '$postal' => array('postal', t('Postal Address'), get_config('impressum','postal'), ''),
- '$notes' => array('notes', t('Notes'), get_config('impressum','notes'), ''),
- '$email' => array('email', t('Email Address'), get_config('impressum','email'), ''),
- ));
-}
diff --git a/addon/js_upload/file-uploader/client/demo.htm b/addon/js_upload/file-uploader/client/demo.htm
deleted file mode 100644
index 2a0cd6d30..000000000
--- a/addon/js_upload/file-uploader/client/demo.htm
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <link href="fileuploader.css" rel="stylesheet" type="text/css">
- <style>
- body {font-size:13px; font-family:arial, sans-serif; width:700px; margin:100px auto;}
- </style>
-</head>
-<body>
- <p><a href="http://github.com/valums/file-uploader">Back to project page</a></p>
-
- <p>To upload a file, click on the button below. Drag-and-drop is supported in FF, Chrome.</p>
- <p>Progress-bar is supported in FF3.6+, Chrome6+, Safari4+</p>
-
- <div id="file-uploader-demo1">
- <noscript>
- <p>Please enable JavaScript to use file uploader.</p>
- <!-- or put a simple form for upload here -->
- </noscript>
- </div>
-
- <script src="fileuploader.js" type="text/javascript"></script>
- <script>
- function createUploader(){
- var uploader = new qq.FileUploader({
- element: document.getElementById('file-uploader-demo1'),
- action: 'do-nothing.htm',
- debug: true
- });
- }
-
- // in your app create uploader as soon as the DOM is ready
- // don't wait for the window to load
- window.onload = createUploader;
- </script>
-</body>
-</html> \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/client/do-nothing.htm b/addon/js_upload/file-uploader/client/do-nothing.htm
deleted file mode 100644
index 0da19059d..000000000
--- a/addon/js_upload/file-uploader/client/do-nothing.htm
+++ /dev/null
@@ -1 +0,0 @@
-{success:true}
diff --git a/addon/js_upload/file-uploader/client/fileuploader.css b/addon/js_upload/file-uploader/client/fileuploader.css
deleted file mode 100644
index 0e3f111a9..000000000
--- a/addon/js_upload/file-uploader/client/fileuploader.css
+++ /dev/null
@@ -1,31 +0,0 @@
-.qq-uploader { position:relative; width: 100%;}
-
-.qq-upload-button {
- display:block; /* or inline-block */
- width: 105px; padding: 7px 0; text-align:center;
- background:#880000; border-bottom:1px solid #ddd;color:#fff;
-}
-.qq-upload-button-hover {background:#cc0000;}
-.qq-upload-button-focus {outline:1px dotted black;}
-
-.qq-upload-drop-area {
- position:absolute; top:0; left:0; width:100%; height:100%; min-height: 70px; z-index:2;
- background:#FF9797; text-align:center;
-}
-.qq-upload-drop-area span {
- display:block; position:absolute; top: 50%; width:100%; margin-top:-8px; font-size:16px;
-}
-.qq-upload-drop-area-active {background:#FF7171;}
-
-.qq-upload-list {margin:15px 35px; padding:0; list-style:disc;}
-.qq-upload-list li { margin:0; padding:0; line-height:15px; font-size:12px;}
-.qq-upload-file, .qq-upload-spinner, .qq-upload-size, .qq-upload-cancel, .qq-upload-failed-text {
- margin-right: 7px;
-}
-
-.qq-upload-file {}
-.qq-upload-spinner {display:inline-block; background: url("loading.gif"); width:15px; height:15px; vertical-align:text-bottom;}
-.qq-upload-size,.qq-upload-cancel {font-size:11px;}
-
-.qq-upload-failed-text {display:none;}
-.qq-upload-fail .qq-upload-failed-text {display:inline;} \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/client/fileuploader.js b/addon/js_upload/file-uploader/client/fileuploader.js
deleted file mode 100644
index 89c09ebf5..000000000
--- a/addon/js_upload/file-uploader/client/fileuploader.js
+++ /dev/null
@@ -1,1247 +0,0 @@
-/**
- * http://github.com/valums/file-uploader
- *
- * Multiple file upload component with progress-bar, drag-and-drop.
- * © 2010 Andrew Valums ( andrew(at)valums.com )
- *
- * Licensed under GNU GPL 2 or later, see license.txt.
- */
-
-//
-// Helper functions
-//
-
-var qq = qq || {};
-
-/**
- * Adds all missing properties from second obj to first obj
- */
-qq.extend = function(first, second){
- for (var prop in second){
- first[prop] = second[prop];
- }
-};
-
-/**
- * Searches for a given element in the array, returns -1 if it is not present.
- * @param {Number} [from] The index at which to begin the search
- */
-qq.indexOf = function(arr, elt, from){
- if (arr.indexOf) return arr.indexOf(elt, from);
-
- from = from || 0;
- var len = arr.length;
-
- if (from < 0) from += len;
-
- for (; from < len; from++){
- if (from in arr && arr[from] === elt){
- return from;
- }
- }
- return -1;
-};
-
-qq.getUniqueId = (function(){
- var id = 0;
- return function(){ return id++; };
-})();
-
-//
-// Events
-
-qq.attach = function(element, type, fn){
- if (element.addEventListener){
- element.addEventListener(type, fn, false);
- } else if (element.attachEvent){
- element.attachEvent('on' + type, fn);
- }
-};
-qq.detach = function(element, type, fn){
- if (element.removeEventListener){
- element.removeEventListener(type, fn, false);
- } else if (element.attachEvent){
- element.detachEvent('on' + type, fn);
- }
-};
-
-qq.preventDefault = function(e){
- if (e.preventDefault){
- e.preventDefault();
- } else{
- e.returnValue = false;
- }
-};
-
-//
-// Node manipulations
-
-/**
- * Insert node a before node b.
- */
-qq.insertBefore = function(a, b){
- b.parentNode.insertBefore(a, b);
-};
-qq.remove = function(element){
- element.parentNode.removeChild(element);
-};
-
-qq.contains = function(parent, descendant){
- // compareposition returns false in this case
- if (parent == descendant) return true;
-
- if (parent.contains){
- return parent.contains(descendant);
- } else {
- return !!(descendant.compareDocumentPosition(parent) & 8);
- }
-};
-
-/**
- * Creates and returns element from html string
- * Uses innerHTML to create an element
- */
-qq.toElement = (function(){
- var div = document.createElement('div');
- return function(html){
- div.innerHTML = html;
- var element = div.firstChild;
- div.removeChild(element);
- return element;
- };
-})();
-
-//
-// Node properties and attributes
-
-/**
- * Sets styles for an element.
- * Fixes opacity in IE6-8.
- */
-qq.css = function(element, styles){
- if (styles.opacity != null){
- if (typeof element.style.opacity != 'string' && typeof(element.filters) != 'undefined'){
- styles.filter = 'alpha(opacity=' + Math.round(100 * styles.opacity) + ')';
- }
- }
- qq.extend(element.style, styles);
-};
-qq.hasClass = function(element, name){
- var re = new RegExp('(^| )' + name + '( |$)');
- return re.test(element.className);
-};
-qq.addClass = function(element, name){
- if (!qq.hasClass(element, name)){
- element.className += ' ' + name;
- }
-};
-qq.removeClass = function(element, name){
- var re = new RegExp('(^| )' + name + '( |$)');
- element.className = element.className.replace(re, ' ').replace(/^\s+|\s+$/g, "");
-};
-qq.setText = function(element, text){
- element.innerText = text;
- element.textContent = text;
-};
-
-//
-// Selecting elements
-
-qq.children = function(element){
- var children = [],
- child = element.firstChild;
-
- while (child){
- if (child.nodeType == 1){
- children.push(child);
- }
- child = child.nextSibling;
- }
-
- return children;
-};
-
-qq.getByClass = function(element, className){
- if (element.querySelectorAll){
- return element.querySelectorAll('.' + className);
- }
-
- var result = [];
- var candidates = element.getElementsByTagName("*");
- var len = candidates.length;
-
- for (var i = 0; i < len; i++){
- if (qq.hasClass(candidates[i], className)){
- result.push(candidates[i]);
- }
- }
- return result;
-};
-
-/**
- * obj2url() takes a json-object as argument and generates
- * a querystring. pretty much like jQuery.param()
- *
- * how to use:
- *
- * `qq.obj2url({a:'b',c:'d'},'http://any.url/upload?otherParam=value');`
- *
- * will result in:
- *
- * `http://any.url/upload?otherParam=value&a=b&c=d`
- *
- * @param Object JSON-Object
- * @param String current querystring-part
- * @return String encoded querystring
- */
-qq.obj2url = function(obj, temp, prefixDone){
- var uristrings = [],
- prefix = '&',
- add = function(nextObj, i){
- var nextTemp = temp
- ? (/\[\]$/.test(temp)) // prevent double-encoding
- ? temp
- : temp+'['+i+']'
- : i;
- if ((nextTemp != 'undefined') && (i != 'undefined')) {
- uristrings.push(
- (typeof nextObj === 'object')
- ? qq.obj2url(nextObj, nextTemp, true)
- : (Object.prototype.toString.call(nextObj) === '[object Function]')
- ? encodeURIComponent(nextTemp) + '=' + encodeURIComponent(nextObj())
- : encodeURIComponent(nextTemp) + '=' + encodeURIComponent(nextObj)
- );
- }
- };
-
- if (!prefixDone && temp) {
- prefix = (/\?/.test(temp)) ? (/\?$/.test(temp)) ? '' : '&' : '?';
- uristrings.push(temp);
- uristrings.push(qq.obj2url(obj));
- } else if ((Object.prototype.toString.call(obj) === '[object Array]') && (typeof obj != 'undefined') ) {
- // we wont use a for-in-loop on an array (performance)
- for (var i = 0, len = obj.length; i < len; ++i){
- add(obj[i], i);
- }
- } else if ((typeof obj != 'undefined') && (obj !== null) && (typeof obj === "object")){
- // for anything else but a scalar, we will use for-in-loop
- for (var i in obj){
- add(obj[i], i);
- }
- } else {
- uristrings.push(encodeURIComponent(temp) + '=' + encodeURIComponent(obj));
- }
-
- return uristrings.join(prefix)
- .replace(/^&/, '')
- .replace(/%20/g, '+');
-};
-
-//
-//
-// Uploader Classes
-//
-//
-
-var qq = qq || {};
-
-/**
- * Creates upload button, validates upload, but doesn't create file list or dd.
- */
-qq.FileUploaderBasic = function(o){
- this._options = {
- // set to true to see the server response
- debug: false,
- action: '/server/upload',
- params: {},
- button: null,
- multiple: true,
- maxConnections: 3,
- // validation
- allowedExtensions: [],
- sizeLimit: 0,
- minSizeLimit: 0,
- // events
- // return false to cancel submit
- onSubmit: function(id, fileName){},
- onProgress: function(id, fileName, loaded, total){},
- onComplete: function(id, fileName, responseJSON){},
- onCancel: function(id, fileName){},
- // messages
- messages: {
- typeError: "{file} has invalid extension. Only {extensions} are allowed.",
- sizeError: "{file} is too large, maximum file size is {sizeLimit}.",
- minSizeError: "{file} is too small, minimum file size is {minSizeLimit}.",
- emptyError: "{file} is empty, please select files again without it.",
- onLeave: "The files are being uploaded, if you leave now the upload will be cancelled."
- },
- showMessage: function(message){
- alert(message);
- }
- };
- qq.extend(this._options, o);
-
- // number of files being uploaded
- this._filesInProgress = 0;
- this._handler = this._createUploadHandler();
-
- if (this._options.button){
- this._button = this._createUploadButton(this._options.button);
- }
-
- this._preventLeaveInProgress();
-};
-
-qq.FileUploaderBasic.prototype = {
- setParams: function(params){
- this._options.params = params;
- },
- getInProgress: function(){
- return this._filesInProgress;
- },
- _createUploadButton: function(element){
- var self = this;
-
- return new qq.UploadButton({
- element: element,
- multiple: this._options.multiple && qq.UploadHandlerXhr.isSupported(),
- onChange: function(input){
- self._onInputChange(input);
- }
- });
- },
- _createUploadHandler: function(){
- var self = this,
- handlerClass;
-
- if(qq.UploadHandlerXhr.isSupported()){
- handlerClass = 'UploadHandlerXhr';
- } else {
- handlerClass = 'UploadHandlerForm';
- }
-
- var handler = new qq[handlerClass]({
- debug: this._options.debug,
- action: this._options.action,
- maxConnections: this._options.maxConnections,
- onProgress: function(id, fileName, loaded, total){
- self._onProgress(id, fileName, loaded, total);
- self._options.onProgress(id, fileName, loaded, total);
- },
- onComplete: function(id, fileName, result){
- self._onComplete(id, fileName, result);
- self._options.onComplete(id, fileName, result);
- },
- onCancel: function(id, fileName){
- self._onCancel(id, fileName);
- self._options.onCancel(id, fileName);
- }
- });
-
- return handler;
- },
- _preventLeaveInProgress: function(){
- var self = this;
-
- qq.attach(window, 'beforeunload', function(e){
- if (!self._filesInProgress){return;}
-
- var e = e || window.event;
- // for ie, ff
- e.returnValue = self._options.messages.onLeave;
- // for webkit
- return self._options.messages.onLeave;
- });
- },
- _onSubmit: function(id, fileName){
- this._filesInProgress++;
- },
- _onProgress: function(id, fileName, loaded, total){
- },
- _onComplete: function(id, fileName, result){
- this._filesInProgress--;
- if (result.error){
- this._options.showMessage(result.error);
- }
- },
- _onCancel: function(id, fileName){
- this._filesInProgress--;
- },
- _onInputChange: function(input){
- if (this._handler instanceof qq.UploadHandlerXhr){
- this._uploadFileList(input.files);
- } else {
- if (this._validateFile(input)){
- this._uploadFile(input);
- }
- }
- this._button.reset();
- },
- _uploadFileList: function(files){
- for (var i=0; i<files.length; i++){
- if ( !this._validateFile(files[i])){
- return;
- }
- }
-
- for (var i=0; i<files.length; i++){
- this._uploadFile(files[i]);
- }
- },
- _uploadFile: function(fileContainer){
- var id = this._handler.add(fileContainer);
- var fileName = this._handler.getName(id);
-
- if (this._options.onSubmit(id, fileName) !== false){
- this._onSubmit(id, fileName);
- this._handler.upload(id, this._options.params);
- }
- },
- _validateFile: function(file){
- var name, size;
-
- if (file.value){
- // it is a file input
- // get input value and remove path to normalize
- name = file.value.replace(/.*(\/|\\)/, "");
- } else {
- // fix missing properties in Safari
- name = file.fileName != null ? file.fileName : file.name;
- size = file.fileSize != null ? file.fileSize : file.size;
- }
-
- if (! this._isAllowedExtension(name)){
- this._error('typeError', name);
- return false;
-
- } else if (size === 0){
- this._error('emptyError', name);
- return false;
-
- } else if (size && this._options.sizeLimit && size > this._options.sizeLimit){
- this._error('sizeError', name);
- return false;
-
- } else if (size && size < this._options.minSizeLimit){
- this._error('minSizeError', name);
- return false;
- }
-
- return true;
- },
- _error: function(code, fileName){
- var message = this._options.messages[code];
- function r(name, replacement){ message = message.replace(name, replacement); }
-
- r('{file}', this._formatFileName(fileName));
- r('{extensions}', this._options.allowedExtensions.join(', '));
- r('{sizeLimit}', this._formatSize(this._options.sizeLimit));
- r('{minSizeLimit}', this._formatSize(this._options.minSizeLimit));
-
- this._options.showMessage(message);
- },
- _formatFileName: function(name){
- if (name.length > 33){
- name = name.slice(0, 19) + '...' + name.slice(-13);
- }
- return name;
- },
- _isAllowedExtension: function(fileName){
- var ext = (-1 !== fileName.indexOf('.')) ? fileName.replace(/.*[.]/, '').toLowerCase() : '';
- var allowed = this._options.allowedExtensions;
-
- if (!allowed.length){return true;}
-
- for (var i=0; i<allowed.length; i++){
- if (allowed[i].toLowerCase() == ext){ return true;}
- }
-
- return false;
- },
- _formatSize: function(bytes){
- var i = -1;
- do {
- bytes = bytes / 1024;
- i++;
- } while (bytes > 99);
-
- return Math.max(bytes, 0.1).toFixed(1) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i];
- }
-};
-
-
-/**
- * Class that creates upload widget with drag-and-drop and file list
- * @inherits qq.FileUploaderBasic
- */
-qq.FileUploader = function(o){
- // call parent constructor
- qq.FileUploaderBasic.apply(this, arguments);
-
- // additional options
- qq.extend(this._options, {
- element: null,
- // if set, will be used instead of qq-upload-list in template
- listElement: null,
-
- template: '<div class="qq-uploader">' +
- '<div class="qq-upload-drop-area"><span>Drop files here to upload</span></div>' +
- '<div class="qq-upload-button">Upload a file</div>' +
- '<ul class="qq-upload-list"></ul>' +
- '</div>',
-
- // template for one item in file list
- fileTemplate: '<li>' +
- '<span class="qq-upload-file"></span>' +
- '<span class="qq-upload-spinner"></span>' +
- '<span class="qq-upload-size"></span>' +
- '<a class="qq-upload-cancel" href="#">Cancel</a>' +
- '<span class="qq-upload-failed-text">Failed</span>' +
- '</li>',
-
- classes: {
- // used to get elements from templates
- button: 'qq-upload-button',
- drop: 'qq-upload-drop-area',
- dropActive: 'qq-upload-drop-area-active',
- list: 'qq-upload-list',
-
- file: 'qq-upload-file',
- spinner: 'qq-upload-spinner',
- size: 'qq-upload-size',
- cancel: 'qq-upload-cancel',
-
- // added to list item when upload completes
- // used in css to hide progress spinner
- success: 'qq-upload-success',
- fail: 'qq-upload-fail'
- }
- });
- // overwrite options with user supplied
- qq.extend(this._options, o);
-
- this._element = this._options.element;
- this._element.innerHTML = this._options.template;
- this._listElement = this._options.listElement || this._find(this._element, 'list');
-
- this._classes = this._options.classes;
-
- this._button = this._createUploadButton(this._find(this._element, 'button'));
-
- this._bindCancelEvent();
- this._setupDragDrop();
-};
-
-// inherit from Basic Uploader
-qq.extend(qq.FileUploader.prototype, qq.FileUploaderBasic.prototype);
-
-qq.extend(qq.FileUploader.prototype, {
- /**
- * Gets one of the elements listed in this._options.classes
- **/
- _find: function(parent, type){
- var element = qq.getByClass(parent, this._options.classes[type])[0];
- if (!element){
- throw new Error('element not found ' + type);
- }
-
- return element;
- },
- _setupDragDrop: function(){
- var self = this,
- dropArea = this._find(this._element, 'drop');
-
- var dz = new qq.UploadDropZone({
- element: dropArea,
- onEnter: function(e){
- qq.addClass(dropArea, self._classes.dropActive);
- e.stopPropagation();
- },
- onLeave: function(e){
- e.stopPropagation();
- },
- onLeaveNotDescendants: function(e){
- qq.removeClass(dropArea, self._classes.dropActive);
- },
- onDrop: function(e){
- dropArea.style.display = 'none';
- qq.removeClass(dropArea, self._classes.dropActive);
- self._uploadFileList(e.dataTransfer.files);
- }
- });
-
- dropArea.style.display = 'none';
-
- qq.attach(document, 'dragenter', function(e){
- if (!dz._isValidFileDrag(e)) return;
-
- dropArea.style.display = 'block';
- });
- qq.attach(document, 'dragleave', function(e){
- if (!dz._isValidFileDrag(e)) return;
-
- var relatedTarget = document.elementFromPoint(e.clientX, e.clientY);
- // only fire when leaving document out
- if ( ! relatedTarget || relatedTarget.nodeName == "HTML"){
- dropArea.style.display = 'none';
- }
- });
- },
- _onSubmit: function(id, fileName){
- qq.FileUploaderBasic.prototype._onSubmit.apply(this, arguments);
- this._addToList(id, fileName);
- },
- _onProgress: function(id, fileName, loaded, total){
- qq.FileUploaderBasic.prototype._onProgress.apply(this, arguments);
-
- var item = this._getItemByFileId(id);
- var size = this._find(item, 'size');
- size.style.display = 'inline';
-
- var text;
- if (loaded != total){
- text = Math.round(loaded / total * 100) + '% from ' + this._formatSize(total);
- } else {
- text = this._formatSize(total);
- }
-
- qq.setText(size, text);
- },
- _onComplete: function(id, fileName, result){
- qq.FileUploaderBasic.prototype._onComplete.apply(this, arguments);
-
- // mark completed
- var item = this._getItemByFileId(id);
- qq.remove(this._find(item, 'cancel'));
- qq.remove(this._find(item, 'spinner'));
-
- if (result.success){
- qq.addClass(item, this._classes.success);
- } else {
- qq.addClass(item, this._classes.fail);
- }
- },
- _addToList: function(id, fileName){
- var item = qq.toElement(this._options.fileTemplate);
- item.qqFileId = id;
-
- var fileElement = this._find(item, 'file');
- qq.setText(fileElement, this._formatFileName(fileName));
- this._find(item, 'size').style.display = 'none';
-
- this._listElement.appendChild(item);
- },
- _getItemByFileId: function(id){
- var item = this._listElement.firstChild;
-
- // there can't be txt nodes in dynamically created list
- // and we can use nextSibling
- while (item){
- if (item.qqFileId == id) return item;
- item = item.nextSibling;
- }
- },
- /**
- * delegate click event for cancel link
- **/
- _bindCancelEvent: function(){
- var self = this,
- list = this._listElement;
-
- qq.attach(list, 'click', function(e){
- e = e || window.event;
- var target = e.target || e.srcElement;
-
- if (qq.hasClass(target, self._classes.cancel)){
- qq.preventDefault(e);
-
- var item = target.parentNode;
- self._handler.cancel(item.qqFileId);
- qq.remove(item);
- }
- });
- }
-});
-
-qq.UploadDropZone = function(o){
- this._options = {
- element: null,
- onEnter: function(e){},
- onLeave: function(e){},
- // is not fired when leaving element by hovering descendants
- onLeaveNotDescendants: function(e){},
- onDrop: function(e){}
- };
- qq.extend(this._options, o);
-
- this._element = this._options.element;
-
- this._disableDropOutside();
- this._attachEvents();
-};
-
-qq.UploadDropZone.prototype = {
- _disableDropOutside: function(e){
- // run only once for all instances
- if (!qq.UploadDropZone.dropOutsideDisabled ){
-
- qq.attach(document, 'dragover', function(e){
- if (e.dataTransfer){
- e.dataTransfer.dropEffect = 'none';
- e.preventDefault();
- }
- });
-
- qq.UploadDropZone.dropOutsideDisabled = true;
- }
- },
- _attachEvents: function(){
- var self = this;
-
- qq.attach(self._element, 'dragover', function(e){
- if (!self._isValidFileDrag(e)) return;
-
- var effect = e.dataTransfer.effectAllowed;
- if (effect == 'move' || effect == 'linkMove'){
- e.dataTransfer.dropEffect = 'move'; // for FF (only move allowed)
- } else {
- e.dataTransfer.dropEffect = 'copy'; // for Chrome
- }
-
- e.stopPropagation();
- e.preventDefault();
- });
-
- qq.attach(self._element, 'dragenter', function(e){
- if (!self._isValidFileDrag(e)) return;
-
- self._options.onEnter(e);
- });
-
- qq.attach(self._element, 'dragleave', function(e){
- if (!self._isValidFileDrag(e)) return;
-
- self._options.onLeave(e);
-
- var relatedTarget = document.elementFromPoint(e.clientX, e.clientY);
- // do not fire when moving a mouse over a descendant
- if (qq.contains(this, relatedTarget)) return;
-
- self._options.onLeaveNotDescendants(e);
- });
-
- qq.attach(self._element, 'drop', function(e){
- if (!self._isValidFileDrag(e)) return;
-
- e.preventDefault();
- self._options.onDrop(e);
- });
- },
- _isValidFileDrag: function(e){
- var dt = e.dataTransfer,
- // do not check dt.types.contains in webkit, because it crashes safari 4
- isWebkit = navigator.userAgent.indexOf("AppleWebKit") > -1;
-
- // dt.effectAllowed is none in Safari 5
- // dt.types.contains check is for firefox
- return dt && dt.effectAllowed != 'none' &&
- (dt.files || (!isWebkit && dt.types.contains && dt.types.contains('Files')));
-
- }
-};
-
-qq.UploadButton = function(o){
- this._options = {
- element: null,
- // if set to true adds multiple attribute to file input
- multiple: false,
- // name attribute of file input
- name: 'file',
- onChange: function(input){},
- hoverClass: 'qq-upload-button-hover',
- focusClass: 'qq-upload-button-focus'
- };
-
- qq.extend(this._options, o);
-
- this._element = this._options.element;
-
- // make button suitable container for input
- qq.css(this._element, {
- position: 'relative',
- overflow: 'hidden',
- // Make sure browse button is in the right side
- // in Internet Explorer
- direction: 'ltr'
- });
-
- this._input = this._createInput();
-};
-
-qq.UploadButton.prototype = {
- /* returns file input element */
- getInput: function(){
- return this._input;
- },
- /* cleans/recreates the file input */
- reset: function(){
- if (this._input.parentNode){
- qq.remove(this._input);
- }
-
- qq.removeClass(this._element, this._options.focusClass);
- this._input = this._createInput();
- },
- _createInput: function(){
- var input = document.createElement("input");
-
- if (this._options.multiple){
- input.setAttribute("multiple", "multiple");
- }
-
- input.setAttribute("type", "file");
- input.setAttribute("name", this._options.name);
-
- qq.css(input, {
- position: 'absolute',
- // in Opera only 'browse' button
- // is clickable and it is located at
- // the right side of the input
- right: 0,
- top: 0,
- fontFamily: 'Arial',
- // 4 persons reported this, the max values that worked for them were 243, 236, 236, 118
- fontSize: '118px',
- margin: 0,
- padding: 0,
- cursor: 'pointer',
- opacity: 0
- });
-
- this._element.appendChild(input);
-
- var self = this;
- qq.attach(input, 'change', function(){
- self._options.onChange(input);
- });
-
- qq.attach(input, 'mouseover', function(){
- qq.addClass(self._element, self._options.hoverClass);
- });
- qq.attach(input, 'mouseout', function(){
- qq.removeClass(self._element, self._options.hoverClass);
- });
- qq.attach(input, 'focus', function(){
- qq.addClass(self._element, self._options.focusClass);
- });
- qq.attach(input, 'blur', function(){
- qq.removeClass(self._element, self._options.focusClass);
- });
-
- // IE and Opera, unfortunately have 2 tab stops on file input
- // which is unacceptable in our case, disable keyboard access
- if (window.attachEvent){
- // it is IE or Opera
- input.setAttribute('tabIndex', "-1");
- }
-
- return input;
- }
-};
-
-/**
- * Class for uploading files, uploading itself is handled by child classes
- */
-qq.UploadHandlerAbstract = function(o){
- this._options = {
- debug: false,
- action: '/upload.php',
- // maximum number of concurrent uploads
- maxConnections: 999,
- onProgress: function(id, fileName, loaded, total){},
- onComplete: function(id, fileName, response){},
- onCancel: function(id, fileName){}
- };
- qq.extend(this._options, o);
-
- this._queue = [];
- // params for files in queue
- this._params = [];
-};
-qq.UploadHandlerAbstract.prototype = {
- log: function(str){
- if (this._options.debug && window.console) console.log('[uploader] ' + str);
- },
- /**
- * Adds file or file input to the queue
- * @returns id
- **/
- add: function(file){},
- /**
- * Sends the file identified by id and additional query params to the server
- */
- upload: function(id, params){
- var len = this._queue.push(id);
-
- var copy = {};
- qq.extend(copy, params);
- this._params[id] = copy;
-
- // if too many active uploads, wait...
- if (len <= this._options.maxConnections){
- this._upload(id, this._params[id]);
- }
- },
- /**
- * Cancels file upload by id
- */
- cancel: function(id){
- this._cancel(id);
- this._dequeue(id);
- },
- /**
- * Cancells all uploads
- */
- cancelAll: function(){
- for (var i=0; i<this._queue.length; i++){
- this._cancel(this._queue[i]);
- }
- this._queue = [];
- },
- /**
- * Returns name of the file identified by id
- */
- getName: function(id){},
- /**
- * Returns size of the file identified by id
- */
- getSize: function(id){},
- /**
- * Returns id of files being uploaded or
- * waiting for their turn
- */
- getQueue: function(){
- return this._queue;
- },
- /**
- * Actual upload method
- */
- _upload: function(id){},
- /**
- * Actual cancel method
- */
- _cancel: function(id){},
- /**
- * Removes element from queue, starts upload of next
- */
- _dequeue: function(id){
- var i = qq.indexOf(this._queue, id);
- this._queue.splice(i, 1);
-
- var max = this._options.maxConnections;
-
- if (this._queue.length >= max){
- var nextId = this._queue[max-1];
- this._upload(nextId, this._params[nextId]);
- }
- }
-};
-
-/**
- * Class for uploading files using form and iframe
- * @inherits qq.UploadHandlerAbstract
- */
-qq.UploadHandlerForm = function(o){
- qq.UploadHandlerAbstract.apply(this, arguments);
-
- this._inputs = {};
-};
-// @inherits qq.UploadHandlerAbstract
-qq.extend(qq.UploadHandlerForm.prototype, qq.UploadHandlerAbstract.prototype);
-
-qq.extend(qq.UploadHandlerForm.prototype, {
- add: function(fileInput){
- fileInput.setAttribute('name', 'qqfile');
- var id = 'qq-upload-handler-iframe' + qq.getUniqueId();
-
- this._inputs[id] = fileInput;
-
- // remove file input from DOM
- if (fileInput.parentNode){
- qq.remove(fileInput);
- }
-
- return id;
- },
- getName: function(id){
- // get input value and remove path to normalize
- return this._inputs[id].value.replace(/.*(\/|\\)/, "");
- },
- _cancel: function(id){
- this._options.onCancel(id, this.getName(id));
-
- delete this._inputs[id];
-
- var iframe = document.getElementById(id);
- if (iframe){
- // to cancel request set src to something else
- // we use src="javascript:false;" because it doesn't
- // trigger ie6 prompt on https
- iframe.setAttribute('src', 'javascript:false;');
-
- qq.remove(iframe);
- }
- },
- _upload: function(id, params){
- var input = this._inputs[id];
-
- if (!input){
- throw new Error('file with passed id was not added, or already uploaded or cancelled');
- }
-
- var fileName = this.getName(id);
-
- var iframe = this._createIframe(id);
- var form = this._createForm(iframe, params);
- form.appendChild(input);
-
- var self = this;
- this._attachLoadEvent(iframe, function(){
- self.log('iframe loaded');
-
- var response = self._getIframeContentJSON(iframe);
-
- self._options.onComplete(id, fileName, response);
- self._dequeue(id);
-
- delete self._inputs[id];
- // timeout added to fix busy state in FF3.6
- setTimeout(function(){
- qq.remove(iframe);
- }, 1);
- });
-
- form.submit();
- qq.remove(form);
-
- return id;
- },
- _attachLoadEvent: function(iframe, callback){
- qq.attach(iframe, 'load', function(){
- // when we remove iframe from dom
- // the request stops, but in IE load
- // event fires
- if (!iframe.parentNode){
- return;
- }
-
- // fixing Opera 10.53
- if (iframe.contentDocument &&
- iframe.contentDocument.body &&
- iframe.contentDocument.body.innerHTML == "false"){
- // In Opera event is fired second time
- // when body.innerHTML changed from false
- // to server response approx. after 1 sec
- // when we upload file with iframe
- return;
- }
-
- callback();
- });
- },
- /**
- * Returns json object received by iframe from server.
- */
- _getIframeContentJSON: function(iframe){
- // iframe.contentWindow.document - for IE<7
- var doc = iframe.contentDocument ? iframe.contentDocument: iframe.contentWindow.document,
- response;
-
- this.log("converting iframe's innerHTML to JSON");
- this.log("innerHTML = " + doc.body.innerHTML);
-
- try {
- response = eval("(" + doc.body.innerHTML + ")");
- } catch(err){
- response = {};
- }
-
- return response;
- },
- /**
- * Creates iframe with unique name
- */
- _createIframe: function(id){
- // We can't use following code as the name attribute
- // won't be properly registered in IE6, and new window
- // on form submit will open
- // var iframe = document.createElement('iframe');
- // iframe.setAttribute('name', id);
-
- var iframe = qq.toElement('<iframe src="javascript:false;" name="' + id + '" />');
- // src="javascript:false;" removes ie6 prompt on https
-
- iframe.setAttribute('id', id);
-
- iframe.style.display = 'none';
- document.body.appendChild(iframe);
-
- return iframe;
- },
- /**
- * Creates form, that will be submitted to iframe
- */
- _createForm: function(iframe, params){
- // We can't use the following code in IE6
- // var form = document.createElement('form');
- // form.setAttribute('method', 'post');
- // form.setAttribute('enctype', 'multipart/form-data');
- // Because in this case file won't be attached to request
- var form = qq.toElement('<form method="post" enctype="multipart/form-data"></form>');
-
- var queryString = qq.obj2url(params, this._options.action);
-
- form.setAttribute('action', queryString);
- form.setAttribute('target', iframe.name);
- form.style.display = 'none';
- document.body.appendChild(form);
-
- return form;
- }
-});
-
-/**
- * Class for uploading files using xhr
- * @inherits qq.UploadHandlerAbstract
- */
-qq.UploadHandlerXhr = function(o){
- qq.UploadHandlerAbstract.apply(this, arguments);
-
- this._files = [];
- this._xhrs = [];
-
- // current loaded size in bytes for each file
- this._loaded = [];
-};
-
-// static method
-qq.UploadHandlerXhr.isSupported = function(){
- var input = document.createElement('input');
- input.type = 'file';
-
- return (
- 'multiple' in input &&
- typeof File != "undefined" &&
- typeof (new XMLHttpRequest()).upload != "undefined" );
-};
-
-// @inherits qq.UploadHandlerAbstract
-qq.extend(qq.UploadHandlerXhr.prototype, qq.UploadHandlerAbstract.prototype)
-
-qq.extend(qq.UploadHandlerXhr.prototype, {
- /**
- * Adds file to the queue
- * Returns id to use with upload, cancel
- **/
- add: function(file){
- if (!(file instanceof File)){
- throw new Error('Passed obj in not a File (in qq.UploadHandlerXhr)');
- }
-
- return this._files.push(file) - 1;
- },
- getName: function(id){
- var file = this._files[id];
- // fix missing name in Safari 4
- return file.fileName != null ? file.fileName : file.name;
- },
- getSize: function(id){
- var file = this._files[id];
- return file.fileSize != null ? file.fileSize : file.size;
- },
- /**
- * Returns uploaded bytes for file identified by id
- */
- getLoaded: function(id){
- return this._loaded[id] || 0;
- },
- /**
- * Sends the file identified by id and additional query params to the server
- * @param {Object} params name-value string pairs
- */
- _upload: function(id, params){
- var file = this._files[id],
- name = this.getName(id),
- size = this.getSize(id);
-
- this._loaded[id] = 0;
-
- var xhr = this._xhrs[id] = new XMLHttpRequest();
- var self = this;
-
- xhr.upload.onprogress = function(e){
- if (e.lengthComputable){
- self._loaded[id] = e.loaded;
- self._options.onProgress(id, name, e.loaded, e.total);
- }
- };
-
- xhr.onreadystatechange = function(){
- if (xhr.readyState == 4){
- self._onComplete(id, xhr);
- }
- };
-
- // build query string
- params = params || {};
- params['qqfile'] = name;
- var queryString = qq.obj2url(params, this._options.action);
-
- xhr.open("POST", queryString, true);
- xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
- xhr.setRequestHeader("X-File-Name", encodeURIComponent(name));
- xhr.setRequestHeader("Content-Type", "application/octet-stream");
- xhr.send(file);
- },
- _onComplete: function(id, xhr){
- // the request was aborted/cancelled
- if (!this._files[id]) return;
-
- var name = this.getName(id);
- var size = this.getSize(id);
-
- this._options.onProgress(id, name, size, size);
-
- if (xhr.status == 200){
- this.log("xhr - server response received");
- this.log("responseText = " + xhr.responseText);
-
- var response;
-
- try {
- response = eval("(" + xhr.responseText + ")");
- } catch(err){
- response = {};
- }
-
- this._options.onComplete(id, name, response);
-
- } else {
- this._options.onComplete(id, name, {});
- }
-
- this._files[id] = null;
- this._xhrs[id] = null;
- this._dequeue(id);
- },
- _cancel: function(id){
- this._options.onCancel(id, this.getName(id));
-
- this._files[id] = null;
-
- if (this._xhrs[id]){
- this._xhrs[id].abort();
- this._xhrs[id] = null;
- }
- }
-}); \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/client/loading.gif b/addon/js_upload/file-uploader/client/loading.gif
deleted file mode 100644
index 6fba77609..000000000
--- a/addon/js_upload/file-uploader/client/loading.gif
+++ /dev/null
Binary files differ
diff --git a/addon/js_upload/file-uploader/gpl-2.0.txt b/addon/js_upload/file-uploader/gpl-2.0.txt
deleted file mode 100644
index ecbc05937..000000000
--- a/addon/js_upload/file-uploader/gpl-2.0.txt
+++ /dev/null
@@ -1,339 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/license.txt b/addon/js_upload/file-uploader/license.txt
deleted file mode 100644
index 25cdd3d27..000000000
--- a/addon/js_upload/file-uploader/license.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-File uploader component is licensed under GNU GPL 2 or later, see gpl-2.0.txt.
-© 2010 Andrew Valums
-
-This distribution also includes:
-
- server/OctetStreamReader.java
- Dual Licensed under the MIT and GPL v.2
-
- jQuery JavaScript Library
- http://jquery.com/
- Copyright 2010, John Resig
- Dual licensed under the MIT or GPL Version 2 licenses.
- http://jquery.org/license
-
- Sizzle.js - CSS selector engine used by jQuery
- http://sizzlejs.com/
- Copyright 2010, The Dojo Foundation
- Released under the MIT, BSD, and GPL Licenses.
-
- QUnit - A JavaScript Unit Testing Framework
- http://docs.jquery.com/QUnit
- Copyright (c) 2009 John Resig, Jörn Zaefferer
- Dual licensed under the MIT (MIT-LICENSE.txt)
- and GPL (GPL-LICENSE.txt) licenses. \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/readme.md b/addon/js_upload/file-uploader/readme.md
deleted file mode 100644
index c107bf122..000000000
--- a/addon/js_upload/file-uploader/readme.md
+++ /dev/null
@@ -1,152 +0,0 @@
-[donation_link]: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=3PMY37SL9L888&lc=US&item_name=JavaScript%20file%20uploader&currency_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted
-
-This plugin uses XHR for uploading multiple files with progress-bar in FF3.6+, Safari4+,
-Chrome and falls back to hidden iframe based upload in other browsers,
-providing good user experience everywhere.
-
-### <a href="http://valums.com/files/2010/file-uploader/demo.htm">Demo</a> [Donate][donation_link] ###
-
-### Features ###
-* multiple file select, progress-bar in FF, Chrome, Safari
-* drag-and-drop file select in FF, Chrome
-* uploads are cancellable
-* no external dependencies
-* doesn't use Flash
-* fully working with https
-* keyboard support in FF, Chrome, Safari
-* tested in IE7,8; Firefox 3,3.6,4; Safari4,5; Chrome; Opera10.60;
-
-### License ###
-This plugin is open sourced under <a href="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPL 2</a> or later.
-If this license doesn't suit you mail me at andrew (at) valums.com.
-
-Please [donate][donation_link] if you are willing to support the further development of file upload plugin.
-
-### Known Issues ###
-Plugin breaks back button functionality in Opera.
-
-### Getting started ###
-The fileuploader.js contains two classes that are meant to be used directly.
-If you need a complete upload widget (from demo) to quickly drop
-into your current design, use qq.FileUploader.
-
-If you want to customize uploader, by using a different looking file list
-or change the behaviour or functionality use qq.FileUploaderBasic.
-
-The difference between them is that qq.FileUploader provides a list of files,
-drag-and-drop, but qq.FileUploaderBasic only creates button and handles validation.
-Basic uploader is easier extendable, and doesn't limit possible customization.
-
-qq.FileUploader extends qq.FileUploaderBasic, so that all the options present
-in the basic uploader also exist in the full widget.
-
-### qq.FileUploader - Setting up full upload widget ###
-
-Include fileuploader.js and fileuploader.css into your page.
-Create container element.
-
- <div id="file-uploader">
- <noscript>
- <p>Please enable JavaScript to use file uploader.</p>
- <!-- or put a simple form for upload here -->
- </noscript>
- </div>
-
-Initialize uploader when the DOM is ready. Change the action option.
-For example ../server/php.php for the default folder structure.
-In the server folder you will find examples for different platforms.
-If you can't find the one you need, check the readme.txt in the same folder.
-
- var uploader = new qq.FileUploader({
- // pass the dom node (ex. $(selector)[0] for jQuery users)
- element: document.getElementById('file-uploader'),
- // path to server-side upload script
- action: '/server/upload'
- });
-
-### Options of both classes ###
-
- // url of the server-side upload script, should be on the same domain
- action: '/server/upload',
- // additional data to send, name-value pairs
- params: {},
-
- // validation
- // ex. ['jpg', 'jpeg', 'png', 'gif'] or []
- allowedExtensions: [],
- // each file size limit in bytes
- // this option isn't supported in all browsers
- sizeLimit: 0, // max size
- minSizeLimit: 0, // min size
-
- // set to true to output server response to console
- debug: false,
-
- // events
- // you can return false to abort submit
- onSubmit: function(id, fileName){},
- onProgress: function(id, fileName, loaded, total){},
- onComplete: function(id, fileName, responseJSON){},
- onCancel: function(id, fileName){},
-
- messages: {
- // error messages, see qq.FileUploaderBasic for content
- },
- showMessage: function(message){ alert(message); }
-
-Instance methods
-
-* setParams(newParams)
-
-#### Changing alert/messages to something more user friendly ####
-
-If you limited file types and max size, you will probably want to change the default alert and
-messages as you see fit, this is possible using showMessage callback and messages option.
-
-#### Sending additional params ####
-
-To add a parameter that will be passed as a query string with each upload use params option.
-
- var uploader = new qq.FileUploader({
- element: document.getElementById('file-uploader'),
- action: '/server-side.upload',
- // additional data to send, name-value pairs
- params: {
- param1: 'value1',
- param2: 'value2'
- }
- });
-
-To change params based on the state of your app, use
-
- uploader.setParams({
- anotherParam: 'value'
- });
-
-It can be nicely used in onSubmit callback.
-
-#### Troubleshooting ####
-
-If you can't get the uploader to work, please try the following steps
-before asking for help.
-
-If the upload doesn't complete, saying failed.
-
-* Set the debug option of the FileUploader to true.
-* Open the page where you have a FileUploader.
-* Open developer console in your browser.
-* Try to upload the file. You should see a server serponse.
-
-It should be {success:true} for completed requests. If it's not,
-then you have a problem with your server-side script.
-
-#### Contributors ####
-
-Thanks to everybody who contributed, either by sending bug reports or donating. And special thanks to:
-
-John Yeary
-Sidney Maestre
-Patrick Pfeiffer
-Sean Sandy (SeanJA)
-Andy Newby
-Ivan Valles \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/server/OctetStreamReader.java b/addon/js_upload/file-uploader/server/OctetStreamReader.java
deleted file mode 100644
index 23f02be12..000000000
--- a/addon/js_upload/file-uploader/server/OctetStreamReader.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright 2010 Blue Lotus Software, LLC.
- * Copyright 2010 John Yeary <jyeary@bluelotussoftware.com>.
- * Copyright 2010 Allan O'Driscoll
- *
- * Dual Licensed MIT and GPL v.2
- *
- * The MIT License
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- *
- * The GNU General Public License (GPL) Version 2, June 1991
- * 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; version 2 of the License.
-
- * 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
- */
-package com.bluelotussoftware.apache.commons.fileupload.example;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.io.IOUtils;
-
-/**
- * Reads an <code>application/octet-stream</code> and writes it to a file.
- * @author John Yeary <jyeary@bluelotussoftware.com>
- * @author Allan O'Driscoll
- * @version 1.0
- */
-public class OctetStreamReader extends HttpServlet {
-
- private static final long serialVersionUID = 6748857432950840322L;
- private static final String DESTINATION_DIR_PATH = "files";
- private static String realPath;
-
- /**
- * {@inheritDoc}
- * @param config
- * @throws ServletException
- */
- @Override
- public void init(ServletConfig config) throws ServletException {
- super.init(config);
- realPath = getServletContext().getRealPath(DESTINATION_DIR_PATH) + "/";
- }
-
- /**
- * Handles the HTTP <code>POST</code> method.
- * @param request servlet request
- * @param response servlet response
- * @throws ServletException if a servlet-specific error occurs
- * @throws IOException if an I/O error occurs
- */
- @Override
- protected void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException {
-
- PrintWriter writer = null;
- InputStream is = null;
- FileOutputStream fos = null;
-
- try {
- writer = response.getWriter();
- } catch (IOException ex) {
- log(OctetStreamReader.class.getName() + "has thrown an exception: " + ex.getMessage());
- }
-
- String filename = request.getHeader("X-File-Name");
- try {
- is = request.getInputStream();
- fos = new FileOutputStream(new File(realPath + filename));
- IOUtils.copy(is, fos);
- response.setStatus(response.SC_OK);
- writer.print("{success: true}");
- } catch (FileNotFoundException ex) {
- response.setStatus(response.SC_INTERNAL_SERVER_ERROR);
- writer.print("{success: false}");
- log(OctetStreamReader.class.getName() + "has thrown an exception: " + ex.getMessage());
- } catch (IOException ex) {
- response.setStatus(response.SC_INTERNAL_SERVER_ERROR);
- writer.print("{success: false}");
- log(OctetStreamReader.class.getName() + "has thrown an exception: " + ex.getMessage());
- } finally {
- try {
- fos.close();
- is.close();
- } catch (IOException ignored) {
- }
- }
-
- writer.flush();
- writer.close();
- }
-}
diff --git a/addon/js_upload/file-uploader/server/coldfusion/coldfusion.cfc b/addon/js_upload/file-uploader/server/coldfusion/coldfusion.cfc
deleted file mode 100644
index 4e07270d1..000000000
--- a/addon/js_upload/file-uploader/server/coldfusion/coldfusion.cfc
+++ /dev/null
@@ -1 +0,0 @@
-<!--- AJAX FileUploader for ColdFusion version: 1.1.1 feedback: sid.maestre@designovermatter.com -----------update history---------------- 1.1.1 on 9/30/2010 by Martin Webb <martin[at]cubicstate.com> - Change function for Upload to returnformat equals JSON - local var scoping. 1.1 on 9/9/2010 by Sid Maestre - Split Upload function to handle fallback uploads for browsers that don't support XHR data transfer ---> <cfcomponent hint="I handle AJAX File Uploads from Valum's AJAX file uploader library"> <cffunction name="Upload" access="remote" output="false" returntype="any" returnformat="JSON"> <cfargument name="qqfile" type="string" required="true"> <cfset var local = structNew()> <cfset local.response = structNew()> <cfset local.requestData = GetHttpRequestData()> <!--- check if XHR data exists ---> <cfif len(local.requestData.content) GT 0> <cfset local.response = UploadFileXhr(arguments.qqfile, local.requestData.content)> <cfelse> <!--- no XHR data process as standard form submission ---> <cffile action="upload" fileField="arguments.qqfile" destination="#ExpandPath('.')#" nameConflict="makeunique"> <cfset local.response['success'] = true> <cfset local.response['type'] = 'form'> </cfif> <cfreturn local.response> </cffunction> <cffunction name="UploadFileXhr" access="private" output="false" returntype="struct"> <cfargument name="qqfile" type="string" required="true"> <cfargument name="content" type="any" required="true"> <cfset var local = structNew()> <cfset local.response = structNew()> <!--- write the contents of the http request to a file. The filename is passed with the qqfile variable ---> <cffile action="write" file="#ExpandPath('.')#/#arguments.qqfile#" output="#arguments.content#"> <!--- if you want to return some JSON you can do it here. I'm just passing a success message ---> <cfset local.response['success'] = true> <cfset local.response['type'] = 'xhr'> <cfreturn local.response> </cffunction> </cfcomponent> \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/server/coldfusion/demo.cfm b/addon/js_upload/file-uploader/server/coldfusion/demo.cfm
deleted file mode 100644
index 98ab80030..000000000
--- a/addon/js_upload/file-uploader/server/coldfusion/demo.cfm
+++ /dev/null
@@ -1 +0,0 @@
-<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link href="fileuploader.css" rel="stylesheet" type="text/css"> <style> body {font-size:13px; font-family:arial, sans-serif; width:700px; margin:100px auto;} </style> </head> <body > <h1>ColdFusion File Uploader Demo</h1> <p><a href="http://github.com/valums/file-uploader">Back to project page</a></p> <p>To upload a file, click on the button below. Drag-and-drop is supported in FF, Chrome.</p> <p>Progress-bar is supported in FF3.6+, Chrome6+, Safari4+</p> <div id="file-uploader-demo1"> <noscript> <p>Please enable JavaScript to use file uploader.</p> <!-- or put a simple form for upload here --> </noscript> </div> <script src="fileuploader.js" type="text/javascript"></script> <script> function createUploader(){ var uploader = new qq.FileUploader({ element: document.getElementById('file-uploader-demo1'), action: '/valums/server/coldfusion.cfc', params: {method: 'Upload'} }); } // in your app create uploader as soon as the DOM is ready // don't wait for the window to load window.onload = createUploader; </script> </body> </html> \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/server/coldfusion/readme.txt b/addon/js_upload/file-uploader/server/coldfusion/readme.txt
deleted file mode 100644
index c974689aa..000000000
--- a/addon/js_upload/file-uploader/server/coldfusion/readme.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-Coldfusion example by Sidney Maestre
-http://www.designovermatter.com/post.cfm/ajax-file-uploader-for-coldfusion
-
- 1. Unzip Andrew's AJAX Uploader into your web root.
- 2. Replace the demo.htm with demo.cfm in the "client" folder
- 3. Place coldfusion.cfc in the "server" folder
- 4. Browse to the demo.cfm file and try it out. The file should be written to the "server" folder.
-
-Questions? You can contact Sidney Maestreme by mail (sid.maestre(at)designovermatter.com) or Twitter @SidneyAllen \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/server/perl.cgi b/addon/js_upload/file-uploader/server/perl.cgi
deleted file mode 100644
index c66f1aa1a..000000000
--- a/addon/js_upload/file-uploader/server/perl.cgi
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/usr/bin/perl
-
- use strict;
- use CGI::Carp qw(fatalsToBrowser);
-
- use Digest::MD5;
-
- my $uploaddir = '/folder/to/save/in/ajax_upload/tmp_uploads';
-
- my $maxFileSize = 0.5 * 1024 * 1024; # 1/2mb max file size...
-
- use CGI;
- my $IN = new CGI;
-
- my $file = $IN->param('POSTDATA');
- my $temp_id = $IN->param('temp_id');
-
- # make a random filename, and we guess the file type later on...
- my $name = Digest::MD5::md5_base64( rand );
- $name =~ s/\+/_/g;
- $name =~ s/\//_/g;
-
- my $type;
- if ($file =~ /^GIF/) {
- $type = "gif";
- } elsif ($file =~ /PNG/) {
- $type = "png";
- } elsif ($file =~ /JFIF/) {
- $type = "jpg";
- }
-
- if (!$type) {
- print qq|{ "success": false, "error": "Invalid file type..." }|;
- print STDERR "file has been NOT been uploaded... \n";
- }
-
- print STDERR "Making dir: $uploaddir/$temp_id \n";
-
- mkdir("$uploaddir/$temp_id");
-
- open(WRITEIT, ">$uploaddir/$name.$type") or die "Cant write to $uploaddir/$name.$type. Reason: $!";
- print WRITEIT $file;
- close(WRITEIT);
-
- my $check_size = -s "$uploaddir/$name.$type";
-
- print STDERR qq|Main filesize: $check_size Max Filesize: $maxFileSize \n\n|;
-
- print $IN->header();
- if ($check_size < 1) {
- print STDERR "ooops, its empty - gonna get rid of it!\n";
- print qq|{ "success": false, "error": "File is empty..." }|;
- print STDERR "file has been NOT been uploaded... \n";
- } elsif ($check_size > $maxFileSize) {
- print STDERR "ooops, its too large - gonna get rid of it!\n";
- print qq|{ "success": false, "error": "File is too large..." }|;
- print STDERR "file has been NOT been uploaded... \n";
- } else {
- print qq|{ "success": true }|;
-
- print STDERR "file has been successfully uploaded... thank you.\n";
- } \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/server/php.php b/addon/js_upload/file-uploader/server/php.php
deleted file mode 100644
index 915c86c6e..000000000
--- a/addon/js_upload/file-uploader/server/php.php
+++ /dev/null
@@ -1,162 +0,0 @@
-<?php
-
-/**
- * Handle file uploads via XMLHttpRequest
- */
-class qqUploadedFileXhr {
- /**
- * Save the file to the specified path
- * @return boolean TRUE on success
- */
- function save($path) {
- $input = fopen("php://input", "r");
- $temp = tmpfile();
- $realSize = stream_copy_to_stream($input, $temp);
- fclose($input);
-
- if ($realSize != $this->getSize()){
- return false;
- }
-
- $target = fopen($path, "w");
- fseek($temp, 0, SEEK_SET);
- stream_copy_to_stream($temp, $target);
- fclose($target);
-
- return true;
- }
- function getName() {
- return $_GET['qqfile'];
- }
- function getSize() {
- if (isset($_SERVER["CONTENT_LENGTH"])){
- return (int)$_SERVER["CONTENT_LENGTH"];
- } else {
- throw new Exception('Getting content length is not supported.');
- }
- }
-}
-
-/**
- * Handle file uploads via regular form post (uses the $_FILES array)
- */
-class qqUploadedFileForm {
- /**
- * Save the file to the specified path
- * @return boolean TRUE on success
- */
- function save($path) {
- if(!move_uploaded_file($_FILES['qqfile']['tmp_name'], $path)){
- return false;
- }
- return true;
- }
- function getName() {
- return $_FILES['qqfile']['name'];
- }
- function getSize() {
- return $_FILES['qqfile']['size'];
- }
-}
-
-class qqFileUploader {
- private $allowedExtensions = array();
- private $sizeLimit = 10485760;
- private $file;
-
- function __construct(array $allowedExtensions = array(), $sizeLimit = 10485760){
- $allowedExtensions = array_map("strtolower", $allowedExtensions);
-
- $this->allowedExtensions = $allowedExtensions;
- $this->sizeLimit = $sizeLimit;
-
- $this->checkServerSettings();
-
- if (isset($_GET['qqfile'])) {
- $this->file = new qqUploadedFileXhr();
- } elseif (isset($_FILES['qqfile'])) {
- $this->file = new qqUploadedFileForm();
- } else {
- $this->file = false;
- }
- }
-
- private function checkServerSettings(){
- $postSize = $this->toBytes(ini_get('post_max_size'));
- $uploadSize = $this->toBytes(ini_get('upload_max_filesize'));
-
- if ($postSize < $this->sizeLimit || $uploadSize < $this->sizeLimit){
- $size = max(1, $this->sizeLimit / 1024 / 1024) . 'M';
- die("{'error':'increase post_max_size and upload_max_filesize to $size'}");
- }
- }
-
- private function toBytes($str){
- $val = trim($str);
- $last = strtolower($str[strlen($str)-1]);
- switch($last) {
- case 'g': $val *= 1024;
- case 'm': $val *= 1024;
- case 'k': $val *= 1024;
- }
- return $val;
- }
-
- /**
- * Returns array('success'=>true) or array('error'=>'error message')
- */
- function handleUpload($uploadDirectory, $replaceOldFile = FALSE){
- if (!is_writable($uploadDirectory)){
- return array('error' => "Server error. Upload directory isn't writable.");
- }
-
- if (!$this->file){
- return array('error' => 'No files were uploaded.');
- }
-
- $size = $this->file->getSize();
-
- if ($size == 0) {
- return array('error' => 'File is empty');
- }
-
- if ($size > $this->sizeLimit) {
- return array('error' => 'File is too large');
- }
-
- $pathinfo = pathinfo($this->file->getName());
- $filename = $pathinfo['filename'];
- //$filename = md5(uniqid());
- $ext = $pathinfo['extension'];
-
- if($this->allowedExtensions && !in_array(strtolower($ext), $this->allowedExtensions)){
- $these = implode(', ', $this->allowedExtensions);
- return array('error' => 'File has an invalid extension, it should be one of '. $these . '.');
- }
-
- if(!$replaceOldFile){
- /// don't overwrite previous files that were uploaded
- while (file_exists($uploadDirectory . $filename . '.' . $ext)) {
- $filename .= rand(10, 99);
- }
- }
-
- if ($this->file->save($uploadDirectory . $filename . '.' . $ext)){
- return array('success'=>true);
- } else {
- return array('error'=> 'Could not save uploaded file.' .
- 'The upload was cancelled, or server error encountered');
- }
-
- }
-}
-
-// list of valid extensions, ex. array("jpeg", "xml", "bmp")
-$allowedExtensions = array();
-// max file size in bytes
-$sizeLimit = 10 * 1024 * 1024;
-
-$uploader = new qqFileUploader($allowedExtensions, $sizeLimit);
-$result = $uploader->handleUpload('uploads/');
-// to pass data through iframe you will need to encode all html tags
-echo htmlspecialchars(json_encode($result), ENT_NOQUOTES);
diff --git a/addon/js_upload/file-uploader/server/readme.txt b/addon/js_upload/file-uploader/server/readme.txt
deleted file mode 100644
index 8363c0be6..000000000
--- a/addon/js_upload/file-uploader/server/readme.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-The server-side code should consist of two parts.
-
-1. For IE6-8, Opera, older versions of other browsers you get the file as
-you normally do with regular form-base uploads.
-
-2. For browsers which upload file with progress bar, you will need to get the raw
-post data and write it to the file.
-
-## Return values ##
-
-You should return json as a text/html, and escape all
-'<' as '&lt;', '>' as '&gt;', and '&' as '&amp;'.
-
-Return
-{"success":true} when upload was successful
-{"error":"error message to display"} in case of error
-
-Send me a mail to andrew (at) valums.com, if you will have any questions. \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/server/uploads/.gitignore b/addon/js_upload/file-uploader/server/uploads/.gitignore
deleted file mode 100644
index c96a04f00..000000000
--- a/addon/js_upload/file-uploader/server/uploads/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*
-!.gitignore \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/tests/action-acceptance.php b/addon/js_upload/file-uploader/tests/action-acceptance.php
deleted file mode 100644
index fc9583f21..000000000
--- a/addon/js_upload/file-uploader/tests/action-acceptance.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-usleep(100000);
-
-$fileName;
-$fileSize;
-
-if (isset($_GET['qqfile'])){
- $fileName = $_GET['qqfile'];
-
- // xhr request
- $headers = apache_request_headers();
- $fileSize = (int)$headers['Content-Length'];
-} elseif (isset($_FILES['qqfile'])){
- $fileName = basename($_FILES['qqfile']['name']);
- $fileSize = $_FILES['qqfile']['size'];
-} else {
- die ('{error: "server-error file not passed"}');
-}
-
-if ($fileName == '4text.txt'){
- die ('jsgkdfgu4eyij');
-}
-
-if ($fileSize == 0){
- die ('{error: "server-error file size is zero"}');
-}
-
-if ($fileSize < 10){
- die ('{error: "server-error file size is smaller than 10 bytes"}');
-}
-
-if ($fileSize > 9 * 1024){
- die ('{error: "server-error file size is bigger than 9kB"}');
-}
-
-if (count($_GET)){
- array_merge($_GET, array('fileName'=>$fileName));
-
- $response = array_merge($_GET, array('success'=>true, 'fileName'=>$fileName));
-
- // to pass data through iframe you will need to encode all html tags
- echo htmlspecialchars(json_encode($response), ENT_NOQUOTES);
-} else {
- die ('{error: "server-error query params not passed"}');
-}
diff --git a/addon/js_upload/file-uploader/tests/action-handler-queue-test.php b/addon/js_upload/file-uploader/tests/action-handler-queue-test.php
deleted file mode 100644
index ff13576dd..000000000
--- a/addon/js_upload/file-uploader/tests/action-handler-queue-test.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-sleep(4);
-
-$fileName;
-
-if (isset($_GET['qqfile'])){
- $fileName = $_GET['qqfile'];
-
- // xhr request
- $headers = apache_request_headers();
- if ((int)$headers['Content-Length'] == 0){
- die ('{error: "content length is zero"}');
- }
-} elseif (isset($_FILES['qqfile'])){
- $fileName = basename($_FILES['qqfile']['name']);
-
- // form request
- if ($_FILES['qqfile']['size'] == 0){
- die ('{error: "file size is zero"}');
- }
-} else {
- die ('{error: "file not passed"}');
-}
-
-if (count($_GET)){
- $_GET['success'] = true;
- echo json_encode(array_merge($_GET));
-} else {
- die ('{error: "query params not passed"}');
-}
diff --git a/addon/js_upload/file-uploader/tests/action-handler-test.php b/addon/js_upload/file-uploader/tests/action-handler-test.php
deleted file mode 100644
index 24466b122..000000000
--- a/addon/js_upload/file-uploader/tests/action-handler-test.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-usleep(300);
-
-$fileName;
-
-if (isset($_GET['qqfile'])){
- $fileName = $_GET['qqfile'];
-
- // xhr request
- $headers = apache_request_headers();
- if ((int)$headers['Content-Length'] == 0){
- die ('{error: "content length is zero"}');
- }
-} elseif (isset($_FILES['qqfile'])){
- $fileName = basename($_FILES['qqfile']['name']);
-
- // form request
- if ($_FILES['qqfile']['size'] == 0){
- die ('{error: "file size is zero"}');
- }
-} else {
- die ('{error: "file not passed"}');
-}
-
-if (count($_GET)){
- //return query params
- echo json_encode(array_merge($_GET, array('fileName'=>$fileName)));
-} else {
- die ('{error: "query params not passed"}');
-}
diff --git a/addon/js_upload/file-uploader/tests/action-slow-response.php b/addon/js_upload/file-uploader/tests/action-slow-response.php
deleted file mode 100644
index 15c38d8cf..000000000
--- a/addon/js_upload/file-uploader/tests/action-slow-response.php
+++ /dev/null
@@ -1,2 +0,0 @@
-<?php
-sleep(9); \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/tests/browser-bugs/safari-bug1.htm b/addon/js_upload/file-uploader/tests/browser-bugs/safari-bug1.htm
deleted file mode 100644
index ef0eb0b1b..000000000
--- a/addon/js_upload/file-uploader/tests/browser-bugs/safari-bug1.htm
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-</head>
-<body>
- <p>Drag multiple files into input field. (Win7)</p>
- <p>Result: One file is selected multiple times. Expected: Multiple files are selected.</p>
- <input type="file" multiple></body>
-</html> \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/tests/browser-bugs/safari-bug2.htm b/addon/js_upload/file-uploader/tests/browser-bugs/safari-bug2.htm
deleted file mode 100644
index 57f7bc013..000000000
--- a/addon/js_upload/file-uploader/tests/browser-bugs/safari-bug2.htm
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-</head>
-<body>
-
-<script>
-window.addEventListener('load', function(){
- document.addEventListener('dragenter', function(e){
- e.preventDefault();
- },false);
- document.addEventListener('dragover', function(e){
- e.preventDefault();
- // e.dataTransfer.effectAllowed is none
- e.dataTransfer.dropEffect = 'copy';
- },false);
-},false);
-</script>
-</html> \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/tests/iframe-content-tests/application-javascript.php b/addon/js_upload/file-uploader/tests/iframe-content-tests/application-javascript.php
deleted file mode 100644
index a91c75f69..000000000
--- a/addon/js_upload/file-uploader/tests/iframe-content-tests/application-javascript.php
+++ /dev/null
@@ -1 +0,0 @@
-<?php header('Content-type: application/javascript'); ?> \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/tests/iframe-content-tests/application-json.php b/addon/js_upload/file-uploader/tests/iframe-content-tests/application-json.php
deleted file mode 100644
index c1161256f..000000000
--- a/addon/js_upload/file-uploader/tests/iframe-content-tests/application-json.php
+++ /dev/null
@@ -1 +0,0 @@
-<?php header('Content-type: application/json'); ?> \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/tests/iframe-content-tests/header-404.php b/addon/js_upload/file-uploader/tests/iframe-content-tests/header-404.php
deleted file mode 100644
index 17d807555..000000000
--- a/addon/js_upload/file-uploader/tests/iframe-content-tests/header-404.php
+++ /dev/null
@@ -1,2 +0,0 @@
-<?php header("HTTP/1.0 404 Not Found"); ?>
-Not found! \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/tests/iframe-content-tests/somepage.php b/addon/js_upload/file-uploader/tests/iframe-content-tests/somepage.php
deleted file mode 100644
index f0a2575a1..000000000
--- a/addon/js_upload/file-uploader/tests/iframe-content-tests/somepage.php
+++ /dev/null
@@ -1 +0,0 @@
-I'm a page. \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/tests/iframe-content-tests/text-html-large.php b/addon/js_upload/file-uploader/tests/iframe-content-tests/text-html-large.php
deleted file mode 100644
index ac9682be9..000000000
--- a/addon/js_upload/file-uploader/tests/iframe-content-tests/text-html-large.php
+++ /dev/null
@@ -1,6 +0,0 @@
-<?php
- header('Content-type: text/html');
-
- $data = str_repeat("a", 5000);
-
- echo htmlspecialchars(json_encode($data), ENT_NOQUOTES);
diff --git a/addon/js_upload/file-uploader/tests/iframe-content-tests/text-html.php b/addon/js_upload/file-uploader/tests/iframe-content-tests/text-html.php
deleted file mode 100644
index b69a1c774..000000000
--- a/addon/js_upload/file-uploader/tests/iframe-content-tests/text-html.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
- header('Content-type: text/html');
- $data = array(
- 'example' => "&a<computer networks>, to download means to receive data to a local system from a remote system, or to initiate such a data transfer. Examples of a remote system from which a download might be performed include a webserver, FTP server, email server, or other similar systems. A download can mean either any file that is offered for downloading or that has been downloaded, or the process of receiving such a file.The inverse operation, uploading, can refer to the sending of data from a local system to a remote system such as a server or another client with the intent that the remote system should store a copy of the data being transferred, or the initiation of such a process. The words first came into popular usage among computer users with the increased popularity of Bulletin Board Systems (BBSs), facilitated by the widespread distribution and implementation of dial-up access the in the 1970s",
- 'sub' => array('arr'=>array(10,20,30), 'boo'=>false)
- );
- echo htmlspecialchars(json_encode($data), ENT_NOQUOTES);
diff --git a/addon/js_upload/file-uploader/tests/iframe-content-tests/text-javascript.php b/addon/js_upload/file-uploader/tests/iframe-content-tests/text-javascript.php
deleted file mode 100644
index ee930d085..000000000
--- a/addon/js_upload/file-uploader/tests/iframe-content-tests/text-javascript.php
+++ /dev/null
@@ -1 +0,0 @@
-<?php header('Content-type: text/javascript'); ?> \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/tests/iframe-content-tests/text-plain.php b/addon/js_upload/file-uploader/tests/iframe-content-tests/text-plain.php
deleted file mode 100644
index 90c1af0ee..000000000
--- a/addon/js_upload/file-uploader/tests/iframe-content-tests/text-plain.php
+++ /dev/null
@@ -1,2 +0,0 @@
-<?php header('Content-type: text/plain'); ?>
-text<p>P tag</p> \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/tests/jquery-1.4.2.min.js b/addon/js_upload/file-uploader/tests/jquery-1.4.2.min.js
deleted file mode 100644
index 7c2430802..000000000
--- a/addon/js_upload/file-uploader/tests/jquery-1.4.2.min.js
+++ /dev/null
@@ -1,154 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.4.2
- * http://jquery.com/
- *
- * Copyright 2010, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2010, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Sat Feb 13 22:33:48 2010 -0500
- */
-(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
-e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
-j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
-"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
-true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
-Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
-(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
-a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
-"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
-function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
-c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
-L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
-"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
-a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
-d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
-a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
-!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
-true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
-var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
-parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
-false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
-s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
-applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
-else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
-a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
-w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
-cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
-i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
-" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
-this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
-e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
-c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
-a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
-function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
-k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
-C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
-null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
-e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
-f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
-if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
-fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
-d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
-"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
-a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
-isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
-{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
-if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
-e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
-"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
-d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
-!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
-toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
-u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
-function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
-if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
-e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
-t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
-g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
-for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
-1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
-CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
-relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
-l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
-h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
-CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
-g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
-text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
-setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
-h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
-m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
-"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
-h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
-!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
-h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
-q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
-if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
-(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
-function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
-gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
-c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
-{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
-"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
-d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
-a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
-1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
-a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
-c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
-wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
-prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
-this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
-return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
-""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
-this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
-u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
-1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
-return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
-""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
-c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
-c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
-function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
-Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
-"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
-a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
-a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
-"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
-serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
-function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
-global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
-e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
-"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
-false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
-false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
-c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
-d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
-g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
-1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
-"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
-if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
-this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
-"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
-animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
-j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
-this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
-"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
-c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
-this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
-this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
-e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
-c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
-function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
-this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
-k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
-f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
-a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
-c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
-d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
-f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
-"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
-e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
diff --git a/addon/js_upload/file-uploader/tests/jquery-ui/jquery-ui-1.8.4.custom.min.js b/addon/js_upload/file-uploader/tests/jquery-ui/jquery-ui-1.8.4.custom.min.js
deleted file mode 100644
index 891dcdda5..000000000
--- a/addon/js_upload/file-uploader/tests/jquery-ui/jquery-ui-1.8.4.custom.min.js
+++ /dev/null
@@ -1,200 +0,0 @@
-/*!
- * jQuery UI 1.8.4
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI
- */
-(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.4",plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&b[e][1].apply(a.element,d)}},contains:function(a,
-b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)},keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,
-CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable",
-"off").css("MozUserSelect","")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none")},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,
-"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"));if(!isNaN(b)&&b!=0)return b}a=a.parent()}}return 0}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=
-parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f,"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c.style(this,h,d(this,f)+"px")})};c.fn["outer"+
-b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c.style(this,h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==
-b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}})}})(jQuery);
-;/*!
- * jQuery UI Widget 1.8.4
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Widget
- */
-(function(b,j){var k=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return k.call(b(this),a,c)})};b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);
-b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.substring(0,1)==="_")return h;e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):
-this.each(function(){var g=b.data(this,a);if(g){d&&g.option(d);g._init()}else b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,b.metadata&&b.metadata.get(c)[this.widgetName],a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});
-this._create();this._init()},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(a,c){var d=a,e=this;if(arguments.length===0)return b.extend({},e.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}b.each(d,function(f,
-h){e._setOption(f,h)});return e},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=
-b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
-;/*!
- * jQuery UI Mouse 1.8.4
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Mouse
- *
- * Depends:
- * jquery.ui.widget.js
- */
-(function(c){c.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(b){return a._mouseDown(b)}).bind("click."+this.widgetName,function(b){if(a._preventClickEvent){a._preventClickEvent=false;b.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent=a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&&
-this._mouseUp(a);this._mouseDownEvent=a;var b=this,e=a.which==1,f=typeof this.options.cancel=="string"?c(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){b.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();
-return true}}this._mouseMoveDelegate=function(d){return b._mouseMove(d)};this._mouseUpDelegate=function(d){return b._mouseUp(d)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);c.browser.safari||a.preventDefault();return a.originalEvent.mouseHandled=true}},_mouseMove:function(a){if(c.browser.msie&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&
-this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=a.target==this._mouseDownEvent.target;this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-
-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
-;/*
- * jQuery UI Position 1.8.4
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Position
- */
-(function(c){c.ui=c.ui||{};var m=/left|center|right/,n=/top|center|bottom/,p=c.fn.position,q=c.fn.offset;c.fn.position=function(a){if(!a||!a.of)return p.apply(this,arguments);a=c.extend({},a);var b=c(a.of),d=(a.collision||"flip").split(" "),e=a.offset?a.offset.split(" "):[0,0],g,h,i;if(a.of.nodeType===9){g=b.width();h=b.height();i={top:0,left:0}}else if(a.of.scrollTo&&a.of.document){g=b.width();h=b.height();i={top:b.scrollTop(),left:b.scrollLeft()}}else if(a.of.preventDefault){a.at="left top";g=h=
-0;i={top:a.of.pageY,left:a.of.pageX}}else{g=b.outerWidth();h=b.outerHeight();i=b.offset()}c.each(["my","at"],function(){var f=(a[this]||"").split(" ");if(f.length===1)f=m.test(f[0])?f.concat(["center"]):n.test(f[0])?["center"].concat(f):["center","center"];f[0]=m.test(f[0])?f[0]:"center";f[1]=n.test(f[1])?f[1]:"center";a[this]=f});if(d.length===1)d[1]=d[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(a.at[0]==="right")i.left+=g;else if(a.at[0]==="center")i.left+=
-g/2;if(a.at[1]==="bottom")i.top+=h;else if(a.at[1]==="center")i.top+=h/2;i.left+=e[0];i.top+=e[1];return this.each(function(){var f=c(this),k=f.outerWidth(),l=f.outerHeight(),j=c.extend({},i);if(a.my[0]==="right")j.left-=k;else if(a.my[0]==="center")j.left-=k/2;if(a.my[1]==="bottom")j.top-=l;else if(a.my[1]==="center")j.top-=l/2;j.left=parseInt(j.left);j.top=parseInt(j.top);c.each(["left","top"],function(o,r){c.ui.position[d[o]]&&c.ui.position[d[o]][r](j,{targetWidth:g,targetHeight:h,elemWidth:k,
-elemHeight:l,offset:e,my:a.my,at:a.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(j,{using:a.using}))})};c.ui.position={fit:{left:function(a,b){var d=c(window);b=a.left+b.elemWidth-d.width()-d.scrollLeft();a.left=b>0?a.left-b:Math.max(0,a.left)},top:function(a,b){var d=c(window);b=a.top+b.elemHeight-d.height()-d.scrollTop();a.top=b>0?a.top-b:Math.max(0,a.top)}},flip:{left:function(a,b){if(b.at[0]!=="center"){var d=c(window);d=a.left+b.elemWidth-d.width()-d.scrollLeft();var e=b.my[0]==="left"?
--b.elemWidth:b.my[0]==="right"?b.elemWidth:0,g=-2*b.offset[0];a.left+=a.left<0?e+b.targetWidth+g:d>0?e-b.targetWidth+g:0}},top:function(a,b){if(b.at[1]!=="center"){var d=c(window);d=a.top+b.elemHeight-d.height()-d.scrollTop();var e=b.my[1]==="top"?-b.elemHeight:b.my[1]==="bottom"?b.elemHeight:0,g=b.at[1]==="top"?b.targetHeight:-b.targetHeight,h=-2*b.offset[1];a.top+=a.top<0?e+b.targetHeight+h:d>0?e+g+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(a,b){if(/static/.test(c.curCSS(a,"position")))a.style.position=
-"relative";var d=c(a),e=d.offset(),g=parseInt(c.curCSS(a,"top",true),10)||0,h=parseInt(c.curCSS(a,"left",true),10)||0;e={top:b.top-e.top+g,left:b.left-e.left+h};"using"in b?b.using.call(a,e):d.css(e)};c.fn.offset=function(a){var b=this[0];if(!b||!b.ownerDocument)return null;if(a)return this.each(function(){c.offset.setOffset(this,a)});return q.call(this)}}})(jQuery);
-;/*
- * jQuery UI Draggable 1.8.4
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Draggables
- *
- * Depends:
- * jquery.ui.core.js
- * jquery.ui.mouse.js
- * jquery.ui.widget.js
- */
-(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper==
-"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b=
-this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;return true},_mouseStart:function(a){var b=this.options;this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-
-this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions();
-d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);return true},_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||
-this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if(!this.element[0]||!this.element[0].parentNode)return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element,
-b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==
-a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone():this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||
-0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],
-this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-
-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment==
-"parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&
-a.containment.constructor!=Array){var b=d(a.containment)[0];if(b){a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),
-10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],
-this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():
-f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])e=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+
-this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;e=this.originalPageX+
-Math.round((e-this.originalPageX)/b.grid[0])*b.grid[0];e=this.containment?!(e-this.offset.click.left<this.containment[0]||e-this.offset.click.left>this.containment[2])?e:!(e-this.offset.click.left<this.containment[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left-
-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs=
-this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.4"});d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var g=d.data(this,"sortable");
-if(g&&!g.options.disabled){c.sortables.push({instance:g,shouldRevert:g.options.revert});g._refreshItems();g._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper;
-c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs=c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=
-1;this.instance.currentItem=d(f).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};a.target=this.instance.currentItem[0];this.instance._mouseCapture(a,true);this.instance._mouseStart(a,true,true);this.instance.offset.click.top=c.offset.click.top;this.instance.offset.click.left=c.offset.click.left;this.instance.offset.parent.left-=c.offset.parent.left-this.instance.offset.parent.left;
-this.instance.offset.parent.top-=c.offset.parent.top-this.instance.offset.parent.top;c._trigger("toSortable",a);c.dropped=this.instance.element;c.currentItem=c.element;this.instance.fromOutside=c}this.instance.currentItem&&this.instance._mouseDrag(a)}else if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",a,this.instance._uiHash(this.instance));this.instance._mouseStop(a,true);this.instance.options.helper=
-this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&this.instance.placeholder.remove();c._trigger("fromSortable",a);c.dropped=false}})}});d.ui.plugin.add("draggable","cursor",{start:function(){var a=d("body"),b=d(this).data("draggable").options;if(a.css("cursor"))b._cursor=a.css("cursor");a.css("cursor",b.cursor)},stop:function(){var a=d(this).data("draggable").options;a._cursor&&d("body").css("cursor",a._cursor)}});d.ui.plugin.add("draggable","iframeFix",{start:function(){var a=
-d(this).data("draggable").options;d(a.iframeFix===true?"iframe":a.iframeFix).each(function(){d('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")})},stop:function(){d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;
-if(a.css("opacity"))b._opacity=a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!=document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!=
-"HTML"){if(!c.axis||c.axis!="x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop+c.scrollSpeed;else if(a.pageY-b.overflowOffset.top<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop-c.scrollSpeed;if(!c.axis||c.axis!="y")if(b.overflowOffset.left+b.scrollParent[0].offsetWidth-a.pageX<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft+c.scrollSpeed;else if(a.pageX-
-b.overflowOffset.left<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft-c.scrollSpeed}else{if(!c.axis||c.axis!="x")if(a.pageY-d(document).scrollTop()<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()-c.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()+c.scrollSpeed);if(!c.axis||c.axis!="y")if(a.pageX-d(document).scrollLeft()<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()-
-c.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()+c.scrollSpeed)}f!==false&&d.ui.ddmanager&&!c.dropBehaviour&&d.ui.ddmanager.prepareOffsets(b,a)}});d.ui.plugin.add("draggable","snap",{start:function(){var a=d(this).data("draggable"),b=a.options;a.snapElements=[];d(b.snap.constructor!=String?b.snap.items||":data(draggable)":b.snap).each(function(){var c=d(this),f=c.offset();this!=a.element[0]&&a.snapElements.push({item:this,
-width:c.outerWidth(),height:c.outerHeight(),top:f.top,left:f.left})})},drag:function(a,b){for(var c=d(this).data("draggable"),f=c.options,e=f.snapTolerance,g=b.offset.left,n=g+c.helperProportions.width,m=b.offset.top,o=m+c.helperProportions.height,h=c.snapElements.length-1;h>=0;h--){var i=c.snapElements[h].left,k=i+c.snapElements[h].width,j=c.snapElements[h].top,l=j+c.snapElements[h].height;if(i-e<g&&g<k+e&&j-e<m&&m<l+e||i-e<g&&g<k+e&&j-e<o&&o<l+e||i-e<n&&n<k+e&&j-e<m&&m<l+e||i-e<n&&n<k+e&&j-e<o&&
-o<l+e){if(f.snapMode!="inner"){var p=Math.abs(j-o)<=e,q=Math.abs(l-m)<=e,r=Math.abs(i-n)<=e,s=Math.abs(k-g)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j-c.helperProportions.height,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i-c.helperProportions.width}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k}).left-c.margins.left}var t=
-p||q||r||s;if(f.snapMode!="outer"){p=Math.abs(j-m)<=e;q=Math.abs(l-o)<=e;r=Math.abs(i-g)<=e;s=Math.abs(k-n)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l-c.helperProportions.height,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k-c.helperProportions.width}).left-c.margins.left}if(!c.snapElements[h].snapping&&
-(p||q||r||s||t))c.options.snap.snap&&c.options.snap.snap.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=p||q||r||s||t}else{c.snapElements[h].snapping&&c.options.snap.release&&c.options.snap.release.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=false}}}});d.ui.plugin.add("draggable","stack",{start:function(){var a=d(this).data("draggable").options;a=d.makeArray(d(a.stack)).sort(function(c,f){return(parseInt(d(c).css("zIndex"),
-10)||0)-(parseInt(d(f).css("zIndex"),10)||0)});if(a.length){var b=parseInt(a[0].style.zIndex)||0;d(a).each(function(c){this.style.zIndex=b+c});this[0].style.zIndex=b+a.length}}});d.ui.plugin.add("draggable","zIndex",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("zIndex"))b._zIndex=a.css("zIndex");a.css("zIndex",b.zIndex)},stop:function(a,b){a=d(this).data("draggable").options;a._zIndex&&d(b.helper).css("zIndex",a._zIndex)}})})(jQuery);
-;/*
- * jQuery UI Resizable 1.8.4
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Resizables
- *
- * Depends:
- * jquery.ui.core.js
- * jquery.ui.mouse.js
- * jquery.ui.widget.js
- */
-(function(e){e.widget("ui.resizable",e.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");e.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element,
-_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&e.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(e('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),
-top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=
-this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",
-nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d<c.length;d++){var f=e.trim(c[d]),g=e('<div class="ui-resizable-handle '+("ui-resizable-"+f)+'"></div>');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor==
-String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),k=0;k=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,k);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection();
-this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){e(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};
-if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(),
-d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset=
-this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:
-this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",
-b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height;
-f={width:c.size.width-(f?0:c.sizeDiff.width),height:c.size.height-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",
-b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(d=="nw"){b.top=
-a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidth<b.width,f=l(b.height)&&a.maxHeight&&a.maxHeight<b.height,g=l(b.width)&&a.minWidth&&a.minWidth>b.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,
-k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var d=[c.css("borderTopWidth"),
-c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],f=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=e.map(d,function(g,h){g=parseInt(g,10)||0;h=parseInt(f[h],10)||0;return g+h})}e.browser.msie&&(e(b).is(":hidden")||e(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=this.options;this.elementOffset=
-this.element.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+
-a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,
-arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,
-{version:"1.8.4"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,
-function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n=
-(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition=
-false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left-
-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",
-b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top",
-"Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset,
-f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left=
-a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+
-a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&&
-e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",
-height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=
-d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery);
-;/*
- * jQuery UI Dialog 1.8.4
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Dialog
- *
- * Depends:
- * jquery.ui.core.js
- * jquery.ui.widget.js
- * jquery.ui.button.js
- * jquery.ui.draggable.js
- * jquery.ui.mouse.js
- * jquery.ui.position.js
- * jquery.ui.resizable.js
- */
-(function(c,j){c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:{my:"center",at:"center",of:window,collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&&c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");
-if(typeof this.originalTitle!=="string")this.originalTitle="";var a=this,b=a.options,d=b.title||a.originalTitle||"&#160;",f=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":f}).mousedown(function(i){a.moveToTop(false,
-i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var e=(a.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),h=c('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);
-return false}).appendTo(e);(a.uiDialogTitlebarCloseText=c("<span></span>")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("<span></span>").addClass("ui-dialog-title").attr("id",f).html(d).prependTo(e);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;e.find("*").add(e).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&
-g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");
-b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==b.uiDialog[0])d=Math.max(d,c(this).css("z-index"))});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,f=d.options;if(f.modal&&!a||!f.stack&&!f.modal)return d._trigger("focus",b);if(f.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=
-f.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=1;d.uiDialog.css("z-index",c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;d.next().length&&d.appendTo("body");a._size();a._position(b.position);d.show(b.show);
-a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(f){if(f.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),e=g.filter(":first");g=g.filter(":last");if(f.target===g[0]&&!f.shiftKey){e.focus(1);return false}else if(f.target===e[0]&&f.shiftKey){g.focus(1);return false}}});c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._trigger("open");a._isOpen=true;return a}},_createButtons:function(a){var b=this,d=false,
-f=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("<div></div>").addClass("ui-dialog-buttonset").appendTo(f);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,function(){return!(d=true)});if(d){c.each(a,function(e,h){e=c('<button type="button"></button>').text(e).click(function(){h.apply(b.element[0],arguments)}).appendTo(g);c.fn.button&&e.button()});f.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(e){return{position:e.position,
-offset:e.offset}}var b=this,d=b.options,f=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(e,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",e,a(h))},drag:function(e,h){b._trigger("drag",e,a(h))},stop:function(e,h){d.position=[h.position.left-f.scrollLeft(),h.position.top-f.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);
-b._trigger("dragStop",e,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}a=a===j?this.options.resizable:a;var d=this,f=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:f.maxWidth,maxHeight:f.maxHeight,minWidth:f.minWidth,minHeight:d._minHeight(),
-handles:a,start:function(e,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",e,b(h))},resize:function(e,h){d._trigger("resize",e,b(h))},stop:function(e,h){c(this).removeClass("ui-dialog-resizing");f.height=c(this).height();f.width=c(this).width();d._trigger("resizeStop",e,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,
-a.height)},_position:function(a){var b=[],d=[0,0],f;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(g,e){if(+b[g]===b[g]){d[g]=b[g];b[g]=e}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(f=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(a);
-f||this.uiDialog.hide()},_setOption:function(a,b){var d=this,f=d.uiDialog,g=f.is(":data(resizable)"),e=false;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);e=true;break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":f.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?f.addClass("ui-dialog-disabled"):f.removeClass("ui-dialog-disabled");break;case "draggable":b?
-d._makeDraggable():f.draggable("destroy");break;case "height":e=true;break;case "maxHeight":g&&f.resizable("option","maxHeight",b);e=true;break;case "maxWidth":g&&f.resizable("option","maxWidth",b);e=true;break;case "minHeight":g&&f.resizable("option","minHeight",b);e=true;break;case "minWidth":g&&f.resizable("option","minWidth",b);e=true;break;case "position":d._position(b);break;case "resizable":g&&!b&&f.resizable("destroy");g&&typeof b==="string"&&f.resizable("option","handles",b);!g&&b!==false&&
-d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||"&#160;"));break;case "width":e=true;break}c.Widget.prototype._setOption.apply(d,arguments);e&&d._size()},_size:function(){var a=this.options,b;this.element.css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();this.element.css(a.height==="auto"?{minHeight:Math.max(a.minHeight-b,0),height:"auto"}:{minHeight:0,height:Math.max(a.height-
-b,0)}).show();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.4",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),
-create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){return c(d.target).zIndex()>=c.ui.dialog.overlay.maxZ})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),
-height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){this.oldInstances.push(this.instances.splice(c.inArray(a,this.instances),1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var b=0;c.each(this.instances,function(){b=Math.max(b,this.css("z-index"))});this.maxZ=b},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);
-b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<b?c(window).width()+"px":a+"px"}else return c(document).width()+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances,
-function(){a=a.add(this)});a.css({width:0,height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);
-; \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png
deleted file mode 100644
index 954e22dbd..000000000
--- a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png
+++ /dev/null
Binary files differ
diff --git a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png b/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png
deleted file mode 100644
index 64ece5707..000000000
--- a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png
+++ /dev/null
Binary files differ
diff --git a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_flat_10_000000_40x100.png b/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_flat_10_000000_40x100.png
deleted file mode 100644
index abdc01082..000000000
--- a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_flat_10_000000_40x100.png
+++ /dev/null
Binary files differ
diff --git a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png b/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png
deleted file mode 100644
index 9b383f4d2..000000000
--- a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png
+++ /dev/null
Binary files differ
diff --git a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png b/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png
deleted file mode 100644
index a23baad25..000000000
--- a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png
+++ /dev/null
Binary files differ
diff --git a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png b/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png
deleted file mode 100644
index 42ccba269..000000000
--- a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png
+++ /dev/null
Binary files differ
diff --git a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png b/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png
deleted file mode 100644
index 1b1972b56..000000000
--- a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png
+++ /dev/null
Binary files differ
diff --git a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
deleted file mode 100644
index f1273672d..000000000
--- a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
+++ /dev/null
Binary files differ
diff --git a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png b/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
deleted file mode 100644
index 359397acf..000000000
--- a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
+++ /dev/null
Binary files differ
diff --git a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_222222_256x240.png b/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_222222_256x240.png
deleted file mode 100644
index b273ff111..000000000
--- a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_222222_256x240.png
+++ /dev/null
Binary files differ
diff --git a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_228ef1_256x240.png b/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_228ef1_256x240.png
deleted file mode 100644
index a641a371a..000000000
--- a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_228ef1_256x240.png
+++ /dev/null
Binary files differ
diff --git a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_ef8c08_256x240.png b/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_ef8c08_256x240.png
deleted file mode 100644
index 85e63e9f6..000000000
--- a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_ef8c08_256x240.png
+++ /dev/null
Binary files differ
diff --git a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_ffd27a_256x240.png b/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_ffd27a_256x240.png
deleted file mode 100644
index e117effa3..000000000
--- a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_ffd27a_256x240.png
+++ /dev/null
Binary files differ
diff --git a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_ffffff_256x240.png b/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_ffffff_256x240.png
deleted file mode 100644
index 42f8f992c..000000000
--- a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/images/ui-icons_ffffff_256x240.png
+++ /dev/null
Binary files differ
diff --git a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/jquery-ui-1.8.4.custom.css b/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/jquery-ui-1.8.4.custom.css
deleted file mode 100644
index 39bc7bee9..000000000
--- a/addon/js_upload/file-uploader/tests/jquery-ui/ui-lightness/jquery-ui-1.8.4.custom.css
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * jQuery UI CSS Framework @VERSION
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Theming/API
- */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden { display: none; }
-.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
-.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
-.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
-.ui-helper-clearfix { display: inline-block; }
-/* required comment for clearfix to work in Opera \*/
-* html .ui-helper-clearfix { height:1%; }
-.ui-helper-clearfix { display:block; }
-/* end clearfix */
-.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled { cursor: default !important; }
-
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
-
-
-/*
- * jQuery UI CSS Framework @VERSION
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Theming/API
- *
- * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
- */
-
-
-/* Component containers
-----------------------------------*/
-.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; }
-.ui-widget .ui-widget { font-size: 1em; }
-.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; }
-.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; }
-.ui-widget-content a { color: #333333; }
-.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
-.ui-widget-header a { color: #ffffff; }
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; }
-.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; }
-.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; }
-.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; }
-.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; }
-.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; }
-.ui-widget :active { outline: none; }
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; }
-.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
-.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; }
-.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
-.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
-.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
-.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
-.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
-.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
-.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); }
-.ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); }
-.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
-.ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
-.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); }
-.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); }
-
-/* positioning */
-.ui-icon-carat-1-n { background-position: 0 0; }
-.ui-icon-carat-1-ne { background-position: -16px 0; }
-.ui-icon-carat-1-e { background-position: -32px 0; }
-.ui-icon-carat-1-se { background-position: -48px 0; }
-.ui-icon-carat-1-s { background-position: -64px 0; }
-.ui-icon-carat-1-sw { background-position: -80px 0; }
-.ui-icon-carat-1-w { background-position: -96px 0; }
-.ui-icon-carat-1-nw { background-position: -112px 0; }
-.ui-icon-carat-2-n-s { background-position: -128px 0; }
-.ui-icon-carat-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -64px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -64px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-off { background-position: -96px -144px; }
-.ui-icon-radio-on { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.ui-icon-seek-next { background-position: -32px -160px; }
-.ui-icon-seek-prev { background-position: -48px -160px; }
-.ui-icon-seek-end { background-position: -64px -160px; }
-.ui-icon-seek-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.ui-icon-seek-first { background-position: -80px -160px; }
-.ui-icon-stop { background-position: -96px -160px; }
-.ui-icon-eject { background-position: -112px -160px; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
-.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
-.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
-.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
-.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
-.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
-.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
-.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
-.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
-
-/* Overlays */
-.ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); }
-.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/*
- * jQuery UI Resizable @VERSION
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Resizable#theming
- */
-.ui-resizable { position: relative;}
-.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
-.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
-.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
-.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
-.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
-.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
-.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
-.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
-.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
-.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
- * jQuery UI Dialog @VERSION
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Dialog#theming
- */
-.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
-.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative; }
-.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; }
-.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
-.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
-.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
-.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
-.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
-.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
-.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
-.ui-draggable .ui-dialog-titlebar { cursor: move; }
diff --git a/addon/js_upload/file-uploader/tests/qunit/package.json b/addon/js_upload/file-uploader/tests/qunit/package.json
deleted file mode 100644
index b6044c887..000000000
--- a/addon/js_upload/file-uploader/tests/qunit/package.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "name": "qunit",
- "author": {
- "name": "John Resig",
- "email": "jeresig@gmail.com",
- "url": "http://ejohn.org/"
- },
- "maintainer": {
- "name": "Jörn Zaefferer",
- "email": "joern.zaefferer@googlemail.com",
- "url": "http://bassistance.de/"
- },
- "url": "http://docs.jquery.com/QUnit",
- "license": {
- "name": "MIT",
- "url": "http://www.opensource.org/licenses/mit-license.php"
- },
- "description": "An easy-to-use JavaScript Unit Testing framework.",
- "keywords": [ "testing", "unit", "jquery" ],
- "lib": "qunit"
-}
diff --git a/addon/js_upload/file-uploader/tests/qunit/qunit/qunit.css b/addon/js_upload/file-uploader/tests/qunit/qunit/qunit.css
deleted file mode 100644
index 5714bf4a5..000000000
--- a/addon/js_upload/file-uploader/tests/qunit/qunit/qunit.css
+++ /dev/null
@@ -1,119 +0,0 @@
-
-ol#qunit-tests {
- font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial;
- margin:0;
- padding:0;
- list-style-position:inside;
-
- font-size: smaller;
-}
-ol#qunit-tests li{
- padding:0.4em 0.5em 0.4em 2.5em;
- border-bottom:1px solid #fff;
- font-size:small;
- list-style-position:inside;
-}
-ol#qunit-tests li ol{
- box-shadow: inset 0px 2px 13px #999;
- -moz-box-shadow: inset 0px 2px 13px #999;
- -webkit-box-shadow: inset 0px 2px 13px #999;
- margin-top:0.5em;
- margin-left:0;
- padding:0.5em;
- background-color:#fff;
- border-radius:15px;
- -moz-border-radius: 15px;
- -webkit-border-radius: 15px;
-}
-ol#qunit-tests li li{
- border-bottom:none;
- margin:0.5em;
- background-color:#fff;
- list-style-position: inside;
- padding:0.4em 0.5em 0.4em 0.5em;
-}
-
-ol#qunit-tests li li.pass{
- border-left:26px solid #C6E746;
- background-color:#fff;
- color:#5E740B;
- }
-ol#qunit-tests li li.fail{
- border-left:26px solid #EE5757;
- background-color:#fff;
- color:#710909;
-}
-ol#qunit-tests li.pass{
- background-color:#D2E0E6;
- color:#528CE0;
-}
-ol#qunit-tests li.fail{
- background-color:#EE5757;
- color:#000;
-}
-ol#qunit-tests li strong {
- cursor:pointer;
-}
-h1#qunit-header{
- background-color:#0d3349;
- margin:0;
- padding:0.5em 0 0.5em 1em;
- color:#fff;
- font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial;
- border-top-right-radius:15px;
- border-top-left-radius:15px;
- -moz-border-radius-topright:15px;
- -moz-border-radius-topleft:15px;
- -webkit-border-top-right-radius:15px;
- -webkit-border-top-left-radius:15px;
- text-shadow: rgba(0, 0, 0, 0.5) 4px 4px 1px;
-}
-h2#qunit-banner{
- font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial;
- height:5px;
- margin:0;
- padding:0;
-}
-h2#qunit-banner.qunit-pass{
- background-color:#C6E746;
-}
-h2#qunit-banner.qunit-fail, #qunit-testrunner-toolbar {
- background-color:#EE5757;
-}
-#qunit-testrunner-toolbar {
- font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial;
- padding:0;
- /*width:80%;*/
- padding:0em 0 0.5em 2em;
- font-size: small;
-}
-h2#qunit-userAgent {
- font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial;
- background-color:#2b81af;
- margin:0;
- padding:0;
- color:#fff;
- font-size: small;
- padding:0.5em 0 0.5em 2.5em;
- text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
-}
-p#qunit-testresult{
- font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial;
- margin:0;
- font-size: small;
- color:#2b81af;
- border-bottom-right-radius:15px;
- border-bottom-left-radius:15px;
- -moz-border-radius-bottomright:15px;
- -moz-border-radius-bottomleft:15px;
- -webkit-border-bottom-right-radius:15px;
- -webkit-border-bottom-left-radius:15px;
- background-color:#D2E0E6;
- padding:0.5em 0.5em 0.5em 2.5em;
-}
-strong b.fail{
- color:#710909;
- }
-strong b.pass{
- color:#5E740B;
- }
diff --git a/addon/js_upload/file-uploader/tests/qunit/qunit/qunit.js b/addon/js_upload/file-uploader/tests/qunit/qunit/qunit.js
deleted file mode 100644
index 9ef5f8d6f..000000000
--- a/addon/js_upload/file-uploader/tests/qunit/qunit/qunit.js
+++ /dev/null
@@ -1,1069 +0,0 @@
-/*
- * QUnit - A JavaScript Unit Testing Framework
- *
- * http://docs.jquery.com/QUnit
- *
- * Copyright (c) 2009 John Resig, Jörn Zaefferer
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- */
-
-(function(window) {
-
-var QUnit = {
-
- // Initialize the configuration options
- init: function() {
- config = {
- stats: { all: 0, bad: 0 },
- moduleStats: { all: 0, bad: 0 },
- started: +new Date,
- updateRate: 1000,
- blocking: false,
- autorun: false,
- assertions: [],
- filters: [],
- queue: []
- };
-
- var tests = id("qunit-tests"),
- banner = id("qunit-banner"),
- result = id("qunit-testresult");
-
- if ( tests ) {
- tests.innerHTML = "";
- }
-
- if ( banner ) {
- banner.className = "";
- }
-
- if ( result ) {
- result.parentNode.removeChild( result );
- }
- },
-
- // call on start of module test to prepend name to all tests
- module: function(name, testEnvironment) {
- config.currentModule = name;
-
- synchronize(function() {
- if ( config.currentModule ) {
- QUnit.moduleDone( config.currentModule, config.moduleStats.bad, config.moduleStats.all );
- }
-
- config.currentModule = name;
- config.moduleTestEnvironment = testEnvironment;
- config.moduleStats = { all: 0, bad: 0 };
-
- QUnit.moduleStart( name, testEnvironment );
- });
- },
-
- asyncTest: function(testName, expected, callback) {
- if ( arguments.length === 2 ) {
- callback = expected;
- expected = 0;
- }
-
- QUnit.test(testName, expected, callback, true);
- },
-
- test: function(testName, expected, callback, async) {
- var name = testName, testEnvironment, testEnvironmentArg;
-
- if ( arguments.length === 2 ) {
- callback = expected;
- expected = null;
- }
- // is 2nd argument a testEnvironment?
- if ( expected && typeof expected === 'object') {
- testEnvironmentArg = expected;
- expected = null;
- }
-
- if ( config.currentModule ) {
- name = config.currentModule + " module: " + name;
- }
-
- if ( !validTest(name) ) {
- return;
- }
-
- synchronize(function() {
- QUnit.testStart( testName );
-
- testEnvironment = extend({
- setup: function() {},
- teardown: function() {}
- }, config.moduleTestEnvironment);
- if (testEnvironmentArg) {
- extend(testEnvironment,testEnvironmentArg);
- }
-
- // allow utility functions to access the current test environment
- QUnit.current_testEnvironment = testEnvironment;
-
- config.assertions = [];
- config.expected = expected;
-
- try {
- if ( !config.pollution ) {
- saveGlobal();
- }
-
- testEnvironment.setup.call(testEnvironment);
- } catch(e) {
- QUnit.ok( false, "Setup failed on " + name + ": " + e.message );
- }
-
- if ( async ) {
- QUnit.stop();
- }
-
- try {
- callback.call(testEnvironment);
- } catch(e) {
- fail("Test " + name + " died, exception and test follows", e, callback);
- QUnit.ok( false, "Died on test #" + (config.assertions.length + 1) + ": " + e.message );
- // else next test will carry the responsibility
- saveGlobal();
-
- // Restart the tests if they're blocking
- if ( config.blocking ) {
- start();
- }
- }
- });
-
- synchronize(function() {
- try {
- checkPollution();
- testEnvironment.teardown.call(testEnvironment);
- } catch(e) {
- QUnit.ok( false, "Teardown failed on " + name + ": " + e.message );
- }
-
- try {
- QUnit.reset();
- } catch(e) {
- fail("reset() failed, following Test " + name + ", exception and reset fn follows", e, reset);
- }
-
- if ( config.expected && config.expected != config.assertions.length ) {
- QUnit.ok( false, "Expected " + config.expected + " assertions, but " + config.assertions.length + " were run" );
- }
-
- var good = 0, bad = 0,
- tests = id("qunit-tests");
-
- config.stats.all += config.assertions.length;
- config.moduleStats.all += config.assertions.length;
-
- if ( tests ) {
- var ol = document.createElement("ol");
- ol.style.display = "none";
-
- for ( var i = 0; i < config.assertions.length; i++ ) {
- var assertion = config.assertions[i];
-
- var li = document.createElement("li");
- li.className = assertion.result ? "pass" : "fail";
- li.appendChild(document.createTextNode(assertion.message || "(no message)"));
- ol.appendChild( li );
-
- if ( assertion.result ) {
- good++;
- } else {
- bad++;
- config.stats.bad++;
- config.moduleStats.bad++;
- }
- }
-
- var b = document.createElement("strong");
- b.innerHTML = name + " <b style='color:black;'>(<b class='fail'>" + bad + "</b>, <b class='pass'>" + good + "</b>, " + config.assertions.length + ")</b>";
-
- addEvent(b, "click", function() {
- var next = b.nextSibling, display = next.style.display;
- next.style.display = display === "none" ? "block" : "none";
- });
-
- addEvent(b, "dblclick", function(e) {
- var target = e && e.target ? e.target : window.event.srcElement;
- if ( target.nodeName.toLowerCase() === "strong" ) {
- var text = "", node = target.firstChild;
-
- while ( node.nodeType === 3 ) {
- text += node.nodeValue;
- node = node.nextSibling;
- }
-
- text = text.replace(/(^\s*|\s*$)/g, "");
-
- if ( window.location ) {
- window.location.href = window.location.href.match(/^(.+?)(\?.*)?$/)[1] + "?" + encodeURIComponent(text);
- }
- }
- });
-
- var li = document.createElement("li");
- li.className = bad ? "fail" : "pass";
- li.appendChild( b );
- li.appendChild( ol );
- tests.appendChild( li );
-
- if ( bad ) {
- var toolbar = id("qunit-testrunner-toolbar");
- if ( toolbar ) {
- toolbar.style.display = "block";
- id("qunit-filter-pass").disabled = null;
- id("qunit-filter-missing").disabled = null;
- }
- }
-
- } else {
- for ( var i = 0; i < config.assertions.length; i++ ) {
- if ( !config.assertions[i].result ) {
- bad++;
- config.stats.bad++;
- config.moduleStats.bad++;
- }
- }
- }
-
- QUnit.testDone( testName, bad, config.assertions.length );
-
- if ( !window.setTimeout && !config.queue.length ) {
- done();
- }
- });
-
- if ( window.setTimeout && !config.doneTimer ) {
- config.doneTimer = window.setTimeout(function(){
- if ( !config.queue.length ) {
- done();
- } else {
- synchronize( done );
- }
- }, 13);
- }
- },
-
- /**
- * Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.
- */
- expect: function(asserts) {
- config.expected = asserts;
- },
-
- /**
- * Asserts true.
- * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
- */
- ok: function(a, msg) {
- QUnit.log(a, msg);
-
- config.assertions.push({
- result: !!a,
- message: msg
- });
- },
-
- /**
- * Checks that the first two arguments are equal, with an optional message.
- * Prints out both actual and expected values.
- *
- * Prefered to ok( actual == expected, message )
- *
- * @example equal( format("Received {0} bytes.", 2), "Received 2 bytes." );
- *
- * @param Object actual
- * @param Object expected
- * @param String message (optional)
- */
- equal: function(actual, expected, message) {
- push(expected == actual, actual, expected, message);
- },
-
- notEqual: function(actual, expected, message) {
- push(expected != actual, actual, expected, message);
- },
-
- deepEqual: function(a, b, message) {
- push(QUnit.equiv(a, b), a, b, message);
- },
-
- notDeepEqual: function(a, b, message) {
- push(!QUnit.equiv(a, b), a, b, message);
- },
-
- strictEqual: function(actual, expected, message) {
- push(expected === actual, actual, expected, message);
- },
-
- notStrictEqual: function(actual, expected, message) {
- push(expected !== actual, actual, expected, message);
- },
-
- start: function() {
- // A slight delay, to avoid any current callbacks
- if ( window.setTimeout ) {
- window.setTimeout(function() {
- if ( config.timeout ) {
- clearTimeout(config.timeout);
- }
-
- config.blocking = false;
- process();
- }, 13);
- } else {
- config.blocking = false;
- process();
- }
- },
-
- stop: function(timeout) {
- config.blocking = true;
-
- if ( timeout && window.setTimeout ) {
- config.timeout = window.setTimeout(function() {
- QUnit.ok( false, "Test timed out" );
- QUnit.start();
- }, timeout);
- }
- },
-
- /**
- * Resets the test setup. Useful for tests that modify the DOM.
- */
- reset: function() {
- if ( window.jQuery ) {
- jQuery("#main").html( config.fixture );
- jQuery.event.global = {};
- jQuery.ajaxSettings = extend({}, config.ajaxSettings);
- }
- },
-
- /**
- * Trigger an event on an element.
- *
- * @example triggerEvent( document.body, "click" );
- *
- * @param DOMElement elem
- * @param String type
- */
- triggerEvent: function( elem, type, event ) {
- if ( document.createEvent ) {
- event = document.createEvent("MouseEvents");
- event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
- 0, 0, 0, 0, 0, false, false, false, false, 0, null);
- elem.dispatchEvent( event );
-
- } else if ( elem.fireEvent ) {
- elem.fireEvent("on"+type);
- }
- },
-
- // Safe object type checking
- is: function( type, obj ) {
- return Object.prototype.toString.call( obj ) === "[object "+ type +"]";
- },
-
- // Logging callbacks
- done: function(failures, total) {},
- log: function(result, message) {},
- testStart: function(name) {},
- testDone: function(name, failures, total) {},
- moduleStart: function(name, testEnvironment) {},
- moduleDone: function(name, failures, total) {}
-};
-
-// Backwards compatibility, deprecated
-QUnit.equals = QUnit.equal;
-QUnit.same = QUnit.deepEqual;
-
-// Maintain internal state
-var config = {
- // The queue of tests to run
- queue: [],
-
- // block until document ready
- blocking: true
-};
-
-// Load paramaters
-(function() {
- var location = window.location || { search: "", protocol: "file:" },
- GETParams = location.search.slice(1).split('&');
-
- for ( var i = 0; i < GETParams.length; i++ ) {
- GETParams[i] = decodeURIComponent( GETParams[i] );
- if ( GETParams[i] === "noglobals" ) {
- GETParams.splice( i, 1 );
- i--;
- config.noglobals = true;
- } else if ( GETParams[i].search('=') > -1 ) {
- GETParams.splice( i, 1 );
- i--;
- }
- }
-
- // restrict modules/tests by get parameters
- config.filters = GETParams;
-
- // Figure out if we're running the tests from a server or not
- QUnit.isLocal = !!(location.protocol === 'file:');
-})();
-
-// Expose the API as global variables, unless an 'exports'
-// object exists, in that case we assume we're in CommonJS
-if ( typeof exports === "undefined" || typeof require === "undefined" ) {
- extend(window, QUnit);
- window.QUnit = QUnit;
-} else {
- extend(exports, QUnit);
- exports.QUnit = QUnit;
-}
-
-if ( typeof document === "undefined" || document.readyState === "complete" ) {
- config.autorun = true;
-}
-
-addEvent(window, "load", function() {
- // Initialize the config, saving the execution queue
- var oldconfig = extend({}, config);
- QUnit.init();
- extend(config, oldconfig);
-
- config.blocking = false;
-
- var userAgent = id("qunit-userAgent");
- if ( userAgent ) {
- userAgent.innerHTML = navigator.userAgent;
- }
-
- var toolbar = id("qunit-testrunner-toolbar");
- if ( toolbar ) {
- toolbar.style.display = "none";
-
- var filter = document.createElement("input");
- filter.type = "checkbox";
- filter.id = "qunit-filter-pass";
- filter.disabled = true;
- addEvent( filter, "click", function() {
- var li = document.getElementsByTagName("li");
- for ( var i = 0; i < li.length; i++ ) {
- if ( li[i].className.indexOf("pass") > -1 ) {
- li[i].style.display = filter.checked ? "none" : "";
- }
- }
- });
- toolbar.appendChild( filter );
-
- var label = document.createElement("label");
- label.setAttribute("for", "qunit-filter-pass");
- label.innerHTML = "Hide passed tests";
- toolbar.appendChild( label );
-
- var missing = document.createElement("input");
- missing.type = "checkbox";
- missing.id = "qunit-filter-missing";
- missing.disabled = true;
- addEvent( missing, "click", function() {
- var li = document.getElementsByTagName("li");
- for ( var i = 0; i < li.length; i++ ) {
- if ( li[i].className.indexOf("fail") > -1 && li[i].innerHTML.indexOf('missing test - untested code is broken code') > - 1 ) {
- li[i].parentNode.parentNode.style.display = missing.checked ? "none" : "block";
- }
- }
- });
- toolbar.appendChild( missing );
-
- label = document.createElement("label");
- label.setAttribute("for", "qunit-filter-missing");
- label.innerHTML = "Hide missing tests (untested code is broken code)";
- toolbar.appendChild( label );
- }
-
- var main = id('main');
- if ( main ) {
- config.fixture = main.innerHTML;
- }
-
- if ( window.jQuery ) {
- config.ajaxSettings = window.jQuery.ajaxSettings;
- }
-
- QUnit.start();
-});
-
-function done() {
- if ( config.doneTimer && window.clearTimeout ) {
- window.clearTimeout( config.doneTimer );
- config.doneTimer = null;
- }
-
- if ( config.queue.length ) {
- config.doneTimer = window.setTimeout(function(){
- if ( !config.queue.length ) {
- done();
- } else {
- synchronize( done );
- }
- }, 13);
-
- return;
- }
-
- config.autorun = true;
-
- // Log the last module results
- if ( config.currentModule ) {
- QUnit.moduleDone( config.currentModule, config.moduleStats.bad, config.moduleStats.all );
- }
-
- var banner = id("qunit-banner"),
- tests = id("qunit-tests"),
- html = ['Tests completed in ',
- +new Date - config.started, ' milliseconds.<br/>',
- '<span class="passed">', config.stats.all - config.stats.bad, '</span> tests of <span class="total">', config.stats.all, '</span> passed, <span class="failed">', config.stats.bad,'</span> failed.'].join('');
-
- if ( banner ) {
- banner.className = (config.stats.bad ? "qunit-fail" : "qunit-pass");
- }
-
- if ( tests ) {
- var result = id("qunit-testresult");
-
- if ( !result ) {
- result = document.createElement("p");
- result.id = "qunit-testresult";
- result.className = "result";
- tests.parentNode.insertBefore( result, tests.nextSibling );
- }
-
- result.innerHTML = html;
- }
-
- QUnit.done( config.stats.bad, config.stats.all );
-}
-
-function validTest( name ) {
- var i = config.filters.length,
- run = false;
-
- if ( !i ) {
- return true;
- }
-
- while ( i-- ) {
- var filter = config.filters[i],
- not = filter.charAt(0) == '!';
-
- if ( not ) {
- filter = filter.slice(1);
- }
-
- if ( name.indexOf(filter) !== -1 ) {
- return !not;
- }
-
- if ( not ) {
- run = true;
- }
- }
-
- return run;
-}
-
-function push(result, actual, expected, message) {
- message = message || (result ? "okay" : "failed");
- QUnit.ok( result, result ? message + ": " + QUnit.jsDump.parse(expected) : message + ", expected: " + QUnit.jsDump.parse(expected) + " result: " + QUnit.jsDump.parse(actual) );
-}
-
-function synchronize( callback ) {
- config.queue.push( callback );
-
- if ( config.autorun && !config.blocking ) {
- process();
- }
-}
-
-function process() {
- var start = (new Date()).getTime();
-
- while ( config.queue.length && !config.blocking ) {
- if ( config.updateRate <= 0 || (((new Date()).getTime() - start) < config.updateRate) ) {
- config.queue.shift()();
-
- } else {
- setTimeout( process, 13 );
- break;
- }
- }
-}
-
-function saveGlobal() {
- config.pollution = [];
-
- if ( config.noglobals ) {
- for ( var key in window ) {
- config.pollution.push( key );
- }
- }
-}
-
-function checkPollution( name ) {
- var old = config.pollution;
- saveGlobal();
-
- var newGlobals = diff( old, config.pollution );
- if ( newGlobals.length > 0 ) {
- ok( false, "Introduced global variable(s): " + newGlobals.join(", ") );
- config.expected++;
- }
-
- var deletedGlobals = diff( config.pollution, old );
- if ( deletedGlobals.length > 0 ) {
- ok( false, "Deleted global variable(s): " + deletedGlobals.join(", ") );
- config.expected++;
- }
-}
-
-// returns a new Array with the elements that are in a but not in b
-function diff( a, b ) {
- var result = a.slice();
- for ( var i = 0; i < result.length; i++ ) {
- for ( var j = 0; j < b.length; j++ ) {
- if ( result[i] === b[j] ) {
- result.splice(i, 1);
- i--;
- break;
- }
- }
- }
- return result;
-}
-
-function fail(message, exception, callback) {
- if ( typeof console !== "undefined" && console.error && console.warn ) {
- console.error(message);
- console.error(exception);
- console.warn(callback.toString());
-
- } else if ( window.opera && opera.postError ) {
- opera.postError(message, exception, callback.toString);
- }
-}
-
-function extend(a, b) {
- for ( var prop in b ) {
- a[prop] = b[prop];
- }
-
- return a;
-}
-
-function addEvent(elem, type, fn) {
- if ( elem.addEventListener ) {
- elem.addEventListener( type, fn, false );
- } else if ( elem.attachEvent ) {
- elem.attachEvent( "on" + type, fn );
- } else {
- fn();
- }
-}
-
-function id(name) {
- return !!(typeof document !== "undefined" && document && document.getElementById) &&
- document.getElementById( name );
-}
-
-// Test for equality any JavaScript type.
-// Discussions and reference: http://philrathe.com/articles/equiv
-// Test suites: http://philrathe.com/tests/equiv
-// Author: Philippe Rathé <prathe@gmail.com>
-QUnit.equiv = function () {
-
- var innerEquiv; // the real equiv function
- var callers = []; // stack to decide between skip/abort functions
- var parents = []; // stack to avoiding loops from circular referencing
-
-
- // Determine what is o.
- function hoozit(o) {
- if (QUnit.is("String", o)) {
- return "string";
-
- } else if (QUnit.is("Boolean", o)) {
- return "boolean";
-
- } else if (QUnit.is("Number", o)) {
-
- if (isNaN(o)) {
- return "nan";
- } else {
- return "number";
- }
-
- } else if (typeof o === "undefined") {
- return "undefined";
-
- // consider: typeof null === object
- } else if (o === null) {
- return "null";
-
- // consider: typeof [] === object
- } else if (QUnit.is( "Array", o)) {
- return "array";
-
- // consider: typeof new Date() === object
- } else if (QUnit.is( "Date", o)) {
- return "date";
-
- // consider: /./ instanceof Object;
- // /./ instanceof RegExp;
- // typeof /./ === "function"; // => false in IE and Opera,
- // true in FF and Safari
- } else if (QUnit.is( "RegExp", o)) {
- return "regexp";
-
- } else if (typeof o === "object") {
- return "object";
-
- } else if (QUnit.is( "Function", o)) {
- return "function";
- } else {
- return undefined;
- }
- }
-
- // Call the o related callback with the given arguments.
- function bindCallbacks(o, callbacks, args) {
- var prop = hoozit(o);
- if (prop) {
- if (hoozit(callbacks[prop]) === "function") {
- return callbacks[prop].apply(callbacks, args);
- } else {
- return callbacks[prop]; // or undefined
- }
- }
- }
-
- var callbacks = function () {
-
- // for string, boolean, number and null
- function useStrictEquality(b, a) {
- if (b instanceof a.constructor || a instanceof b.constructor) {
- // to catch short annotaion VS 'new' annotation of a declaration
- // e.g. var i = 1;
- // var j = new Number(1);
- return a == b;
- } else {
- return a === b;
- }
- }
-
- return {
- "string": useStrictEquality,
- "boolean": useStrictEquality,
- "number": useStrictEquality,
- "null": useStrictEquality,
- "undefined": useStrictEquality,
-
- "nan": function (b) {
- return isNaN(b);
- },
-
- "date": function (b, a) {
- return hoozit(b) === "date" && a.valueOf() === b.valueOf();
- },
-
- "regexp": function (b, a) {
- return hoozit(b) === "regexp" &&
- a.source === b.source && // the regex itself
- a.global === b.global && // and its modifers (gmi) ...
- a.ignoreCase === b.ignoreCase &&
- a.multiline === b.multiline;
- },
-
- // - skip when the property is a method of an instance (OOP)
- // - abort otherwise,
- // initial === would have catch identical references anyway
- "function": function () {
- var caller = callers[callers.length - 1];
- return caller !== Object &&
- typeof caller !== "undefined";
- },
-
- "array": function (b, a) {
- var i, j, loop;
- var len;
-
- // b could be an object literal here
- if ( ! (hoozit(b) === "array")) {
- return false;
- }
-
- len = a.length;
- if (len !== b.length) { // safe and faster
- return false;
- }
-
- //track reference to avoid circular references
- parents.push(a);
- for (i = 0; i < len; i++) {
- loop = false;
- for(j=0;j<parents.length;j++){
- if(parents[j] === a[i]){
- loop = true;//dont rewalk array
- }
- }
- if (!loop && ! innerEquiv(a[i], b[i])) {
- parents.pop();
- return false;
- }
- }
- parents.pop();
- return true;
- },
-
- "object": function (b, a) {
- var i, j, loop;
- var eq = true; // unless we can proove it
- var aProperties = [], bProperties = []; // collection of strings
-
- // comparing constructors is more strict than using instanceof
- if ( a.constructor !== b.constructor) {
- return false;
- }
-
- // stack constructor before traversing properties
- callers.push(a.constructor);
- //track reference to avoid circular references
- parents.push(a);
-
- for (i in a) { // be strict: don't ensures hasOwnProperty and go deep
- loop = false;
- for(j=0;j<parents.length;j++){
- if(parents[j] === a[i])
- loop = true; //don't go down the same path twice
- }
- aProperties.push(i); // collect a's properties
-
- if (!loop && ! innerEquiv(a[i], b[i])) {
- eq = false;
- break;
- }
- }
-
- callers.pop(); // unstack, we are done
- parents.pop();
-
- for (i in b) {
- bProperties.push(i); // collect b's properties
- }
-
- // Ensures identical properties name
- return eq && innerEquiv(aProperties.sort(), bProperties.sort());
- }
- };
- }();
-
- innerEquiv = function () { // can take multiple arguments
- var args = Array.prototype.slice.apply(arguments);
- if (args.length < 2) {
- return true; // end transition
- }
-
- return (function (a, b) {
- if (a === b) {
- return true; // catch the most you can
- } else if (a === null || b === null || typeof a === "undefined" || typeof b === "undefined" || hoozit(a) !== hoozit(b)) {
- return false; // don't lose time with error prone cases
- } else {
- return bindCallbacks(a, callbacks, [b, a]);
- }
-
- // apply transition with (1..n) arguments
- })(args[0], args[1]) && arguments.callee.apply(this, args.splice(1, args.length -1));
- };
-
- return innerEquiv;
-
-}();
-
-/**
- * jsDump
- * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
- * Licensed under BSD (http://www.opensource.org/licenses/bsd-license.php)
- * Date: 5/15/2008
- * @projectDescription Advanced and extensible data dumping for Javascript.
- * @version 1.0.0
- * @author Ariel Flesler
- * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}
- */
-QUnit.jsDump = (function() {
- function quote( str ) {
- return '"' + str.toString().replace(/"/g, '\\"') + '"';
- };
- function literal( o ) {
- return o + '';
- };
- function join( pre, arr, post ) {
- var s = jsDump.separator(),
- base = jsDump.indent(),
- inner = jsDump.indent(1);
- if ( arr.join )
- arr = arr.join( ',' + s + inner );
- if ( !arr )
- return pre + post;
- return [ pre, inner + arr, base + post ].join(s);
- };
- function array( arr ) {
- var i = arr.length, ret = Array(i);
- this.up();
- while ( i-- )
- ret[i] = this.parse( arr[i] );
- this.down();
- return join( '[', ret, ']' );
- };
-
- var reName = /^function (\w+)/;
-
- var jsDump = {
- parse:function( obj, type ) { //type is used mostly internally, you can fix a (custom)type in advance
- var parser = this.parsers[ type || this.typeOf(obj) ];
- type = typeof parser;
-
- return type == 'function' ? parser.call( this, obj ) :
- type == 'string' ? parser :
- this.parsers.error;
- },
- typeOf:function( obj ) {
- var type;
- if ( obj === null ) {
- type = "null";
- } else if (typeof obj === "undefined") {
- type = "undefined";
- } else if (QUnit.is("RegExp", obj)) {
- type = "regexp";
- } else if (QUnit.is("Date", obj)) {
- type = "date";
- } else if (QUnit.is("Function", obj)) {
- type = "function";
- } else if (obj.setInterval && obj.document && !obj.nodeType) {
- type = "window";
- } else if (obj.nodeType === 9) {
- type = "document";
- } else if (obj.nodeType) {
- type = "node";
- } else if (typeof obj === "object" && typeof obj.length === "number" && obj.length >= 0) {
- type = "array";
- } else {
- type = typeof obj;
- }
- return type;
- },
- separator:function() {
- return this.multiline ? this.HTML ? '<br />' : '\n' : this.HTML ? '&nbsp;' : ' ';
- },
- indent:function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing
- if ( !this.multiline )
- return '';
- var chr = this.indentChar;
- if ( this.HTML )
- chr = chr.replace(/\t/g,' ').replace(/ /g,'&nbsp;');
- return Array( this._depth_ + (extra||0) ).join(chr);
- },
- up:function( a ) {
- this._depth_ += a || 1;
- },
- down:function( a ) {
- this._depth_ -= a || 1;
- },
- setParser:function( name, parser ) {
- this.parsers[name] = parser;
- },
- // The next 3 are exposed so you can use them
- quote:quote,
- literal:literal,
- join:join,
- //
- _depth_: 1,
- // This is the list of parsers, to modify them, use jsDump.setParser
- parsers:{
- window: '[Window]',
- document: '[Document]',
- error:'[ERROR]', //when no parser is found, shouldn't happen
- unknown: '[Unknown]',
- 'null':'null',
- undefined:'undefined',
- 'function':function( fn ) {
- var ret = 'function',
- name = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE
- if ( name )
- ret += ' ' + name;
- ret += '(';
-
- ret = [ ret, this.parse( fn, 'functionArgs' ), '){'].join('');
- return join( ret, this.parse(fn,'functionCode'), '}' );
- },
- array: array,
- nodelist: array,
- arguments: array,
- object:function( map ) {
- var ret = [ ];
- this.up();
- for ( var key in map )
- ret.push( this.parse(key,'key') + ': ' + this.parse(map[key]) );
- this.down();
- return join( '{', ret, '}' );
- },
- node:function( node ) {
- var open = this.HTML ? '&lt;' : '<',
- close = this.HTML ? '&gt;' : '>';
-
- var tag = node.nodeName.toLowerCase(),
- ret = open + tag;
-
- for ( var a in this.DOMAttrs ) {
- var val = node[this.DOMAttrs[a]];
- if ( val )
- ret += ' ' + a + '=' + this.parse( val, 'attribute' );
- }
- return ret + close + open + '/' + tag + close;
- },
- functionArgs:function( fn ) {//function calls it internally, it's the arguments part of the function
- var l = fn.length;
- if ( !l ) return '';
-
- var args = Array(l);
- while ( l-- )
- args[l] = String.fromCharCode(97+l);//97 is 'a'
- return ' ' + args.join(', ') + ' ';
- },
- key:quote, //object calls it internally, the key part of an item in a map
- functionCode:'[code]', //function calls it internally, it's the content of the function
- attribute:quote, //node calls it internally, it's an html attribute value
- string:quote,
- date:quote,
- regexp:literal, //regex
- number:literal,
- 'boolean':literal
- },
- DOMAttrs:{//attributes to dump from nodes, name=>realName
- id:'id',
- name:'name',
- 'class':'className'
- },
- HTML:false,//if true, entities are escaped ( <, >, \t, space and \n )
- indentChar:' ',//indentation unit
- multiline:false //if true, items in a collection, are separated by a \n, else just a space.
- };
-
- return jsDump;
-})();
-
-})(this);
diff --git a/addon/js_upload/file-uploader/tests/qunit/test/index.html b/addon/js_upload/file-uploader/tests/qunit/test/index.html
deleted file mode 100644
index 8a9f86500..000000000
--- a/addon/js_upload/file-uploader/tests/qunit/test/index.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>QUnit Test Suite</title>
- <link rel="stylesheet" href="../qunit/qunit.css" type="text/css" media="screen">
- <script type="text/javascript" src="../qunit/qunit.js"></script>
- <script type="text/javascript" src="test.js"></script>
- <script type="text/javascript" src="same.js"></script>
-</head>
-<body>
- <h1 id="qunit-header">QUnit Test Suite</h1>
- <h2 id="qunit-banner"></h2>
- <div id="qunit-testrunner-toolbar"></div>
- <h2 id="qunit-userAgent"></h2>
- <ol id="qunit-tests"></ol>
-</body>
-</html>
diff --git a/addon/js_upload/file-uploader/tests/qunit/test/same.js b/addon/js_upload/file-uploader/tests/qunit/test/same.js
deleted file mode 100644
index 8f1b5630f..000000000
--- a/addon/js_upload/file-uploader/tests/qunit/test/same.js
+++ /dev/null
@@ -1,1423 +0,0 @@
-module("equiv");
-
-
-test("Primitive types and constants", function () {
- equals(QUnit.equiv(null, null), true, "null");
- equals(QUnit.equiv(null, {}), false, "null");
- equals(QUnit.equiv(null, undefined), false, "null");
- equals(QUnit.equiv(null, 0), false, "null");
- equals(QUnit.equiv(null, false), false, "null");
- equals(QUnit.equiv(null, ''), false, "null");
- equals(QUnit.equiv(null, []), false, "null");
-
- equals(QUnit.equiv(undefined, undefined), true, "undefined");
- equals(QUnit.equiv(undefined, null), false, "undefined");
- equals(QUnit.equiv(undefined, 0), false, "undefined");
- equals(QUnit.equiv(undefined, false), false, "undefined");
- equals(QUnit.equiv(undefined, {}), false, "undefined");
- equals(QUnit.equiv(undefined, []), false, "undefined");
- equals(QUnit.equiv(undefined, ""), false, "undefined");
-
- // Nan usually doest not equal to Nan using the '==' operator.
- // Only isNaN() is able to do it.
- equals(QUnit.equiv(0/0, 0/0), true, "NaN"); // NaN VS NaN
- equals(QUnit.equiv(1/0, 2/0), true, "Infinity"); // Infinity VS Infinity
- equals(QUnit.equiv(-1/0, 2/0), false, "-Infinity, Infinity"); // -Infinity VS Infinity
- equals(QUnit.equiv(-1/0, -2/0), true, "-Infinity, -Infinity"); // -Infinity VS -Infinity
- equals(QUnit.equiv(0/0, 1/0), false, "NaN, Infinity"); // Nan VS Infinity
- equals(QUnit.equiv(1/0, 0/0), false, "NaN, Infinity"); // Nan VS Infinity
- equals(QUnit.equiv(0/0, null), false, "NaN");
- equals(QUnit.equiv(0/0, undefined), false, "NaN");
- equals(QUnit.equiv(0/0, 0), false, "NaN");
- equals(QUnit.equiv(0/0, false), false, "NaN");
- equals(QUnit.equiv(0/0, function () {}), false, "NaN");
- equals(QUnit.equiv(1/0, null), false, "NaN, Infinity");
- equals(QUnit.equiv(1/0, undefined), false, "NaN, Infinity");
- equals(QUnit.equiv(1/0, 0), false, "NaN, Infinity");
- equals(QUnit.equiv(1/0, 1), false, "NaN, Infinity");
- equals(QUnit.equiv(1/0, false), false, "NaN, Infinity");
- equals(QUnit.equiv(1/0, true), false, "NaN, Infinity");
- equals(QUnit.equiv(1/0, function () {}), false, "NaN, Infinity");
-
- equals(QUnit.equiv(0, 0), true, "number");
- equals(QUnit.equiv(0, 1), false, "number");
- equals(QUnit.equiv(1, 0), false, "number");
- equals(QUnit.equiv(1, 1), true, "number");
- equals(QUnit.equiv(1.1, 1.1), true, "number");
- equals(QUnit.equiv(0.0000005, 0.0000005), true, "number");
- equals(QUnit.equiv(0, ''), false, "number");
- equals(QUnit.equiv(0, '0'), false, "number");
- equals(QUnit.equiv(1, '1'), false, "number");
- equals(QUnit.equiv(0, false), false, "number");
- equals(QUnit.equiv(1, true), false, "number");
-
- equals(QUnit.equiv(true, true), true, "boolean");
- equals(QUnit.equiv(true, false), false, "boolean");
- equals(QUnit.equiv(false, true), false, "boolean");
- equals(QUnit.equiv(false, 0), false, "boolean");
- equals(QUnit.equiv(false, null), false, "boolean");
- equals(QUnit.equiv(false, undefined), false, "boolean");
- equals(QUnit.equiv(true, 1), false, "boolean");
- equals(QUnit.equiv(true, null), false, "boolean");
- equals(QUnit.equiv(true, undefined), false, "boolean");
-
- equals(QUnit.equiv('', ''), true, "string");
- equals(QUnit.equiv('a', 'a'), true, "string");
- equals(QUnit.equiv("foobar", "foobar"), true, "string");
- equals(QUnit.equiv("foobar", "foo"), false, "string");
- equals(QUnit.equiv('', 0), false, "string");
- equals(QUnit.equiv('', false), false, "string");
- equals(QUnit.equiv('', null), false, "string");
- equals(QUnit.equiv('', undefined), false, "string");
-
- // Short annotation VS new annotation
- equals(QUnit.equiv(0, new Number()), true, "short annotation VS new annotation");
- equals(QUnit.equiv(new Number(), 0), true, "short annotation VS new annotation");
- equals(QUnit.equiv(1, new Number(1)), true, "short annotation VS new annotation");
- equals(QUnit.equiv(new Number(1), 1), true, "short annotation VS new annotation");
- equals(QUnit.equiv(new Number(0), 1), false, "short annotation VS new annotation");
- equals(QUnit.equiv(0, new Number(1)), false, "short annotation VS new annotation");
-
- equals(QUnit.equiv(new String(), ""), true, "short annotation VS new annotation");
- equals(QUnit.equiv("", new String()), true, "short annotation VS new annotation");
- equals(QUnit.equiv(new String("My String"), "My String"), true, "short annotation VS new annotation");
- equals(QUnit.equiv("My String", new String("My String")), true, "short annotation VS new annotation");
- equals(QUnit.equiv("Bad String", new String("My String")), false, "short annotation VS new annotation");
- equals(QUnit.equiv(new String("Bad String"), "My String"), false, "short annotation VS new annotation");
-
- equals(QUnit.equiv(false, new Boolean()), true, "short annotation VS new annotation");
- equals(QUnit.equiv(new Boolean(), false), true, "short annotation VS new annotation");
- equals(QUnit.equiv(true, new Boolean(true)), true, "short annotation VS new annotation");
- equals(QUnit.equiv(new Boolean(true), true), true, "short annotation VS new annotation");
- equals(QUnit.equiv(true, new Boolean(1)), true, "short annotation VS new annotation");
- equals(QUnit.equiv(false, new Boolean(false)), true, "short annotation VS new annotation");
- equals(QUnit.equiv(new Boolean(false), false), true, "short annotation VS new annotation");
- equals(QUnit.equiv(false, new Boolean(0)), true, "short annotation VS new annotation");
- equals(QUnit.equiv(true, new Boolean(false)), false, "short annotation VS new annotation");
- equals(QUnit.equiv(new Boolean(false), true), false, "short annotation VS new annotation");
-
- equals(QUnit.equiv(new Object(), {}), true, "short annotation VS new annotation");
- equals(QUnit.equiv({}, new Object()), true, "short annotation VS new annotation");
- equals(QUnit.equiv(new Object(), {a:1}), false, "short annotation VS new annotation");
- equals(QUnit.equiv({a:1}, new Object()), false, "short annotation VS new annotation");
- equals(QUnit.equiv({a:undefined}, new Object()), false, "short annotation VS new annotation");
- equals(QUnit.equiv(new Object(), {a:undefined}), false, "short annotation VS new annotation");
-});
-
-test("Objects Basics.", function() {
- equals(QUnit.equiv({}, {}), true);
- equals(QUnit.equiv({}, null), false);
- equals(QUnit.equiv({}, undefined), false);
- equals(QUnit.equiv({}, 0), false);
- equals(QUnit.equiv({}, false), false);
-
- // This test is a hard one, it is very important
- // REASONS:
- // 1) They are of the same type "object"
- // 2) [] instanceof Object is true
- // 3) Their properties are the same (doesn't exists)
- equals(QUnit.equiv({}, []), false);
-
- equals(QUnit.equiv({a:1}, {a:1}), true);
- equals(QUnit.equiv({a:1}, {a:"1"}), false);
- equals(QUnit.equiv({a:[]}, {a:[]}), true);
- equals(QUnit.equiv({a:{}}, {a:null}), false);
- equals(QUnit.equiv({a:1}, {}), false);
- equals(QUnit.equiv({}, {a:1}), false);
-
- // Hard ones
- equals(QUnit.equiv({a:undefined}, {}), false);
- equals(QUnit.equiv({}, {a:undefined}), false);
- equals(QUnit.equiv(
- {
- a: [{ bar: undefined }]
- },
- {
- a: [{ bat: undefined }]
- }
- ), false);
-});
-
-
-test("Arrays Basics.", function() {
-
- equals(QUnit.equiv([], []), true);
-
- // May be a hard one, can invoke a crash at execution.
- // because their types are both "object" but null isn't
- // like a true object, it doesn't have any property at all.
- equals(QUnit.equiv([], null), false);
-
- equals(QUnit.equiv([], undefined), false);
- equals(QUnit.equiv([], false), false);
- equals(QUnit.equiv([], 0), false);
- equals(QUnit.equiv([], ""), false);
-
- // May be a hard one, but less hard
- // than {} with [] (note the order)
- equals(QUnit.equiv([], {}), false);
-
- equals(QUnit.equiv([null],[]), false);
- equals(QUnit.equiv([undefined],[]), false);
- equals(QUnit.equiv([],[null]), false);
- equals(QUnit.equiv([],[undefined]), false);
- equals(QUnit.equiv([null],[undefined]), false);
- equals(QUnit.equiv([[]],[[]]), true);
- equals(QUnit.equiv([[],[],[]],[[],[],[]]), true);
- equals(QUnit.equiv(
- [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]],
- [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]),
- true);
- equals(QUnit.equiv(
- [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]],
- [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]), // shorter
- false);
- equals(QUnit.equiv(
- [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[{}]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]],
- [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]), // deepest element not an array
- false);
-
- // same multidimensional
- equals(QUnit.equiv(
- [1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,[
- [6,7,8,9, [
- [
- 1,2,3,4,[
- 2,3,4,[
- 1,2,[
- 1,2,3,4,[
- 1,2,3,4,5,6,7,8,9,[
- 0
- ],1,2,3,4,5,6,7,8,9
- ],5,6,7,8,9
- ],4,5,6,7,8,9
- ],5,6,7,8,9
- ],5,6,7
- ]
- ]
- ]
- ]
- ]]],
- [1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,[
- [6,7,8,9, [
- [
- 1,2,3,4,[
- 2,3,4,[
- 1,2,[
- 1,2,3,4,[
- 1,2,3,4,5,6,7,8,9,[
- 0
- ],1,2,3,4,5,6,7,8,9
- ],5,6,7,8,9
- ],4,5,6,7,8,9
- ],5,6,7,8,9
- ],5,6,7
- ]
- ]
- ]
- ]
- ]]]),
- true, "Multidimensional");
-
- // different multidimensional
- equals(QUnit.equiv(
- [1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,[
- [6,7,8,9, [
- [
- 1,2,3,4,[
- 2,3,4,[
- 1,2,[
- 1,2,3,4,[
- 1,2,3,4,5,6,7,8,9,[
- 0
- ],1,2,3,4,5,6,7,8,9
- ],5,6,7,8,9
- ],4,5,6,7,8,9
- ],5,6,7,8,9
- ],5,6,7
- ]
- ]
- ]
- ]
- ]]],
- [1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,[
- [6,7,8,9, [
- [
- 1,2,3,4,[
- 2,3,4,[
- 1,2,[
- '1',2,3,4,[ // string instead of number
- 1,2,3,4,5,6,7,8,9,[
- 0
- ],1,2,3,4,5,6,7,8,9
- ],5,6,7,8,9
- ],4,5,6,7,8,9
- ],5,6,7,8,9
- ],5,6,7
- ]
- ]
- ]
- ]
- ]]]),
- false, "Multidimensional");
-
- // different multidimensional
- equals(QUnit.equiv(
- [1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,[
- [6,7,8,9, [
- [
- 1,2,3,4,[
- 2,3,4,[
- 1,2,[
- 1,2,3,4,[
- 1,2,3,4,5,6,7,8,9,[
- 0
- ],1,2,3,4,5,6,7,8,9
- ],5,6,7,8,9
- ],4,5,6,7,8,9
- ],5,6,7,8,9
- ],5,6,7
- ]
- ]
- ]
- ]
- ]]],
- [1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,6,7,8,9, [
- 1,2,3,4,5,[
- [6,7,8,9, [
- [
- 1,2,3,4,[
- 2,3,[ // missing an element (4)
- 1,2,[
- 1,2,3,4,[
- 1,2,3,4,5,6,7,8,9,[
- 0
- ],1,2,3,4,5,6,7,8,9
- ],5,6,7,8,9
- ],4,5,6,7,8,9
- ],5,6,7,8,9
- ],5,6,7
- ]
- ]
- ]
- ]
- ]]]),
- false, "Multidimensional");
-});
-
-test("Functions.", function() {
- var f0 = function () {};
- var f1 = function () {};
-
- // f2 and f3 have the same code, formatted differently
- var f2 = function () {var i = 0;};
- var f3 = function () {
- var i = 0 // this comment and no semicoma as difference
- };
-
- equals(QUnit.equiv(function() {}, function() {}), false, "Anonymous functions"); // exact source code
- equals(QUnit.equiv(function() {}, function() {return true;}), false, "Anonymous functions");
-
- equals(QUnit.equiv(f0, f0), true, "Function references"); // same references
- equals(QUnit.equiv(f0, f1), false, "Function references"); // exact source code, different references
- equals(QUnit.equiv(f2, f3), false, "Function references"); // equivalent source code, different references
- equals(QUnit.equiv(f1, f2), false, "Function references"); // different source code, different references
- equals(QUnit.equiv(function() {}, true), false);
- equals(QUnit.equiv(function() {}, undefined), false);
- equals(QUnit.equiv(function() {}, null), false);
- equals(QUnit.equiv(function() {}, {}), false);
-});
-
-
-test("Date instances.", function() {
- // Date, we don't need to test Date.parse() because it returns a number.
- // Only test the Date instances by setting them a fix date.
- // The date use is midnight January 1, 1970
-
- var d1 = new Date();
- d1.setTime(0); // fix the date
-
- var d2 = new Date();
- d2.setTime(0); // fix the date
-
- var d3 = new Date(); // The very now
-
- // Anyway their types differs, just in case the code fails in the order in which it deals with date
- equals(QUnit.equiv(d1, 0), false); // d1.valueOf() returns 0, but d1 and 0 are different
- // test same values date and different instances equality
- equals(QUnit.equiv(d1, d2), true);
- // test different date and different instances difference
- equals(QUnit.equiv(d1, d3), false);
-});
-
-
-test("RegExp.", function() {
- // Must test cases that imply those traps:
- // var a = /./;
- // a instanceof Object; // Oops
- // a instanceof RegExp; // Oops
- // typeof a === "function"; // Oops, false in IE and Opera, true in FF and Safari ("object")
-
- // Tests same regex with same modifiers in different order
- var r = /foo/;
- var r5 = /foo/gim;
- var r6 = /foo/gmi;
- var r7 = /foo/igm;
- var r8 = /foo/img;
- var r9 = /foo/mig;
- var r10 = /foo/mgi;
- var ri1 = /foo/i;
- var ri2 = /foo/i;
- var rm1 = /foo/m;
- var rm2 = /foo/m;
- var rg1 = /foo/g;
- var rg2 = /foo/g;
-
- equals(QUnit.equiv(r5, r6), true, "Modifier order");
- equals(QUnit.equiv(r5, r7), true, "Modifier order");
- equals(QUnit.equiv(r5, r8), true, "Modifier order");
- equals(QUnit.equiv(r5, r9), true, "Modifier order");
- equals(QUnit.equiv(r5, r10), true, "Modifier order");
- equals(QUnit.equiv(r, r5), false, "Modifier");
-
- equals(QUnit.equiv(ri1, ri2), true, "Modifier");
- equals(QUnit.equiv(r, ri1), false, "Modifier");
- equals(QUnit.equiv(ri1, rm1), false, "Modifier");
- equals(QUnit.equiv(r, rm1), false, "Modifier");
- equals(QUnit.equiv(rm1, ri1), false, "Modifier");
- equals(QUnit.equiv(rm1, rm2), true, "Modifier");
- equals(QUnit.equiv(rg1, rm1), false, "Modifier");
- equals(QUnit.equiv(rm1, rg1), false, "Modifier");
- equals(QUnit.equiv(rg1, rg2), true, "Modifier");
-
- // Different regex, same modifiers
- var r11 = /[a-z]/gi;
- var r13 = /[0-9]/gi; // oops! different
- equals(QUnit.equiv(r11, r13), false, "Regex pattern");
-
- var r14 = /0/ig;
- var r15 = /"0"/ig; // oops! different
- equals(QUnit.equiv(r14, r15), false, "Regex pattern");
-
- var r1 = /[\n\r\u2028\u2029]/g;
- var r2 = /[\n\r\u2028\u2029]/g;
- var r3 = /[\n\r\u2028\u2028]/g; // differs from r1
- var r4 = /[\n\r\u2028\u2029]/; // differs from r1
-
- equals(QUnit.equiv(r1, r2), true, "Regex pattern");
- equals(QUnit.equiv(r1, r3), false, "Regex pattern");
- equals(QUnit.equiv(r1, r4), false, "Regex pattern");
-
- // More complex regex
- var regex1 = "^[-_.a-z0-9]+@([-_a-z0-9]+\\.)+([A-Za-z][A-Za-z]|[A-Za-z][A-Za-z][A-Za-z])|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$";
- var regex2 = "^[-_.a-z0-9]+@([-_a-z0-9]+\\.)+([A-Za-z][A-Za-z]|[A-Za-z][A-Za-z][A-Za-z])|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$";
- // regex 3 is different: '.' not escaped
- var regex3 = "^[-_.a-z0-9]+@([-_a-z0-9]+.)+([A-Za-z][A-Za-z]|[A-Za-z][A-Za-z][A-Za-z])|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$";
-
- var r21 = new RegExp(regex1);
- var r22 = new RegExp(regex2);
- var r23 = new RegExp(regex3); // diff from r21, not same pattern
- var r23a = new RegExp(regex3, "gi"); // diff from r23, not same modifier
- var r24a = new RegExp(regex3, "ig"); // same as r23a
-
- equals(QUnit.equiv(r21, r22), true, "Complex Regex");
- equals(QUnit.equiv(r21, r23), false, "Complex Regex");
- equals(QUnit.equiv(r23, r23a), false, "Complex Regex");
- equals(QUnit.equiv(r23a, r24a), true, "Complex Regex");
-
- // typeof r1 is "function" in some browsers and "object" in others so we must cover this test
- var re = / /;
- equals(QUnit.equiv(re, function () {}), false, "Regex internal");
- equals(QUnit.equiv(re, {}), false, "Regex internal");
-});
-
-
-test("Complex Objects.", function() {
-
- function fn1() {
- return "fn1";
- }
- function fn2() {
- return "fn2";
- }
-
- // Try to invert the order of some properties to make sure it is covered.
- // It can failed when properties are compared between unsorted arrays.
- equals(QUnit.equiv(
- {
- a: 1,
- b: null,
- c: [{}],
- d: {
- a: 3.14159,
- b: false,
- c: {
- e: fn1,
- f: [[[]]],
- g: {
- j: {
- k: {
- n: {
- r: "r",
- s: [1,2,3],
- t: undefined,
- u: 0,
- v: {
- w: {
- x: {
- y: "Yahoo!",
- z: null
- }
- }
- }
- },
- q: [],
- p: 1/0,
- o: 99
- },
- l: undefined,
- m: null
- }
- },
- d: 0,
- i: true,
- h: "false"
- }
- },
- e: undefined,
- g: "",
- h: "h",
- f: {},
- i: []
- },
- {
- a: 1,
- b: null,
- c: [{}],
- d: {
- b: false,
- a: 3.14159,
- c: {
- d: 0,
- e: fn1,
- f: [[[]]],
- g: {
- j: {
- k: {
- n: {
- r: "r",
- t: undefined,
- u: 0,
- s: [1,2,3],
- v: {
- w: {
- x: {
- z: null,
- y: "Yahoo!"
- }
- }
- }
- },
- o: 99,
- p: 1/0,
- q: []
- },
- l: undefined,
- m: null
- }
- },
- i: true,
- h: "false"
- }
- },
- e: undefined,
- g: "",
- f: {},
- h: "h",
- i: []
- }
- ), true);
-
- equals(QUnit.equiv(
- {
- a: 1,
- b: null,
- c: [{}],
- d: {
- a: 3.14159,
- b: false,
- c: {
- d: 0,
- e: fn1,
- f: [[[]]],
- g: {
- j: {
- k: {
- n: {
- //r: "r", // different: missing a property
- s: [1,2,3],
- t: undefined,
- u: 0,
- v: {
- w: {
- x: {
- y: "Yahoo!",
- z: null
- }
- }
- }
- },
- o: 99,
- p: 1/0,
- q: []
- },
- l: undefined,
- m: null
- }
- },
- h: "false",
- i: true
- }
- },
- e: undefined,
- f: {},
- g: "",
- h: "h",
- i: []
- },
- {
- a: 1,
- b: null,
- c: [{}],
- d: {
- a: 3.14159,
- b: false,
- c: {
- d: 0,
- e: fn1,
- f: [[[]]],
- g: {
- j: {
- k: {
- n: {
- r: "r",
- s: [1,2,3],
- t: undefined,
- u: 0,
- v: {
- w: {
- x: {
- y: "Yahoo!",
- z: null
- }
- }
- }
- },
- o: 99,
- p: 1/0,
- q: []
- },
- l: undefined,
- m: null
- }
- },
- h: "false",
- i: true
- }
- },
- e: undefined,
- f: {},
- g: "",
- h: "h",
- i: []
- }
- ), false);
-
- equals(QUnit.equiv(
- {
- a: 1,
- b: null,
- c: [{}],
- d: {
- a: 3.14159,
- b: false,
- c: {
- d: 0,
- e: fn1,
- f: [[[]]],
- g: {
- j: {
- k: {
- n: {
- r: "r",
- s: [1,2,3],
- t: undefined,
- u: 0,
- v: {
- w: {
- x: {
- y: "Yahoo!",
- z: null
- }
- }
- }
- },
- o: 99,
- p: 1/0,
- q: []
- },
- l: undefined,
- m: null
- }
- },
- h: "false",
- i: true
- }
- },
- e: undefined,
- f: {},
- g: "",
- h: "h",
- i: []
- },
- {
- a: 1,
- b: null,
- c: [{}],
- d: {
- a: 3.14159,
- b: false,
- c: {
- d: 0,
- e: fn1,
- f: [[[]]],
- g: {
- j: {
- k: {
- n: {
- r: "r",
- s: [1,2,3],
- //t: undefined, // different: missing a property with an undefined value
- u: 0,
- v: {
- w: {
- x: {
- y: "Yahoo!",
- z: null
- }
- }
- }
- },
- o: 99,
- p: 1/0,
- q: []
- },
- l: undefined,
- m: null
- }
- },
- h: "false",
- i: true
- }
- },
- e: undefined,
- f: {},
- g: "",
- h: "h",
- i: []
- }
- ), false);
-
- equals(QUnit.equiv(
- {
- a: 1,
- b: null,
- c: [{}],
- d: {
- a: 3.14159,
- b: false,
- c: {
- d: 0,
- e: fn1,
- f: [[[]]],
- g: {
- j: {
- k: {
- n: {
- r: "r",
- s: [1,2,3],
- t: undefined,
- u: 0,
- v: {
- w: {
- x: {
- y: "Yahoo!",
- z: null
- }
- }
- }
- },
- o: 99,
- p: 1/0,
- q: []
- },
- l: undefined,
- m: null
- }
- },
- h: "false",
- i: true
- }
- },
- e: undefined,
- f: {},
- g: "",
- h: "h",
- i: []
- },
- {
- a: 1,
- b: null,
- c: [{}],
- d: {
- a: 3.14159,
- b: false,
- c: {
- d: 0,
- e: fn1,
- f: [[[]]],
- g: {
- j: {
- k: {
- n: {
- r: "r",
- s: [1,2,3],
- t: undefined,
- u: 0,
- v: {
- w: {
- x: {
- y: "Yahoo!",
- z: null
- }
- }
- }
- },
- o: 99,
- p: 1/0,
- q: {} // different was []
- },
- l: undefined,
- m: null
- }
- },
- h: "false",
- i: true
- }
- },
- e: undefined,
- f: {},
- g: "",
- h: "h",
- i: []
- }
- ), false);
-
- var same1 = {
- a: [
- "string", null, 0, "1", 1, {
- prop: null,
- foo: [1,2,null,{}, [], [1,2,3]],
- bar: undefined
- }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ ας"
- ],
- unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争",
- b: "b",
- c: fn1
- };
-
- var same2 = {
- a: [
- "string", null, 0, "1", 1, {
- prop: null,
- foo: [1,2,null,{}, [], [1,2,3]],
- bar: undefined
- }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ ας"
- ],
- unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争",
- b: "b",
- c: fn1
- };
-
- var diff1 = {
- a: [
- "string", null, 0, "1", 1, {
- prop: null,
- foo: [1,2,null,{}, [], [1,2,3,4]], // different: 4 was add to the array
- bar: undefined
- }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ ας"
- ],
- unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争",
- b: "b",
- c: fn1
- };
-
- var diff2 = {
- a: [
- "string", null, 0, "1", 1, {
- prop: null,
- foo: [1,2,null,{}, [], [1,2,3]],
- newprop: undefined, // different: newprop was added
- bar: undefined
- }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ ας"
- ],
- unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争",
- b: "b",
- c: fn1
- };
-
- var diff3 = {
- a: [
- "string", null, 0, "1", 1, {
- prop: null,
- foo: [1,2,null,{}, [], [1,2,3]],
- bar: undefined
- }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ α" // different: missing last char
- ],
- unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争",
- b: "b",
- c: fn1
- };
-
- var diff4 = {
- a: [
- "string", null, 0, "1", 1, {
- prop: null,
- foo: [1,2,undefined,{}, [], [1,2,3]], // different: undefined instead of null
- bar: undefined
- }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ ας"
- ],
- unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争",
- b: "b",
- c: fn1
- };
-
- var diff5 = {
- a: [
- "string", null, 0, "1", 1, {
- prop: null,
- foo: [1,2,null,{}, [], [1,2,3]],
- bat: undefined // different: property name not "bar"
- }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ ας"
- ],
- unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争",
- b: "b",
- c: fn1
- };
-
- equals(QUnit.equiv(same1, same2), true);
- equals(QUnit.equiv(same2, same1), true);
- equals(QUnit.equiv(same2, diff1), false);
- equals(QUnit.equiv(diff1, same2), false);
-
- equals(QUnit.equiv(same1, diff1), false);
- equals(QUnit.equiv(same1, diff2), false);
- equals(QUnit.equiv(same1, diff3), false);
- equals(QUnit.equiv(same1, diff3), false);
- equals(QUnit.equiv(same1, diff4), false);
- equals(QUnit.equiv(same1, diff5), false);
- equals(QUnit.equiv(diff5, diff1), false);
-});
-
-
-test("Complex Arrays.", function() {
-
- function fn() {
- }
-
- equals(QUnit.equiv(
- [1, 2, 3, true, {}, null, [
- {
- a: ["", '1', 0]
- },
- 5, 6, 7
- ], "foo"],
- [1, 2, 3, true, {}, null, [
- {
- a: ["", '1', 0]
- },
- 5, 6, 7
- ], "foo"]),
- true);
-
- equals(QUnit.equiv(
- [1, 2, 3, true, {}, null, [
- {
- a: ["", '1', 0]
- },
- 5, 6, 7
- ], "foo"],
- [1, 2, 3, true, {}, null, [
- {
- b: ["", '1', 0] // not same property name
- },
- 5, 6, 7
- ], "foo"]),
- false);
-
- var a = [{
- b: fn,
- c: false,
- "do": "reserved word",
- "for": {
- ar: [3,5,9,"hey!", [], {
- ar: [1,[
- 3,4,6,9, null, [], []
- ]],
- e: fn,
- f: undefined
- }]
- },
- e: 0.43445
- }, 5, "string", 0, fn, false, null, undefined, 0, [
- 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0
- ], [], [[[], "foo", null, {
- n: 1/0,
- z: {
- a: [3,4,5,6,"yep!", undefined, undefined],
- b: {}
- }
- }, {}]]];
-
- equals(QUnit.equiv(a,
- [{
- b: fn,
- c: false,
- "do": "reserved word",
- "for": {
- ar: [3,5,9,"hey!", [], {
- ar: [1,[
- 3,4,6,9, null, [], []
- ]],
- e: fn,
- f: undefined
- }]
- },
- e: 0.43445
- }, 5, "string", 0, fn, false, null, undefined, 0, [
- 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0
- ], [], [[[], "foo", null, {
- n: 1/0,
- z: {
- a: [3,4,5,6,"yep!", undefined, undefined],
- b: {}
- }
- }, {}]]]), true);
-
- equals(QUnit.equiv(a,
- [{
- b: fn,
- c: false,
- "do": "reserved word",
- "for": {
- ar: [3,5,9,"hey!", [], {
- ar: [1,[
- 3,4,6,9, null, [], []
- ]],
- e: fn,
- f: undefined
- }]
- },
- e: 0.43445
- }, 5, "string", 0, fn, false, null, undefined, 0, [
- 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[2]]]], "3"], {}, 1/0 // different: [[[[[2]]]]] instead of [[[[[3]]]]]
- ], [], [[[], "foo", null, {
- n: 1/0,
- z: {
- a: [3,4,5,6,"yep!", undefined, undefined],
- b: {}
- }
- }, {}]]]), false);
-
- equals(QUnit.equiv(a,
- [{
- b: fn,
- c: false,
- "do": "reserved word",
- "for": {
- ar: [3,5,9,"hey!", [], {
- ar: [1,[
- 3,4,6,9, null, [], []
- ]],
- e: fn,
- f: undefined
- }]
- },
- e: 0.43445
- }, 5, "string", 0, fn, false, null, undefined, 0, [
- 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0
- ], [], [[[], "foo", null, {
- n: -1/0, // different, -Infinity instead of Infinity
- z: {
- a: [3,4,5,6,"yep!", undefined, undefined],
- b: {}
- }
- }, {}]]]), false);
-
- equals(QUnit.equiv(a,
- [{
- b: fn,
- c: false,
- "do": "reserved word",
- "for": {
- ar: [3,5,9,"hey!", [], {
- ar: [1,[
- 3,4,6,9, null, [], []
- ]],
- e: fn,
- f: undefined
- }]
- },
- e: 0.43445
- }, 5, "string", 0, fn, false, null, undefined, 0, [
- 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0
- ], [], [[[], "foo", { // different: null is missing
- n: 1/0,
- z: {
- a: [3,4,5,6,"yep!", undefined, undefined],
- b: {}
- }
- }, {}]]]), false);
-
- equals(QUnit.equiv(a,
- [{
- b: fn,
- c: false,
- "do": "reserved word",
- "for": {
- ar: [3,5,9,"hey!", [], {
- ar: [1,[
- 3,4,6,9, null, [], []
- ]],
- e: fn
- // different: missing property f: undefined
- }]
- },
- e: 0.43445
- }, 5, "string", 0, fn, false, null, undefined, 0, [
- 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0
- ], [], [[[], "foo", null, {
- n: 1/0,
- z: {
- a: [3,4,5,6,"yep!", undefined, undefined],
- b: {}
- }
- }, {}]]]), false);
-});
-
-
-test("Prototypal inheritance", function() {
- function Gizmo(id) {
- this.id = id;
- }
-
- function Hoozit(id) {
- this.id = id;
- }
- Hoozit.prototype = new Gizmo();
-
- var gizmo = new Gizmo("ok");
- var hoozit = new Hoozit("ok");
-
- // Try this test many times after test on instances that hold function
- // to make sure that our code does not mess with last object constructor memoization.
- equals(QUnit.equiv(function () {}, function () {}), false);
-
- // Hoozit inherit from Gizmo
- // hoozit instanceof Hoozit; // true
- // hoozit instanceof Gizmo; // true
- equals(QUnit.equiv(hoozit, gizmo), true);
-
- Gizmo.prototype.bar = true; // not a function just in case we skip them
-
- // Hoozit inherit from Gizmo
- // They are equivalent
- equals(QUnit.equiv(hoozit, gizmo), true);
-
- // Make sure this is still true !important
- // The reason for this is that I forgot to reset the last
- // caller to where it were called from.
- equals(QUnit.equiv(function () {}, function () {}), false);
-
- // Make sure this is still true !important
- equals(QUnit.equiv(hoozit, gizmo), true);
-
- Hoozit.prototype.foo = true; // not a function just in case we skip them
-
- // Gizmo does not inherit from Hoozit
- // gizmo instanceof Gizmo; // true
- // gizmo instanceof Hoozit; // false
- // They are not equivalent
- equals(QUnit.equiv(hoozit, gizmo), false);
-
- // Make sure this is still true !important
- equals(QUnit.equiv(function () {}, function () {}), false);
-});
-
-
-test("Instances", function() {
- function A() {}
- var a1 = new A();
- var a2 = new A();
-
- function B() {
- this.fn = function () {};
- }
- var b1 = new B();
- var b2 = new B();
-
- equals(QUnit.equiv(a1, a2), true, "Same property, same constructor");
-
- // b1.fn and b2.fn are functions but they are different references
- // But we decided to skip function for instances.
- equals(QUnit.equiv(b1, b2), true, "Same property, same constructor");
- equals(QUnit.equiv(a1, b1), false, "Same properties but different constructor"); // failed
-
- function Car(year) {
- var privateVar = 0;
- this.year = year;
- this.isOld = function() {
- return year > 10;
- };
- }
-
- function Human(year) {
- var privateVar = 1;
- this.year = year;
- this.isOld = function() {
- return year > 80;
- };
- }
-
- var car = new Car(30);
- var carSame = new Car(30);
- var carDiff = new Car(10);
- var human = new Human(30);
-
- var diff = {
- year: 30
- };
-
- var same = {
- year: 30,
- isOld: function () {}
- };
-
- equals(QUnit.equiv(car, car), true);
- equals(QUnit.equiv(car, carDiff), false);
- equals(QUnit.equiv(car, carSame), true);
- equals(QUnit.equiv(car, human), false);
-});
-
-
-test("Complex Instances Nesting (with function value in literals and/or in nested instances)", function() {
- function A(fn) {
- this.a = {};
- this.fn = fn;
- this.b = {a: []};
- this.o = {};
- this.fn1 = fn;
- }
- function B(fn) {
- this.fn = fn;
- this.fn1 = function () {};
- this.a = new A(function () {});
- }
-
- function fnOutside() {
- }
-
- function C(fn) {
- function fnInside() {
- }
- this.x = 10;
- this.fn = fn;
- this.fn1 = function () {};
- this.fn2 = fnInside;
- this.fn3 = {
- a: true,
- b: fnOutside // ok make reference to a function in all instances scope
- };
- this.o1 = {};
-
- // This function will be ignored.
- // Even if it is not visible for all instances (e.g. locked in a closures),
- // it is from a property that makes part of an instance (e.g. from the C constructor)
- this.b1 = new B(function () {});
- this.b2 = new B({
- x: {
- b2: new B(function() {})
- }
- });
- }
-
- function D(fn) {
- function fnInside() {
- }
- this.x = 10;
- this.fn = fn;
- this.fn1 = function () {};
- this.fn2 = fnInside;
- this.fn3 = {
- a: true,
- b: fnOutside, // ok make reference to a function in all instances scope
-
- // This function won't be ingored.
- // It isn't visible for all C insances
- // and it is not in a property of an instance. (in an Object instances e.g. the object literal)
- c: fnInside
- };
- this.o1 = {};
-
- // This function will be ignored.
- // Even if it is not visible for all instances (e.g. locked in a closures),
- // it is from a property that makes part of an instance (e.g. from the C constructor)
- this.b1 = new B(function () {});
- this.b2 = new B({
- x: {
- b2: new B(function() {})
- }
- });
- }
-
- function E(fn) {
- function fnInside() {
- }
- this.x = 10;
- this.fn = fn;
- this.fn1 = function () {};
- this.fn2 = fnInside;
- this.fn3 = {
- a: true,
- b: fnOutside // ok make reference to a function in all instances scope
- };
- this.o1 = {};
-
- // This function will be ignored.
- // Even if it is not visible for all instances (e.g. locked in a closures),
- // it is from a property that makes part of an instance (e.g. from the C constructor)
- this.b1 = new B(function () {});
- this.b2 = new B({
- x: {
- b1: new B({a: function() {}}),
- b2: new B(function() {})
- }
- });
- }
-
-
- var a1 = new A(function () {});
- var a2 = new A(function () {});
- equals(QUnit.equiv(a1, a2), true);
-
- equals(QUnit.equiv(a1, a2), true); // different instances
-
- var b1 = new B(function () {});
- var b2 = new B(function () {});
- equals(QUnit.equiv(a1, a2), true);
-
- var c1 = new C(function () {});
- var c2 = new C(function () {});
- equals(QUnit.equiv(c1, c2), true);
-
- var d1 = new D(function () {});
- var d2 = new D(function () {});
- equals(QUnit.equiv(d1, d2), false);
-
- var e1 = new E(function () {});
- var e2 = new E(function () {});
- equals(QUnit.equiv(e1, e2), false);
-
-});
-
-
-test('object with references to self wont loop', function(){
- var circularA = {
- abc:null
- }, circularB = {
- abc:null
- };
- circularA.abc = circularA;
- circularB.abc = circularB;
- equals(QUnit.equiv(circularA, circularB), true, "Should not repeat test on object (ambigous test)");
-
- circularA.def = 1;
- circularB.def = 1;
- equals(QUnit.equiv(circularA, circularB), true, "Should not repeat test on object (ambigous test)");
-
- circularA.def = 1;
- circularB.def = 0;
- equals(QUnit.equiv(circularA, circularB), false, "Should not repeat test on object (unambigous test)");
-});
-
-test('array with references to self wont loop', function(){
- var circularA = [],
- circularB = [];
- circularA.push(circularA);
- circularB.push(circularB);
- equals(QUnit.equiv(circularA, circularB), true, "Should not repeat test on array (ambigous test)");
-
- circularA.push( 'abc' );
- circularB.push( 'abc' );
- equals(QUnit.equiv(circularA, circularB), true, "Should not repeat test on array (ambigous test)");
-
- circularA.push( 'hello' );
- circularB.push( 'goodbye' );
- equals(QUnit.equiv(circularA, circularB), false, "Should not repeat test on array (unambigous test)");
-});
-
-test('mixed object/array with references to self wont loop', function(){
- var circularA = [{abc:null}],
- circularB = [{abc:null}];
- circularA[0].abc = circularA;
- circularB[0].abc = circularB;
-
- circularA.push(circularA);
- circularB.push(circularB);
- equals(QUnit.equiv(circularA, circularB), true, "Should not repeat test on object/array (ambigous test)");
-
- circularA[0].def = 1;
- circularB[0].def = 1;
- equals(QUnit.equiv(circularA, circularB), true, "Should not repeat test on object/array (ambigous test)");
-
- circularA[0].def = 1;
- circularB[0].def = 0;
- equals(QUnit.equiv(circularA, circularB), false, "Should not repeat test on object/array (unambigous test)");
-});
-
-
-test("Test that must be done at the end because they extend some primitive's prototype", function() {
- // Try that a function looks like our regular expression.
- // This tests if we check that a and b are really both instance of RegExp
- Function.prototype.global = true;
- Function.prototype.multiline = true;
- Function.prototype.ignoreCase = false;
- Function.prototype.source = "my regex";
- var re = /my regex/gm;
- equals(QUnit.equiv(re, function () {}), false, "A function that looks that a regex isn't a regex");
- // This test will ensures it works in both ways, and ALSO especially that we can make differences
- // between RegExp and Function constructor because typeof on a RegExpt instance is "function"
- equals(QUnit.equiv(function () {}, re), false, "Same conversely, but ensures that function and regexp are distinct because their constructor are different");
-});
-
diff --git a/addon/js_upload/file-uploader/tests/qunit/test/test.js b/addon/js_upload/file-uploader/tests/qunit/test/test.js
deleted file mode 100644
index 8eb5213d1..000000000
--- a/addon/js_upload/file-uploader/tests/qunit/test/test.js
+++ /dev/null
@@ -1,171 +0,0 @@
-test("module without setup/teardown (default)", function() {
- expect(1);
- ok(true);
-});
-
-test("expect in test", 3, function() {
- ok(true);
- ok(true);
- ok(true);
-});
-
-test("expect in test", 1, function() {
- ok(true);
-});
-
-module("setup test", {
- setup: function() {
- ok(true);
- }
-});
-
-test("module with setup", function() {
- expect(2);
- ok(true);
-});
-
-var state;
-
-module("setup/teardown test", {
- setup: function() {
- state = true;
- ok(true);
- },
- teardown: function() {
- ok(true);
- }
-});
-
-test("module with setup/teardown", function() {
- expect(3);
- ok(true);
-});
-
-module("setup/teardown test 2");
-
-test("module without setup/teardown", function() {
- expect(1);
- ok(true);
-});
-
-if (typeof setTimeout !== 'undefined') {
-state = 'fail';
-
-module("teardown and stop", {
- teardown: function() {
- equals(state, "done", "Test teardown.");
- }
-});
-
-test("teardown must be called after test ended", function() {
- expect(1);
- stop();
- setTimeout(function() {
- state = "done";
- start();
- }, 13);
-});
-} // end setTimeout tests
-
-if (typeof asyncTest !== 'undefined') {
-module("asyncTest");
-
-asyncTest("asyncTest", function() {
- expect(2);
- ok(true);
- setTimeout(function() {
- state = "done";
- ok(true);
- start();
- }, 13);
-});
-
-asyncTest("asyncTest", 2, function() {
- ok(true);
- setTimeout(function() {
- state = "done";
- ok(true);
- start();
- }, 13);
-});
-} // end asyncTest tests
-
-module("save scope", {
- setup: function() {
- this.foo = "bar";
- },
- teardown: function() {
- same(this.foo, "bar");
- }
-});
-test("scope check", function() {
- expect(2);
- same(this.foo, "bar");
-});
-
-module("simple testEnvironment setup", {
- foo: "bar",
- bugid: "#5311" // example of meta-data
-});
-test("scope check", function() {
- same(this.foo, "bar");
-});
-test("modify testEnvironment",function() {
- this.foo="hamster";
-});
-test("testEnvironment reset for next test",function() {
- same(this.foo, "bar");
-});
-
-module("testEnvironment with object", {
- options:{
- recipe:"soup",
- ingredients:["hamster","onions"]
- }
-});
-test("scope check", function() {
- same(this.options, {recipe:"soup",ingredients:["hamster","onions"]}) ;
-});
-test("modify testEnvironment",function() {
- // since we do a shallow copy, the testEnvironment can be modified
- this.options.ingredients.push("carrots");
-});
-test("testEnvironment reset for next test",function() {
- same(this.options, {recipe:"soup",ingredients:["hamster","onions","carrots"]}, "Is this a bug or a feature? Could do a deep copy") ;
-});
-
-
-module("testEnvironment tests");
-
-function makeurl() {
- var testEnv = QUnit.current_testEnvironment;
- var url = testEnv.url || 'http://example.com/search';
- var q = testEnv.q || 'a search test';
- return url + '?q='+encodeURIComponent(q);
-}
-
-test("makeurl working",function() {
- equals( QUnit.current_testEnvironment, this, 'The current testEnvironment is global');
- equals( makeurl(), 'http://example.com/search?q=a%20search%20test', 'makeurl returns a default url if nothing specified in the testEnvironment');
-});
-
-module("testEnvironment with makeurl settings",{
- url:'http://google.com/',
- q:'another_search_test'
-});
-test("makeurl working with settings from testEnvironment",function() {
- equals( makeurl(), 'http://google.com/?q=another_search_test', 'rather than passing arguments, we use test metadata to form the url');
-});
-test("each test can extend the module testEnvironment", {
- q:'hamstersoup'
-}, function() {
- equals( makeurl(), 'http://google.com/?q=hamstersoup', 'url from module, q from test');
-});
-
-module("jsDump");
-test("jsDump output", function() {
- equals( QUnit.jsDump.parse([1, 2]), "[ 1, 2 ]" );
- equals( QUnit.jsDump.parse({top: 5, left: 0}), "{ \"top\": 5, \"left\": 0 }" );
- equals( QUnit.jsDump.parse(document.getElementById("qunit-header")), "<h1 id=\"qunit-header\"></h1>" );
- equals( QUnit.jsDump.parse(document.getElementsByTagName("h1")), "[ <h1 id=\"qunit-header\"></h1> ]" );
-})
diff --git a/addon/js_upload/file-uploader/tests/sample-files/1imagelonglonglonglonglonglongname.gif b/addon/js_upload/file-uploader/tests/sample-files/1imagelonglonglonglonglonglongname.gif
deleted file mode 100644
index 6fba77609..000000000
--- a/addon/js_upload/file-uploader/tests/sample-files/1imagelonglonglonglonglonglongname.gif
+++ /dev/null
Binary files differ
diff --git a/addon/js_upload/file-uploader/tests/sample-files/2larger.txt b/addon/js_upload/file-uploader/tests/sample-files/2larger.txt
deleted file mode 100644
index bb54dd784..000000000
--- a/addon/js_upload/file-uploader/tests/sample-files/2larger.txt
+++ /dev/null
@@ -1 +0,0 @@
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/tests/sample-files/3empty.txt b/addon/js_upload/file-uploader/tests/sample-files/3empty.txt
deleted file mode 100644
index e69de29bb..000000000
--- a/addon/js_upload/file-uploader/tests/sample-files/3empty.txt
+++ /dev/null
diff --git a/addon/js_upload/file-uploader/tests/sample-files/4text.txt b/addon/js_upload/file-uploader/tests/sample-files/4text.txt
deleted file mode 100644
index ea7ada1f7..000000000
--- a/addon/js_upload/file-uploader/tests/sample-files/4text.txt
+++ /dev/null
@@ -1 +0,0 @@
-satastastast \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/tests/sample-files/5text.txt b/addon/js_upload/file-uploader/tests/sample-files/5text.txt
deleted file mode 100644
index ea7ada1f7..000000000
--- a/addon/js_upload/file-uploader/tests/sample-files/5text.txt
+++ /dev/null
@@ -1 +0,0 @@
-satastastast \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/tests/sample-files/6text.txt b/addon/js_upload/file-uploader/tests/sample-files/6text.txt
deleted file mode 100644
index ea7ada1f7..000000000
--- a/addon/js_upload/file-uploader/tests/sample-files/6text.txt
+++ /dev/null
@@ -1 +0,0 @@
-satastastast \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/tests/sample-files/7small.txt b/addon/js_upload/file-uploader/tests/sample-files/7small.txt
deleted file mode 100644
index 2f259b79a..000000000
--- a/addon/js_upload/file-uploader/tests/sample-files/7small.txt
+++ /dev/null
@@ -1 +0,0 @@
-s \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/tests/sample-files/8text.txt b/addon/js_upload/file-uploader/tests/sample-files/8text.txt
deleted file mode 100644
index ea7ada1f7..000000000
--- a/addon/js_upload/file-uploader/tests/sample-files/8text.txt
+++ /dev/null
@@ -1 +0,0 @@
-satastastast \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/tests/separate-file-list.htm b/addon/js_upload/file-uploader/tests/separate-file-list.htm
deleted file mode 100644
index 424142942..000000000
--- a/addon/js_upload/file-uploader/tests/separate-file-list.htm
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <link href="../client/fileuploader.css" rel="stylesheet" type="text/css">
-</head>
-<body>
-
- <div id="demo"></div>
- <ul id="separate-list"></ul>
-
- <script src="../client/fileuploader.js" type="text/javascript"></script>
- <script>
- function createUploader(){
- var uploader = new qq.FileUploader({
- element: document.getElementById('demo'),
- listElement: document.getElementById('separate-list'),
- action: '../client/do-nothing.htm'
- });
- }
- window.onload = createUploader;
- </script>
-</body>
-</html> \ No newline at end of file
diff --git a/addon/js_upload/file-uploader/tests/test-acceptance.htm b/addon/js_upload/file-uploader/tests/test-acceptance.htm
deleted file mode 100644
index 985c20b03..000000000
--- a/addon/js_upload/file-uploader/tests/test-acceptance.htm
+++ /dev/null
@@ -1,106 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <script src="jquery-1.4.2.min.js" type="text/javascript"></script>
-
- <!-- test iwth jquery ui dialog -->
- <link href="jquery-ui/ui-lightness/jquery-ui-1.8.4.custom.css" rel="stylesheet" type="text/css" media="screen" />
- <script src="jquery-ui/jquery-ui-1.8.4.custom.min.js" type="text/javascript"></script>
-
- <link href="qunit/qunit/qunit.css" rel="stylesheet" type="text/css" media="screen" />
- <script src="qunit/qunit/qunit.js" type="text/javascript"></script>
-
- <link href="../client/fileuploader.css" rel="stylesheet" type="text/css">
- <script src="../client/fileuploader.js" type="text/javascript" ></script>
- <script>
-
-jQuery(function(){
- $("#dialog").dialog();
-
- asyncTest("qq.FileUploader", function() {
- expect(10);
-
- var submitFileName, submitId;
-
- var uploader = new qq.FileUploader({
- element: document.getElementById('file-uploader'),
- action: 'action-acceptance.php',
- params: {
- one: 'value1',
- two: 'value2'
- },
- allowedExtensions: ['txt', 'val', 'webm'],
- sizeLimit: 9 * 1024,
- minSizeLimit: 10,
- onSubmit: function(id, fileName){
- if (fileName == '5text.txt'){
- submitId = id;
- submitFileName = fileName;
- } else if (fileName == '6text.txt'){
- uploader.setParams({'new':'newvalue'});
-
- same(uploader.getInProgress(), 0, 'getFilesInProgress');
-
- setTimeout(function(){
- same(uploader.getInProgress(), 1, 'getFilesInProgress');
- }, 1);
- } else if (fileName == '8text.txt'){
-
- setTimeout(function(){
- same(uploader.getInProgress(), 0, 'all uploads should have finished');
- start(); // check test results
- }, 1000);
-
- return false;
- }
- },
- onComplete: function(id, fileName, responseJSON){
-
- if (fileName == '4text.txt'){
- same(responseJSON, {}, 'should be empty if server returned malformed json');
- } else if (fileName == '5text.txt'){
- same(submitId, id, "id in both callbacks match");
- same(submitFileName, fileName, "filename in both callbacks match");
- ok(responseJSON.one === 'value1' && responseJSON.two === 'value2', "server received default params");
- same(responseJSON.fileName, fileName, "filename in onComplete correct");
- } else if (fileName == '6text.txt'){
- ok(responseJSON['new'] === 'newvalue' && responseJSON.one == null, "server received new params");
- same(uploader.getInProgress(), 0, 'upload should have finished');
- } else if (fileName == '8text.txt'){
- ok(false, "upload should be cancelled by returning false in onSubmit");
- }
- }
- });
- });
-});
- </script>
-</head>
-<body>
- <h1 id="qunit-header">File uploader tests</h1>
- <h2 id="qunit-banner"></h2>
- <h2 id="qunit-userAgent"></h2>
- <ol id="qunit-tests"></ol>
-
- <p>select files in sample-files dir, following order</p>
- <ol>
- <li>select 1imagelong...long.gif, invalid ext error should appear</li>
- <li>select 2larger.txt, invalid size message should appear (in FF3.6+,Safari4+,Chrome without doing request)</li>
- <li>select 3empty.txt, invalid size message should appear (in FF3.6+,Safari4+,Chrome without doing request)</li>
- <li>select 4text.txt, uploaded file should be marked as failed (server returns jsgkdfgu4eyij)</li>
- <li>select 5text.txt, callback argument tests</li>
- <li>select 6text.txt, setParams, isUploading</li>
- <li>select 7small.txt, too small size message should appear (in FF3.6+,Safari4+,Chrome without doing request)</li>
- <li>select 8text.txt, returning false in onSubmit cancells upload, file should not be added to list</li>
- <li>
- In FF,Chrome, select all files using drag-and-drop, only 1 error should appear.
- </li>
- </ol>
-
- <div id="dialog" title="Basic dialog">
- File uploader inside a dialog
- <div id="file-uploader"></div>
- </div>
-</body>
-</html>
-
-
diff --git a/addon/js_upload/file-uploader/tests/test-drop-zone.htm b/addon/js_upload/file-uploader/tests/test-drop-zone.htm
deleted file mode 100644
index d7f0accf7..000000000
--- a/addon/js_upload/file-uploader/tests/test-drop-zone.htm
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <style>
- .drop-zone {height:100px; width:256px; background:gray; margin:20px;}
- </style>
- <script src="jquery-1.4.2.min.js" type="text/javascript"></script>
- <script src="../client/fileuploader.js" type="text/javascript" ></script>
- <script>
-
-function createDropZone(selector){
- var element = $(selector)[0];
-
- new qq.UploadDropZone({
- element: element,
- onEnter: function(){
- console.log('enter')
- $(element).css('background', 'green');
- },
- onLeave: function(){
- console.log('leave')
- },
- onLeaveNotDescendants: function(){
- console.log('onLeaveNotDescendants')
- $(element).css('background', 'gray');
- },
- onDrop: function(e){
- $(element).css('background', 'gray');
- console.log('drop');
- console.log(e.dataTransfer.files);
- }
- });
-}
-
-jQuery(function(){
- createDropZone('#drop-zone1');
- createDropZone('#drop-zone2');
-});
-
- </script>
-</head>
-<body>
- <div id="drop-zone1" class="drop-zone"><p>drop-zone1</p></div>
- <div id="drop-zone2" class="drop-zone"><p>drop-zone2</p></div>
-</body>
-</html>
-
-
diff --git a/addon/js_upload/file-uploader/tests/test-handler-queue.htm b/addon/js_upload/file-uploader/tests/test-handler-queue.htm
deleted file mode 100644
index 52e3b3a58..000000000
--- a/addon/js_upload/file-uploader/tests/test-handler-queue.htm
+++ /dev/null
@@ -1,81 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <script src="jquery-1.4.2.min.js" type="text/javascript"></script>
-
- <link href="qunit/qunit/qunit.css" rel="stylesheet" type="text/css" media="screen" />
- <script src="qunit/qunit/qunit.js" type="text/javascript"></script>
-
- <script src="../client/fileuploader.js" type="text/javascript" ></script>
- <script>
-jQuery(function(){
-
- function getHandler(){
- if(qq.UploadHandlerXhr.isSupported()){
- return qq.UploadHandlerXhr;
- } else {
- return qq.UploadHandlerForm;
- }
- }
-
- asyncTest("upload", function() {
- expect(2);
-
- var data = {stringOne: 'rtdfghdfhfh',stringTwo: 'dfsgsdfgsdg',stringThree: 'dfsgfhdfhdg'};
- var savedId;
-
- var uploadHandler = new (getHandler())({
- action: 'action-handler-queue-test.php',
- maxConnections: 1,
- onComplete: function(id, fileName, response){
- if (!response.success){
- ok(false, 'server did not receive file')
- return;
- }
-
- delete response.success;
- delete response.qqfile;
-
- same(response, data, 'server received file and data');
- }
- });
-
-
- $('#testinput1, #testinput2').change(upload);
-
- function upload(){
- setTimeout(start, 9000);
-
- var file = this;
- if (uploadHandler instanceof qq.UploadHandlerXhr){
- file = this.files[0];
- }
- var id = uploadHandler.add(file);
- uploadHandler.upload(id, data);
- }
-
-
- });
-});
- </script>
-</head>
-<body>
- <h1 id="qunit-header">File uploader tests</h1>
- <h2 id="qunit-banner"></h2>
- <h2 id="qunit-userAgent"></h2>
- <ol id="qunit-tests"></ol>
-
-
- <p>
- Please select a file for each input below,
- should be less than 4 sec, between selection.
- </p>
-
-
- <input id="testinput1" type="file">
- <input id="testinput2" type="file">
-
-</body>
-</html>
-
-
diff --git a/addon/js_upload/file-uploader/tests/test-upload-handlers.htm b/addon/js_upload/file-uploader/tests/test-upload-handlers.htm
deleted file mode 100644
index 9cf74fe7e..000000000
--- a/addon/js_upload/file-uploader/tests/test-upload-handlers.htm
+++ /dev/null
@@ -1,382 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <script src="jquery-1.4.2.min.js" type="text/javascript"></script>
-
- <link href="qunit/qunit/qunit.css" rel="stylesheet" type="text/css" media="screen" />
- <script src="qunit/qunit/qunit.js" type="text/javascript"></script>
-
- <script src="../client/fileuploader.js" type="text/javascript" ></script>
- <script>
-
-jQuery(function(){
-
- module('qq');
-
- test("contains", function(){
- var el1 = document.createElement('div');
- var el2 = document.createElement('div');
- var el3 = document.createElement('div');
- el1.appendChild(el2);
- el2.appendChild(el3);
-
- var el4 = document.createElement('div');
-
- ok(qq.contains(el1,el1));
- ok(qq.contains(el1,el2));
- ok(qq.contains(el1,el3));
- ok(!qq.contains(el1,el4));
- ok(!qq.contains(el3,el2));
- });
-
- test("hasClass, addClass, removeClass", function(){
- var element = document.createElement('div');
- qq.addClass(element, 'some-class');
- ok(!qq.hasClass(element, 'some'), 'dash in class name');
- });
-
- test("children", function(){
- same(qq.children(document.createElement('div')), [], 'empty');
- var element = document.createElement('div');
- element.innerHTML = 'asdasd<div>text</div><span>asdas</span>asdasd';
- same(qq.children(element).length, 2);
- });
-
- test("getByClass", function(){
- var element = document.createElement('div');
- element.style.display = 'none';
- element.innerHTML = '<div class="class"><div class="someclass class"></div></div><span></span><div class="test"></div><div class="class"></div>';
- document.body.appendChild(element);
-
- var outside = document.createElement('div');
- outside.className = 'outside class';
- document.body.appendChild(outside);
-
- same(qq.getByClass(document, 'class').length, 4, 'in document');
- same(qq.getByClass(element, 'class').length, 3, 'in test div');
-
- qq.remove(element);
- qq.remove(outside);
- });
-
- test("obj2url", function(){
- var tests = [
- {title:'empty', obj:{}, expect:''},
- {title:'general json', obj:{a:'b',c:'d',e:'f'}, expect:'a=b&c=d&e=f'},
- {title:'general json', obj:{a:1,b:2,c:3,d:4}, expect:'a=1&b=2&c=3&d=4'},
- {title:'general json array', obj:{a:[1,2,3,4]}, expect:'a[0]=1&a[1]=2&a[2]=3&a[3]=4'},
- {title:'complex json', obj:{a:'b',c:'d',e:['f',{g:'h',i:['j',{k:'l',m:'n'}],
- o:undefined,p:true,q:false}]},
- expect:'a=b&c=d&'
- +'e[0]=f&'
- +'e[1][g]=h&'
- +'e[1][i][0]=j&'
- +'e[1][i][1][k]=l&'
- +'e[1][i][1][m]=n&'
- +'e[1][o]=undefined&'
- +'e[1][p]=true&'
- +'e[1][q]=false'},
- {title:'function', obj:{a:function(){return 'b';}}, expect:'a=b'},
- {title:'function no return', obj:{a:function(){},undefined:'b'}, expect:'a=undefined'},
- {title:'null', obj:{a:null}, expect:'a=null'},
- {title:'prevent double encoding', obj:{a:[1,2,3],'b[]':[4,5,6],'c[d]':[7,8,9]},
- expect:'a[0]=1&a[1]=2&a[2]=3&'
- +'b[]=4&b[]=5&b[]=6&'
- +'c[d][0]=7&c[d][1]=8&c[d][2]=9'},
- {title:'spaces', obj:{a:'All your base are belong to us'},
- expect:'a=All+your+base+are+belong+to+us'},
- {title:'undefined simple', obj:{undefined:undefined}, expect:''},
- {title:'undefined complex', obj:{undefined:undefined,
- a:{undefined:undefined},
- b:[{undefined:'c'},undefined,{d:'e'}]},
- expect:'b[1]=undefined&b[2][d]=e'},
- {title:'prefix url no params', obj:{a:'b'},
- prefix:'http://any.url',
- expect:'http://any.url?a=b'},
- {title:'prefix url trailing ?', obj:{a:'b'},
- prefix:'http://any.url?',
- expect:'http://any.url?a=b'},
- {title:'prefix url param', obj:{a:'b'}, prefix:'http://any.url?foo',
- expect:'http://any.url?foo&a=b'},
- {title:'prefix url param=value', obj:{a:'b'},
- prefix:'http://any.url?foo=bar',
- expect:'http://any.url?foo=bar&a=b'},
- {title:'prefix url multi param', obj:{a:'b'},
- prefix:'http://any.url?foo=bar&bla=blub',
- expect:'http://any.url?foo=bar&bla=blub&a=b'},
- {title:'prefix url array param', obj:{a:'b',c:'d'},
- prefix:'http://any.url?foo[0]=bla&foo[1]=blub',
- expect:'http://any.url?foo[0]=bla&foo[1]=blub&a=b&c=d'}
- ];
-
- for (var i = 0, l = tests.length; i<l; i++) {
- //console.log('------------------ obj2url-test'+(i+1)+': '+tests[i].title);
- //console.log('object: '+tests[i].obj);
- //console.log('prefix: '+tests[i].prefix);
- var result = '';
- if (tests[i].prefix) {
- result = qq.obj2url(tests[i].obj, tests[i].prefix);
- } else {
- result = qq.obj2url(tests[i].obj);
- }
- //console.log('result: '+result);
- same(decodeURIComponent(result), tests[i].expect, tests[i].title);
- }
- });
-
-
- var uploadTimeout = 700,
- loadTimeout = 300;
-
- if (qq.UploadHandlerXhr.isSupported()){
- $('.handlerform').remove();
- } else {
- //
- module('qq.UploadHandlerForm');
- //
-
- asyncTest("_getIframeContentJSON", function() {
- expect(3);
- setTimeout(start, loadTimeout);
-
- var exampleObject = {
- "example" : "&amp;a&lt;computer networks&gt;, to download means to receive data to a local system from a remote system, or to initiate such a data transfer. Examples of a remote system from which a download might be performed include a webserver, FTP server, email server, or other similar systems. A download can mean either any file that is offered for downloading or that has been downloaded, or the process of receiving such a file.The inverse operation, uploading, can refer to the sending of data from a local system to a remote system such as a server or another client with the intent that the remote system should store a copy of the data being transferred, or the initiation of such a process. The words first came into popular usage among computer users with the increased popularity of Bulletin Board Systems (BBSs), facilitated by the widespread distribution and implementation of dial-up access the in the 1970s",
- "sub" : {
- "arr": [10,20,30],
- "boo": false
- }
- };
-
- var testedFn = qq.UploadHandlerForm.prototype._getIframeContentJSON;
-
- // IE 7,8 doesn't support application-javascript, application-json, text-javascript, text-plain
- // as a response type, it also doesn't file load event when iframe loads page with 404 header
- createIframe('iframe-content-tests/somepage.php', function(iframe){
- same(testedFn(iframe), {}, "Server didn't return valid JSON object");
- });
- createIframe('iframe-content-tests/text-html.php', function(iframe){
- same(testedFn(iframe), exampleObject, "text-html");
- });
-
- // test larger response (>4k)
- //http://www.coderholic.com/firefox-4k-xml-node-limit/
- createIframe('iframe-content-tests/text-html-large.php', function(iframe){
- same(testedFn(iframe).length, 5000, ">4k");
- });
-
-
- function createIframe(src, onLoad){
- var iframe = document.createElement('iframe');
- qq.attach(iframe, 'load', function(){
- onLoad(iframe);
-
- setTimeout(function(){
- qq.remove(iframe);
- }, 1);
- });
- iframe.src = src;
- document.body.appendChild(iframe);
- }
- });
-
- test("upload, cancel with empty input", function(){
- expect(1);
-
- var uploadHandlerForm = new qq.UploadHandlerForm({
- action: 'action-slow-response.php',
- onComplete: function(id, fileName, response){
- ok(false, 'onComplete should not run, the request should be cancelled');
- }
- });
-
- var input = document.createElement('input');
- var id = uploadHandlerForm.add(input);
- uploadHandlerForm.cancel(id);
-
- try {
- // should fail
- uploadHandlerForm.upload(id);
- } catch (err){
- ok(true, "wasn't uploaded after cancelling")
- };
-
- });
-
- asyncTest("upload", function() {
- expect(4);
-
- var data = {stringOne: 'rtdfghdfhfh',stringTwo: 'dfsgsdfgsdg',stringThree: 'dfsgfhdfhdg'};
- var savedId;
-
- var uploadHandler = new qq.UploadHandlerForm({
- action: 'action-handler-test.php',
- onComplete: function(id, fileName, response){
- ok(savedId == id, 'proper id in callback');
- same(fileName, uploadHandler.getName(id), 'getName method');
-
- data.fileName = fileName;
- same(response, data, 'server received file and correct params, filenames match');
- }
- });
-
- var input = document.getElementById('testinput1');
- qq.attach(input, 'change', function(){
- setTimeout(start, uploadTimeout);
-
- savedId = uploadHandler.add(input);
- ok(savedId != null, 'id returned by add');
-
- uploadHandler.upload(savedId, data);
- });
- });
-
- asyncTest("cancel", function() {
- var uploadHandlerForm = new qq.UploadHandlerForm({
- action: 'action-slow-response.php',
- onComplete: function(id, fileName, response){
- ok(false, 'onComplete should not run, the request should be cancelled');
- }
- });
-
- var input = document.getElementById('testinput2');
- qq.attach(input, 'change', function(){
- var id = uploadHandlerForm.add(input);
- uploadHandlerForm.upload(id);
- uploadHandlerForm.cancel(id);
- start();
- });
- });
-
- test("check that forms and iframes were removed after use", function(){
- same($('form,iframe').length, 0, 'check that forms and iframes were removed after use');
- });
-
- asyncTest('going back', function(){
- setTimeout(function(){
- var goBack = confirm("checking that the history wasn't changed, the page will go back to previous now");
- if (goBack){
- window.history.back();
-
- start();
- ok(false, "the page didn't change (fails in Opera)");
- }
- }, 1000);
- });
-
- }
-
- if (!qq.UploadHandlerXhr.isSupported()){
- $('.handlerxhr').remove();
- } else {
- //
- module('qq.UploadHandlerXhr');
- //
-
- asyncTest("upload", function() {
- expect(9);
-
- var data = {stringOne: 'rtdfghdfhfh',stringTwo: 'dfsgsdfgsdg',stringThree: 'dfsgfhdfhdg'};
- var onProgressCalled = false;
- var expectedId, expectedName;
-
- var uploadHandler = new qq.UploadHandlerXhr({
- action: 'action-handler-test.php',
- onProgress: function(id, fileName, loaded, total){
- if (!onProgressCalled) {
- onProgressCalled = true;
-
- same(id, expectedId, 'progress event fired with correct id param');
- same(fileName, expectedName, 'progress event fired with correct fileName param')
- ok(loaded <= total && total > 0, 'progress event fired with possible loaded and total');
-
- same(total, uploadHandler.getSize(id), 'getSize method');
- }
- },
- onComplete: function(id, fileName, response){
- same(id, expectedId, 'progress event fired with correct id param');
- same(fileName, expectedName, 'progress event fired with correct fileName param')
-
- data.fileName = fileName;
- data.qqfile = fileName;
-
- same(response, data, 'server received passed params, filenames match');
-
- same(fileName, uploadHandler.getName(id), 'getName method');
- }
- });
-
- var input = document.getElementById('handlerxhr1');
-
- qq.attach(input, 'change', function(){
- setTimeout(start, uploadTimeout);
-
- var id = uploadHandler.add(input.files[0]);
- ok(id != null, 'id returned by add');
-
- expectedId = id;
- expectedName = input.files[0].name || input.files[0].fileName;
- if (!expectedName){
- ok(false, 'false value as a file name used');
- }
-
- uploadHandler.upload(id, data);
-
- qq.remove(input);
- });
- });
-
- asyncTest("cancel", function() {
- var uploadHandler = new qq.UploadHandlerXhr({
- action: 'action-slow-response.php',
- onComplete: function(id, fileName, response){
- ok(false, 'onComplete should not run, the request should be cancelled');
- }
- });
-
- var input = document.getElementById('handlerxhr2');
- if (!input){
- // input removed because uploading via XHR is not supported
- return;
- }
-
- qq.attach(input, 'change', function(){
- var id = uploadHandler.add(input.files[0]);
- uploadHandler.upload(id);
- uploadHandler.cancel(id);
-
- start();
- qq.remove(input);
- });
- });
- }
-});
- </script>
-</head>
-<body>
- <h1 id="qunit-header">File uploader tests</h1>
- <h2 id="qunit-banner"></h2>
- <h2 id="qunit-userAgent"></h2>
- <ol id="qunit-tests"></ol>
-
- <p>
- Open this page via https connection, and make sure that loading bar is not acting strange after all tests are run.
- Back button test fails in Opera.
- </p>
-
- <p>Please select a file for each input below (in order)</p>
-
- <p>qq.FileUploader</p>
- <div id="fileuploader1"></div>
-
- <p>qq.UploadHandlerForm</p>
- <input class="handlerform" id="testinput1" type="file">
- <input class="handlerform" id="testinput2" type="file">
-
- <p>qq.UploadHandlerXhr</p>
- <input class="handlerxhr" id="handlerxhr1" type="file">
- <input class="handlerxhr" id="handlerxhr2" type="file">
-
-</body>
-</html>
-
-
diff --git a/addon/js_upload/js_upload.php b/addon/js_upload/js_upload.php
deleted file mode 100644
index 1996b8504..000000000
--- a/addon/js_upload/js_upload.php
+++ /dev/null
@@ -1,339 +0,0 @@
-<?php
-
-/**
- * Name: JS Uploader
- * Description: JavaScript photo/image uploader. Uses Valum 'qq' Uploader.
- * Version: 1.0
- * Author: Chris Case <http://friendika.openmindspace.org/profile/chris_case>
- */
-
-/**
- *
- * JavaScript Photo/Image Uploader
- *
- * Uses Valum 'qq' Uploader.
- * Module Author: Chris Case
- *
- */
-
-
-function js_upload_install() {
- register_hook('photo_upload_form', 'addon/js_upload/js_upload.php', 'js_upload_form');
- register_hook('photo_post_init', 'addon/js_upload/js_upload.php', 'js_upload_post_init');
- register_hook('photo_post_file', 'addon/js_upload/js_upload.php', 'js_upload_post_file');
- register_hook('photo_post_end', 'addon/js_upload/js_upload.php', 'js_upload_post_end');
-}
-
-
-function js_upload_uninstall() {
- unregister_hook('photo_upload_form', 'addon/js_upload/js_upload.php', 'js_upload_form');
- unregister_hook('photo_post_init', 'addon/js_upload/js_upload.php', 'js_upload_post_init');
- unregister_hook('photo_post_file', 'addon/js_upload/js_upload.php', 'js_upload_post_file');
- unregister_hook('photo_post_end', 'addon/js_upload/js_upload.php', 'js_upload_post_end');
-}
-
-
-function js_upload_form(&$a,&$b) {
-
- $b['default_upload'] = false;
-
- $b['addon_text'] .= '<link href="' . $a->get_baseurl() . '/addon/js_upload/file-uploader/client/fileuploader.css" rel="stylesheet" type="text/css">';
- $b['addon_text'] .= '<script src="' . $a->get_baseurl() . '/addon/js_upload/file-uploader/client/fileuploader.js" type="text/javascript"></script>';
-
- $upload_msg = t('Upload a file');
- $drop_msg = t('Drop files here to upload');
- $cancel = t('Cancel');
- $failed = t('Failed');
-
- $b['addon_text'] .= <<< EOT
-
- <div id="file-uploader-demo1">
- <noscript>
- <p>Please enable JavaScript to use file uploader.</p>
- <!-- or put a simple form for upload here -->
- </noscript>
- </div>
-
-<script type="text/javascript">
-var uploader = null;
-function getSelected(opt) {
- var selected = new Array();
- var index = 0;
- for (var intLoop = 0; intLoop < opt.length; intLoop++) {
- if ((opt[intLoop].selected) ||
- (opt[intLoop].checked)) {
- index = selected.length;
- //selected[index] = new Object;
- selected[index] = opt[intLoop].value;
- //selected[index] = intLoop;
- }
- }
- return selected;
- }
-function createUploader() {
- uploader = new qq.FileUploader({
- element: document.getElementById('file-uploader-demo1'),
- action: '{$b['post_url']}',
-
- template: '<div class="qq-uploader">' +
- '<div class="qq-upload-drop-area"><span>$drop_msg</span></div>' +
- '<div class="qq-upload-button">$upload_msg</div>' +
- '<ul class="qq-upload-list"></ul>' +
- '</div>',
-
- // template for one item in file list
- fileTemplate: '<li>' +
- '<span class="qq-upload-file"></span>' +
- '<span class="qq-upload-spinner"></span>' +
- '<span class="qq-upload-size"></span>' +
- '<a class="qq-upload-cancel" href="#">$cancel</a>' +
- '<span class="qq-upload-failed-text">$failed</span>' +
- '</li>',
-
- debug: true,
- onSubmit: function(id,filename) {
- if (typeof acl!="undefined"){
- uploader.setParams( {
- newalbum : document.getElementById('photos-upload-newalbum').value,
- album : document.getElementById('photos-upload-album-select').value,
- group_allow : acl.allow_gid.join(','),
- contact_allow : acl.allow_cid.join(','),
- group_deny : acl.deny_gid.join(','),
- contact_deny : acl.deny_cid.join(',')
- });
- } else {
- uploader.setParams( {
- newalbum : document.getElementById('photos-upload-newalbum').value,
- album : document.getElementById('photos-upload-album-select').value,
- group_allow : getSelected(document.getElementById('group_allow')).join(','),
- contact_allow : getSelected(document.getElementById('contact_allow')).join(','),
- group_deny : getSelected(document.getElementById('group_deny')).join(','),
- contact_deny : getSelected(document.getElementById('contact_deny')).join(',')
- });
- }
- }
- });
-}
-
-
-// in your app create uploader as soon as the DOM is ready
-// don't wait for the window to load
-window.onload = createUploader;
-
-
-</script>
-
-EOT;
-
-
-}
-
-function js_upload_post_init(&$a,&$b) {
-
- // list of valid extensions, ex. array("jpeg", "xml", "bmp")
-
- $allowedExtensions = array("jpeg","gif","png","jpg");
-
- // max file size in bytes
-
- $sizeLimit = get_config('system','maximagesize'); //6 * 1024 * 1024;
-
- $uploader = new qqFileUploader($allowedExtensions, $sizeLimit);
-
- $result = $uploader->handleUpload();
-
-
- // to pass data through iframe you will need to encode all html tags
- $a->data['upload_jsonresponse'] = htmlspecialchars(json_encode($result), ENT_NOQUOTES);
-
- if(isset($result['error'])) {
- logger('mod/photos.php: photos_post(): error uploading photo: ' . $result['error'] , 'LOGGER_DEBUG');
- echo json_encode($result);
- killme();
- }
-
- $a->data['upload_result'] = $result;
-
-}
-
-function js_upload_post_file(&$a,&$b) {
-
- $result = $a->data['upload_result'];
-
- $b['src'] = $result['path'];
- $b['filename'] = $result['filename'];
- $b['filesize'] = filesize($b['src']);
-
-}
-
-
-function js_upload_post_end(&$a,&$b) {
-
-logger('upload_post_end');
- if(x($a->data,'upload_jsonresponse')) {
- echo $a->data['upload_jsonresponse'];
- killme();
- }
-
-}
-
-
-/**
- * Handle file uploads via XMLHttpRequest
- */
-class qqUploadedFileXhr {
-
- private $pathnm = '';
-
- /**
- * Save the file in the temp dir.
- * @return boolean TRUE on success
- */
- function save() {
- $input = fopen("php://input", "r");
- $this->pathnm = tempnam(sys_get_temp_dir(),'frn');
- $temp = fopen($this->pathnm,"w");
- $realSize = stream_copy_to_stream($input, $temp);
-
- fclose($input);
- fclose($temp);
-
- if ($realSize != $this->getSize()){
- return false;
- }
- return true;
- }
-
- function getPath() {
- return $this->pathnm;
- }
-
- function getName() {
- return $_GET['qqfile'];
- }
-
- function getSize() {
- if (isset($_SERVER["CONTENT_LENGTH"])){
- return (int)$_SERVER["CONTENT_LENGTH"];
- } else {
- throw new Exception('Getting content length is not supported.');
- }
- }
-}
-
-/**
- * Handle file uploads via regular form post (uses the $_FILES array)
- */
-
-class qqUploadedFileForm {
-
-
- /**
- * Save the file to the specified path
- * @return boolean TRUE on success
- */
-
-
- function save() {
- return true;
- }
-
- function getPath() {
- return $_FILES['qqfile']['tmp_name'];
- }
-
- function getName() {
- return $_FILES['qqfile']['name'];
- }
- function getSize() {
- return $_FILES['qqfile']['size'];
- }
-}
-
-class qqFileUploader {
- private $allowedExtensions = array();
- private $sizeLimit = 10485760;
- private $file;
-
- function __construct(array $allowedExtensions = array(), $sizeLimit = 10485760){
- $allowedExtensions = array_map("strtolower", $allowedExtensions);
-
- $this->allowedExtensions = $allowedExtensions;
- $this->sizeLimit = $sizeLimit;
-
- if (isset($_GET['qqfile'])) {
- $this->file = new qqUploadedFileXhr();
- } elseif (isset($_FILES['qqfile'])) {
- $this->file = new qqUploadedFileForm();
- } else {
- $this->file = false;
- }
-
- }
-
-
- private function toBytes($str){
- $val = trim($str);
- $last = strtolower($str[strlen($str)-1]);
- switch($last) {
- case 'g': $val *= 1024;
- case 'm': $val *= 1024;
- case 'k': $val *= 1024;
- }
- return $val;
- }
-
- /**
- * Returns array('success'=>true) or array('error'=>'error message')
- */
- function handleUpload(){
-
- if (!$this->file){
- return array('error' => t('No files were uploaded.'));
- }
-
- $size = $this->file->getSize();
-
- if ($size == 0) {
- return array('error' => t('Uploaded file is empty'));
- }
-
-// if ($size > $this->sizeLimit) {
-
-// return array('error' => t('Uploaded file is too large'));
-// }
-
-
- $maximagesize = get_config('system','maximagesize');
-
- if(($maximagesize) && ($size > $maximagesize)) {
- return array('error' => t('Image exceeds size limit of ') . $maximagesize );
-
- }
-
- $pathinfo = pathinfo($this->file->getName());
- $filename = $pathinfo['filename'];
-
- $ext = $pathinfo['extension'];
-
- if($this->allowedExtensions && !in_array(strtolower($ext), $this->allowedExtensions)){
- $these = implode(', ', $this->allowedExtensions);
- return array('error' => t('File has an invalid extension, it should be one of ') . $these . '.');
- }
-
- if ($this->file->save()){
- return array(
- 'success'=>true,
- 'path' => $this->file->getPath(),
- 'filename' => $filename . '.' . $ext
- );
- } else {
- return array(
- 'error'=> t('Upload was cancelled, or server error encountered'),
- 'path' => $this->file->getPath(),
- 'filename' => $filename . '.' . $ext
- );
- }
-
- }
-}
diff --git a/addon/ldapauth/README b/addon/ldapauth/README
deleted file mode 100644
index cf28ef1e0..000000000
--- a/addon/ldapauth/README
+++ /dev/null
@@ -1,17 +0,0 @@
-Authenticate a user against an LDAP directory
-Useful for Windows Active Directory and other LDAP-based organisations
-to maintain a single password across the organisation.
-
-Optionally authenticates only if a member of a given group in the directory.
-
-The person must have registered with Friendika using the normal registration
-procedures in order to have a Friendika user record, contact, and profile.
-
-Note when using with Windows Active Directory: you may need to set TLS_CACERT in your site
-ldap.conf file to the signing cert for your LDAP server.
-
-The required configuration options for this module may be set in the .htconfig.php file
-e.g.:
-
-$a->config['ldapauth']['ldap_server'] = 'host.example.com';
-...etc.
diff --git a/addon/ldapauth/ldapauth.php b/addon/ldapauth/ldapauth.php
deleted file mode 100644
index 7230302e9..000000000
--- a/addon/ldapauth/ldapauth.php
+++ /dev/null
@@ -1,130 +0,0 @@
-<?php
-/**
- * Name: LDAP Authenticate
- * Description: Authenticate a user against an LDAP directory
- * Version: 1.0
- * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
- */
-
-/**
- * Friendika addon
- *
- * Module: LDAP Authenticate
- *
- * Authenticate a user against an LDAP directory
- * Useful for Windows Active Directory and other LDAP-based organisations
- * to maintain a single password across the organisation.
- *
- * Optionally authenticates only if a member of a given group in the directory.
- *
- * The person must have registered with Friendika using the normal registration
- * procedures in order to have a Friendika user record, contact, and profile.
- *
- * Note when using with Windows Active Directory: you may need to set TLS_CACERT in your site
- * ldap.conf file to the signing cert for your LDAP server.
- *
- * The required configuration options for this module may be set in the .htconfig.php file
- * e.g.:
- *
- * $a->config['ldapauth']['ldap_server'] = 'host.example.com';
- * ...etc.
- *
- */
-
-
-
-function ldapauth_install() {
- register_hook('authenticate', 'addon/ldapauth/ldapauth.php', 'ldapauth_hook_authenticate');
-}
-
-
-function ldapauth_uninstall() {
- unregister_hook('authenticate', 'addon/ldapauth/ldapauth.php', 'ldapauth_hook_authenticate');
-}
-
-
-function ldapauth_hook_authenticate($a,&$b) {
- if(ldapauth_authenticate($b['username'],$b['password'])) {
- $results = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `blocked` = 0 AND `verified` = 1 LIMIT 1",
- dbesc($b['username'])
- );
- if(count($results)) {
- $b['user_record'] = $results[0];
- $b['authenticated'] = 1;
- }
- }
- return;
-}
-
-
-function ldapauth_authenticate($username,$password) {
-
- $ldap_server = get_config('ldapauth','ldap_server');
- $ldap_binddn = get_config('ldapauth','ldap_binddn');
- $ldap_bindpw = get_config('ldapauth','ldap_bindpw');
- $ldap_searchdn = get_config('ldapauth','ldap_searchdn');
- $ldap_userattr = get_config('ldapauth','ldap_userattr');
- $ldap_group = get_config('ldapauth','ldap_group');
-
- if(! ((strlen($password))
- && (function_exists('ldap_connect'))
- && (strlen($ldap_server))))
- return false;
-
- $connect = @ldap_connect($ldap_server);
-
- if(! $connect)
- return false;
-
- @ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION,3);
- @ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);
- if((@ldap_bind($connect,$ldap_binddn,$ldap_bindpw)) === false) {
- return false;
- }
-
- $res = @ldap_search($connect,$ldap_searchdn, $ldap_userattr . '=' . $username);
-
- if(! $res) {
- return false;
- }
-
- $id = @ldap_first_entry($connect,$res);
-
- if(! $id) {
- return false;
- }
-
- $dn = @ldap_get_dn($connect,$id);
-
- if(! @ldap_bind($connect,$dn,$password))
- return false;
-
- if(! strlen($ldap_group))
- return true;
-
- $r = @ldap_compare($connect,$ldap_group,'member',$dn);
- if ($r === -1) {
- $err = @ldap_error($connect);
- $eno = @ldap_errno($connect);
- @ldap_close($connect);
-
- if ($eno === 32) {
- logger("ldapauth: access control group Does Not Exist");
- return false;
- }
- elseif ($eno === 16) {
- logger('ldapauth: membership attribute does not exist in access control group');
- return false;
- }
- else {
- logger('ldapauth: error: ' . $err);
- return false;
- }
- }
- elseif ($r === false) {
- @ldap_close($connect);
- return false;
- }
-
- return true;
-}
diff --git a/addon/oembed/oembed.js b/addon/oembed/oembed.js
deleted file mode 100644
index f8e957413..000000000
--- a/addon/oembed/oembed.js
+++ /dev/null
@@ -1,6 +0,0 @@
-function oembed(){
- var reply = prompt("$oembed_message:");
- if(reply && reply.length) {
- tinyMCE.execCommand('mceInsertRawHTML',false, "[embed]"+reply+"[/embed]" );
- }
-}
diff --git a/addon/oembed/oembed.php b/addon/oembed/oembed.php
deleted file mode 100644
index 880e4992f..000000000
--- a/addon/oembed/oembed.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-/**
- * Name: OEmbed
- * Description: OEmbed is a format for allowing an embedded representation of a URL on third party sites http://www.oembed.com/
- * Version: 1.2
- * Author: Fabio Comuni <http://kirgroup.com/profile/fabrix>
- */
-
-require_once('include/oembed.php');
-
-function oembed_install() {
- register_hook('jot_tool', 'addon/oembed/oembed.php', 'oembed_hook_jot_tool');
- register_hook('page_header', 'addon/oembed/oembed.php', 'oembed_hook_page_header');
- register_hook('plugin_settings', 'addon/oembed/oembed.php', 'oembed_settings');
- register_hook('plugin_settings_post', 'addon/oembed/oembed.php', 'oembed_settings_post');
-}
-
-function oembed_uninstall() {
- unregister_hook('jot_tool', 'addon/oembed/oembed.php', 'oembed_hook_jot_tool');
- unregister_hook('page_header', 'addon/oembed/oembed.php', 'oembed_hook_page_header');
- unregister_hook('plugin_settings', 'addon/oembed/oembed.php', 'oembed_settings');
- unregister_hook('plugin_settings_post', 'addon/oembed/oembed.php', 'oembed_settings_post');
-}
-
-function oembed_settings_post($a,$b){
- if(! local_user())
- return;
- if (x($_POST,'oembed-submit')){
- set_pconfig(local_user(), 'oembed', 'use_for_youtube', (x($_POST,'oembed_use_for_youtube')? intval($_POST['oembed_use_for_youtube']):0));
- info( t('OEmbed settings updated') . EOL);
- }
-}
-
-function oembed_settings(&$a,&$o) {
- if(! local_user())
- return;
- $uofy = intval(get_pconfig(local_user(), 'oembed', 'use_for_youtube' ));
-
- $t = file_get_contents( dirname(__file__). "/settings.tpl" );
- $o .= replace_macros($t, array(
- '$submit' => t('Submit'),
- '$title' => "OEmbed",
- '$useoembed' => array('oembed_use_for_youtube', t('Use OEmbed for YouTube videos'), $uofy, ""),
- ));
-
-}
-
-
-function oembed_hook_page_header($a, &$b){
- $a->page['htmlhead'] .= sprintf('<script src="%s/oembed/oembed.js"></script>', $a->get_baseurl());
-}
-
-
-function oembed_hook_jot_tool($a, &$b) {
- $b .= '
- <div class="tool-wrapper" style="display: $visitor;" >
- <img class="tool-link" src="addon/oembed/oembed.png" alt="Embed" title="Embed" onclick="oembed();" />
- </div>
- ';
-}
-
-
-function oembed_module() {
- return;
-}
-
-function oembed_init(&$a) {
- if ($a->argv[1]=='oembed.js'){
- $tpl = file_get_contents('addon/oembed/oembed.js');
- echo replace_macros($tpl, array(
- '$oembed_message' => t('URL to embed:'),
- ));
- }
-
- if ($a->argv[1]=='b2h'){
- $url = array( "", trim(hex2bin($_GET['url'])));
- echo oembed_replacecb($url);
- }
-
- if ($a->argv[1]=='h2b'){
- $text = trim(hex2bin($_GET['text']));
- echo oembed_html2bbcode($text);
- }
-
- killme();
-
-}
-
-?>
diff --git a/addon/oembed/oembed.png b/addon/oembed/oembed.png
deleted file mode 100644
index 6fc3794bb..000000000
--- a/addon/oembed/oembed.png
+++ /dev/null
Binary files differ
diff --git a/addon/oembed/settings.tpl b/addon/oembed/settings.tpl
deleted file mode 100644
index 5a65ef8e5..000000000
--- a/addon/oembed/settings.tpl
+++ /dev/null
@@ -1,7 +0,0 @@
-<div class="settings-block">
- <h3 class="settings-heading">$title</h3>
- {{ inc field_checkbox.tpl with $field=$useoembed }}{{ endinc }}
- <div class="settings-submit-wrapper">
- <input type="submit" value="$submit" class="settings-submit" name="oembed-submit" />
- </div>
-</div>
diff --git a/addon/piwik/README b/addon/piwik/README
deleted file mode 100644
index 20b78b51e..000000000
--- a/addon/piwik/README
+++ /dev/null
@@ -1,43 +0,0 @@
-____ Piwik Plugin ____
-by Tobias Diekershoff
- tobias.diekershoff(at)gmx.net
-
-This addon allows you to embed the code necessary for the FLOSS webanalytics
-tool piwik into the Friendika pages.
-
-Online version of this Document: http://ur1.ca/35m2x
-
-___ Requirements ___
-
-To use this plugin you need a "piwik":http://piwik.org installation.
-
-___ Where to find ___
-
-In the Friendika git repository @/addon/piwik/piwik.php@ and a CSS file for
-styling the opt-out notice.
-
-___ Configuration ___
-
-Open the .htconfig.php file and add "piwik" to the list of activated addons.
- $a->config['system']['addon'] = "piwik, ..."
-You have to add 3 more configuration variables for the addon:
-
-$a->config['piwik']['baseurl'] = 'example.com/piwik/';
-$a->config['piwik']['sideid'] = '1';
-$a->config['piwik']['optout'] = true;
-
-The *baseurl* points to your piwik installation. Use the absolute path,
-remember trailing slashes but ignore the protocol (http/s) part of the URL.
-Change the *sideid* parameter to whatever ID you want to use for tracking your
-Friendika installation. The *optout* parameter (true|false) defines whether or
-not a short notice about the utilization of piwik will be displayed on every
-page of your Friendika site (at the bottom of the page with some spacing to the
-other content). Part of the note is a link that allows the visitor to set an
-_opt-out_ cookie which will prevent visits from that user be tracked by piwik.
-
-Currently the optional notice states the following:
-
- This website is tracked using the Piwik analytics tool. If you do not want
- that your visits are logged this way you can set a cookie to prevent Piwik
- from tracking further visits of the site (opt-out).
-
diff --git a/addon/piwik/admin.tpl b/addon/piwik/admin.tpl
deleted file mode 100644
index 0edd06210..000000000
--- a/addon/piwik/admin.tpl
+++ /dev/null
@@ -1,4 +0,0 @@
-{{ inc field_input.tpl with $field=$baseurl }}{{ endinc }}
-{{ inc field_input.tpl with $field=$siteid }}{{ endinc }}
-{{ inc field_checkbox.tpl with $field=$optout }}{{ endinc }}
-<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
diff --git a/addon/piwik/piwik.css b/addon/piwik/piwik.css
deleted file mode 100644
index bb43b67ea..000000000
--- a/addon/piwik/piwik.css
+++ /dev/null
@@ -1,8 +0,0 @@
-#piwik-optout-link {
- padding: 100px 50px;
- text-align: justify;
- font-size: 0.85em;
-}
-#piwik-code-block {
- display: none;
-}
diff --git a/addon/piwik/piwik.php b/addon/piwik/piwik.php
deleted file mode 100644
index 890309d4f..000000000
--- a/addon/piwik/piwik.php
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-/**
- * Name: Piwik Analytics
- * Description: Piwik Analytics Plugin for Friendika
- * Version: 1.0
- * Author: Tobias Diekershoff <https://diekershoff.homeunix.net/friendika/profile/tobias>
- */
-
-
-/* Piwik Analytics Plugin for Friendika
- *
- * Author: Tobias Diekershoff
- * tobias.diekershoff@gmx.net
- *
-* License: 3-clause BSD license
- *
- * Configuration:
- * Add the following two lines to your .htconfig.php file:
- *
- * $a->config['piwik']['baseurl'] = 'www.example.com/piwik/';
- * $a->config['piwik']['siteid'] = '1';
- * $a->config['piwik']['optout'] = true; // set to false to disable
- *
- * Change the siteid to the ID that the Piwik tracker for your Friendika
- * installation has. Alter the baseurl to fit your needs, don't care
- * about http/https but beware to put the trailing / at the end of your
- * setting.
- *
- * Documentation see http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Piwik_Plugin
- */
-
-function piwik_install() {
- register_hook('page_end', 'addon/piwik/piwik.php', 'piwik_analytics');
-
- logger("installed piwik plugin");
-}
-
-function piwik_uninstall() {
- unregister_hook('page_end', 'addon/piwik/piwik.php', 'piwik_analytics');
-
- logger("uninstalled piwik plugin");
-}
-
-function piwik_analytics($a,&$b) {
-
- /*
- * styling of every HTML block added by this plugin is done in the
- * associated CSS file. We just have to tell Friendika to get it
- * into the page header.
- */
- $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' . $a->get_baseurl() . '/addon/piwik/piwik.css' . '" media="all" />' . "\r\n";
-
- /*
- * Get the configuration variables from the .htconfig file.
- */
- $baseurl = get_config('piwik','baseurl');
- $siteid = get_config('piwik','siteid');
- $optout = get_config('piwik','optout');
-
- /*
- * Add the Piwik code for the site.
- */
- $b .= "<div id='piwik-code-block'> <!-- Piwik -->\r\n <script type=\"text/javascript\">\r\n var pkBaseURL = ((\"https:\" == document.location.protocol) ? \"https://".$baseurl."\" : \"http://".$baseurl."\");\r\n document.write(unescape(\"%3Cscript src='\" + pkBaseURL + \"piwik.js' type='text/javascript'%3E%3C/script%3E\"));\r\n </script>\r\n<script type=\"text/javascript\">\r\n try {\r\n var piwikTracker = Piwik.getTracker(pkBaseURL + \"piwik.php\", ".$siteid.");\r\n piwikTracker.trackPageView();\r\n piwikTracker.enableLinkTracking();\r\n }\r\n catch( err ) {}\r\n </script>\r\n<noscript><p><img src=\"http://".$baseurl."/piwik.php?idsite=".$siteid."\" style=\"border:0\" alt=\"\" /></p></noscript>\r\n <!-- End Piwik Tracking Tag --> </div>";
- /*
- * If the optout variable is set to true then display the notice
- * otherwise just include the above code into the page.
- */
- if ($optout) {
- $b .= "<div id='piwik-optout-link'>";
- $b .= t("This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool.");
- $b .= " ";
- $the_url = "http://".$baseurl ."index.php?module=CoreAdminHome&action=optOut";
- $b .= sprintf(t("If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."), $the_url);
- $b .= "</div>";
- }
-
-}
-function piwik_plugin_admin (&$a, &$o) {
- $t = file_get_contents( dirname(__file__)."/admin.tpl");
- $o = replace_macros( $t, array(
- '$submit' => t('Submit'),
- '$baseurl' => array('baseurl', t('Piwik Base URL'), get_config('piwik','baseurl' ), ''),
- '$siteid' => array('siteid', t('Site ID'), get_config('piwik','siteid' ), ''),
- '$optout' => array('optout', t('Show opt-out cookie link?'), get_config('piwik','optout' ), ''),
- ));
-}
-function piwik_plugin_admin_post (&$a) {
- $url = ((x($_POST, 'baseurl')) ? notags(trim($_POST['baseurl'])) : '');
- $id = ((x($_POST, 'siteid')) ? trim($_POST['siteid']) : '');
- $optout = ((x($_POST, 'optout')) ? trim($_POST['optout']) : '');
- set_config('piwik', 'baseurl', $url);
- set_config('piwik', 'siteid', $id);
- set_config('piwik', 'optout', $optout);
- info( t('Settings updated.'). EOL);
-}
diff --git a/addon/poormancron/poormancron.php b/addon/poormancron/poormancron.php
deleted file mode 100644
index bbe023cd7..000000000
--- a/addon/poormancron/poormancron.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-/**
- * Name: Poor Man Cron
- * Description: Execute updates on pageviews, without the need of commandline php
- * Version: 1.2
- * Author: Fabio Comuni <http://kirgroup.com/profile/fabrix>
- */
-
-function poormancron_install() {
- // check for command line php
- $a = get_app();
- $ex = Array();
- $ex[0] = ((x($a->config,'php_path')) && (strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php');
- $ex[1] = dirname(dirname(dirname(__file__)))."/testargs.php";
- $ex[2] = "test";
- $out = exec(implode(" ", $ex));
- if ($out==="test") {
- set_config('poormancron','usecli',1);
- logger("poormancron will use cli php");
- } else {
- set_config('poormancron','usecli',0);
- logger("poormancron will NOT use cli php");
- }
-
- register_hook('page_end', 'addon/poormancron/poormancron.php', 'poormancron_hook');
- register_hook('proc_run', 'addon/poormancron/poormancron.php','poormancron_procrun');
- logger("installed poormancron");
-}
-
-function poormancron_uninstall() {
- unregister_hook('page_end', 'addon/poormancron/poormancron.php', 'poormancron_hook');
- unregister_hook('proc_run', 'addon/poormancron/poormancron.php','poormancron_procrun');
- logger("removed poormancron");
-}
-
-
-
-function poormancron_hook(&$a,&$b) {
- $now = time();
- $lastupdate = get_config('poormancron', 'lastupdate');
-
- // 300 secs, 5 mins
- if (!$lastupdate || ($now-$lastupdate)>300) {
- set_config('poormancron','lastupdate', $now);
- proc_run('php',"include/poller.php");
- }
-}
-
-function poormancron_procrun(&$a, &$arr) {
- if (get_config('poormancron','usecli')==1) return;
- $argv = $arr['args'];
- $arr['run_cmd'] = false;
- logger("poormancron procrun ".implode(", ",$argv));
- array_shift($argv);
- $argc = count($argv);
- logger("poormancron procrun require_once ".basename($argv[0]));
- require_once(basename($argv[0]));
- $funcname=str_replace(".php", "", basename($argv[0]))."_run";
-
- $funcname($argv, $argc);
-}
-
-
-?>
diff --git a/addon/randplace/randplace.css b/addon/randplace/randplace.css
deleted file mode 100644
index bd7af6d74..000000000
--- a/addon/randplace/randplace.css
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-#randplace-enable-label {
- float: left;
- width: 200px;
- margin-bottom: 25px;
-}
-
-#randplace-checkbox {
- float: left;
-}
-
-
diff --git a/addon/randplace/randplace.php b/addon/randplace/randplace.php
deleted file mode 100644
index bae8e7c69..000000000
--- a/addon/randplace/randplace.php
+++ /dev/null
@@ -1,180 +0,0 @@
-<?php
-/**
- * Name: Random place
- * Description: Sample Friendika plugin/addon. Set a random place when posting.
- * Version: 1.0
- * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
- *
- *
- *
- *
- * Addons are registered with the system in the
- * .htconfig.php file.
- *
- * $a->config['system']['addon'] = 'plugin1,plugin2,etc.';
- *
- * When registration is detected, the system calls the plugin
- * name_install() function, located in 'addon/name/name.php',
- * where 'name' is the name of the addon.
- * If the addon is removed from the configuration list, the
- * system will call the name_uninstall() function.
- *
- */
-
-
-function randplace_install() {
-
- /**
- *
- * Our demo plugin will attach in three places.
- * The first is just prior to storing a local post.
- *
- */
-
- register_hook('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
-
- /**
- *
- * Then we'll attach into the plugin settings page, and also the
- * settings post hook so that we can create and update
- * user preferences.
- *
- */
-
- register_hook('plugin_settings', 'addon/randplace/randplace.php', 'randplace_settings');
- register_hook('plugin_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
-
- logger("installed randplace");
-}
-
-
-function randplace_uninstall() {
-
- /**
- *
- * uninstall unregisters any hooks created with register_hook
- * during install. It may also delete configuration settings
- * and any other cleanup.
- *
- */
-
- unregister_hook('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
- unregister_hook('plugin_settings', 'addon/randplace/randplace.php', 'randplace_settings');
- unregister_hook('plugin_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
-
-
- logger("removed randplace");
-}
-
-
-
-function randplace_post_hook($a, &$item) {
-
- /**
- *
- * An item was posted on the local system.
- * We are going to look for specific items:
- * - A status post by a profile owner
- * - The profile owner must have allowed our plugin
- *
- */
-
- logger('randplace invoked');
-
- if(! local_user()) /* non-zero if this is a logged in user of this system */
- return;
-
- if(local_user() != $item['uid']) /* Does this person own the post? */
- return;
-
- if($item['parent']) /* If the item has a parent, this is a comment or something else, not a status post. */
- return;
-
- /* Retrieve our personal config setting */
-
- $active = get_pconfig(local_user(), 'randplace', 'enable');
-
- if(! $active)
- return;
-
- /**
- *
- * OK, we're allowed to do our stuff.
- * Here's what we are going to do:
- * load the list of timezone names, and use that to generate a list of world cities.
- * Then we'll pick one of those at random and put it in the "location" field for the post.
- *
- */
-
- $cities = array();
- $zones = timezone_identifiers_list();
- foreach($zones as $zone) {
- if((strpos($zone,'/')) && (! stristr($zone,'US/')) && (! stristr($zone,'Etc/')))
- $cities[] = str_replace('_', ' ',substr($zone,strpos($zone,'/') + 1));
- }
-
- if(! count($cities))
- return;
- $city = array_rand($cities,1);
- $item['location'] = $cities[$city];
-
- return;
-}
-
-
-
-
-/**
- *
- * Callback from the settings post function.
- * $post contains the $_POST array.
- * We will make sure we've got a valid user account
- * and if so set our configuration setting for this person.
- *
- */
-
-function randplace_settings_post($a,$post) {
- if(! local_user())
- return;
- set_pconfig(local_user(),'randplace','enable',intval($_POST['randplace']));
-}
-
-
-/**
- *
- * Called from the Plugin Setting form.
- * Add our own settings info to the page.
- *
- */
-
-
-
-function randplace_settings(&$a,&$s) {
-
- if(! local_user())
- return;
-
- /* Add our stylesheet to the page so we can make our settings look nice */
-
- $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' . $a->get_baseurl() . '/addon/randplace/randplace.css' . '" media="all" />' . "\r\n";
-
- /* Get the current state of our config variable */
-
- $enabled = get_pconfig(local_user(),'randplace','enable');
-
- $checked = (($enabled) ? ' checked="checked" ' : '');
-
- /* Add some HTML to the existing form */
-
- $s .= '<div class="settings-block">';
- $s .= '<h3>' . t('Randplace Settings') . '</h3>';
- $s .= '<div id="randplace-enable-wrapper">';
- $s .= '<label id="randplace-enable-label" for="randplace-checkbox">' . t('Enable Randplace Plugin') . '</label>';
- $s .= '<input id="randplace-checkbox" type="checkbox" name="randplace" value="1" ' . $checked . '/>';
- $s .= '</div><div class="clear"></div>';
-
- /* provide a submit button */
-
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>';
-
-}
diff --git a/addon/sniper/100x100.gif b/addon/sniper/100x100.gif
deleted file mode 100644
index 33708302f..000000000
--- a/addon/sniper/100x100.gif
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/100x100.jpg b/addon/sniper/100x100.jpg
deleted file mode 100644
index 315bd664b..000000000
--- a/addon/sniper/100x100.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/100x75.jpg b/addon/sniper/100x75.jpg
deleted file mode 100644
index 693e7c9d4..000000000
--- a/addon/sniper/100x75.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/100x80.jpg b/addon/sniper/100x80.jpg
deleted file mode 100644
index 594391e2c..000000000
--- a/addon/sniper/100x80.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/120x90hotshotsniper.jpg b/addon/sniper/120x90hotshotsniper.jpg
deleted file mode 100644
index 52d0f005d..000000000
--- a/addon/sniper/120x90hotshotsniper.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/125x125.jpg b/addon/sniper/125x125.jpg
deleted file mode 100644
index 047a505fd..000000000
--- a/addon/sniper/125x125.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/140x90.jpg b/addon/sniper/140x90.jpg
deleted file mode 100644
index e98df44e2..000000000
--- a/addon/sniper/140x90.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/150x150.jpg b/addon/sniper/150x150.jpg
deleted file mode 100644
index 225d1e9c1..000000000
--- a/addon/sniper/150x150.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/160x86.gif b/addon/sniper/160x86.gif
deleted file mode 100644
index da72f3e92..000000000
--- a/addon/sniper/160x86.gif
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/180x135.jpg b/addon/sniper/180x135.jpg
deleted file mode 100644
index 6fdfaf320..000000000
--- a/addon/sniper/180x135.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/250x180.jpg b/addon/sniper/250x180.jpg
deleted file mode 100644
index 41fbe9f6e..000000000
--- a/addon/sniper/250x180.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/300x200.jpg b/addon/sniper/300x200.jpg
deleted file mode 100644
index 0aeef9a7d..000000000
--- a/addon/sniper/300x200.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/300x300.jpg b/addon/sniper/300x300.jpg
deleted file mode 100644
index d4d4f2748..000000000
--- a/addon/sniper/300x300.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/32x32.jpg b/addon/sniper/32x32.jpg
deleted file mode 100644
index 8b4c20934..000000000
--- a/addon/sniper/32x32.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/335x185.jpg b/addon/sniper/335x185.jpg
deleted file mode 100644
index 9bb38c1a5..000000000
--- a/addon/sniper/335x185.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/60x60.jpg b/addon/sniper/60x60.jpg
deleted file mode 100644
index 4ad725772..000000000
--- a/addon/sniper/60x60.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/64x64.gif b/addon/sniper/64x64.gif
deleted file mode 100644
index cbb89e661..000000000
--- a/addon/sniper/64x64.gif
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/70x45.jpg b/addon/sniper/70x45.jpg
deleted file mode 100644
index b722a5a0a..000000000
--- a/addon/sniper/70x45.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/70x60.jpg b/addon/sniper/70x60.jpg
deleted file mode 100644
index 581521985..000000000
--- a/addon/sniper/70x60.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/73x80.jpg b/addon/sniper/73x80.jpg
deleted file mode 100644
index 9f6753ec1..000000000
--- a/addon/sniper/73x80.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/75x57.jpg b/addon/sniper/75x57.jpg
deleted file mode 100644
index 54753f1e5..000000000
--- a/addon/sniper/75x57.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/80x60.jpg b/addon/sniper/80x60.jpg
deleted file mode 100644
index dfd0b371e..000000000
--- a/addon/sniper/80x60.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/80x70.jpg b/addon/sniper/80x70.jpg
deleted file mode 100644
index 2f416fa67..000000000
--- a/addon/sniper/80x70.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/80x80hotshotsniper.jpg b/addon/sniper/80x80hotshotsniper.jpg
deleted file mode 100644
index db26ff6a7..000000000
--- a/addon/sniper/80x80hotshotsniper.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/81x67.jpg b/addon/sniper/81x67.jpg
deleted file mode 100644
index 0a4d7fdc3..000000000
--- a/addon/sniper/81x67.jpg
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/description_etc.txt b/addon/sniper/description_etc.txt
deleted file mode 100644
index bda05ff56..000000000
--- a/addon/sniper/description_etc.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-Description:
-
-Shoot the targets with your sniper rifle!
-
-Instructions:
-
-Use your mouse to aim and shoot. Press R or Shift to Reload Press Space to use your Scope.
-
-Dimensions:
-
-620x480 \ No newline at end of file
diff --git a/addon/sniper/hotshotsniper.html b/addon/sniper/hotshotsniper.html
deleted file mode 100644
index 8a39b0b0e..000000000
--- a/addon/sniper/hotshotsniper.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-<title>hotshotsniper</title>
-</head>
-<body bgcolor="#000000">
-<!--url's used in the movie-->
-<!--text used in the movie-->
-<!-- saved from url=(0013)about:internet -->
-<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="620" height="480" id="hotshotsniper" align="middle">
-<param name="allowScriptAccess" value="sameDomain" />
-<param name="movie" value="hotshotsniper.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#000000" /><embed src="hotshotsniper.swf" quality="high" bgcolor="#000000" width="620" height="480" name="hotshotsniper" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
-</object>
-</body>
-</html>
diff --git a/addon/sniper/hotshotsniper.swf b/addon/sniper/hotshotsniper.swf
deleted file mode 100644
index b03284a69..000000000
--- a/addon/sniper/hotshotsniper.swf
+++ /dev/null
Binary files differ
diff --git a/addon/sniper/sniper.php b/addon/sniper/sniper.php
deleted file mode 100644
index c7d29cfdf..000000000
--- a/addon/sniper/sniper.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-/**
- * Name: Sniper App
- * Description: Example of flash game application
- * Version: 1.0
- * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
- */
-
-/**
- * Demo plugin for adding various types of Flash games to Friendika.
- * In this case we're using "Hot Shot Sniper" by FlashGames247
- */
-
-
-function sniper_install() {
- register_hook('app_menu', 'addon/sniper/sniper.php', 'sniper_app_menu');
-}
-
-function sniper_uninstall() {
- unregister_hook('app_menu', 'addon/sniper/sniper.php', 'sniper_app_menu');
-
-}
-
-function sniper_app_menu($a,&$b) {
- $b['app_menu'][] = Array('url'=>'sniper', 'name'=>'Hot Shot Sniper');
-}
-
-
-function sniper_module() {}
-
-function sniper_content(&$a) {
-
-$baseurl = $a->get_baseurl() . '/addon/sniper';
-
-$o .= <<< EOT
-<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="620" height="480" id="hotshotsniper" align="middle">
-<param name="allowScriptAccess" value="sameDomain" />
-<param name="movie" value="$baseurl/hotshotsniper.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#000000" /><embed src="$baseurl/hotshotsniper.swf" quality="high" bgcolor="#000000" width="620" height="480" name="hotshotsniper" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
-</object>
-EOT;
-
-return $o;
-}
diff --git a/addon/statusnet/README b/addon/statusnet/README
deleted file mode 100644
index 6ace48284..000000000
--- a/addon/statusnet/README
+++ /dev/null
@@ -1,75 +0,0 @@
-____ StatusNet Plugin ____
-by Tobias Diekershoff
- tobias.diekershoff(at)gmx.net
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!! This addon is currently under development. If you have any problem !!
-!! with it, please contact the Author. !!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-With this addon to Friendika you can give your user the possibility to post
-their public messages to any StatusNet instance (like identi.ca for example).
-The messages will be strapped their rich context and shortened to to the character
-limit of the StatusNet instance in question if necessary. If shortening of the
-message was performed a link will be added to the notice pointing to the
-original message on your server.
-
-There is a similar plugin to forward public messages to Twitter: Twitter Plugin.
-
-Online version of this document: http://ur1.ca/35mpb
-
-___ Requirements ___
-
-Due to the distributed nature of the StatusNet network, each user who wishes to
-forward public messages to a StatusNet account has to get the OAuth credentials
-for themselves, which makes this addon a little bit more user unfriendly than
-the Twitter Plugin is. Nothing too geeky though!
-
-The inclusion of a shorturl for the original posting in cases when the message
-was longer than the maximal allowed notice length requires it, that you have
-PHP5+ and curl on your server.
-Where to find
-
-In the Friendika git repository /addon/statusnet/, this directory contains all
-required PHP files (including the Twitter OAuth library [1] by Abraham Williams,
-MIT licensed and the Slinky library [2] by Beau Lebens, BSD license), a CSS file
-for styling of the user configuration and an image to Sign in with StatusNet.
-
-[1] https://github.com/abraham/twitteroauth
-[2] http://dentedreality.com.au/projects/slinky
-
-___ Configuration ___
-
-__ Global Configuration __
-
-To activate this addon add statusnet to the list of active addons in your
-.htconfig.php file
- $a->config['system']['addon'] = "statusnet, ...".
-
-__ User Configuration __
-
-When the addon is activated the user has to aquire three things in order to
-connect to the StatusNet account of choice.
- * the base URL for the StatusNet API, for identi.ca this is
- https://identi.ca/api/
- * OAuth Consumer key & secret
-
-To get the OAuth Consumer key pair the user has to (a) ask her Friendika admin
-if a pair already exists or (b) has to register the Friendika server as a
-client application on the StatusNet server. This can be done from the account
-settings under "Connect -> Connections -> Register an OAuth client application
--> Register a new application".
-
-During the registration of the OAuth client remember the following:
- * there is no callback url
- * register a desktop client
- * with read & write access
- * the Source URL should be the URL of your Friendika server
-
-After the required credentials for the application are stored in the
-configuration you have to actually connect your Friendika account with
-StatusNet. To do so follow the Sign in with StatusNet button, allow the access
-and copy the security code into the plugin configuration. Friendika will then
-try to acquire the final OAuth credentials from the API, if successful the
-plugin settings will allow you to select to post your public messages to your
-StatusNet account.
diff --git a/addon/statusnet/admin.tpl b/addon/statusnet/admin.tpl
deleted file mode 100644
index b40adf35a..000000000
--- a/addon/statusnet/admin.tpl
+++ /dev/null
@@ -1,16 +0,0 @@
-{{ for $sites as $s }}
- {{ inc field_input.tpl with $field=$s.sitename }}{{ endinc }}
- {{ inc field_input.tpl with $field=$s.apiurl }}{{ endinc }}
- {{ inc field_input.tpl with $field=$s.secret }}{{ endinc }}
- {{ inc field_input.tpl with $field=$s.key }}{{ endinc }}
- {{ if $s.delete }}
- {{ inc field_checkbox.tpl with $field=$s.delete }}{{ endinc }}
- <hr>
- {{ else }}
- <p>Fill this form to add a new site</p>
- {{ endif }}
-
-{{ endfor }}
-
-
-<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
diff --git a/addon/statusnet/signinwithstatusnet.png b/addon/statusnet/signinwithstatusnet.png
deleted file mode 100644
index a33998d5c..000000000
--- a/addon/statusnet/signinwithstatusnet.png
+++ /dev/null
Binary files differ
diff --git a/addon/statusnet/statusnet.css b/addon/statusnet/statusnet.css
deleted file mode 100644
index 6c1347fc7..000000000
--- a/addon/statusnet/statusnet.css
+++ /dev/null
@@ -1,74 +0,0 @@
-
-
-#statusnet-avatar {
- float: left;
- width: 48px;
- height: 48px;
- padding: 2px;
-}
-#statusnet-info-block {
- height: 52px;
- vertical-align: middle;
-}
-#statusnet-disconnect-label {
- float: left;
- width: 250px;
- margin-bottom: 25px;
-}
-#statusnet-default-label {
- float: left;
- width: 250px;
- margin-bottom: 25px;
-}
-
-#statusnet-disconnect {
- float: left;
-}
-
-#statusnet-enable-label {
- float: left;
- width: 250px;
- margin-bottom: 5px;
-}
-
-#statusnet-checkbox {
- float: left;
-}
-
-#statusnet-pin-label {
- float: left;
- width: 250px;
- margin-bottom: 25px;
-}
-#statusnet-pin {
- float: left;
-}
-
-
-#statusnet-consumerkey-label {
- float: left;
- width: 250px;
- margin-bottom: 8px;
-}
-#statusnet-consumerkey {
- float: left;
- margin-bottom: 8px;
-}
-#statusnet-consumersecret-label {
- float: left;
- width: 250px;
- margin-bottom: 8px;
-}
-#statusnet-consumersecret {
- float: left;
- margin-bottom: 8px;
-}
-#statusnet-baseapi-label {
- float: left;
- width: 250px;
- margin-bottom: 25px;
-}
-#statusnet-baseapi {
- float: left;
- margin-bottom: 8px;
-}
diff --git a/addon/statusnet/statusnet.php b/addon/statusnet/statusnet.php
deleted file mode 100644
index 0c0f4ced7..000000000
--- a/addon/statusnet/statusnet.php
+++ /dev/null
@@ -1,480 +0,0 @@
-<?php
-/**
- * Name: StatusNet Connector
- * Version: 1.0.2
- * Author: Tobias Diekershoff <https://diekershoff.homeunix.net/friendika/profile/tobias>
- */
-
-/* StatusNet Plugin for Friendika
- *
- * Author: Tobias Diekershoff
- * tobias.diekershoff@gmx.net
- *
- * License:3-clause BSD license
- *
- * Configuration:
- * To activate the plugin itself add it to the $a->config['system']['addon']
- * setting. After this, your user can configure their Twitter account settings
- * from "Settings -> Plugin Settings".
- *
- * Requirements: PHP5, curl [Slinky library]
- *
- * Documentation: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/StatusNet_Plugin
- */
-
-/* __TODO__
- *
- * - what about multimedia content?
- * so far we just strip HTML tags from the message
- */
-
-
-/***
- * We have to alter the TwitterOAuth class a little bit to work with any StatusNet
- * installation abroad. Basically it's only make the API path variable and be happy.
- *
- * Thank you guys for the Twitter compatible API!
- */
-
-require_once('library/twitteroauth.php');
-
-class StatusNetOAuth extends TwitterOAuth {
- function get_maxlength() {
- $config = $this->get($this->host . 'statusnet/config.json');
- return $config->site->textlimit;
- }
- function accessTokenURL() { return $this->host.'oauth/access_token'; }
- function authenticateURL() { return $this->host.'oauth/authenticate'; }
- function authorizeURL() { return $this->host.'oauth/authorize'; }
- function requestTokenURL() { return $this->host.'oauth/request_token'; }
- function __construct($apipath, $consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL) {
- parent::__construct($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret);
- $this->host = $apipath;
- }
- /**
- * Make an HTTP request
- *
- * @return API results
- *
- * Copied here from the twitteroauth library and complemented by applying the proxy settings of friendika
- */
- function http($url, $method, $postfields = NULL) {
- $this->http_info = array();
- $ci = curl_init();
- /* Curl settings */
- $prx = get_config('system','proxy');
- logger('Proxy SN: '.$prx);
- if(strlen($prx)) {
- curl_setopt($ci, CURLOPT_HTTPPROXYTUNNEL, 1);
- curl_setopt($ci, CURLOPT_PROXY, $prx);
- $prxusr = get_config('system','proxyuser');
- if(strlen($prxusr))
- curl_setopt($ci, CURLOPT_PROXYUSERPWD, $prxusr);
- }
- curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);
- curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
- curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
- curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
- curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));
- curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
- curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));
- curl_setopt($ci, CURLOPT_HEADER, FALSE);
-
- switch ($method) {
- case 'POST':
- curl_setopt($ci, CURLOPT_POST, TRUE);
- if (!empty($postfields)) {
- curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
- }
- break;
- case 'DELETE':
- curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
- if (!empty($postfields)) {
- $url = "{$url}?{$postfields}";
- }
- }
-
- curl_setopt($ci, CURLOPT_URL, $url);
- $response = curl_exec($ci);
- $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
- $this->http_info = array_merge($this->http_info, curl_getinfo($ci));
- $this->url = $url;
- curl_close ($ci);
- return $response;
- }
-}
-
-function statusnet_install() {
- // we need some hooks, for the configuration and for sending tweets
- register_hook('plugin_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
- register_hook('plugin_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
- register_hook('post_local_end', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
- register_hook('jot_networks', 'addon/statusnet/statusnet.php', 'statusnet_jot_nets');
- logger("installed statusnet");
-}
-
-
-function statusnet_uninstall() {
- unregister_hook('plugin_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
- unregister_hook('plugin_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
- unregister_hook('post_local_end', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
- unregister_hook('jot_networks', 'addon/statusnet/statusnet.php', 'statusnet_jot_nets');
-}
-
-function statusnet_jot_nets(&$a,&$b) {
- if(! local_user())
- return;
-
- $statusnet_post = get_pconfig(local_user(),'statusnet','post');
- if(intval($statusnet_post) == 1) {
- $statusnet_defpost = get_pconfig(local_user(),'statusnet','post_by_default');
- $selected = ((intval($statusnet_defpost) == 1) ? ' checked="checked" ' : '');
- $b .= '<div class="profile-jot-net"><input type="checkbox" name="statusnet_enable"' . $selected . 'value="1" /> '
- . t('Post to StatusNet') . '</div>';
- }
-}
-
-
-
-
-function statusnet_settings_post ($a,$post) {
- if(! local_user())
- return;
- // don't check statusnet settings if statusnet submit button is not clicked
- if (!x($_POST,'statusnet-submit')) return;
-
- if (isset($_POST['statusnet-disconnect'])) {
- /***
- * if the statusnet-disconnect checkbox is set, clear the statusnet configuration
- * TODO can we revoke the access tokens at Twitter and do we need to do so?
- */
- del_pconfig( local_user(), 'statusnet', 'consumerkey' );
- del_pconfig( local_user(), 'statusnet', 'consumersecret' );
- del_pconfig( local_user(), 'statusnet', 'post' );
- del_pconfig( local_user(), 'statusnet', 'post_by_default' );
- del_pconfig( local_user(), 'statusnet', 'oauthtoken' );
- del_pconfig( local_user(), 'statusnet', 'oauthsecret' );
- del_pconfig( local_user(), 'statusnet', 'baseapi' );
- } else {
- if (isset($_POST['statusnet-preconf-apiurl'])) {
- /***
- * If the user used one of the preconfigured StatusNet server credentials
- * use them. All the data are available in the global config.
- * Check the API Url never the less and blame the admin if it's not working ^^
- */
- $globalsn = get_config('statusnet', 'sites');
- foreach ( $globalsn as $asn) {
- if ($asn['apiurl'] == $_POST['statusnet-preconf-apiurl'] ) {
- $apibase = $asn['apiurl'];
- $c = fetch_url( $apibase . 'statusnet/version.xml' );
- if (strlen($c) > 0) {
- set_pconfig(local_user(), 'statusnet', 'consumerkey', $asn['consumerkey'] );
- set_pconfig(local_user(), 'statusnet', 'consumersecret', $asn['consumersecret'] );
- set_pconfig(local_user(), 'statusnet', 'baseapi', $asn['apiurl'] );
- } else {
- notice( t('Please contact your site administrator.<br />The provided API URL is not valid.').EOL.$asn['apiurl'].EOL );
- }
- }
- }
- goaway($a->get_baseurl().'/settings/addon');
- } else {
- if (isset($_POST['statusnet-consumersecret'])) {
- // check if we can reach the API of the StatusNet server
- // we'll check the API Version for that, if we don't get one we'll try to fix the path but will
- // resign quickly after this one try to fix the path ;-)
- $apibase = $_POST['statusnet-baseapi'];
- $c = fetch_url( $apibase . 'statusnet/version.xml' );
- if (strlen($c) > 0) {
- // ok the API path is correct, let's save the settings
- set_pconfig(local_user(), 'statusnet', 'consumerkey', $_POST['statusnet-consumerkey']);
- set_pconfig(local_user(), 'statusnet', 'consumersecret', $_POST['statusnet-consumersecret']);
- set_pconfig(local_user(), 'statusnet', 'baseapi', $apibase );
- } else {
- // the API path is not correct, maybe missing trailing / ?
- $apibase = $apibase . '/';
- $c = fetch_url( $apibase . 'statusnet/version.xml' );
- if (strlen($c) > 0) {
- // ok the API path is now correct, let's save the settings
- set_pconfig(local_user(), 'statusnet', 'consumerkey', $_POST['statusnet-consumerkey']);
- set_pconfig(local_user(), 'statusnet', 'consumersecret', $_POST['statusnet-consumersecret']);
- set_pconfig(local_user(), 'statusnet', 'baseapi', $apibase );
- } else {
- // still not the correct API base, let's do noting
- notice( t('We could not contact the StatusNet API with the Path you entered.').EOL );
- }
- }
- goaway($a->get_baseurl().'/settings/addon');
- } else {
- if (isset($_POST['statusnet-pin'])) {
- // if the user supplied us with a PIN from Twitter, let the magic of OAuth happen
- logger('got a StatusNet security code');
- $api = get_pconfig(local_user(), 'statusnet', 'baseapi');
- $ckey = get_pconfig(local_user(), 'statusnet', 'consumerkey' );
- $csecret = get_pconfig(local_user(), 'statusnet', 'consumersecret' );
- // the token and secret for which the PIN was generated were hidden in the settings
- // form as token and token2, we need a new connection to Twitter using these token
- // and secret to request a Access Token with the PIN
- $connection = new StatusNetOAuth($api, $ckey, $csecret, $_POST['statusnet-token'], $_POST['statusnet-token2']);
- $token = $connection->getAccessToken( $_POST['statusnet-pin'] );
- // ok, now that we have the Access Token, save them in the user config
- set_pconfig(local_user(),'statusnet', 'oauthtoken', $token['oauth_token']);
- set_pconfig(local_user(),'statusnet', 'oauthsecret', $token['oauth_token_secret']);
- set_pconfig(local_user(),'statusnet', 'post', 1);
- // reload the Addon Settings page, if we don't do it see Bug #42
- goaway($a->get_baseurl().'/settings/addon');
- } else {
- // if no PIN is supplied in the POST variables, the user has changed the setting
- // to post a tweet for every new __public__ posting to the wall
- set_pconfig(local_user(),'statusnet','post',intval($_POST['statusnet-enable']));
- set_pconfig(local_user(),'statusnet','post_by_default',intval($_POST['statusnet-default']));
- info( t('StatusNet settings updated.') . EOL);
- }}}}
-}
-function statusnet_settings(&$a,&$s) {
- if(! local_user())
- return;
- $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' . $a->get_baseurl() . '/addon/statusnet/statusnet.css' . '" media="all" />' . "\r\n";
- /***
- * 1) Check that we have a base api url and a consumer key & secret
- * 2) If no OAuthtoken & stuff is present, generate button to get some
- * allow the user to cancel the connection process at this step
- * 3) Checkbox for "Send public notices (respect size limitation)
- */
- $api = get_pconfig(local_user(), 'statusnet', 'baseapi');
- $ckey = get_pconfig(local_user(), 'statusnet', 'consumerkey' );
- $csecret = get_pconfig(local_user(), 'statusnet', 'consumersecret' );
- $otoken = get_pconfig(local_user(), 'statusnet', 'oauthtoken' );
- $osecret = get_pconfig(local_user(), 'statusnet', 'oauthsecret' );
- $enabled = get_pconfig(local_user(), 'statusnet', 'post');
- $checked = (($enabled) ? ' checked="checked" ' : '');
- $defenabled = get_pconfig(local_user(),'statusnet','post_by_default');
- $defchecked = (($defenabled) ? ' checked="checked" ' : '');
- $s .= '<div class="settings-block">';
- $s .= '<h3>'. t('StatusNet Posting Settings').'</h3>';
-
- if ( (!$ckey) && (!$csecret) ) {
- /***
- * no consumer keys
- */
- $globalsn = get_config('statusnet', 'sites');
- /***
- * lets check if we have one or more globally configured StatusNet
- * server OAuth credentials in the configuration. If so offer them
- * with a little explanation to the user as choice - otherwise
- * ignore this option entirely.
- */
- if (! $globalsn == null) {
- $s .= '<h4>' . t('Globally Available StatusNet OAuthKeys') . '</h4>';
- $s .= '<p>'. t("There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance \x28see below\x29.") .'</p>';
- $s .= '<div id="statusnet-preconf-wrapper">';
- foreach ($globalsn as $asn) {
- $s .= '<input type="radio" name="statusnet-preconf-apiurl" value="'. $asn['apiurl'] .'">'. $asn['sitename'] .'<br />';
- }
- $s .= '<p></p><div class="clear"></div></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . t('Submit') . '" /></div>';
- }
- $s .= '<h4>' . t('Provide your own OAuth Credentials') . '</h4>';
- $s .= '<p>'. t('No consumer key pair for StatusNet found. Register your Friendika Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.<br />Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendika installation at your favorited StatusNet installation.') .'</p>';
- $s .= '<div id="statusnet-consumer-wrapper">';
- $s .= '<label id="statusnet-consumerkey-label" for="statusnet-consumerkey">'. t('OAuth Consumer Key') .'</label>';
- $s .= '<input id="statusnet-consumerkey" type="text" name="statusnet-consumerkey" size="35" /><br />';
- $s .= '<div class="clear"></div>';
- $s .= '<label id="statusnet-consumersecret-label" for="statusnet-consumersecret">'. t('OAuth Consumer Secret') .'</label>';
- $s .= '<input id="statusnet-consumersecret" type="text" name="statusnet-consumersecret" size="35" /><br />';
- $s .= '<div class="clear"></div>';
- $s .= '<label id="statusnet-baseapi-label" for="statusnet-baseapi">'. t("Base API Path \x28remember the trailing /\x29") .'</label>';
- $s .= '<input id="statusnet-baseapi" type="text" name="statusnet-baseapi" size="35" /><br />';
- $s .= '<p></p><div class="clear"></div></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . t('Submit') . '" /></div>';
- } else {
- /***
- * ok we have a consumer key pair now look into the OAuth stuff
- */
- if ( (!$otoken) && (!$osecret) ) {
- /***
- * the user has not yet connected the account to statusnet
- * get a temporary OAuth key/secret pair and display a button with
- * which the user can request a PIN to connect the account to a
- * account at statusnet
- */
- $connection = new StatusNetOAuth($api, $ckey, $csecret);
- $request_token = $connection->getRequestToken('oob');
- $token = $request_token['oauth_token'];
- /***
- * make some nice form
- */
- $s .= '<p>'. t('To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet.') .'</p>';
- $s .= '<a href="'.$connection->getAuthorizeURL($token,False).'" target="_statusnet"><img src="addon/statusnet/signinwithstatusnet.png" alt="'. t('Log in with StatusNet') .'"></a>';
- $s .= '<div id="statusnet-pin-wrapper">';
- $s .= '<label id="statusnet-pin-label" for="statusnet-pin">'. t('Copy the security code from StatusNet here') .'</label>';
- $s .= '<input id="statusnet-pin" type="text" name="statusnet-pin" />';
- $s .= '<input id="statusnet-token" type="hidden" name="statusnet-token" value="'.$token.'" />';
- $s .= '<input id="statusnet-token2" type="hidden" name="statusnet-token2" value="'.$request_token['oauth_token_secret'].'" />';
- $s .= '</div><div class="clear"></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . t('Submit') . '" /></div>';
- $s .= '<h4>'.t('Cancel Connection Process').'</h4>';
- $s .= '<div id="statusnet-cancel-wrapper">';
- $s .= '<p>'.t('Current StatusNet API is').': '.$api.'</p>';
- $s .= '<label id="statusnet-cancel-label" for="statusnet-cancel">'. t('Cancel StatusNet Connection') . '</label>';
- $s .= '<input id="statusnet-cancel" type="checkbox" name="statusnet-disconnect" value="1" />';
- $s .= '</div><div class="clear"></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . t('Submit') . '" /></div>';
- } else {
- /***
- * we have an OAuth key / secret pair for the user
- * so let's give a chance to disable the postings to statusnet
- */
- $connection = new StatusNetOAuth($api,$ckey,$csecret,$otoken,$osecret);
- $details = $connection->get('account/verify_credentials');
- $s .= '<div id="statusnet-info" ><img id="statusnet-avatar" src="'.$details->profile_image_url.'" /><p id="statusnet-info-block">'. t('Currently connected to: ') .'<a href="'.$details->statusnet_profile_url.'" target="_statusnet">'.$details->screen_name.'</a><br /><em>'.$details->description.'</em></p></div>';
- $s .= '<p>'. t('If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry.') .'</p>';
- $s .= '<div id="statusnet-enable-wrapper">';
- $s .= '<label id="statusnet-enable-label" for="statusnet-checkbox">'. t('Allow posting to StatusNet') .'</label>';
- $s .= '<input id="statusnet-checkbox" type="checkbox" name="statusnet-enable" value="1" ' . $checked . '/>';
- $s .= '<div class="clear"></div>';
- $s .= '<label id="statusnet-default-label" for="statusnet-default">'. t('Send public postings to StatusNet by default') .'</label>';
- $s .= '<input id="statusnet-default" type="checkbox" name="statusnet-default" value="1" ' . $defchecked . '/>';
- $s .= '</div><div class="clear"></div>';
-
- $s .= '<div id="statusnet-disconnect-wrapper">';
- $s .= '<label id="statusnet-disconnect-label" for="statusnet-disconnect">'. t('Clear OAuth configuration') .'</label>';
- $s .= '<input id="statusnet-disconnect" type="checkbox" name="statusnet-disconnect" value="1" />';
- $s .= '</div><div class="clear"></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . t('Submit') . '" /></div>';
- }
- }
- $s .= '</div><div class="clear"></div></div>';
-}
-
-
-function statusnet_post_hook(&$a,&$b) {
-
- /**
- * Post to statusnet
- */
-
- logger('StatusNet post invoked');
-
- if((local_user()) && (local_user() == $b['uid']) && (! $b['private'])) {
-
- // mike 2-9-11 there was a restriction to only allow this for top level posts
- // now relaxed so should allow one's own comments to be forwarded through the connector as well.
-
- // Status.Net is not considered a private network
- if($b['prvnets'])
- return;
-
- load_pconfig(local_user(), 'statusnet');
-
- $api = get_pconfig(local_user(), 'statusnet', 'baseapi');
- $ckey = get_pconfig(local_user(), 'statusnet', 'consumerkey' );
- $csecret = get_pconfig(local_user(), 'statusnet', 'consumersecret' );
- $otoken = get_pconfig(local_user(), 'statusnet', 'oauthtoken' );
- $osecret = get_pconfig(local_user(), 'statusnet', 'oauthsecret' );
-
- if($ckey && $csecret && $otoken && $osecret) {
-
- $statusnet_post = get_pconfig(local_user(),'statusnet','post');
- $statusnet_enable = (($statusnet_post && x($_POST,'statusnet_enable')) ? intval($_POST['statusnet_enable']) : 0);
- // if API is used, default to the chosen settings
- if($_POST['api_source'] && intval(get_pconfig(local_user(),'statusnet','post_by_default')))
- $statusnet_enable = 1;
-
- if($statusnet_enable && $statusnet_post) {
- require_once('include/bbcode.php');
- $dent = new StatusNetOAuth($api,$ckey,$csecret,$otoken,$osecret);
- $max_char = $dent->get_maxlength(); // max. length for a dent
- $msg = strip_tags(bbcode($b['body']));
- // quotes not working - let's try this
- $msg = html_entity_decode($msg);
- if ( strlen($msg) > $max_char) {
- $shortlink = "";
- require_once('library/slinky.php');
- // post url = base url + /display/ + owner + post id
- // we construct this from the Owner link and replace
- // profile by display - this will cause an error when
- // /profile/ is in the owner url twice but I don't
- // think this will be very common...
- $posturl = str_replace('/profile/','/display/',$b['owner-link']).'/'.$b['id'];
- $slinky = new Slinky( $posturl );
- // setup a cascade of shortening services
- // try to get a short link from these services
- // in the order ur1.ca, trim, id.gd, tinyurl
- $slinky->set_cascade( array( new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) );
- $shortlink = $slinky->short();
- // the new message will be shortened such that "... $shortlink"
- // will fit into the character limit
- $msg = substr($msg, 0, $max_char-strlen($shortlink)-4);
- $msg .= '... ' . $shortlink;
- }
- // and now tweet it :-)
- if(strlen($msg))
- $dent->post('statuses/update', array('status' => $msg));
- }
- }
- }
-}
-
-function statusnet_plugin_admin_post(&$a){
-
- $sites = array();
-
- foreach($_POST['sitename'] as $id=>$sitename){
- $sitename=trim($sitename);
- $apiurl=trim($_POST['apiurl'][$id]);
- $secret=trim($_POST['secret'][$id]);
- $key=trim($_POST['key'][$id]);
- if ($sitename!="" &&
- $apiurl!="" &&
- $secret!="" &&
- $key!="" &&
- !x($_POST['delete'][$id])){
-
- $sites[] = Array(
- 'sitename' => $sitename,
- 'apiurl' => $apiurl,
- 'consumersecret' => $secret,
- 'consumerkey' => $key
- );
- }
- }
-
- $sites = set_config('statusnet','sites', $sites);
-
-}
-
-function statusnet_plugin_admin(&$a, &$o){
-
- $sites = get_config('statusnet','sites');
- $sitesform=array();
- if (is_array($sites)){
- foreach($sites as $id=>$s){
- $sitesform[] = Array(
- 'sitename' => Array("sitename[$id]", "Site name", $s['sitename'], ""),
- 'apiurl' => Array("apiurl[$id]", "Api url", $s['apiurl'], ""),
- 'secret' => Array("secret[$id]", "Secret", $s['consumersecret'], ""),
- 'key' => Array("key[$id]", "Key", $s['consumerkey'], ""),
- 'delete' => Array("delete[$id]", "Delete", False , "Check to delete this preset"),
- );
- }
- }
- /* empty form to add new site */
- $id++;
- $sitesform[] = Array(
- 'sitename' => Array("sitename[$id]", t("Site name"), "", ""),
- 'apiurl' => Array("apiurl[$id]", t("API URL"), "", ""),
- 'secret' => Array("secret[$id]", t("Consumer Secret"), "", ""),
- 'key' => Array("key[$id]", t("Consumer Key"), "", ""),
- );
-
-
- $t = file_get_contents( dirname(__file__). "/admin.tpl" );
- $o = replace_macros($t, array(
- '$submit' => t('Submit'),
-
- '$sites' => $sitesform,
-
- ));
-
-
-}
diff --git a/addon/tictac/tictac.php b/addon/tictac/tictac.php
deleted file mode 100644
index cc2701f8b..000000000
--- a/addon/tictac/tictac.php
+++ /dev/null
@@ -1,665 +0,0 @@
-<?php
-/**
- * Name: TicTac App
- * Description: The TicTacToe game application
- * Version: 1.0
- * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
- */
-
-
-function tictac_install() {
- register_hook('app_menu', 'addon/tictac/tictac.php', 'tictac_app_menu');
-}
-
-function tictac_uninstall() {
- unregister_hook('app_menu', 'addon/tictac/tictac.php', 'tictac_app_menu');
-
-}
-
-function tictac_app_menu($a,&$b) {
- $b['app_menu'][] = Array('url'=>'tictac', 'name'=>'Three Dimensional Tic-Tac-Toe');
-}
-
-
-function tictac_module() {
- return;
-}
-
-
-
-
-
-function tictac_content(&$a) {
-
- $o = '';
-
- if($_POST['move']) {
- $handicap = $a->argv[1];
- $mefirst = $a->argv[2];
- $dimen = $a->argv[3];
- $yours = $a->argv[4];
- $mine = $a->argv[5];
-
- $yours .= $_POST['move'];
- }
- elseif($a->argc > 1) {
- $handicap = $a->argv[1];
- $dimen = 3;
- }
- else {
- $dimen = 3;
- }
-
- $o .= '<h3>' . t('3D Tic-Tac-Toe') . '</h3><br />';
-
- $t = new tictac($dimen,$handicap,$mefirst,$yours,$mine);
- $o .= $t->play();
-
- $o .= '<a href="tictac">' . t('New game') . '</a><br />';
- $o .= '<a href="tictac/1">' . t('New game with handicap') . '</a><br />';
- $o .= '<p>' . t('Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. ');
- $o .= t('In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels.');
- $o .= '</p><p>';
- $o .= t('The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage.');
- $o .= '</p>';
-
- return $o;
-
-}
-
-class tictac {
- private $dimen;
- private $first_move = true;
- private $handicap = 0;
- private $yours;
- private $mine;
- private $winning_play;
- private $you;
- private $me;
- private $debug = 1;
- private $crosses = array('011','101','110','112','121','211');
-
-/*
- '001','010','011','012','021',
- '101','110','111','112','121',
- '201','210','211','212','221');
-*/
-
- private $corners = array(
- '000','002','020','022',
- '200','202','220','222');
-
- private $planes = array(
- array('000','001','002','010','011','012','020','021','022'), // horiz 1
- array('100','101','102','110','111','112','120','121','122'), // 2
- array('200','201','202','210','211','212','220','221','222'), // 3
- array('000','010','020','100','110','120','200','210','220'), // vert left
- array('000','001','002','100','101','102','200','201','202'), // vert top
- array('002','012','022','102','112','122','202','212','222'), // vert right
- array('020','021','022','120','121','122','220','221','222'), // vert bot
- array('010','011','012','110','111','112','210','211','212'), // left vertx
- array('001','011','021','101','111','221','201','211','221'), // top vertx
- array('000','001','002','110','111','112','220','221','222'), // diag top
- array('020','021','022','110','111','112','200','201','202'), // diag bot
- array('000','010','020','101','111','121','202','212','222'), // diag left
- array('002','012','022','101','111','121','200','210','220'), // diag right
- array('002','011','020','102','111','120','202','211','220'), // diag x
- array('000','011','022','100','111','122','200','211','222') // diag x
-
- );
-
-
- private $winner = array(
- array('000','001','002'), // board 0 winners - left corner across
- array('000','010','020'), // down
- array('000','011','022'), // diag
- array('001','011','021'), // middle-top down
- array('010','011','012'), // middle-left across
- array('002','011','020'), // right-top diag
- array('002','012','022'), // right-top down
- array('020','021','022'), // bottom-left across
- array('100','101','102'), // board 1 winners
- array('100','110','120'),
- array('100','111','122'),
- array('101','111','121'),
- array('110','111','112'),
- array('102','111','120'),
- array('102','112','122'),
- array('120','121','122'),
- array('200','201','202'), // board 2 winners
- array('200','210','220'),
- array('200','211','222'),
- array('201','211','221'),
- array('210','211','212'),
- array('202','211','220'),
- array('202','212','222'),
- array('220','221','222'),
- array('000','100','200'), // top-left corner 3d
- array('000','101','202'),
- array('000','110','220'),
- array('000','111','222'),
- array('001','101','201'), // top-middle 3d
- array('001','111','221'),
- array('002','102','202'), // top-right corner 3d
- array('002','101','200'),
- array('002','112','222'),
- array('002','111','220'),
- array('010','110','210'), // left-middle 3d
- array('010','111','212'),
- array('011','111','211'), // middle-middle 3d
- array('012','112','212'), // right-middle 3d
- array('012','111','210'),
- array('020','120','220'), // bottom-left corner 3d
- array('020','110','200'),
- array('020','121','222'),
- array('020','111','202'),
- array('021','121','221'), // bottom-middle 3d
- array('021','111','201'),
- array('022','122','222'), // bottom-right corner 3d
- array('022','121','220'),
- array('022','112','202'),
- array('022','111','200')
-
- );
-
- function __construct($dimen,$handicap,$mefirst,$yours,$mine) {
- $this->dimen = 3;
- $this->handicap = (($handicap) ? 1 : 0);
- $this->mefirst = (($mefirst) ? 1 : 0);
- $this->yours = str_replace('XXX','',$yours);
- $this->mine = $mine;
- $this->you = $this->parse_moves('you');
- $this->me = $this->parse_moves('me');
-
- if(strlen($yours))
- $this->first_move = false;
- }
-
- function play() {
-
- if($this->first_move) {
- if(rand(0,1) == 1) {
- $o .= '<div class="error-message">' . t('You go first...') . '</div><br />';
- $this->mefirst = 0;
- $o .= $this->draw_board();
- return $o;
- }
- $o .= '<div class="error-message">' . t('I\'m going first this time...') . ' </div><br />';
- $this->mefirst = 1;
-
- }
-
- if($this->check_youwin()) {
- $o .= '<div class="error-message">' . t('You won!') . '</div><br />';
- $o .= $this->draw_board();
- return $o;
- }
-
- if($this->fullboard())
- $o .= '<div class="error-message">' . t('"Cat" game!') . '</div><br />';
-
- $move = $this->winning_move();
- if(strlen($move)) {
- $this->mine .= $move;
- $this->me = $this->parse_moves('me');
- }
- else {
- $move = $this->defensive_move();
- if(strlen($move)) {
- $this->mine .= $move;
- $this->me = $this->parse_moves('me');
- }
- else {
- $move = $this->offensive_move();
- if(strlen($move)) {
- $this->mine .= $move;
- $this->me = $this->parse_moves('me');
- }
- }
- }
-
- if($this->check_iwon())
- $o .= '<div class="error-message">' . t('I won!') . '</div><br />';
- if($this->fullboard())
- $o .= '<div class="error-message">' . t('"Cat" game!') . '</div><br />';
- $o .= $this->draw_board();
- return $o;
- }
-
- function parse_moves($player) {
- if($player == 'me')
- $str = $this->mine;
- if($player == 'you')
- $str = $this->yours;
- $ret = array();
- while(strlen($str)) {
- $ret[] = substr($str,0,3);
- $str = substr($str,3);
- }
- return $ret;
- }
-
-
- function check_youwin() {
- for($x = 0; $x < count($this->winner); $x ++) {
- if(in_array($this->winner[$x][0],$this->you) && in_array($this->winner[$x][1],$this->you) && in_array($this->winner[$x][2],$this->you)) {
- $this->winning_play = $this->winner[$x];
- return true;
- }
- }
- return false;
- }
- function check_iwon() {
- for($x = 0; $x < count($this->winner); $x ++) {
- if(in_array($this->winner[$x][0],$this->me) && in_array($this->winner[$x][1],$this->me) && in_array($this->winner[$x][2],$this->me)) {
- $this->winning_play = $this->winner[$x];
- return true;
- }
- }
- return false;
- }
- function defensive_move() {
-
- for($x = 0; $x < count($this->winner); $x ++) {
- if(($this->handicap) && in_array('111',$this->winner[$x]))
- continue;
- if(in_array($this->winner[$x][0],$this->you) && in_array($this->winner[$x][1],$this->you) && (! in_array($this->winner[$x][2],$this->me)))
- return($this->winner[$x][2]);
- if(in_array($this->winner[$x][0],$this->you) && in_array($this->winner[$x][2],$this->you) && (! in_array($this->winner[$x][1],$this->me)))
- return($this->winner[$x][1]);
- if(in_array($this->winner[$x][1],$this->you) && in_array($this->winner[$x][2],$this->you) && (! in_array($this->winner[$x][0],$this->me)))
- return($this->winner[$x][0]);
- }
- return '';
- }
-
-function winning_move() {
-
- for($x = 0; $x < count($this->winner); $x ++) {
- if(($this->handicap) && in_array('111',$this->winner[$x]))
- continue;
- if(in_array($this->winner[$x][0],$this->me) && in_array($this->winner[$x][1],$this->me) && (! in_array($this->winner[$x][2],$this->you)))
- return($this->winner[$x][2]);
- if(in_array($this->winner[$x][0],$this->me) && in_array($this->winner[$x][2],$this->me) && (! in_array($this->winner[$x][1],$this->you)))
- return($this->winner[$x][1]);
- if(in_array($this->winner[$x][1],$this->me) && in_array($this->winner[$x][2],$this->me) && (! in_array($this->winner[$x][0],$this->you)))
- return($this->winner[$x][0]);
- }
-
-}
-
- function offensive_move() {
-
- shuffle($this->planes);
- shuffle($this->winner);
- shuffle($this->corners);
- shuffle($this->crosses);
-
- if(! count($this->me)) {
- if($this->handicap) {
- $p = $this->uncontested_plane();
- foreach($this->corners as $c)
- if((in_array($c,$p))
- && (! $this->is_yours($c)) && (! $this->is_mine($c)))
- return($c);
- }
- else {
- if((! $this->marked_yours(1,1,1)) && (! $this->marked_mine(1,1,1)))
- return '111';
- $p = $this->uncontested_plane();
- foreach($this->crosses as $c)
- if((in_array($c,$p))
- && (! $this->is_yours($c)) && (! $this->is_mine($c)))
- return($c);
- }
- }
-
- if($this->handicap) {
- if(count($this->me) >= 1) {
- if(count($this->get_corners($this->me)) == 1) {
- if(in_array($this->me[0],$this->corners)) {
- $p = $this->my_best_plane();
- foreach($this->winner as $w) {
- if((in_array($w[0],$this->you))
- || (in_array($w[1],$this->you))
- || (in_array($w[2],$this->you)))
- continue;
- if(in_array($w[0],$this->corners)
- && in_array($w[2],$this->corners)
- && in_array($w[0],$p) && in_array($w[2],$p)) {
- if($this->me[0] == $w[0])
- return($w[2]);
- elseif($this->me[0] == $w[2])
- return($w[0]);
- }
- }
- }
- }
- else {
- $r = $this->get_corners($this->me);
- if(count($r) > 1) {
- $w1 = array(); $w2 = array();
- foreach($this->winner as $w) {
- if(in_array('111',$w))
- continue;
- if(($r[0] == $w[0]) || ($r[0] == $w[2]))
- $w1[] = $w;
- if(($r[1] == $w[0]) || ($r[1] == $w[2]))
- $w2[] = $w;
- }
- if(count($w1) && count($w2)) {
- foreach($w1 as $a) {
- foreach($w2 as $b) {
- if((in_array($a[0],$this->you))
- || (in_array($a[1],$this->you))
- || (in_array($a[2],$this->you))
- || (in_array($b[0],$this->you))
- || (in_array($b[1],$this->you))
- || (in_array($b[2],$this->you)))
- continue;
- if(($a[0] == $b[0]) && ! $this->is_mine($a[0])) {
- return $a[0];
- }
- elseif(($a[2] == $b[2]) && ! $this->is_mine($a[2])) {
- return $a[2];
- }
- }
- }
- }
- }
- }
- }
- }
-
- //&& (count($this->me) == 1) && (count($this->you) == 1)
- // && in_array($this->you[0],$this->corners)
- // && $this->is_neighbor($this->me[0],$this->you[0])) {
-
- // Yuck. You foiled my plan. Since you obviously aren't playing to win,
- // I'll try again. You may keep me busy for a few rounds, but I'm
- // gonna' get you eventually.
-
-// $p = $this->uncontested_plane();
- // foreach($this->crosses as $c)
- // if(in_array($c,$p))
- // return($c);
-
-// }
-
-
- // find all the winners containing my points.
- $mywinners = array();
- foreach($this->winner as $w)
- foreach($this->me as $m)
- if((in_array($m,$w)) && (! in_array($w,$mywinners)))
- $mywinners[] = $w;
-
- // find all the rules where my points are in the center.
- $trythese = array();
- if(count($mywinners)) {
- foreach($mywinners as $w) {
- foreach($this->me as $m) {
- if(($m == $w[1]) && ($this->uncontested_winner($w))
- && (! in_array($w,$trythese)))
- $trythese[] = $w;
- }
- }
- }
-
- $myplanes = array();
- for($p = 0; $p < count($this->planes); $p ++) {
- if($this->handicap && in_array('111',$this->planes[$p]))
- continue;
- foreach($this->me as $m)
- if((in_array($m,$this->planes[$p]))
- && (! in_array($this->planes[$p],$myplanes)))
- $myplanes[] = $this->planes[$p];
- }
- shuffle($myplanes);
-
- // find all winners which share an endpoint, and which are uncontested
- $candidates = array();
- if(count($trythese) && count($myplanes)) {
- foreach($trythese as $t) {
- foreach($this->winner as $w) {
- if(! $this->uncontested_winner($w))
- continue;
- if((in_array($t[0],$w)) || (in_array($t[2],$w))) {
- foreach($myplanes as $p)
- if(in_array($w[0],$p) && in_array($w[1],$p) && in_array($w[2],$p) && ($w[1] != $this->me[0]))
- if(! in_array($w,$candidates))
- $candidates[] = $w;
- }
- }
- }
- }
-
- // Find out if we are about to force a win.
- // Looking for two winning vectors with a common endpoint
- // and where we own the middle of both - we are now going to
- // grab the endpoint. The game isn't yet over but we've already won.
-
- if(count($candidates)) {
- foreach($candidates as $c) {
- if(in_array($c[1],$this->me)) {
- // return endpoint
- foreach($trythese as $t)
- if($t[0] == $c[0])
- return($t[0]);
- elseif($t[2] == $c[2])
- return($t[2]);
- }
- }
-
- // find opponents planes
- $yourplanes = array();
- for($p = 0; $p < count($this->planes); $p ++) {
- if($this->handicap && in_array('111',$this->planes[$p]))
- continue;
- if(in_array($this->you[0],$this->planes[$p]))
- $yourplanes[] = $this->planes[$p];
- }
-
- shuffle($this->winner);
- foreach($candidates as $c) {
-
- // We now have a list of winning strategy vectors for our second point
- // Pick one that will force you into defensive mode.
- // Pick a point close to you so we don't risk giving you two
- // in a row when you block us. That would force *us* into
- // defensive mode.
- // We want: or: not:
- // X|O| X| | X| |
- // |O| O|O| |O|
- // | | | | |O|
-
- if(count($this->you) == 1) {
- foreach($this->winner as $w) {
- if(in_array($this->me[0], $w) && in_array($c[1],$w)
- && $this->uncontested_winner($w)
- && $this->is_neighbor($this->you[0],$c[1])) {
- return($c[1]);
- }
- }
- }
- }
-
- // You're somewhere else entirely or have made more than one move
- // - any strategy vector which puts you on the defense will have to do
-
- foreach($candidates as $c) {
- foreach($this->winner as $w) {
- if(in_array($this->me[0], $w) && in_array($c[1],$w)
- && $this->uncontested_winner($w)) {
- return($c[1]);
- }
- }
- }
- }
-
- // worst case scenario, no strategy we can play,
- // just find an empty space and take it
-
- for($x = 0; $x < $this->dimen; $x ++)
- for($y = 0; $y < $this->dimen; $y ++)
- for($z = 0; $z < $this->dimen; $z ++)
- if((! $this->marked_yours($x,$y,$z))
- && (! $this->marked_mine($x,$y,$z))) {
- if($this->handicap && $x == 1 && $y == 1 && $z == 1)
- continue;
- return(sprintf("%d%d%d",$x,$y,$z));
- }
-
- return '';
- }
-
- function marked_yours($x,$y,$z) {
- $str = sprintf("%d%d%d",$x,$y,$z);
- if(in_array($str,$this->you))
- return true;
- return false;
- }
-
- function marked_mine($x,$y,$z) {
- $str = sprintf("%d%d%d",$x,$y,$z);
- if(in_array($str,$this->me))
- return true;
- return false;
- }
-
- function is_yours($str) {
- if(in_array($str,$this->you))
- return true;
- return false;
- }
-
- function is_mine($str) {
- if(in_array($str,$this->me))
- return true;
- return false;
- }
-
- function get_corners($a) {
- $total = array();
- if(count($a))
- foreach($a as $b)
- if(in_array($b,$this->corners))
- $total[] = $b;
- return $total;
- }
-
- function uncontested_winner($w) {
- if($this->handicap && in_array('111',$w))
- return false;
- $contested = false;
- if(count($this->you)) {
- foreach($this->you as $you)
- if(in_array($you,$w))
- $contested = true;
- }
- return (($contested) ? false : true);
- }
-
-
- function is_neighbor($p1,$p2) {
- list($x1,$y1,$z1) = sscanf($p1, "%1d%1d%1d");
- list($x2,$y2,$z2) = sscanf($p2, "%1d%1d%1d");
-
- if((($x1 == $x2) || ($x1 == $x2+1) || ($x1 == $x2-1)) &&
- (($y1 == $y2) || ($y1 == $y2+1) || ($y1 == $y2-1)) &&
- (($z1 == $z2) || ($z1 == $z2+1) || ($z1 == $z2-1)))
- return true;
- return false;
-
- }
-
- function my_best_plane() {
-
- $second_choice = array();
- shuffle($this->planes);
- for($p = 0; $p < count($this->planes); $p ++ ) {
- $contested = 0;
- if($this->handicap && in_array('111',$this->planes[$p]))
- continue;
- if(! in_array($this->me[0],$this->planes[$p]))
- continue;
- foreach($this->you as $m) {
- if(in_array($m,$this->planes[$p]))
- $contested ++;
- }
- if(! $contested)
- return($this->planes[$p]);
- if($contested == 1)
- $second_choice = $this->planes[$p];
- }
- return $second_choice;
- }
-
-
-
-
-
-
-
- function uncontested_plane() {
- $freeplane = true;
- shuffle($this->planes);
- $pl = $this->planes;
-
- for($p = 0; $p < count($pl); $p ++ ) {
- if($this->handicap && in_array('111',$pl[$p]))
- continue;
- foreach($this->you as $m) {
- if(in_array($m,$pl[$p]))
- $freeplane = false;
- }
- if(! $freeplane) {
- $freeplane = true;
- continue;
- }
- if($freeplane)
- return($pl[$p]);
- }
- return array();
- }
-
- function fullboard() {
- return false;
- }
-
- function draw_board() {
- if(! strlen($this->yours))
- $this->yours = 'XXX';
- $o .= "<form action=\"tictac/{$this->handicap}/{$this->mefirst}/{$this->dimen}/{$this->yours}/{$this->mine}\" method=\"post\" />";
- for($x = 0; $x < $this->dimen; $x ++) {
- $o .= '<table>';
- for($y = 0; $y < $this->dimen; $y ++) {
- $o .= '<tr>';
- for($z = 0; $z < $this->dimen; $z ++) {
- $s = sprintf("%d%d%d",$x,$y,$z);
- $winner = ((is_array($this->winning_play) && in_array($s,$this->winning_play)) ? " color: #FF0000; " : "");
- $bordertop = (($y != 0) ? " border-top: 2px solid #000;" : "");
- $borderleft = (($z != 0) ? " border-left: 2px solid #000;" : "");
- if($this->handicap && $x == 1 && $y == 1 && $z == 1)
- $o .= "<td style=\"width: 25px; height: 25px; $bordertop $borderleft\" align=\"center\">&nbsp;</td>";
- elseif($this->marked_yours($x,$y,$z))
- $o .= "<td style=\"width: 25px; height: 25px; $bordertop $borderleft $winner\" align=\"center\">X</td>";
- elseif($this->marked_mine($x,$y,$z))
- $o .= "<td style=\"width: 25px; height: 25px; $bordertop $borderleft $winner\" align=\"center\">O</td>";
- else {
- $val = sprintf("%d%d%d",$x,$y,$z);
- $o .= "<td style=\"width: 25px; height: 25px; $bordertop $borderleft\" align=\"center\"><input type=\"checkbox\" name=\"move\" value=\"$val\" onclick=\"this.form.submit();\" /></td>";
- }
- }
- $o .= '</tr>';
- }
- $o .= '</table><br />';
- }
- $o .= '</form>';
- return $o;
-
- }
-
-
-}
-
diff --git a/addon/twitter/README b/addon/twitter/README
deleted file mode 100644
index e6d5f12c9..000000000
--- a/addon/twitter/README
+++ /dev/null
@@ -1,77 +0,0 @@
-____ Twitter Plugin ____
-By Tobias Diekershoff
- tobias.diekershoff(at)gmx.net
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!! This addon is currently under development. If you have any problem !!
-!! with it, please contact the Author. !!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-With this addon to Friendika you can give your user the possibility to post
-their *public* messages to Twitter. The messages will be strapped their rich
-context and shortened to 140 characters length if necessary. If shortening of
-the message was performed a link will be added to the Tweet pointing to the
-original message on your server.
-
-There is a similar addon for forwarding public messages to
-"StatusNet":http://status.net [[StatusNet Plugin]].
-
-Online version of this document: http://ur1.ca/35mml
-
-___ Requirements ___
-
-To use this plugin you have to register your Friendika instance as an
-_client application_ for Twitter with _read and write_ access, we do not intend
-to use Twitter for login. The registration can be done at twitter.com/apps
-and you need to have a Twitter account to do so.
-
-After you registered the application you get an OAuth consumer key / secret
-pair that identifies your app, you will need them for configuration.
-
-The inclusion of a shorturl for the original posting in cases when the
-message was longer than 140 characters requires it, that you have *PHP5+* and
-*curl* on your server.
-
-___ Where to find ___
-
-In the Friendika git repository /addon/twitter/, this directory contains
-all required PHP files (including the Twitter OAuth library [1] by Abraham
-Williams, MIT licensed and the Slinky library [2] by Beau Lebens, BSD license),
-a CSS file for styling of the user configuration and an image to _Sign in with
-Twitter_.
-
-[1] https://github.com/abraham/twitteroauth
-[2] http://dentedreality.com.au/projects/slinky/
-
-___ Configuration ___
-
-__ Global Configuration __
-
-To activate this addon add @twitter@ to the list of active addons in your
-.htconfig.php file
- $a->config['system']['addon'] = "twitter, ..."
-Afterwards you need to add your OAuth consumer key / secret pair to it by
-adding the following two lines
-
-$a->config['twitter']['consumerkey'] = 'your consumer KEY here';
-$a->config['twitter']['consumersecret'] = 'your consumer SECRET here';
-
-When this is done your user can now configure their Twitter connection at
-"Settings -> Plugin Settings" and enable the forwarding of their *public*
-messages to Twitter.
-
-__ User Configuration __
-
-When the OAuth consumer informations are correctly placed into the
-configuration file and a user visits the "Plugin Settings" page they can now
-connect to Twitter. To do so one has to follow the _Sign in with Twitter_
-button (the page will be opened in a new browser window/tab) and get a PIN from
-Twitter. This PIN has to be entered on the settings page. After submitting the
-PIN the plugin will get OAuth credentials identifying this user from the
-Friendika account.
-
-If this first step was successful the Twitter configuration will be changed
-on the "Plugin Settings" page displaying two check boxes. One to enable/disable
-the forwarding of *all public* postings to Twitter and one to clear the
-personal configuration from the Twitter credentials.
-
diff --git a/addon/twitter/admin.tpl b/addon/twitter/admin.tpl
deleted file mode 100644
index a83eb07a4..000000000
--- a/addon/twitter/admin.tpl
+++ /dev/null
@@ -1,3 +0,0 @@
-{{ inc field_input.tpl with $field=$consumerkey }}{{ endinc }}
-{{ inc field_input.tpl with $field=$consumersecret }}{{ endinc }}
-<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
diff --git a/addon/twitter/lighter.png b/addon/twitter/lighter.png
deleted file mode 100644
index 297bb0340..000000000
--- a/addon/twitter/lighter.png
+++ /dev/null
Binary files differ
diff --git a/addon/twitter/twitter.css b/addon/twitter/twitter.css
deleted file mode 100644
index 899cfd173..000000000
--- a/addon/twitter/twitter.css
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-#twitter-avatar {
- float: left;
- width: 48px;
- height: 48px;
- padding: 2px;
-}
-#twitter-info-block {
- height: 52px;
- vertical-align: middle;
-}
-#twitter-disconnect-label {
- float: left;
- width: 200px;
- margin-bottom: 25px;
-}
-
-#twitter-disconnect {
- float: left;
-}
-#twitter-enable-label {
- float: left;
- width: 200px;
- margin-bottom: 5px;
-}
-
-#twitter-checkbox {
- float: left;
-}
-#twitter-pin-label {
- float: left;
- width: 200px;
- margin-bottom: 25px;
-}
-
-#twitter-pin {
- float: left;
-}
-
-
diff --git a/addon/twitter/twitter.php b/addon/twitter/twitter.php
deleted file mode 100644
index b1c8a0a89..000000000
--- a/addon/twitter/twitter.php
+++ /dev/null
@@ -1,285 +0,0 @@
-<?php
-/**
- * Name: Twitter Connector
- * Version: 1.0.1
- * Author: Tobias Diekershoff <https://diekershoff.homeunix.net/friendika/profile/tobias>
- */
-
-
-/* Twitter Plugin for Friendika
- *
- * Author: Tobias Diekershoff
- * tobias.diekershoff@gmx.net
- *
- * License:3-clause BSD license
- *
- * Configuration:
- * To use this plugin you need a OAuth Consumer key pair (key & secret)
- * you can get it from Twitter at https://twitter.com/apps
- *
- * Register your Friendika site as "Client" application with "Read & Write" access
- * we do not need "Twitter as login". When you've registered the app you get the
- * OAuth Consumer key and secret pair for your application/site.
- *
- * Add this key pair to your global .htconfig.php
- *
- * $a->config['twitter']['consumerkey'] = 'your consumer_key here';
- * $a->config['twitter']['consumersecret'] = 'your consumer_secret here';
- *
- * To activate the plugin itself add it to the $a->config['system']['addon']
- * setting. After this, your user can configure their Twitter account settings
- * from "Settings -> Plugin Settings".
- *
- * Requirements: PHP5, curl [Slinky library]
- *
- * Documentation: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Twitter_Plugin
- */
-
-/* __TODO__
- *
- * - what about multimedia content?
- * so far we just strip HTML tags from the message
- */
-
-function twitter_install() {
- // we need some hooks, for the configuration and for sending tweets
- register_hook('plugin_settings', 'addon/twitter/twitter.php', 'twitter_settings');
- register_hook('plugin_settings_post', 'addon/twitter/twitter.php', 'twitter_settings_post');
- register_hook('post_local_end', 'addon/twitter/twitter.php', 'twitter_post_hook');
- register_hook('jot_networks', 'addon/twitter/twitter.php', 'twitter_jot_nets');
- logger("installed twitter");
-}
-
-
-function twitter_uninstall() {
- unregister_hook('plugin_settings', 'addon/twitter/twitter.php', 'twitter_settings');
- unregister_hook('plugin_settings_post', 'addon/twitter/twitter.php', 'twitter_settings_post');
- unregister_hook('post_local_end', 'addon/twitter/twitter.php', 'twitter_post_hook');
- unregister_hook('jot_networks', 'addon/twitter/twitter.php', 'twitter_jot_nets');
-}
-
-function twitter_jot_nets(&$a,&$b) {
- if(! local_user())
- return;
-
- $tw_post = get_pconfig(local_user(),'twitter','post');
- if(intval($tw_post) == 1) {
- $tw_defpost = get_pconfig(local_user(),'twitter','post_by_default');
- $selected = ((intval($tw_defpost) == 1) ? ' checked="checked" ' : '');
- $b .= '<div class="profile-jot-net"><input type="checkbox" name="twitter_enable"' . $selected . 'value="1" /> '
- . t('Post to Twitter') . '</div>';
- }
-
-
-}
-
-function twitter_settings_post ($a,$post) {
- if(! local_user())
- return;
- // don't check twitter settings if twitter submit button is not clicked
- if (!x($_POST,'twitter-submit')) return;
-
- if (isset($_POST['twitter-disconnect'])) {
- /***
- * if the twitter-disconnect checkbox is set, clear the OAuth key/secret pair
- * from the user configuration
- * TODO can we revoke the access tokens at Twitter and do we need to do so?
- */
- del_pconfig( local_user(), 'twitter', 'consumerkey' );
- del_pconfig( local_user(), 'twitter', 'consumersecret' );
- del_pconfig( local_user(), 'twitter', 'post' );
- del_pconfig( local_user(), 'twitter', 'post_by_default' );
- } else {
- if (isset($_POST['twitter-pin'])) {
- // if the user supplied us with a PIN from Twitter, let the magic of OAuth happen
- logger('got a Twitter PIN');
- require_once('library/twitteroauth.php');
- $ckey = get_config('twitter', 'consumerkey' );
- $csecret = get_config('twitter', 'consumersecret' );
- // the token and secret for which the PIN was generated were hidden in the settings
- // form as token and token2, we need a new connection to Twitter using these token
- // and secret to request a Access Token with the PIN
- $connection = new TwitterOAuth($ckey, $csecret, $_POST['twitter-token'], $_POST['twitter-token2']);
- $token = $connection->getAccessToken( $_POST['twitter-pin'] );
- // ok, now that we have the Access Token, save them in the user config
- set_pconfig(local_user(),'twitter', 'oauthtoken', $token['oauth_token']);
- set_pconfig(local_user(),'twitter', 'oauthsecret', $token['oauth_token_secret']);
- set_pconfig(local_user(),'twitter', 'post', 1);
- // reload the Addon Settings page, if we don't do it see Bug #42
- goaway($a->get_baseurl().'/settings/addon');
- } else {
- // if no PIN is supplied in the POST variables, the user has changed the setting
- // to post a tweet for every new __public__ posting to the wall
- set_pconfig(local_user(),'twitter','post',intval($_POST['twitter-enable']));
- set_pconfig(local_user(),'twitter','post_by_default',intval($_POST['twitter-default']));
- info( t('Twitter settings updated.') . EOL);
- }}
-}
-function twitter_settings(&$a,&$s) {
- if(! local_user())
- return;
- $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' . $a->get_baseurl() . '/addon/twitter/twitter.css' . '" media="all" />' . "\r\n";
- /***
- * 1) Check that we have global consumer key & secret
- * 2) If no OAuthtoken & stuff is present, generate button to get some
- * 3) Checkbox for "Send public notices (140 chars only)
- */
- $ckey = get_config('twitter', 'consumerkey' );
- $csecret = get_config('twitter', 'consumersecret' );
- $otoken = get_pconfig(local_user(), 'twitter', 'oauthtoken' );
- $osecret = get_pconfig(local_user(), 'twitter', 'oauthsecret' );
- $enabled = get_pconfig(local_user(), 'twitter', 'post');
- $checked = (($enabled) ? ' checked="checked" ' : '');
- $defenabled = get_pconfig(local_user(),'twitter','post_by_default');
- $defchecked = (($defenabled) ? ' checked="checked" ' : '');
-
- $s .= '<div class="settings-block">';
- $s .= '<h3>'. t('Twitter Posting Settings') .'</h3>';
-
- if ( (!$ckey) && (!$csecret) ) {
- /***
- * no global consumer keys
- * display warning and skip personal config
- */
- $s .= '<p>'. t('No consumer key pair for Twitter found. Please contact your site administrator.') .'</p>';
- } else {
- /***
- * ok we have a consumer key pair now look into the OAuth stuff
- */
- if ( (!$otoken) && (!$osecret) ) {
- /***
- * the user has not yet connected the account to twitter...
- * get a temporary OAuth key/secret pair and display a button with
- * which the user can request a PIN to connect the account to a
- * account at Twitter.
- */
- require_once('library/twitteroauth.php');
- $connection = new TwitterOAuth($ckey, $csecret);
- $request_token = $connection->getRequestToken();
- $token = $request_token['oauth_token'];
- /***
- * make some nice form
- */
- $s .= '<p>'. t('At this Friendika instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter.') .'</p>';
- $s .= '<a href="'.$connection->getAuthorizeURL($token).'" target="_twitter"><img src="addon/twitter/lighter.png" alt="'.t('Log in with Twitter').'"></a>';
- $s .= '<div id="twitter-pin-wrapper">';
- $s .= '<label id="twitter-pin-label" for="twitter-pin">'. t('Copy the PIN from Twitter here') .'</label>';
- $s .= '<input id="twitter-pin" type="text" name="twitter-pin" />';
- $s .= '<input id="twitter-token" type="hidden" name="twitter-token" value="'.$token.'" />';
- $s .= '<input id="twitter-token2" type="hidden" name="twitter-token2" value="'.$request_token['oauth_token_secret'].'" />';
- $s .= '</div><div class="clear"></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="twitter-submit" class="settings-submit" value="' . t('Submit') . '" /></div>';
- } else {
- /***
- * we have an OAuth key / secret pair for the user
- * so let's give a chance to disable the postings to Twitter
- */
- require_once('library/twitteroauth.php');
- $connection = new TwitterOAuth($ckey,$csecret,$otoken,$osecret);
- $details = $connection->get('account/verify_credentials');
- $s .= '<div id="twitter-info" ><img id="twitter-avatar" src="'.$details->profile_image_url.'" /><p id="twitter-info-block">'. t('Currently connected to: ') .'<a href="https://twitter.com/'.$details->screen_name.'" target="_twitter">'.$details->screen_name.'</a><br /><em>'.$details->description.'</em></p></div>';
- $s .= '<p>'. t('If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry.') .'</p>';
- $s .= '<div id="twitter-enable-wrapper">';
- $s .= '<label id="twitter-enable-label" for="twitter-checkbox">'. t('Allow posting to Twitter'). '</label>';
- $s .= '<input id="twitter-checkbox" type="checkbox" name="twitter-enable" value="1" ' . $checked . '/>';
- $s .= '<div class="clear"></div>';
- $s .= '<label id="twitter-default-label" for="twitter-default">'. t('Send public postings to Twitter by default') .'</label>';
- $s .= '<input id="twitter-default" type="checkbox" name="twitter-default" value="1" ' . $defchecked . '/>';
- $s .= '</div><div class="clear"></div>';
-
- $s .= '<div id="twitter-disconnect-wrapper">';
- $s .= '<label id="twitter-disconnect-label" for="twitter-disconnect">'. t('Clear OAuth configuration') .'</label>';
- $s .= '<input id="twitter-disconnect" type="checkbox" name="twitter-disconnect" value="1" />';
- $s .= '</div><div class="clear"></div>';
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="twitter-submit" class="settings-submit" value="' . t('Submit') . '" /></div>';
- }
- }
- $s .= '</div><div class="clear"></div></div>';
-}
-
-
-function twitter_post_hook(&$a,&$b) {
-
- /**
- * Post to Twitter
- */
-
- logger('twitter post invoked');
-
- if((local_user()) && (local_user() == $b['uid']) && (! $b['private']) && (! $b['parent']) ) {
-
- // Twitter is not considered a private network
- if($b['prvnets'])
- return;
-
-
- load_pconfig(local_user(), 'twitter');
-
- $ckey = get_config('twitter', 'consumerkey' );
- $csecret = get_config('twitter', 'consumersecret' );
- $otoken = get_pconfig(local_user(), 'twitter', 'oauthtoken' );
- $osecret = get_pconfig(local_user(), 'twitter', 'oauthsecret' );
-
- if($ckey && $csecret && $otoken && $osecret) {
-
- $twitter_post = intval(get_pconfig(local_user(),'twitter','post'));
- $twitter_enable = (($twitter_post && x($_POST,'twitter_enable')) ? intval($_POST['twitter_enable']) : 0);
-
- // if API is used, default to the chosen settings
- if($_POST['api_source'] && intval(get_pconfig(local_user(),'twitter','post_by_default')))
- $twitter_enable = 1;
-
- if($twitter_post && $twitter_enable) {
- logger('Posting to Twitter', LOGGER_DEBUG);
- require_once('library/twitteroauth.php');
- require_once('include/bbcode.php');
- $tweet = new TwitterOAuth($ckey,$csecret,$otoken,$osecret);
- $max_char = 140; // max. length for a tweet
- $msg = strip_tags(bbcode($b['body']));
- if ( strlen($msg) > $max_char) {
- $shortlink = "";
- require_once('library/slinky.php');
- // post url = base url + /display/ + owner + post id
- // we construct this from the Owner link and replace
- // profile by display - this will cause an error when
- // /profile/ is in the owner url twice but I don't
- // think this will be very common...
- $posturl = str_replace('/profile/','/display/',$b['owner-link']).'/'.$b['id'];
- $slinky = new Slinky( $posturl );
- // setup a cascade of shortening services
- // try to get a short link from these services
- // in the order ur1.ca, trim, id.gd, tinyurl
- $slinky->set_cascade( array( new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) );
- $shortlink = $slinky->short();
- // the new message will be shortened such that "... $shortlink"
- // will fit into the character limit
- $msg = substr($msg, 0, $max_char-strlen($shortlink)-4);
- $msg .= '... ' . $shortlink;
- }
- // and now tweet it :-)
- if(strlen($msg)) {
- $result = $tweet->post('statuses/update', array('status' => $msg));
- logger('twitter_post returns: ' . $result);
- }
-
- }
- }
- }
-}
-
-function twitter_plugin_admin_post(&$a){
- $consumerkey = ((x($_POST,'consumerkey')) ? notags(trim($_POST['consumerkey'])) : '');
- $consumersecret = ((x($_POST,'consumersecret')) ? notags(trim($_POST['consumersecret'])): '');
- set_config('twitter','consumerkey',$consumerkey);
- set_config('twitter','consumersecret',$consumersecret);
- info( t('Settings updated.'). EOL );
-}
-function twitter_plugin_admin(&$a, &$o){
- $t = file_get_contents( dirname(__file__). "/admin.tpl" );
- $o = replace_macros($t, array(
- '$submit' => t('Submit'),
- // name, label, value, help, [extra values]
- '$consumerkey' => array('consumerkey', t('Consumer key'), get_config('twitter', 'consumerkey' ), ''),
- '$consumersecret' => array('consumersecret', t('Consumer secret'), get_config('twitter', 'consumersecret' ), '')
- ));
-}
diff --git a/addon/widgets/settings.tpl b/addon/widgets/settings.tpl
deleted file mode 100644
index 9d0f21d29..000000000
--- a/addon/widgets/settings.tpl
+++ /dev/null
@@ -1,19 +0,0 @@
-<div class="settings-block">
- <h3 class="settings-heading">$title</h3>
- <div class='field noedit'>
- <label>$label</label>
- <tt>$key</tt>
- </div>
-
- <div class="settings-submit-wrapper">
- <input type="submit" value="$submit" class="settings-submit" name="widgets-submit" />
- </div>
-
- <h4>$widgets_h</h4>
- <ul>
- {{ for $widgets as $w }}
- <li><a href="$baseurl/widgets/$w.0/?k=$key&p=1">$w.1</a></li>
- {{ endfor }}
- </ul>
-
-</div>
diff --git a/addon/widgets/widget_friends.php b/addon/widgets/widget_friends.php
deleted file mode 100644
index 2286f68ca..000000000
--- a/addon/widgets/widget_friends.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-function friends_widget_name() {
- return "Shows profile contacts";
-}
-function friends_widget_help() {
- return "";
-}
-
-function friends_widget_args(){
- return Array();
-}
-
-function friends_widget_content(&$a, $conf){
-
- $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `user`.* FROM `profile`
- LEFT JOIN `user` ON `profile`.`uid` = `user`.`uid`
- WHERE `user`.`uid` = %s AND `profile`.`is-default` = 1 LIMIT 1",
- intval($conf['uid'])
- );
- if(!count($r)) return;
- $a->profile = $r[0];
-
- $o = "";
- $o .= "<style>
- .f9k_widget .contact-block-div { display: block !important; float: left!important; width: 50px!important; height: 50px!important; margin: 2px!important;}
- .f9k_widget #contact-block-end { clear: left; }
- </style>";
- $o .= _abs_url(contact_block());
- $o .= "<a href='".$a->get_baseurl().'/profile/'.$a->profile['nickname']."'>". t('Connect on Friendika!') ."</a>";
- return $o;
-}
diff --git a/addon/widgets/widget_like.php b/addon/widgets/widget_like.php
deleted file mode 100644
index 6927d4324..000000000
--- a/addon/widgets/widget_like.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-function like_widget_name() {
- return "Shows likes";
-}
-function like_widget_help() {
- return "Search first item which contains <em>KEY</em> and print like/dislike count";
-}
-
-function like_widget_args(){
- return Array("KEY");
-}
-
-function like_widget_content(&$a, $conf){
- $args = explode(",",$_GET['a']);
-
- if ($args[0]!=""){
- return " #TODO like/dislike count for item with <em>" .$args[0]. "</em> # ";
- } else {
- return " #TODO# ";
- }
-}
diff --git a/addon/widgets/widgets.js b/addon/widgets/widgets.js
deleted file mode 100644
index 45d36c4d7..000000000
--- a/addon/widgets/widgets.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * @author Fabio Comuni
- */
-
-var f9a_widget_$widget_id = {
- entrypoint : "$entrypoint",
- key : "$key",
- widgetid: "$widget_id",
- argstr: "$args",
- xmlhttp : null,
-
- getXHRObj : function(){
- if (window.XMLHttpRequest) {
- // code for IE7+, Firefox, Chrome, Opera, Safari
- this.xmlhttp = new XMLHttpRequest();
- } else {
- // code for IE6, IE5
- this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
- }
- },
-
- dorequest : function(args, cb) {
- if (args===null) args = new Array();
- args['k']=this.key;
- args['s']=window.location;
- args['a']=this.argstr;
- var urlencodedargs = new Array();
- for(k in args){ urlencodedargs.push( encodeURIComponent(k)+"="+encodeURIComponent(args[k]) ); }
-
- var url = this.entrypoint + "?"+ urlencodedargs.join("&");
-
- this.xmlhttp.open("GET", url ,true);
- this.xmlhttp.send();
- this.xmlhttp.obj = this;
- this.xmlhttp.onreadystatechange=function(){
- if (this.readyState==4){
- if (this.status==200) {
- cb(this.obj, this.responseText);
- } else {
- document.getElementById(this.obj.widgetid).innerHTML="Error loading widget.";
- }
- }
- }
-
- },
-
- requestcb: function(obj, responseText) {
- document.getElementById(obj.widgetid).innerHTML=responseText;
- },
-
- load : function (){
- this.getXHRObj();
- this.dorequest(null, this.requestcb);
- }
-
-};
-
-(function() {
- f9a_widget_$widget_id.load();
-})();
-
-document.writeln("<div id='$widget_id' class='f9k_widget'>");
-document.writeln("<img id='$widget_id_ld' src='$loader'>");
-document.writeln("</div>");
diff --git a/addon/widgets/widgets.php b/addon/widgets/widgets.php
deleted file mode 100644
index 13c4f93bb..000000000
--- a/addon/widgets/widgets.php
+++ /dev/null
@@ -1,170 +0,0 @@
-<?php
-/**
- * Name: Widgets
- * Description: Allow to embed info from friendika into another site
- * Version: 1.0
- * Author: Fabio Comuni <http://kirgroup.com/profile/fabrix/>
- */
-
-
-function widgets_install() {
- register_hook('plugin_settings', 'addon/widgets/widgets.php', 'widgets_settings');
- register_hook('plugin_settings_post', 'addon/widgets/widgets.php', 'widgets_settings_post');
- logger("installed widgets");
-}
-function widgets_uninstall() {
- unregister_hook('plugin_settings', 'addon/widgets/widgets.php', 'widgets_settings');
- unregister_hook('plugin_settings_post', 'addon/widgets/widgets.php', 'widgets_settings_post');
-}
-
-
-function widgets_settings_post(){
-
- if (isset($_POST['widgets-submit'])){
- del_pconfig(local_user(), 'widgets', 'key');
-
- }
-}
-
-function widgets_settings(&$a,&$o) {
- if(! local_user())
- return;
-
-
- $key = get_pconfig(local_user(), 'widgets', 'key' );
- if ($key=='') { $key = mt_rand(); set_pconfig(local_user(), 'widgets', 'key', $key); }
-
- $widgets = array();
- $d = dir(dirname(__file__));
- while(false !== ($f = $d->read())) {
- if(substr($f,0,7)=="widget_") {
- preg_match("|widget_([^.]+).php|", $f, $m);
- $w=$m[1];
- require_once($f);
- $widgets[] = array($w, call_user_func($w."_widget_name"));
-
- }
- }
-
-
-
- $t = file_get_contents( dirname(__file__). "/settings.tpl" );
- $o .= replace_macros($t, array(
- '$submit' => t('Generate new key'),
- '$baseurl' => $a->get_baseurl(),
- '$title' => "Widgets",
- '$label' => t('Widgets key'),
- '$key' => $key,
- '$widgets_h' => t('Widgets available'),
- '$widgets' => $widgets,
- ));
-
-}
-
-function widgets_module() {
- return;
-}
-
-function _abs_url($s){
- $a = get_app();
- return preg_replace("|href=(['\"])([^h][^t][^t][^p])|", "href=\$1".$a->get_baseurl()."/\$2", $s);
-}
-
-
-function widgets_content(&$a) {
-
- if (!isset($_GET['k'])) {
- if($a->argv[2]=="cb"){header('HTTP/1.0 400 Bad Request'); killme();}
- return;
- }
-
- $r = q("SELECT * FROM pconfig WHERE uid IN (SELECT uid FROM pconfig WHERE v='%s')AND cat='widgets'",
- dbesc($_GET['k'])
- );
- if (!count($r)){
- if($a->argv[2]=="cb"){header('HTTP/1.0 400 Bad Request'); killme();}
- return;
- }
- $conf = array();
- $conf['uid'] = $r[0]['uid'];
- foreach($r as $e) { $conf[$e['k']]=$e['v']; }
-
- $o = "";
-
- $widgetfile =dirname(__file__)."/widget_".$a->argv[1].".php";
- if (file_exists($widgetfile)){
- require_once($widgetfile);
- } else {
- if($a->argv[2]=="cb"){header('HTTP/1.0 400 Bad Request'); killme();}
- return;
- }
-
-
-
-
- //echo "<pre>"; var_dump($a->argv); die();
- if ($a->argv[2]=="cb"){
- /*if (!local_user()){
- if (!isset($_GET['s']))
- {header('HTTP/1.0 400 Bad Request'); killme();}
-
- if (substr($_GET['s'],0,strlen($conf['site'])) !== $conf['site'])
- {header('HTTP/1.0 400 Bad Request'); killme();}
- } */
- $o .= call_user_func($a->argv[1].'_widget_content',$a, $conf);
-
- } else {
-
-
- if (isset($_GET['p']) && local_user()==$conf['uid'] ) {
- $o .= "<style>.f9k_widget { float: left;border:1px solid black; }</style>";
- $o .= "<h1>Preview Widget</h1>";
- $o .= '<a href="'.$a->get_baseurl().'/settings/addon">'. t("Plugin Settings") .'</a>';
-
- $o .= "<h4>".call_user_func($a->argv[1].'_widget_name')."</h4>";
- $o .= call_user_func($a->argv[1].'_widget_help');
- $o .= "<br style='clear:left'/><br/>";
- $o .= "<script>";
- } else {
- header("content-type: application/x-javascript");
- }
-
-
-
-
- $script = file_get_contents(dirname(__file__)."/widgets.js");
- $o .= replace_macros($script, array(
- '$entrypoint' => $a->get_baseurl()."/widgets/".$a->argv[1]."/cb/",
- '$key' => $conf['key'],
- '$widget_id' => 'f9k_'.$a->argv[1]."_".time(),
- '$loader' => $a->get_baseurl()."/images/rotator.gif",
- '$args' => (isset($_GET['a'])?$_GET['a']:''),
- ));
-
-
- if (isset($_GET['p'])) {
- $jsargs = implode("</em>,<em>", call_user_func($a->argv[1].'_widget_args'));
- if ($jsargs!='') $jsargs = "&a=<em>".$jsargs."</em>";
-
- $o .= "</script>
- <br style='clear:left'/><br/>
- <h4>Copy and paste this code</h4>
- <code>"
-
- .htmlspecialchars('<script src="'.$a->get_baseurl().'/widgets/'.$a->argv[1].'?k='.$conf['key'])
- .$jsargs
- .htmlspecialchars('"></script>')
- ."</code>";
- return $o;
- }
-
- }
-
- echo $o;
- killme();
-}
-
-
-
-
-?>
diff --git a/boot.php b/boot.php
index f7670f459..44bfa868a 100644
--- a/boot.php
+++ b/boot.php
@@ -8,9 +8,9 @@ require_once("include/pgettext.php");
require_once('include/nav.php');
-define ( 'FRIENDIKA_VERSION', '2.2.1103' );
+define ( 'FRIENDIKA_VERSION', '2.3.1115' );
define ( 'DFRN_PROTOCOL_VERSION', '2.21' );
-define ( 'DB_UPDATE_VERSION', 1087 );
+define ( 'DB_UPDATE_VERSION', 1092 );
define ( 'EOL', "<br />\r\n" );
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
@@ -165,6 +165,7 @@ define ( 'ACTIVITY_OBJ_PHOTO', NAMESPACE_ACTIVITY_SCHEMA . 'photo' );
define ( 'ACTIVITY_OBJ_P_PHOTO', NAMESPACE_ACTIVITY_SCHEMA . 'profile-photo' );
define ( 'ACTIVITY_OBJ_ALBUM', NAMESPACE_ACTIVITY_SCHEMA . 'photo-album' );
define ( 'ACTIVITY_OBJ_EVENT', NAMESPACE_ACTIVITY_SCHEMA . 'event' );
+define ( 'ACTIVITY_OBJ_TAGTERM', NAMESPACE_DFRN . '/tagterm' );
/**
* item weight for query ordering
@@ -185,7 +186,9 @@ define ( 'GRAVITY_COMMENT', 6);
function startup() {
error_reporting(E_ERROR | E_WARNING | E_PARSE);
set_time_limit(0);
- ini_set('pcre.backtrack_limit', 250000);
+
+ // This has to be quite large to deal with embedded private photos
+ ini_set('pcre.backtrack_limit', 350000);
if (get_magic_quotes_gpc()) {
@@ -935,7 +938,7 @@ function profile_sidebar($profile, $block = 0) {
$o .= replace_macros($tpl, array(
'$profile' => $profile,
'$connect' => $connect,
- '$location' => $location,
+ '$location' => template_escape($location),
'$gender' => $gender,
'$pdesc' => $pdesc,
'$marital' => $marital,
diff --git a/database.sql b/database.sql
index ff339929e..08d02d67e 100644
--- a/database.sql
+++ b/database.sql
@@ -70,6 +70,7 @@ CREATE TABLE IF NOT EXISTS `contact` (
`alias` char(255) NOT NULL,
`pubkey` text NOT NULL,
`prvkey` text NOT NULL,
+ `batch` char(255) NOT NULL,
`request` text NOT NULL,
`notify` text NOT NULL,
`poll` text NOT NULL,
@@ -174,6 +175,7 @@ CREATE TABLE IF NOT EXISTS `item` (
`thr-parent` char(255) NOT NULL,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`edited` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `commented` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`received` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`changed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`owner-name` char(255) NOT NULL,
@@ -406,12 +408,16 @@ CREATE TABLE IF NOT EXISTS `user` (
`blocked` tinyint(1) unsigned NOT NULL DEFAULT '0',
`blockwall` tinyint(1) unsigned NOT NULL DEFAULT '0',
`hidewall` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ `blocktags` tinyint(1) unsigned NOT NULL DEFAULT '0',
`notify-flags` int(11) unsigned NOT NULL DEFAULT '65535',
`page-flags` int(11) unsigned NOT NULL DEFAULT '0',
`prvnets` tinyint(1) NOT NULL DEFAULT '0',
`pwdreset` char(255) NOT NULL,
`maxreq` int(11) NOT NULL DEFAULT '10',
`expire` int(11) unsigned NOT NULL DEFAULT '0',
+ `account_expired` tinyint( 1 ) NOT NULL DEFAULT '0',
+ `account_expires_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `expire_notification_sent` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`allow_cid` mediumtext NOT NULL,
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
@@ -463,7 +469,8 @@ CREATE TABLE IF NOT EXISTS `queue` (
`network` CHAR( 32 ) NOT NULL,
`created` DATETIME NOT NULL ,
`last` DATETIME NOT NULL ,
-`content` MEDIUMTEXT NOT NULL
+`content` MEDIUMTEXT NOT NULL,
+`batch` TINYINT( 1 ) NOT NULL DEFAULT '0'
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `pconfig` (
@@ -528,6 +535,7 @@ CREATE TABLE IF NOT EXISTS `fcontact` (
`request` CHAR( 255 ) NOT NULL,
`nick` CHAR( 255 ) NOT NULL ,
`addr` CHAR( 255 ) NOT NULL ,
+`batch` CHAR( 255) NOT NULL,
`notify` CHAR( 255 ) NOT NULL ,
`poll` CHAR( 255 ) NOT NULL ,
`confirm` CHAR( 255 ) NOT NULL ,
diff --git a/images/icons.png b/images/icons.png
index 494555aa6..dd3af3aee 100644
--- a/images/icons.png
+++ b/images/icons.png
Binary files differ
diff --git a/images/larrow.gif b/images/larrow.gif
index 3f895bc94..ab08bb57e 100644
--- a/images/larrow.gif
+++ b/images/larrow.gif
Binary files differ
diff --git a/images/logo.png b/images/logo.png
new file mode 100644
index 000000000..1b977b697
--- /dev/null
+++ b/images/logo.png
Binary files differ
diff --git a/images/lrarrow.gif b/images/lrarrow.gif
index ffcb43b00..fa2676944 100644
--- a/images/lrarrow.gif
+++ b/images/lrarrow.gif
Binary files differ
diff --git a/include/EmailNotification.php b/include/EmailNotification.php
index 78912c0b9..8861e8f5d 100644
--- a/include/EmailNotification.php
+++ b/include/EmailNotification.php
@@ -1,4 +1,7 @@
<?php
+
+require_once('include/email.php');
+
class EmailNotification {
/**
* Send a multipart/alternative message with Text and HTML versions
@@ -12,6 +15,10 @@ class EmailNotification {
* @param textVersion text only version of the message
*/
static public function sendTextHtmlEmail($fromName,$fromEmail,$replyTo,$toEmail,$messageSubject,$htmlVersion,$textVersion) {
+
+ $fromName = email_header_encode($fromName,'UTF-8');
+ $messageSubject = email_header_encode($messageSubject,'UTF-8');
+
// generate a mime boundary
$mimeBoundary =rand(0,9)."-"
diff --git a/include/Scrape.php b/include/Scrape.php
index 58468a40d..2af02fff5 100644
--- a/include/Scrape.php
+++ b/include/Scrape.php
@@ -249,20 +249,6 @@ function scrape_feed($url) {
return $ret;
- $items = $dom->getElementsByTagName('img');
-
- // get img elements (twitter)
-
- if($items) {
- foreach($items as $item) {
- $x = $item->getAttribute('id');
- if($x === 'profile-image') {
- $ret['photo'] = $item->getAttribute('src');
- }
- }
- }
-
-
$head = $dom->getElementsByTagName('base');
if($head) {
foreach($head as $head0) {
@@ -496,8 +482,10 @@ function probe_url($url, $mode = PROBE_NORMAL) {
}
if($diaspora && $diaspora_base && $diaspora_guid) {
- if($mode == PROBE_DIASPORA || ! $notify)
+ if($mode == PROBE_DIASPORA || ! $notify) {
$notify = $diaspora_base . 'receive/users/' . $diaspora_guid;
+ $batch = $diaspora_base . 'receive/public' ;
+ }
if(strpos($url,'@'))
$addr = str_replace('acct:', '', $url);
}
@@ -532,6 +520,9 @@ function probe_url($url, $mode = PROBE_NORMAL) {
else
$poll = $tapi . '?screen_name=' . $tid;
$profile = 'http://twitter.com/#!/' . $tid;
+ $vcard['photo'] = 'https://api.twitter.com/1/users/profile_image/' . $tid;
+ $vcard['nick'] = $tid;
+ $vcard['fn'] = $tid . '@twitter';
}
if(! x($vcard,'fn'))
@@ -675,6 +666,7 @@ function probe_url($url, $mode = PROBE_NORMAL) {
$result['nick'] = $vcard['nick'];
$result['url'] = $profile;
$result['addr'] = $addr;
+ $result['batch'] = $batch;
$result['notify'] = $notify;
$result['poll'] = $poll;
$result['request'] = $request;
diff --git a/include/api.php b/include/api.php
index 5d008c290..74b4aaf6e 100644
--- a/include/api.php
+++ b/include/api.php
@@ -55,7 +55,7 @@
// process normal login request
$r = q("SELECT * FROM `user` WHERE ( `email` = '%s' OR `nickname` = '%s' )
- AND `password` = '%s' AND `blocked` = 0 AND `verified` = 1 LIMIT 1",
+ AND `password` = '%s' AND `blocked` = 0 AND `account_expired` = 0 AND `verified` = 1 LIMIT 1",
dbesc(trim($user)),
dbesc(trim($user)),
dbesc($encrypted)
diff --git a/include/auth.php b/include/auth.php
index b7b96bdc0..1f16b3504 100644
--- a/include/auth.php
+++ b/include/auth.php
@@ -49,7 +49,7 @@ if((isset($_SESSION)) && (x($_SESSION,'authenticated')) && ((! (x($_POST,'auth-p
}
$r = q("SELECT `user`.*, `user`.`pubkey` as `upubkey`, `user`.`prvkey` as `uprvkey`
- FROM `user` WHERE `uid` = %d LIMIT 1",
+ FROM `user` WHERE `uid` = %d AND `blocked` = 0 AND `account_expired` = 0 AND `verified` = 1 LIMIT 1",
intval($_SESSION['uid'])
);
@@ -186,7 +186,7 @@ else {
$r = q("SELECT `user`.*, `user`.`pubkey` as `upubkey`, `user`.`prvkey` as `uprvkey`
FROM `user` WHERE ( `email` = '%s' OR `nickname` = '%s' )
- AND `password` = '%s' AND `blocked` = 0 AND `verified` = 1 LIMIT 1",
+ AND `password` = '%s' AND `blocked` = 0 AND `account_expired` = 0 AND `verified` = 1 LIMIT 1",
dbesc(trim($_POST['openid_url'])),
dbesc(trim($_POST['openid_url'])),
dbesc($encrypted)
diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php
index 5b240bdd2..c72c78445 100644
--- a/include/bb2diaspora.php
+++ b/include/bb2diaspora.php
@@ -3,30 +3,18 @@
require_once("include/oembed.php");
require_once('include/event.php');
-
-
+require_once('library/markdown.php');
+require_once('include/html2bbcode.php');
function diaspora2bb($s) {
- // bug #127
- $s = preg_replace('/\[(.+?)\]\((.+?)[^\\\]_(.+?)\)/','[$1]($2\\_$3)',$s);
-
-
- $s = str_replace(array('\\**','\\__','\\*','\\_'), array('-^doublestar^-','-^doublescore-^','-^star^-','-^score^-'),$s);
- $s = preg_replace("/\*\*\*(.+?)\*\*\*/", '[b][i]$1[/i][/b]', $s);
- $s = preg_replace("/\_\_\_(.+?)\_\_\_/", '[b][i]$1[/i][/b]', $s);
- $s = preg_replace("/\*\*(.+?)\*\*/", '[b]$1[/b]', $s);
- $s = preg_replace("/\_\_(.+?)\_\_/", '[b]$1[/b]', $s);
- $s = preg_replace("/\*(.+?)\*/", '[i]$1[/i]', $s);
- $s = preg_replace("/\_(.+?)\_/", '[i]$1[/i]', $s);
-
- $s = str_replace(array('-^doublestar^-','-^doublescore-^','-^star^-','-^score^-'), array('**','__','*','_'), $s);
- $s = preg_replace('/\!\[(.+?)\]\((.+?)\)/','[img]$2[/img]',$s);
- $s = preg_replace('/\[(.+?)\]\((.+?)\)/','[url=$2]$1[/url]',$s);
$s = preg_replace('/\@\{(.+?)\; (.+?)\@(.+?)\}/','@[url=https://$3/u/$2]$1[/url]',$s);
+ $s = Markdown($s);
+ $s = html2bbcode($s);
+// $s = preg_replace('/\[url=(.+?)\<em\>(.+?)\]/ism','[url=$1_$2]',$s);
+// $s = preg_replace('/\[url=(.+?)\<\/em\>(.+?)\]/ism','[url=$1_$2]',$s);
- $s = escape_tags($s);
return $s;
}
@@ -188,8 +176,7 @@ function bb2diaspora($Text,$preserve_nl = false) {
$Text = preg_replace("/\<(.*?)(src|href)=(.*?)\&amp\;(.*?)\>/ism",'<$1$2=$3&$4>',$Text);
- $Text = preg_replace('/\[(.*?)\\\\_(.*?)\]\((.*?)\)/ism','[$1_$2]($3)',$Text);
- $Text = preg_replace('/\[(.*?)\\\\\*(.*?)\]\((.*?)\)/ism','[$1*$2]($3)',$Text);
+ $Text = preg_replace('/\[(.*?)\]\((.*?)\\\\_(.*?)\)/ism','[$1]($2_$3)',$Text);
call_hooks('bb2diaspora',$Text);
diff --git a/include/bbcode.php b/include/bbcode.php
index 3886af37d..9abc7c439 100644
--- a/include/bbcode.php
+++ b/include/bbcode.php
@@ -43,11 +43,11 @@ function bbcode($Text,$preserve_nl = false) {
// Perform URL Search
- $Text = preg_replace("/([^\]\=]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/", '$1<a href="$2" target="external-link">$2</a>', $Text);
+ $Text = preg_replace("/([^\]\=]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1<a href="$2" target="external-link">$2</a>', $Text);
- $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/m", '<a href="$1" target="external-link">$1</a>', $Text);
- $Text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/m", '<a href="$1" target="external-link">$2</a>', $Text);
- //$Text = preg_replace("/\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[\/url\]/m", '<a href="$1" target="_blank">$2</a>', $Text);
+ $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/ism", '<a href="$1" target="external-link">$1</a>', $Text);
+ $Text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '<a href="$1" target="external-link">$2</a>', $Text);
+ //$Text = preg_replace("/\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[\/url\]/ism", '<a href="$1" target="_blank">$2</a>', $Text);
// Perform MAIL Search
@@ -95,7 +95,7 @@ function bbcode($Text,$preserve_nl = false) {
// $Text = str_replace("[*]", "<li>", $Text);
// Check for font change text
- $Text = preg_replace("/\[font=(.*?)\](.*?)\[\/font\]/m","<span style=\"font-family: $1;\">$2</span>",$Text);
+ $Text = preg_replace("/\[font=(.*?)\](.*?)\[\/font\]/sm","<span style=\"font-family: $1;\">$2</span>",$Text);
// Declare the format for [code] layout
@@ -113,6 +113,9 @@ function bbcode($Text,$preserve_nl = false) {
// Check for [quote] text
$Text = preg_replace("/\[quote\](.*?)\[\/quote\]/ism","$QuoteLayout", $Text);
+ // [img=widthxheight]image source[/img]
+ $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '<img src="$3" style="height: $2px; width: $1px;" >', $Text);
+
// Images
// [img]pathtoimage[/img]
$Text = preg_replace("/\[img\](.*?)\[\/img\]/ism", '<img src="$1" alt="' . t('Image/photo') . '" />', $Text);
@@ -125,8 +128,6 @@ function bbcode($Text,$preserve_nl = false) {
$Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '<iframe src="$1" width="425" height="350"><a href="$1">$1</a></iframe>', $Text);
- // [img=widthxheight]image source[/img]
- $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '<img src="$3" style="height:{$2}px; width:{$1}px;" >', $Text);
if (get_pconfig(local_user(), 'oembed', 'use_for_youtube' )==1){
// use oembed for youtube links
diff --git a/include/conversation.php b/include/conversation.php
index aeb30177f..10d9bad2c 100644
--- a/include/conversation.php
+++ b/include/conversation.php
@@ -211,21 +211,21 @@ function conversation(&$a, $items, $mode, $update) {
$o .= replace_macros($tpl,array(
'$id' => $item['item_id'],
- '$linktitle' => sprintf( t('View %s\'s profile'), $profile_name),
+ '$linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])),
'$profile_url' => $profile_link,
'$item_photo_menu' => item_photo_menu($item),
- '$name' => $profile_name,
+ '$name' => template_escape($profile_name),
'$sparkle' => $sparkle,
'$lock' => $lock,
'$thumb' => $profile_avatar,
- '$title' => $item['title'],
- '$body' => $body,
+ '$title' => template_escape($item['title']),
+ '$body' => template_escape($body),
'$ago' => (($item['app']) ? sprintf( t('%s from %s'),relative_date($item['created']),$item['app']) : relative_date($item['created'])),
- '$location' => $location,
+ '$location' => template_escape($location),
'$indent' => '',
'$owner_url' => $owner_url,
'$owner_photo' => $owner_photo,
- '$owner_name' => $owner_name,
+ '$owner_name' => template_escape($owner_name),
'$star' => $star,
'$drop' => $drop,
'$conv' => '<a href="' . $a->get_baseurl() . '/display/' . $nickname . '/' . $item['id'] . '">' . t('View in context') . '</a>'
@@ -505,27 +505,27 @@ function conversation(&$a, $items, $mode, $update) {
$tmp_item = replace_macros($template,array(
+ '$body' => template_escape($body),
'$id' => $item['item_id'],
- '$linktitle' => sprintf( t('View %s\'s profile'), $profile_name),
- '$olinktitle' => sprintf( t('View %s\'s profile'), $owner_name),
+ '$linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])),
+ '$olinktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['owner-link'])) ? $item['owner-link'] : $item['url'])),
'$to' => t('to'),
'$wall' => t('Wall-to-Wall'),
'$vwall' => t('via Wall-To-Wall:'),
'$profile_url' => $profile_link,
'$item_photo_menu' => item_photo_menu($item),
- '$name' => $profile_name,
+ '$name' => template_escape($profile_name),
'$thumb' => $profile_avatar,
'$osparkle' => $osparkle,
'$sparkle' => $sparkle,
- '$title' => $item['title'],
- '$body' => $body,
+ '$title' => template_escape($item['title']),
'$ago' => ((($item['app']) && ($item['id'] == $item['parent'])) ? sprintf( t('%s from %s'),relative_date($item['created']),$item['app']) : relative_date($item['created'])),
'$lock' => $lock,
- '$location' => $location,
+ '$location' => template_escape($location),
'$indent' => $indent,
'$owner_url' => $owner_url,
'$owner_photo' => $owner_photo,
- '$owner_name' => $owner_name,
+ '$owner_name' => template_escape($owner_name),
'$plink' => get_plink($item),
'$edpost' => $edpost,
'$isstarred' => $isstarred,
@@ -535,6 +535,7 @@ function conversation(&$a, $items, $mode, $update) {
'$like' => $like,
'$dislike' => $dislike,
'$comment' => $comment
+
));
@@ -755,7 +756,7 @@ function status_editor($a,$x, $notes_cid = 0) {
if($mail_enabled) {
$selected = (($pubmail_enabled) ? ' checked="checked" ' : '');
- $jotnets .= '<div class="profile-jot-net"><input type="checkbox" name="pubmail_enable"' . $selected . 'value="1" /> '
+ $jotnets .= '<div class="profile-jot-net"><input type="checkbox" name="pubmail_enable"' . $selected . ' value="1" /> '
. t("Post to Email") . '</div>';
}
diff --git a/include/delivery.php b/include/delivery.php
index 18ef09a31..706c07b3b 100644
--- a/include/delivery.php
+++ b/include/delivery.php
@@ -31,7 +31,7 @@ function delivery_run($argv, $argc){
$a->set_baseurl(get_config('system','url'));
- logger('delivery: invoked: ' . print_r($argv,true));
+ logger('delivery: invoked: ' . print_r($argv,true), LOGGER_DEBUG);
$cmd = $argv[1];
$item_id = intval($argv[2]);
@@ -145,6 +145,7 @@ function delivery_run($argv, $argc){
$public_message = true;
// fill this in with a single salmon slap if applicable
+
$slap = '';
require_once('include/group.php');
@@ -195,8 +196,6 @@ function delivery_run($argv, $argc){
$public_message = false; // private recipients, not public
}
- $conversant_str = intval($contact_id);
-
$r = q("SELECT * FROM `contact` WHERE `id` = %d AND `blocked` = 0 AND `pending` = 0",
intval($contact_id)
);
@@ -204,62 +203,10 @@ function delivery_run($argv, $argc){
if(count($r))
$contact = $r[0];
-
- $feed_template = get_markup_template('atom_feed.tpl');
- $mail_template = get_markup_template('atom_mail.tpl');
-
- $atom = '';
- $slaps = array();
-
$hubxml = feed_hublinks();
- $birthday = feed_birthday($owner['uid'],$owner['timezone']);
-
- if(strlen($birthday))
- $birthday = '<dfrn:birthday>' . xmlify($birthday) . '</dfrn:birthday>';
-
- $atom .= replace_macros($feed_template, array(
- '$version' => xmlify(FRIENDIKA_VERSION),
- '$feed_id' => xmlify($a->get_baseurl() . '/profile/' . $owner['nickname'] ),
- '$feed_title' => xmlify($owner['name']),
- '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', $updated . '+00:00' , ATOM_TIME)) ,
- '$hub' => $hubxml,
- '$salmon' => '', // private feed, we don't use salmon here
- '$name' => xmlify($owner['name']),
- '$profile_page' => xmlify($owner['url']),
- '$photo' => xmlify($owner['photo']),
- '$thumb' => xmlify($owner['thumb']),
- '$picdate' => xmlify(datetime_convert('UTC','UTC',$owner['avatar-date'] . '+00:00' , ATOM_TIME)) ,
- '$uridate' => xmlify(datetime_convert('UTC','UTC',$owner['uri-date'] . '+00:00' , ATOM_TIME)) ,
- '$namdate' => xmlify(datetime_convert('UTC','UTC',$owner['name-date'] . '+00:00' , ATOM_TIME)) ,
- '$birthday' => $birthday
- ));
-
- foreach($items as $item) {
- if(! $item['parent'])
- continue;
-
- // private emails may be in included in public conversations. Filter them.
- if(($public_message) && $item['private'])
- continue;
-
- $item_contact = get_item_contact($item,$icontacts);
- if(! $item_contact)
- continue;
-
- $atom .= atom_entry($item,'text',$item_contact,$owner,true);
-
- if(($top_level) && ($public_message) && ($item['author-link'] === $item['owner-link']) && (! $expire))
- $slaps[] = atom_entry($item,'html',$item_contact,$owner,true);
- }
-
- $atom .= '</feed>' . "\r\n";
-
- logger('notifier: ' . $atom, LOGGER_DATA);
-
logger('notifier: slaps: ' . print_r($slaps,true), LOGGER_DATA);
-
require_once('include/salmon.php');
if($contact['self'])
@@ -271,6 +218,55 @@ function delivery_run($argv, $argc){
case NETWORK_DFRN :
logger('notifier: dfrndelivery: ' . $contact['name']);
+
+ $feed_template = get_markup_template('atom_feed.tpl');
+ $mail_template = get_markup_template('atom_mail.tpl');
+
+ $atom = '';
+
+
+ $birthday = feed_birthday($owner['uid'],$owner['timezone']);
+
+ if(strlen($birthday))
+ $birthday = '<dfrn:birthday>' . xmlify($birthday) . '</dfrn:birthday>';
+
+ $atom .= replace_macros($feed_template, array(
+ '$version' => xmlify(FRIENDIKA_VERSION),
+ '$feed_id' => xmlify($a->get_baseurl() . '/profile/' . $owner['nickname'] ),
+ '$feed_title' => xmlify($owner['name']),
+ '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', $updated . '+00:00' , ATOM_TIME)) ,
+ '$hub' => $hubxml,
+ '$salmon' => '', // private feed, we don't use salmon here
+ '$name' => xmlify($owner['name']),
+ '$profile_page' => xmlify($owner['url']),
+ '$photo' => xmlify($owner['photo']),
+ '$thumb' => xmlify($owner['thumb']),
+ '$picdate' => xmlify(datetime_convert('UTC','UTC',$owner['avatar-date'] . '+00:00' , ATOM_TIME)) ,
+ '$uridate' => xmlify(datetime_convert('UTC','UTC',$owner['uri-date'] . '+00:00' , ATOM_TIME)) ,
+ '$namdate' => xmlify(datetime_convert('UTC','UTC',$owner['name-date'] . '+00:00' , ATOM_TIME)) ,
+ '$birthday' => $birthday
+ ));
+
+ foreach($items as $item) {
+ if(! $item['parent'])
+ continue;
+
+ // private emails may be in included in public conversations. Filter them.
+ if(($public_message) && $item['private'])
+ continue;
+
+ $item_contact = get_item_contact($item,$icontacts);
+ if(! $item_contact)
+ continue;
+
+ $atom .= atom_entry($item,'text',$item_contact,$owner,true);
+
+ }
+
+ $atom .= '</feed>' . "\r\n";
+
+ logger('notifier: ' . $atom, LOGGER_DATA);
+
$deliver_status = dfrn_deliver($owner,$contact,$atom);
logger('notifier: dfrn_delivery returns ' . $deliver_status);
@@ -299,7 +295,25 @@ function delivery_run($argv, $argc){
// only send salmon if public - e.g. if it's ok to notify
// a public hub, it's ok to send a salmon
- if((count($slaps)) && ($public_message) && (! $expire)) {
+ if(($public_message) && (! $expire)) {
+ $slaps = array();
+
+ foreach($items as $item) {
+ if(! $item['parent'])
+ continue;
+
+ // private emails may be in included in public conversations. Filter them.
+ if(($public_message) && $item['private'])
+ continue;
+
+ $item_contact = get_item_contact($item,$icontacts);
+ if(! $item_contact)
+ continue;
+
+ if(($top_level) && ($public_message) && ($item['author-link'] === $item['owner-link']) && (! $expire))
+ $slaps[] = atom_entry($item,'html',$item_contact,$owner,true);
+ }
+
logger('notifier: slapdelivery: ' . $contact['name']);
foreach($slaps as $slappy) {
if($contact['notify']) {
@@ -393,12 +407,17 @@ function delivery_run($argv, $argc){
break;
case NETWORK_DIASPORA :
- logger('delivery: diaspora deliver: ' . $contact['name']);
+ if($public_message)
+ $loc = 'public batch ' . $contact['batch'];
+ else
+ $loc = $contact['name'];
+
+ logger('delivery: diaspora batch deliver: ' . $loc);
if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode))
break;
- if(! $contact['pubkey'])
+ if((! $contact['pubkey']) && (! $public_message))
break;
if($target_item['verb'] === ACTIVITY_DISLIKE) {
@@ -406,23 +425,23 @@ function delivery_run($argv, $argc){
break;
}
elseif(($target_item['deleted']) && ($target_item['verb'] !== ACTIVITY_LIKE)) {
- logger('delivery: diaspora retract: ' . $contact['name']);
+ logger('delivery: diaspora retract: ' . $loc);
// diaspora delete,
- diaspora_send_retraction($target_item,$owner,$contact);
+ diaspora_send_retraction($target_item,$owner,$contact,$public_message);
break;
}
elseif($target_item['parent'] != $target_item['id']) {
- logger('delivery: diaspora relay: ' . $contact['name']);
+ logger('delivery: diaspora relay: ' . $loc);
// we are the relay - send comments, likes and unlikes to our conversants
- diaspora_send_relay($target_item,$owner,$contact);
+ diaspora_send_relay($target_item,$owner,$contact,$public_message);
break;
}
elseif(($top_level) && (! $walltowall)) {
// currently no workable solution for sending walltowall
- logger('delivery: diaspora status: ' . $contact['name']);
- diaspora_send_status($target_item,$owner,$contact);
+ logger('delivery: diaspora status: ' . $loc);
+ diaspora_send_status($target_item,$owner,$contact,$public_message);
break;
}
diff --git a/include/diaspora.php b/include/diaspora.php
index 6d070ecba..80fbff8d6 100644
--- a/include/diaspora.php
+++ b/include/diaspora.php
@@ -5,34 +5,55 @@ require_once('include/items.php');
require_once('include/bb2diaspora.php');
require_once('include/contact_selectors.php');
+
+function diaspora_dispatch_public($msg) {
+
+ $r = q("SELECT `user`.* FROM `user` WHERE `user`.`uid` IN ( SELECT `contact`.`uid` FROM `contact` WHERE `contact`.`network` = '%s' AND `contact`.`addr` = '%s' ) AND `account_expired` = 0 ",
+ dbesc(NETWORK_DIASPORA),
+ dbesc($msg['author'])
+ );
+ if(count($r)) {
+ foreach($r as $rr) {
+ logger('diaspora_public: delivering to: ' . $rr['username']);
+ diaspora_dispatch($rr,$msg);
+ }
+ }
+ else
+ logger('diaspora_public: no subscribers');
+}
+
+
+
function diaspora_dispatch($importer,$msg) {
+ $ret = 0;
+
$parsed_xml = parse_xml_string($msg['message'],false);
$xmlbase = $parsed_xml->post;
if($xmlbase->request) {
- diaspora_request($importer,$xmlbase->request);
+ $ret = diaspora_request($importer,$xmlbase->request);
}
elseif($xmlbase->status_message) {
- diaspora_post($importer,$xmlbase->status_message);
+ $ret = diaspora_post($importer,$xmlbase->status_message);
}
elseif($xmlbase->comment) {
- diaspora_comment($importer,$xmlbase->comment,$msg);
+ $ret = diaspora_comment($importer,$xmlbase->comment,$msg);
}
elseif($xmlbase->like) {
- diaspora_like($importer,$xmlbase->like,$msg);
+ $ret = diaspora_like($importer,$xmlbase->like,$msg);
}
elseif($xmlbase->retraction) {
- diaspora_retraction($importer,$xmlbase->retraction,$msg);
+ $ret = diaspora_retraction($importer,$xmlbase->retraction,$msg);
}
elseif($xmlbase->photo) {
- diaspora_photo($importer,$xmlbase->photo,$msg);
+ $ret = diaspora_photo($importer,$xmlbase->photo,$msg);
}
else {
logger('diaspora_dispatch: unknown message type: ' . print_r($xmlbase,true));
}
- return;
+ return $ret;
}
function diaspora_get_contact_by_handle($uid,$handle) {
@@ -47,6 +68,7 @@ function diaspora_get_contact_by_handle($uid,$handle) {
}
function find_diaspora_person_by_handle($handle) {
+ $update = false;
$r = q("select * from fcontact where network = '%s' and addr = '%s' limit 1",
dbesc(NETWORK_DIASPORA),
dbesc($handle)
@@ -54,18 +76,14 @@ function find_diaspora_person_by_handle($handle) {
if(count($r)) {
// update record occasionally so it doesn't get stale
$d = strtotime($r[0]['updated'] . ' +00:00');
- if($d < strtotime('now - 14 days')) {
- q("delete from fcontact where id = %d limit 1",
- intval($r[0]['id'])
- );
- }
- else
+ if($d > strtotime('now - 14 days'))
return $r[0];
+ $update = true;
}
require_once('include/Scrape.php');
$r = probe_url($handle, PROBE_DIASPORA);
if((count($r)) && ($r['network'] === NETWORK_DIASPORA)) {
- add_fcontact($r);
+ add_fcontact($r,$update);
return ($r);
}
return false;
@@ -82,9 +100,60 @@ function get_diaspora_key($uri) {
}
-function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey) {
+function diaspora_pubmsg_build($msg,$user,$contact,$prvkey,$pubkey) {
$a = get_app();
+ logger('diaspora_pubmsg_build: ' . $msg, LOGGER_DATA);
+
+
+ $handle = $user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
+
+// $b64_data = base64_encode($msg);
+// $b64url_data = base64url_encode($b64_data);
+
+ $b64url_data = base64url_encode($msg);
+
+ $data = str_replace(array("\n","\r"," ","\t"),array('','','',''),$b64url_data);
+
+ $type = 'application/xml';
+ $encoding = 'base64url';
+ $alg = 'RSA-SHA256';
+
+ $signable_data = $data . '.' . base64url_encode($type) . '.'
+ . base64url_encode($encoding) . '.' . base64url_encode($alg) ;
+
+ $signature = rsa_sign($signable_data,$prvkey);
+ $sig = base64url_encode($signature);
+
+$magic_env = <<< EOT
+<?xml version='1.0' encoding='UTF-8'?>
+<diaspora xmlns="https://joindiaspora.com/protocol" xmlns:me="http://salmon-protocol.org/ns/magic-env" >
+ <header>
+ <author_id>$handle</author_id>
+ </header>
+ <me:env>
+ <me:encoding>base64url</me:encoding>
+ <me:alg>RSA-SHA256</me:alg>
+ <me:data type="application/xml">$data</me:data>
+ <me:sig>$sig</me:sig>
+ </me:env>
+</diaspora>
+EOT;
+
+ logger('diaspora_pubmsg_build: magic_env: ' . $magic_env, LOGGER_DATA);
+ return $magic_env;
+
+}
+
+
+
+
+function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey,$public = false) {
+ $a = get_app();
+
+ if($public)
+ return diaspora_pubmsg_build($msg,$user,$contact,$prvkey,$pubkey);
+
logger('diaspora_msg_build: ' . $msg, LOGGER_DATA);
$inner_aes_key = random_string(32);
@@ -97,7 +166,7 @@ function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey) {
$outer_iv = random_string(16);
$b_outer_iv = base64_encode($outer_iv);
- $handle = 'acct:' . $user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
+ $handle = $user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
$padded_data = pkcs5_pad($msg,16);
$inner_encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $inner_aes_key, $padded_data, MCRYPT_MODE_CBC, $inner_iv);
@@ -106,16 +175,14 @@ function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey) {
$b64url_data = base64url_encode($b64_data);
- $b64url_stripped = str_replace(array("\n","\r"," ","\t"),array('','','',''),$b64url_data);
- $lines = str_split($b64url_stripped,60);
- $data = implode("\n",$lines);
- $data = $data . (($data[-1] != "\n") ? "\n" : '') ;
- $type = 'application/atom+xml';
+ $data = str_replace(array("\n","\r"," ","\t"),array('','','',''),$b64url_data);
+
+ $type = 'application/xml';
$encoding = 'base64url';
$alg = 'RSA-SHA256';
- $signable_data = $data . '.' . base64url_encode($type) . "\n" . '.'
- . base64url_encode($encoding) . "\n" . '.' . base64url_encode($alg) . "\n";
+ $signable_data = $data . '.' . base64url_encode($type) . '.'
+ . base64url_encode($encoding) . '.' . base64url_encode($alg) ;
$signature = rsa_sign($signable_data,$prvkey);
$sig = base64url_encode($signature);
@@ -124,10 +191,7 @@ $decrypted_header = <<< EOT
<decrypted_header>
<iv>$b_inner_iv</iv>
<aes_key>$b_inner_aes_key</aes_key>
- <author>
- <name>{$user['username']}</name>
- <uri>$handle</uri>
- </author>
+ <author_id>$handle</author_id>
</decrypted_header>
EOT;
@@ -152,15 +216,15 @@ EOT;
$magic_env = <<< EOT
<?xml version='1.0' encoding='UTF-8'?>
-<entry xmlns='http://www.w3.org/2005/Atom'>
+<diaspora xmlns="https://joindiaspora.com/protocol" xmlns:me="http://salmon-protocol.org/ns/magic-env" >
$encrypted_header
- <me:env xmlns:me="http://salmon-protocol.org/ns/magic-env">
+ <me:env>
<me:encoding>base64url</me:encoding>
<me:alg>RSA-SHA256</me:alg>
- <me:data type="application/atom+xml">$data</me:data>
+ <me:data type="application/xml">$data</me:data>
<me:sig>$sig</me:sig>
</me:env>
-</entry>
+</diaspora>
EOT;
logger('diaspora_msg_build: magic_env: ' . $magic_env, LOGGER_DATA);
@@ -185,50 +249,67 @@ EOT;
function diaspora_decode($importer,$xml) {
+ $public = false;
$basedom = parse_xml_string($xml);
- $atom = $basedom->children(NAMESPACE_ATOM1);
+ $children = $basedom->children('https://joindiaspora.com/protocol');
- // Diaspora devs: This is kind of sucky - 'encrypted_header' does not belong in the atom namespace
+ if($children->header) {
+ $public = true;
+ $author_link = str_replace('acct:','',$children->header->author_id);
+ }
+ else {
- $encrypted_header = json_decode(base64_decode($atom->encrypted_header));
+ $encrypted_header = json_decode(base64_decode($children->encrypted_header));
- $encrypted_aes_key_bundle = base64_decode($encrypted_header->aes_key);
- $ciphertext = base64_decode($encrypted_header->ciphertext);
+ $encrypted_aes_key_bundle = base64_decode($encrypted_header->aes_key);
+ $ciphertext = base64_decode($encrypted_header->ciphertext);
+
+ $outer_key_bundle = '';
+ openssl_private_decrypt($encrypted_aes_key_bundle,$outer_key_bundle,$importer['prvkey']);
+
+ $j_outer_key_bundle = json_decode($outer_key_bundle);
+
+ $outer_iv = base64_decode($j_outer_key_bundle->iv);
+ $outer_key = base64_decode($j_outer_key_bundle->key);
+
+ $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $outer_key, $ciphertext, MCRYPT_MODE_CBC, $outer_iv);
- $outer_key_bundle = '';
- openssl_private_decrypt($encrypted_aes_key_bundle,$outer_key_bundle,$importer['prvkey']);
- $j_outer_key_bundle = json_decode($outer_key_bundle);
+ $decrypted = pkcs5_unpad($decrypted);
- $outer_iv = base64_decode($j_outer_key_bundle->iv);
- $outer_key = base64_decode($j_outer_key_bundle->key);
+ /**
+ * $decrypted now contains something like
+ *
+ * <decrypted_header>
+ * <iv>8e+G2+ET8l5BPuW0sVTnQw==</iv>
+ * <aes_key>UvSMb4puPeB14STkcDWq+4QE302Edu15oaprAQSkLKU=</aes_key>
- $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $outer_key, $ciphertext, MCRYPT_MODE_CBC, $outer_iv);
+***** OBSOLETE
+ * <author>
+ * <name>Ryan Hughes</name>
+ * <uri>acct:galaxor@diaspora.pirateship.org</uri>
+ * </author>
- $decrypted = pkcs5_unpad($decrypted);
+***** CURRENT
- /**
- * $decrypted now contains something like
- *
- * <decrypted_header>
- * <iv>8e+G2+ET8l5BPuW0sVTnQw==</iv>
- * <aes_key>UvSMb4puPeB14STkcDWq+4QE302Edu15oaprAQSkLKU=</aes_key>
- * <author>
- * <name>Ryan Hughes</name>
- * <uri>acct:galaxor@diaspora.pirateship.org</uri>
- * </author>
- * </decrypted_header>
- */
+ * <author_id>galaxor@diaspora.priateship.org</author_id>
- logger('decrypted: ' . $decrypted, LOGGER_DEBUG);
- $idom = parse_xml_string($decrypted,false);
+***** END DIFFS
- $inner_iv = base64_decode($idom->iv);
- $inner_aes_key = base64_decode($idom->aes_key);
+ * </decrypted_header>
+ */
- $author_link = str_replace('acct:','',$idom->author->uri);
+ logger('decrypted: ' . $decrypted, LOGGER_DEBUG);
+ $idom = parse_xml_string($decrypted,false);
+
+ $inner_iv = base64_decode($idom->iv);
+ $inner_aes_key = base64_decode($idom->aes_key);
+
+ $author_link = str_replace('acct:','',$idom->author_id);
+
+ }
$dom = $basedom->children(NAMESPACE_SALMON_ME);
@@ -255,16 +336,6 @@ function diaspora_decode($importer,$xml) {
// strip whitespace so our data element will return to one big base64 blob
$data = str_replace(array(" ","\t","\r","\n"),array("","","",""),$base->data);
- // Add back the 60 char linefeeds
-
- // This completely violates the entire principle of salmon magic signatures,
- // which was to have a message signing format that was completely ambivalent to linefeeds
- // and transport whitespace mangling, and base64 wrapping rules. Guess what? PHP and Ruby
- // use different linelengths for base64 output.
-
- $lines = str_split($data,60);
- $data = implode("\n",$lines);
-
// stash away some other stuff for later
@@ -273,22 +344,25 @@ function diaspora_decode($importer,$xml) {
$encoding = $base->encoding;
$alg = $base->alg;
- // I can't even begin to tell you how sucky this is. Please read the spec.
- $signed_data = $data . (($data[-1] != "\n") ? "\n" : '') . '.' . base64url_encode($type) . "\n" . '.' . base64url_encode($encoding) . "\n" . '.' . base64url_encode($alg) . "\n";
+ $signed_data = $data . '.' . base64url_encode($type) . '.' . base64url_encode($encoding) . '.' . base64url_encode($alg);
// decode the data
$data = base64url_decode($data);
- // Now pull out the inner encrypted blob
- $inner_encrypted = base64_decode($data);
+ if($public) {
+ $inner_decrypted = $data;
+ }
+ else {
- $inner_decrypted =
- $inner_decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $inner_aes_key, $inner_encrypted, MCRYPT_MODE_CBC, $inner_iv);
+ // Decode the encrypted blob
- $inner_decrypted = pkcs5_unpad($inner_decrypted);
+ $inner_encrypted = base64_decode($data);
+ $inner_decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $inner_aes_key, $inner_encrypted, MCRYPT_MODE_CBC, $inner_iv);
+ $inner_decrypted = pkcs5_unpad($inner_decrypted);
+ }
if(! $author_link) {
logger('mod-diaspora: Could not retrieve author URI.');
@@ -321,7 +395,6 @@ function diaspora_decode($importer,$xml) {
}
-
function diaspora_request($importer,$xml) {
$sender_handle = unxmlify($xml->sender_handle);
@@ -332,7 +405,6 @@ function diaspora_request($importer,$xml) {
$contact = diaspora_get_contact_by_handle($importer['uid'],$sender_handle);
-
if($contact) {
// perhaps we were already sharing with this person. Now they're sharing with us.
@@ -357,13 +429,16 @@ function diaspora_request($importer,$xml) {
return;
}
- $r = q("INSERT INTO `contact` (`uid`, `network`,`addr`,`created`,`url`,`name`,`nick`,`photo`,`pubkey`,`notify`,`poll`,`blocked`,`priority`)
- VALUES ( %d, '%s', '%s', '%s','%s','%s','%s','%s','%s','%s','%s',%d,%d) ",
+ $batch = (($ret['batch']) ? $ret['batch'] : implode('/', array_slice(explode('/',$ret['url']),0,3)) . '/receive/public');
+
+ $r = q("INSERT INTO `contact` (`uid`, `network`,`addr`,`created`,`url`,`batch`,`name`,`nick`,`photo`,`pubkey`,`notify`,`poll`,`blocked`,`priority`)
+ VALUES ( %d, '%s', '%s', '%s','%s','%s','%s','%s','%s','%s','%s','%s',%d,%d) ",
intval($importer['uid']),
dbesc($ret['network']),
dbesc($ret['addr']),
datetime_convert(),
dbesc($ret['url']),
+ dbesc($batch),
dbesc($ret['name']),
dbesc($ret['nick']),
dbesc($ret['photo']),
@@ -408,8 +483,7 @@ function diaspora_post($importer,$xml) {
if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) {
logger('diaspora_post: Ignoring this author.');
- http_status_exit(202);
- // NOTREACHED
+ return 202;
}
$message_id = $diaspora_handle . ':' . $guid;
@@ -493,8 +567,7 @@ function diaspora_comment($importer,$xml,$msg) {
if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) {
logger('diaspora_comment: Ignoring this author.');
- http_status_exit(202);
- // NOTREACHED
+ return 202;
}
$r = q("SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
@@ -535,7 +608,7 @@ function diaspora_comment($importer,$xml,$msg) {
}
}
- if(! rsa_verify($author_signed_data,$author_signature,$key,'sha')) {
+ if(! rsa_verify($author_signed_data,$author_signature,$key,'sha256')) {
logger('diaspora_comment: verification failed.');
return;
}
@@ -548,7 +621,7 @@ function diaspora_comment($importer,$xml,$msg) {
$key = $msg['key'];
- if(! rsa_verify($owner_signed_data,$parent_author_signature,$key,'sha')) {
+ if(! rsa_verify($owner_signed_data,$parent_author_signature,$key,'sha256')) {
logger('diaspora_comment: owner verification failed.');
return;
}
@@ -633,8 +706,7 @@ function diaspora_photo($importer,$xml,$msg) {
if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) {
logger('diaspora_photo: Ignoring this author.');
- http_status_exit(202);
- // NOTREACHED
+ return 202;
}
$r = q("SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
@@ -686,8 +758,7 @@ function diaspora_like($importer,$xml,$msg) {
if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) {
logger('diaspora_like: Ignoring this author.');
- http_status_exit(202);
- // NOTREACHED
+ return 202;
}
$r = q("SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
@@ -743,7 +814,7 @@ function diaspora_like($importer,$xml,$msg) {
}
}
- if(! rsa_verify($author_signed_data,$author_signature,$key,'sha')) {
+ if(! rsa_verify($author_signed_data,$author_signature,$key,'sha256')) {
logger('diaspora_like: verification failed.');
return;
}
@@ -756,7 +827,7 @@ function diaspora_like($importer,$xml,$msg) {
$key = $msg['key'];
- if(! rsa_verify($owner_signed_data,$parent_author_signature,$key,'sha')) {
+ if(! rsa_verify($owner_signed_data,$parent_author_signature,$key,'sha256')) {
logger('diaspora_like: owner verification failed.');
return;
}
@@ -877,7 +948,7 @@ function diaspora_retraction($importer,$xml) {
}
}
- http_exit_status(202);
+ return 202;
// NOTREACHED
}
@@ -917,7 +988,7 @@ function diaspora_unshare($me,$contact) {
-function diaspora_send_status($item,$owner,$contact) {
+function diaspora_send_status($item,$owner,$contact,$public_batch = false) {
$a = get_app();
$myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
@@ -959,19 +1030,19 @@ function diaspora_send_status($item,$owner,$contact) {
logger('diaspora_send_status: ' . $owner['username'] . ' -> ' . $contact['name'] . ' base message: ' . $msg, LOGGER_DATA);
- $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'])));
+ $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch)));
- $return_code = diaspora_transmit($owner,$contact,$slap);
+ $return_code = diaspora_transmit($owner,$contact,$slap,$public_batch);
if(count($images)) {
- diaspora_send_images($item,$owner,$contact,$images);
+ diaspora_send_images($item,$owner,$contact,$images,$public_batch);
}
return $return_code;
}
-function diaspora_send_images($item,$owner,$contact,$images) {
+function diaspora_send_images($item,$owner,$contact,$images,$public_batch = false) {
$a = get_app();
if(! count($images))
return;
@@ -1003,14 +1074,14 @@ function diaspora_send_images($item,$owner,$contact,$images) {
logger('diaspora_send_photo: base message: ' . $msg, LOGGER_DATA);
- $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'])));
+ $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch)));
- diaspora_transmit($owner,$contact,$slap);
+ diaspora_transmit($owner,$contact,$slap,$public_batch);
}
}
-function diaspora_send_followup($item,$owner,$contact) {
+function diaspora_send_followup($item,$owner,$contact,$public_batch = false) {
$a = get_app();
$myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
@@ -1044,7 +1115,7 @@ function diaspora_send_followup($item,$owner,$contact) {
else
$signed_text = $item['guid'] . ';' . $parent_guid . ';' . $text . ';' . $myaddr;
- $authorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha'));
+ $authorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256'));
$msg = replace_macros($tpl,array(
'$guid' => xmlify($item['guid']),
@@ -1058,13 +1129,13 @@ function diaspora_send_followup($item,$owner,$contact) {
logger('diaspora_followup: base message: ' . $msg, LOGGER_DATA);
- $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'])));
+ $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch)));
- return(diaspora_transmit($owner,$contact,$slap));
+ return(diaspora_transmit($owner,$contact,$slap,$public_batch));
}
-function diaspora_send_relay($item,$owner,$contact) {
+function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
$a = get_app();
@@ -1131,7 +1202,7 @@ function diaspora_send_relay($item,$owner,$contact) {
else
$signed_text = $item['guid'] . ';' . $parent_guid . ';' . $text . ';' . $myaddr;
- $authorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha'));
+ $authorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256'));
q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
intval($item['id']),
@@ -1145,7 +1216,7 @@ function diaspora_send_relay($item,$owner,$contact) {
// sign it
- $parentauthorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha'));
+ $parentauthorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256'));
$msg = replace_macros($tpl,array(
'$guid' => xmlify($item['guid']),
@@ -1160,15 +1231,15 @@ function diaspora_send_relay($item,$owner,$contact) {
logger('diaspora_relay_comment: base message: ' . $msg, LOGGER_DATA);
- $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'])));
+ $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch)));
- return(diaspora_transmit($owner,$contact,$slap));
+ return(diaspora_transmit($owner,$contact,$slap,$public_batch));
}
-function diaspora_send_retraction($item,$owner,$contact) {
+function diaspora_send_retraction($item,$owner,$contact,$public_batch = false) {
$a = get_app();
$myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
@@ -1180,30 +1251,32 @@ function diaspora_send_retraction($item,$owner,$contact) {
'$handle' => $myaddr
));
- $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'])));
+ $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch)));
- return(diaspora_transmit($owner,$contact,$slap));
+ return(diaspora_transmit($owner,$contact,$slap,$public_batch));
}
-function diaspora_transmit($owner,$contact,$slap) {
+function diaspora_transmit($owner,$contact,$slap,$public_batch) {
$a = get_app();
-
- post_url($contact['notify'] . '/',$slap);
+ $logid = random_string(4);
+ logger('diaspora_transmit: ' . $logid . ' ' . (($public_batch) ? $contact['batch'] : $contact['notify']));
+ post_url((($public_batch) ? $contact['batch'] : $contact['notify']) . '/',$slap);
$return_code = $a->get_curl_code();
- logger('diaspora_transmit: returns: ' . $return_code);
+ logger('diaspora_transmit: ' . $logid . ' returns: ' . $return_code);
if(! $return_code) {
logger('diaspora_transmit: queue message');
// queue message for redelivery
- q("INSERT INTO `queue` ( `cid`, `created`, `last`, `content`)
+ q("INSERT INTO `queue` ( `cid`, `created`, `last`, `content`,`batch`)
VALUES ( %d, '%s', '%s', '%s') ",
intval($contact['id']),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
- dbesc($slap)
+ dbesc($slap),
+ intval($public_batch)
);
}
diff --git a/include/email.php b/include/email.php
index a36d9adab..3e6a8186d 100644
--- a/include/email.php
+++ b/include/email.php
@@ -169,6 +169,17 @@ function email_get_part($mbox,$uid,$p,$partno) {
function email_header_encode($in_str, $charset) {
$out_str = $in_str;
+ $need_to_convert = false;
+
+ for($x = 0; $x < strlen($in_str); $x ++) {
+ if((ord($in_str[$x]) == 0) || ((ord($in_str[$x]) > 128))) {
+ $need_to_convert = true;
+ }
+ }
+
+ if(! $need_to_convert)
+ return $in_str;
+
if ($out_str && $charset) {
// define start delimimter, end delimiter and spacer
@@ -205,4 +216,6 @@ function email_header_encode($in_str, $charset) {
$out_str = $start . $out_str . $end;
}
return $out_str;
-} \ No newline at end of file
+}
+
+
diff --git a/include/group.php b/include/group.php
index d92e24e20..e3c7d33d4 100644
--- a/include/group.php
+++ b/include/group.php
@@ -6,8 +6,26 @@ function group_add($uid,$name) {
$ret = false;
if(x($uid) && x($name)) {
$r = group_byname($uid,$name); // check for dups
- if($r !== false)
+ if($r !== false) {
+
+ // This could be a problem.
+ // Let's assume we've just created a group which we once deleted
+ // all the old members are gone, but the group remains so we don't break any security
+ // access lists. What we're doing here is reviving the dead group, but old content which
+ // was restricted to this group may now be seen by the new group members.
+
+ $z = q("SELECT * FROM `group` WHERE `id` = %d LIMIT 1",
+ intval($r)
+ );
+ if(count($z) && $z[0]['deleted']) {
+ $r = q("UPDATE `group` SET `deleted` = 0 WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
+ intval($uid),
+ dbesc($name)
+ );
+ notice( t('A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name.') . EOL);
+ }
return true;
+ }
$r = q("INSERT INTO `group` ( `uid`, `name` )
VALUES( %d, '%s' ) ",
intval($uid),
@@ -146,15 +164,15 @@ function group_side($every="contacts",$each="group",$edit = false, $group_id = 0
$createtext = t('Create a new group');
$linktext= t('Everybody');
- $selected = (($group_id == 0) ? ' class="group-selected" ' : '');
+ $selected = (($group_id == 0) ? ' group-selected' : '');
$o .= <<< EOT
-<div id="group-sidebar">
+<div id="group-sidebar" class="widget">
<h3>Groups</h3>
<div id="sidebar-group-list">
<ul id="sidebar-group-ul">
- <li class="sidebar-group-li" ><a href="$every" class="sidebar-group-element" $selected >$linktext</a></li>
+ <li class="sidebar-group-li" ><a href="$every" class="sidebar-group-element$selected" >$linktext</a></li>
EOT;
@@ -167,13 +185,13 @@ EOT;
if(count($r)) {
foreach($r as $rr) {
- $selected = (($group_id == $rr['id']) ? ' class="group-selected" ' : '');
+ $selected = (($group_id == $rr['id']) ? ' group-selected' : '');
$o .= ' <li class="sidebar-group-li">'
. (($edit) ? "<a href=\"group/{$rr['id']}\" title=\"" . t('Edit')
. "\" class=\"groupsideedit\" ><img src=\"images/spencil.gif\" alt=\"" . t('Edit') . "\"></a> " : "")
. (($cid) ? '<input type="checkbox" class="' . (($selected) ? 'ticked' : 'unticked') . '" onclick="contactgroupChangeMember(' . $rr['id'] . ',' . $cid . ');return true;" '
. ((in_array($rr['id'],$member_of)) ? ' checked="checked" ' : '') . '/>' : '')
- . "<a href=\"$each/{$rr['id']}\" class=\"sidebar-group-element\" $selected >{$rr['name']}</a></li>\r\n";
+ . "<a href=\"$each/{$rr['id']}\" class=\"sidebar-group-element" . $selected ."\" >{$rr['name']}</a></li>\r\n";
}
}
$o .= " </ul>\r\n </div>";
diff --git a/include/items.php b/include/items.php
index facd8b2d4..da5a18cad 100644
--- a/include/items.php
+++ b/include/items.php
@@ -717,6 +717,7 @@ function item_store($arr,$force_parent = false) {
$arr['owner-avatar'] = ((x($arr,'owner-avatar')) ? notags(trim($arr['owner-avatar'])) : '');
$arr['created'] = ((x($arr,'created') !== false) ? datetime_convert('UTC','UTC',$arr['created']) : datetime_convert());
$arr['edited'] = ((x($arr,'edited') !== false) ? datetime_convert('UTC','UTC',$arr['edited']) : datetime_convert());
+ $arr['commented'] = datetime_convert();
$arr['received'] = datetime_convert();
$arr['changed'] = datetime_convert();
$arr['title'] = ((x($arr,'title')) ? notags(trim($arr['title'])) : '');
@@ -865,6 +866,14 @@ function item_store($arr,$force_parent = false) {
intval($current_post)
);
+ // update the commented timestamp on the parent
+
+ q("UPDATE `item` set `commented` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1",
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ intval($parent_id)
+ );
+
if($dsprsig) {
q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
intval($current_post),
@@ -1606,13 +1615,18 @@ function lose_follower($importer,$contact,$datarray,$item) {
}
-function subscribe_to_hub($url,$importer,$contact) {
+function subscribe_to_hub($url,$importer,$contact,$submode = 'subscribe') {
if(is_array($importer)) {
$r = q("SELECT `nickname` FROM `user` WHERE `uid` = %d LIMIT 1",
intval($importer['uid'])
);
}
+
+ // Diaspora has different message-ids in feeds than they do
+ // through the direct Diaspora protocol. If we try and use
+ // the feed, we'll get duplicates. So don't.
+
if((! count($r)) || $contact['network'] === NETWORK_DIASPORA)
return;
@@ -1622,7 +1636,7 @@ function subscribe_to_hub($url,$importer,$contact) {
$verify_token = ((strlen($contact['hub-verify'])) ? $contact['hub-verify'] : random_string());
- $params= 'hub.mode=subscribe&hub.callback=' . urlencode($push_url) . '&hub.topic=' . urlencode($contact['poll']) . '&hub.verify=async&hub.verify_token=' . $verify_token;
+ $params= 'hub.mode=' . $hubmode . '&hub.callback=' . urlencode($push_url) . '&hub.topic=' . urlencode($contact['poll']) . '&hub.verify=async&hub.verify_token=' . $verify_token;
logger('subscribe_to_hub: subscribing ' . $contact['name'] . ' to hub ' . $url . ' with verifier ' . $verify_token);
diff --git a/include/network.php b/include/network.php
index deb257ff3..ec99d1e0d 100644
--- a/include/network.php
+++ b/include/network.php
@@ -701,24 +701,59 @@ function parse_xml_string($s,$strict = true) {
return $x;
}}
-function add_fcontact($arr) {
-
- $r = q("insert into fcontact ( `url`,`name`,`photo`,`request`,`nick`,`addr`,
- `notify`,`poll`,`confirm`,`network`,`alias`,`pubkey`,`updated` )
- values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
- dbesc($arr['url']),
- dbesc($arr['name']),
- dbesc($arr['photo']),
- dbesc($arr['request']),
- dbesc($arr['nick']),
- dbesc($arr['addr']),
- dbesc($arr['notify']),
- dbesc($arr['poll']),
- dbesc($arr['confirm']),
- dbesc($arr['network']),
- dbesc($arr['alias']),
- dbesc($arr['pubkey']),
- dbesc(datetime_convert())
- );
+function add_fcontact($arr,$update = false) {
+
+ if($update) {
+ $r = q("UPDATE `fcontact` SET
+ `name` = '%s',
+ `photo` = '%s',
+ `request` = '%s',
+ `nick` = '%s',
+ `addr` = '%s',
+ `batch` = '%s',
+ `notify` = '%s',
+ `poll` = '%s',
+ `confirm` = '%s',
+ `alias` = '%s',
+ `pubkey` = '%s',
+ `updated` = '%s'
+ WHERE `url` = '%s' AND `network` = '%s' LIMIT 1",
+ dbesc($arr['name']),
+ dbesc($arr['photo']),
+ dbesc($arr['request']),
+ dbesc($arr['nick']),
+ dbesc($arr['addr']),
+ dbesc($arr['batch']),
+ dbesc($arr['notify']),
+ dbesc($arr['poll']),
+ dbesc($arr['confirm']),
+ dbesc($arr['network']),
+ dbesc($arr['alias']),
+ dbesc($arr['pubkey']),
+ dbesc(datetime_convert()),
+ dbesc($arr['url']),
+ dbesc($arr['network'])
+ );
+ }
+ else {
+ $r = q("insert into fcontact ( `url`,`name`,`photo`,`request`,`nick`,`addr`,
+ `batch`, `notify`,`poll`,`confirm`,`network`,`alias`,`pubkey`,`updated` )
+ values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
+ dbesc($arr['url']),
+ dbesc($arr['name']),
+ dbesc($arr['photo']),
+ dbesc($arr['request']),
+ dbesc($arr['nick']),
+ dbesc($arr['addr']),
+ dbesc($arr['batch']),
+ dbesc($arr['notify']),
+ dbesc($arr['poll']),
+ dbesc($arr['confirm']),
+ dbesc($arr['network']),
+ dbesc($arr['alias']),
+ dbesc($arr['pubkey']),
+ dbesc(datetime_convert())
+ );
+ }
return $r;
}
diff --git a/include/notifier.php b/include/notifier.php
index 6ac882c19..748d15743 100644
--- a/include/notifier.php
+++ b/include/notifier.php
@@ -409,6 +409,8 @@ function notifier_run($argv, $argc){
foreach($r as $contact) {
if((! $mail) && (! $fsuggest) && (! $followup) && (! $contact['self'])) {
+ if(($contact['network'] === NETWORK_DIASPORA) && ($public_message))
+ continue;
q("insert into deliverq ( `cmd`,`item`,`contact` ) values ('%s', %d, %d )",
dbesc($cmd),
intval($item_id),
@@ -583,9 +585,19 @@ function notifier_run($argv, $argc){
break;
case NETWORK_DIASPORA:
require_once('include/diaspora.php');
+
if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode))
break;
+ // special handling for followup to public post
+ // all other public posts processed as public batches further below
+
+ if($public_message) {
+ if($followup)
+ diaspora_send_followup($target_item,$owner,$contact, true);
+ break;
+ }
+
if(! $contact['pubkey'])
break;
@@ -643,17 +655,25 @@ function notifier_run($argv, $argc){
if($public_message) {
- $r = q("SELECT `id`, `name` FROM `contact`
- WHERE `network` in ('%s','%s') AND `uid` = %d AND `blocked` = 0 AND `pending` = 0
+ $r1 = q("SELECT DISTINCT(`batch`), `id`, `name`,`network` FROM `contact` WHERE `network` = '%s'
+ AND `uid` = %d AND `rel` != %d ORDER BY rand() ",
+ dbesc(NETWORK_DIASPORA),
+ intval($owner['uid']),
+ intval(CONTACT_IS_SHARING)
+ );
+
+ $r2 = q("SELECT `id`, `name`,`network` FROM `contact`
+ WHERE `network` = '%s' AND `uid` = %d AND `blocked` = 0 AND `pending` = 0
AND `rel` != %d order by rand() ",
dbesc(NETWORK_DFRN),
- dbesc(NETWORK_DIASPORA),
intval($owner['uid']),
intval(CONTACT_IS_SHARING)
);
+ $r = array_merge($r2,$r1);
+
if(count($r)) {
- logger('pubdeliver: ' . print_r($r,true));
+ logger('pubdeliver: ' . print_r($r,true), LOGGER_DEBUG);
// throw everything into the queue in case we get killed
@@ -669,9 +689,10 @@ function notifier_run($argv, $argc){
foreach($r as $rr) {
- /* Don't deliver to folks who have already been delivered to */
+ // except for Diaspora batch jobs
+ // Don't deliver to folks who have already been delivered to
- if(in_array($rr['id'],$conversants)) {
+ if(($rr['network'] !== NETWORK_DIASPORA) && (in_array($rr['id'],$conversants))) {
logger('notifier: already delivered id=' . $rr['id']);
continue;
}
diff --git a/include/pgettext.php b/include/pgettext.php
index 49f100737..83e76ba9d 100644
--- a/include/pgettext.php
+++ b/include/pgettext.php
@@ -90,8 +90,11 @@ if(! function_exists('load_translation_table')) {
function load_translation_table($lang) {
global $a;
- if(file_exists("view/$lang/strings.php"))
+ if(file_exists("view/$lang/strings.php")) {
include("view/$lang/strings.php");
+ }
+ else
+ $a->strings = array();
}}
// translate string if translation exists
@@ -110,12 +113,15 @@ function t($s) {
if(! function_exists('tt')){
function tt($singular, $plural, $count){
-
+ global $lang;
$a = get_app();
if(x($a->strings,$singular)) {
$t = $a->strings[$singular];
- $k = string_plural_select($count);
+ $f = 'string_plural_select_' . str_replace('-','_',$lang);
+ if(! function_exists($f))
+ $f = 'string_plural_select_default';
+ $k = $f($count);
return is_array($t)?$t[$k]:$t;
}
@@ -124,4 +130,13 @@ function tt($singular, $plural, $count){
} else {
return $singular;
}
-}} \ No newline at end of file
+}}
+
+// provide a fallback which will not collide with
+// a function defined in any language file
+
+if(! function_exists('string_plural_select_default')) {
+function string_plural_select_default($n) {
+ return ($n != 1);
+}}
+
diff --git a/include/poller.php b/include/poller.php
index e80b696bf..fd2a0af8f 100644
--- a/include/poller.php
+++ b/include/poller.php
@@ -86,11 +86,12 @@ function poller_run($argv, $argc){
// and which have a polling address and ignore Diaspora since
// we are unable to match those posts with a Diaspora GUID and prevent duplicates.
- $contacts = q("SELECT `id` FROM `contact`
+ $contacts = q("SELECT `contact`.`id` FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid`
WHERE ( `rel` = %d OR `rel` = %d ) AND `poll` != ''
AND `network` != '%s'
$sql_extra
- AND `self` = 0 AND `blocked` = 0 AND `readonly` = 0 ORDER BY RAND()",
+ AND `self` = 0 AND `contact`.`blocked` = 0 AND `contact`.`readonly` = 0
+ AND `user`.`account_expired` = 0 ORDER BY RAND()",
intval(CONTACT_IS_SHARING),
intval(CONTACT_IS_FRIEND),
dbesc(NETWORK_DIASPORA)
@@ -137,6 +138,8 @@ function poller_run($argv, $argc){
if((datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day")) || $force)
$hub_update = true;
}
+ else
+ $hub_update = false;
/**
* Based on $contact['priority'], should we poll this site now? Or later?
@@ -472,21 +475,25 @@ function poller_run($argv, $argc){
consume_feed($xml,$importer,$contact,$hub,1);
+ $hubmode = 'subscribe';
+ if($contact['network'] === NETWORK_DFRN || $contact['blocked'] || $contact['readonly'])
+ $hubmode = 'unsubscribe';
- if((strlen($hub)) && ($hub_update) && (($contact['rel'] == CONTACT_IS_FRIEND) || (($contact['network'] === NETWORK_OSTATUS) && (! $contact['readonly'])))) {
- logger('poller: subscribing to hub(s) : ' . $hub . ' contact name : ' . $contact['name'] . ' local user : ' . $importer['name']);
+ if((strlen($hub)) && ($hub_update) && ($contact['rel'] != CONTACT_IS_FOLLOWER)) {
+ logger('poller: hub ' . $hubmode . ' : ' . $hub . ' contact name : ' . $contact['name'] . ' local user : ' . $importer['name']);
$hubs = explode(',', $hub);
if(count($hubs)) {
foreach($hubs as $h) {
$h = trim($h);
if(! strlen($h))
continue;
- subscribe_to_hub($h,$importer,$contact);
+ subscribe_to_hub($h,$importer,$contact,$hubmode);
}
}
}
}
+
$updated = datetime_convert();
$r = q("UPDATE `contact` SET `last-update` = '%s', `success_update` = '%s' WHERE `id` = %d LIMIT 1",
diff --git a/include/profile_advanced.php b/include/profile_advanced.php
index c1dfad66f..22e035fe6 100644
--- a/include/profile_advanced.php
+++ b/include/profile_advanced.php
@@ -12,8 +12,8 @@ if($a->profile['name']) {
$o .= <<< EOT
<div id="advanced-profile-name-wrapper" >
-<div id="advanced-profile-name-text">$lbl_fullname</div>
-<div id="advanced-profile-name">$fullname</div>
+<div id="advanced-profile-name-text" class="advanced-profile-label">$lbl_fullname</div>
+<div id="advanced-profile-name" class="advanced-profile-content">$fullname</div>
</div>
<div id="advanced-profile-name-end"></div>
EOT;
@@ -25,8 +25,8 @@ if($a->profile['gender']) {
$o .= <<< EOT
<div id="advanced-profile-gender-wrapper" >
-<div id="advanced-profile-gender-text">$lbl_gender</div>
-<div id="advanced-profile-gender">$gender</div>
+<div id="advanced-profile-gender-text" class="advanced-profile-label">$lbl_gender</div>
+<div id="advanced-profile-gender" class="advanced-profile-content">$gender</div>
</div>
<div id="advanced-profile-gender-end"></div>
EOT;
@@ -37,7 +37,7 @@ if(($a->profile['dob']) && ($a->profile['dob'] != '0000-00-00')) {
$o .= <<< EOT
<div id="advanced-profile-dob-wrapper" >
-<div id="advanced-profile-dob-text">$lbl_birthday</div>
+<div id="advanced-profile-dob-text" class="advanced-profile-label">$lbl_birthday</div>
EOT;
// If no year, add an arbitrary one so just we can parse the month and day.
@@ -45,7 +45,7 @@ EOT;
$year_bd_format = t('j F, Y');
$short_bd_format = t('j F');
-$o .= '<div id="advanced-profile-dob">'
+$o .= '<div id="advanced-profile-dob" class="advanced-profile-content">'
. ((intval($a->profile['dob']))
? day_translate(datetime_convert('UTC','UTC',$a->profile['dob'] . ' 00:00 +00:00',$year_bd_format))
: day_translate(datetime_convert('UTC','UTC','2001-' . substr($a->profile['dob'],6) . ' 00:00 +00:00',$short_bd_format)))
@@ -59,8 +59,8 @@ if($age = age($a->profile['dob'],$a->profile['timezone'],'')) {
$lbl_age = t('Age:');
$o .= <<< EOT
<div id="advanced-profile-age-wrapper" >
-<div id="advanced-profile-age-text">$lbl_age</div>
-<div id="advanced-profile-age">$age</div>
+<div id="advanced-profile-age-text" class="advanced-profile-label">$lbl_age</div>
+<div id="advanced-profile-age" class="advanced-profile-content">$age</div>
</div>
<div id="advanced-profile-age-end"></div>
EOT;
@@ -72,8 +72,8 @@ if($a->profile['marital']) {
$o .= <<< EOT
<div id="advanced-profile-marital-wrapper" >
-<div id="advanced-profile-marital-text">$lbl_marital</div>
-<div id="advanced-profile-marital">$marital</div>
+<div id="advanced-profile-marital-text" class="advanced-profile-label">$lbl_marital</div>
+<div id="advanced-profile-marital" class="advanced-profile-content">$marital</div>
EOT;
if($a->profile['with']) {
@@ -92,8 +92,8 @@ if($a->profile['sexual']) {
$o .= <<< EOT
<div id="advanced-profile-sexual-wrapper" >
-<div id="advanced-profile-sexual-text">$lbl_sexual</div>
-<div id="advanced-profile-sexual">$sexual</div>
+<div id="advanced-profile-sexual-text" class="advanced-profile-label">$lbl_sexual</div>
+<div id="advanced-profile-sexual" class="advanced-profile-content">$sexual</div>
</div>
<div id="advanced-profile-sexual-end"></div>
EOT;
@@ -104,8 +104,8 @@ if($a->profile['homepage']) {
$homepage = linkify($a->profile['homepage']);
$o .= <<< EOT
<div id="advanced-profile-homepage-wrapper" >
-<div id="advanced-profile-homepage-text">$lbl_homepage</div>
-<div id="advanced-profile-homepage">$homepage</div>
+<div id="advanced-profile-homepage-text" class="advanced-profile-label">$lbl_homepage</div>
+<div id="advanced-profile-homepage" class="advanced-profile-content">$homepage</div>
</div>
<div id="advanced-profile-homepage-end"></div>
EOT;
@@ -116,8 +116,8 @@ if($a->profile['politic']) {
$politic = $a->profile['politic'];
$o .= <<< EOT
<div id="advanced-profile-politic-wrapper" >
-<div id="advanced-profile-politic-text">$lbl_politic</div>
-<div id="advanced-profile-politic">$politic</div>
+<div id="advanced-profile-politic-text" class="advanced-profile-label">$lbl_politic</div>
+<div id="advanced-profile-politic" class="advanced-profile-content">$politic</div>
</div>
<div id="advanced-profile-politic-end"></div>
EOT;
@@ -128,8 +128,8 @@ if($a->profile['religion']) {
$religion = $a->profile['religion'];
$o .= <<< EOT
<div id="advanced-profile-religion-wrapper" >
-<div id="advanced-profile-religion-text">$lbl_religion</div>
-<div id="advanced-profile-religion">$religion</div>
+<div id="advanced-profile-religion-text" class="advanced-profile-label">$lbl_religion</div>
+<div id="advanced-profile-religion" class="advanced-profile-content">$religion</div>
</div>
<div id="advanced-profile-religion-end"></div>
EOT;
@@ -138,9 +138,9 @@ if($txt = prepare_text($a->profile['about'])) {
$lbl_about = t('About:');
$o .= <<< EOT
<div id="advanced-profile-about-wrapper" >
-<div id="advanced-profile-about-text">$lbl_about</div>
+<div id="advanced-profile-about-text" class="advanced-profile-label">$lbl_about</div>
<br />
-<div id="advanced-profile-about">$txt</div>
+<div id="advanced-profile-about" class="advanced-profile-content">$txt</div>
</div>
<div id="advanced-profile-about-end"></div>
EOT;
@@ -150,9 +150,9 @@ if($txt = prepare_text($a->profile['interest'])) {
$lbl_interests = t('Hobbies/Interests:');
$o .= <<< EOT
<div id="advanced-profile-interest-wrapper" >
-<div id="advanced-profile-interest-text">$lbl_interests</div>
+<div id="advanced-profile-interest-text" class="advanced-profile-label">$lbl_interests</div>
<br />
-<div id="advanced-profile-interest">$txt</div>
+<div id="advanced-profile-interest" class="advanced-profile-content">$txt</div>
</div>
<div id="advanced-profile-interest-end"></div>
EOT;
@@ -162,9 +162,9 @@ if($txt = prepare_text($a->profile['contact'])) {
$lbl_contact = t('Contact information and Social Networks:');
$o .= <<< EOT
<div id="advanced-profile-contact-wrapper" >
-<div id="advanced-profile-contact-text">$lbl_contact</div>
+<div id="advanced-profile-contact-text" class="advanced-profile-label">$lbl_contact</div>
<br />
-<div id="advanced-profile-contact">$txt</div>
+<div id="advanced-profile-contact" class="advanced-profile-content">$txt</div>
</div>
<div id="advanced-profile-contact-end"></div>
EOT;
@@ -174,9 +174,9 @@ if($txt = prepare_text($a->profile['music'])) {
$lbl_music = t('Musical interests:');
$o .= <<< EOT
<div id="advanced-profile-music-wrapper" >
-<div id="advanced-profile-music-text">$lbl_music</div>
+<div id="advanced-profile-music-text" class="advanced-profile-label">$lbl_music</div>
<br />
-<div id="advanced-profile-music">$txt</div>
+<div id="advanced-profile-music" class="advanced-profile-content">$txt</div>
</div>
<div id="advanced-profile-music-end"></div>
EOT;
@@ -186,9 +186,9 @@ if($txt = prepare_text($a->profile['book'])) {
$lbl_book = t('Books, literature:');
$o .= <<< EOT
<div id="advanced-profile-book-wrapper" >
-<div id="advanced-profile-book-text">$lbl_book</div>
+<div id="advanced-profile-book-text" class="advanced-profile-label">$lbl_book</div>
<br />
-<div id="advanced-profile-book">$txt</div>
+<div id="advanced-profile-book" class="advanced-profile-content">$txt</div>
</div>
<div id="advanced-profile-book-end"></div>
EOT;
@@ -198,9 +198,9 @@ if($txt = prepare_text($a->profile['tv'])) {
$lbl_tv = t('Television:');
$o .= <<< EOT
<div id="advanced-profile-tv-wrapper" >
-<div id="advanced-profile-tv-text">$lbl_tv</div>
+<div id="advanced-profile-tv-text" class="advanced-profile-label">$lbl_tv</div>
<br />
-<div id="advanced-profile-tv">$txt</div>
+<div id="advanced-profile-tv" class="advanced-profile-content">$txt</div>
</div>
<div id="advanced-profile-tv-end"></div>
EOT;
@@ -210,9 +210,9 @@ if($txt = prepare_text($a->profile['film'])) {
$lbl_film = t('Film/dance/culture/entertainment:');
$o .= <<< EOT
<div id="advanced-profile-film-wrapper" >
-<div id="advanced-profile-film-text">$lbl_film</div>
+<div id="advanced-profile-film-text" class="advanced-profile-label">$lbl_film</div>
<br />
-<div id="advanced-profile-film">$txt</div>
+<div id="advanced-profile-film" class="advanced-profile-content">$txt</div>
</div>
<div id="advanced-profile-film-end"></div>
EOT;
@@ -222,9 +222,9 @@ if($txt = prepare_text($a->profile['romance'])) {
$lbl_romance = t('Love/Romance:');
$o .= <<< EOT
<div id="advanced-profile-romance-wrapper" >
-<div id="advanced-profile-romance-text">$lbl_romance</div>
+<div id="advanced-profile-romance-text" class="advanced-profile-label">$lbl_romance</div>
<br />
-<div id="advanced-profile-romance">$txt</div>
+<div id="advanced-profile-romance" class="advanced-profile-content">$txt</div>
</div>
<div id="advanced-profile-romance-end"></div>
EOT;
@@ -234,9 +234,9 @@ if($txt = prepare_text($a->profile['work'])) {
$lbl_work = t('Work/employment:');
$o .= <<< EOT
<div id="advanced-profile-work-wrapper" >
-<div id="advanced-profile-work-text">$lbl_work</div>
+<div id="advanced-profile-work-text" class="advanced-profile-label">$lbl_work</div>
<br />
-<div id="advanced-profile-work">$txt</div>
+<div id="advanced-profile-work" class="advanced-profile-content">$txt</div>
</div>
<div id="advanced-profile-work-end"></div>
EOT;
@@ -246,9 +246,9 @@ if($txt = prepare_text($a->profile['education'])) {
$lbl_education = t('School/education:');
$o .= <<< EOT
<div id="advanced-profile-education-wrapper" >
-<div id="advanced-profile-education-text">$lbl_education</div>
+<div id="advanced-profile-education-text" class="advanced-profile-label">$lbl_education</div>
<br />
-<div id="advanced-profile-education">$txt</div>
+<div id="advanced-profile-education" class="advanced-profile-content">$txt</div>
</div>
<div id="advanced-profile-education-end"></div>
EOT;
diff --git a/include/queue.php b/include/queue.php
index 5119a65d8..d312b50f5 100644
--- a/include/queue.php
+++ b/include/queue.php
@@ -123,6 +123,7 @@ function queue_run($argv, $argc){
}
$data = $qi[0]['content'];
+ $public = $qi[0]['batch'];
$contact = $c[0];
$owner = $u[0];
@@ -155,7 +156,7 @@ function queue_run($argv, $argc){
case NETWORK_DIASPORA:
if($contact['notify']) {
logger('queue: diaspora_delivery: item ' . $q_item['id'] . ' for ' . $contact['name']);
- $deliver_status = diaspora_transmit($owner,$contact,$data);
+ $deliver_status = diaspora_transmit($owner,$contact,$data,$public);
if($deliver_status == (-1))
update_queue_time($q_item['id']);
diff --git a/include/template_processor.php b/include/template_processor.php
index f64fe4c0f..d04da8c61 100644
--- a/include/template_processor.php
+++ b/include/template_processor.php
@@ -199,8 +199,26 @@
$os=$s; $count++;
$s = str_replace($this->search,$this->replace, $s);
}
- return $s;
+ return template_unescape($s);
}
}
$t = new Template;
+
+
+
+
+function template_escape($s) {
+
+ return str_replace(array('$','{{'),array('!_Doll^Ars1Az_!','!_DoubLe^BraceS4Rw_!'),$s);
+
+
+}
+
+function template_unescape($s) {
+
+ return str_replace(array('!_Doll^Ars1Az_!','!_DoubLe^BraceS4Rw_!'),array('$','{{'),$s);
+
+
+
+}
diff --git a/include/text.php b/include/text.php
index a22faa1a5..ea64a3d28 100644
--- a/include/text.php
+++ b/include/text.php
@@ -860,10 +860,16 @@ function lang_selector() {
$o .= '<form action="" method="post" ><select name="system_language" onchange="this.form.submit();" >';
$langs = glob('view/*/strings.php');
if(is_array($langs) && count($langs)) {
+ $langs[] = '';
if(! in_array('view/en/strings.php',$langs))
$langs[] = 'view/en/';
asort($langs);
foreach($langs as $l) {
+ if($l == '') {
+ $default_selected = ((! x($_SESSION,'language')) ? ' selected="selected" ' : '');
+ $o .= '<option value="" ' . $default_selected . '>' . t('default') . '</option>';
+ continue;
+ }
$ll = substr($l,5);
$ll = substr($ll,0,strrpos($ll,'/'));
$selected = (($ll === $lang) ? ' selected="selected" ' : '');
@@ -932,6 +938,60 @@ function base64url_decode($s) {
return base64_decode(strtr($s,'-_','+/'));
}
-function cc_license() {
-return '<div class="cc-license">' . t('Shared content is covered by the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.') . '</div>';
-}
+
+if (!function_exists('str_getcsv')) {
+ function str_getcsv($input, $delimiter = ',', $enclosure = '"', $escape = '\\', $eol = '\n') {
+ if (is_string($input) && !empty($input)) {
+ $output = array();
+ $tmp = preg_split("/".$eol."/",$input);
+ if (is_array($tmp) && !empty($tmp)) {
+ while (list($line_num, $line) = each($tmp)) {
+ if (preg_match("/".$escape.$enclosure."/",$line)) {
+ while ($strlen = strlen($line)) {
+ $pos_delimiter = strpos($line,$delimiter);
+ $pos_enclosure_start = strpos($line,$enclosure);
+ if (
+ is_int($pos_delimiter) && is_int($pos_enclosure_start)
+ && ($pos_enclosure_start < $pos_delimiter)
+ ) {
+ $enclosed_str = substr($line,1);
+ $pos_enclosure_end = strpos($enclosed_str,$enclosure);
+ $enclosed_str = substr($enclosed_str,0,$pos_enclosure_end);
+ $output[$line_num][] = $enclosed_str;
+ $offset = $pos_enclosure_end+3;
+ } else {
+ if (empty($pos_delimiter) && empty($pos_enclosure_start)) {
+ $output[$line_num][] = substr($line,0);
+ $offset = strlen($line);
+ } else {
+ $output[$line_num][] = substr($line,0,$pos_delimiter);
+ $offset = (
+ !empty($pos_enclosure_start)
+ && ($pos_enclosure_start < $pos_delimiter)
+ )
+ ?$pos_enclosure_start
+ :$pos_delimiter+1;
+ }
+ }
+ $line = substr($line,$offset);
+ }
+ } else {
+ $line = preg_split("/".$delimiter."/",$line);
+
+ /*
+ * Validating against pesky extra line breaks creating false rows.
+ */
+ if (is_array($line) && !empty($line[0])) {
+ $output[$line_num] = $line;
+ }
+ }
+ }
+ return $output;
+ } else {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/index.php b/index.php
index d3b687c55..98733c4c8 100644
--- a/index.php
+++ b/index.php
@@ -84,8 +84,12 @@ session_start();
* We have to do it here because the session was just now opened.
*/
-if(x($_POST,'system_language'))
- $_SESSION['language'] = $_POST['system_language'];
+if(array_key_exists('system_language',$_POST)) {
+ if(strlen($_POST['system_language']))
+ $_SESSION['language'] = $_POST['system_language'];
+ else
+ unset($_SESSION['language']);
+}
if((x($_SESSION,'language')) && ($_SESSION['language'] !== $lang)) {
$lang = $_SESSION['language'];
load_translation_table($lang);
diff --git a/library/markdown.php b/library/markdown.php
index d51dceeca..343153186 100644
--- a/library/markdown.php
+++ b/library/markdown.php
@@ -1528,7 +1528,7 @@ class Markdown_Parser {
|
<\?.*?\?> | <%.*?%> # processing instruction
|
- <[/!$]?[-a-zA-Z0-9:]+ # regular tags
+ <[/!$]?[-a-zA-Z0-9:_]+ # regular tags
(?>
\s
(?>[^"\'>]+|"[^"]*"|\'[^\']*\')*
diff --git a/mod/contacts.php b/mod/contacts.php
index 4decc5042..ea429d39f 100644
--- a/mod/contacts.php
+++ b/mod/contacts.php
@@ -23,8 +23,6 @@ function contacts_init(&$a) {
$a->page['aside'] = '';
$a->page['aside'] .= group_side('contacts','group',false,0,$contact_id);
- $inv = '<div class="side-link" id="side-invite-link" ><a href="invite" >' . t("Invite Friends") . '</a></div>';
-
if(get_config('system','invitation_only')) {
$x = get_pconfig(local_user(),'system','invites_remaining');
if($x || is_site_admin()) {
@@ -33,21 +31,26 @@ function contacts_init(&$a) {
. '</div>' . $inv;
}
}
- elseif($a->config['register_policy'] != REGISTER_CLOSED)
- $a->page['aside'] .= $inv;
-
-
- $a->page['aside'] .= '<div class="side-link" id="side-match-link"><a href="match" >'
- . t('Find People With Shared Interests') . '</a></div>';
$tpl = get_markup_template('follow.tpl');
+
+ $findSimilarLink = '<div class="side-link" id="side-match-link"><a href="match" >'
+ . t('Similar Interests') . '</a></div>';
+
+ $inv = '';
+ if($a->config['register_policy'] != REGISTER_CLOSED) {
+ $inv = '<div class="side-link" id="side-invite-link" ><a href="invite" >' . t("Invite Friends") . '</a></div>';
+ }
+
$a->page['aside'] .= replace_macros($tpl,array(
'$label' => t('Connect/Follow'),
'$hint' => t('Example: bob@example.com, http://example.com/barbara'),
- '$follow' => t('Follow')
+ '$follow' => t('Follow'),
+ '$findSimilar' => $findSimilarLink,
+ '$inviteFriends' => $inv
));
-
+
}
diff --git a/mod/dfrn_notify.php b/mod/dfrn_notify.php
index 84cb2fc16..23bdd7388 100644
--- a/mod/dfrn_notify.php
+++ b/mod/dfrn_notify.php
@@ -72,7 +72,7 @@ function dfrn_notify_post(&$a) {
FROM `contact`
LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid`
WHERE `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- AND `user`.`nickname` = '%s' $sql_extra LIMIT 1",
+ AND `user`.`nickname` = '%s' AND `user`.`account_expired` = 0 $sql_extra LIMIT 1",
dbesc($a->argv[1])
);
@@ -807,7 +807,7 @@ function dfrn_notify_content(&$a) {
intval(time() + 90 )
);
- logger('dfrn_notify: challenge=' . $hash );
+ logger('dfrn_notify: challenge=' . $hash, LOGGER_DEBUG );
$sql_extra = '';
switch($direction) {
@@ -829,7 +829,8 @@ function dfrn_notify_content(&$a) {
}
$r = q("SELECT `contact`.*, `user`.`nickname` FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid`
- WHERE `contact`.`blocked` = 0 AND `contact`.`pending` = 0 AND `user`.`nickname` = '%s' $sql_extra LIMIT 1",
+ WHERE `contact`.`blocked` = 0 AND `contact`.`pending` = 0 AND `user`.`nickname` = '%s'
+ AND `user`.`account_expired` = 0 $sql_extra LIMIT 1",
dbesc($a->argv[1])
);
@@ -840,14 +841,20 @@ function dfrn_notify_content(&$a) {
$encrypted_id = '';
$id_str = $my_id . '.' . mt_rand(1000,9999);
- if((($r[0]['duplex']) && strlen($r[0]['prvkey'])) || (! strlen($r[0]['pubkey']))) {
- openssl_private_encrypt($hash,$challenge,$r[0]['prvkey']);
- openssl_private_encrypt($id_str,$encrypted_id,$r[0]['prvkey']);
+ $prv_key = trim($r[0]['prvkey']);
+ $pub_key = trim($r[0]['pubkey']);
+ $dplx = intval($r[0]['duplex']);
+
+ if((($dplx) && (strlen($prv_key))) || ((strlen($prv_key)) && (!(strlen($pub_key))))) {
+ openssl_private_encrypt($hash,$challenge,$prv_key);
+ openssl_private_encrypt($id_str,$encrypted_id,$prv_key);
}
- else {
- openssl_public_encrypt($hash,$challenge,$r[0]['pubkey']);
- openssl_public_encrypt($id_str,$encrypted_id,$r[0]['pubkey']);
+ elseif(strlen($pub_key)) {
+ openssl_public_encrypt($hash,$challenge,$pub_key);
+ openssl_public_encrypt($id_str,$encrypted_id,$pub_key);
}
+ else
+ $status = 1;
$challenge = bin2hex($challenge);
$encrypted_id = bin2hex($encrypted_id);
diff --git a/mod/display.php b/mod/display.php
index 52a84e755..281ce1dd4 100644
--- a/mod/display.php
+++ b/mod/display.php
@@ -114,8 +114,6 @@ function display_content(&$a) {
}
- $o .= cc_license();
-
return $o;
}
diff --git a/mod/editpost.php b/mod/editpost.php
index c396ee44b..bceb9250a 100644
--- a/mod/editpost.php
+++ b/mod/editpost.php
@@ -71,7 +71,7 @@ function editpost_content(&$a) {
if($mail_enabled) {
$selected = (($pubmail_enabled) ? ' checked="checked" ' : '');
- $jotnets .= '<div class="profile-jot-net"><input type="checkbox" name="pubmail_enable"' . $selected . 'value="1" /> '
+ $jotnets .= '<div class="profile-jot-net"><input type="checkbox" name="pubmail_enable"' . $selected . ' value="1" /> '
. t("Post to Email") . '</div>';
}
diff --git a/mod/follow.php b/mod/follow.php
index df4d2e630..77c8ae18f 100644
--- a/mod/follow.php
+++ b/mod/follow.php
@@ -100,14 +100,15 @@ function follow_post(&$a) {
$new_relation = CONTACT_IS_FOLLOWER;
// create contact record
- $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `addr`, `alias`, `notify`, `poll`, `name`, `nick`, `photo`, `network`, `pubkey`, `rel`, `priority`,
+ $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `addr`, `alias`, `batch`, `notify`, `poll`, `name`, `nick`, `photo`, `network`, `pubkey`, `rel`, `priority`,
`writable`, `blocked`, `readonly`, `pending` )
- VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ",
+ VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ",
intval(local_user()),
dbesc(datetime_convert()),
dbesc($ret['url']),
dbesc($ret['addr']),
dbesc($ret['alias']),
+ dbesc($ret['batch']),
dbesc($ret['notify']),
dbesc($ret['poll']),
dbesc($ret['name']),
diff --git a/mod/friendika.php b/mod/friendika.php
index d0e709c75..c5d7de59f 100644
--- a/mod/friendika.php
+++ b/mod/friendika.php
@@ -42,8 +42,6 @@ function friendika_content(&$a) {
$o .= t('This is Friendika version') . ' ' . FRIENDIKA_VERSION . ' ';
$o .= t('running at web location') . ' ' . z_root() . '</p><p>';
- $o .= t('Shared content within the Friendika network is provided under the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 license</a>') . '</p><p>';
-
$o .= t('Please visit <a href="http://project.friendika.com">Project.Friendika.com</a> to learn more about the Friendika project.') . '</p><p>';
$o .= t('Bug reports and issues: please visit') . ' ' . '<a href="http://bugs.friendika.com">Bugs.Friendika.com</a></p><p>';
diff --git a/mod/group.php b/mod/group.php
index 981796f67..ca163902c 100644
--- a/mod/group.php
+++ b/mod/group.php
@@ -176,8 +176,8 @@ function group_content(&$a) {
if($change)
$o = '';
- $o .= '<div id="group-members">';
$o .= '<h3>' . t('Members') . '</h3>';
+ $o .= '<div id="group-members">';
$textmode = (($switchtotext && (count($members) > $switchtotext)) ? true : false);
foreach($members as $member) {
if($member['url']) {
@@ -190,9 +190,10 @@ function group_content(&$a) {
$o .= '</div><div id="group-members-end"></div>';
$o .= '<hr id="group-separator" />';
+
+ $o .= '<h3>' . t('All Contacts') . '</h3>';
$o .= '<div id="group-all-contacts">';
- $o .= '<h3>' . t('All Contacts') . '</h3>';
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `blocked` = 0 and `pending` = 0 and `self` = 0 ORDER BY `name` ASC",
intval(local_user())
);
diff --git a/mod/hostxrd.php b/mod/hostxrd.php
index c7861d26d..1cc18da7a 100644
--- a/mod/hostxrd.php
+++ b/mod/hostxrd.php
@@ -4,7 +4,8 @@ function hostxrd_init(&$a) {
header('Access-Control-Allow-Origin: *');
header("Content-type: text/xml");
$tpl = file_get_contents('view/xrd_host.tpl');
- echo str_replace(array('$zroot','$domain'),array(z_root(),z_path()),$tpl);
+ echo str_replace(array(
+ '$zroot','$domain','$zot_post'),array(z_root(),z_path(),z_root() . '/post'),$tpl);
session_write_close();
exit();
diff --git a/mod/item.php b/mod/item.php
index 025a12a32..e5d4eea82 100644
--- a/mod/item.php
+++ b/mod/item.php
@@ -336,9 +336,9 @@ function item_post(&$a) {
// embedded bookmark in post? convert to regular url and set bookmark flag
$bookmark = 0;
- if(preg_match_all("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/m",$body,$match)) {
+ if(preg_match_all("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism",$body,$match)) {
$bookmark = 1;
- $body = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/m",'[url=$1]$2[/url]',$body);
+ $body = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism",'[url=$1]$2[/url]',$body);
}
@@ -346,7 +346,7 @@ function item_post(&$a) {
* Fold multi-line [code] sequences
*/
- $body = preg_replace('/\[\/code\]\s*\[code\]/m',"\n",$body);
+ $body = preg_replace('/\[\/code\]\s*\[code\]/ism',"\n",$body);
/**
* Look for any tags and linkify them
@@ -501,6 +501,7 @@ function item_post(&$a) {
$datarray['author-avatar'] = $author['thumb'];
$datarray['created'] = datetime_convert();
$datarray['edited'] = datetime_convert();
+ $datarray['commented'] = datetime_convert();
$datarray['received'] = datetime_convert();
$datarray['changed'] = datetime_convert();
$datarray['uri'] = $uri;
@@ -561,9 +562,9 @@ function item_post(&$a) {
$r = q("INSERT INTO `item` (`guid`, `uid`,`type`,`wall`,`gravity`,`contact-id`,`owner-name`,`owner-link`,`owner-avatar`,
- `author-name`, `author-link`, `author-avatar`, `created`, `edited`, `received`, `changed`, `uri`, `thr-parent`, `title`, `body`, `app`, `location`, `coord`,
+ `author-name`, `author-link`, `author-avatar`, `created`, `edited`, `commented`, `received`, `changed`, `uri`, `thr-parent`, `title`, `body`, `app`, `location`, `coord`,
`tag`, `inform`, `verb`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid`, `private`, `pubmail`, `attach`, `bookmark` )
- VALUES( '%s', %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d )",
+ VALUES( '%s', %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d )",
dbesc($datarray['guid']),
intval($datarray['uid']),
dbesc($datarray['type']),
@@ -578,6 +579,7 @@ function item_post(&$a) {
dbesc($datarray['author-avatar']),
dbesc($datarray['created']),
dbesc($datarray['edited']),
+ dbesc($datarray['commented']),
dbesc($datarray['received']),
dbesc($datarray['changed']),
dbesc($datarray['uri']),
@@ -803,6 +805,13 @@ function item_post(&$a) {
// NOTREACHED
}
+ // update the commented timestamp on the parent
+
+ q("UPDATE `item` set `commented` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1",
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ intval($parent)
+ );
$datarray['id'] = $post_id;
$datarray['plink'] = $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $post_id;
diff --git a/mod/like.php b/mod/like.php
index 287630212..95bedcc20 100644
--- a/mod/like.php
+++ b/mod/like.php
@@ -55,6 +55,22 @@ function like_content(&$a) {
return;
}
+ $remote_owner = null;
+
+ if(! $item['wall']) {
+ // The top level post may have been written by somebody on another system
+ $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval($item['contact-id']),
+ intval($item['uid'])
+ );
+ if(! count($r))
+ return;
+ if(! $r[0]['self'])
+ $remote_owner = $r[0];
+ }
+
+ // this represents the post owner on this system.
+
$r = q("SELECT `contact`.*, `user`.`nickname` FROM `contact` LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid`
WHERE `contact`.`self` = 1 AND `contact`.`uid` = %d LIMIT 1",
intval($owner_uid)
@@ -67,6 +83,11 @@ function like_content(&$a) {
return;
}
+ if(! $remote_owner)
+ $remote_owner = $owner;
+
+
+ // This represents the person posting
if((local_user()) && (local_user() == $owner_uid)) {
$contact = $owner;
@@ -137,9 +158,9 @@ EOT;
$arr['gravity'] = GRAVITY_LIKE;
$arr['parent'] = $item['id'];
$arr['parent-uri'] = $item['uri'];
- $arr['owner-name'] = $owner['name'];
- $arr['owner-link'] = $owner['url'];
- $arr['owner-avatar'] = $owner['thumb'];
+ $arr['owner-name'] = $remote_owner['name'];
+ $arr['owner-link'] = $remote_owner['url'];
+ $arr['owner-avatar'] = $remote_owner['thumb'];
$arr['author-name'] = $contact['name'];
$arr['author-link'] = $contact['url'];
$arr['author-avatar'] = $contact['thumb'];
diff --git a/mod/message.php b/mod/message.php
index cc94730bc..1bee45d48 100644
--- a/mod/message.php
+++ b/mod/message.php
@@ -159,10 +159,10 @@ function message_content(&$a) {
'$from_url' => $a->get_baseurl() . '/redir/' . $rr['contact-id'],
'$sparkle' => ' sparkle',
'$from_photo' => $rr['thumb'],
- '$subject' => (($rr['mailseen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>'),
+ '$subject' => template_escape((($rr['mailseen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>')),
'$delete' => t('Delete conversation'),
- '$body' => $rr['body'],
- '$to_name' => $rr['name'],
+ '$body' => template_escape($rr['body']),
+ '$to_name' => template_escape($rr['name']),
'$date' => datetime_convert('UTC',date_default_timezone_get(),$rr['mailcreated'], t('D, d M Y - g:i A'))
));
}
@@ -221,14 +221,14 @@ function message_content(&$a) {
}
$o .= replace_macros($tpl, array(
'$id' => $message['id'],
- '$from_name' =>$message['from-name'],
+ '$from_name' => template_escape($message['from-name']),
'$from_url' => $from_url,
'$sparkle' => $sparkle,
'$from_photo' => $message['from-photo'],
- '$subject' => $message['title'],
- '$body' => smilies(bbcode($message['body'])),
+ '$subject' => template_escape($message['title']),
+ '$body' => template_escape(smilies(bbcode($message['body']))),
'$delete' => t('Delete message'),
- '$to_name' => $message['name'],
+ '$to_name' => template_escape($message['name']),
'$date' => datetime_convert('UTC',date_default_timezone_get(),$message['created'],'D, d M Y - g:i A')
));
@@ -240,7 +240,7 @@ function message_content(&$a) {
'$header' => t('Send Reply'),
'$to' => t('To:'),
'$subject' => t('Subject:'),
- '$subjtxt' => $message['title'],
+ '$subjtxt' => template_escape($message['title']),
'$readonly' => ' readonly="readonly" style="background: #BBBBBB;" ',
'$yourmessage' => t('Your message:'),
'$select' => $select,
diff --git a/mod/network.php b/mod/network.php
index 1de0bc212..9488cd973 100644
--- a/mod/network.php
+++ b/mod/network.php
@@ -17,12 +17,12 @@ function network_init(&$a) {
// We need a better way of managing a growing argument list
- $srchurl = '/network'
- . ((x($_GET,'cid')) ? '?cid=' . $_GET['cid'] : '')
- . ((x($_GET,'star')) ? '?star=' . $_GET['star'] : '')
- . ((x($_GET,'order')) ? '?order=' . $_GET['order'] : '')
- . ((x($_GET,'bmark')) ? '?bmark=' . $_GET['bmark'] : '');
-
+ // moved into savedsearches()
+ // $srchurl = '/network'
+ // . ((x($_GET,'cid')) ? '?cid=' . $_GET['cid'] : '')
+ // . ((x($_GET,'star')) ? '?star=' . $_GET['star'] : '')
+ // . ((x($_GET,'bmark')) ? '?bmark=' . $_GET['bmark'] : '');
+
if(x($_GET,'save')) {
$r = q("select * from `search` where `uid` = %d and `term` = '%s' limit 1",
intval(local_user()),
@@ -42,76 +42,110 @@ function network_init(&$a) {
);
}
- $a->page['aside'] .= search($search,'netsearch-box',$srchurl,true);
-
- $a->page['aside'] .= '<div id="network-new-link">';
-
-
- $a->page['aside'] .= '<div id="network-view-link">';
- if(($a->argc > 1 && $a->argv[1] === 'new') || ($a->argc > 2 && $a->argv[2] === 'new') || x($_GET,'search')) {
- $a->page['aside'] .= '<a href="' . $a->get_baseurl() . '/' . str_replace('/new', '', $a->cmd) . ((x($_GET,'cid')) ? '?cid=' . $_GET['cid'] : '') . '">' . t('View Conversations') . '</a></div>';
+ // item filter tabs
+ // TODO: fix this logic, reduce duplication
+ $a->page['content'] .= '<div class="tabs-wrapper">';
+
+ $starred_active = '';
+ $new_active = '';
+ $bookmarked_active = '';
+ $all_active = '';
+ $search_active = '';
+
+ if(($a->argc > 1 && $a->argv[1] === 'new')
+ || ($a->argc > 2 && $a->argv[2] === 'new')) {
+ $new_active = 'active';
}
- else {
- $a->page['aside'] .= '<a href="' . $a->get_baseurl() . '/' . $a->cmd . '/new' . ((x($_GET,'cid')) ? '/?cid=' . $_GET['cid'] : '') . '">' . t('View New Items') . '</a></div>';
-
- if(x($_GET,'star'))
- $a->page['aside'] .= '<div id="network-star-link">'
- . '<a class="network-star" href="' . $a->get_baseurl() . '/' . $a->cmd
- . ((x($_GET,'cid')) ? '/?cid=' . $_GET['cid'] : '') . '">'
- . t('View Any Items') . '</a>'
- . '<span class="network-star icon starred"></span>'
- . '<span class="network-star icon unstarred"></span>'
- . '<div class="clear"></div></div>';
- else
- $a->page['aside'] .= '<div id="network-star-link">'
- . '<a class="network-star" href="' . $a->get_baseurl() . '/' . $a->cmd
- . ((x($_GET,'cid')) ? '/?cid=' . $_GET['cid'] : '') . '&star=1" >'
- . t('View Starred Items') . '</a>'
- . '<span class="network-star icon starred"></span>'
- . '<div class="clear"></div></div>';
-
- if(! $_GET['bmark'])
- $a->page['aside'] .= '<div id="network-bmark-link">'
- . '<a class="network-bmark" href="' . $a->get_baseurl() . '/' . $a->cmd
- . ((x($_GET,'cid')) ? '/?cid=' . $_GET['cid'] : '') . '&bmark=1" >'
- . t('View Bookmarks') . '</a>'
- . '<div class="clear"></div></div>';
-
-
+
+ if(x($_GET,'search')) {
+ $search_active = 'active';
}
-
- $a->page['aside'] .= '</div>';
-
+
+ if(x($_GET,'star')) {
+ $starred_active = 'active';
+ }
+
+ if($_GET['bmark']) {
+ $bookmarked_active = 'active';
+ }
+
+ if (($new_active == '')
+ && ($starred_active == '')
+ && ($bookmarked_active == '')
+ && ($search_active == '')) {
+ $all_active = 'active';
+ }
+
+ // network links moved to content to match other pages
+ // all
+ $a->page['content'] .= '<a class="tabs ' . $all_active . '" href="' . $a->get_baseurl() . '/'
+ . str_replace('/new', '', $a->cmd) . ((x($_GET,'cid')) ? '?cid=' . $_GET['cid'] : '') . '">'
+ . t('All') . '</a>';
+
+ // new
+ $a->page['content'] .= '<a class="tabs ' . $new_active . '" href="' . $a->get_baseurl() . '/'
+ . str_replace('/new', '', $a->cmd) . '/new'
+ . ((x($_GET,'cid')) ? '/?cid=' . $_GET['cid'] : '') . '">'
+ . t('New') . '</a>';
+
+ // starred
+ $a->page['content'] .= '<a class="tabs ' . $starred_active . '" href="' . $a->get_baseurl() . '/'
+ . str_replace('/new', '', $a->cmd) . ((x($_GET,'cid')) ? '/?cid=' . $_GET['cid'] : '') . '&star=1" >'
+ . t('Starred') . '</a>';
+
+ // bookmarks
+ $a->page['content'] .= '<a class="tabs ' . $bookmarked_active . '" href="' . $a->get_baseurl() . '/'
+ . str_replace('/new', '', $a->cmd) . ((x($_GET,'cid')) ? '/?cid=' . $_GET['cid'] : '') . '&bmark=1" >'
+ . t('Bookmarks') . '</a>';
+
+ $a->page['content'] .= '</div>';
+ // --- end item filter tabs
+
+ // search terms header
+ if(x($_GET,'search')) {
+ $a->page['content'] .= '<h2>Search Results For: ' . $search . '</h2>';
+ }
+
$a->page['aside'] .= group_side('network','network',true,$group_id);
+
+ // moved to saved searches to have it in the same div
+ //$a->page['aside'] .= search($search,'netsearch-box',$srchurl,true);
- $a->page['aside'] .= saved_searches();
+ $a->page['aside'] .= saved_searches($search);
}
-function saved_searches() {
+function saved_searches($search) {
+ $srchurl = '/network'
+ . ((x($_GET,'cid')) ? '?cid=' . $_GET['cid'] : '')
+ . ((x($_GET,'star')) ? '?star=' . $_GET['star'] : '')
+ . ((x($_GET,'bmark')) ? '?bmark=' . $_GET['bmark'] : '');
+
$o = '';
$r = q("select `term` from `search` WHERE `uid` = %d",
intval(local_user())
);
+ $o .= '<div id="saved-search-list" class="widget">';
+ $o .= '<h3 id="search">' . t('Saved Searches') . '</h3>' . "\r\n";
+ $o .= search($search,'netsearch-box',$srchurl,true);
+
if(count($r)) {
- $o .= '<h3>' . t('Saved Searches') . '</h3>' . "\r\n";
- $o .= '<div id="saved-search-list"><ul id="saved-search-ul">' . "\r\n";
+ $o .= '<ul id="saved-search-ul">' . "\r\n";
foreach($r as $rr) {
$o .= '<li class="saved-search-li clear"><a href="network/?f=&remove=1&search=' . $rr['term'] . '" class="icon drophide savedsearchdrop" title="' . t('Remove term') . '" onclick="return confirmDelete();" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a> <a href="network/?f&search=' . $rr['term'] . '" class="savedsearchterm" >' . $rr['term'] . '</a></li>' . "\r\n";
}
- $o .= '</ul></div>' . "\r\n";
+ $o .= '</ul>';
}
+ $o .= '</div>' . "\r\n";
return $o;
}
-
-
function network_content(&$a, $update = 0) {
require_once('include/conversation.php');
@@ -132,6 +166,7 @@ function network_content(&$a, $update = 0) {
$star = ((x($_GET,'star')) ? intval($_GET['star']) : 0);
$bmark = ((x($_GET,'bmark')) ? intval($_GET['bmark']) : 0);
$order = ((x($_GET,'order')) ? notags($_GET['order']) : 'comment');
+ $liked = ((x($_GET,'liked')) ? intval($_GET['liked']) : 0);
if(($a->argc > 2) && $a->argv[2] === 'new')
@@ -195,6 +230,7 @@ function network_content(&$a, $update = 0) {
. ((x($_GET,'star')) ? '&star=' . $_GET['star'] : '')
. ((x($_GET,'order')) ? '&order=' . $_GET['order'] : '')
. ((x($_GET,'bmark')) ? '&bmark=' . $_GET['bmark'] : '')
+ . ((x($_GET,'liked')) ? '&liked=' . $_GET['liked'] : '')
. "'; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
}
@@ -315,44 +351,27 @@ function network_content(&$a, $update = 0) {
else {
// Normal conversation view
- // Show conversation by activity date
- if($order === 'post') {
- $r = q("SELECT `item`.`id` AS `item_id`, `contact`.`uid` AS `contact_uid`
- FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- AND `item`.`parent` = `item`.`id`
- $sql_extra
- ORDER BY `item`.`created` DESC LIMIT %d ,%d ",
- intval(local_user()),
- intval($a->pager['start']),
- intval($a->pager['itemspage'])
- );
- }
- else {
- // $order === 'comment'
- // First fetch a known number of parent items
-
- $r = q("SELECT `item`.`id` AS `item_id`, `contact`.`uid` AS `contact_uid`
- FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- , (SELECT `_com`.`parent`,max(`_com`.`created`) as `created`
- FROM `item` AS `_com`
- WHERE `_com`.`uid`=%d AND
- (`_com`.`parent`!=`_com`.`id` OR `_com`.`id` NOT IN (SELECT `__com`.`parent` FROM `item` as `__com` WHERE `__com`.`parent`!=`__com`.`id`))
- GROUP BY `_com`.`parent` ORDER BY `created` DESC) AS `com`
- WHERE `item`.`id`=`com`.`parent` AND
- `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- $sql_extra
- ORDER BY `com`.`created` DESC LIMIT %d ,%d ",
- intval(local_user()),
- intval(local_user()),
- intval($a->pager['start']),
- intval($a->pager['itemspage'])
- );
- }
+ if($order === 'post')
+ $ordering = "`created`";
+ else
+ $ordering = "`commented`";
+
+ // Fetch a page full of parent items for this page
+
+ $r = q("SELECT `item`.`id` AS `item_id`, `contact`.`uid` AS `contact_uid`
+ FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
+ WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0
+ AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
+ AND `item`.`parent` = `item`.`id`
+ $sql_extra
+ ORDER BY `item`.$ordering DESC LIMIT %d ,%d ",
+ intval(local_user()),
+ intval($a->pager['start']),
+ intval($a->pager['itemspage'])
+ );
+
// Then fetch all the children of the parents that are on this page
$parents_arr = array();
@@ -363,48 +382,21 @@ function network_content(&$a, $update = 0) {
$parents_arr[] = $rr['item_id'];
$parents_str = implode(', ', $parents_arr);
- if($order === 'post') {
- // parent created order
- $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
- `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`, `contact`.`writable`,
- `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`,
- `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
- FROM `item`, (SELECT `p`.`id`,`p`.`created` FROM `item` AS `p` WHERE `p`.`parent`=`p`.`id`) as `parentitem`, `contact`
- WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0
- AND `contact`.`id` = `item`.`contact-id`
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- AND `item`.`parent` = `parentitem`.`id` AND `item`.`parent` IN ( %s )
- $sql_extra
- ORDER BY `parentitem`.`created` DESC, `item`.`gravity` ASC, `item`.`created` ASC ",
- intval(local_user()),
- dbesc($parents_str)
- );
- }
- else {
- // $order === 'comment'
-
- $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
- `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`, `contact`.`writable`,
- `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`,
- `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
- FROM `item`, `contact`,
- (SELECT `_com`.`parent`,max(`_com`.`created`) as `created`
- FROM `item` AS `_com`
- WHERE `_com`.`uid`=%d AND
- (`_com`.`parent`!=`_com`.`id` OR `_com`.`id` NOT IN (SELECT `__com`.`parent` FROM `item` as `__com` WHERE `__com`.`parent`!=`__com`.`id`))
- GROUP BY `_com`.`parent` ORDER BY `created` DESC) AS `com`
- WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0
- AND `contact`.`id` = `item`.`contact-id`
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- AND `item`.`parent` = `com`.`parent` AND `item`.`parent` IN ( %s )
- $sql_extra
- ORDER BY `com`.`created` DESC, `item`.`gravity` ASC, `item`.`created` ASC ",
- intval(local_user()),
- intval(local_user()),
- dbesc($parents_str)
- );
- }
- }
+ $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
+ `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`, `contact`.`writable`,
+ `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`,
+ `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
+ FROM `item`, (SELECT `p`.`id`,`p`.`created`,`p`.`commented` FROM `item` AS `p` WHERE `p`.`parent`=`p`.`id`) as `parentitem`, `contact`
+ WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0
+ AND `contact`.`id` = `item`.`contact-id`
+ AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
+ AND `item`.`parent` = `parentitem`.`id` AND `item`.`parent` IN ( %s )
+ $sql_extra
+ ORDER BY `parentitem`.$ordering DESC, `parentitem`.`id` ASC, `item`.`gravity` ASC, `item`.`created` ASC ",
+ intval(local_user()),
+ dbesc($parents_str)
+ );
+ }
}
// Set this so that the conversation function can find out contact info for our wall-wall items
@@ -416,7 +408,6 @@ function network_content(&$a, $update = 0) {
if(! $update) {
$o .= paginate($a);
- $o .= cc_license();
}
return $o;
diff --git a/mod/oexchange.php b/mod/oexchange.php
index 1a990c64f..53dce6446 100644
--- a/mod/oexchange.php
+++ b/mod/oexchange.php
@@ -28,9 +28,16 @@ function oexchange_content(&$a) {
return;
}
- $url = (((x($_GET,'url')) && strlen($_GET['url'])) ? notags(trim($_GET['url'])) : '');
-
- $s = fetch_url($a->get_baseurl() . '/parse_url&url=' . $url);
+ $url = (((x($_GET,'url')) && strlen($_GET['url']))
+ ? urlencode(notags(trim($_GET['url']))) : '');
+ $title = (((x($_GET,'title')) && strlen($_GET['title']))
+ ? '&title=' . urlencode(notags(trim($_GET['title']))) : '');
+ $description = (((x($_GET,'description')) && strlen($_GET['description']))
+ ? '&description=' . urlencode(notags(trim($_GET['description']))) : '');
+ $tags = (((x($_GET,'tags')) && strlen($_GET['tags']))
+ ? '&tags=' . urlencode(notags(trim($_GET['tags']))) : '');
+
+ $s = fetch_url($a->get_baseurl() . '/parse_url?f=&url=' . $url . $title . $description . $tags);
if(! strlen($s))
return;
diff --git a/mod/openid.php b/mod/openid.php
index 3c3293147..b8734f023 100644
--- a/mod/openid.php
+++ b/mod/openid.php
@@ -56,7 +56,7 @@ function openid_content(&$a) {
$r = q("SELECT `user`.*, `user`.`pubkey` as `upubkey`, `user`.`prvkey` as `uprvkey`
- FROM `user` WHERE `openid` = '%s' AND `blocked` = 0 AND `verified` = 1 LIMIT 1",
+ FROM `user` WHERE `openid` = '%s' AND `blocked` = 0 AND `account_expired` = 0 AND `verified` = 1 LIMIT 1",
dbesc($_SESSION['openid'])
);
if(! count($r)) {
diff --git a/mod/parse_url.php b/mod/parse_url.php
index 79c336ddc..a238ecb2f 100644
--- a/mod/parse_url.php
+++ b/mod/parse_url.php
@@ -3,15 +3,36 @@
require_once('library/HTML5/Parser.php');
require_once('library/HTMLPurifier.auto.php');
+function arr_add_hashes(&$item,$k) {
+ $item = '#' . $item;
+}
+
function parse_url_content(&$a) {
- logger('parse_url: ' . $_GET['url']);
+ $text = null;
+ $str_tags = '';
+
+ if(x($_GET,'binurl'))
+ $url = trim(hex2bin($_GET['binurl']));
+ else
+ $url = trim($_GET['url']);
- $url = trim(hex2bin($_GET['url']));
+ if($_GET['title'])
+ $title = strip_tags(trim($_GET['title']));
+
+ if($_GET['description'])
+ $text = strip_tags(trim($_GET['description']));
+
+ if($_GET['tags']) {
+ $arr_tags = str_getcsv($_GET['tags']);
+ if(count($arr_tags)) {
+ array_walk($arr_tags,'arr_add_hashes');
+ $str_tags = '<br />' . implode(' ',$arr_tags) . '<br />';
+ }
+ }
logger('parse_url: ' . $url);
- $text = null;
$template = "<br /><a class=\"bookmark\" href=\"%s\" >%s</a>%s<br />";
@@ -25,6 +46,20 @@ function parse_url_content(&$a) {
killme();
}
+ if($url && $title && $text) {
+
+ $text = '<br /><br /><blockquote>' . $text . '</blockquote><br />';
+ $title = str_replace(array("\r","\n"),array('',''),$title);
+
+ $result = sprintf($template,$url,($title) ? $title : $url,$text) . $str_tags;
+
+ logger('parse_url (unparsed): returns: ' . $result);
+
+ echo $result;
+ killme();
+ }
+
+
if($url) {
$s = fetch_url($url);
} else {
@@ -35,14 +70,16 @@ function parse_url_content(&$a) {
logger('parse_url: data: ' . $s, LOGGER_DATA);
if(! $s) {
- echo sprintf($template,$url,$url,'');
+ echo sprintf($template,$url,$url,'') . $str_tags;
killme();
}
- if(strpos($s,'<title>')) {
- $title = substr($s,strpos($s,'<title>')+7,64);
- if(strpos($title,'<') !== false)
- $title = strip_tags(substr($title,0,strpos($title,'<')));
+ if(! $title) {
+ if(strpos($s,'<title>')) {
+ $title = substr($s,strpos($s,'<title>')+7,64);
+ if(strpos($title,'<') !== false)
+ $title = strip_tags(substr($title,0,strpos($title,'<')));
+ }
}
$config = HTMLPurifier_Config::createDefault();
@@ -56,7 +93,7 @@ function parse_url_content(&$a) {
$dom = @HTML5_Parser::parse($s);
if(! $dom) {
- echo sprintf($template,$url,$url,'');
+ echo sprintf($template,$url,$url,'') . $str_tags;
killme();
}
@@ -69,48 +106,51 @@ function parse_url_content(&$a) {
}
}
- $divs = $dom->getElementsByTagName('div');
- if($divs) {
- foreach($divs as $div) {
- $class = $div->getAttribute('class');
- if($class && (stristr($class,'article') || stristr($class,'content'))) {
- $items = $div->getElementsByTagName('p');
- if($items) {
- foreach($items as $item) {
- $text = $item->textContent;
- if(stristr($text,'<script')) {
- $text = '';
- continue;
- }
- $text = strip_tags($text);
- if(strlen($text) < 100) {
- $text = '';
- continue;
+
+ if(! $text) {
+ $divs = $dom->getElementsByTagName('div');
+ if($divs) {
+ foreach($divs as $div) {
+ $class = $div->getAttribute('class');
+ if($class && (stristr($class,'article') || stristr($class,'content'))) {
+ $items = $div->getElementsByTagName('p');
+ if($items) {
+ foreach($items as $item) {
+ $text = $item->textContent;
+ if(stristr($text,'<script')) {
+ $text = '';
+ continue;
+ }
+ $text = strip_tags($text);
+ if(strlen($text) < 100) {
+ $text = '';
+ continue;
+ }
+ $text = substr($text,0,250) . '...' ;
+ break;
}
- $text = substr($text,0,250) . '...' ;
- break;
}
}
+ if($text)
+ break;
}
- if($text)
- break;
}
- }
- if(! $text) {
- $items = $dom->getElementsByTagName('p');
- if($items) {
- foreach($items as $item) {
- $text = $item->textContent;
- if(stristr($text,'<script'))
- continue;
- $text = strip_tags($text);
- if(strlen($text) < 100) {
- $text = '';
- continue;
+ if(! $text) {
+ $items = $dom->getElementsByTagName('p');
+ if($items) {
+ foreach($items as $item) {
+ $text = $item->textContent;
+ if(stristr($text,'<script'))
+ continue;
+ $text = strip_tags($text);
+ if(strlen($text) < 100) {
+ $text = '';
+ continue;
+ }
+ $text = substr($text,0,250) . '...' ;
+ break;
}
- $text = substr($text,0,250) . '...' ;
- break;
}
}
}
@@ -119,9 +159,9 @@ function parse_url_content(&$a) {
$text = '<br /><br /><blockquote>' . $text . '</blockquote><br />';
}
- $title = str_replace("\n",'',$title);
+ $title = str_replace(array("\r","\n"),array('',''),$title);
- $result = sprintf($template,$url,($title) ? $title : $url,$text);
+ $result = sprintf($template,$url,($title) ? $title : $url,$text) . $str_tags;
logger('parse_url: returns: ' . $result);
diff --git a/mod/photos.php b/mod/photos.php
index b74ca85d7..cb7df15cc 100644
--- a/mod/photos.php
+++ b/mod/photos.php
@@ -33,13 +33,18 @@ function photos_init(&$a) {
if(count($albums)) {
$a->data['albums'] = $albums;
- $o .= '<h4><a href="' . $a->get_baseurl() . '/profile/' . $a->data['user']['nickname'] . '">' . $a->data['user']['username'] . '</a></h4>';
- $o .= '<h4>' . '<a href="' . $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '">' . t('Photo Albums') . '</a></h4>';
-
+ $o .= '<div class="vcard">';
+ $o .= '<div class="fn">' . $a->data['user']['username'] . '</h4>';
+ $o .= '<div id="profile-photo-wrapper"><img class="photo" style="width: 175px; height: 175px;" src="' . $a->get_baseurl() . '/photo/profile/' . $a->data['user']['uid'] . '.jpg" alt="' . $a->data['user']['username'] . '" /></div>';
+ $o .= '</div>';
+
+ $o .= '<div id="side-bar-photos-albums" class="widget">';
+ $o .= '<h3>' . '<a href="' . $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '">' . t('Photo Albums') . '</a></h4>';
+
$o .= '<ul>';
foreach($albums as $album) {
- // don't show contact photos. We once trasnlated this name, but then you could still access it under
+ // don't show contact photos. We once translated this name, but then you could still access it under
// a different language setting. Now we store the name in English and check in English (and translated for legacy albums).
if((! strlen($album['album'])) || ($album['album'] === 'Contact Photos') || ($album['album'] === t('Contact Photos')))
@@ -887,9 +892,9 @@ function photos_content(&$a) {
'$nickname' => $a->data['user']['nickname'],
'$newalbum' => t('New album name: '),
'$existalbumtext' => t('or existing album name: '),
- '$albumselect' => $albumselect,
+ '$albumselect' => template_escape($albumselect),
'$permissions' => t('Permissions'),
- '$aclselect' => (($visitor) ? '' : populate_acl($a->user, $celeb)),
+ '$aclselect' => (($visitor) ? '' : template_escape(populate_acl($a->user, $celeb))),
'$uploader' => $ret['addon_text'],
'$default' => (($ret['default_upload']) ? $default_upload : ''),
'$uploadurl' => $ret['post_url']
@@ -930,7 +935,7 @@ function photos_content(&$a) {
$o .= replace_macros($edit_tpl,array(
'$nametext' => t('New album name: '),
'$nickname' => $a->data['user']['nickname'],
- '$album' => $album,
+ '$album' => template_escape($album),
'$hexalbum' => bin2hex($album),
'$submit' => t('Submit'),
'$dropsubmit' => t('Delete Album')
@@ -955,8 +960,8 @@ function photos_content(&$a) {
'$photolink' => $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $rr['resource-id'],
'$phototitle' => t('View Photo'),
'$imgsrc' => $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . $rr['scale'] . '.jpg',
- '$imgalt' => $rr['filename'],
- '$desc'=> $rr['desc']
+ '$imgalt' => template_escape($rr['filename']),
+ '$desc'=> template_escape($rr['desc'])
));
}
@@ -982,7 +987,15 @@ function photos_content(&$a) {
);
if(! count($ph)) {
- notice( t('Photo not available') . EOL );
+ $ph = q("SELECT `id` FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s'
+ LIMIT 1",
+ intval($owner_uid),
+ dbesc($datum)
+ );
+ if(count($ph))
+ notice( t('Permission denied. Access to this item may be restricted.'));
+ else
+ notice( t('Photo not available') . EOL );
return;
}
@@ -1007,8 +1020,9 @@ function photos_content(&$a) {
break;
}
}
- $prevlink = $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$prv]['resource-id'] ;
- $nextlink = $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$nxt]['resource-id'] ;
+ $edit_suffix = ((($cmd === 'edit') && ($can_post)) ? '/edit' : '');
+ $prevlink = $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$prv]['resource-id'] . $edit_suffix;
+ $nextlink = $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$nxt]['resource-id'] . $edit_suffix;
}
@@ -1031,7 +1045,7 @@ function photos_content(&$a) {
if($can_post && ($ph[0]['uid'] == $owner_uid)) {
$tools = array(
- 'edit' => array($a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $datum . '/edit', t('Edit photo')),
+ 'edit' => array($a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $datum . (($cmd === 'edit') ? '' : '/edit'), (($cmd === 'edit') ? t('View photo') : t('Edit photo'))),
'profile'=>array($a->get_baseurl() . '/profile_photo/use/'.$ph[0]['resource-id'], t('Use as profile photo')),
);
@@ -1130,16 +1144,16 @@ function photos_content(&$a) {
$edit_tpl = get_markup_template('photo_edit.tpl');
$edit = replace_macros($edit_tpl, array(
'$id' => $ph[0]['id'],
- '$album' => $ph[0]['album'],
+ '$album' => template_escape($ph[0]['album']),
'$newalbum' => t('New album name'),
'$nickname' => $a->data['user']['nickname'],
'$resource_id' => $ph[0]['resource-id'],
'$capt_label' => t('Caption'),
- '$caption' => $ph[0]['desc'],
+ '$caption' => template_escape($ph[0]['desc']),
'$tag_label' => t('Add a Tag'),
'$tags' => $link_item['tag'],
'$permissions' => t('Permissions'),
- '$aclselect' => populate_acl($ph[0]),
+ '$aclselect' => template_escape(populate_acl($ph[0])),
'$help_tags' => t('Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping'),
'$item_id' => ((count($linked_items)) ? $link_item['id'] : 0),
'$submit' => t('Submit'),
@@ -1285,11 +1299,11 @@ function photos_content(&$a) {
$comments .= replace_macros($template,array(
'$id' => $item['item_id'],
'$profile_url' => $profile_link,
- '$name' => $profile_name,
+ '$name' => template_escape($profile_name),
'$thumb' => $profile_avatar,
'$sparkle' => $sparkle,
- '$title' => $item['title'],
- '$body' => bbcode($item['body']),
+ '$title' => template_escape($item['title']),
+ '$body' => template_escape(bbcode($item['body'])),
'$ago' => relative_date($item['created']),
'$indent' => (($item['parent'] != $item['item_id']) ? ' comment' : ''),
'$drop' => $drop,
@@ -1304,18 +1318,18 @@ function photos_content(&$a) {
$photo_tpl = get_markup_template('photo_view.tpl');
$o .= replace_macros($photo_tpl, array(
'$id' => $ph[0]['id'],
- '$album' => array($album_link,$ph[0]['album']),
+ '$album' => array($album_link,template_escape($ph[0]['album'])),
'$tools' => $tools,
'$lock' => $lock,
'$photo' => $photo,
'$prevlink' => $prevlink,
'$nextlink' => $nextlink,
'$desc' => $ph[0]['desc'],
- '$tags' => $tags,
+ '$tags' => template_escape($tags),
'$edit' => $edit,
'$likebuttons' => $likebuttons,
- '$like' => $like,
- '$dislike' => $dislike,
+ '$like' => template_escape($like),
+ '$dislike' => template_escape($dislike),
'$comments' => $comments,
'$paginate' => $paginate,
));
@@ -1363,9 +1377,9 @@ function photos_content(&$a) {
'$phototitle' => t('View Photo'),
'$imgsrc' => $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . ((($rr['scale']) == 6) ? 4 : $rr['scale']) . '.jpg',
'$albumlink' => $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($rr['album']),
- '$albumname' => $rr['album'],
+ '$albumname' => template_escape($rr['album']),
'$albumalt' => t('View Album'),
- '$imgalt' => $rr['filename']
+ '$imgalt' => template_escape($rr['filename'])
));
}
diff --git a/mod/profile.php b/mod/profile.php
index 66fa17554..50bbdd46e 100644
--- a/mod/profile.php
+++ b/mod/profile.php
@@ -239,7 +239,6 @@ function profile_content(&$a, $update = 0) {
if(! $update) {
$o .= paginate($a);
- $o .= cc_license();
}
return $o;
diff --git a/mod/pubsub.php b/mod/pubsub.php
index 4dff5d531..b2f006927 100644
--- a/mod/pubsub.php
+++ b/mod/pubsub.php
@@ -44,7 +44,7 @@ function pubsub_init(&$a) {
$subscribe = (($hub_mode === 'subscribe') ? 1 : 0);
- $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' LIMIT 1",
+ $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `account_expired` = 0 LIMIT 1",
dbesc($nick)
);
if(! count($r))
@@ -99,7 +99,7 @@ function pubsub_post(&$a) {
$nick = (($a->argc > 1) ? notags(trim($a->argv[1])) : '');
$contact_id = (($a->argc > 2) ? intval($a->argv[2]) : 0 );
- $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' LIMIT 1",
+ $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `account_expired` = 0 LIMIT 1",
dbesc($nick)
);
if(! count($r))
diff --git a/mod/receive.php b/mod/receive.php
index 34128518b..950bf0bd3 100644
--- a/mod/receive.php
+++ b/mod/receive.php
@@ -12,18 +12,26 @@ require_once('include/diaspora.php');
function receive_post(&$a) {
- if($a->argc != 3 || $a->argv[1] !== 'users')
- http_status_exit(500);
+ $public = false;
- $guid = $a->argv[2];
+ if(($a->argc == 2) && ($a->argv[1] === 'public')) {
+ $public = true;
+ }
+ else {
- $r = q("SELECT * FROM `user` WHERE `guid` = '%s' LIMIT 1",
- dbesc($guid)
- );
- if(! count($r))
- http_status_exit(500);
+ if($a->argc != 3 || $a->argv[1] !== 'users')
+ http_status_exit(500);
+
+ $guid = $a->argv[2];
+
+ $r = q("SELECT * FROM `user` WHERE `guid` = '%s' AND `account_expired` = 0 LIMIT 1",
+ dbesc($guid)
+ );
+ if(! count($r))
+ http_status_exit(500);
- $importer = $r[0];
+ $importer = $r[0];
+ }
// It is an application/x-www-form-urlencoded
@@ -41,9 +49,13 @@ function receive_post(&$a) {
if(! is_array($msg))
http_status_exit(500);
- diaspora_dispatch($importer,$msg);
+ $ret = 0;
+ if($public)
+ diaspora_dispatch_public($msg);
+ else
+ $ret = diaspora_dispatch($importer,$msg);
- http_status_exit(200);
+ http_status_exit(($ret) ? $ret : 200);
// NOTREACHED
}
diff --git a/mod/register.php b/mod/register.php
index 5fceebd4b..85e1f9faa 100644
--- a/mod/register.php
+++ b/mod/register.php
@@ -501,8 +501,7 @@ function register_content(&$a) {
}
- $license = cc_license();
-
+ $license = '';
$o = get_markup_template("register.tpl");
$o = replace_macros($o, array(
diff --git a/mod/salmon.php b/mod/salmon.php
index 0264e820d..6172d17a1 100644
--- a/mod/salmon.php
+++ b/mod/salmon.php
@@ -25,12 +25,12 @@ function salmon_post(&$a) {
$xml = file_get_contents('php://input');
- logger('mod-salmon: new salmon ' . $xml);
+ logger('mod-salmon: new salmon ' . $xml, LOGGER_DATA);
$nick = (($a->argc > 1) ? notags(trim($a->argv[1])) : '');
$mentions = (($a->argc > 2 && $a->argv[2] === 'mention') ? true : false);
- $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' LIMIT 1",
+ $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `account_expired` = 0 LIMIT 1",
dbesc($nick)
);
if(! count($r))
diff --git a/mod/search.php b/mod/search.php
index 3264948be..396b50738 100644
--- a/mod/search.php
+++ b/mod/search.php
@@ -9,8 +9,9 @@ function search_saved_searches() {
);
if(count($r)) {
+ $o .= '<div id="saved-search-list" class="widget">';
$o .= '<h3>' . t('Saved Searches') . '</h3>' . "\r\n";
- $o .= '<div id="saved-search-list"><ul id="saved-search-ul">' . "\r\n";
+ $o .= '<ul id="saved-search-ul">' . "\r\n";
foreach($r as $rr) {
$o .= '<li class="saved-search-li clear"><a href="search/?f=&remove=1&search=' . $rr['term'] . '" class="icon drophide savedsearchdrop" title="' . t('Remove term') . '" onclick="return confirmDelete();" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a> <a href="search/?f&search=' . $rr['term'] . '" class="savedsearchterm" >' . $rr['term'] . '</a></li>' . "\r\n";
}
@@ -142,12 +143,11 @@ function search_content(&$a) {
);
-
+ $o .= '<h2>Search results for: ' . $search . '</h2>';
$o .= conversation($a,$r,'search',false);
$o .= paginate($a);
- $o .= cc_license();
return $o;
}
diff --git a/mod/xrd.php b/mod/xrd.php
index fcec74336..dae6e4828 100644
--- a/mod/xrd.php
+++ b/mod/xrd.php
@@ -45,6 +45,7 @@ function xrd_init(&$a) {
'$profile_url' => $a->get_baseurl() . '/profile/' . $r[0]['nickname'],
'$hcard_url' => $a->get_baseurl() . '/hcard/' . $r[0]['nickname'],
'$atom' => $a->get_baseurl() . '/dfrn_poll/' . $r[0]['nickname'],
+ '$zot_post' => $a->get_baseurl() . '/post/' . $r[0]['nickname'],
'$photo' => $a->get_baseurl() . '/photo/profile/' . $r[0]['uid'] . '.jpg',
'$dspr' => $dspr,
'$salmon' => $a->get_baseurl() . '/salmon/' . $r[0]['nickname'],
diff --git a/update.php b/update.php
index f94e78d72..2f9277dae 100644
--- a/update.php
+++ b/update.php
@@ -1,6 +1,6 @@
<?php
-define( 'UPDATE_VERSION' , 1087 );
+define( 'UPDATE_VERSION' , 1092 );
/**
*
@@ -726,3 +726,47 @@ function update_1086() {
q("ALTER TABLE `item` ADD `bookmark` tinyint(1) NOT NULL DEFAULT '0' AFTER `starred` ");
}
+function update_1087() {
+ q("ALTER TABLE `item` ADD `commented` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `edited` ");
+
+ $r = q("SELECT `id` FROM `item` WHERE `parent` = `id` ");
+ if(count($r)) {
+ foreach($r as $rr) {
+ $x = q("SELECT max(`created`) AS `cdate` FROM `item` WHERE `parent` = %d LIMIT 1",
+ intval($rr['id'])
+ );
+ if(count($x))
+ q("UPDATE `item` SET `commented` = '%s' WHERE `id` = %d LIMIT 1",
+ dbesc($x[0]['cdate']),
+ intval($rr['id'])
+ );
+ }
+ }
+}
+
+function update_1088() {
+ q("ALTER TABLE `user` ADD `account_expired` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `expire` ,
+ ADD `account_expires_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `account_expired` ,
+ ADD `expire_notification_sent` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `account_expires_on` ");
+}
+
+function update_1089() {
+ q("ALTER TABLE `user` ADD `blocktags` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `hidewall` ");
+}
+
+function update_1090() {
+ q("ALTER TABLE `contact` ADD `batch` char(255) NOT NULL AFTER `prvkey` ");
+
+ q("UPDATE `contact` SET `batch` = concat(substring_index(`url`,'/',3),'/receive/public') WHERE `network` = 'dspr' ");
+
+}
+
+function update_1091() {
+
+ // catch a few stragglers that may have crept in before we added this on remote connects
+ q("UPDATE `contact` SET `batch` = concat(substring_index(`url`,'/',3),'/receive/public') WHERE `network` = 'dspr' AND `batch` = '' ");
+ q("ALTER TABLE `queue` ADD `batch` TINYINT( 1 ) NOT NULL DEFAULT '0' ");
+ q("ALTER TABLE `fcontact` ADD `batch` char(255) NOT NULL AFTER `addr` ");
+
+}
+
diff --git a/util/po2php.php b/util/po2php.php
index 1a86bb38d..c703172af 100644
--- a/util/po2php.php
+++ b/util/po2php.php
@@ -10,7 +10,14 @@ function po2php_run($argv, $argc) {
$pofile = $argv[1];
$outfile = dirname($pofile)."/strings.php";
-
+
+ if(strstr($outfile,'util'))
+ $lang = 'en';
+ else
+ $lang = str_replace('-','_',basename(dirname($pofile)));
+
+
+
if (!file_exists($pofile)){
print "Unable to find '$pofile'\n";
return;
@@ -37,7 +44,7 @@ function po2php_run($argv, $argc) {
$match=Array();
preg_match("|nplurals=([0-9]*); *plural=(.*)[;\\\\]|", $l, $match);
$cond = str_replace('n','$n',$match[2]);
- $out .= 'function string_plural_select($n){'."\n";
+ $out .= 'function string_plural_select_' . $lang . '($n){'."\n";
$out .= ' return '.$cond.';'."\n";
$out .= '}'."\n";
}
diff --git a/view/cs/strings.php b/view/cs/strings.php
index 38f3041b7..0c7d0d7bd 100644
--- a/view/cs/strings.php
+++ b/view/cs/strings.php
@@ -1,6 +1,6 @@
<?php
-function string_plural_select($n){
+function string_plural_select_cs($n){
return ($n==1) ? 0 : ($n>=2 && $n<=4) ? 1 : 2;
}
;
diff --git a/view/de/strings.php b/view/de/strings.php
index affae0bfe..f46580e55 100644
--- a/view/de/strings.php
+++ b/view/de/strings.php
@@ -1,6 +1,6 @@
<?php
-function string_plural_select($n){
+function string_plural_select_de($n){
return ($n != 1);
}
;
@@ -380,8 +380,8 @@ $a->strings["View New Items"] = "Neue Einträge anzeigen";
$a->strings["View Any Items"] = "Alle Einträge anzeigen";
$a->strings["View Starred Items"] = "Gesternte Einträge anzeigen";
$a->strings["Warning: This group contains %s member from an insecure network."] = array(
- 0 => "Warnung: Diese Gruppe beinhaltet %s Mitglied aus unsicheren Netzwerken.",
- 1 => "Warnung: Diese Gruppe beinhaltet %s Mitglieder aus unsicheren Netzwerken.",
+ 0 => "",
+ 1 => "",
);
$a->strings["Private messages to this group are at risk of public disclosure."] = "Private Nachrichten an diese Gruppe könnten an die Öffentlichkeit geraten.";
$a->strings["No such group"] = "Es gibt keine solche Gruppe";
@@ -603,7 +603,7 @@ $a->strings["Log settings updated."] = "Protokolleinstellungen aktualisiert.";
$a->strings["Clear"] = "löschen";
$a->strings["Debugging"] = "Protokoll führen";
$a->strings["Log file"] = "Protokolldatei";
-$a->strings["Must be writable by web server. Relative to your Friendika index.php."] = "Muss schreibbar durch den Webserver sein. Angabe relativ zu Friendikas index.php.";
+$a->strings["Must be writable by web server. Relative to your Friendika index.php."] = "Muss schreibbar durch den Webserver sein. Angabe relativ zu Friendikas indes.php.";
$a->strings["Log level"] = "Protokollevel";
$a->strings["Close"] = "Schließen";
$a->strings["FTP Host"] = "FTP Host";
diff --git a/view/es/strings.php b/view/es/strings.php
index 8e7a8fe11..4044755a5 100644
--- a/view/es/strings.php
+++ b/view/es/strings.php
@@ -1,20 +1,17 @@
<?php
-function string_plural_select($n){
- return ($n != 1);
-}
;
$a->strings["Not Found"] = "No se ha encontrado";
-$a->strings["Page not found."] = "Página no encontrada.";
+$a->strings["Page not found."] = "Página no encontrada.";
$a->strings["Permission denied"] = "Permiso denegado";
$a->strings["Permission denied."] = "Permiso denegado.";
-$a->strings["Create a New Account"] = "Crea una nueva cuenta";
+$a->strings["Create a New Account"] = "Crear una nueva cuenta";
$a->strings["Register"] = "Registrarse";
$a->strings["Nickname or Email address: "] = "Apodo o dirección de email: ";
-$a->strings["Password: "] = "Contraseña: ";
+$a->strings["Password: "] = "Contraseña: ";
$a->strings["Login"] = "Acceder";
$a->strings["Nickname/Email/OpenID: "] = "Apodo/Email/OpenID: ";
-$a->strings["Password (if not OpenID): "] = "Contraseña (si no OpenID): ";
+$a->strings["Password (if not OpenID): "] = "Contraseña (si no OpenID): ";
$a->strings["Forgot your password?"] = "¿Olvidó la contraseña?";
$a->strings["Password Reset"] = "Resetear la contraseña";
$a->strings["Logout"] = "Salir";
@@ -34,7 +31,7 @@ $a->strings["No contacts"] = "Nigún contacto";
$a->strings["Contacts"] = "Contactos";
$a->strings["View Contacts"] = "Ver contactos";
$a->strings["Search"] = "Busca";
-$a->strings["No profile"] = "Nigún perfil";
+$a->strings["No profile"] = "Nigún perfil";
$a->strings["Connect"] = "Conecta";
$a->strings["Location:"] = "Ubicación:";
$a->strings[", "] = ", ";
@@ -329,9 +326,9 @@ $a->strings["Please login to confirm introduction."] = "Inicia sesión para conf
$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Inicio de sesión con la identificación incorrecta. Entra en <strong>este</ strong> perfil.";
$a->strings["[Name Withheld]"] = "[Nombre oculto]";
$a->strings["Introduction received at "] = "Presentación recibida en";
-$a->strings["Friend/Connection Request"] = "Solicitud de Amistad/Conexión";
+$a->strings["Friend/Connection Request"] = "Solicitud de Amistad/Conexión";
$a->strings["Please answer the following:"] = "Por favor responda lo siguiente:";
-$a->strings["Does \$name know you?"] = "\$name te conoce?";
+$a->strings["Does \$name know you?"] = "$name te conoce?";
$a->strings["Add a personal note:"] = "Agregar una nota personal:";
$a->strings["Please enter your profile address from one of the following supported social networks:"] = "Por favor, introduzca su dirección de perfil de uno de las siguientes redes sociales soportadas:";
$a->strings["Friendika"] = "Friendika";
@@ -577,3 +574,522 @@ $a->strings["%d Contact"] = array(
0 => "%d Contacto",
1 => "%d Contactos",
);
+$a->strings["Post successful."] = "";
+$a->strings["Contact settings applied."] = "";
+$a->strings["Contact update failed."] = "";
+$a->strings["Repair Contact Settings"] = "";
+$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact will stop working."] = "";
+$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "";
+$a->strings["Name"] = "";
+$a->strings["Account Nickname"] = "";
+$a->strings["@Tagname - overrides Name/Nickname"] = "";
+$a->strings["Account URL"] = "";
+$a->strings["Friend Request URL"] = "";
+$a->strings["Friend Confirm URL"] = "";
+$a->strings["Notification Endpoint URL"] = "";
+$a->strings["Poll/Feed URL"] = "";
+$a->strings["Help:"] = "";
+$a->strings["Help"] = "";
+$a->strings["File exceeds size limit of %d"] = "";
+$a->strings["File upload failed."] = "";
+$a->strings["Friend suggestion sent."] = "";
+$a->strings["Suggest Friends"] = "";
+$a->strings["Suggest a friend for %s"] = "";
+$a->strings["Status"] = "";
+$a->strings["Profile"] = "";
+$a->strings["Photos"] = "";
+$a->strings["Events"] = "";
+$a->strings["Personal Notes"] = "";
+$a->strings["Create New Event"] = "";
+$a->strings["Previous"] = "";
+$a->strings["Next"] = "";
+$a->strings["l, F j"] = "";
+$a->strings["Edit event"] = "";
+$a->strings["hour:minute"] = "";
+$a->strings["Event details"] = "";
+$a->strings["Format is %s %s. Starting date and Description are required."] = "";
+$a->strings["Event Starts:"] = "";
+$a->strings["Finish date/time is not known or not relevant"] = "";
+$a->strings["Event Finishes:"] = "";
+$a->strings["Adjust for viewer timezone"] = "";
+$a->strings["Description:"] = "";
+$a->strings["Share this event"] = "";
+$a->strings["everybody"] = "";
+$a->strings["Image file is empty."] = "";
+$a->strings["Public access denied."] = "";
+$a->strings["Access to this item is restricted."] = "";
+$a->strings["Comment"] = "";
+$a->strings["Not available."] = "";
+$a->strings["Community"] = "";
+$a->strings["Post to Email"] = "";
+$a->strings["Attach file"] = "";
+$a->strings["Public post"] = "";
+$a->strings["Welcome home %s."] = "";
+$a->strings["Please confirm your introduction/connection request to %s."] = "";
+$a->strings["Confirm"] = "";
+$a->strings["Diaspora members: Please do not use this form. Instead, enter \"%s\" into your Diaspora search bar."] = "";
+$a->strings["Please enter your 'Identity Address' from one of the following supported social networks:"] = "";
+$a->strings["Examples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca"] = "";
+$a->strings["Does %s know you?"] = "";
+$a->strings["Diaspora"] = "";
+$a->strings["- please share from your own site as noted above"] = "";
+$a->strings["Your Identity Address:"] = "";
+$a->strings["Proceed with Installation"] = "";
+$a->strings["Your Friendika site database has been installed."] = "";
+$a->strings["Proceed to registration"] = "";
+$a->strings["Friendika Social Network"] = "";
+$a->strings["Installation"] = "";
+$a->strings["In order to install Friendika we need to know how to connect to your database."] = "";
+$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "";
+$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "";
+$a->strings["Database Server Name"] = "";
+$a->strings["Database Login Name"] = "";
+$a->strings["Database Login Password"] = "";
+$a->strings["Database Name"] = "";
+$a->strings["Please select a default timezone for your website"] = "";
+$a->strings["Site administrator email address. Your account email address must match this in order to use the web admin panel."] = "";
+$a->strings["Error: mb_string PHP module required but not installed."] = "";
+$a->strings["l F d, Y \\@ g:i A"] = "";
+$a->strings["Time Conversion"] = "";
+$a->strings["Friendika provides this service for sharing events with other networks and friends in unknown timezones."] = "";
+$a->strings["Converted localtime: %s"] = "";
+$a->strings["UTC time: %s"] = "";
+$a->strings["Please select your timezone:"] = "";
+$a->strings["[Embedded content - reload page to view]"] = "";
+$a->strings["Profile Match"] = "";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "";
+$a->strings["No matches"] = "";
+$a->strings["Pending Friend/Connect Notifications"] = "";
+$a->strings["Friend Suggestion"] = "";
+$a->strings["suggested by %s"] = "";
+$a->strings["Sharer"] = "";
+$a->strings["%d invitation available"] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["Find People With Shared Interests"] = "";
+$a->strings["Privacy Unavailable"] = "";
+$a->strings["Private communications are not available for this contact."] = "";
+$a->strings["Suggest friends"] = "";
+$a->strings["Network type: %s"] = "";
+$a->strings["Profile Visibility"] = "";
+$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "";
+$a->strings["Contact Information / Notes"] = "";
+$a->strings["Online Reputation"] = "";
+$a->strings["Occasionally your friends may wish to inquire about this person's online legitimacy."] = "";
+$a->strings["You may help them choose whether or not to interact with this person by providing a <em>reputation</em> to guide them."] = "";
+$a->strings["Please take a moment to elaborate on this selection if you feel it could be helpful to others."] = "";
+$a->strings["Visit %s's profile [%s]"] = "";
+$a->strings["Repair contact URL settings"] = "";
+$a->strings["Repair contact URL settings (WARNING: Advanced)"] = "";
+$a->strings["View conversations"] = "";
+$a->strings["No valid account found."] = "";
+$a->strings["Password reset request issued. Check your email."] = "";
+$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "";
+$a->strings["Your password has been reset as requested."] = "";
+$a->strings["Your new password is"] = "";
+$a->strings["Save or copy your new password - and then"] = "";
+$a->strings["click here to login"] = "";
+$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "";
+$a->strings["Forgot your Password?"] = "";
+$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "";
+$a->strings["Nickname or Email: "] = "";
+$a->strings["Reset"] = "";
+$a->strings["Failed to connect with email account using the settings provided."] = "";
+$a->strings["Account settings"] = "";
+$a->strings["Plugin settings"] = "";
+$a->strings["Normal Account"] = "";
+$a->strings["This account is a normal personal profile"] = "";
+$a->strings["Soapbox Account"] = "";
+$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "";
+$a->strings["Community/Celebrity Account"] = "";
+$a->strings["Automatically approve all connection/friend requests as read-write fans"] = "";
+$a->strings["Automatic Friend Account"] = "";
+$a->strings["Automatically approve all connection/friend requests as friends"] = "";
+$a->strings["OpenID:"] = "";
+$a->strings["(Optional) Allow this OpenID to login to this account."] = "";
+$a->strings["Publish your default profile in your local site directory?"] = "";
+$a->strings["Publish your default profile in the global social directory?"] = "";
+$a->strings["Hide your contact/friend list from viewers of your default profile?"] = "";
+$a->strings["Hide profile details and all your messages from unknown viewers?"] = "";
+$a->strings["or"] = "";
+$a->strings["Your Identity Address is"] = "";
+$a->strings["Export Personal Data"] = "";
+$a->strings["Password Settings"] = "";
+$a->strings["New Password:"] = "";
+$a->strings["Confirm:"] = "";
+$a->strings["Leave password fields blank unless changing"] = "";
+$a->strings["Basic Settings"] = "";
+$a->strings["Full Name:"] = "";
+$a->strings["Email Address:"] = "";
+$a->strings["Your Timezone:"] = "";
+$a->strings["Default Post Location:"] = "";
+$a->strings["Use Browser Location:"] = "";
+$a->strings["Display Theme:"] = "";
+$a->strings["Security and Privacy Settings"] = "";
+$a->strings["Maximum Friend Requests/Day:"] = "";
+$a->strings["(to prevent spam abuse)"] = "";
+$a->strings["(click to open/close)"] = "";
+$a->strings["Allow friends to post to your profile page:"] = "";
+$a->strings["Automatically expire posts after days:"] = "";
+$a->strings["If empty, posts will not expire. Expired posts will be deleted"] = "";
+$a->strings["Notification Settings"] = "";
+$a->strings["Send a notification email when:"] = "";
+$a->strings["You receive an introduction"] = "";
+$a->strings["Your introductions are confirmed"] = "";
+$a->strings["Someone writes on your profile wall"] = "";
+$a->strings["Someone writes a followup comment"] = "";
+$a->strings["You receive a private message"] = "";
+$a->strings["Email/Mailbox Setup"] = "";
+$a->strings["If you wish to communicate with email contacts using this service (optional), please specify how to connect to your mailbox."] = "";
+$a->strings["Last successful email check:"] = "";
+$a->strings["Email access is disabled on this site."] = "";
+$a->strings["IMAP server name:"] = "";
+$a->strings["IMAP port:"] = "";
+$a->strings["Security:"] = "";
+$a->strings["None"] = "";
+$a->strings["Email login name:"] = "";
+$a->strings["Email password:"] = "";
+$a->strings["Reply-to address:"] = "";
+$a->strings["Send public posts to all email contacts:"] = "";
+$a->strings["Advanced Page Settings"] = "";
+$a->strings["View Conversations"] = "";
+$a->strings["View New Items"] = "";
+$a->strings["View Any Items"] = "";
+$a->strings["View Starred Items"] = "";
+$a->strings["View Bookmarks"] = "";
+$a->strings["Saved Searches"] = "";
+$a->strings["Remove term"] = "";
+$a->strings["Warning: This group contains %s member from an insecure network."] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["Private messages to this group are at risk of public disclosure."] = "";
+$a->strings["Contact: "] = "";
+$a->strings["Private messages to this person are at risk of public disclosure."] = "";
+$a->strings["Invalid contact."] = "";
+$a->strings["Save"] = "";
+$a->strings["Welcome to Friendika"] = "";
+$a->strings["New Member Checklist"] = "";
+$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page."] = "";
+$a->strings["On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This will be useful in making friends."] = "";
+$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "";
+$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "";
+$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "";
+$a->strings["Enter your email access information on your Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "";
+$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "";
+$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "";
+$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Connect</em> dialog."] = "";
+$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "";
+$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "";
+$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "";
+$a->strings["Item not available."] = "";
+$a->strings["Item was not found."] = "";
+$a->strings["Create a group of contacts/friends."] = "";
+$a->strings["Group Name: "] = "";
+$a->strings["Click on a contact to add or remove."] = "";
+$a->strings["Group Editor"] = "";
+$a->strings["Members"] = "";
+$a->strings["All Contacts"] = "";
+$a->strings["Invalid profile identifier."] = "";
+$a->strings["Profile Visibility Editor"] = "";
+$a->strings["Visible To"] = "";
+$a->strings["All Contacts (with secure profile access)"] = "";
+$a->strings["An invitation is required."] = "";
+$a->strings["Invitation could not be verified."] = "";
+$a->strings["That doesn't appear to be your full (First Last) name."] = "";
+$a->strings["Membership on this site is by invitation only."] = "";
+$a->strings["Your invitation ID: "] = "";
+$a->strings["This is Friendika version"] = "";
+$a->strings["running at web location"] = "";
+$a->strings["Shared content within the Friendika network is provided under the <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0 license</a>"] = "";
+$a->strings["Please visit <a href=\"http://project.friendika.com\">Project.Friendika.com</a> to learn more about the Friendika project."] = "";
+$a->strings["Bug reports and issues: please visit"] = "";
+$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendika - dot com"] = "";
+$a->strings["Installed plugins/addons/apps"] = "";
+$a->strings["No installed plugins/addons/apps"] = "";
+$a->strings["Administrator@"] = "";
+$a->strings["%s posted to your profile wall at %s"] = "";
+$a->strings["You may visit them online at %s"] = "";
+$a->strings["Upload File:"] = "";
+$a->strings["Upload Profile Photo"] = "";
+$a->strings["Upload"] = "";
+$a->strings["skip this step"] = "";
+$a->strings["select a photo from your photo albums"] = "";
+$a->strings["Crop Image"] = "";
+$a->strings["Please adjust the image cropping for optimum viewing."] = "";
+$a->strings["Done Editing"] = "";
+$a->strings["Please enter a link URL:"] = "";
+$a->strings["D, d M Y - g:i A"] = "";
+$a->strings["Site"] = "";
+$a->strings["Users"] = "";
+$a->strings["Plugins"] = "";
+$a->strings["Update"] = "";
+$a->strings["Logs"] = "";
+$a->strings["User registrations waiting for confirmation"] = "";
+$a->strings["Administration"] = "";
+$a->strings["Summary"] = "";
+$a->strings["Registered users"] = "";
+$a->strings["Pending registrations"] = "";
+$a->strings["Version"] = "";
+$a->strings["Active plugins"] = "";
+$a->strings["Site settings updated."] = "";
+$a->strings["Closed"] = "";
+$a->strings["Requires approval"] = "";
+$a->strings["Open"] = "";
+$a->strings["File upload"] = "";
+$a->strings["Policies"] = "";
+$a->strings["Advanced"] = "";
+$a->strings["Site name"] = "";
+$a->strings["Banner/Logo"] = "";
+$a->strings["System language"] = "";
+$a->strings["System theme"] = "";
+$a->strings["Maximum image size"] = "";
+$a->strings["Register policy"] = "";
+$a->strings["Register text"] = "";
+$a->strings["Allowed friend domains"] = "";
+$a->strings["Allowed email domains"] = "";
+$a->strings["Block public"] = "";
+$a->strings["Force publish"] = "";
+$a->strings["Global directory update URL"] = "";
+$a->strings["Block multiple registrations"] = "";
+$a->strings["OpenID support"] = "";
+$a->strings["Gravatar support"] = "";
+$a->strings["Fullname check"] = "";
+$a->strings["UTF-8 Regular expressions"] = "";
+$a->strings["Show Community Page"] = "";
+$a->strings["Enable OStatus support"] = "";
+$a->strings["Enable Diaspora support"] = "";
+$a->strings["Only allow Friendika contacts"] = "";
+$a->strings["Verify SSL"] = "";
+$a->strings["Proxy user"] = "";
+$a->strings["Proxy URL"] = "";
+$a->strings["Network timeout"] = "";
+$a->strings["%s user blocked"] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["%s user deleted"] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["User '%s' deleted"] = "";
+$a->strings["User '%s' unblocked"] = "";
+$a->strings["User '%s' blocked"] = "";
+$a->strings["select all"] = "";
+$a->strings["User registrations waiting for confirm"] = "";
+$a->strings["Request date"] = "";
+$a->strings["Email"] = "";
+$a->strings["Deny"] = "";
+$a->strings["Block"] = "";
+$a->strings["Unblock"] = "";
+$a->strings["Register date"] = "";
+$a->strings["Last login"] = "";
+$a->strings["Last item"] = "";
+$a->strings["Account"] = "";
+$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "";
+$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "";
+$a->strings["Plugin %s disabled."] = "";
+$a->strings["Plugin %s enabled."] = "";
+$a->strings["Disable"] = "";
+$a->strings["Enable"] = "";
+$a->strings["Toggle"] = "";
+$a->strings["Log settings updated."] = "";
+$a->strings["Clear"] = "";
+$a->strings["Debugging"] = "";
+$a->strings["Log file"] = "";
+$a->strings["Must be writable by web server. Relative to your Friendika index.php."] = "";
+$a->strings["Log level"] = "";
+$a->strings["Close"] = "";
+$a->strings["FTP Host"] = "";
+$a->strings["FTP Path"] = "";
+$a->strings["FTP User"] = "";
+$a->strings["FTP Password"] = "";
+$a->strings["Access to this profile has been restricted."] = "";
+$a->strings["Tips for New Members"] = "";
+$a->strings["Welcome "] = "";
+$a->strings["Please upload a profile photo."] = "";
+$a->strings["This site is not configured to allow communications with other networks."] = "";
+$a->strings["No compatible communication protocols or feeds were discovered."] = "";
+$a->strings["An author or name was not found."] = "";
+$a->strings["No browser URL could be matched to this address."] = "";
+$a->strings["The profile address specified belongs to a network which has been disabled on this site."] = "";
+$a->strings["No installed applications."] = "";
+$a->strings["Hide your contact/friend list from viewers of this profile?"] = "";
+$a->strings["Edit Profile Details"] = "";
+$a->strings["View this profile"] = "";
+$a->strings["Create a new profile using these settings"] = "";
+$a->strings["Clone this profile"] = "";
+$a->strings["Delete this profile"] = "";
+$a->strings["Profile Name:"] = "";
+$a->strings["Your Full Name:"] = "";
+$a->strings["Title/Description:"] = "";
+$a->strings["Your Gender:"] = "";
+$a->strings["Birthday (%s):"] = "";
+$a->strings["Street Address:"] = "";
+$a->strings["Locality/City:"] = "";
+$a->strings["Postal/Zip Code:"] = "";
+$a->strings["Country:"] = "";
+$a->strings["Region/State:"] = "";
+$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "";
+$a->strings["Who: (if applicable)"] = "";
+$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "";
+$a->strings["Sexual Preference:"] = "";
+$a->strings["Homepage URL:"] = "";
+$a->strings["Political Views:"] = "";
+$a->strings["Religious Views:"] = "";
+$a->strings["Public Keywords:"] = "";
+$a->strings["Private Keywords:"] = "";
+$a->strings["Example: fishing photography software"] = "";
+$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "";
+$a->strings["(Used for searching profiles, never shown to others)"] = "";
+$a->strings["Tell us about yourself..."] = "";
+$a->strings["Hobbies/Interests"] = "";
+$a->strings["Contact information and Social Networks"] = "";
+$a->strings["Musical interests"] = "";
+$a->strings["Books, literature"] = "";
+$a->strings["Television"] = "";
+$a->strings["Film/dance/culture/entertainment"] = "";
+$a->strings["Love/romance"] = "";
+$a->strings["Work/employment"] = "";
+$a->strings["School/education"] = "";
+$a->strings["Change profile photo"] = "";
+$a->strings["Create New Profile"] = "";
+$a->strings["visible to everybody"] = "";
+$a->strings["Edit visibility"] = "";
+$a->strings["Normal site view"] = "";
+$a->strings["View all site entries"] = "";
+$a->strings["Site Directory"] = "";
+$a->strings["Gender: "] = "";
+$a->strings["No entries (some entries may be hidden)."] = "";
+$a->strings["You have no more invitations available"] = "";
+$a->strings["You will need to supply this invitation code: \$invite_code"] = "";
+$a->strings["%1\$s is now friends with %2\$s"] = "";
+$a->strings["Site public key not available in contact record for URL %s."] = "";
+$a->strings["Updating contacts"] = "";
+$a->strings["Install Facebook connector for this account."] = "";
+$a->strings["Remove Facebook connector"] = "";
+$a->strings["Link all your Facebook friends and conversations"] = "";
+$a->strings["Do not link your Facebook profile wall posts - as these could be visible to people that would not be able to see them on Facebook."] = "";
+$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = "";
+$a->strings["View on Friendika"] = "";
+$a->strings["Facebook post failed. Queued for retry."] = "";
+$a->strings["Generate new key"] = "";
+$a->strings["Widgets key"] = "";
+$a->strings["Widgets available"] = "";
+$a->strings["Connect on Friendika!"] = "";
+$a->strings["Impressum"] = "";
+$a->strings["Site Owner"] = "";
+$a->strings["Email Address"] = "";
+$a->strings["Postal Address"] = "";
+$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = "";
+$a->strings["Site Owners Profile"] = "";
+$a->strings["Notes"] = "";
+$a->strings["OEmbed settings updated"] = "";
+$a->strings["Use OEmbed for YouTube videos"] = "";
+$a->strings["URL to embed:"] = "";
+$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "";
+$a->strings["We could not contact the StatusNet API with the Path you entered."] = "";
+$a->strings["StatusNet settings updated."] = "";
+$a->strings["Globally Available StatusNet OAuthKeys"] = "";
+$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "";
+$a->strings["Provide your own OAuth Credentials"] = "";
+$a->strings["Cancel Connection Process"] = "";
+$a->strings["Current StatusNet API is"] = "";
+$a->strings["Cancel StatusNet Connection"] = "";
+$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "";
+$a->strings["Allow posting to StatusNet"] = "";
+$a->strings["Send public postings to StatusNet by default"] = "";
+$a->strings["API URL"] = "";
+$a->strings["Consumer Secret"] = "";
+$a->strings["Consumer Key"] = "";
+$a->strings["Post to Wordpress"] = "";
+$a->strings["WordPress Post Settings"] = "";
+$a->strings["Enable WordPress Post Plugin"] = "";
+$a->strings["WordPress username"] = "";
+$a->strings["WordPress password"] = "";
+$a->strings["WordPress API URL"] = "";
+$a->strings["Post to WordPress by default"] = "";
+$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "";
+$a->strings["If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "";
+$a->strings["Piwik Base URL"] = "";
+$a->strings["Site ID"] = "";
+$a->strings["Show opt-out cookie link?"] = "";
+$a->strings["Twitter settings updated."] = "";
+$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "";
+$a->strings["Allow posting to Twitter"] = "";
+$a->strings["Send public postings to Twitter by default"] = "";
+$a->strings["Consumer key"] = "";
+$a->strings["Consumer secret"] = "";
+$a->strings["j F, Y"] = "";
+$a->strings["j F"] = "";
+$a->strings["Age:"] = "";
+$a->strings["<span class=\"heart\">&hearts;</span> Status:"] = "";
+$a->strings["Religion:"] = "";
+$a->strings["About:"] = "";
+$a->strings["Hobbies/Interests:"] = "";
+$a->strings["Contact information and Social Networks:"] = "";
+$a->strings["Musical interests:"] = "";
+$a->strings["Books, literature:"] = "";
+$a->strings["Television:"] = "";
+$a->strings["Film/dance/culture/entertainment:"] = "";
+$a->strings["Love/Romance:"] = "";
+$a->strings["Work/employment:"] = "";
+$a->strings["School/education:"] = "";
+$a->strings["OStatus"] = "";
+$a->strings["RSS/Atom"] = "";
+$a->strings["Zot!"] = "";
+$a->strings["Starts:"] = "";
+$a->strings["Finishes:"] = "";
+$a->strings["(no subject)"] = "";
+$a->strings["bytes"] = "";
+$a->strings["Select an alternate language"] = "";
+$a->strings["Sharing notification from Diaspora network"] = "";
+$a->strings["link"] = "";
+$a->strings["[Relayed] Comment authored by %s from network %s"] = "";
+$a->strings["End this session"] = "";
+$a->strings["Sign in"] = "";
+$a->strings["Home Page"] = "";
+$a->strings["Create an account"] = "";
+$a->strings["Help and documentation"] = "";
+$a->strings["Addon applications, utilities, games"] = "";
+$a->strings["Search site content"] = "";
+$a->strings["Conversations on this site"] = "";
+$a->strings["People directory"] = "";
+$a->strings["Conversations from your friends"] = "";
+$a->strings["Your posts and conversations"] = "";
+$a->strings["Friend requests"] = "";
+$a->strings["Private mail"] = "";
+$a->strings["Manage other pages"] = "";
+$a->strings["Manage/edit profiles"] = "";
+$a->strings["Manage/edit friends and contacts"] = "";
+$a->strings["Admin"] = "";
+$a->strings["Site setup and configuration"] = "";
+$a->strings["never"] = "";
+$a->strings["From: "] = "";
+$a->strings["Image/photo"] = "";
+$a->strings["Visible to everybody"] = "";
+$a->strings["show"] = "";
+$a->strings["don't show"] = "";
+$a->strings["View status"] = "";
+$a->strings["View profile"] = "";
+$a->strings["View photos"] = "";
+$a->strings["View recent"] = "";
+$a->strings["Send PM"] = "";
+$a->strings["event"] = "";
+$a->strings["View %s's profile"] = "";
+$a->strings["%s from %s"] = "";
+$a->strings["See more posts like this"] = "";
+$a->strings["See all %d comments"] = "";
+$a->strings["Select"] = "";
+$a->strings["toggle star status"] = "";
+$a->strings["Delete Selected Items"] = "";
+$a->strings["Visible to <strong>everybody</strong>"] = "";
+$a->strings["Please enter a YouTube link:"] = "";
+$a->strings["Please enter a video(.ogg) link/URL:"] = "";
+$a->strings["Please enter an audio(.ogg) link/URL:"] = "";
+$a->strings["Where are you right now?"] = "";
+$a->strings["Enter a title for this item"] = "";
+$a->strings["Set title"] = "";
+$a->strings["Delete this item?"] = "";
+$a->strings["g A l F d"] = "";
diff --git a/view/follow.tpl b/view/follow.tpl
index 49bebee8b..2c024930c 100644
--- a/view/follow.tpl
+++ b/view/follow.tpl
@@ -1,10 +1,9 @@
-<div class="side-follow-wrapper" id="side-follow-wrapper" >
-<form action="follow" method="post" />
-<label id="side-follow-label" for="side-follow-url" >$label</label>
-<input id="side-follow-url" type="text" name="url" size="24" title="$hint" />
-<div class="side-follow-input-end"></div>
-<input id="side-follow-submit" type="submit" name="submit" value="$follow" />
-</form>
+<div id="follow-sidebar" class="widget">
+ <h3>Find People</h3>
+ <form action="follow" method="post" />
+ <input id="side-follow-url" type="text" name="url" size="24" title="$hint" /><input id="side-follow-submit" type="submit" name="submit" value="$follow" />
+ </form>
+ $findSimilar
+ $inviteFriends
</div>
-<div class="side-follow-end"></div>
diff --git a/view/fr/strings.php b/view/fr/strings.php
index cbed6eec4..654fba019 100644
--- a/view/fr/strings.php
+++ b/view/fr/strings.php
@@ -1,6 +1,6 @@
<?php
-function string_plural_select($n){
+function string_plural_select_fr($n){
return ($n != 1);
}
;
diff --git a/view/it/strings.php b/view/it/strings.php
index 7d6c2e704..3a0aed70f 100644
--- a/view/it/strings.php
+++ b/view/it/strings.php
@@ -1,6 +1,6 @@
<?php
-function string_plural_select($n){
+function string_plural_select_it($n){
return ($n != 1);
}
;
diff --git a/view/it/wall_received_html_body_eml.tpl b/view/it/wall_received_html_body_eml.tpl
new file mode 100644
index 000000000..cdc05cfa3
--- /dev/null
+++ b/view/it/wall_received_html_body_eml.tpl
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional //EN">
+<html>
+<head>
+ <title>Messaggio da Friendika</title>
+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+</head>
+<body>
+<table style="border:1px solid #ccc">
+ <tbody>
+ <tr><td colspan="2" style="background:#084769; color:#FFFFFF; font-weight:bold; font-family:'lucida grande', tahoma, verdana,arial, sans-serif; padding: 4px 8px; vertical-align: middle; font-size:16px; letter-spacing: -0.03em; text-align: left;"><img style="width:32px;height:32px; float:left;" src='$siteurl/images/friendika-32.png'><div style="padding:7px; margin-left: 5px; float:left; font-size:18px;letter-spacing:1px;">Friendika</div><div style="clear: both;"></div></td></tr>
+
+ <tr><td style="padding-top:22px;" colspan="2">$from ha scritto sulla tua bacheca.</td></tr>
+
+
+ <tr><td style="padding-left:22px;padding-top:22px;width:60px;" valign="top" rowspan=3><a href="$url"><img style="border:0px;width:48px;height:48px;" src="$thumb"></a></td>
+ <td style="padding-top:22px;"><a href="$url">$from</a></td></tr>
+ <tr><td style="padding-right:22px;">$body</td></tr>
+ <tr><td style="padding-top:11px;padding-bottom:11px;" colspan="2">Vai su <a href="$siteurl">$siteurl</a> per <a href="$display">vedere o cancellare il post</a>.</td></tr>
+ <tr><td></td><td>Grazie,</td></tr>
+ <tr><td></td><td>L'amministratore di $sitename</td></tr>
+ </tbody>
+</table>
+</body>
+</html> \ No newline at end of file
diff --git a/view/it/wall_received_text_body_eml.tpl b/view/it/wall_received_text_body_eml.tpl
new file mode 100644
index 000000000..327557ea1
--- /dev/null
+++ b/view/it/wall_received_text_body_eml.tpl
@@ -0,0 +1,18 @@
+
+Caro $username,
+
+ '$from' ha scritto sulla tua bacheca.
+
+-----
+$body
+-----
+
+Vai su $siteurl per vedere o cancellare il post:
+
+$display
+
+Grazie,
+ L'amministratore di $sitename
+
+
+
diff --git a/view/jot-header.tpl b/view/jot-header.tpl
index 8174026ab..5eb07db44 100644
--- a/view/jot-header.tpl
+++ b/view/jot-header.tpl
@@ -142,7 +142,7 @@ function initEditor(cb){
if(reply && reply.length) {
reply = bin2hex(reply);
$('#profile-rotator').show();
- $.get('parse_url?url=' + reply, function(data) {
+ $.get('parse_url?binurl=' + reply, function(data) {
tinyMCE.execCommand('mceInsertRawHTML',false,data);
$('#profile-rotator').hide();
});
diff --git a/view/like.tpl b/view/like.tpl
index ce5af04ce..f4f2e1671 100644
--- a/view/like.tpl
+++ b/view/like.tpl
@@ -1,6 +1,6 @@
<div class="wall-item-like-buttons" id="wall-item-like-buttons-$id">
- <a href="#" class="icon like"title="$likethis" onclick="dolike($id,'like'); return false"></a>
+ <a href="#" class="icon like" title="$likethis" onclick="dolike($id,'like'); return false"></a>
<a href="#" class="icon dislike" title="$nolike" onclick="dolike($id,'dislike'); return false"></a>
- <a href="#" class="icon recycle wall-item-share-buttons" title="$share"onclick="jotShare($id); return false"></a>
+ <a href="#" class="icon recycle wall-item-share-buttons" title="$share" onclick="jotShare($id); return false"></a>
<img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
</div>
diff --git a/view/pt-br/strings.php b/view/pt-br/strings.php
index 4df793041..0cf143db4 100644
--- a/view/pt-br/strings.php
+++ b/view/pt-br/strings.php
@@ -1,6 +1,6 @@
<?php
-function string_plural_select($n){
+function string_plural_select_pt_br($n){
return ($n > 1);
}
;
diff --git a/view/ru/strings.php b/view/ru/strings.php
index 97904f094..4578c37e8 100644
--- a/view/ru/strings.php
+++ b/view/ru/strings.php
@@ -1,6 +1,6 @@
<?php
-function string_plural_select($n){
+function string_plural_select_ru($n){
return ($n%10==1 && $n%100!=11 ? 0 : $n%10>=2 && $n%10<=4 && ($n%100<10 || $n%100>=20) ? 1 : 2);
}
;
diff --git a/view/theme/dispy/jot-header.tpl b/view/theme/dispy/jot-header.tpl
index 0093bf82a..79b10fd40 100644
--- a/view/theme/dispy/jot-header.tpl
+++ b/view/theme/dispy/jot-header.tpl
@@ -163,7 +163,7 @@ function initEditor(cb) {
if(reply && reply.length) {
reply = bin2hex(reply);
$('#profile-rotator').show();
- $.get('parse_url?url=' + reply, function(data) {
+ $.get('parse_url?binurl=' + reply, function(data) {
tinyMCE.execCommand('mceInsertRawHTML',false,data);
$('#profile-rotator').hide();
});
diff --git a/view/theme/dispy/jot.tpl b/view/theme/dispy/jot.tpl
index d5e81a925..f6bf91ffa 100644
--- a/view/theme/dispy/jot.tpl
+++ b/view/theme/dispy/jot.tpl
@@ -9,7 +9,7 @@
</div>
<form id="profile-jot-form" action="$action" method="post" >
- <input type="hidden" name="type" value="wall" />
+ <input type="hidden" name="type" value="$ptyp" />
<input type="hidden" name="profile_uid" value="$profile_uid" />
<input type="hidden" name="return" value="$return_path" />
<input type="hidden" name="location" id="jot-location" value="$defloc" />
diff --git a/view/theme/duepuntozero/style.css b/view/theme/duepuntozero/style.css
index acd7d5bb5..2bb24ec45 100644
--- a/view/theme/duepuntozero/style.css
+++ b/view/theme/duepuntozero/style.css
@@ -219,6 +219,20 @@ section {
margin-right: 1em;
}
+#tabs-wrapper {
+ height: 27px;
+ background-image: url(head.jpg);
+ background-repeat: repeat-x;
+ background-position: 0px -20px;
+ border-bottom: 1px solid #babdb6;
+}
+.tabs {
+ display:block;
+ float:left;
+ padding: 0.4em;
+ margin-right: 1em;
+}
+
/* footer */
footer {
@@ -2749,6 +2763,7 @@ a.mail-list-link {
.off { background-position: 0px -48px; }
.starred { background-position: -16px -48px; }
.unstarred { background-position: -32px -48px; }
+.tagged { background-position: -48px -48px; }
.icon.dim { opacity: 0.3;filter:alpha(opacity=30); }
diff --git a/view/theme/greenzero/greenicons.png b/view/theme/greenzero/greenicons.png
index b20ac5c0d..2644e4284 100644
--- a/view/theme/greenzero/greenicons.png
+++ b/view/theme/greenzero/greenicons.png
Binary files differ
diff --git a/view/theme/loozah/style.css b/view/theme/loozah/style.css
index 8636f1085..dda980366 100644
--- a/view/theme/loozah/style.css
+++ b/view/theme/loozah/style.css
@@ -1587,6 +1587,26 @@ padding: 5px 10px 0px;
clear: both;
}
+.tabs {
+ padding: 4px;
+ margin-top: 10px;
+ margin-bottom: 10px;
+ margin-right: 5px;
+ /*border: 1px solid #CCC;*/
+ /*background: #F8F8F8;*/
+ font-size: 0.8em;
+ font-weight: bold;
+ background-color: #ECECEC;
+ border: 1px solid #858585;
+}
+.tabs:hover {
+ background-color: #0CBEFE;
+ color: #F5F6FB;
+ border: 1px solid #F5F6FB;
+ /*cursor: pointer;*/
+}
+
+
.comment-edit-text-empty {
color: gray;
height: 30px;
@@ -2732,6 +2752,7 @@ a.mail-list-link {
.off { background-position: 0px -48px; }
.starred { background-position: -16px -48px; }
.unstarred { background-position: -32px -48px; }
+.tagged { background-position: -48px -48px; }
.icon.dim { opacity: 0.3;filter:alpha(opacity=30); }
diff --git a/view/theme/testbubble/calendar.png b/view/theme/testbubble/calendar.png
new file mode 100644
index 000000000..705a75b8a
--- /dev/null
+++ b/view/theme/testbubble/calendar.png
Binary files differ
diff --git a/view/theme/testbubble/connect.png b/view/theme/testbubble/connect.png
new file mode 100644
index 000000000..b76fc13dc
--- /dev/null
+++ b/view/theme/testbubble/connect.png
Binary files differ
diff --git a/view/theme/testbubble/contact_edit.tpl b/view/theme/testbubble/contact_edit.tpl
new file mode 100644
index 000000000..59747c62d
--- /dev/null
+++ b/view/theme/testbubble/contact_edit.tpl
@@ -0,0 +1,67 @@
+
+<h2>$header</h2>
+
+<div id="contact-edit-banner-name">$name</div>
+
+$nettype
+
+<form action="contacts/$contact_id" method="post" >
+<input type="hidden" name="contact_id" value="$contact_id">
+
+<div id="contact-edit-wrapper" >
+
+ <div id="contact-edit-photo-wrapper" >
+ <img id="contact-edit-direction-icon" src="$dir_icon" alt="$alt_text" title="$alt_text" />
+ <div id="contact-edit-photo" >
+ <a href="$url" title="$visit" /><img src="$photo" $sparkle alt="$name" /></a>
+ </div>
+ <div id="contact-edit-photo-end" ></div>
+ </div>
+ <div id="contact-edit-nav-wrapper" >
+
+ <div id="contact-edit-links" >
+ <a href="contacts/$contact_id/block" class="icon block" id="contact-edit-block-link" title="$block_text"></a>
+ <a href="contacts/$contact_id/ignore" class="icon no" id="contact-edit-ignore-link" title="$ignore_text"></a>
+ <a href="crepair/$contact_id" class="icon tools" id="contact-edit-repair" title="$lblcrepair"></a>
+ <a href="contacts/$contact_id/drop" class="icon drophide" id="contact-edit-drop-link" onclick="return confirmDelete();" title="$delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);"></a>
+ </div>
+ <div id="contact-edit-nav-end"></div>
+
+ {{ if $poll_enabled }}
+ <div id="contact-edit-poll-wrapper">
+ <div id="contact-edit-last-update-text">$lastupdtext<span id="contact-edit-last-updated">$last_update</span></div>
+ <div id="contact-edit-poll-text">$updpub</div>
+ $poll_interval
+ <div id="contact-edit-update-now"><a href="contacts/$contact_id/update" >$udnow</a></div>
+ </div>
+ {{ endif }}
+ </div>
+ <div id="contact-edit-end" ></div>
+
+$insecure
+$blocked
+$ignored
+
+<div id="view-recent-wrapper"><a href="network/?cid=$contact_id" id="contact-view-recent">$lblrecent</a></div>
+$lblsuggest
+
+<div id="contact-edit-info-wrapper">
+<h4>$lbl_info1</h4>
+<textarea id="contact-edit-info" rows="10" cols="72" name="info" >$info</textarea>
+</div>
+<div id="contact-edit-info-end"></div>
+
+<input class="contact-edit-submit" type="submit" name="submit" value="$submit" />
+
+<div id="contact-edit-profile-select-text">
+<h4>$lbl_vis1</h4>
+<p>$lbl_vis2
+</p>
+</div>
+$profile_select
+<div id="contact-edit-profile-select-end"></div>
+
+<input class="contact-edit-submit" type="submit" name="submit" value="$submit" />
+
+</form>
+</div>
diff --git a/view/theme/testbubble/group_drop.tpl b/view/theme/testbubble/group_drop.tpl
new file mode 100644
index 000000000..f088fc06f
--- /dev/null
+++ b/view/theme/testbubble/group_drop.tpl
@@ -0,0 +1,8 @@
+<div class="group-delete-wrapper" id="group-delete-wrapper-$id" >
+ <a href="group/drop/$id"
+ onclick="return confirmDelete();"
+ title="$delete"
+ id="group-delete-icon-$id"
+ class="drophide group-delete-icon" onmouseover="imgbright(this);" onmouseout="imgdull(this);" >Delete Group</a>
+</div>
+<div class="group-delete-end"></div>
diff --git a/view/theme/testbubble/group_edit.tpl b/view/theme/testbubble/group_edit.tpl
new file mode 100644
index 000000000..b867568f3
--- /dev/null
+++ b/view/theme/testbubble/group_edit.tpl
@@ -0,0 +1,19 @@
+<h2>$title</h2>
+
+
+<div id="group-edit-wrapper" >
+ <form action="group/$gid" id="group-edit-form" method="post" >
+ <div id="group-edit-name-wrapper" >
+ <label id="group-edit-name-label" for="group-edit-name" >$gname</label>
+ <input type="text" id="group-edit-name" name="groupname" value="$name" />
+ <div id="group-edit-submit-wrapper" >
+ <input type="submit" name="submit" value="$submit" >
+ </div>
+ </div>
+ <div id="group-edit-name-end"></div>
+ $drop
+
+ <div id="group-edit-desc">$desc</div>
+ <div id="group-edit-select-end" ></div>
+ </form>
+</div>
diff --git a/view/theme/testbubble/groups.png b/view/theme/testbubble/groups.png
new file mode 100644
index 000000000..a65a7218c
--- /dev/null
+++ b/view/theme/testbubble/groups.png
Binary files differ
diff --git a/view/theme/testbubble/icons.png b/view/theme/testbubble/icons.png
new file mode 100644
index 000000000..57c4bfb05
--- /dev/null
+++ b/view/theme/testbubble/icons.png
Binary files differ
diff --git a/view/theme/testbubble/icons.svg b/view/theme/testbubble/icons.svg
new file mode 100644
index 000000000..b435ba665
--- /dev/null
+++ b/view/theme/testbubble/icons.svg
@@ -0,0 +1,1442 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="250"
+ height="200"
+ id="svg3403"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="icons.svg"
+ inkscape:export-filename="/home/fabio/public_html/friendika/view/theme/dispy/icons.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs3405">
+ <filter
+ color-interpolation-filters="sRGB"
+ inkscape:collect="always"
+ id="filter4064">
+ <feBlend
+ inkscape:collect="always"
+ mode="lighten"
+ in2="BackgroundImage"
+ id="feBlend4066" />
+ </filter>
+ <inkscape:path-effect
+ effect="gears"
+ id="path-effect4050"
+ is_visible="true"
+ teeth="10"
+ phi="10" />
+ <inkscape:path-effect
+ effect="gears"
+ id="path-effect3436"
+ is_visible="true"
+ teeth="10"
+ phi="10" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.9899495"
+ inkscape:cx="43.010429"
+ inkscape:cy="-67.661177"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:snap-global="false"
+ inkscape:window-width="1534"
+ inkscape:window-height="1067"
+ inkscape:window-x="104"
+ inkscape:window-y="63"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid4016"
+ empspacing="5"
+ visible="true"
+ enabled="false"
+ snapvisiblegridlinesonly="false"
+ spacingx="20px"
+ spacingy="20px"
+ dotted="false"
+ units="px"
+ originx="50px"
+ originy="200px" />
+ <inkscape:grid
+ type="xygrid"
+ id="grid4018"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="false"
+ color="#ff0000"
+ opacity="0.1254902"
+ empcolor="#ff0000"
+ empopacity="0.25098039"
+ originy="200px"
+ spacingx="22px"
+ spacingy="22px" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3408">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Livello 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-852.36218)">
+ <rect
+ style="fill:#2e3436;fill-opacity:1;stroke:none;display:inline"
+ id="rect4007"
+ width="44"
+ height="132"
+ x="1.5883562e-17"
+ y="852.36218"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <g
+ id="ico_dir"
+ transform="matrix(0.43114968,0,0,0.43114968,-178.47604,867.63556)"
+ style="stroke:#888a85;display:inline"
+ inkscape:label="#g3846">
+ <rect
+ ry="6"
+ rx="6"
+ y="18.790752"
+ x="417.14285"
+ height="44.285713"
+ width="44.285713"
+ id="rect3820"
+ style="fill:none;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#2e3436;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 449.12191,27.281249 c -2.07646,0 -3.76352,1.688406 -3.76352,3.766518 0,2.078113 1.68706,3.766518 3.76352,3.766518 2.07646,0 3.76351,-1.688405 3.76351,-3.766518 0,-2.078112 -1.68705,-3.766518 -3.76351,-3.766518 z m 0,7.533036 c -5.23267,0 -9.47459,5.783883 -9.47459,12.932589 0,0.201529 0.0196,0.406525 0.0264,0.605804 l 18.89654,0 c 0.007,-0.199279 0.0264,-0.404275 0.0264,-0.605804 0,-7.148706 -4.24192,-12.932589 -9.47459,-12.932589 z"
+ id="path3830" />
+ <path
+ id="path3832"
+ d="m 431.26477,26.924106 c -2.07646,0 -3.76352,1.688406 -3.76352,3.766518 0,2.078113 1.68706,3.766518 3.76352,3.766518 2.07646,0 3.76351,-1.688405 3.76351,-3.766518 0,-2.078112 -1.68705,-3.766518 -3.76351,-3.766518 z m 0,7.533036 c -5.23267,0 -9.47459,5.783883 -9.47459,12.932589 0,0.201529 0.0196,0.406525 0.0264,0.605804 l 18.89654,0 c 0.007,-0.199279 0.0264,-0.404275 0.0264,-0.605804 0,-7.148706 -4.24192,-12.932589 -9.47459,-12.932589 z"
+ style="fill:#2e3436;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3822"
+ d="M 439.46875,29.78125 C 437.00319,29.78125 435,31.784443 435,34.25 c 0,2.465557 2.00319,4.46875 4.46875,4.46875 2.46556,0 4.46875,-2.003193 4.46875,-4.46875 0,-2.465557 -2.00319,-4.46875 -4.46875,-4.46875 z m 0,8.9375 c -6.2132,0 -11.25,6.862234 -11.25,15.34375 0,0.239102 0.0233,0.482318 0.0313,0.71875 l 22.4375,0 c 0.008,-0.236432 0.0313,-0.479648 0.0313,-0.71875 0,-8.481516 -5.0368,-15.34375 -11.25,-15.34375 z"
+ style="fill:#2e3436;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ <g
+ id="ico_search"
+ transform="matrix(0.43114968,0,0,0.43114968,-201.41936,889.63556)"
+ style="stroke:#888a85;display:inline"
+ inkscape:label="#g3852">
+ <rect
+ style="fill:none;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3837"
+ width="44.285713"
+ height="44.285713"
+ x="470.35715"
+ y="18.790752"
+ rx="6"
+ ry="6" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3839"
+ d="m 477.97758,26.469174 c -3.64342,3.88426 -3.47037,9.984211 0.41389,13.627637 3.52011,3.301856 8.87059,3.441123 12.55302,0.54905 -0.17428,0.682501 0.0188,1.431563 0.57086,1.949383 l 13.7666,12.913032 c 0.80813,0.75802 2.06896,0.717682 2.82698,-0.09044 l 0.68414,-0.729357 c 0.75802,-0.808126 0.71768,-2.06896 -0.0904,-2.82698 l -13.7666,-12.913032 c -0.55205,-0.51782 -1.31192,-0.66264 -1.98188,-0.445086 2.65077,-3.859767 2.16978,-9.190402 -1.35033,-12.492258 -3.88426,-3.643426 -9.9828,-3.426204 -13.62623,0.458055 z"
+ style="fill:#2e3436;fill-opacity:1;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ transform="translate(-0.21428562,-0.35714286)"
+ d="m 492.49999,33.612183 c 0,4.043513 -3.27792,7.321428 -7.32143,7.321428 -4.04352,0 -7.32143,-3.277915 -7.32143,-7.321428 0,-4.043514 3.27791,-7.321429 7.32143,-7.321429 4.04351,0 7.32143,3.277915 7.32143,7.321429 z"
+ sodipodi:ry="7.3214288"
+ sodipodi:rx="7.3214288"
+ sodipodi:cy="33.612183"
+ sodipodi:cx="485.17856"
+ id="path3844"
+ style="fill:#2e3436;fill-opacity:1;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ inkscape:label="#g3852"
+ style="stroke:#888a85;display:inline"
+ transform="matrix(0.43114968,0,0,0.43114968,-201.41936,845.63556)"
+ id="ico_logout">
+ <rect
+ ry="6"
+ rx="6"
+ y="18.790752"
+ x="470.35715"
+ height="44.285713"
+ width="44.285713"
+ id="rect3995"
+ style="fill:none;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:#555753;fill-opacity:1;stroke:#888a85;stroke-width:2.31938004"
+ d="M 504.69787,28.735741 480.30214,53.131477"
+ id="path4003"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4005"
+ d="M 504.69787,53.131473 480.30214,28.735746"
+ style="fill:#555753;fill-opacity:1;stroke:#888a85;stroke-width:2.31938004" />
+ </g>
+ <g
+ inkscape:label="#g3846"
+ style="stroke:#d3d7cf;display:inline"
+ transform="matrix(0.43114968,0,0,0.43114968,-156.47604,867.63556)"
+ id="ico_dir_on">
+ <rect
+ style="fill:none;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect4011"
+ width="44.285713"
+ height="44.285713"
+ x="417.14285"
+ y="18.790752"
+ rx="6"
+ ry="6" />
+ <path
+ id="path4013"
+ d="m 449.12191,27.281249 c -2.07646,0 -3.76352,1.688406 -3.76352,3.766518 0,2.078113 1.68706,3.766518 3.76352,3.766518 2.07646,0 3.76351,-1.688405 3.76351,-3.766518 0,-2.078112 -1.68705,-3.766518 -3.76351,-3.766518 z m 0,7.533036 c -5.23267,0 -9.47459,5.783883 -9.47459,12.932589 0,0.201529 0.0196,0.406525 0.0264,0.605804 l 18.89654,0 c 0.007,-0.199279 0.0264,-0.404275 0.0264,-0.605804 0,-7.148706 -4.24192,-12.932589 -9.47459,-12.932589 z"
+ style="fill:#2e3436;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#2e3436;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 431.26477,26.924106 c -2.07646,0 -3.76352,1.688406 -3.76352,3.766518 0,2.078113 1.68706,3.766518 3.76352,3.766518 2.07646,0 3.76351,-1.688405 3.76351,-3.766518 0,-2.078112 -1.68705,-3.766518 -3.76351,-3.766518 z m 0,7.533036 c -5.23267,0 -9.47459,5.783883 -9.47459,12.932589 0,0.201529 0.0196,0.406525 0.0264,0.605804 l 18.89654,0 c 0.007,-0.199279 0.0264,-0.404275 0.0264,-0.605804 0,-7.148706 -4.24192,-12.932589 -9.47459,-12.932589 z"
+ id="path4015" />
+ <path
+ style="fill:#2e3436;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="M 439.46875,29.78125 C 437.00319,29.78125 435,31.784443 435,34.25 c 0,2.465557 2.00319,4.46875 4.46875,4.46875 2.46556,0 4.46875,-2.003193 4.46875,-4.46875 0,-2.465557 -2.00319,-4.46875 -4.46875,-4.46875 z m 0,8.9375 c -6.2132,0 -11.25,6.862234 -11.25,15.34375 0,0.239102 0.0233,0.482318 0.0313,0.71875 l 22.4375,0 c 0.008,-0.236432 0.0313,-0.479648 0.0313,-0.71875 0,-8.481516 -5.0368,-15.34375 -11.25,-15.34375 z"
+ id="path4017"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ inkscape:label="#g3852"
+ style="stroke:#d3d7cf;display:inline"
+ transform="matrix(0.43114968,0,0,0.43114968,-179.41936,889.63556)"
+ id="ico_search_on">
+ <rect
+ ry="6"
+ rx="6"
+ y="18.790752"
+ x="470.35715"
+ height="44.285713"
+ width="44.285713"
+ id="rect4021"
+ style="fill:none;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:#2e3436;fill-opacity:1;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 477.97758,26.469174 c -3.64342,3.88426 -3.47037,9.984211 0.41389,13.627637 3.52011,3.301856 8.87059,3.441123 12.55302,0.54905 -0.17428,0.682501 0.0188,1.431563 0.57086,1.949383 l 13.7666,12.913032 c 0.80813,0.75802 2.06896,0.717682 2.82698,-0.09044 l 0.68414,-0.729357 c 0.75802,-0.808126 0.71768,-2.06896 -0.0904,-2.82698 l -13.7666,-12.913032 c -0.55205,-0.51782 -1.31192,-0.66264 -1.98188,-0.445086 2.65077,-3.859767 2.16978,-9.190402 -1.35033,-12.492258 -3.88426,-3.643426 -9.9828,-3.426204 -13.62623,0.458055 z"
+ id="path4023"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#2e3436;fill-opacity:1;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4025"
+ sodipodi:cx="485.17856"
+ sodipodi:cy="33.612183"
+ sodipodi:rx="7.3214288"
+ sodipodi:ry="7.3214288"
+ d="m 492.49999,33.612183 c 0,4.043513 -3.27792,7.321428 -7.32143,7.321428 -4.04352,0 -7.32143,-3.277915 -7.32143,-7.321428 0,-4.043514 3.27791,-7.321429 7.32143,-7.321429 4.04351,0 7.32143,3.277915 7.32143,7.321429 z"
+ transform="translate(-0.21428562,-0.35714286)" />
+ </g>
+ <g
+ id="ico_logout_on"
+ transform="matrix(0.43114968,0,0,0.43114968,-179.41936,845.63556)"
+ style="stroke:#d3d7cf;display:inline"
+ inkscape:label="#g3852">
+ <rect
+ style="fill:none;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect4029"
+ width="44.285713"
+ height="44.285713"
+ x="470.35715"
+ y="18.790752"
+ rx="6"
+ ry="6" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4031"
+ d="M 504.69787,28.735741 480.30214,53.131477"
+ style="fill:#555753;fill-opacity:1;stroke:#d3d7cf;stroke-width:2.31938004" />
+ <path
+ style="fill:#555753;fill-opacity:1;stroke:#d3d7cf;stroke-width:2.31938004"
+ d="M 504.69787,53.131473 480.30214,28.735746"
+ id="path4033"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ inkscape:label="#g3852"
+ style="stroke:#888a85;display:inline;filter:url(#filter4064)"
+ transform="matrix(0.43114968,0,0,0.43114968,-201.41936,911.63556)"
+ id="g4040">
+ <rect
+ ry="6"
+ rx="6"
+ y="18.790752"
+ x="470.35715"
+ height="44.285713"
+ width="44.285713"
+ id="rect4042"
+ style="fill:none;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:#2e3436;fill-opacity:1;stroke:#888a85;stroke-width:1.66475451;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ d="m 484.90604,52.679071 c 0,0 -0.72327,1.028211 -2.88202,1.697409 -0.63474,-0.494653 -1.23439,-1.034334 -1.79294,-1.613646 0.43889,-2.217071 1.3855,-3.044283 1.3855,-3.044283 l 2.04237,-1.648571 c -0.73879,-0.915258 -1.3342,-1.946011 -1.75793,-3.043257 l -2.44847,0.945549 c 0,0 -1.18951,0.40671 -3.32932,-0.320779 -0.22277,-0.773276 -0.39067,-1.56235 -0.50204,-2.359331 1.65823,-1.535673 2.91028,-1.648499 2.91028,-1.648499 l 2.62132,-0.133248 c -0.0597,-1.174706 0.0645,-2.358577 0.36658,-3.495332 l -2.53663,-0.674208 c 0,0 -1.20139,-0.37014 -2.50493,-2.216441 0.2743,-0.756533 0.60227,-1.4936 0.98062,-2.20383 2.24419,-0.267701 3.32343,0.376954 3.32343,0.376954 l 2.19901,1.432971 c 0.64217,-0.985455 1.43848,-1.870246 2.35108,-2.612309 l -1.65589,-2.03644 c 0,0 -0.75438,-1.005609 -0.72373,-3.265497 0.66659,-0.45082 1.36515,-0.854347 2.08871,-1.206542 1.97294,1.102524 2.46715,2.258424 2.46715,2.258424 l 0.93675,2.451844 c 1.09876,-0.419794 2.26306,-0.667544 3.43754,-0.731472 l -0.14265,-2.620822 c 0,0 -0.0192,-1.25697 1.3339,-3.067245 0.80426,0.02709 1.6066,0.111239 2.39899,0.251604 0.94809,2.051624 0.66849,3.277254 0.66849,3.277254 l -0.6833,2.534196 c 1.13566,0.306213 2.22322,0.790136 3.21097,1.428761 l 1.42508,-2.204138 c 0,0 0.72327,-1.028211 2.88202,-1.697409 0.63474,0.494653 1.23439,1.034334 1.79294,1.613646 -0.43889,2.217071 -1.3855,3.044283 -1.3855,3.044283 l -2.04237,1.648571 c 0.73879,0.915258 1.3342,1.946011 1.75793,3.043257 l 2.44847,-0.945549 c 0,0 1.18951,-0.40671 3.32932,0.320779 0.22277,0.773276 0.39067,1.56235 0.50204,2.359331 -1.65823,1.535673 -2.91028,1.648499 -2.91028,1.648499 l -2.62132,0.133248 c 0.0597,1.174706 -0.0645,2.358577 -0.36658,3.495332 l 2.53663,0.674208 c 0,0 1.20139,0.37014 2.50493,2.216441 -0.2743,0.756533 -0.60227,1.4936 -0.98062,2.20383 -2.24419,0.267701 -3.32343,-0.376954 -3.32343,-0.376954 l -2.19901,-1.432971 c -0.64217,0.985455 -1.43848,1.870246 -2.35108,2.612309 l 1.65589,2.03644 c 0,0 0.75438,1.005609 0.72373,3.265497 -0.66659,0.45082 -1.36515,0.854347 -2.08871,1.206542 -1.97294,-1.102524 -2.46715,-2.258424 -2.46715,-2.258424 l -0.93675,-2.451844 c -1.09876,0.419794 -2.26306,0.667544 -3.43754,0.731472 l 0.14265,2.620822 c 0,0 0.0192,1.25697 -1.3339,3.067245 -0.80426,-0.02709 -1.6066,-0.111239 -2.39899,-0.251604 -0.94809,-2.051624 -0.66849,-3.277254 -0.66849,-3.277254 l 0.6833,-2.534196 c -1.13566,-0.306213 -2.22322,-0.790136 -3.21097,-1.428761 l -1.42508,2.204138"
+ id="path4048"
+ inkscape:connector-curvature="0"
+ inkscape:path-effect="#path-effect4050"
+ inkscape:original-d="M 484.55417,49.762303 492.5,40.933609 504.27158,48.879434" />
+ </g>
+ <g
+ id="g4068"
+ transform="matrix(0.43114968,0,0,0.43114968,-179.41936,911.63556)"
+ style="stroke:#d3d7cf;display:inline;filter:url(#filter4064)"
+ inkscape:label="#g3852">
+ <rect
+ style="fill:none;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect4070"
+ width="44.285713"
+ height="44.285713"
+ x="470.35715"
+ y="18.790752"
+ rx="6"
+ ry="6" />
+ <path
+ inkscape:original-d="M 484.55417,49.762303 492.5,40.933609 504.27158,48.879434"
+ inkscape:path-effect="#path-effect4050"
+ inkscape:connector-curvature="0"
+ id="path4072"
+ d="m 484.90604,52.679071 c 0,0 -0.72327,1.028211 -2.88202,1.697409 -0.63474,-0.494653 -1.23439,-1.034334 -1.79294,-1.613646 0.43889,-2.217071 1.3855,-3.044283 1.3855,-3.044283 l 2.04237,-1.648571 c -0.73879,-0.915258 -1.3342,-1.946011 -1.75793,-3.043257 l -2.44847,0.945549 c 0,0 -1.18951,0.40671 -3.32932,-0.320779 -0.22277,-0.773276 -0.39067,-1.56235 -0.50204,-2.359331 1.65823,-1.535673 2.91028,-1.648499 2.91028,-1.648499 l 2.62132,-0.133248 c -0.0597,-1.174706 0.0645,-2.358577 0.36658,-3.495332 l -2.53663,-0.674208 c 0,0 -1.20139,-0.37014 -2.50493,-2.216441 0.2743,-0.756533 0.60227,-1.4936 0.98062,-2.20383 2.24419,-0.267701 3.32343,0.376954 3.32343,0.376954 l 2.19901,1.432971 c 0.64217,-0.985455 1.43848,-1.870246 2.35108,-2.612309 l -1.65589,-2.03644 c 0,0 -0.75438,-1.005609 -0.72373,-3.265497 0.66659,-0.45082 1.36515,-0.854347 2.08871,-1.206542 1.97294,1.102524 2.46715,2.258424 2.46715,2.258424 l 0.93675,2.451844 c 1.09876,-0.419794 2.26306,-0.667544 3.43754,-0.731472 l -0.14265,-2.620822 c 0,0 -0.0192,-1.25697 1.3339,-3.067245 0.80426,0.02709 1.6066,0.111239 2.39899,0.251604 0.94809,2.051624 0.66849,3.277254 0.66849,3.277254 l -0.6833,2.534196 c 1.13566,0.306213 2.22322,0.790136 3.21097,1.428761 l 1.42508,-2.204138 c 0,0 0.72327,-1.028211 2.88202,-1.697409 0.63474,0.494653 1.23439,1.034334 1.79294,1.613646 -0.43889,2.217071 -1.3855,3.044283 -1.3855,3.044283 l -2.04237,1.648571 c 0.73879,0.915258 1.3342,1.946011 1.75793,3.043257 l 2.44847,-0.945549 c 0,0 1.18951,-0.40671 3.32932,0.320779 0.22277,0.773276 0.39067,1.56235 0.50204,2.359331 -1.65823,1.535673 -2.91028,1.648499 -2.91028,1.648499 l -2.62132,0.133248 c 0.0597,1.174706 -0.0645,2.358577 -0.36658,3.495332 l 2.53663,0.674208 c 0,0 1.20139,0.37014 2.50493,2.216441 -0.2743,0.756533 -0.60227,1.4936 -0.98062,2.20383 -2.24419,0.267701 -3.32343,-0.376954 -3.32343,-0.376954 l -2.19901,-1.432971 c -0.64217,0.985455 -1.43848,1.870246 -2.35108,2.612309 l 1.65589,2.03644 c 0,0 0.75438,1.005609 0.72373,3.265497 -0.66659,0.45082 -1.36515,0.854347 -2.08871,1.206542 -1.97294,-1.102524 -2.46715,-2.258424 -2.46715,-2.258424 l -0.93675,-2.451844 c -1.09876,0.419794 -2.26306,0.667544 -3.43754,0.731472 l 0.14265,2.620822 c 0,0 0.0192,1.25697 -1.3339,3.067245 -0.80426,-0.02709 -1.6066,-0.111239 -2.39899,-0.251604 -0.94809,-2.051624 -0.66849,-3.277254 -0.66849,-3.277254 l 0.6833,-2.534196 c -1.13566,-0.306213 -2.22322,-0.790136 -3.21097,-1.428761 l -1.42508,2.204138"
+ style="fill:#2e3436;fill-opacity:1;stroke:#d3d7cf;stroke-width:1.66475451;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ </g>
+ <g
+ id="g4074"
+ transform="matrix(0.43114968,0,0,0.43114968,-201.41936,933.6356)"
+ style="stroke:#888a85;display:inline;filter:url(#filter4064)"
+ inkscape:label="#g3852">
+ <rect
+ style="fill:none;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect4076"
+ width="44.285713"
+ height="44.285713"
+ x="470.35715"
+ y="18.790752"
+ rx="6"
+ ry="6" />
+ <path
+ style="fill:#2e3436;fill-opacity:1;stroke:#888a85;stroke-width:0.79446769;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ d="m 871.875,46.1875 c -1.86715,0.0095 -3.39179,1.39545 -3.65625,3.1875 -0.13267,-0.238038 -0.39472,-0.407705 -0.6875,-0.40625 L 860.21875,49 c -0.42864,0.0022 -0.75216,0.352585 -0.75,0.78125 l 0,0.375 c 0.002,0.428643 0.35273,0.783324 0.78125,0.78125 l 0.71875,0 c -0.017,0.04029 -0.0313,0.109644 -0.0313,0.15625 l 0,1.90625 c 0,0.186425 0.15733,0.34375 0.34375,0.34375 l 0.9375,0 c 0.18642,0 0.34375,-0.157325 0.34375,-0.34375 l 0,-1.90625 c 0,-0.04661 -0.0143,-0.115964 -0.0313,-0.15625 l 1.25,0 c -0.017,0.04029 -0.0313,0.109644 -0.0313,0.15625 l 0,1.90625 c 0,0.186425 0.15733,0.34375 0.34375,0.34375 l 0.9375,0 c 0.18642,0 0.34375,-0.157325 0.34375,-0.34375 l 0,-1.90625 c 0,-0.05736 -0.006,-0.140333 -0.0313,-0.1875 l 2.1875,0 c 0.29284,-0.0015 0.55725,-0.166865 0.6875,-0.40625 0.28274,1.789274 1.85161,3.165775 3.71875,3.15625 2.0603,-0.01052 3.69802,-1.720959 3.6875,-3.78125 -0.0105,-2.060291 -1.68969,-3.698024 -3.75,-3.6875 z"
+ transform="matrix(2.3193801,0,0,2.3193801,-1519.671,-74.824492)"
+ id="path3839-4"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ inkscape:label="#g3852"
+ style="stroke:#d3d7cf;display:inline;filter:url(#filter4064)"
+ transform="matrix(0.43114968,0,0,0.43114968,-179.41936,933.6356)"
+ id="g4106">
+ <rect
+ ry="6"
+ rx="6"
+ y="18.790752"
+ x="470.35715"
+ height="44.285713"
+ width="44.285713"
+ id="rect4108"
+ style="fill:none;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ id="path4110"
+ transform="matrix(2.3193801,0,0,2.3193801,-1519.671,-74.824492)"
+ d="m 871.875,46.1875 c -1.86715,0.0095 -3.39179,1.39545 -3.65625,3.1875 -0.13267,-0.238038 -0.39472,-0.407705 -0.6875,-0.40625 L 860.21875,49 c -0.42864,0.0022 -0.75216,0.352585 -0.75,0.78125 l 0,0.375 c 0.002,0.428643 0.35273,0.783324 0.78125,0.78125 l 0.71875,0 c -0.017,0.04029 -0.0313,0.109644 -0.0313,0.15625 l 0,1.90625 c 0,0.186425 0.15733,0.34375 0.34375,0.34375 l 0.9375,0 c 0.18642,0 0.34375,-0.157325 0.34375,-0.34375 l 0,-1.90625 c 0,-0.04661 -0.0143,-0.115964 -0.0313,-0.15625 l 1.25,0 c -0.017,0.04029 -0.0313,0.109644 -0.0313,0.15625 l 0,1.90625 c 0,0.186425 0.15733,0.34375 0.34375,0.34375 l 0.9375,0 c 0.18642,0 0.34375,-0.157325 0.34375,-0.34375 l 0,-1.90625 c 0,-0.05736 -0.006,-0.140333 -0.0313,-0.1875 l 2.1875,0 c 0.29284,-0.0015 0.55725,-0.166865 0.6875,-0.40625 0.28274,1.789274 1.85161,3.165775 3.71875,3.15625 2.0603,-0.01052 3.69802,-1.720959 3.6875,-3.78125 -0.0105,-2.060291 -1.68969,-3.698024 -3.75,-3.6875 z"
+ style="fill:#2e3436;fill-opacity:1;stroke:#d3d7cf;stroke-width:0.79446769;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g4031-9"
+ transform="matrix(0.45818575,0.68148541,-0.68148541,0.45818575,-2.7897502,485.71067)"
+ style="display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <path
+ sodipodi:type="arc"
+ style="fill:#555753;fill-opacity:1;stroke:none"
+ id="path4002-3"
+ sodipodi:cx="559.67499"
+ sodipodi:cy="21.754047"
+ sodipodi:rx="0.88388348"
+ sodipodi:ry="0.88388348"
+ d="m 560.55887,21.754047 c 0,0.488156 -0.39573,0.883884 -0.88388,0.883884 -0.48816,0 -0.88389,-0.395728 -0.88389,-0.883884 0,-0.488155 0.39573,-0.883883 0.88389,-0.883883 0.48815,0 0.88388,0.395728 0.88388,0.883883 z"
+ transform="matrix(2.8,0,0,2.8,-999.63682,-35.444974)" />
+ <path
+ transform="matrix(2.1,0,0,2.1,-600.17454,-24.194616)"
+ d="m 560.55887,21.754047 c 0,0.488156 -0.39573,0.883884 -0.88388,0.883884 -0.48816,0 -0.88389,-0.395728 -0.88389,-0.883884 0,-0.488155 0.39573,-0.883883 0.88389,-0.883883 0.48815,0 0.88388,0.395728 0.88388,0.883883 z"
+ sodipodi:ry="0.88388348"
+ sodipodi:rx="0.88388348"
+ sodipodi:cy="21.754047"
+ sodipodi:cx="559.67499"
+ id="path4004-9"
+ style="fill:#555753;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#555753;fill-opacity:1;stroke:none"
+ id="path4006-4"
+ sodipodi:cx="559.67499"
+ sodipodi:cy="21.754047"
+ sodipodi:rx="0.88388348"
+ sodipodi:ry="0.88388348"
+ d="m 560.55887,21.754047 c 0,0.488156 -0.39573,0.883884 -0.88388,0.883884 -0.48816,0 -0.88389,-0.395728 -0.88389,-0.883884 0,-0.488155 0.39573,-0.883883 0.88389,-0.883883 0.48815,0 0.88388,0.395728 0.88388,0.883883 z"
+ transform="matrix(2.2,0,0,2.2,-671.07968,-28.226177)" />
+ <path
+ style="fill:none;stroke:#555753;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 563.21055,31.653543 4.41942,-6.187185 -7.6014,-6.187184"
+ id="path4010-56"
+ inkscape:connector-curvature="0" />
+ <path
+ transform="matrix(2.4,0,0,2.4,-780.18625,-20.379394)"
+ d="m 560.55887,21.754047 c 0,0.488156 -0.39573,0.883884 -0.88388,0.883884 -0.48816,0 -0.88389,-0.395728 -0.88389,-0.883884 0,-0.488155 0.39573,-0.883883 0.88389,-0.883883 0.48815,0 0.88388,0.395728 0.88388,0.883883 z"
+ sodipodi:ry="0.88388348"
+ sodipodi:rx="0.88388348"
+ sodipodi:cy="21.754047"
+ sodipodi:cx="559.67499"
+ id="path4008-8"
+ style="fill:#555753;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ style="fill:none;stroke:#555753;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 567.45319,25.466358 7.6014,-4.065864"
+ id="path4012-5"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ style="fill:none;stroke:#555753;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ d="m 218.00001,881.25007 -5.8125,0 0,9.1875 10.53125,0 0,-5.2187"
+ id="rect4432"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="rect4387-8"
+ width="14.5"
+ height="9"
+ x="173.12502"
+ y="858.11218"
+ rx="2.9268293"
+ ry="2.9268293"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ sodipodi:type="arc"
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="path4391-3"
+ sodipodi:cx="408.8125"
+ sodipodi:cy="220.26843"
+ sodipodi:rx="2.6875"
+ sodipodi:ry="2.71875"
+ d="m 411.5,220.26843 a 2.6875,2.71875 0 1 1 -5.375,0 2.6875,2.71875 0 1 1 5.375,0 z"
+ transform="matrix(1.1489362,0,0,1.1489362,-286.13697,609.51131)"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:#555753;stroke-width:0.47366244;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ d="m 242.44524,860.13287 c -0.98011,0 -1.77562,0.6006 -1.77562,1.3586 l 0,1.5632 c 0,0.7581 0.79551,1.3733 1.77562,1.3733 l 4.53349,0 c 0.98012,0 1.77562,-0.6152 1.77562,-1.3733 l 0,-1.5632 c 0,-0.758 -0.7955,-1.3586 -1.77562,-1.3586 l -4.53349,0 z m 0.41557,1.0372 3.70235,0 c 0.51967,0 0.94448,0.2879 0.94448,0.6574 l 0,0.8912 c 0,0.3695 -0.42481,0.672 -0.94448,0.672 l -3.70235,0 c -0.51966,0 -0.94447,-0.3025 -0.94447,-0.672 l 0,-0.8912 c 0,-0.3695 0.42481,-0.6574 0.94447,-0.6574 z"
+ id="rect4397-0"
+ inkscape:connector-curvature="0"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4418-4"
+ d="m 232.97199,860.13287 c -0.98011,0 -1.77562,0.6006 -1.77562,1.3586 l 0,1.5632 c 0,0.7581 0.79551,1.3733 1.77562,1.3733 l 4.53349,0 c 0.98012,0 1.77562,-0.6152 1.77562,-1.3733 l 0,-1.5632 c 0,-0.758 -0.7955,-1.3586 -1.77562,-1.3586 l -4.53349,0 z m 0.41557,1.0372 3.70236,0 c 0.51966,0 0.94447,0.2879 0.94447,0.6574 l 0,0.8912 c 0,0.3695 -0.42481,0.672 -0.94447,0.672 l -3.70236,0 c -0.51966,0 -0.94447,-0.3025 -0.94447,-0.672 l 0,-0.8912 c 0,-0.3695 0.42481,-0.6574 0.94447,-0.6574 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#555753;stroke-width:0.47366244;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:#555753;stroke-width:0.47366244;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="rect4395-0"
+ width="6.7246785"
+ height="1.6362466"
+ x="236.7028"
+ y="861.57312"
+ rx="1.0135853"
+ ry="0.81812328"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:#555753;fill-opacity:1;stroke:none;display:inline"
+ id="rect4416-1"
+ width="14.495689"
+ height="6.5407376"
+ x="132.5179"
+ y="901.32971"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ xml:space="preserve"
+ style="font-size:5.54432058px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+ x="139.36653"
+ y="900.60059"
+ id="text4406-9"
+ sodipodi:linespacing="100%"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ sodipodi:role="line"
+ id="tspan4408-6"
+ x="139.36653"
+ y="900.60059">You</tspan><tspan
+ sodipodi:role="line"
+ x="139.36653"
+ y="906.1449"
+ id="tspan4410-2"
+ style="fill:#eeeeec">Tube</tspan></text>
+ <path
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ d="m 118.03127,895.15627 0,0.3125 c 0,1.2601 -0.0643,3.4345 -0.35937,5.75 l -1.5625,1e-4 c -0.80183,0.011 -1.64766,4.0737 -1.60938,8.0625 l 8.25,0 c -0.057,-5.5479 1.56902,-11.5211 1.75,-5.6563 0.21453,6.9525 1.74237,-5.1823 1.75,-8.4687 z"
+ id="rect4428-4"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccscc"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ d="m 124.78127,905.73727 -1.9375,-0.063"
+ id="path4440-4"
+ inkscape:connector-curvature="0"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ d="m 117.59377,901.20597 6.4375,0"
+ id="path4442-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="rect4446-9"
+ width="1.0625"
+ height="0.375"
+ x="115.28126"
+ y="908.11218"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="906.51843"
+ x="115.34376"
+ height="0.375"
+ width="1.0625"
+ id="rect4448-3"
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="rect4450-6"
+ width="1.0625"
+ height="0.375"
+ x="115.50001"
+ y="904.89343"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="903.42468"
+ x="115.81251"
+ height="0.375"
+ width="1.0625"
+ id="rect4452-0"
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="rect4454-5"
+ width="1.0625"
+ height="0.375"
+ x="116.21876"
+ y="902.17468"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="900.17468"
+ x="118.50001"
+ height="0.375"
+ width="1.0625"
+ id="rect4456-0"
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="rect4458-2"
+ width="1.0625"
+ height="0.375"
+ x="118.68751"
+ y="898.70593"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="897.20593"
+ x="118.75001"
+ height="0.375"
+ width="1.0625"
+ id="rect4460-9"
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="rect4462-4"
+ width="1.0625"
+ height="0.375"
+ x="118.75001"
+ y="895.79968"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="908.11218"
+ x="120.84376"
+ height="0.375"
+ width="1.0625"
+ id="rect4464-3"
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="rect4466-5"
+ width="1.0625"
+ height="0.375"
+ x="120.90627"
+ y="906.51843"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="904.89343"
+ x="121.06252"
+ height="0.375"
+ width="1.0625"
+ id="rect4468-1"
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="rect4470-7"
+ width="1.0625"
+ height="0.375"
+ x="121.37502"
+ y="903.42468"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="902.17468"
+ x="121.78127"
+ height="0.375"
+ width="1.0625"
+ id="rect4472-4"
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="rect4474-3"
+ width="1.0625"
+ height="0.375"
+ x="124.06252"
+ y="900.17468"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="898.70593"
+ x="124.25002"
+ height="0.375"
+ width="1.0625"
+ id="rect4476-1"
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="rect4478-4"
+ width="1.0625"
+ height="0.375"
+ x="124.31252"
+ y="897.20593"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="895.79968"
+ x="124.31252"
+ height="0.375"
+ width="1.0625"
+ id="rect4480-6"
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <g
+ style="display:inline"
+ id="g4507-4"
+ transform="matrix(0.92823291,-0.48059851,0.48059851,0.92823291,-312.89954,806.76727)"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <path
+ sodipodi:nodetypes="csc"
+ inkscape:connector-curvature="0"
+ id="path4491-2"
+ d="m 310.75659,223.79453 c 0.76095,-0.8373 1.2453,-2.02269 1.2453,-3.35786 0,-1.33796 -0.48156,-2.54257 -1.2453,-3.38009"
+ style="fill:none;stroke:#555753;stroke-width:0.35579938;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:none;stroke:#555753;stroke-width:0.47089946;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 311.49266,224.75938 c 1.00712,-1.10816 1.64816,-2.67702 1.64816,-4.44411 0,-1.77079 -0.63735,-3.36509 -1.64816,-4.47354"
+ id="path4496-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csc" />
+ <path
+ sodipodi:nodetypes="csc"
+ inkscape:connector-curvature="0"
+ id="path4498-6"
+ d="m 312.78041,226.18348 c 1.3429,-1.47763 2.19766,-3.56956 2.19766,-5.9258 0,-2.36118 -0.84984,-4.48703 -2.19766,-5.96505"
+ style="fill:none;stroke:#555753;stroke-width:0.62789989;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ id="path4500-4"
+ d="m 309.34375,224.125 0,-7.375 -3.78125,2.07812 -3.4375,-0.10937 0,3.46875 3.4375,-0.125 z"
+ style="fill:none;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ <path
+ sodipodi:type="arc"
+ style="fill:none;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="path4515-2"
+ sodipodi:cx="284.78726"
+ sodipodi:cy="220.62782"
+ sodipodi:rx="7.4246211"
+ sodipodi:ry="7.4246211"
+ d="m 292.21188,220.62782 a 7.4246211,7.4246211 0 1 1 -14.84924,0 7.4246211,7.4246211 0 1 1 14.84924,0 z"
+ transform="translate(-224.73743,661.76263)"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="fill:none;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 2;stroke-dashoffset:0;display:inline"
+ d="m 53.15626,883.15627 c 1.94168,0.712 4.31843,1.1563 6.90625,1.1563 2.58782,0 4.96457,-0.4443 6.90625,-1.1563"
+ id="path4517-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csc"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ sodipodi:nodetypes="csc"
+ inkscape:connector-curvature="0"
+ id="path4528-8"
+ d="m 60.45665,888.82867 c 0.71191,-1.9416 1.15625,-4.3184 1.15625,-6.9062 0,-2.5878 -0.44434,-4.9646 -1.15625,-6.9063"
+ style="fill:none;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 2;stroke-dashoffset:0;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ xml:space="preserve"
+ style="font-size:3.72799897px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#555753;fill-opacity:1;stroke:none;display:inline;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+ x="51.803352"
+ y="859.21899"
+ id="text4532-2"
+ sodipodi:linespacing="100%"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ sodipodi:role="line"
+ id="tspan4534-8"
+ x="51.803352"
+ y="859.21899"
+ style="font-weight:bold;fill:#555753;-inkscape-font-specification:Liberation Sans Bold">Lorem Ip</tspan></text>
+ <path
+ style="fill:#555753;fill-opacity:1;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 2;stroke-dashoffset:0;display:inline"
+ d="m 52.25001,862.61227 15.25,0"
+ id="path4536-8"
+ inkscape:connector-curvature="0"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4538-8"
+ d="m 52.25001,864.86227 15.25,0"
+ style="fill:#555753;fill-opacity:1;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 2;stroke-dashoffset:0;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="fill:#555753;fill-opacity:1;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 2;stroke-dashoffset:0;display:inline"
+ d="m 52.25001,867.11227 15.25,0"
+ id="path4540-6"
+ inkscape:connector-curvature="0"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="fill:none;stroke:#555753;stroke-width:0.82322329;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ d="m 242.49116,907.21887 5.125,-5.125 -5.125,-5.0937"
+ id="rect4544-3"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ sodipodi:nodetypes="ccc"
+ inkscape:connector-curvature="0"
+ id="path4549-8"
+ d="m 237.98183,907.21887 -5.125,-5.125 5.125,-5.0937"
+ style="fill:none;stroke:#555753;stroke-width:0.82322329;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <g
+ style="display:inline"
+ id="g4213"
+ transform="translate(49.48448,-140.79121)"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <path
+ sodipodi:type="star"
+ style="fill:#555753;fill-opacity:1;stroke:none"
+ id="path4802"
+ sodipodi:sides="8"
+ sodipodi:cx="98.48214"
+ sodipodi:cy="-10.267858"
+ sodipodi:r1="9.1071424"
+ sodipodi:r2="8.4139032"
+ sodipodi:arg1="-1.5707963"
+ sodipodi:arg2="-1.1780972"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 98.48214,-19.375 6.43972,2.66742 2.66742,6.439723 -2.66742,6.4397218 -6.439721,2.6674201 -6.439722,-2.6674204 -2.66742,-6.4397225 2.667421,-6.439722 z"
+ transform="matrix(0.92307692,0.3846154,-0.3846154,0.92307692,-44.340246,974.7537)" />
+ <path
+ transform="matrix(0.74691191,0.31121331,-0.31121331,0.74691191,-26.237457,980.1736)"
+ d="m 98.48214,-19.375 6.43972,2.66742 2.66742,6.439723 -2.66742,6.4397218 -6.439721,2.6674201 -6.439722,-2.6674204 -2.66742,-6.4397225 2.667421,-6.439722 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="-1.1780972"
+ sodipodi:arg1="-1.5707963"
+ sodipodi:r2="8.4139032"
+ sodipodi:r1="9.1071424"
+ sodipodi:cy="-10.267858"
+ sodipodi:cx="98.48214"
+ sodipodi:sides="8"
+ id="path4804"
+ style="fill:none;stroke:#d3d7cf;stroke-width:2.47171569;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:type="star" />
+ <path
+ style="fill:none;stroke:#555753;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ d="m 53.26552,1056.9525 -5.5,6.2008 5.5,6.2009"
+ id="rect4806"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ id="path4812"
+ d="m 67.781143,1069.3407 5.46875,-6.2009 -5.46875,-6.1736"
+ style="fill:none;stroke:#555753;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ </g>
+ <path
+ style="fill:#555753;fill-opacity:1;stroke:none;display:inline"
+ id="path4257"
+ d="m 115.39024,855.00555 c 0.0904,0.0266 0.18708,0.0371 0.27111,0.0797 0.24682,0.12501 0.80382,0.53514 1.00046,0.67918 0.72548,0.53142 1.43751,1.08068 2.14837,1.63134 1.22364,0.99003 2.36274,2.09287 3.41202,3.2665 0.43117,0.4822 1.01205,1.207 1.42675,1.7166 0.97898,1.2314 2.022,2.4234 2.86791,3.7533 0.20576,0.2994 0.39551,0.6797 0.65579,0.9028 -0.10862,-0.1107 -0.10877,-0.099 0.0344,-0.01 0.19118,0.1291 -1.63528,2.8328 -1.82646,2.7036 l 0,0 c -0.18814,-0.022 -0.0511,0 -0.37755,-0.1793 -0.55628,-0.365 -1.09599,-0.7525 -1.61517,-1.1691 -1.27322,-1.0021 -2.36476,-2.2048 -3.47982,-3.3749 -1.53016,-1.5621 -3.0115,-3.1717 -4.57958,-4.6966 -0.94249,-1.01074 -1.92636,-2.0326 -2.54392,-3.28422 -0.14292,-0.18424 2.46273,-2.20539 2.60565,-2.02115 z"
+ inkscape:connector-curvature="0"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="fill:#555753;fill-opacity:1;stroke:none;display:inline"
+ id="path4259"
+ d="m 112.109,867.43007 c 0.0548,-0.091 0.10266,-0.1866 0.16432,-0.2731 0.23235,-0.3261 0.52565,-0.6137 0.79275,-0.9102 0.42229,-0.4689 0.38553,-0.4337 0.82852,-0.9537 1.44214,-1.6363 3.06836,-3.0981 4.69856,-4.5425 1.63203,-1.40989 3.17698,-2.9167 4.78859,-4.3486 0.46305,-0.4369 0.97793,-0.80137 1.52221,-1.12653 0.15824,-0.21119 3.14491,2.0267 2.98666,2.23789 l 0,0 c -0.2952,0.52243 -0.62275,1.02042 -1.01852,1.47475 -0.88192,1.11919 -1.78212,2.22369 -2.79371,3.23049 -0.29346,0.2921 -0.60222,0.5684 -0.90606,0.8497 -0.31321,0.2899 -0.63003,0.5759 -0.94504,0.8639 -1.67153,1.4209 -3.37366,2.8163 -5.22715,3.9963 -0.49876,0.3405 -0.57121,0.3777 -1.0203,0.7266 -0.39341,0.3057 -0.75974,0.6889 -1.26518,0.7962 -0.14292,0.1842 -2.74857,-1.8369 -2.60565,-2.0212 z"
+ inkscape:connector-curvature="0"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 135.39024,855.00555 c 0.0904,0.027 0.18708,0.037 0.27111,0.08 0.24682,0.125 0.80382,0.5352 1.00046,0.6792 0.72548,0.5314 1.43751,1.0807 2.14837,1.6314 1.22364,0.99 2.36274,2.0928 3.41202,3.26652 0.43117,0.4822 1.01205,1.207 1.42675,1.7166 0.97898,1.2314 2.022,2.4234 2.86791,3.7533 0.20576,0.2994 0.39551,0.6797 0.65579,0.9028 -0.10862,-0.1107 -0.10877,-0.099 0.0344,-0.01 0.19118,0.1291 -1.63528,2.8328 -1.82646,2.7036 l 0,0 c -0.18814,-0.022 -0.0511,0 -0.37755,-0.1793 -0.55628,-0.365 -1.09599,-0.7525 -1.61517,-1.1691 -1.27322,-1.0021 -2.36476,-2.2048 -3.47982,-3.3749 -1.53016,-1.5621 -3.0115,-3.1717 -4.57958,-4.6966 -0.94249,-1.01082 -1.92636,-2.03262 -2.54392,-3.28432 -0.14292,-0.1842 2.46273,-2.2054 2.60565,-2.0211 z"
+ id="path4263"
+ style="fill:#d3d7cf;fill-opacity:1;stroke:none;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 132.109,867.43017 c 0.0548,-0.091 0.10266,-0.1866 0.16432,-0.2731 0.23235,-0.3261 0.52565,-0.6137 0.79275,-0.9102 0.42229,-0.4689 0.38553,-0.4337 0.82852,-0.9537 1.44214,-1.6363 3.06836,-3.0981 4.69856,-4.5425 1.63203,-1.40992 3.17698,-2.91672 4.78859,-4.34862 0.46305,-0.4369 0.97793,-0.8014 1.52221,-1.1266 0.15824,-0.2112 3.14491,2.0267 2.98666,2.2379 l 0,0 c -0.2952,0.5224 -0.62275,1.0204 -1.01852,1.4748 -0.88192,1.11922 -1.78212,2.22372 -2.79371,3.23052 -0.29346,0.2921 -0.60222,0.5684 -0.90606,0.8497 -0.31321,0.2899 -0.63003,0.5759 -0.94504,0.8639 -1.67153,1.4209 -3.37366,2.8163 -5.22715,3.9963 -0.49876,0.3405 -0.57121,0.3777 -1.0203,0.7266 -0.39341,0.3057 -0.75974,0.6889 -1.26518,0.7962 -0.14292,0.1842 -2.74857,-1.8369 -2.60565,-2.0212 z"
+ id="path4265"
+ style="fill:#d3d7cf;fill-opacity:1;stroke:none;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <g
+ style="display:inline"
+ id="g4283"
+ transform="matrix(0.52823691,0.52823691,-0.52823691,0.52823691,773.22931,294.0656)"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ id="path4269"
+ d="m -44.467884,1107.2152 0,17.7252 1.161165,3.7983 c 1.200046,4.2782 1.065706,4.1105 2.322331,0 l 1.161165,-3.7983 0,-17.7252 z"
+ style="fill:none;stroke:#555753;stroke-width:0.66930836;stroke-miterlimit:4;stroke-dasharray:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4271"
+ d="m -44.467884,1124.9404 4.644661,0"
+ style="fill:none;stroke:#555753;stroke-width:0.66930836;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <path
+ style="fill:none;stroke:#555753;stroke-width:0.66930836;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ d="m -42.239747,1107.2336 0,17.6813"
+ id="path4275"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path4279"
+ d="m -43.348187,1128.4959 c 1.108441,-0.8952 1.929509,-0.3581 2.381097,0.045 -0.328428,1.1191 -1.190549,3.9391 -1.190549,3.9391 z"
+ style="fill:#555753;stroke:#555753;stroke-width:0.66930836;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" />
+ <rect
+ ry="0.42804927"
+ rx="0.37616169"
+ y="1105.3309"
+ x="-44.73621"
+ height="1.8614606"
+ width="5.1800866"
+ id="rect4281"
+ style="fill:#555753;fill-opacity:1;stroke:none" />
+ </g>
+ <rect
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ id="rect4290"
+ width="3.5355339"
+ height="1.8561553"
+ x="174.89275"
+ y="859.06403"
+ rx="1"
+ ry="1"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+ d="m 214.75589,862.65317 c 3.31942,-0.632 4.06019,-2.1721 5.3033,-4.08897 0.42304,-0.6524 -0.64726,-2.63586 0,-3.13491 0.10703,-0.0825 0.93192,0 1.06066,0 2.52315,0 1.41421,3.50161 1.41421,4.77048 0,0.2317 -0.47723,0.6815 -0.17677,0.6815 2.44972,0 2.94209,0.3603 4.41942,1.4993 0.0697,0.054 0.31741,3.8443 0.17677,3.9527 -0.26074,0.201 -0.49042,0.5145 -0.7071,0.6815 -0.13627,0.105 0.38563,0.7684 0.17677,1.0904 -0.17664,0.2724 -0.85358,0.8061 -1.23743,0.9541 -0.36233,0.1398 -0.89015,0 -1.23744,0.1363 -1.96875,0.759 -2.1166,-0.9523 -3.18198,-1.363 -0.34866,-0.1344 -0.63592,-0.1088 -1.06066,-0.2726 -0.99671,-0.3842 -3.88909,0.6704 -3.88909,-0.2726 0,-1.2852 -0.2556,-3.5996 -1.06066,-4.6342 z"
+ id="path4292"
+ inkscape:connector-curvature="0"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4294"
+ d="m 205.42921,862.12677 c -3.31942,0.632 -4.06019,2.1721 -5.3033,4.089 -0.42304,0.6524 0.64726,2.6358 0,3.1349 -0.10703,0.082 -0.93192,0 -1.06066,0 -2.52315,0 -1.41421,-3.5016 -1.41421,-4.7705 0,-0.2317 0.47723,-0.6815 0.17677,-0.6815 -2.44972,0 -2.94209,-0.3603 -4.41942,-1.4993 -0.0697,-0.054 -0.31741,-3.84428 -0.17677,-3.95268 0.26074,-0.201 0.49042,-0.5145 0.7071,-0.6815 0.13627,-0.105 -0.38563,-0.7684 -0.17677,-1.0904 0.17664,-0.2724 0.85358,-0.8061 1.23743,-0.9541 0.36233,-0.1398 0.89015,0 1.23744,-0.1363 1.96875,-0.759 2.1166,0.9523 3.18198,1.363 0.34866,0.1344 0.63592,0.1088 1.06066,0.2726 0.99671,0.3842 3.88909,-0.6704 3.88909,0.2726 0,1.2852 0.2556,3.59958 1.06066,4.63418 z"
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ transform="translate(-204.73743,661.76269)"
+ d="m 292.21188,220.62782 a 7.4246211,7.4246211 0 1 1 -14.84924,0 7.4246211,7.4246211 0 1 1 14.84924,0 z"
+ sodipodi:ry="7.4246211"
+ sodipodi:rx="7.4246211"
+ sodipodi:cy="220.62782"
+ sodipodi:cx="284.78726"
+ id="path4298"
+ style="fill:none;stroke:#d3d7cf;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ sodipodi:type="arc"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ sodipodi:nodetypes="csc"
+ inkscape:connector-curvature="0"
+ id="path4300"
+ d="m 73.15626,883.15627 c 1.94168,0.712 4.31843,1.1563 6.90625,1.1563 2.58782,0 4.96457,-0.4443 6.90625,-1.1563"
+ style="fill:none;stroke:#d3d7cf;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 2;stroke-dashoffset:0;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="fill:none;stroke:#d3d7cf;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 2;stroke-dashoffset:0;display:inline"
+ d="m 80.45665,888.82867 c 0.71191,-1.9416 1.15625,-4.3184 1.15625,-6.9062 0,-2.5878 -0.44434,-4.9646 -1.15625,-6.9063"
+ id="path4302"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csc"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ transform="translate(-184.73743,661.76263)"
+ d="m 292.21188,220.62782 a 7.4246211,7.4246211 0 1 1 -14.84924,0 7.4246211,7.4246211 0 1 1 14.84924,0 z"
+ sodipodi:ry="7.4246211"
+ sodipodi:rx="7.4246211"
+ sodipodi:cy="220.62782"
+ sodipodi:cx="284.78726"
+ id="path4306"
+ style="fill:none;stroke:#555753;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ sodipodi:type="arc"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="fill:none;stroke:#555753;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ d="m 94.285536,887.89997 11.048544,-11.0485"
+ id="path4308"
+ inkscape:connector-curvature="0"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:#555753;stroke:none;display:inline"
+ id="rect4310"
+ width="3.3587573"
+ height="12.020815"
+ x="115.93771"
+ y="876.12292"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ y="876.12292"
+ x="120.53392"
+ height="12.020815"
+ width="3.3587573"
+ id="rect4312"
+ style="fill:#555753;stroke:none;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="fill:#555753;stroke:none;display:inline"
+ d="m 134.32248,876.12297 11.31371,6.0104 -11.31371,6.0104 z"
+ id="rect4314"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <g
+ style="display:inline"
+ transform="matrix(0.52823691,0.52823691,-0.52823691,0.52823691,773.22931,313.68781)"
+ id="g4317"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <path
+ style="fill:none;stroke:#555753;stroke-width:0.66930836;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m -44.467884,1107.2152 0,17.7252 1.161165,3.7983 c 1.200046,4.2782 1.065706,4.1105 2.322331,0 l 1.161165,-3.7983 0,-17.7252 z"
+ id="path4319"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ style="fill:none;stroke:#555753;stroke-width:0.66930836;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ d="m -44.467884,1124.9404 4.644661,0"
+ id="path4321"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4323"
+ d="m -42.239747,1107.2336 0,17.6813"
+ style="fill:none;stroke:#555753;stroke-width:0.66930836;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <path
+ style="fill:#555753;stroke:#555753;stroke-width:0.66930836;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m -43.348187,1128.4959 c 1.108441,-0.8952 1.929509,-0.3581 2.381097,0.045 -0.328428,1.1191 -1.190549,3.9391 -1.190549,3.9391 z"
+ id="path4325"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <rect
+ style="fill:#555753;fill-opacity:1;stroke:none"
+ id="rect4327"
+ width="5.1800866"
+ height="1.8614606"
+ x="-44.73621"
+ y="1105.3309"
+ rx="0.37616169"
+ ry="0.42804927" />
+ </g>
+ <g
+ style="display:inline"
+ id="g4329"
+ transform="matrix(0.24508333,0.24508333,-0.24508333,0.24508333,458.00011,612.37085)"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <path
+ sodipodi:nodetypes="ccccccc"
+ inkscape:connector-curvature="0"
+ id="path4331"
+ d="m -44.467884,1107.2152 0,17.7252 1.161165,3.7983 c 1.200046,4.2782 1.065706,4.1105 2.322331,0 l 1.161165,-3.7983 0,-17.7252 z"
+ style="fill:none;stroke:#555753;stroke-width:0.66930836;stroke-miterlimit:4;stroke-dasharray:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4333"
+ d="m -44.467884,1124.9404 4.644661,0"
+ style="fill:none;stroke:#555753;stroke-width:0.66930836;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <path
+ style="fill:none;stroke:#555753;stroke-width:0.66930836;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ d="m -42.239747,1107.2336 0,17.6813"
+ id="path4335"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path4337"
+ d="m -43.348187,1128.4959 c 1.108441,-0.8952 1.929509,-0.3581 2.381097,0.045 -0.328428,1.1191 -1.190549,3.9391 -1.190549,3.9391 z"
+ style="fill:#555753;stroke:#555753;stroke-width:0.66930836;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" />
+ <rect
+ ry="0.42804927"
+ rx="0.37616169"
+ y="1105.3309"
+ x="-44.73621"
+ height="1.8614606"
+ width="5.1800866"
+ id="rect4339"
+ style="fill:#555753;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="layer1-2"
+ transform="matrix(0.03334717,0,0,0.03334717,191.57984,885.59897)"
+ style="fill:#555753;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <path
+ id="path11522"
+ style="fill:#555753;fill-opacity:1"
+ d="m 264.62704,45.67985 56.31152,-101.021534 0.2677,36.946034 118.51291,-0.267671 c 21.1765,-2.244605 39.74272,-10.852596 53.18801,-27.040291 C 449.99593,42.074998 437.6363,104.18491 348.60347,104.22236 l -27.39721,0 -0.2677,41.05114 -56.31152,-99.59365 z M 128.9798,105.11479 C 65.618201,85.84639 36.055796,7.7860213 7.07577,-47.220709 c 13.282679,12.076484 38.139773,29.363022 52.577167,29.364467 27.689982,0.06456 55.380063,0.116317 83.070083,0.174562 l 83.88712,0 -0.26776,122.43949 -0.26771,0.35698 -97.09487,0 z M 2.5,-79.206629 42.995596,-161.8012 3.5060915,-183.49253 l 118.3343785,0 57.2039,103.877161 -38.79429,-23.228801 c -12.44295,26.27544 -24.88589,52.550878 -37.32884,78.826316 C 88.601045,-24.268303 74.280847,-24.518751 59.960649,-24.769199 32.037317,-31.279427 12.61125,-53.254123 2.5,-79.206629 z m 395.45406,53.939396 -52.29561,-96.380927 105.66215,-63.98618 51.13531,102.449252 c 1.54832,24.517706 -38.03694,58.635841 -62.6066,58.370427 l -41.89525,-0.452572 z M 88.64259,-250.78088 l 53.98405,-80.90589 c 52.35957,-19.50079 82.68955,22.59846 101.8318,49.13587 l -50.86768,97.63029 -104.94817,-65.86027 z m 204.54178,43.54987 c -10.85783,-25.59753 -25.36515,-54.87764 -43.50654,-80.336 -16.24176,-22.7925 -35.86597,-42.67852 -50.7326,-51.5631 l 136.53974,-0.26767 c 24.52088,2.20137 36.43539,16.49668 49.43976,36.05358 l 19.63307,34.53651 30.34224,-19.3654 -57.11457,101.73554 -123.15347,0.26768 38.55237,-21.06114 z"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ style="fill:none;stroke:#555753;display:inline"
+ d="m 219.92452,876.86347 1.33532,1.5307 -5.05101,4.4063 4.00584,4.592 5.05101,-4.4063 1.29423,1.4837 1.19091,-7.757 z"
+ id="rect4425"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:#555753;fill-opacity:1;stroke:none;display:inline"
+ id="rect4564-9"
+ width="10.935946"
+ height="7.925663"
+ x="71.833412"
+ y="900.66992"
+ rx="1.9019035"
+ ry="2.3056474"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:none;stroke:#555753;stroke-width:0.69802254;display:inline"
+ id="rect4566-9"
+ width="7.7661061"
+ height="7.5413885"
+ x="73.447395"
+ y="896.3468"
+ rx="1.9019035"
+ ry="2.3056474"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ ry="2.3056474"
+ rx="1.9019035"
+ y="900.66992"
+ x="92.208412"
+ height="7.925663"
+ width="10.935946"
+ id="rect4506"
+ style="fill:#555753;fill-opacity:1;stroke:none;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="fill:none;stroke:#555753;stroke-width:0.69802254;display:inline"
+ d="m 108.78126,899.75007 0,-1.0938 c 0,-1.2773 -0.8526,-2.3124 -1.90625,-2.3124 l -3.96875,0 c -1.05366,0 -1.90625,1.0351 -1.90625,2.3124 l 0,2.9376"
+ id="rect4508"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cssssc"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:#555753;stroke:none;display:inline"
+ id="rect4514"
+ width="19.512196"
+ height="19.512196"
+ x="150.24391"
+ y="892.60608"
+ rx="2.9268293"
+ ry="2.9268293"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ ry="2.9268293"
+ rx="2.9268293"
+ y="892.60608"
+ x="170.24391"
+ height="19.512196"
+ width="19.512196"
+ id="rect4516"
+ style="fill:#555753;stroke:none;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ ry="2.3056474"
+ rx="1.9019035"
+ y="900.66992"
+ x="151.83342"
+ height="7.925663"
+ width="10.935946"
+ id="rect4518"
+ style="fill:#eeeeec;fill-opacity:1;stroke:none;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ ry="2.3056474"
+ rx="1.9019035"
+ y="896.3468"
+ x="153.4474"
+ height="7.5413885"
+ width="7.7661061"
+ id="rect4520"
+ style="fill:none;stroke:#eeeeec;stroke-width:0.69802254;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:#eeeeec;fill-opacity:1;stroke:none;display:inline"
+ id="rect4522"
+ width="10.935946"
+ height="7.925663"
+ x="172.20842"
+ y="900.66992"
+ rx="1.9019035"
+ ry="2.3056474"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ sodipodi:nodetypes="cssssc"
+ inkscape:connector-curvature="0"
+ id="path4524"
+ d="m 188.78127,899.75007 0,-1.0938 c 0,-1.2773 -0.85259,-2.3124 -1.90625,-2.3124 l -3.96875,0 c -1.05365,0 -1.90625,1.0351 -1.90625,2.3124 l 0,2.9376"
+ style="fill:none;stroke:#eeeeec;stroke-width:0.69802254;display:inline"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="fill:none;stroke:#555753;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ d="m 61.2575,895.73577 c -0.85405,0.9453 -1.14575,2.2161 -0.88721,3.3884 l -8.17918,8.1791 c -0.14244,0.1425 -0.12201,0.3935 0.0507,0.5661 l 2.21807,2.2181 c 0.17268,0.1727 0.42791,0.1974 0.57035,0.055 l 8.13693,-8.1369 c 1.26093,0.3161 2.65155,-0.016 3.63762,-1.0013 0.66189,-0.6619 1.02334,-1.5095 1.09849,-2.3744 l -2.11666,2.1167 -3.2405,-0.8746 -0.87454,-3.2405 2.14201,-2.1419 c -0.88104,0.066 -1.74292,0.4331 -2.41663,1.1068 -0.0467,0.047 -0.0968,0.09 -0.13942,0.1395 z"
+ id="path4529"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccsssscscccccsc"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="fill:none;stroke:#555753;stroke-width:0.80000001;stroke-miterlimit:4;stroke-dasharray:none;display:inline"
+ d="m 201.14016,895.80807 -8.25003,8.25 -0.94202,3.5156 2.58822,2.5882 3.10935,-0.8332 10.50754,-10.5075 -2e-5,-2.3881 -1.69404,-1.694 -1.94401,0 -9.97205,9.972 3e-5,1.972 0.61101,0.611 1.73597,0 9.36804,-9.368"
+ id="path3395"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccc"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:#555753;stroke:none;display:inline"
+ id="rect3397"
+ width="19.512196"
+ height="19.512196"
+ x="210.24391"
+ y="892.60608"
+ rx="2.9268293"
+ ry="2.9268293"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="fill:none;stroke:#eeeeec;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ d="m 214.67284,895.14537 c 7.11789,-1.5098 3.04383,2.9586 9.72807,1.6024 0.48786,-0.099 0.94287,0.3982 0.94287,0.8928 0,0 0,6.7482 0,6.9956 0,0.2473 -0.31338,0.7228 -0.94287,0.8928 -6.70194,1.3208 -2.58353,-3.1887 -9.72807,-1.6024 -0.39933,0.17 -0.94286,-0.3982 -0.94286,-0.8928 l 0,-6.9955 c 0,-0.4947 0.45501,-0.776 0.94286,-0.8929 z"
+ id="rect3409"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccscccssc"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:none;stroke:#eeeeec;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+ id="rect4190"
+ width="1.125"
+ height="16.3125"
+ x="212.62502"
+ y="894.73718"
+ ry="0.40000001"
+ rx="0.40000001"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ transform="translate(-224.73743,701.76263)"
+ d="m 292.21188,220.62782 a 7.4246211,7.4246211 0 1 1 -14.84924,0 7.4246211,7.4246211 0 1 1 14.84924,0 z"
+ sodipodi:ry="7.4246211"
+ sodipodi:rx="7.4246211"
+ sodipodi:cy="220.62782"
+ sodipodi:cx="284.78726"
+ id="path4020"
+ style="fill:none;stroke:#555753;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#555753;fill-opacity:1;stroke:#555753;stroke-width:1.62554049;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="path4022"
+ sodipodi:cx="284.78726"
+ sodipodi:cy="220.62782"
+ sodipodi:rx="7.4246211"
+ sodipodi:ry="7.4246211"
+ d="m 292.21188,220.62782 a 7.4246211,7.4246211 0 1 1 -14.84924,0 7.4246211,7.4246211 0 1 1 14.84924,0 z"
+ transform="matrix(0.61517998,0,0,0.61517998,-115.14559,786.66463)"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/home/fabio/public_html/f9k-tre/icons2.png"
+ sodipodi:type="arc"
+ style="fill:none;stroke:#d3d7cf;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+ id="path4024"
+ sodipodi:cx="284.78726"
+ sodipodi:cy="220.62782"
+ sodipodi:rx="7.4246211"
+ sodipodi:ry="7.4246211"
+ d="m 292.21188,220.62782 a 7.4246211,7.4246211 0 1 1 -14.84924,0 7.4246211,7.4246211 0 1 1 14.84924,0 z"
+ transform="translate(-204.73743,701.76269)" />
+ <g
+ inkscape:label="#g3852"
+ style="stroke:#888a85;display:inline;filter:url(#filter4064)"
+ transform="matrix(0.43114968,0,0,0.43114968,-201.41936,955.6356)"
+ id="g3139">
+ <rect
+ ry="6"
+ rx="6"
+ y="18.790752"
+ x="470.35715"
+ height="44.285713"
+ width="44.285713"
+ id="rect3141"
+ style="fill:none;stroke:#888a85;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ <g
+ id="g3145"
+ transform="matrix(0.43114968,0,0,0.43114968,-179.41936,955.6356)"
+ style="stroke:#d3d7cf;display:inline;filter:url(#filter4064)"
+ inkscape:label="#g3852">
+ <rect
+ style="fill:none;stroke:#d3d7cf;stroke-width:2.0535686;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3147"
+ width="44.285713"
+ height="44.285713"
+ x="470.35715"
+ y="18.790752"
+ rx="6"
+ ry="6" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:17.09149551px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#888a85;fill-opacity:1;stroke:none;font-family:FreeSans;-inkscape-font-specification:FreeSans Bold"
+ x="5.6234956"
+ y="979.64215"
+ id="text3151"
+ sodipodi:linespacing="100%"><tspan
+ sodipodi:role="line"
+ id="tspan3153"
+ x="5.6234956"
+ y="979.64215">?</tspan></text>
+ <text
+ sodipodi:linespacing="100%"
+ id="text3155"
+ y="979.64215"
+ x="27.623495"
+ style="font-size:17.09149551000000145px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#d3d7cf;fill-opacity:1;stroke:none;font-family:FreeSans;-inkscape-font-specification:FreeSans Bold"
+ xml:space="preserve"><tspan
+ y="979.64215"
+ x="27.623495"
+ id="tspan3157"
+ sodipodi:role="line">?</tspan></text>
+ </g>
+</svg>
diff --git a/view/theme/testbubble/jot-header.tpl b/view/theme/testbubble/jot-header.tpl
new file mode 100644
index 000000000..155595056
--- /dev/null
+++ b/view/theme/testbubble/jot-header.tpl
@@ -0,0 +1,251 @@
+
+<script language="javascript" type="text/javascript" src="$baseurl/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
+<script language="javascript" type="text/javascript">
+
+var editor=false;
+var textlen = 0;
+
+function initEditor(cb) {
+ if (editor==false) {
+ $("#profile-jot-text-loading").show();
+ tinyMCE.init({
+ theme : "advanced",
+ mode : "specific_textareas",
+ editor_selector: /(profile-jot-text|prvmail-text)/,
+ plugins : "bbcode,paste,fullscreen,autoresize",
+ theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code,fullscreen",
+ theme_advanced_buttons2 : "",
+ theme_advanced_buttons3 : "",
+ theme_advanced_toolbar_location : "top",
+ theme_advanced_toolbar_align : "center",
+ theme_advanced_blockformats : "blockquote,code",
+ //theme_advanced_resizing : true,
+ //theme_advanced_statusbar_location : "bottom",
+ paste_text_sticky : true,
+ entity_encoding : "raw",
+ add_unload_trigger : false,
+ remove_linebreaks : false,
+ force_p_newlines : false,
+ force_br_newlines : true,
+ forced_root_block : '',
+ convert_urls: false,
+ content_css: "$baseurl/view/custom_tinymce.css",
+ theme_advanced_path : false,
+ setup : function(ed) {
+ //Character count
+ ed.onKeyUp.add(function(ed, e) {
+ var txt = tinyMCE.activeEditor.getContent();
+ textlen = txt.length;
+ if(textlen != 0 && $('#jot-perms-icon').is('.unlock')) {
+ $('#profile-jot-desc').html(ispublic);
+ }
+ else {
+ $('#profile-jot-desc').html('&nbsp;');
+ }
+
+ if(textlen <= 140) {
+ $('#character-counter').removeClass('red');
+ $('#character-counter').removeClass('orange');
+ $('#character-counter').addClass('grey');
+ }
+ if((textlen > 140) && (textlen <= 420)) {
+ $('#character-counter').removeClass('grey');
+ $('#character-counter').removeClass('red');
+ $('#character-counter').addClass('orange');
+ }
+ if(textlen > 420) {
+ $('#character-counter').removeClass('grey');
+ $('#character-counter').removeClass('orange');
+ $('#character-counter').addClass('red');
+ }
+ $('#character-counter').text(textlen);
+ });
+ ed.onInit.add(function(ed) {
+ ed.pasteAsPlainText = true;
+ $("#profile-jot-text-loading").hide();
+ $("#profile-jot-submit-wrapper").show();
+ $("#profile-upload-wrapper").show();
+ $("#profile-attach-wrapper").show();
+ $("#profile-link-wrapper").show();
+ $("#profile-youtube-wrapper").show();
+ $("#profile-video-wrapper").show();
+ $("#profile-audio-wrapper").show();
+ $("#profile-location-wrapper").show();
+ $("#profile-nolocation-wrapper").show();
+ $("#profile-title-wrapper").show();
+ $("#profile-jot-plugin-wrapper").show();
+ $("#character-counter").show();
+ if (typeof cb!="undefined") cb();
+ });
+ }
+ });
+ editor = true;
+ // setup acl popup
+ $("a#jot-perms-icon").fancybox({
+ 'transitionIn' : 'none',
+ 'transitionOut' : 'none'
+ });
+ } else {
+ if (typeof cb!="undefined") cb();
+ }
+} // initEditor
+</script>
+<script type="text/javascript" src="include/ajaxupload.js" ></script>
+<script>
+ var ispublic = '$ispublic';
+ $(document).ready(function() {
+ /* enable tinymce on focus */
+ $("#profile-jot-text").focus(function(){
+ if (editor) return;
+ $(this).val("");
+ initEditor();
+ });
+ var uploader = new window.AjaxUpload(
+ 'wall-image-upload',
+ { action: 'wall_upload/$nickname',
+ name: 'userfile',
+ onSubmit: function(file,ext) { $('#profile-rotator').show(); },
+ onComplete: function(file,response) {
+ tinyMCE.execCommand('mceInsertRawHTML',false,response);
+ $('#profile-rotator').hide();
+ }
+ }
+ );
+ var file_uploader = new window.AjaxUpload(
+ 'wall-file-upload',
+ { action: 'wall_attach/$nickname',
+ name: 'userfile',
+ onSubmit: function(file,ext) { $('#profile-rotator').show(); },
+ onComplete: function(file,response) {
+ tinyMCE.execCommand('mceInsertRawHTML',false,response);
+ $('#profile-rotator').hide();
+ }
+ }
+ );
+ $('#contact_allow, #contact_deny, #group_allow, #group_deny').change(function() {
+ var selstr;
+ $('#contact_allow option:selected, #contact_deny option:selected, #group_allow option:selected, #group_deny option:selected').each( function() {
+ selstr = $(this).text();
+ $('#jot-perms-icon').removeClass('unlock').addClass('lock');
+ $('#jot-public').hide();
+ $('.profile-jot-net input').attr('disabled', 'disabled');
+ });
+ if(selstr == null) {
+ $('#jot-perms-icon').removeClass('lock').addClass('unlock');
+ $('#jot-public').show();
+ $('.profile-jot-net input').attr('disabled', false);
+ }
+
+ }).trigger('change');
+
+ });
+
+ function deleteCheckedItems() {
+ var checkedstr = '';
+
+ $('.item-select').each( function() {
+ if($(this).is(':checked')) {
+ if(checkedstr.length != 0) {
+ checkedstr = checkedstr + ',' + $(this).val();
+ }
+ else {
+ checkedstr = $(this).val();
+ }
+ }
+ });
+ $.post('item', { dropitems: checkedstr }, function(data) {
+ window.location.reload();
+ });
+ }
+
+ function jotGetLink() {
+ reply = prompt("$linkurl");
+ if(reply && reply.length) {
+ reply = bin2hex(reply);
+ $('#profile-rotator').show();
+ $.get('parse_url?url=' + reply, function(data) {
+ tinyMCE.execCommand('mceInsertRawHTML',false,data);
+ $('#profile-rotator').hide();
+ });
+ }
+ }
+
+ function jotGetVideo() {
+ reply = prompt("$utubeurl");
+ if(reply && reply.length) {
+ tinyMCE.execCommand('mceInsertRawHTML',false,'[youtube]' + reply + '[/youtube]');
+ }
+ }
+
+ function jotVideoURL() {
+ reply = prompt("$vidurl");
+ if(reply && reply.length) {
+ tinyMCE.execCommand('mceInsertRawHTML',false,'[video]' + reply + '[/video]');
+ }
+ }
+
+ function jotAudioURL() {
+ reply = prompt("$audurl");
+ if(reply && reply.length) {
+ tinyMCE.execCommand('mceInsertRawHTML',false,'[audio]' + reply + '[/audio]');
+ }
+ }
+
+
+ function jotGetLocation() {
+ reply = prompt("$whereareu", $('#jot-location').val());
+ if(reply && reply.length) {
+ $('#jot-location').val(reply);
+ }
+ }
+
+ function jotTitle() {
+ reply = prompt("$title", $('#jot-title').val());
+ if(reply && reply.length) {
+ $('#jot-title').val(reply);
+ }
+ }
+
+ function jotShare(id) {
+ $('#like-rotator-' + id).show();
+ $.get('share/' + id, function(data) {
+ if (!editor) $("#profile-jot-text").val("");
+ initEditor(function(){
+ tinyMCE.execCommand('mceInsertRawHTML',false,data);
+ $('#like-rotator-' + id).hide();
+ $(window).scrollTop(0);
+ });
+ });
+ }
+
+ function linkdropper(event) {
+ var linkFound = event.dataTransfer.types.contains("text/uri-list");
+ if(linkFound)
+ event.preventDefault();
+ }
+
+ function linkdrop(event) {
+ var reply = event.dataTransfer.getData("text/uri-list");
+ event.target.textContent = reply;
+ event.preventDefault();
+ if(reply && reply.length) {
+ $('#profile-rotator').show();
+ $.get('parse_url?url=' + reply, function(data) {
+ if (!editor) $("#profile-jot-text").val("");
+ initEditor(function(){
+ tinyMCE.execCommand('mceInsertRawHTML',false,data);
+ $('#profile-rotator').hide();
+ });
+ });
+ }
+ }
+
+ function jotClearLocation() {
+ $('#jot-coord').val('');
+ $('#profile-nolocation-wrapper').hide();
+ }
+
+ $geotag
+
+</script>
+
diff --git a/view/theme/testbubble/jot.tpl b/view/theme/testbubble/jot.tpl
new file mode 100644
index 000000000..d60e8adc2
--- /dev/null
+++ b/view/theme/testbubble/jot.tpl
@@ -0,0 +1,75 @@
+
+<div id="profile-jot-wrapper" >
+ <div id="profile-jot-banner-wrapper">
+ <div id="profile-jot-desc" >&nbsp;</div>
+ <div id="character-counter" class="grey" style="display: none;">0</div>
+ <div id="profile-rotator-wrapper" style="display: $visitor;" >
+ <img id="profile-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display:none;" />
+ </div>
+ </div>
+
+ <form id="profile-jot-form" action="$action" method="post" >
+ <input type="hidden" name="type" value="wall" />
+ <input type="hidden" name="profile_uid" value="$profile_uid" />
+ <input type="hidden" name="return" value="$return_path" />
+ <input type="hidden" name="location" id="jot-location" value="$defloc" />
+ <input type="hidden" name="coord" id="jot-coord" value="" />
+ <input type="hidden" name="title" id="jot-title" value="" />
+ <input type="hidden" name="post_id" value="$post_id" />
+
+ <img id="profile-jot-text-loading" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
+ <textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" >{{ if $content }}$content{{ else }}$share{{ endif }}</textarea>
+ {{ if $content }}<script>initEditor();</script>{{ endif }}
+
+ <div id="profile-upload-wrapper" class="jot-tool" style="display: none;" >
+ <div id="wall-image-upload-div" ><a onclick="return false;" id="wall-image-upload" class="icon border camera" title="$upload"></a></div>
+ </div>
+ <div id="profile-attach-wrapper" class="jot-tool" style="display: none;" >
+ <div id="wall-file-upload-div" ><a href="#" onclick="return false;" id="wall-file-upload" class="icon border attach" title="$attach"></a></div>
+ </div>
+ <div id="profile-link-wrapper" class="jot-tool" style="display: none;" ondragenter="linkdropper(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" >
+ <a id="profile-link" class="icon border link" title="$weblink" ondragenter="return linkdropper(event);" ondragover="return linkdropper(event);" ondrop="linkdrop(event);" onclick="jotGetLink(); return false;"></a>
+ </div>
+ <div id="profile-youtube-wrapper" class="jot-tool" style="display: none;" >
+ <a id="profile-youtube" class="icon border youtube" title="$youtube" onclick="jotGetVideo(); return false;"></a>
+ </div>
+ <div id="profile-video-wrapper" class="jot-tool" style="display: none;" >
+ <a id="profile-video" class="icon border video" title="$video" onclick="jotVideoURL(); return false;"></a>
+ </div>
+ <div id="profile-audio-wrapper" class="jot-tool" style="display: none;" >
+ <a id="profile-audio" class="icon border audio" title="$audio" onclick="jotAudioURL(); return false;"></a>
+ </div>
+ <div id="profile-location-wrapper" class="jot-tool" style="display: none;" >
+ <a id="profile-location" class="icon border globe" title="$setloc" onclick="jotGetLocation(); return false;"></a>
+ </div>
+ <div id="profile-nolocation-wrapper" class="jot-tool" style="display: none;" >
+ <a id="profile-nolocation" class="icon border noglobe" title="$noloc" onclick="jotClearLocation(); return false;"></a>
+ </div>
+ <div id="profile-title-wrapper" class="jot-tool" style="display: none;" >
+ <a id="profile-title" class="icon border article" title="$title" onclick="jotTitle(); return false;"></a>
+ </div>
+
+ <div id="profile-jot-submit-wrapper" style="display:none;padding-left: 400px;">
+ <input type="submit" id="profile-jot-submit" name="submit" value="$share" />
+ <div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" >
+ <a href="#profile-jot-acl-wrapper" id="jot-perms-icon" class="icon $lockstate sharePerms" title="$permset"></a>$bang</div>
+ </div>
+
+ <div id="profile-jot-plugin-wrapper" style="display: none;">
+ $jotplugins
+ </div>
+ <div id="profile-jot-tools-end"></div>
+
+ <div style="display: none;">
+ <div id="profile-jot-acl-wrapper" style="width:auto;height:auto;overflow:auto;">
+ $acl
+ <hr style="clear:both"/>
+ <div id="profile-jot-email-label">$emailcc</div><input type="text" name="emailcc" id="profile-jot-email" title="$emtitle" />
+ <div id="profile-jot-email-end"></div>
+ $jotnets
+ </div>
+ </div>
+
+<div id="profile-jot-end"></div>
+</form>
+</div>
diff --git a/view/theme/testbubble/login-bg.gif b/view/theme/testbubble/login-bg.gif
new file mode 100644
index 000000000..cde836c89
--- /dev/null
+++ b/view/theme/testbubble/login-bg.gif
Binary files differ
diff --git a/view/theme/testbubble/login.tpl b/view/theme/testbubble/login.tpl
new file mode 100644
index 000000000..2c879d69a
--- /dev/null
+++ b/view/theme/testbubble/login.tpl
@@ -0,0 +1,25 @@
+
+<form action="" method="post" >
+ <input type="hidden" name="auth-params" value="login" />
+ <div id="login-name-wrapper">
+ <label for="login-name" id="label-login-name">$namelabel</label>
+ <input type="text" maxlength="60" name="openid_url" class="$classname" id="login-name" value="" />
+ </div>
+ <div id="login-name-end" ></div>
+ <div id="login-password-wrapper">
+ <label for="login-password" id="label-login-password">$passlabel</label>
+ <input type="password" maxlength="60" name="password" id="login-password" value="" />
+ </div>
+ <div id="login-password-end"></div>
+ <div id="login-submit-wrapper" >
+ <input type="submit" name="submit" id="login-submit-button" value="$login" />
+ <a href="lostpass" title="$lostpass" id="lost-password-link" >$lostlink</a>
+ </div>
+ <div id="login-submit-end"></div>
+ <div id="login-extra-links">
+ <div id="login-extra-filler">&nbsp;</div>
+ $register_html
+ </div>
+ <div id="login-extra-end"></div>
+</form>
+
diff --git a/view/theme/testbubble/lrarrow.gif b/view/theme/testbubble/lrarrow.gif
new file mode 100644
index 000000000..fa2676944
--- /dev/null
+++ b/view/theme/testbubble/lrarrow.gif
Binary files differ
diff --git a/view/theme/testbubble/mail_head.tpl b/view/theme/testbubble/mail_head.tpl
new file mode 100644
index 000000000..89615cbd0
--- /dev/null
+++ b/view/theme/testbubble/mail_head.tpl
@@ -0,0 +1,7 @@
+<h3>$messages</h3>
+
+<ul class="tabs-wrapper">
+<li><a href="message" class="tabs">$inbox</a></li>
+<li><a href="message/sent" class="tabs">$outbox</a></li>
+<li><a href="message/new" class="tabs">$new</a></li>
+</ul>
diff --git a/view/theme/testbubble/menu-user-pin.jpg b/view/theme/testbubble/menu-user-pin.jpg
new file mode 100644
index 000000000..26449569f
--- /dev/null
+++ b/view/theme/testbubble/menu-user-pin.jpg
Binary files differ
diff --git a/view/theme/testbubble/menu-user-pin.png b/view/theme/testbubble/menu-user-pin.png
new file mode 100644
index 000000000..6becfbb66
--- /dev/null
+++ b/view/theme/testbubble/menu-user-pin.png
Binary files differ
diff --git a/view/theme/testbubble/nav.tpl b/view/theme/testbubble/nav.tpl
new file mode 100644
index 000000000..f20683366
--- /dev/null
+++ b/view/theme/testbubble/nav.tpl
@@ -0,0 +1,54 @@
+$langselector
+
+<span id="banner">$banner</span>
+
+<div id="notifications">
+ {{ if $nav.network }}<a id="net-update" class="nav-ajax-update" href="$nav.network.0" title="$nav.network.1"></a>{{ endif }}
+ {{ if $nav.home }}<a id="home-update" class="nav-ajax-update" href="$nav.home.0" title="$nav.home.1"></a>{{ endif }}
+ {{ if $nav.notifications }}<a id="notify-update" class="nav-ajax-update" href="$nav.notifications.0" title="$nav.notifications.1"></a>{{ endif }}
+ {{ if $nav.messages }}<a id="mail-update" class="nav-ajax-update" href="$nav.messages.0" title="$nav.messages.1"></a>{{ endif }}
+</div>
+
+<div id="user-menu" >
+ <a id="user-menu-label" onclick="openClose('user-menu-popup'); return false" href="$nav.home.0">$sitelocation</a>
+
+ <ul id="user-menu-popup"
+ onmouseover="if (typeof tmenu != 'undefined') clearTimeout(tmenu); openMenu('user-menu-popup')"
+ onmouseout="tmenu=setTimeout('closeMenu(\'user-menu-popup\');',200)">
+
+ {{ if $nav.register }}<li><a id="nav-register-link" class="nav-commlink $nav.register.2" href="$nav.register.0" title="$nav.register.1">$nav.register.1</a></li>{{ endif }}
+
+ {{ if $nav.home }}<li><a id="nav-home-link" class="nav-commlink $nav.home.2" href="$nav.home.0">$nav.home.1</a></li>{{ endif }}
+
+ {{ if $nav.network }}<li><a id="nav-network-link" class="nav-commlink $nav.network.2" href="$nav.network.0">$nav.network.1</a></li>{{ endif }}
+
+ {{ if $nav.community }}
+ <li><a id="nav-community-link" class="nav-commlink $nav.community.2" href="$nav.community.0" title="$nav.community.3" >$nav.community.1</a></li>
+ {{ endif }}
+
+ <li><a id="nav-search-link" class="nav-link $nav.search.2" href="$nav.search.0" title="$nav.search.1">$nav.search.1</a></li>
+ <li><a id="nav-directory-link" class="nav-link $nav.directory.2" href="$nav.directory.0" title="$nav.directory.1">$nav.directory.1</a></li>
+
+ {{ if $nav.notifications }}<li><a id="nav-notify-link" class="nav-commlink nav-sep $nav.notifications.2" href="$nav.notifications.0">$nav.notifications.1</a></li>{{ endif }}
+ {{ if $nav.messages }}<li><a id="nav-messages-link" class="nav-commlink $nav.messages.2" href="$nav.messages.0">$nav.messages.1</a></li>{{ endif }}
+ {{ if $nav.contacts }}<li><a id="nav-contacts-link" class="nav-commlink $nav.contacts.2" href="$nav.contacts.0">$nav.contacts.1</a></li>{{ endif }}
+
+ {{ if $nav.profiles }}<li><a id="nav-profiles-link" class="nav-commlink nav-sep $nav.profiles.2" href="$nav.profiles.0">$nav.profiles.1</a></li>{{ endif }}
+ {{ if $nav.settings }}<li><a id="nav-settings-link" class="nav-commlink $nav.settings.2" href="$nav.settings.0">$nav.settings.1</a></li>{{ endif }}
+
+ {{ if $nav.manage }}<li><a id="nav-manage-link" class="nav-commlink $nav.manage.2" href="$nav.manage.0">$nav.manage.1</a></li>{{ endif }}
+
+ {{ if $nav.admin }}<li><a id="nav-admin-link" class="nav-commlink $nav.admin.2" href="$nav.admin.0">$nav.admin.1</a></li>{{ endif }}
+
+ <li><a id="nav-help-link" class="nav-link $nav.help.2" href="$nav.help.0" title="$nav.help.1">$nav.help.1</a></li>
+
+ {{ if $nav.login }}<li><a id="nav-login-link" class="nav-link $nav.login.2" href="$nav.login.0" title="$nav.login.1">$nav.login.1</a></li> {{ endif }}
+ {{ if $nav.logout }}<li><a id="nav-logout-link" class="nav-commlink nav-sep $nav.logout.2" href="$nav.logout.0">$nav.logout.1</a></li> {{ endif }}
+ </ul>
+</div>
+
+
+{{ if $nav.apps }}<a id="nav-apps-link" class="nav-link $nav.apps.2" href="$nav.apps.0" title="$nav.apps.1">$nav.apps.1</a>{{ endif }}
+
+
+
diff --git a/view/theme/testbubble/next.png b/view/theme/testbubble/next.png
new file mode 100644
index 000000000..353e2e72a
--- /dev/null
+++ b/view/theme/testbubble/next.png
Binary files differ
diff --git a/view/theme/testbubble/notifications.png b/view/theme/testbubble/notifications.png
new file mode 100644
index 000000000..803257fec
--- /dev/null
+++ b/view/theme/testbubble/notifications.png
Binary files differ
diff --git a/view/theme/testbubble/photo-menu.jpg b/view/theme/testbubble/photo-menu.jpg
new file mode 100644
index 000000000..b96a96fa1
--- /dev/null
+++ b/view/theme/testbubble/photo-menu.jpg
Binary files differ
diff --git a/view/theme/testbubble/photo_view.tpl b/view/theme/testbubble/photo_view.tpl
new file mode 100644
index 000000000..4582751c6
--- /dev/null
+++ b/view/theme/testbubble/photo_view.tpl
@@ -0,0 +1,40 @@
+<div id="live-display"></div>
+<h3><a href="$album.0">$album.1</a></h3>
+
+<div id="photo-edit-link-wrap">
+{{ if $tools }}
+<a id="photo-edit-link" href="$tools.edit.0">$tools.edit.1</a>
+-
+<a id="photo-toprofile-link" href="$tools.profile.0">$tools.profile.1</a>
+{{ endif }}
+{{ if $lock }} - <img src="images/lock_icon.gif" class="lockview" alt="$lock" onclick="lockview(event,'photo$id');" /> {{ endif }}
+</div>
+
+<div id="photo-photo">
+ {{ if $prevlink }}<div id="photo-prev-link"><a href="$prevlink.0">$prevlink.1</a></div>{{ endif }}
+ <a href="$photo.href" title="$photo.title"><img src="$photo.src" /></a>
+ {{ if $nextlink }}<div id="photo-next-link"><a href="$nextlink.0">$nextlink.1</a></div>{{ endif }}
+</div>
+
+<div id="photo-photo-end"></div>
+<div id="photo-caption" >$desc</div>
+{{ if $tags }}
+<div id="in-this-photo-text">$tags.0</div>
+<div id="in-this-photo">$tags.1</div>
+{{ endif }}
+{{ if $tags.2 }}<div id="tag-remove"><a href="$tags.2">$tags.3</a></div>{{ endif }}
+
+{{ if $edit }}$edit{{ endif }}
+
+{{ if $likebuttons }}
+<div id="photo-like-div">
+ $likebuttons
+ $like
+ $dislike
+</div>
+{{ endif }}
+
+$comments
+
+$paginate
+
diff --git a/view/theme/testbubble/photography.png b/view/theme/testbubble/photography.png
new file mode 100644
index 000000000..7ec919f2b
--- /dev/null
+++ b/view/theme/testbubble/photography.png
Binary files differ
diff --git a/view/theme/testbubble/premium.png b/view/theme/testbubble/premium.png
new file mode 100644
index 000000000..1ad601c0f
--- /dev/null
+++ b/view/theme/testbubble/premium.png
Binary files differ
diff --git a/view/theme/testbubble/prev.png b/view/theme/testbubble/prev.png
new file mode 100644
index 000000000..0ae6022af
--- /dev/null
+++ b/view/theme/testbubble/prev.png
Binary files differ
diff --git a/view/theme/testbubble/profile_entry.tpl b/view/theme/testbubble/profile_entry.tpl
new file mode 100644
index 000000000..82c04cc20
--- /dev/null
+++ b/view/theme/testbubble/profile_entry.tpl
@@ -0,0 +1,11 @@
+
+<div class="profile-listing" >
+<div class="profile-listing-photo-wrapper" >
+<a href="profiles/$id" class="profile-listing-edit-link"><img class="profile-listing-photo" id="profile-listing-photo-$id" src="$photo" alt="$alt" /></a>
+</div>
+<div class="profile-listing-photo-end"></div>
+<div class="profile-listing-name" id="profile-listing-name-$id"><a href="profiles/$id" class="profile-listing-edit-link" >$profile_name</a></div>
+<div class='profile-visible'>$visible</div>
+</div>
+<div class="profile-listing-end"></div>
+
diff --git a/view/theme/testbubble/profile_tabs.tpl b/view/theme/testbubble/profile_tabs.tpl
new file mode 100644
index 000000000..c236490b2
--- /dev/null
+++ b/view/theme/testbubble/profile_tabs.tpl
@@ -0,0 +1,9 @@
+
+<div class="tabs-wrapper" >
+ <a href="$url" id="profile-tab-status-link" class="tabs {{if $activetab==posts}}active{{endif}}" >$status</a>
+ <a href="$url?tab=profile" id="profile-tab-profile-link" class="tabs {{if $activetab==profile}}active{{endif}}" >$profile</a>
+ <a href="$phototab" id="profile-tab-photos-link" class="tabs {{if $activetab==photos}}active{{endif}}" >$photos</a>
+ {{ if $events }}<a href="events" id="profile-tab-events-link" class="tabs {{if $activetab==events}}active{{endif}}" >$events</a>{{ endif }}
+ {{ if $notes }}<a href="notes" id="profile-tab-notes-link" class="tabs {{if $activetab==notes}}active{{endif}}" >$notes</a>{{ endif }}
+<div class="tabs-end"></div>
+</div>
diff --git a/view/theme/testbubble/search.png b/view/theme/testbubble/search.png
new file mode 100644
index 000000000..51c428594
--- /dev/null
+++ b/view/theme/testbubble/search.png
Binary files differ
diff --git a/view/theme/testbubble/search_item.tpl b/view/theme/testbubble/search_item.tpl
new file mode 100644
index 000000000..76fbee6ba
--- /dev/null
+++ b/view/theme/testbubble/search_item.tpl
@@ -0,0 +1,39 @@
+<div class="wall-item-outside-wrapper$indent" id="wall-item-outside-wrapper-$id" >
+ <div class="wall-item-content-wrapper$indent" id="wall-item-content-wrapper-$id" >
+ <div class="wall-item-info" id="wall-item-info-$id">
+ <div class="wall-item-photo-wrapper" id="wall-item-photo-wrapper-$id"
+ onmouseover="if (typeof t$id != 'undefined') clearTimeout(t$id); openMenu('wall-item-photo-menu-button-$id')"
+ onmouseout="t$id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$id\'); closeMenu(\'wall-item-photo-menu-$id\');',200)">
+ <a href="$profile_url" title="$linktitle" class="wall-item-photo-link" id="wall-item-photo-link-$id">
+ <img src="$thumb" class="wall-item-photo$sparkle" id="wall-item-photo-$id" style="height: 80px; width: 80px;" alt="$name" /></a>
+ <span onclick="openClose('wall-item-photo-menu-$id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$id">menu</span>
+ <div class="wall-item-photo-menu" id="wall-item-photo-menu-$id">
+ <ul>
+ $item_photo_menu
+ </ul>
+ </div>
+ </div>
+ <div class="wall-item-photo-end"></div>
+ <div class="wall-item-location" id="wall-item-location-$id">{{ if $location }}<span class="icon globe"></span>$location {{ endif }}</div>
+ </div>
+ <div class="wall-item-lock-wrapper">$lock</div>
+ <div class="wall-item-tools" id="wall-item-tools-$id">
+ $drop
+ </div>
+ <div class="wall-item-content" id="wall-item-content-$id" >
+ <div class="wall-item-title" id="wall-item-title-$id">$title</div>
+ <div class="wall-item-title-end"></div>
+ <div class="wall-item-body" id="wall-item-body-$id" >$body</div>
+ </div>
+ <div class="wall-item-author">
+ <a href="$profile_url" title="$linktitle" class="wall-item-name-link"><span class="wall-item-name$sparkle" id="wall-item-name-$id" >$name</span></a>
+ <div class="wall-item-ago" id="wall-item-ago-$id">$ago</div>
+
+ </div>
+
+ </div>
+ <div class="wall-item-conv" id="wall-item-conv-$id" >$conv</div>
+ <div class="wall-item-wrapper-end"></div>
+</div>
+
+<div class="wall-item-outside-wrapper-end$indent" ></div> \ No newline at end of file
diff --git a/view/theme/testbubble/star.png b/view/theme/testbubble/star.png
new file mode 100644
index 000000000..a327ba14e
--- /dev/null
+++ b/view/theme/testbubble/star.png
Binary files differ
diff --git a/view/theme/testbubble/style.css b/view/theme/testbubble/style.css
new file mode 100644
index 000000000..ba3b52099
--- /dev/null
+++ b/view/theme/testbubble/style.css
@@ -0,0 +1,3277 @@
+/*
+ style.css
+ TestBubble
+
+ Created by Anne Walk and Devlon Duthie on 2011-09-24.
+ Based loosely on the Dipsy theme.
+*/
+/* ========== */
+/* = Colors
+
+Red links - #b20202
+Red link hover - #db0503
+Red Gradients (buttons and other gradients) - #b20202 and #d60808
+
+Grey/body text - #626262
+Grey Gradients (buttons and other gradients) - #bdbdbd and #a2a2a2
+
+Dark Grey Gradients - #7c7d7b and #555753
+
+You can switch out the colors of the header, buttons and links by using a find and replace in your text editor.
+
+ = */
+/* ========== */
+
+body {
+ margin: 0px;
+ padding: 0px;
+ font-family: freesans,helvetica,arial,clean,sans-serif;
+ font-size: 15px;
+ color: #626262;
+ width: 100%;
+}
+
+img { border: 0 none; max-width: 550px; }
+
+a { color: #b20202; text-decoration: none; margin-bottom:1px;}
+a:hover { color: #db0503; padding-bottom: 0px;}
+
+h3 > a, h4 > a {
+ font-size: 18px;
+ color: #626262;
+}
+
+h3 {
+ margin: 0px;
+ margin-bottom: 5px;
+ font-size: 18px;
+ color: #626262;
+}
+
+h2 {
+ color: #626262;
+}
+
+p {
+
+ max-width: 600px;
+}
+
+label {
+ font-variant:small-caps;
+}
+
+li {
+ list-style: none;
+}
+
+.required { display: inline; color: #b20202; }
+.fakelink { color: #b20202; cursor: pointer; }
+.fakelink :hover { color: #db0503; }
+
+input[type=text] {
+ border: 2px solid #b0b0b0;
+ padding: 2px;
+ -webkit-border-radius: 3px 3px 3px 3px;
+ -moz-border-radius: 3px 3px 3px 3px;
+ border-radius: 3px 3px 3px 3px;
+}
+
+input[type=submit] {
+ margin-top: 10px;
+ border: none;
+ font-size: 0.9em;
+ padding: 5px 5px 5px 5px;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ color:#efefef;
+ text-align: center;
+}
+
+input[type=submit]:hover {
+ border: none;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+ color: #efefef;
+}
+input[type=submit]:active {
+ position:relative;
+ top:1px;
+}
+
+.smalltext { font-size: 0.7em }
+
+::selection { background:#fdf795; color: #000; /* Safari and Opera */ }
+::-moz-selection { background:#fdf795; color: #000; /* Firefox */ }
+
+section {
+ margin: 10px 11% 0px 11%;
+ font-size: 0.9em;
+ line-height: 1.2em;
+ padding-right: 230px;
+}
+
+#wall-item-lock {
+ margin-left: 10px;
+}
+
+/* ========= */
+/* = Login = */
+/* ========= */
+
+#login-name-wrapper {
+ vertical-align: middle;
+ margin: auto;
+}
+
+#login-name-wrapper input {
+ width: 120px;
+ margin-left: 20px;
+}
+
+#login-password-wrapper {
+ vertical-align: middle;
+ margin: auto;
+}
+
+#login-extra-links {
+ width: 90px;
+ margin-top: 20px;
+ border: none;
+ font-size: 0.9em;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ color:#efefef;
+ text-align: center;
+}
+
+#login-extra-links a {
+ display: block;
+ margin: 10px;
+ padding: 5px 0px 5px 0px;
+ color: #efefef;
+ text-align: center;
+ margin-right: 20px;
+}
+
+#login-extra-links:hover {
+ border: none;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+ color: #efefef;
+}
+
+#login-extra-links:active {
+ position:relative;
+ top:1px;
+}
+
+#login-extra-filler {
+ display: none;
+}
+
+/* ========= */
+/* = Panel = */
+/* ========= */
+
+#panel {
+ position: absolute;
+ font-size:0.8em;
+ -webkit-border-radius: 5px ;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ border: 1px solid #494948;
+ background-color: #2e3436;
+ opacity:50%;
+ color: #eeeeec;
+ padding:1em;
+ z-index: 200;
+ -moz-box-shadow: 7px 7px 12px #434343;
+ -webkit-box-shadow: 7px75px 12px #434343;
+ box-shadow: 7px 7px 10px #434343;
+}
+
+/* ========= */
+/* = Pager = */
+/* ========= */
+
+.pager {
+ padding-top: 30px;
+ display:block;
+ clear: both;
+ text-align: center;
+}
+
+.pager a {
+ color: #626262;
+}
+
+.pager span { padding: 4px; margin:4px; }
+.pager_current { background-color: #b20202; color: #ffffff; }
+
+/* ======= */
+/* = Nav = */
+/* ======= */
+
+nav {
+ height: 50px;
+ display: block;
+ position: relative;
+ padding: 0px 10%;
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #7c7d7b), color-stop(1, #555753) );
+ background:-moz-linear-gradient( center top, #7c7d7b 5%, #555753 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7c7d7b', endColorstr='#555753');
+ background-color:#7c7d7b;
+ border-bottom: 1px solid #494948;
+}
+nav a { text-decoration: none; color: #eeeeec; border:0px;}
+nav a:hover { text-decoration: none; color: #eeeeec; border:0px;}
+
+nav #banner {
+ display: block;
+ position: absolute;
+ margin-left: 20px;
+ margin-top: 5px;
+ padding-bottom:5px;
+}
+nav #banner #logo-text a {
+ display: hidden;
+ font-size: 40px;
+ font-weight: bold;
+ margin-left: 3px;
+}
+
+nav #user-menu {
+ display: block;
+ width: 250px;
+ float: right;
+ margin-right:15px;
+ margin-top: 10px;
+ padding: 3px;
+ position: relative;
+ vertical-align: middle;
+ background:-webk/* margin-right:10px;*/it-gradient( linear, left top, left bottom, color-stop(0.05, #797979), color-stop(1, #898988) );
+ background:-moz-linear-gradient( center top, #797979 5%, #898988 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#797979', endColorstr='#898988');
+ background-color:#898988;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ color:#efefef;
+ text-decoration:none;
+ text-align: center;
+ border: 1px solid #9a9a9a;
+}
+
+nav #user-menu-label:after{
+ content: url("menu-user-pin.png") no-repeat;
+ padding-left: 15px;
+}
+
+nav #user-menu-label {
+ vertical-align: middle;
+ font-size: 12px;
+ padding: 5px;
+ text-align: center;
+}
+
+ul#user-menu-popup {
+ display: none;
+ position: absolute;
+ background:-webk/* margin-right:10px;*/it-gradient( linear, left top, left bottom, color-stop(0.05, #797979), color-stop(1, #898988) );
+ background:-moz-linear-gradient( center top, #797979 5%, #898988 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#797979', endColorstr='#898988');
+ background-color:#898988;
+ width: 100%;
+ padding: 10px 0px;
+ margin: 0px;
+ top: 20px;
+ left: 0px;
+ border: 1px solid #9a9a9a;
+ border-top: none;
+ -webkit-border-radius: 0px 0px 5px 5px;
+ -moz-border-radius: 0px 0px 5px 5px;
+ border-radius: 0px 0px 5px 5px;
+ -moz-box-shadow: 5px 5px 10px #242424;
+ -webkit-box-shadow: 5px 5px 10px #242424;
+ box-shadow: 5px 5px 10px #242424;
+ z-index: 10000;
+}
+
+ul#user-menu-popup li { display: block; }
+ul#user-menu-popup li a { display: block; padding: 5px; }
+ul#user-menu-popup li a:hover {
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #d60808), color-stop(1, #b20202) );
+ background:-moz-linear-gradient( center top, #d60808 5%, #b20202 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d60808', endColorstr='#b20202');
+ background-color:#d60808;
+}
+
+ul#user-menu-popup li a.nav-sep { border-top: 1px solid #989898; border-style:inset; }
+
+/* ============= */
+/* = Notifiers = */
+/* ============= */
+
+#notifications {
+ height: 32px;
+ position: absolute;
+ top:10px; left: 650px;
+}
+.nav-ajax-update {
+ width: 44px;
+ height: 32px;
+ background: transparent url('notifications.png') 0px 0px no-repeat;
+ color: #efefef;
+ font-weight: bold;
+ font-size: 0.8em;
+ padding-top: 0.5em;
+ float: left;
+ padding-left: 11px;
+ display: none;
+}
+#net-update { background-position: 0px 0px; }
+#mail-update { background-position: 0px -42px; }
+#notify-update { background-position: 0px -84px; }
+#home-update { background-position: 0px -126px; }
+
+#lang-select-icon {
+ cursor: pointer;
+ position: absolute;
+ left: 5px;
+ top: 5px;
+}
+
+#language-selector {
+ position: absolute;
+ top: 0;
+ left: 16px;
+}
+
+/* =================== */
+/* = System Messages = */
+/* =================== */
+
+#sysmsg_info, #sysmsg {
+ position:fixed;
+ bottom: 0px; right:20%;
+ -moz-box-shadow: 7px 7px 12px #434343;
+ -webkit-box-shadow: 7px75px 12px #434343;
+ box-shadow: 7px 7px 10px #434343;
+ padding: 10px;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+ -webkit-border-radius: 5px 5px 0px 0px;
+ -moz-border-radius: 5px 5px 0px 0px;
+ border-radius: 5px 5px 0px 0px;
+ border: 1px solid #da2c2c;
+ border-bottom:0px;
+ padding-bottom: 50px;
+ z-index: 1000;
+ color: #efefef;
+ font-style: bold;
+}
+
+#sysmsg_info br,
+#sysmsg br {
+ display:block;
+ margin:2px 0px;
+ border-top: 1px solid #dddddd;
+}
+
+/* ================= */
+/* = Aside/Sidebar = */
+/* ================= */
+
+aside {
+ position: absolute;
+ width: 260px;
+ right: 11%;
+ font-size: 0.8em;
+ font-style: bold;
+}
+
+aside a{
+ padding-bottom: 5px;
+
+}
+
+.vcard {
+ font-size: 1em;
+ font-variant:small-caps;
+}
+
+.marital {
+ font-size: 1em;
+ font-variant:small-caps;
+}
+
+.homepage-label {
+ font-size: 1em;
+ font-variant:small-caps;
+}
+
+.vcard .fn {
+ font-size: 1.4em;
+ font-weight: bold;
+ border-bottom: none;
+ padding-top: 10px;
+}
+
+.vcard #profile-photo-wrapper {
+ margin: 10px 0px;
+ padding: 12px;
+ width: 175px;
+ background-color: #f3f3f3;
+ border: 1px solid #dddddd;
+ -moz-box-shadow: 3px 3px 4px #959494;
+ -webkit-box-shadow: 3px 3px 4px #959494;
+ box-shadow: 3px 3px 4px #959494;
+}
+
+aside h4 { font-size: 1.3em; }
+
+aside #viewcontacts {
+ text-align: center;
+ font-weight: bold;
+ font-variant:small-caps;
+ font-size: 1.1em;
+ padding-top: 5px;
+}
+
+#viewcontacts a{
+ color: #898989;
+}
+
+#profile-extra-links ul { margin-left: 0px; padding-left: 0px; list-style: none; }
+
+#dfrn-request-link {
+ -moz-box-shadow:inset 0px 1px 0px 0px #a65151;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #a65151;
+ box-shadow:inset 0px 1px 0px 0px #a65151;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #d60808), color-stop(1, #b20202) );
+ background:-moz-linear-gradient( center top, #d60808 5%, #b20202 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d60808', endColorstr='#b20202');
+ background-color:#d60808;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ border:1px solid #fc5656;
+ display:inline-block;
+ color:#f0e7e7;
+ font-family:Trebuchet MS;
+ font-size:19px;
+ font-weight:bold;
+ text-align: center;
+ padding:10px;
+ width: 185px;
+ text-decoration:none;
+ text-shadow:1px 1px 0px #b36f6f;
+}
+
+#dfrn-request-link:hover {
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+}
+
+#dfrn-request-link:active {
+ position:relative;
+ top:1px;
+}
+
+#dfrn-request-intro {
+ width: 600px;
+}
+
+#netsearch-box {
+ background-color: #f6f6f6;
+ padding: 10px 10px 10px 20px;
+}
+
+h3#search:before {
+ content: url("search.png");
+ padding-right: 10px;
+ vertical-align: middle;
+}
+
+#network-new-link {
+ background-color: #f3f3f3;
+ border: 1px solid #cdcdcd;
+ margin-bottom: 10px;
+ -webkit-border-radius: 5px 5px 5px 5px;
+ -moz-border-radius: 5px 5px 5px 5px;
+ border-radius: 5px 5px 5px 5px;
+}
+
+#group-sidebar {
+ vertical-align: middle;
+ margin: auto;
+ margin-top: 20px;
+ padding-bottom: 10px;
+}
+
+#sidebar-group-list {
+ margin-left: 30px;
+ margin-right: 30px;
+}
+
+#sidebar-group-list > a{
+ padding-bottom: 10px;
+}
+
+.widget {
+ margin-top: 20px;
+ -moz-box-shadow: 1px 2px 6px 0px #959494;
+ -webkit-box-shadow: 1px 2px 6px 0px #959494;
+ box-shadow: 1px 2px 6px 0px #959494;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #f8f8f8), color-stop(1, #f6f6f6) );
+ background:-moz-linear-gradient( center top, #f8f8f8 5%, #f6f6f6 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8', endColorstr='#f6f6f6');
+ background-color:#f8f8f8;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ border:1px solid #eee;
+ color:#e6e6e6;
+ text-shadow:-1px 0px 0px #bdbdbd;
+ border: 1px solid #cdcdcd;
+}
+
+#sidebar-new-group {
+ padding:7px;
+ width: 165px;
+ margin: auto;
+ margin-left: 40px;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ display:inline-block;
+ color:#efefef;
+ text-decoration:none;
+ text-align: center;
+}
+
+#sidebar-new-group:hover {
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+}
+
+#sidebar-new-group:active {
+ position:relative;
+ top:1px;
+}
+
+#sidebar-new-group a {
+ color: #efefef;
+ font-size: 14px;
+ text-align: center;
+ margin: auto;
+}
+
+ul .sidebar-group-li{
+ list-style: none;
+ font-size: 1.2em;
+ padding-bottom: 5px;
+}
+
+ul .sidebar-group-li img{
+ display: none;
+}
+
+.widget h3{
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #f0edf0), color-stop(1, #e2e2e2) );
+ background:-moz-linear-gradient( center top, #f0edf0 5%, #e2e2e2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f0edf0', endColorstr='#e2e2e2');
+ background-color:#f0edf0;
+ -moz-border-radius:5px 5px 0px 0px;
+ -webkit-border-radius:5px 5px 0px 0px;
+ border-radius:5px 5px 0px 0px;
+ border:1px solid #e2e2e2;
+ border-bottom: 1px solid #cdcdcd;
+ padding-top:5px;
+ padding-bottom: 5px;
+ vertical-align: baseline;
+ text-align: center;
+ text-shadow:-1px 0px 0px #bdbdbd;
+}
+
+#group-sidebar h3:before{
+ content: url("groups.png");
+ padding-right: 10px;
+ vertical-align: middle;
+}
+
+#saved-search-list{
+ margin-top: 15px;
+ padding-bottom: 20px;
+}
+
+.saved-search-li {
+ list-style: none;
+ font-size: 1.2em;
+}
+
+.saved-search-li .icon {
+ margin-right: 5px;
+}
+
+/**
+* contacts block
+*/
+.contact-block-img {
+ width: 42px;
+ height: 42px;
+ padding-right: 2px;
+}
+.contact-block-div {
+ float: left;
+}
+
+.contact-block-textdiv { width: 150px; height: 34px; float: left; }
+#contact-block-end { clear: both; }
+
+/* ======= */
+/* = Jot = */
+/* ======= */
+
+#profile-jot-text_tbl { margin-bottom: 10px; }
+#profile-jot-text_ifr { width: 99.9%!important }
+#profile-jot-submit-wrapper {
+}
+
+#profile-jot-perms, #profile-jot-submit {
+ width: 60px;
+ font-size: 12px;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ display:inline-block;
+ color:#efefef;
+ text-decoration:none;
+ text-align: center;
+}
+
+#profile-jot-perms {
+ width: 30px;
+ overflow: hidden;
+ border: 0px;
+ margin-left:5px;
+}
+
+#jot-perms-perms .icon {
+ height: 1px;
+}
+
+#profile-jot-submit {
+ float: left;
+ margin-right:5px;
+ border: 0px;
+ margin-top: 0px;
+ margin-left: -30px;
+}
+
+#profile-jot-perms:hover, #profile-jot-submit:hover {
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+}
+#profile-jot-perms:active, #profile-jot-submit:active {
+ position:relative;
+ top:1px;
+}
+
+#character-counter {
+ /*float: left; padding: 8px 10px;*/
+ position: absolute: right: 100px; top:100px;
+}
+#profile-rotator-wrapper {
+ float: right;
+}
+
+.jot-tool {
+ float: left;
+ margin-right: 5px;
+}
+#profile-jot-tools-end,
+#profile-jot-banner-end { clear: both; }
+
+#profile-jot-email-wrapper {
+ margin: 10px 10% 0px 10%;
+ border: 1px solid #eeeeee;
+ border-bottom: 0px;
+}
+#profile-jot-email-label { background-color: #555753; color: #ccccce; padding: 5px;}
+#profile-jot-email { margin: 5px; width: 98%; }
+
+#profile-jot-networks {
+ margin: 0px 10%;
+ border: 1px solid #eeeeee;
+ border-top: 0px;
+ border-bottom: 0px;
+ padding: 5px;
+}
+#profile-jot-acl-wrapper {
+ margin: 0px 10px;
+ border: 1px solid #eeeeee;
+ border-top: 0px;
+ display:block!important;
+}
+#group_allow_wrapper,
+#group_deny_wrapper,
+#acl-permit-outer-wrapper { width: 47%; float: left; }
+
+#contact_allow_wrapper,
+#contact_deny_wrapper,
+#acl-deny-outer-wrapper { width: 47%; float: right; }
+
+#acl-permit-text {background-color: #555753; color: #ccccce; padding: 5px; float: left;}
+#jot-public {background-color: #555753; color: #ff0000; padding: 5px; float: left;}
+#acl-deny-text {background-color: #555753; color: #ccccce; padding: 5px; float: left;}
+
+#acl-permit-text-end,
+#acl-deny-text-end { clear: both; }
+#profile-jot-wrapper {
+ margin-top: 0px;
+ padding-top: 0px;
+}
+
+profile-jot-banner-wrapper {
+ padding: 0px;
+ margin: 0px;
+}
+
+.contact-h4 {
+ font-size: 1.2em;
+}
+
+/* ======== */
+/* = Tabs = */
+/* ======== */
+
+.tabs-wrapper {
+ width: 450px;
+ list-style: none;
+ padding: 10px;
+ margin: 0px 0px 10px 0px;
+ border-bottom: 1px solid #efefef;
+}
+.tabs-wrapper li { display: inline;}
+
+.tabs {
+ padding: 5px 10px 5px 10px;
+ margin-right: 5px;
+ font-style: bold;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ color:#efefef;
+ text-decoration:none;
+ text-align: center;
+}
+
+.tabs:hover {
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+ color:#efefef;
+ padding: 5px 10px 5px 10px;
+ margin-right: 5px;
+}
+.tabs:active {
+ position:relative;
+ top:1px;
+ color:#efefef;
+ padding: 5px 10px 5px 10px;
+ margin-right: 5px;
+}
+
+/* ========= */
+/* = Posts = */
+/* ========= */
+
+.wall-item-outside-wrapper {
+ margin-top: 50px;
+}
+.wall-item-outside-wrapper-end { clear: both;}
+.wall-item-content-wrapper { position: relative; max-width: 95%; }
+.wall-item-photo-menu { display: none;}
+.wall-item-photo-menu-button {
+ display:none;
+ text-indent: -99999px;
+ background: #eeeeee url("menu-user-pin.png") no-repeat 75px center;
+ position: absolute;
+ overflow: hidden;
+ height: 20px; width: 90px;
+ top: 85px; left: -1px;
+ -webkit-border-radius: 0px 0px 5px 5px;
+ -moz-border-radius: 0px 0px 5px 5px;
+ border-radius: 0px 0px 5px 5px;
+}
+
+.wall-item-info { float: left; width: 140px; }
+.wall-item-photo-wrapper {
+ width: 80px; height: 80px;
+ position: relative;
+ padding: 5px;
+ background-color: #eeeeee;
+ border: 1px solid #dddddd;
+ -moz-box-shadow: 3px 3px 4px #959494;
+ -webkit-box-shadow: 3px 3px 4px #959494;
+ box-shadow: 3px 3px 4px #959494;
+}
+
+.wall-item-tools {
+ filter: alpha(opacity=60);
+ opacity: 0.7;
+ -webkit-transition: all 0.25s ease-in-out;
+ -moz-transition: all 0.25s ease-in-out;
+ -o-transition: all 0.25s ease-in-out;
+ -ms-transition: all 0.25s ease-in-out;
+ transition: all 0.25s ease-in-out;
+ margin-left: 140px;
+ margin-top: 10px;
+ padding-bottom: 6px;
+}
+
+.wall-item-tools:hover {
+ filter: alpha(opacity=100);
+ opacity: 1;
+ -webkit-transition: all 0.25s ease-in-out;
+ -moz-transition: all 0.25s ease-in-out;
+ -o-transition: all 0.25s ease-in-out;
+ -ms-transition: all 0.25s ease-in-out;
+ transition: all 0.25s ease-in-out;
+ margin-left: 140px;
+}
+
+.wall-item-outside-wrapper.comment .wall-item-tools {
+ margin: 5px 5px 10px 60px;
+ float: left;
+}
+
+.wall-item-like-buttons {
+ float: left;
+}
+.wall-item-like-buttons a.icon {
+ float: left;
+ margin-right: 5px;
+ display: inline;
+}
+.wall-item-links-wrapper {
+ width: 20px;
+ float: left;
+}
+.wall-item-delete-wrapper {
+ float: left;
+}
+.wall-item-links-wrapper a.icon {
+ float: left;
+ margin-right: 5px;
+ display: inline;
+}
+.pencil {
+ float: left;
+}
+
+.star-item {
+ margin-left: 5px;
+ margin-right: 2px;
+ float: left;
+}
+.wall-item-title { font-size: 1.2em; font-weight: bold;}
+.wall-item-body { margin-left: 140px; padding-right: 20px; }
+.wall-item-body p {
+ max-width: 600px;
+ font-size: 0.8em;
+}
+.wall-item-lock-wrapper { float: right; }
+.wall-item-dislike,
+.wall-item-like,
+.wall-item-author {
+ clear: left;
+ font-size: 0.9em;
+ margin: 4px 0px 0px 140px;
+ font-variant:small-caps;
+}
+
+.wall-item-author a {
+ color: #898989;
+}
+
+.wall-item-ago { display: inline; padding-left: 10px; color: #898989;}
+.wall-item-wrapper-end { clear:both; }
+.wall-item-location {
+ margin-top:5px;
+ width: 100px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ -o-text-overflow: ellipsis;
+}
+
+.wall-item-location .icon { float: left; }
+.wall-item-location > a {
+ margin-left: 25px;
+ font-size: 0.9em;
+ display: block;
+ font-variant:small-caps;
+ color: #898989;
+}
+
+.wall-item-location .smalltext { margin-left: 25px; font-size: 0.9em; display: block;}
+.wall-item-location > br { display: none; }
+.wall-item-conv a{
+ font-size: 0.9em;
+ color: #898989;
+ font-variant:small-caps;
+}
+
+.wallwall .wwto {
+ left: -10px;
+ margin: 0;
+ position: absolute;
+ top: 65px;
+ width: 30px;
+ z-index: 10001;
+ width: 30px;
+ height: 30px;
+}
+
+.wallwall .wwto img { width: 30px!important; height: 30px!important;}
+.wallwall .wall-item-photo-end { clear: both; }
+.wall-item-arrowphoto-wrapper {
+ position: absolute;
+ left: 20px;
+ top: 70px;
+ z-index: 10002;
+}
+
+.wall-item-photo-menu {
+ min-width: 92px;
+ color: #2e3436;
+ border-top: 0px;
+ background: #eeeeee;
+ border-right: 1px solid #dddddd;
+ border-left: 1px solid #dddddd;
+ border-bottom: 1px solid #dddddd;
+ position: absolute;
+ left: -2px; top: 101px;
+ display: none;
+ z-index: 10000;
+ -webkit-border-radius: 0px 5px 5px 5px;
+ -moz-border-radius: 0px 5px 5px 5px;
+ border-radius: 0px 5px 5px 5px;
+ -moz-box-shadow: 3px 3px 4px #959494;
+ -webkit-box-shadow: 3px 3px 4px #959494;
+ box-shadow: 3px 3px 4px #959494;
+}
+
+.wall-item-photo-menu-button {
+ border-right: 1px solid #dddddd;
+ border-left: 1px solid #dddddd;
+ border-bottom: 1px solid #dddddd;
+ -moz-box-shadow: 3px 3px 4px #959494;
+ -webkit-box-shadow: 3px 3px 4px #959494;
+ box-shadow: 3px 3px 4px #959494;
+}
+
+.fakelink wall-item-photo-menu-button {
+ -webkit-border-radius: 0px 5px 5px 5px;
+ -moz-border-radius: 0px 5px 5px 5px;
+ border-radius: 0px 5px 5px 5px;
+ -moz-box-shadow: 3px 3px 4px #959494;
+ -webkit-box-shadow: 3px 3px 4px #959494;
+ box-shadow: 3px 3px 4px #959494;
+}
+
+.wall-item-photo-menu ul { margin:0px; padding: 0px; list-style: none }
+.wall-item-photo-menu li a { white-space: nowrap; display: block; padding: 5px 2px; color: #2e3436; }
+.wall-item-photo-menu li a:hover {
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+ order-bottom: none;
+}
+
+.icon.drop,
+.icon.drophide { float: left; }
+#item-delete-selected { overflow: auto; width: 100%;}
+.wall-item-outside-wrapper {
+ max-width: 90%;
+ border-bottom: 1px solid #dedede;
+ margin-top: 20px;
+}
+
+/* ============ */
+/* = Comments = */
+/* ============ */
+
+ .ccollapse-wrapper {
+ font-size: 0.9em;
+ color: #898989;
+ margin-left: 80px;
+ font-variant:small-caps;
+}
+
+.wall-item-outside-wrapper.comment { margin-left: 80px; }
+.wall-item-outside-wrapper.comment .wall-item-photo { width: 40px!important; height: 40px!important;}
+.wall-item-outside-wrapper.comment .wall-item-photo-wrapper {width: 40px; height: 40px; }
+.wall-item-outside-wrapper.comment .wall-item-photo-menu-button {
+ width: 50px;
+ top: 45px;
+ background-position: 35px center;
+}
+.wall-item-outside-wrapper.comment .wall-item-info { width: 60px; }
+.wall-item-outside-wrapper.comment .wall-item-body { margin-left: 60px; max-width: 600px;}
+.wall-item-outside-wrapper.comment .wall-item-author { margin-left: 60px;}
+
+.wall-item-outside-wrapper.comment .wall-item-photo-menu {
+ min-width: 50px;
+ top: 60px;
+}
+.icollapse-wrapper {
+ font-size: 0.9em;
+ color: #898989;
+ font-variant:small-caps;
+}
+
+.comment-wwedit-wrapper,
+.comment-edit-wrapper { margin: 30px 0px 0px 80px;}
+.comment-wwedit-wrapper img,
+.comment-edit-wrapper img { width: 20px; height: 20px; }
+.comment-edit-photo-link { float: left; width: 40px;}
+.comment-edit-text-empty {
+ width: 80%;
+ height: 20px;
+ border: 0px;
+ color: #babdb6;
+ -webkit-transition: all 0.5s ease-in-out;
+ -moz-transition: all 0.5s ease-in-out;
+ -o-transition: all 0.5s ease-in-out;
+ -ms-transition: all 0.5s ease-in-out;
+ transition: all 0.5s ease-in-out;
+}
+.comment-edit-text-empty:hover { color: #999999;}
+.comment-edit-text-full { width: 80%; height: 6em;
+ -webkit-transition: all 0.5s ease-in-out;
+ -moz-transition: all 0.5s ease-in-out;
+ -o-transition: all 0.5s ease-in-out;
+ -ms-transition: all 0.5s ease-in-out;
+ transition: all 0.5s ease-in-out;
+}
+.comment-edit-submit-wrapper { width: 80%; margin-left: 40px; text-align: right; }
+.comment-edit-submit {
+ height: 22px;
+ background-color: #a2a2a2;
+ color: #eeeeec;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ border: 0px;
+}
+
+.comment-edit-submit:hover {
+ background-color: #b20202;
+}
+
+.comment-edit-submit:active {
+ background-color: #b20202;
+}
+
+#item-delete-selected-desc {
+ color: #898989;
+}
+
+/**
+ * item text style
+ **/
+.wall-item-body code {
+ border-color: #CCCCCC;
+ border-style: solid;
+ border-width: 1px 1px 1px 10px;
+ display: block;
+ padding-left: 10px;
+}
+
+/* =========== */
+/* = Profile = */
+/* =========== */
+
+.advanced-profile-content {
+ margin-top: 5px;
+ margin-bottom: 10px;
+ margin-left: 30px;
+ width: 60%;
+}
+
+.advanced-profile-label {
+ margin-top: 10px;
+ margin-bottom: 0px;
+ padding-bottom: 5px;
+ font-size: 18px;
+ font-variant:small-caps;
+}
+
+div[id$="wrapper"] { height: 100%;}
+div[id$="wrapper"] br { clear: left; }
+#advanced-profile-with { margin-left: 20px;}
+
+#profile-listing-desc {
+ float: left;
+ display: inline;
+ padding: 5px 10px 5px 10px;
+ width: 150px;
+ margin-bottom:20px;
+ margin-top: 20px;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ display:inline-block;
+ color:#efefef;
+ font-style: bold;
+ text-align: center;
+}
+
+#profile-listing-desc:hover {
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+}
+
+#profile-listing-desc:active {
+ background-color: #b20202;
+ position:relative;
+ top:1px;
+}
+
+#profile-listing-desc a {
+ color: #efefef;
+}
+
+#profile-listing-new-link-wrapper {
+ float: left;
+ display: inline;
+ width: 130px;
+ margin-left:5px;
+ margin-top: 20px;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ padding: 5px 10px 5px 10px;
+ font-style: bold;
+ color:#efefef;
+ text-align: center;
+}
+
+#profile-listing-new-link-wrapper:hover {
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+}
+
+#profile-listing-new-link-wrapper:active {
+ background-color: #b20202;
+ position:relative;
+ top:1px;
+}
+
+#profile-listing-new-link-wrapper a {
+ color: #efefef;
+}
+
+.profile-listing-name {
+ font-size: 1em;
+ font-variant: small-caps;
+}
+.profile-listing-name a {
+ color: #898989;
+}
+
+.profile-listing-visible {
+ width: 90px;
+ margin-bottom:20px;
+ margin-top: 10px;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ padding: 5px 10px 5px 10px;
+ margin-right: 5px;
+ color:#efefef;
+ text-align: center;
+}
+
+.profile-listing-visible:hover {
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+}
+
+.profile-listing-visible:active {
+ background-color: #b20202;
+ position:relative;
+ top:1px;
+}
+
+.profile-listing-visible a {
+ color: #efefef;
+}
+
+.profile-listing-photo {
+ padding: 5px;
+ background-color: #efefef;
+ border: 2px dotted #eeeeee;
+ -moz-box-shadow: 3px 3px 4px #959494;
+ -webkit-box-shadow: 3px 3px 4px #959494;
+ box-shadow: 3px 3px 4px #959494;
+}
+
+#profile-edit-links li {
+ display: inline;
+ width: 150px;
+ margin-bottom:20px;
+ margin-top: 20px;
+ background-color: #a2a2a2;
+ color: #eeeeec;
+ padding: 5px 10px 5px 10px;
+ margin-right: 5px;
+ font-style: bold;
+ -webkit-border-radius: 5px 5px 5px 5px;
+ -moz-border-radius: 5px 5px 5px 5px;
+ border-radius: 5px 5px 5px 5px;
+}
+
+#profile-edit-links li a {
+ color: #efefef;
+}
+
+#profile-edit-links li:hover {
+ background-color: #b20202;
+}
+
+#profile-edit-links li:active {
+ background-color: #b20202;
+}
+
+#cropimage-wrapper { float:left; }
+#crop-image-form { clear:both; }
+
+.profile-match-name a{
+ color: #999;
+ font-variant: small-caps;
+ font-size: 1em;
+}
+
+.profile-match-name a:hover {
+ color: #999;
+}
+
+.profile-match-wrapper {
+ width: 300px;
+ padding: 5px;
+ margin-bottom:10px;
+ background-color: #f6f6f6;
+ border: 1px solid #dddddd;
+ -moz-box-shadow: 3px 3px 4px #959494;
+ -webkit-box-shadow: 3px 3px 4px #959494;
+ box-shadow: 3px 3px 4px #959494;
+}
+
+/* ========== */
+/* = Photos = */
+/* ========== */
+
+#side-bar-photos-albums li {
+ font-size: 1.2em;
+}
+
+#photo-top-links {
+ width: 130px;
+ margin-bottom:20px;
+ margin-top: 20px;
+ background-color: #a2a2a2;
+ color: #eeeeec;
+ padding: 5px 10px 5px 10px;
+ margin-right: 5px;
+ font-style: bold;
+ -webkit-border-radius: 5px 5px 5px 5px;
+ -moz-border-radius: 5px 5px 5px 5px;
+ border-radius: 5px 5px 5px 5px;
+}
+#photo-top-links a {
+ color: #efefef;
+}
+
+#photo-top-links:hover {
+ background-color: #b20202;
+}
+
+#photo-top-links:active {
+ background-color: #b20202;
+}
+
+.photo-album-image-wrapper,
+.photo-top-image-wrapper {
+ float: left;
+ margin: 0px 10px 10px 0px;
+ border: 1px solid #dddddd;
+ -moz-box-shadow: 3px 3px 6px #959494;
+ -webkit-box-shadow: 3px 3px 6px #959494;
+ box-shadow: 3px 3px 6px #959494;
+ background-color: #efefef;
+ padding: 10px;
+ padding-bottom: 30px;
+ position:relative;
+}
+
+#photo-photo { max-width: 100% }
+#photo-photo img { max-width: 100% }
+
+.photo-top-image-wrapper a:hover,
+#photo-photo a:hover,
+.photo-album-image-wrapper a:hover {
+ border-bottom: 0px;
+}
+
+.photo-top-photo,
+.photo-album-photo {}
+
+.photo-top-album-name {
+ position: absolute;
+ bottom: 0px;
+ padding: 0px 5px;
+ font-weight: bold;
+ font-stretch:semi-expanded;
+ font-variant:small-caps;
+}
+
+.photo-top-album-name a{
+ text-align: center;
+ color: #6e6e6e;
+}
+.caption {
+ position: absolute;
+ bottom: 0px;
+ margin: 0px 5px;
+ text-align: center;
+ color: #6e6e6e;
+ font-size: 0.9em;
+ font-variant: small-caps;
+}
+
+#photo-photo{
+ position: relative;
+ float:left;
+ border: 1px solid #dddddd;
+ -moz-box-shadow: 3px 3px 6px #959494;
+ -webkit-box-shadow: 3px 3px 6px #959494;
+ box-shadow: 3px 3px 6px #959494;
+ background-color: #efefef;
+ padding: 10px;
+}
+
+#photo-caption {
+ margin-top: 10px;
+ color: #6E6E6E;
+ font-variant:small-caps;
+ font-size: 1.1em;
+}
+
+#photo-photo-end { clear: both; }
+#photo-prev-link,
+#photo-next-link{
+ position: absolute;
+ width:10%;
+ height: 100%;
+ background-color: rgba(255,255,255,0.2);
+ opacity: 0;
+ -webkit-transition: all 0.2s ease-in-out;
+ -moz-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ -ms-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+ background-position: center center;
+ background-repeat: no-repeat;
+}
+
+#photo-prev-link { left:0px; top:0px; background-image: url('prev.png'); }
+#photo-next-link { right:0px; top:0px; background-image: url('next.png');}
+#photo-prev-link a,
+#photo-next-link a{
+ display: block; width: 100%; height: 100%;
+ overflow: hidden;
+ text-indent: -900000px;
+}
+
+#photo-prev-link:hover,
+#photo-next-link:hover {
+ opacity: 1;
+ -webkit-transition: all 0.2s ease-in-out;
+ -moz-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ -ms-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+}
+
+#photo-next-link .icon,
+#photo-prev-link .icon { display: none }
+
+#photos-upload-spacer,
+#photos-upload-new-wrapper,
+#photos-upload-exist-wrapper { margin-bottom: 1em; }
+#photos-upload-existing-album-text,
+#photos-upload-newalbum-div {
+ background-color: #fff;
+ color: #909090;
+ font-size: 1.2em;
+ padding: 3px 0px;
+ padding-left: 0px;
+ width: 300px;
+}
+
+#photos-upload-album-select,
+#photos-upload-newalbum { width: 400px; }
+
+#photos-upload-perms-menu {
+ width: 180px;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ padding: 7px;
+ text-align: center;
+ font-size: 0.9em;
+ color: #efefef;
+}
+
+#photos-upload-perms-menu:hover {
+ text-align: center;
+ font-size: 0.9em;
+ width: 180px;
+ padding: 7px;
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+}
+
+#photos-upload-perms-menu:active {
+ text-align: center;
+ font-size: 0.9em;
+ width: 180px;
+ padding: 7px;
+ background-color: #b20202;
+ position:relative;
+ top:1px;
+}
+
+#photos-upload-perms-menu a {
+ color: #efefef;
+}
+
+#photos-upload-perms-menu .icon {
+ display: none;
+}
+
+select[size], select[multiple], select[size][multiple] {
+ -webkit-appearance: listbox;
+ border: 2px solid #b0b0b0;
+ padding: 2px;
+ -webkit-border-radius: 3px 3px 3px 3px;
+ -moz-border-radius: 3px 3px 3px 3px;
+ border-radius: 3px 3px 3px 3px;
+}
+
+select {
+ -webkit-appearance: menulist;
+ box-sizing: border-box;
+ -webkit-box-align: center;
+ cursor: default;
+ border: 2px solid #b0b0b0;
+ padding: 2px;
+ -webkit-border-radius: 3px 3px 3px 3px;
+ -moz-border-radius: 3px 3px 3px 3px;
+ border-radius: 3px 3px 3px 3px;
+}
+
+keygen, select {
+ -webkit-border-radius: ;
+}
+
+input, textarea, keygen {
+ font-size: 0.9em;
+ letter-spacing: normal;
+ word-spacing: normal;
+ line-height: 1.2em;
+ text-transform: none;
+ text-indent: 0px;
+ text-shadow: none;
+ display: inline-block;
+ text-align: -webkit-auto;
+ border: 2px solid #b0b0b0;
+ padding: 2px;
+ -webkit-border-radius: 3px 3px 3px 3px;
+ -moz-border-radius: 3px 3px 3px 3px;
+ border-radius: 3px 3px 3px 3px;
+}
+
+.qq-upload-button {
+ background-color: none;
+ -moz-box-shadow:inset 0px 1px 0px 0px #a65151;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #a65151;
+ box-shadow:inset 0px 1px 0px 0px #a65151;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #d60808), color-stop(1, #b20202) );
+ background:-moz-linear-gradient( center top, #d60808 5%, #b20202 100%);
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d60808', endColorstr='#b20202');
+ background-color:#d60808;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ border:1px solid #fc5656;
+ display:inline-block;
+ color:#f0e7e7;
+ text-shadow:1px 1px 0px #b36f6f;
+ text-align: center;
+ font-size: 0.9em;
+ color: #efefef;
+ width: 91px;
+ padding: 7px;
+}
+
+.qq-upload-button:hover {
+ text-align: center;
+ font-size: 0.9em;
+ color: #efefef;
+ width: 91px;
+ padding: 7px;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) )!important;
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% )!important;
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808')!important;
+ background-color:#b20202;
+}
+
+.qq-upload-button:active {
+ text-align: center;
+ font-size: 0.9em;
+ color: #efefef;
+ background-color: #B20202;
+ width: 91px;
+ padding: 7px;
+ position:relative;
+ top:1px;
+}
+
+#album-edit-link {
+ width: 70px;
+ margin-bottom:20px;
+ margin-top: 20px;
+ background-color: #a2a2a2;
+ color: #eeeeec;
+ padding: 5px 10px 5px 10px;
+ margin-right: 5px;
+ font-style: bold;
+ -webkit-border-radius: 5px 5px 5px 5px;
+ -moz-border-radius: 5px 5px 5px 5px;
+ border-radius: 5px 5px 5px 5px;
+}
+
+#album-edit-link a {
+ color: #efefef;
+}
+
+#album-edit-link:hover {
+ background-color: #b20202;
+}
+
+#photo-edit-link-wrap {
+ margin-bottom: 10px;
+}
+
+#photo_edit_form {
+ width: 500px;
+ margin-top:20px;
+ text-align: left;
+}
+
+input#photo_edit_form {
+ display: block;
+ width: 100%;
+}
+
+#photo-edit-perms-menu {
+ float: left;
+ display: inline;
+ margin-top: 10px;
+ margin-right: 10px;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ padding: 4px;
+ color: #efefef;
+ text-align: center;
+ font-size: 0.9em;
+ width: 100px;
+}
+
+#photo-edit-perms-menu:hover {
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+}
+
+#photo-edit-perms-menu:active {
+ background-color: #b20202;
+ position:relative;
+ top:1px;
+}
+
+#photo-edit-perms-menu a {
+ color: #efefef;
+}
+
+#photo-edit-perms-menu .icon {
+ display: none;
+}
+
+#photo-edit-delete-button {
+ float: left;
+ display: inline;
+ margin-left: 190px;
+}
+
+#side-bar-photos-albums h3:before {
+ content: url("photography.png");
+ padding-right: 10px;
+ vertical-align: middle;
+}
+
+#side-bar-photos-albums li {
+ margin-bottom: 5px;
+}
+
+#photo-album-edit-wrapper {
+ margin-bottom: 10px;
+}
+
+/* ============ */
+/* = Messages = */
+/* ============ */
+
+#prvmail-wrapper, .mail-conv-detail, .mail-list-detail {
+ position: relative;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+ background-color: #fff;
+ -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
+ -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
+}
+
+#prvmail-wrapper:before, #prvmail-wrapper:after, .mail-conv-detail:before, .mail-conv-detail:after, .mail-list-detail:before, .mail-list-detail:after {
+ position: absolute;
+ width: 40%;
+ height: 10px;
+ content: ' ';
+ left: 12px;
+ bottom: 12px;
+ background: transparent;
+ -webkit-transform: skew(-5deg) rotate(-5deg);
+ -moz-transform: skew(-5deg) rotate(-5deg);
+ -ms-transform: skew(-5deg) rotate(-5deg);
+ -o-transform: skew(-5deg) rotate(-5deg);
+ transform: skew(-5deg) rotate(-5deg);
+ -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
+ -moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
+ z-index: -1;
+}
+
+#prvmail-wrapper:after, .mail-conv-detail:after, .mail-list-detail:after {
+ left: auto;
+ right: 12px;
+ -webkit-transform: skew(5deg) rotate(5deg);
+ -moz-transform: skew(5deg) rotate(5deg);
+ -ms-transform: skew(5deg) rotate(5deg);
+ -o-transform: skew(5deg) rotate(5deg);
+ transform: skew(5deg) rotate(5deg);
+}
+
+.prvmail-text {
+ width: 100%;
+}
+
+#prvmail-form input
+
+#prvmail-subject { width: 490px;; padding-left: 10px; font-size: 1.1em; font-style: bold;}
+#prvmail-subject .input{
+ border: none !important ;
+}
+
+#prvmail-subject-label {
+ font-variant:small-caps;
+}
+
+#prvmail-to {
+ padding-left: 10px;
+}
+#prvmail-to-label {
+ font-variant:small-caps;
+}
+
+#prvmail-message-label {
+ font-variant:small-caps;
+ font-size: 1em;
+}
+
+
+#prvmail-submit-wrapper { margin-top: 10px; }
+#prvmail-submit {
+ float: right;
+ margin-top: 0px;
+ margin-right: 90px;
+}
+
+#prvmail-upload {
+margin-left: 90px;
+}
+
+#prvmail-submit-wrapper > div {
+ margin-right: 5px;
+ float: left;
+}
+
+.mail-list-outside-wrapper {
+ margin-top: 20px;
+}
+
+.mail-list-sender {
+ float: left;
+ padding: 5px;
+ background-color: #efefef;
+ border: 2px dotted #eeeeee;
+ -moz-box-shadow: 3px 3px 4px #959494;
+ -webkit-box-shadow: 3px 3px 4px #959494;
+ box-shadow: 3px 3px 4px #959494;
+}
+
+.mail-list-detail {
+ margin-left: 100px;
+ width: 300px;
+ min-height: 70px;
+ padding: 20px;
+ padding-top:10px;
+ border: 1px solid #dddddd;
+ }
+
+.mail-list-sender-name {
+ font-size: 1.1em;
+ display: inline;
+ font-variant:small-caps;
+}
+
+.mail-list-date {
+ float: right;
+ clear: block;
+ display: inline;
+ font-size: 0.8em;
+ padding-left: 10px;
+ font-stretch:ultra-condensed;
+ font-variant:small-caps;
+}
+
+.mail-list-subject {
+ clear: block;
+ font-size: 1.5em;
+ padding-top: 20px;
+ padding-right: 50px;
+}
+
+.mail-list-delete-wrapper { float: left; margin-right:550px; }
+.mail-list-outside-wrapper-end {
+ clear: both;
+}
+
+.mail-conv-sender {float: left; margin: 0px 5px 5px 0px; }
+.mail-conv-sender-photo {
+ width: 64px;
+ height: 64px;
+ padding: 5px;
+ background-color: #efefef;
+ border: 1px solid #dddddd;
+ -moz-box-shadow: 3px 3px 4px #959494;
+ -webkit-box-shadow: 3px 3px 4px #959494;
+ box-shadow: 3px 3px 4px #959494;
+}
+
+.mail-conv-sender-name { float: left; font-variant:small-caps; font-style: bold; }
+.mail-conv-date { float: right; font-variant:small-caps; }
+.mail-conv-subject { clear: right; font-weight: bold; font-size: 1.2em }
+.mail-conv-body {
+ clear: both;
+}
+
+.mail-conv-detail {
+ width: 500px;
+ padding: 30px;
+ margin-left: 20px;
+ vertical-align: middle;
+ margin: auto;
+ border: 1px solid #dddddd;
+}
+.mail-conv-break { display: none; border: none;}
+.mail-conv-delete-wrapper { margin-top: 5px; width: 650px; text-align: right; }
+
+/* ================= */
+/* = Notifications = */
+/* ================= */
+
+#notification-show-hide-wrapper {
+ width: 160px;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ padding: 5px 10px 5px 10px;
+ margin-right: 5px;
+ margin-top: 10px;
+ font-style: bold;
+ color: #efefef;
+ text-align: center;
+}
+
+#notification-show-hide-wrapper:hover {
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+}
+
+#notification-show-hide-wrapper:active {
+ background-color: #b20202;
+ position:relative;
+ top:1px;
+}
+
+#notification-show-hide-wrapper a {
+ color: #efefef;
+}
+
+/* ============ */
+/* = Contacts = */
+/* ============ */
+
+#contacts-main {
+ margin-bottom: 10px;
+}
+
+.view-contact-wrapper,
+.contact-entry-wrapper {
+ float: left;
+ margin-right: 30px;
+ margin-bottom: 20px;
+ width: 88px;
+ height: 120px;
+ position: relative;
+}
+
+.contact-entry-direction-wrapper {position: absolute; top: 20px;}
+.contact-entry-edit-links { position: absolute; top: 60px; }
+#contacts-show-hide-link { margin-bottom: 20px; margin-top: 10px; font-weight: bold;}
+.contact-entry-photo {
+ padding: 3px;
+ background-color: #eeeeee;
+ border: 1px solid #dddddd;
+ -moz-box-shadow: 3px 3px 4px #959494;
+ -webkit-box-shadow: 3px 3px 4px #959494;
+ box-shadow: 3px 3px 4px #959494;
+}
+
+.contact-entry-name {
+ width: 100px;
+ overflow: hidden;
+ font: #999;
+ font-size: 12px;
+ text-align:center;
+ font-variant:small-caps;
+ font-weight: bold;
+ margin-top:5px;
+}
+
+.contact-entry-photo {
+ position: relative;
+}
+
+.contact-entry-edit-links .icon {
+ border: 1px solid #babdb6;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+ background-color: #ffffff;
+}
+
+#contact-edit-banner-name { font-size: 1.5em; margin-left: 30px; font-variant: small-caps; }
+#contact-edit-photo-wrapper {position: relative; float: left; padding: 20px;}
+#contact-edit-direction-icon { position: absolute; top: 60px; left:0px;}
+#contact-edit-nav-wrapper { margin-left: 210px; }
+#contact-edit-links { float: left; margin-top: 23px; }
+#contact-drop-links {/*position: absolute; top: 150px; left: 348px;*/}
+#contact-edit-nav-wrapper .icon {
+ border: 1px solid #babdb6;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+
+#contact-edit-nettype {
+ font-size: 1em;
+ font-variant: small-caps;
+ margin-left: 30px;
+ margin-bottom: 0px;
+ padding-bottom: 0px;
+}
+
+#contact-edit-poll-wrapper { margin-left: 50px; width: 300px;}
+#contact-edit-last-update-text { margin-bottom: 15px; padding-top: 20px; padding-left: 10px; font-size: 0.9em; max-width: 300px; }
+#contact-edit-last-updated { font-weight: bold; }
+#contact-edit-poll-text { display: inline; font-size: 0.9em; padding-left: 10px; }
+#contact-edit-end { clear: both; margin-bottom: 65px;}
+
+#contact-edit-update-now {
+ width: 80px;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ padding: 5px 10px 5px 10px;
+ margin-left: 125px;
+ margin-top: 10px;
+ font-style: bold;
+ color: #efefef;
+}
+
+#contact-edit-update-now:hover {
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+}
+
+#contact-edit-update-now:active {
+ background-color: #b20202;
+ position:relative;
+ top:1px;
+}
+
+#contact-edit-update-now a {
+ color: #efefef;
+}
+
+
+#contact-edit-profile-select-text > p {
+ font-size: 1em;
+}
+
+.contact-photo-menu-button {
+ position: absolute;
+ background-image: url("photo-menu.jpg");
+ background-position: top left;
+ background-repeat: no-repeat;
+ margin: 0px; padding: 0px;
+ width: 16px;
+ height: 16px;
+ top: 64px; left:0px;
+ overflow: hidden;
+ text-indent: 40px;
+ display: none;
+}
+
+#contact-edit-photo {
+ padding: 10px;
+ background-color: #f1f1f1;
+ border: 1px solid #dedede;
+ margin-bottom: 5px;
+ -moz-box-shadow: 5px 5px 8px #959494;
+ -webkit-box-shadow: 5px 5px 8px #959494;
+ box-shadow: 5px 5px 8px #959494;
+}
+.contact-photo-menu {
+ width: auto;
+ border: 1px solid #ddd;
+ background: #f1f1f1;
+ position: absolute;
+ left: 0px; top: 90px;
+ display: none;
+ z-index: 10000;
+ -moz-box-shadow: 3px 3px 5px #888;
+ -webkit-box-shadow: 3px 3px 5px #888;
+ box-shadow: 3px 3px 5px #888;
+}
+
+.contact-photo-menu ul { margin:0px; padding: 0px; list-style: none }
+.contact-photo-menu li a { display: block; padding: 3px; color: #626262; font-size: 1em; }
+.contact-photo-menu li a:hover {
+ color: #FFFFFF;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+ text-decoration: none;
+}
+
+.view-contact-photo {
+ padding: 5px;
+ background-color: #efefef;
+ border: 1px solid #dddddd;
+ -moz-box-shadow: 3px 3px 4px #959494;
+ -webkit-box-shadow: 3px 3px 4px #959494;
+ box-shadow: 3px 3px 4px #959494;
+}
+
+.view-contact-name {
+ font-variant: small-caps;
+}
+
+#div.side-link {
+ background-color: #efefef;
+ padding: 10px;
+ margin-top:20px;
+}
+
+#follow-sidebar {
+ margin-bottom: 20px;
+}
+
+#follow-sidebar h3:before {
+ content: url("user.png");
+ padding-right: 10px;
+ vertical-align: middle;
+}
+
+#follow-sidebar input[type="text"] {
+ margin-left: 30px;
+ margin-bottom: 10px;
+}
+
+#side-match-link {
+ width: 180px;
+ padding: 10px;
+ margin: auto;
+ margin-bottom: 20px;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ padding: 5px 10px 5px 10px;
+ color: #efefef;
+ font-size: 1.2em;
+ text-align: center;
+}
+
+#side-match-link:hover {
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+}
+
+#side-match-link:active {
+ background-color: #b20202;
+ position:relative;
+ top:1px;
+}
+
+#side-match-link a {
+ color: #efefef;
+}
+
+#side-invite-link {
+ width: 180px;
+ padding: 10px;
+ margin: auto;
+ margin-bottom: 20px;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ padding: 5px 10px 5px 10px;
+ color: #efefef;
+ font-size: 1.2em;
+ text-align: center;
+}
+
+#side-invite-link:hover {
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+}
+
+#side-invite-link:active {
+ background-color: #b20202;
+ position:relative;
+ top:1px;
+}
+
+#side-invite-link a {
+ color: #efefef;
+}
+
+#invite-message, #invite-recipients, #invite-recipient-text {
+ padding: 10px;
+}
+
+#side-follow-wrapper{
+ font-size: 1em;
+ font-weight: bold;
+ font-stretch:semi-expanded;
+ background-color: #f3f3f3;
+ border: 1px solid #cdcdcd;
+ padding: 10px;
+ margin-top: 20px;
+ -webkit-border-radius: 5px 5px 5px 5px;
+ -moz-border-radius: 5px 5px 5px 5px;
+ border-radius: 5px 5px 5px 5px;
+}
+
+#side-follow-wrapper label{
+ font-size: 1.1em;
+ font-variant: normal;
+}
+
+#contact-view-recent {
+ float: left;
+ width: 150px;
+ padding: 10px;
+ margin-bottom: 20px;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ padding: 5px 10px 5px 10px;
+ color: #efefef;
+ font-size: 1.2em;
+ text-align: center;
+}
+
+#contact-view-recent:hover{
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+}
+
+#contact-view-recent:active {
+ background-color: #b20202;
+ position:relative;
+ top:1px;
+}
+
+#contact-view-recent a {
+ color: #efefef;
+}
+
+#contact-suggest {
+ float: left;
+ margin-left: 10px;
+ width: 120px;
+ padding: 10px;
+ margin-bottom: 20px;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ padding: 5px 10px 5px 10px;
+ color: #efefef;
+ font-size: 1.2em;
+ text-align: center;
+}
+
+#contact-suggest:hover {
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+}
+
+#contact-suggest:active {
+ background-color: #b20202;
+ position:relative;
+ top:1px;
+}
+
+#contact-suggest a {
+ color: #efefef;
+}
+
+#contact-edit-info-wrapper {
+ clear: both;
+}
+
+/* ===================================== */
+/* = Register, Settings, Profile Forms = */
+/* ===================================== */
+
+#id_openid_url,
+.openid {
+ background: url(login-bg.gif) no-repeat;
+ background-position: 0 50%;
+ padding-left: 18px;
+ width: 385px;
+}
+
+#profile-tabs-wrapper {
+ padding-top: 10px;
+}
+
+/*#profile-tab-status-link {
+ padding: 5px 10px 5px 10px;
+ margin-right: 5px;
+ margin-top: 10px;
+ font-style: bold;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ color: #efefef;
+}*/
+
+#profile-tab-status-link:hover {
+ border: 0px;
+ padding: 5px 10px 5px 10px;
+ font-style: bold;
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+}
+
+#profile-tab-status-link:active {
+ border: 0px;
+ padding: 5px 10px 5px 10px;
+ font-style: bold;
+ background-color: #b20202;
+ position:relative;
+ top:1px;
+}
+
+#profile-tab-status-link a {
+ color: #efefef;
+}
+
+#uexport-link a {
+ color: #efefef;
+}
+
+#profile-tab-profile-link:hover {
+ border: 0px;
+ padding: 5px 10px 5px 10px;
+ font-style: bold;
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+}
+
+#profile-tab-profile-link:active {
+ border: 0px;
+ padding: 5px 10px 5px 10px;
+ font-style: bold;
+ background-color: #b20202;
+ position:relative;
+ top:1px;
+}
+
+#profile-tab-profile-link a {
+ color: #efefef;
+}
+
+#uexport-link {
+ width: 140px;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #7c7d7b), color-stop(1, #555753) );
+ background:-moz-linear-gradient( center top, #7c7d7b 5%, #555753 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7c7d7b', endColorstr='#555753');
+ background-color:#7c7d7b;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ padding: 5px 10px 5px 10px;
+ margin-bottom: 10px;
+}
+
+#uexport-link:hover {
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #555753), color-stop(1, #7c7d7b) );
+ background:-moz-linear-gradient( center top, #555753 5%, #7c7d7b 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#555753', endColorstr='#7c7d7b');
+ background-color:#555753;
+}
+
+#uexport-link:active {
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+ position:relative;
+ top:1px;
+}
+
+#settings-default-perms {
+ width: 160px;
+ text-align: center;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #7c7d7b), color-stop(1, #555753) );
+ background:-moz-linear-gradient( center top, #7c7d7b 5%, #555753 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7c7d7b', endColorstr='#555753');
+ background-color:#7c7d7b;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ padding: 5px 10px 5px 10px;
+ margin-bottom: 10px;
+}
+
+#settings-default-perms .fakelink {
+ color: #efefef;
+}
+
+#settings-default-perms:hover {
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #555753), color-stop(1, #7c7d7b) );
+ background:-moz-linear-gradient( center top, #555753 5%, #7c7d7b 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#555753', endColorstr='#7c7d7b');
+ background-color:#555753;
+}
+
+#settings-default-perms:active {
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+ position:relative;
+ top:1px;
+}
+
+#settings-nickname-desc {
+ width: 80%;
+ background-color: #efefef;
+ margin-bottom: 10px;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ padding: 5px;
+}
+
+#register-form div,
+#profile-edit-form div {
+ clear: both;
+}
+
+#register-form label,
+#profile-edit-form label {
+ width: 300px; float: left;
+}
+
+#register-form span,
+#profile-edit-form span {
+ color: #555753;
+ display:block;
+ margin-bottom: 20px;
+}
+
+.settings-submit-wrapper,
+.profile-edit-submit-wrapper { margin: 30px 0px;}
+.profile-listing { float: left; clear: both; margin: 20px 20px 0px 0px}
+
+#profile-edit-links ul { margin: 20px 0px; padding: 0px; list-style: none; }
+
+
+#register-sitename { display: inline; font-weight: bold;}
+
+/* ===================== */
+/* = Contacts Selector = */
+/* ===================== */
+
+#group-edit-wrapper {
+ margin-bottom: 10px;
+}
+
+#group-edit-name-wrapper {
+ margin-bottom: 0px;
+ display: inline;
+}
+#group-edit-submit-wrapper {
+ margin-bottom: 10px;
+ margin-right: 400px;
+ float: right;
+ display: inline;
+}
+#group-delete-icon-11 { position: absolute; left: 360px; top: 103px; }
+#group-edit-desc { margin: 10px 0xp; }
+#group-new-text {font-size: 1.1em;}
+#group-members,
+#prof-members {
+ width: 83%;
+ height: 200px;
+ overflow: auto;
+ border: none;
+ background-color: #f0edf0;
+ color: #555753;
+ border: 1px solid #ccc;
+ margin-bottom: 10px;
+ padding: 10px;
+}
+
+#group-all-contacts,
+#prof-all-contacts {
+ width: 83%;
+ height: 200px;
+ overflow: auto;
+ border: 1px solid #ccc;
+ background-color: #f0edf0;
+ padding: 10px;
+}
+
+#group-members h3,
+#group-all-contacts h3,
+#prof-members h3,
+#prof-all-contacts h3{
+ color: #555753;
+ margin: 0px;
+ padding: 5px;
+}
+
+#group-separator,
+#prof-separator { display: none;}
+
+/* ========== */
+/* = Events = */
+/* ========== */
+
+.clear { clear: both; }
+.eventcal {
+ float: left;
+ font-size: 20px;
+ padding: 20px;
+}
+
+.vevent {
+ position: relative;
+ width: 400px;
+ padding: 20px;
+ padding-top: 10px;
+ margin: 0 0px;
+ background-color: #fff;
+ -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
+ -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
+}
+
+.vevent:before, .vevent:after {
+ position: absolute;
+ width: 40%;
+ height: 10px;
+ content: ' ';
+ left: 12px;
+ bottom: 12px;
+ background: transparent;
+ -webkit-transform: skew(-5deg) rotate(-5deg);
+ -moz-transform: skew(-5deg) rotate(-5deg);
+ -ms-transform: skew(-5deg) rotate(-5deg);
+ -o-transform: skew(-5deg) rotate(-5deg);
+ transform: skew(-5deg) rotate(-5deg);
+ -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
+ -moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
+ z-index: -1;
+}
+
+.vevent:after {
+ left: auto;
+ right: 12px;
+ -webkit-transform: skew(5deg) rotate(5deg);
+ -moz-transform: skew(5deg) rotate(5deg);
+ -ms-transform: skew(5deg) rotate(5deg);
+ -o-transform: skew(5deg) rotate(5deg);
+ transform: skew(5deg) rotate(5deg);
+}
+
+.vevent .event-description {
+ margin-left: 10px;
+ margin-right: 10px;
+ text-align:center;
+ font-size: 1.2em;
+ font-weight:bolder;
+}
+
+ .vevent .event-location{
+ margin-left: 10px;
+ margin-right: 10px;
+ font-size: 1em;
+ font-style: oblique;
+ text-align: center;
+
+}
+
+.vevent .event-start, .vevent .event-end {
+ margin-left: 20px;
+ margin-right: 20px;
+ margin-bottom: 2px;
+ margin-top: 2px;
+ font-size: 0.9em;
+ font-variant: small-caps;
+ text-align: left;
+}
+
+#new-event-link{
+ width: 130px;
+ padding: 7px;
+ margin-bottom: 10px;
+ margin-left: 170px; ;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ color: #efefef;
+}
+
+#new-event-link:hover {
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+}
+
+#new-event-link:active {
+ background-color: #b20202;
+ position:relative;
+ top:1px;
+}
+
+#new-event-link a {
+ color: #efefef;
+ text-align: center;
+}
+
+.edit-event-link, .plink-event-link {
+ float: left;
+ margin-top: 4px;
+ margin-right: 4px;
+ margin-bottom: 15px;
+}
+
+.event-description:before {
+ content: url('calendar.png');
+ margin-right: 15px;
+ vertical-align: middle;
+}
+
+.event-start, .event-end {
+ margin-left: 10px;
+ width: 330px;
+}
+
+.event-start .dtstart, .event-end .dtend {
+ float: right;
+}
+
+.event-list-date {
+ color: #626262;
+ margin-bottom: 10px;
+ font-variant:small-caps;
+ font-stretch:condensed;
+}
+
+.prevcal, .nextcal {
+ float: left;
+ margin-left: 32px;
+ margin-right: 32px;
+ margin-top: 64px;
+}
+
+.event-calendar-end {
+ clear: both;
+}
+
+.calendar {
+ font-family: Helvetica, Arial, sans-serif;
+ padding: 10px;
+ background-color: #f1f1f1;
+ border: 1px solid #dedede;
+ margin-bottom: 10px;
+ -moz-box-shadow: 5px 5px 8px #959494;
+ -webkit-box-shadow: 5px 5px 8px #959494;
+ box-shadow: 5px 5px 8px #959494;
+}
+
+.calendar caption{
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #d60808), color-stop(1, #b20202) );
+ background:-moz-linear-gradient( center top, #d60808 5%, #b20202 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d60808', endColorstr='#b20202');
+ background-color: #b20202;
+ width: 300px;
+ padding: 10px;
+ color: #ffffff;
+ font-weight: bold;
+ text-align:center;
+ font-variant:small-caps;
+ -moz-box-shadow: 5px 2px 8px #959494;
+ -webkit-box-shadow: 5px 2px 8px #959494;
+ box-shadow: 5px 2px 8px #959494;
+}
+
+tr {
+ border: 1px solid #eeeeee;
+}
+
+.calendar td {
+ font-size: 14px;
+ text-align: center;
+ padding: 3px 0px;
+}
+
+.calendar td > a {
+ background-color: #cdcdcd;
+ padding: 2px;
+ color: #000;
+}
+
+.calendar th {
+ font-size: 16px;
+}
+
+.today {
+ font-weight: bold;
+ text-align: center;
+ background-color: #b20202;
+ color: #fff;
+}
+
+#event-start-text,
+#event-finish-text {
+ margin-top: 10px;
+ margin-bottom: 5px;
+}
+
+#event-nofinish-checkbox,
+#event-nofinish-text,
+#event-adjust-checkbox,
+#event-adjust-text,
+#event-share-checkbox {
+ float: left;
+}
+
+#event-datetime-break {
+ margin-bottom: 10px;
+}
+
+#event-nofinish-break,
+#event-adjust-break,
+#event-share-break {
+ clear: both;
+}
+
+#event-desc-text,
+#event-location-text {
+ margin-top: 10px;
+ margin-bottom: 5px;
+}
+
+#event-submit {
+ margin-top: 10px;
+}
+
+/* ============= */
+/* = Directory = */
+/* ============= */
+
+.directory-item {
+ float: left;
+ margin: 50px 50px 0px 0px;
+ padding: 10px;
+ background-color: #f1f1f1;
+ border: 1px solid #dedede;
+ margin-bottom: 5px;
+ -moz-box-shadow: 5px 5px 8px #959494;
+ -webkit-box-shadow: 5px 5px 8px #959494;
+ box-shadow: 5px 5px 8px #959494;
+}
+
+.directory-details {
+ font-size: 0.9em;
+ font-variant: small-caps;
+ width: 160px;
+}
+
+.directory-name {
+ font-size: 1em;
+ font-variant: small-caps;
+ width: 150px;
+}
+
+/* ========= */
+/* = Admin = */
+/* ========= */
+
+#adminpage {
+ width: 80%;
+}
+
+#pending-update {
+ float:right;
+ color: #ffffff;
+ font-weight: bold;
+ background-color: #FF0000;
+ padding: 0em 0.3em;
+}
+
+.admin.linklist {
+ border: 0px; padding: 0px;
+}
+
+.admin.link {
+ list-style-position: inside;
+ font-size: 1em;
+ padding: 3px;
+}
+
+#adminpage dl {
+ clear: left;
+ margin-bottom: 2px;
+ padding-bottom: 2px;
+ border-bottom: 1px solid black;
+}
+
+#adminpage dt {
+ width: 200px;
+ float: left;
+ font-weight: bold;
+}
+
+#adminpage dd {
+ margin-left: 200px;
+}
+#adminpage h3 {
+ border-bottom: 1px solid #898989;
+ margin-bottom: 5px;
+ margin-top: 10px;
+}
+
+#adminpage .submit {
+ clear:left;
+}
+
+#adminpage #pluginslist {
+ margin: 0px; padding: 0px;
+}
+
+#adminpage .plugin {
+ list-style: none;
+ display: block;
+ border: 1px solid #888888;
+ padding: 1em;
+ margin-bottom: 5px;
+ clear: left;
+}
+
+#adminpage .toggleplugin {
+ float:left;
+ margin-right: 1em;
+}
+
+#adminpage table {width:100%; border-bottom: 1p solid #000000; margin: 5px 0px;}
+#adminpage table th { text-align: left;}
+#adminpage td .icon { float: left;}
+#adminpage table#users img { width: 16px; height: 16px; }
+#adminpage table tr:hover { background-color: #eeeeee; }
+#adminpage .selectall { text-align: right; }
+
+/* =============== */
+/* = Form Fields = */
+/* =============== */
+
+.field {
+ margin-bottom: 5px;
+ padding-bottom: 10px;
+ overflow: auto;
+ width: 90%;
+}
+
+.field label {
+ float: left;
+ width: 200px;
+}
+
+.field input,
+.field textarea {
+ width: 400px;
+}
+.field textarea { height: 100px; }
+.field_help {
+ display: block;
+ margin-left: 100px;
+ color: #666666;
+}
+
+.field .onoff {
+ float: left;
+ width: 80px;
+}
+.field .onoff a {
+ display: block;
+ border:1px solid #c1c1c1;
+ background-image:url("../../../images/onoff.jpg");
+ background-repeat: no-repeat;
+ padding: 4px 2px 2px 2px;
+ height: 16px;
+ text-decoration: none;
+}
+.field .onoff .off {
+ border-color:#c1c1c1;
+ padding-left: 40px;
+ background-position: left center;
+ background-color: #cccccc;
+ color: #666666;
+ text-align: right;
+}
+
+.field .onoff .on {
+ border-color:#c1c1c1;
+ padding-right: 40px;
+ background-position: right center;
+ background-color: #b20202;
+ color: #FFFFFF;
+ text-align: left;
+}
+
+.hidden { display: none!important; }
+
+.field.radio .field_help { margin-left: 0px; }
+
+/* ========= */
+/* = Icons = */
+/* ========= */
+
+.icon {
+ display: block; width: 20px; height: 20px;
+ background-image: url('icons.png');
+}
+.starred {
+ background-image: url("star.png");
+ repeat: no-repeat;
+}
+.unstarred {
+ background-image: url("premium.png");
+ repeat: no-repeat;
+}
+
+
+.border {
+ border: 1px solid #c1c1c1;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+
+.article { background-position: -50px 0px;}
+.audio { background-position: -70px 0px;}
+.block { background-position: -90px 0px;}
+.drop { background-position: -110px 0px;}
+.drophide { background-position: -130px 0px;}
+.edit { background-position: -150px 0px;}
+.camera { background-position: -170px 0px;}
+.dislike { background-position: -190px 0px;}
+.like { background-position: -210px 0px;}
+.link { background-position: -230px 0px;}
+
+.globe { background-position: -50px -20px;}
+.noglobe { background-position: -70px -20px;}
+.no { background-position: -90px -20px;}
+.pause { background-position: -110px -20px;}
+.play { background-position: -130px -20px;}
+.pencil { background-position: -150px -20px;}
+.small-pencil { background-position: -170px -20px;}
+.recycle { background-position: -190px -20px;}
+.remote-link { background-position: -210px -20px;}
+.share { background-position: -230px -20px;}
+
+.tools { background-position: -50px -40px;}
+.lock { background-position: -70px -40px;}
+
+.unlock {
+ background-position: -90px -40px;
+ background-image: none;
+ width: 70px;
+ height: 20px;
+}
+
+.sharePerms {
+ background-image: url(icons.png);
+ width: 20px;
+ height: 20px;
+ margin: 2px 0px 2px 3px;
+ display: block;
+}
+
+.video { background-position: -110px -40px;}
+.youtube { background-position: -130px -40px;}
+
+.attach { background-position: -190px -40px;}
+.language { background-position: -210px -40px;}
+
+
+.on { background-position: -50px -60px;}
+.off { background-position: -70px -60px;}
+.prev { background-position: -90px -60px;}
+.next { background-position: -110px -60px;}
+
+.icon.dim { opacity: 0.3;filter:alpha(opacity=30); }
+
+.attachtype {
+ display: block; width: 20px; height: 23px;
+ background-image: url('../../../images/content-types.png');
+}
+
+.type-video { background-position: 0px 0px; }
+.type-image { background-position: -20px 0px; }
+.type-audio { background-position: -40px 0px; }
+.type-text { background-position: -60px 0px; }
+.type-unkn { background-position: -80px 0px; }
+
+/* ========== */
+/* = Footer = */
+/* ========== */
+
+.cc-license { margin-top: 100px; font-size: 0.7em; }
+footer { display: block; margin: 50px 20%; clear: both; }
+
+#profile-jot-text {
+ height: 20px;
+ color:#cccccc;
+ border: 1px solid #cccccc;
+}
+
+/* ======= */
+/* = ACL = */
+/* ======= */
+
+#photo-edit-perms-select,
+#photos-upload-permissions-wrapper,
+#profile-jot-acl-wrapper{
+ display:block!important;
+}
+
+#acl-wrapper {
+ width: 690px;
+ float:left;
+}
+#acl-search {
+ float:right;
+ background: #ffffff url("../../../images/search_18.png") no-repeat right center;
+ padding-right:20px;
+}
+#acl-showall {
+ float: left;
+ display: block;
+ font-size: 1em;
+ font-style: bold;
+ text-align: center;
+ padding: 3px;
+ margin-bottom: 5px;
+ background-color: #cccccc;
+ background-position: 7px 7px;
+ background-repeat: no-repeat;
+ padding: 5px;
+ -webkit-border-radius: 5px ;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ color: #999999;
+}
+#acl-showall.selected {
+ color: #fff;
+ background-color: #b20202;
+}
+
+#acl-list {
+ height: 210px;
+ border: 1px solid #cccccc;
+ background-color: #efefef;
+ clear: both;
+ margin-top: 30px;
+ overflow: auto;
+}
+
+#acl-list-content {
+ margin-left: 20px;
+}
+
+.acl-list-item {
+ display: block;
+ width: 150px;
+ height: 40px;
+ border: 1px solid #cccccc;
+ background-color: #fff;
+ margin: 5px;
+ float: left;
+ -moz-box-shadow: 2px 2px 3px #c1c1c1;
+ -webkit-box-shadow: 2px 2px 3px #c1c1c1;
+ box-shadow: 2px 2px 3px #c1c1c1;
+}
+.acl-list-item img{
+ width:30px;
+ height: 30px;
+ float: left;
+ margin: 5px;
+}
+
+.acl-list-item p {
+ color: #999;
+ height: 12px;
+ font-size: 0.7em;
+ margin: 0px;
+ padding: 2px 0px 1px;
+ overflow: hidden;
+}
+
+.acl-list-item a {
+ font-size: 10px;
+ display: block;
+ float: left;
+ color: #efefef;
+ background-color: #898989;
+ background-position: 3px 3px;
+ background-repeat: no-repeat;
+ margin-right: 5px;
+ -webkit-border-radius: 2px ;
+ -moz-border-radius: 2px;
+ border-radius: 2px;
+ padding: 3px;
+}
+
+#acl-wrapper a:hover {
+ text-decoration: none;
+ background-color:#b20202;
+}
+
+.acl-button-show.selected {
+ color: #efefef;
+ background-color: #b20202;
+}
+
+.acl-button-hide.selected {
+ color: #efefef;
+ background-color: #a2a2a2;
+}
+
+.acl-list-item.groupshow { border-color: #b20202; }
+.acl-list-item.grouphide { border-color: #a2a2a2; }
+
+/* ========================= */
+/* = Global Directory Link = */
+/* ========================= */
+
+#global-directory-link {
+ width: 130px;
+ padding: 7px;
+ margin-bottom: 10px;
+ margin-left: 0px;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ color: #efefef;
+ text-align: center;
+}
+
+#global-directory-link:hover {
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+}
+
+#global-directory-link:active {
+ background-color: #b20202;
+ position:relative;
+ top:1px;
+}
+
+#global-directory-link a {
+ color: #efefef;
+}
+
+#global-directory-link {
+ -webkit-padding-start: 0px;
+}
+
+a.active {
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+ color:#efefef;
+ padding: 5px 10px 5px 10px;
+ margin-right: 5px;
+} \ No newline at end of file
diff --git a/view/theme/testbubble/user.png b/view/theme/testbubble/user.png
new file mode 100644
index 000000000..df899e7e0
--- /dev/null
+++ b/view/theme/testbubble/user.png
Binary files differ
diff --git a/view/theme/testbubble/wall_item.tpl b/view/theme/testbubble/wall_item.tpl
new file mode 100644
index 000000000..b8af3685f
--- /dev/null
+++ b/view/theme/testbubble/wall_item.tpl
@@ -0,0 +1,51 @@
+<!-- test -->
+<div class="wall-item-outside-wrapper$indent" id="wall-item-outside-wrapper-$id" >
+ <div class="wall-item-content-wrapper$indent" id="wall-item-content-wrapper-$id" >
+ <div class="wall-item-info" id="wall-item-info-$id">
+ <div class="wall-item-photo-wrapper" id="wall-item-photo-wrapper-$id"
+ onmouseover="if (typeof t$id != 'undefined') clearTimeout(t$id); openMenu('wall-item-photo-menu-button-$id')"
+ onmouseout="t$id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$id\'); closeMenu(\'wall-item-photo-menu-$id\');',200)">
+ <a href="$profile_url" title="$linktitle" class="wall-item-photo-link" id="wall-item-photo-link-$id">
+ <img src="$thumb" class="wall-item-photo$sparkle" id="wall-item-photo-$id" style="height: 80px; width: 80px;" alt="$name" />
+ </a>
+ <span onclick="openClose('wall-item-photo-menu-$id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$id">menu</span>
+ <div class="wall-item-photo-menu" id="wall-item-photo-menu-$id">
+ <ul>
+ $item_photo_menu
+ </ul>
+ </div>
+ </div>
+ <div class="wall-item-photo-end"></div>
+ <div class="wall-item-location" id="wall-item-location-$id">{{ if $location }}<span class="icon globe"></span>$location {{ endif }}</div>
+ </div>
+ <div class="wall-item-lock-wrapper">$lock</div>
+ <div class="wall-item-content" id="wall-item-content-$id" >
+ <div class="wall-item-title" id="wall-item-title-$id">$title</div>
+ <div class="wall-item-title-end"></div>
+ <div class="wall-item-body" id="wall-item-body-$id" >$body</div>
+ </div>
+
+ <div class="wall-item-tools" id="wall-item-tools-$id">
+ $vote
+ $plink
+ $edpost
+ $star
+ $drop
+ </div>
+
+ <div class="wall-item-author">
+ <a href="$profile_url" title="$linktitle" class="wall-item-name-link"><span class="wall-item-name$sparkle" id="wall-item-name-$id" >$name</span></a>
+ <div class="wall-item-ago" id="wall-item-ago-$id">$ago</div>
+
+ </div>
+ </div>
+ <div class="wall-item-wrapper-end"></div>
+ <div class="wall-item-like" id="wall-item-like-$id">$like</div>
+ <div class="wall-item-dislike" id="wall-item-dislike-$id">$dislike</div>
+ <div class="wall-item-comment-wrapper" >
+ $comment
+ </div>
+</div>
+
+<div class="wall-item-outside-wrapper-end$indent" ></div>
+
diff --git a/view/theme/testbubble/wallwall_item.tpl b/view/theme/testbubble/wallwall_item.tpl
new file mode 100644
index 000000000..4fe677ab4
--- /dev/null
+++ b/view/theme/testbubble/wallwall_item.tpl
@@ -0,0 +1,51 @@
+<div class="wall-item-outside-wrapper$indent wallwall" id="wall-item-outside-wrapper-$id" >
+ <div class="wall-item-content-wrapper$indent" id="wall-item-content-wrapper-$id" >
+ <div class="wall-item-info wallwall" id="wall-item-info-$id">
+ <div class="wall-item-photo-wrapper wwto" id="wall-item-ownerphoto-wrapper-$id" >
+ <a href="$owner_url" title="$olinktitle" class="wall-item-photo-link" id="wall-item-ownerphoto-link-$id">
+ <img src="$owner_photo" class="wall-item-photo$osparkle" id="wall-item-ownerphoto-$id" style="height: 80px; width: 80px;" alt="$owner_name" /></a>
+ </div>
+ <div class="wall-item-arrowphoto-wrapper" ><img src="images/larrow.gif" alt="$wall" /></div>
+ <div class="wall-item-photo-wrapper wwfrom" id="wall-item-photo-wrapper-$id"
+ onmouseover="if (typeof t$id != 'undefined') clearTimeout(t$id); openMenu('wall-item-photo-menu-button-$id')"
+ onmouseout="t$id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$id\'); closeMenu(\'wall-item-photo-menu-$id\');',200)">
+ <a href="$profile_url" title="$linktitle" class="wall-item-photo-link" id="wall-item-photo-link-$id">
+ <img src="$thumb" class="wall-item-photo$sparkle" id="wall-item-photo-$id" style="height: 80px; width: 80px;" alt="$name" /></a>
+ <span onclick="openClose('wall-item-photo-menu-$id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$id">menu</span>
+ <div class="wall-item-photo-menu" id="wall-item-photo-menu-$id">
+ <ul>
+ $item_photo_menu
+ </ul>
+ </div>
+
+ </div>
+ <div class="wall-item-photo-end"></div>
+ <div class="wall-item-location" id="wall-item-location-$id">{{ if $location }}<span class="icon globe"></span>$location {{ endif }}</div>
+ </div>
+ <div class="wall-item-lock-wrapper">$lock</div>
+ <div class="wall-item-tools" id="wall-item-tools-$id">
+ $vote
+ $plink
+ $edpost
+ $drop
+ </div>
+ <div class="wall-item-content" id="wall-item-content-$id" >
+ <div class="wall-item-title" id="wall-item-title-$id">$title</div>
+ <div class="wall-item-title-end"></div>
+ <div class="wall-item-body" id="wall-item-body-$id" >$body</div>
+ </div>
+ <div class="wall-item-author">
+ <a href="$profile_url" title="$linktitle" class="wall-item-name-link"><span class="wall-item-name$sparkle" id="wall-item-name-$id" >$name</span></a>
+ <div class="wall-item-ago" id="wall-item-ago-$id">$ago</div>
+ </div>
+ </div>
+ <div class="wall-item-wrapper-end"></div>
+ <div class="wall-item-like" id="wall-item-like-$id">$like</div>
+ <div class="wall-item-dislike" id="wall-item-dislike-$id">$dislike</div>
+ <div class="wall-item-comment-wrapper" >
+ $comment
+ </div>
+</div>
+
+<div class="wall-item-outside-wrapper-end$indent" ></div>
+
diff --git a/view/xrd_host.tpl b/view/xrd_host.tpl
index f1d9707d5..ee687ffa9 100644
--- a/view/xrd_host.tpl
+++ b/view/xrd_host.tpl
@@ -9,4 +9,17 @@
<Link rel='http://services.mozilla.com/amcd/0.1' href='$domain/amcd' />
<Link rel="http://oexchange.org/spec/0.8/rel/resident-target" type="application/xrd+xml"
href="$domain/oexchange/xrd" />
+
+ <Link rel="http://purl.org/zot/1.0/post"
+ href="$zot_post" />
+
+ <Property xmlns:zot="http://purl.og/zot/1.0"
+ type="http://purl.org/zot/1.0/version"
+ zot:version="1" />
+
+ <Property xmlns:zot="http://purl.og/zot/1.0"
+ type="http://purl.org/zot/1.0/accept"
+ zot:accept="application/atom+xml" />
+
+
</XRD>
diff --git a/view/xrd_person.tpl b/view/xrd_person.tpl
index fd11ad600..7373499bf 100644
--- a/view/xrd_person.tpl
+++ b/view/xrd_person.tpl
@@ -5,6 +5,17 @@
<Alias>$accturi</Alias>
<Alias>$profile_url</Alias>
+ <Link rel="http://purl.org/zot/1.0/post"
+ href="$zot_post" />
+
+ <Property xmlns:zot="http://purl.og/zot/1.0"
+ type="http://purl.org/zot/1.0/version"
+ zot:version="1" />
+
+ <Property xmlns:zot="http://purl.og/zot/1.0"
+ type="http://purl.org/zot/1.0/accept"
+ zot:accept="application/atom+xml" />
+
<Link rel="http://purl.org/macgirvin/dfrn/1.0"
href="$profile_url" />
<Link rel="http://schemas.google.com/g/2010#updates-from"