1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/jappix_ynh.git synced 2024-09-03 19:26:19 +02:00

update source to 1.0.3

This commit is contained in:
titoko 2014-04-08 20:14:28 +02:00
parent 979b376609
commit 01fbda2f9b
463 changed files with 28475 additions and 158714 deletions

View file

@ -73,4 +73,4 @@ Translators
* Valérian Saliou * Valérian Saliou
* vitalyster * vitalyster
* zAchAry * zAchAry
* Zash * Zash

View file

@ -4,250 +4,264 @@ Jappix Changelog
Here's the log of what has changed over the Jappix releases. Here's the log of what has changed over the Jappix releases.
One, v1.0.3 (March 2014)
------------------------
* Fix JSJaC packet register @valeriansaliou, @sstrigler
One, v1.0.2 (March 2014)
------------------------
* Fix IQ spoofing security issue @valeriansaliou, @sstrigler
* Better autocompletion @Nabellaleen
* Various bugfixes @Nabellaleen, @valeriansaliou
One, v1.0.1 (January 2014) One, v1.0.1 (January 2014)
-------------------------- --------------------------
* Changed MAM namespace to a temporary one * Change MAM namespace to a temporary one @maranda
* Fixed broken Jappix Mini CSS loader in some cases * Fix broken Jappix Mini CSS loader in some cases @valeriansaliou
* Libs update * Libs update @valeriansaliou
One, v1.0.0 (January 2014) One, v1.0.0 (January 2014)
-------------------------- --------------------------
* XEP-0166: Jingle * XEP-0166: Jingle @valeriansaliou
* XEP-0292: vCard4 Over XMPP * XEP-0292: vCard4 Over XMPP @valeriansaliou
* XEP-0280: Message Carbons * XEP-0280: Message Carbons @valeriansaliou
* IE9, IE10, IE11 support * IE9, IE10, IE11 support @valeriansaliou
* Libs update * Libs update @valeriansaliou
* Client code rewrite * Client code rewrite @valeriansaliou
* Directory tree re-organization * Directory tree re-organization @valeriansaliou
* Tested code (pass CSSLint, JSHint and PHPLint) * Tested code (pass CSSLint, JSHint and PHPLint) @valeriansaliou
Nemesis Alpha 9, v0.9.9 (August 2013) Nemesis Alpha 9, v0.9.9 (August 2013)
------------------------------------- -------------------------------------
* XEP-0313: Message Archive Management * XEP-0313: Message Archive Management @valeriansaliou
* Drop support for Message Archiving (XEP-0136), outpaced by MAM (XEP-0313) * Drop support for Message Archiving (XEP-0136), outpaced by MAM (XEP-0313) @valeriansaliou
* Jappix Desktop performances improved (noticeable with big rosters) * Jappix Desktop performances improved (noticeable with big rosters) @valeriansaliou
* Fix Jappix Desktop avatar system, unable to cache avatars (thus increasing network load and delays) * Fix Jappix Desktop avatar system, unable to cache avatars (thus increasing network load and delays) @valeriansaliou
* New translations added (Mongolian), and a few ones updated * New translations added (Mongolian), and a few ones updated @valeriansaliou
Nemesis Alpha 8, v0.9.8 (May 2013) Nemesis Alpha 8, v0.9.8 (May 2013)
---------------------------------- ----------------------------------
* RTL (Right-To-Left Languages) support * RTL (Right-To-Left Languages) support @valeriansaliou
* Various bufixes * Various bufixes @valeriansaliou
Nemesis Alpha 7, v0.9.7 (April 2013) Nemesis Alpha 7, v0.9.7 (April 2013)
------------------------------------ ------------------------------------
* Fix overflow events in Mini * Fix overflow events in Mini @valeriansaliou
* Fix user info display bug with formatted text * Fix user info display bug with formatted text @valeriansaliou
* Jappix Me notification system * Jappix Me notification system @valeriansaliou
* Update JSJaC * Update JSJaC @valeriansaliou
* Update jQuery (v1.10.1) * Update jQuery (v1.10.1) @valeriansaliou
Nemesis Alpha 6, v0.9.6 (April 2013) Nemesis Alpha 6, v0.9.6 (April 2013)
------------------------------------ ------------------------------------
* Fix login with accented usernames * Fix login with accented usernames @valeriansaliou
* WOFF Get API headers fixed * WOFF Get API headers fixed @valeriansaliou
* Better Get API URL generator * Better Get API URL generator @valeriansaliou
* Fix broken Jappix Mini extraction script * Fix broken Jappix Mini extraction script @valeriansaliou
* Show when user joins/exits MUC in Jappix Mini * Show when user joins/exits MUC in Jappix Mini @valeriansaliou
Nemesis Alpha 5, v0.9.5 (March 2013) Nemesis Alpha 5, v0.9.5 (March 2013)
------------------------------------ ------------------------------------
* Jappix Mini enhancements * Jappix Mini enhancements @valeriansaliou
* Fix Jappix over non-standard ports * Fix Jappix over non-standard ports @valeriansaliou
* Locale detector improved * Locale detector improved @valeriansaliou
* Load more items on social channel scroll * Load more items on social channel scroll @valeriansaliou
* Fix a lot of English base language typos * Fix a lot of English base language typos @valeriansaliou
* Support for XHTML microblog entries (Movim compatibility) * Support for XHTML microblog entries (Movim compatibility) @valeriansaliou
* Show Jappix Desktop on tablets (not mobile anymore) * Show Jappix Desktop on tablets (not mobile anymore) @valeriansaliou
* Option to disable Jappix Mini on mobile phones * Option to disable Jappix Mini on mobile phones @valeriansaliou
* Fix broken MUC bookmarks retrieval * Fix broken MUC bookmarks retrieval @valeriansaliou
Nemesis Alpha 4, v0.9.4 (March 2013) Nemesis Alpha 4, v0.9.4 (March 2013)
------------------------------------ ------------------------------------
* [SECURITY] Fix insafe HTML escaping * [SECURITY] Fix insafe HTML escaping @valeriansaliou
* PHP 5.4 compatibility * PHP 5.4 compatibility @valeriansaliou
* Auto-populate microblog on connect * Auto-populate microblog on connect @valeriansaliou
* Register API support for Metronome XMPPd * Register API support for Metronome XMPPd @valeriansaliou
* Non-blocking PHP sessions * Non-blocking PHP sessions @valeriansaliou
* Permissive geoloc selector in microblog * Permissive geoloc selector in microblog @valeriansaliou
* Select priority more easily * Select priority more easily @valeriansaliou
* Compliancy with Atom specification (social inbox) * Compliancy with Atom specification (social inbox) @valeriansaliou
* Added project mirrors * Added project mirrors @valeriansaliou
Nemesis Alpha 3, v0.9.3 (February 2013) Nemesis Alpha 3, v0.9.3 (February 2013)
--------------------------------------- ---------------------------------------
* [SECURITY] More randomness in CAPTCHA * [SECURITY] More randomness in CAPTCHA @valeriansaliou
* Fix buggy roster filter with groups * Fix buggy roster filter with groups @valeriansaliou
* Add Piwik tracking feature (configurable in manager) * Add Piwik tracking feature (configurable in manager) @valeriansaliou
* Easy popup close by clicking away * Easy popup close by clicking away @valeriansaliou
* Fix cropped uploaded pictures * Fix cropped uploaded pictures @valeriansaliou
* Revert to old File Share API (which is far better) * Revert to old File Share API (which is far better) @valeriansaliou
* Fixes broken translations (strange UTF-8 chars due to bugged Gettext compiler) * Fixes broken translations (strange UTF-8 chars due to bugged Gettext compiler) @valeriansaliou
Nemesis Alpha 2, v0.9.2 (January 2013) Nemesis Alpha 2, v0.9.2 (January 2013)
-------------------------------------- --------------------------------------
* [SECURITY] Introduced the Register API (prevents register flood by spam bots) * [SECURITY] Introduce the Register API (prevents register flood by spam bots) @valeriansaliou
* Reworked Storage API * Reworked Storage API @valeriansaliou
* Jappix Mini code beautify * Jappix Mini code beautify @valeriansaliou
* Lighter and Web-safe font files * Lighter and Web-safe font files @valeriansaliou
* Better error logging * Better error logging @valeriansaliou
* Fix Openfire ping request * Fix Openfire ping request @valeriansaliou
* Typing notification in Jappix Mini * Typing notification in Jappix Mini @valeriansaliou
* Support for WebKit notifications * Support for WebKit notifications @valeriansaliou
* Jappix Mini groupchat suggest * Jappix Mini groupchat suggest @valeriansaliou
* Enhanced Download API * Enhanced Download API @valeriansaliou
* Mini animated chat icon, much sexier * Mini animated chat icon, much sexier @valeriansaliou
* IE custom font compatibility * IE custom font compatibility @valeriansaliou
* Legal changes * Legal changes @valeriansaliou
* Update licensing with real names * Update licensing with real names @valeriansaliou
Nemesis Alpha 1, v0.9.1 (2012) Nemesis Alpha 1, v0.9.1 (2012)
------------------------------ ------------------------------
* Show an 'add to home' button on iOS devices * Show an 'add to home' button on iOS devices @camaran
* Ability to suspend statistics * Ability to suspend statistics @valeriansaliou
* Fix IE9 issue with clustering * Fix IE9 issue with clustering @valeriansaliou
* Show profile button in user search results * Show profile button in user search results @valeriansaliou
* Ability to change message font, font size and color * Ability to change message font, font size and color @valeriansaliou
* Fix choppy Jappix Mini status picker * Fix choppy Jappix Mini status picker @valeriansaliou
* Sounds for Safari & IE9 * Sounds for Safari & IE9 @valeriansaliou
* Enhance new file storage functions * Enhance new file storage functions @valeriansaliou
* No resize for textareas * No resize for textareas @valeriansaliou
* Add a configurable legal disclaimer * Add a configurable legal disclaimer @valeriansaliou
* Fix a loop bug on presence if no support for sessionStorage * Fix a loop bug on presence if no support for sessionStorage @valeriansaliou
* Universal fonts * Universal fonts @valeriansaliou
* Add ability to configure the node owner name & website * Add ability to configure the node owner name & website @valeriansaliou
* HTTP authentication for LDAP * HTTP authentication for LDAP @valeriansaliou
* Better notification + comments management * Better notification + comments management @valeriansaliou
Spaco, v0.9 (2011) Spaco, v0.9 (2011)
------------------ ------------------
* [SECURITY] Fix when sending files to a contact * [SECURITY] Fix when sending files to a contact @valeriansaliou
* Better Jappix Mini performances * Better Jappix Mini performances @valeriansaliou
* Fix Jappix Mini display issues * Fix Jappix Mini display issues @valeriansaliou
* Connection issue fixed with BOSH API * Connection issue fixed with BOSH API @valeriansaliou
* Open XMPP links when Jappix is ready * Open XMPP links when Jappix is ready @valeriansaliou
Suno, v0.8 (2011) Suno, v0.8 (2011)
--------------------- ---------------------
* XEP-0066: Out of Band Data * XEP-0066: Out of Band Data @valeriansaliou
* Switch from OpenStreetMap to Google Maps for geolocation * Switch from OpenStreetMap to Google Maps for geolocation @valeriansaliou
Stelo, v0.7 (2011) Stelo, v0.7 (2011)
------------------ ------------------
* Lighter Jappix Mini * Lighter Jappix Mini @valeriansaliou
* Welcome popup * Welcome popup @valeriansaliou
* Support for /me command in Jappix Mini * Support for /me command in Jappix Mini @valeriansaliou
* Fixes in social channel * Fixes in social channel @valeriansaliou
* Bigger BOSH poll interval (avoids some overactivity errors) * Bigger BOSH poll interval (avoids some overactivity errors) @valeriansaliou
* Compression disabled by default in Get API * Compression disabled by default in Get API @valeriansaliou
* Send chatstates in MUC * Send chatstates in MUC @valeriansaliou
* Social notification inbox * Social notification inbox @valeriansaliou
Lumo, v0.6 (2011) Lumo, v0.6 (2011)
----------------- -----------------
* Smoother Mini animation * Smoother Mini animation @valeriansaliou
* Show avatars in social channel comments * Show avatars in social channel comments @valeriansaliou
* Legacy mode for microblog comments * Legacy mode for microblog comments @valeriansaliou
* Microblog updated to comply with a new version of XEP-0277 * Microblog updated to comply with a new version of XEP-0277 @valeriansaliou
* Fix DNS SRV issue because of a 'route' attribute on BOSH initiation * Fix DNS SRV issue because of a 'route' attribute on BOSH initiation @valeriansaliou
Ribelo, v0.5 (2011) Ribelo, v0.5 (2011)
------------------- -------------------
* Add support for comments in microblog * Add support for comments in microblog @valeriansaliou
* Jappix Mini fixes and improvements * Jappix Mini fixes and improvements @valeriansaliou
Lupo, v0.4 (2011) Lupo, v0.4 (2011)
----------------- -----------------
* Full IE5.5 compatibility for Jappix Mini * Full IE5.5 compatibility for Jappix Mini @valeriansaliou
* BOSH without cURL (if cURL unavailable) * BOSH without cURL (if cURL unavailable) @valeriansaliou
* Handle multiple microblog attached files * Handle multiple microblog attached files @valeriansaliou
* Microblog attached files thumbnails * Microblog attached files thumbnails @valeriansaliou
* BOM (Byte Order Mark) filtering for Get API * BOM (Byte Order Mark) filtering for Get API @valeriansaliou
* Autoplay for new YouTube HTML5 player * Autoplay for new YouTube HTML5 player @valeriansaliou
* Support for privacy lists pushs * Support for privacy lists pushs @valeriansaliou
* Roster-side privacy lists (make contact blocking/unblocking easy) * Roster-side privacy lists (make contact blocking/unblocking easy) @valeriansaliou
* Better update checker * Better update checker @valeriansaliou
* XEP-0144: Roster Item Exchange * XEP-0144: Roster Item Exchange @valeriansaliou
* Cross domain support for Internet Explorer and legacy browsers * Cross domain support for Internet Explorer and legacy browsers @valeriansaliou
* Update jQuery (v1.4.4) * Update jQuery (v1.4.4) @valeriansaliou
* TZO fix (for negative timezones, e.g.: UTC-5) * TZO fix (for negative timezones, e.g.: UTC-5) @valeriansaliou
* Better language detection * Better language detection @valeriansaliou
* Use HTML5 or Flash for YouTube embedded videos * Use HTML5 or Flash for YouTube embedded videos @valeriansaliou
Prism, v0.3 (2011) Prism, v0.3 (2011)
------------------ ------------------
* [SECURITY] Fix JS escape bug for quotes * [SECURITY] Fix JS escape bug for quotes @valeriansaliou
* [SECURITY] HTML-encode notification username * [SECURITY] HTML-encode notification username @valeriansaliou
* Introduction of Jappix Mini * Introduction of Jappix Mini @valeriansaliou
* Introduction of Jappix Manager * Introduction of Jappix Manager @valeriansaliou
* Introduction of Jappix Install * Introduction of Jappix Install @valeriansaliou
* XEP-0050: Ad-Hoc Commands * XEP-0050: Ad-Hoc Commands @valeriansaliou
* XEP-0136: Message Archiving * XEP-0136: Message Archiving @valeriansaliou
* Update Jappix logo * Update Jappix logo @valeriansaliou
* Declare application language to XMPP server * Declare application language to XMPP server @valeriansaliou
* Add a buddy search tool * Add a buddy search tool @valeriansaliou
* Support for old/legacy vCard server implementations * Support for old/legacy vCard server implementations @valeriansaliou
* Inbox messages sorted by date * Inbox messages sorted by date @valeriansaliou
* Better music search * Better music search @valeriansaliou
* Human-readable geolocation * Human-readable geolocation @valeriansaliou
* Gateway show/hide * Gateway show/hide @valeriansaliou
* HTML5 forms * HTML5 forms @valeriansaliou
* Better notification management * Better notification management @valeriansaliou
* Unified chat design * Unified chat design @valeriansaliou
* Dynamic DOM load (better performances) * Dynamic DOM load (better performances) @valeriansaliou
* Jappix logo shown when connected (improves branding) * Jappix logo shown when connected (improves branding) @valeriansaliou
Lidar, v0.2 (2010) Lidar, v0.2 (2010)
------------------ ------------------
* Introduction of Jappix Mobile * Introduction of Jappix Mobile @valeriansaliou
* UI redesign (from grey to black and blue) * UI redesign (from grey to black and blue) @valeriansaliou
* Social channel introduced (microblog) * Social channel introduced (microblog) @valeriansaliou
Genesis, v0.1 (2010) Genesis, v0.1 (2010)
-------------------- --------------------
* Initial version, released after private beta * Initial version, released after private beta @valeriansaliou
* Introduction of Jappix Desktop * Introduction of Jappix Desktop @valeriansaliou
* Basic chat, groupchat, roster and profile features * Basic chat, groupchat, roster and profile features @valeriansaliou
* Basic UI * Basic UI @valeriansaliou
**For more information about what changed through time, check the changes made to our source code on GitHub: https://github.com/jappix/jappix/commits/master** **For more information about what changed through time, check the changes made to our source code on GitHub: https://github.com/jappix/jappix/commits/master**

File diff suppressed because it is too large Load diff

View file

@ -37,4 +37,4 @@ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
**ParaType Ltd** **ParaType Ltd**
**http://www.paratype.ru** **http://www.paratype.ru**

View file

@ -23,4 +23,4 @@ They contain work from the FamFamFam Silk icon set by Mark James.
* http://famfamfam.com/lab/icons/silk/ * http://famfamfam.com/lab/icons/silk/
* http://creativecommons.org/licenses/by/2.5/ * http://creativecommons.org/licenses/by/2.5/
* http://creativecommons.org/licenses/by/3.0/ * http://creativecommons.org/licenses/by/3.0/

View file

@ -18,4 +18,4 @@ More
* The whole documentation is available at: https://github.com/jappix/jappix/wiki * The whole documentation is available at: https://github.com/jappix/jappix/wiki
Now, you can use Jappix. Happy socializing! Now, you can use Jappix. Happy socializing!

View file

@ -65,4 +65,4 @@ Here are listed the XMPP Protocol Extensions that Jappix supports, as well as th
# Others # Others
* RFC-3264: An Offer/Answer Model with Session Description Protocol (SDP) * RFC-3264: An Offer/Answer Model with Session Description Protocol (SDP)

View file

@ -7,17 +7,17 @@ We would like to thanks the authors of these tools, coming from other projects:
Projects Projects
-------- --------
* Base64 https://github.com/dankogai/js-base64 * Base64 https://github.com/dankogai/js-base64
* DrawSVGChart http://codingteam.net/project/codingteam * DrawSVGChart http://codingteam.net/project/codingteam
* idzXHR http://www.iadvize.com/plugin_strophe_xmpp.html * idzXHR http://www.iadvize.com/plugin_strophe_xmpp.html
* JSJaC http://blog.jwchat.org/jsjac/ * JSJaC http://blog.jwchat.org/jsjac/
* JSMin http://github.com/rgrove/jsmin-php/ * JSMin http://github.com/rgrove/jsmin-php/
* jQuery http://jquery.com/ * jQuery http://jquery.com/
* jQuery Form http://jquery.malsup.com/form/ * jQuery Form http://jquery.malsup.com/form/
* jQuery Timers http://plugins.jquery.com/project/timers * jQuery Timers http://plugins.jquery.com/project/timers
* jXHR http://mulletxhr.com/ * jXHR http://mulletxhr.com/
* Mobile Detect https://github.com/serbanghita/Mobile-Detect * Mobile Detect https://github.com/serbanghita/Mobile-Detect
* ParaType http://paratype.ru/ * ParaType http://paratype.ru/
* PHP-gettext https://launchpad.net/php-gettext * PHP-gettext https://launchpad.net/php-gettext
* Silk icons http://www.famfamfam.com/lab/icons/silk/ * Silk icons http://www.famfamfam.com/lab/icons/silk/
* Smileys http://www.gajim.org/ * Smileys http://www.gajim.org/

View file

@ -1 +1 @@
One [1.0.1] One [1.0.3]

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<jappix xmlns="jappix:file:get"> <jappix xmlns="jappix:file:get">
<css>anonymous.css</css> <css>anonymous.css</css>
<js>anonymous.js</js> <js>anonymous.js</js>
</jappix> </jappix>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<jappix xmlns="jappix:file:get"> <jappix xmlns="jappix:file:get">
<css>fonts.css~main.css~images.css~board.css~home.css~others.css~tools.css~roster.css~myinfos.css~pageengine.css~channel.css~pageswitch.css~smileys.css~popup.css~vcard.css~options.css~favorites.css~discovery.css~directory.css~adhoc.css~privacy.css~inbox.css~mucadmin.css~integratebox.css~userinfos.css~search.css~welcome.css~me.css~rosterx.css~jingle.css</css> <css>fonts.css~main.css~images.css~board.css~home.css~others.css~tools.css~roster.css~myinfos.css~pageengine.css~channel.css~pageswitch.css~smileys.css~popup.css~vcard.css~options.css~favorites.css~discovery.css~directory.css~adhoc.css~privacy.css~inbox.css~mucadmin.css~integratebox.css~userinfos.css~search.css~welcome.css~me.css~rosterx.css~jingle.css</css>
<js>origin.js~jxhr.js~datejs.js~jquery.js~jquery.ui.js~jquery.json.js~jquery.form.js~jquery.timers.js~jquery.placeholder.js~jquery.textrange.js~base64.js~jsjac.js~jsjac.jingle.js~system.js~constants.js~datastore.js~browser-detect.js~home.js~talk.js~popup.js~audio.js~board.js~bubble.js~chat.js~groupchat.js~smileys.js~oob.js~avatar.js~mucadmin.js~connection.js~dataform.js~discovery.js~directory.js~adhoc.js~privacy.js~errors.js~name.js~favorites.js~features.js~interface.js~xmpplinks.js~iq.js~message.js~chatstate.js~receipts.js~tooltip.js~filter.js~links.js~inbox.js~microblog.js~music.js~notification.js~httpreply.js~options.js~integratebox.js~pubsub.js~pep.js~presence.js~roster.js~jingle.js~storage.js~console.js~common.js~utilities.js~date.js~caps.js~vcard.js~userinfos.js~search.js~autocompletion.js~welcome.js~me.js~rosterx.js~mam.js~carbons.js</js> <js>origin.js~jxhr.js~datejs.js~jquery.js~jquery.ui.js~jquery.json.js~jquery.form.js~jquery.timers.js~jquery.placeholder.js~jquery.textrange.js~base64.js~jsjac.js~jsjac.jingle.js~system.js~constants.js~datastore.js~browser-detect.js~home.js~talk.js~popup.js~audio.js~board.js~bubble.js~chat.js~groupchat.js~smileys.js~oob.js~avatar.js~mucadmin.js~connection.js~dataform.js~discovery.js~directory.js~adhoc.js~privacy.js~errors.js~name.js~favorites.js~features.js~interface.js~xmpplinks.js~iq.js~message.js~chatstate.js~receipts.js~tooltip.js~filter.js~links.js~inbox.js~microblog.js~music.js~notification.js~httpreply.js~options.js~integratebox.js~pubsub.js~pep.js~presence.js~roster.js~jingle.js~storage.js~console.js~common.js~utilities.js~date.js~caps.js~vcard.js~userinfos.js~search.js~autocompletion.js~welcome.js~me.js~rosterx.js~mam.js~carbons.js</js>
</jappix> </jappix>

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<jappix xmlns="jappix:file:get"> <jappix xmlns="jappix:file:get">
<js>httpauth.js</js> <js>httpauth.js</js>
</jappix> </jappix>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<jappix xmlns="jappix:file:get"> <jappix xmlns="jappix:file:get">
<css>main.css~install.css~images.css</css> <css>main.css~install.css~images.css</css>
<js></js> <js></js>
</jappix> </jappix>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<jappix xmlns="jappix:file:get"> <jappix xmlns="jappix:file:get">
<css>main.css~manager.css~images.css</css> <css>main.css~manager.css~images.css</css>
<js></js> <js></js>
</jappix> </jappix>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<jappix xmlns="jappix:file:get"> <jappix xmlns="jappix:file:get">
<css>mini.css</css> <css>mini.css</css>
<js>origin.js~jxhr.js~base64.js~jsjac.js~jquery.json.js~jquery.timers.js~jquery.scrollto.js~system.js~constants.js~datastore.js~browser-detect.js~console.js~common.js~date.js~links.js~mini.js</js> <js>origin.js~jxhr.js~base64.js~jsjac.js~jquery.json.js~jquery.timers.js~jquery.scrollto.js~system.js~constants.js~datastore.js~browser-detect.js~console.js~common.js~date.js~links.js~mini.js</js>
</jappix> </jappix>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<jappix xmlns="jappix:file:get"> <jappix xmlns="jappix:file:get">
<css>mobile.css~ios.css~images.css</css> <css>mobile.css~ios.css~images.css</css>
<js>origin.js~jxhr.js~base64.js~jsjac.js~system.js~constants.js~console.js~browser-detect.js~links.js~mobile.js~ios.js</js> <js>origin.js~jxhr.js~base64.js~jsjac.js~system.js~constants.js~console.js~browser-detect.js~links.js~mobile.js~ios.js</js>
</jappix> </jappix>

View file

@ -20,7 +20,7 @@ var Anonymous = (function () {
var self = {}; var self = {};
/** /**
* Connected to an anonymous session * Connected to an anonymous session
* @public * @public
* @return {undefined} * @return {undefined}

View file

@ -46,7 +46,7 @@ var Audio = (function () {
}; };
/** /**
* Plays the given sound ID * Plays the given sound ID
* @public * @public
* @param {string} name * @param {string} name

View file

@ -21,23 +21,24 @@ var Autocompletion = (function () {
/** /**
* Sort an array with insensitivity to the case * Sort an autocompletion result array with insensitivity to the case,
* using the 1st elements (a[0] and b[0]) to process comparison
* @public * @public
* @param {string} a * @param {array} a
* @param {string} b * @param {array} b
* @return {undefined} * @return {undefined}
*/ */
self.caseInsensitiveSort = function(a, b) { self.caseInsensitiveSort = function(a, b) {
try { try {
// Put the two strings into lower case // Put the two strings into lower case
a = a.toLowerCase(); var sA = a[0].toLowerCase();
b = b.toLowerCase(); var sB = b[0].toLowerCase();
// Process the sort // Process the sort
if(a > b) if(sA > sB)
return 1; return 1;
if(a < b) if(sA < sB)
return -1; return -1;
} catch(e) { } catch(e) {
Console.error('Autocompletion.caseInsensitiveSort', e); Console.error('Autocompletion.caseInsensitiveSort', e);
@ -47,11 +48,52 @@ var Autocompletion = (function () {
/** /**
* Creates an array with the autocompletion results * Split a query into its subqueries ready to be used in autocompletion
* @public * The function return an array containing two others : the first with subqueries
* and the second with remaining parts
* For example, if query is "A B C", the subqueries are ["C", "B C", "A B C"] and
* the remaining parts are ["A B ", "A ", ""]
* @param {string} query * @param {string} query
* @return {Array}
*/
self.getSubQueries = function(query) {
var subqueries = [];
var remnants = [];
var queryLastCharPos = query.length - 1;
var spaceCounter = 0;
for (var i=queryLastCharPos; i>=0; i--) {
// Search from the end of the query
var iChar = query.charAt(i);
if (spaceCounter === 0 && iChar.search(/\s/) === 0) {
// the first "local" space was found
// add the subquery and its remnant to results
subqueries.push(query.slice(i+1));
remnants.push(query.slice(0, i+1));
spaceCounter++;
} else {
spaceCounter = 0;
}
}
if (spaceCounter === 0) {
// If the first char of the query is not a space, add the full query to results
subqueries.push(query);
remnants.push("");
}
return [subqueries, remnants];
};
/**
* Creates an array with the autocompletion results. An autocompletion result
* is an array containing the result himself and the rank of the query which
* matched this answer
* @public
* @param {Array} query
* @param {string} id * @param {string} id
* @return {object} * @return {Array}
*/ */
self.process = function(query, id) { self.process = function(query, id) {
@ -60,16 +102,23 @@ var Autocompletion = (function () {
try { try {
// Replace forbidden characters in regex // Replace forbidden characters in regex
query = Common.escapeRegex(query); query = Common.escapeRegex(query);
// Build an array of regex to use
var queryRegExp = [];
for (i = 0; i<query.length; i++) {
if (query[i] !== null) {
queryRegExp.push(new RegExp('(^)' + query[i], 'gi'));
}
}
// Search in the roster // Search in the roster
$('#' + id + ' .user').each(function() { $('#' + id + ' .user').each(function() {
var nick = $(this).find('.name').text(); var nick = $(this).find('.name').text();
var regex = new RegExp('(^)' + query, 'gi'); for (i = 0; i<queryRegExp.length; i++) {
var regex = queryRegExp[i];
if(nick.match(regex)) if(nick.match(regex)) {
results.push(nick); results.push([nick, i]);
}
}
}); });
// Sort the array // Sort the array
results = results.sort(self.caseInsensitiveSort); results = results.sort(self.caseInsensitiveSort);
} catch(e) { } catch(e) {
@ -106,7 +155,7 @@ var Autocompletion = (function () {
*/ */
self.create = function(hash) { self.create = function(hash) {
try { try {
// Initialize // Initialize
var vSelector = $('#' + hash + ' .message-area'); var vSelector = $('#' + hash + ' .message-area');
var value = vSelector.val(); var value = vSelector.val();
@ -117,10 +166,13 @@ var Autocompletion = (function () {
var query = vSelector.attr('data-autocompletion-query'); var query = vSelector.attr('data-autocompletion-query');
// The autocompletion has not been yet launched
if(query === undefined) { if(query === undefined) {
query = value; // The autocompletion has not been yet launched
vSelector.attr('data-autocompletion-query', query); query = self.getSubQueries(value);
vSelector.attr('data-autocompletion-query', JSON.stringify(query));
} else {
// The autocompletion has already stored a query
query = JSON.parse(query);
} }
// Get the pointer // Get the pointer
@ -131,7 +183,11 @@ var Autocompletion = (function () {
i = parseInt(pointer); i = parseInt(pointer);
// We get the nickname // We get the nickname
var nick = self.process(query, hash)[i]; var nickResult = self.process(query[0], hash)[i];
var nick;
if (nickResult !== undefined) {
nick = nickResult[0];
}
// Shit, this is my nick! // Shit, this is my nick!
if((nick !== undefined) && (nick.toLowerCase() == Name.getMUCNick(hash).toLowerCase())) { if((nick !== undefined) && (nick.toLowerCase() == Name.getMUCNick(hash).toLowerCase())) {
@ -139,14 +195,18 @@ var Autocompletion = (function () {
i++; i++;
// Get the next nick // Get the next nick
nick = self.process(query, hash)[i]; nickResult = self.process(query[0], hash)[i];
if (nickResult !== undefined) {
nick = nickResult[0];
}
} }
// We quote the nick // We quote the nick
if(nick !== undefined) { if((nickResult !== undefined) && (nick !== undefined)) {
// Increment // Increment
i++; i++;
Utils.quoteMyNick(hash, nick); var message = query[1][nickResult[1]];
Utils.quoteMyNick(hash, nick, message);
// Put a pointer // Put a pointer
vSelector.attr('data-autocompletion-pointer', i); vSelector.attr('data-autocompletion-pointer', i);

View file

@ -20,11 +20,11 @@ var Avatar = (function () {
var self = {}; var self = {};
/* Variables */ /* Variables */
self.pending = []; self.pending = [];
/** /**
* Requests the avatar of a given user * Requests the avatar of a given user
* @public * @public
* @param {string} xid * @param {string} xid

View file

@ -20,7 +20,7 @@ var Board = (function () {
var self = {}; var self = {};
/** /**
* Creates a board panel * Creates a board panel
* @public * @public
* @param {string} type * @param {string} type
@ -202,7 +202,7 @@ var Board = (function () {
}; };
/** /**
* Closes a given board * Closes a given board
* @public * @public
* @param {string} board * @param {string} board
@ -235,8 +235,9 @@ var Board = (function () {
try { try {
// Cannot process? // Cannot process?
if(Common.isFocused() || !content || !window.webkitNotifications) if(Common.isFocused() || !content || !(window.webkitNotifications || window.Notification)) {
return; return;
}
// Default icon? // Default icon?
if(!icon) { if(!icon) {
@ -256,49 +257,77 @@ var Board = (function () {
} }
// Default title? // Default title?
if(!title) if(!title) {
title = Common._e("New event!"); title = Common._e("New event!");
}
// Click callback
var cb_click_fn = function() {
// Click action?
switch(type) {
case 'chat':
Interface.switchChan(hex_md5(xid));
break;
case 'groupchat':
Interface.switchChan(hex_md5(Common.bareXID(xid)));
break;
default:
break;
}
// Focus on msg-me
window.focus();
// Remove notification
this.cancel();
};
// Check for notification permission // Check for notification permission
if(window.webkitNotifications.checkPermission() === 0) { try {
// Create notification if(Notification.permission == 'granted' || Notification.permission === undefined) {
var notification = window.webkitNotifications.createNotification(icon, title, content); var notification = new Notification(title, {
dir: 'auto',
// Auto-hide after a while lang: '',
notification.ondisplay = function(event) { body: content,
tag: type,
icon: icon
});
notification.onclick = cb_click_fn;
setTimeout(function() { setTimeout(function() {
event.currentTarget.cancel(); notification.close();
}, 10000); }, 10000);
};
if(notification.permission == 'granted') {
// Click event return notification;
notification.onclick = function() {
// Click action?
switch(type) {
case 'chat':
Interface.switchChan(hex_md5(xid));
break;
case 'groupchat':
Interface.switchChan(hex_md5(Common.bareXID(xid)));
break;
default:
break;
} }
}
} catch(_e) {
if(window.webkitNotifications.checkPermission() === 0) {
// Create notification
var notification = window.webkitNotifications.createNotification(icon, title, content);
// Focus on msg-me // Auto-hide after a while
window.focus(); notification.ondisplay = function(event) {
setTimeout(function() {
event.currentTarget.cancel();
}, 10000);
};
// Remove notification // Click event
this.cancel(); notification.onclick = cb_click_fn;
};
// Show notification
// Show notification notification.show();
notification.show();
return notification;
return notification; }
} }
return null;
} catch(e) { } catch(e) {
Console.error('Board.quick', e); Console.error('Board.quick', e);
} }
@ -314,11 +343,21 @@ var Board = (function () {
self.quickPermission = function() { self.quickPermission = function() {
try { try {
if(!window.webkitNotifications || (window.webkitNotifications.checkPermission() === 0)) try {
return; // W3C Notification API (still a draft!)
if(Notification.permission !== 'granted') {
// Ask for permission // Ask for permission
window.webkitNotifications.requestPermission(); Notification.requestPermission();
}
} catch (_e) {
// WebKit Notification API (fallback)
if(!window.webkitNotifications || (window.webkitNotifications.checkPermission() === 0)) {
return;
}
// Ask for permission
window.webkitNotifications.requestPermission();
}
} catch(e) { } catch(e) {
Console.error('Board.quickPermission', e); Console.error('Board.quickPermission', e);
} }

View file

@ -4,122 +4,122 @@
*/ */
var BrowserDetect = { var BrowserDetect = {
init: function () { init: function () {
this.browser = this.searchString(this.dataBrowser) || "An unknown browser"; this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
this.version = this.searchVersion(navigator.userAgent) this.version = this.searchVersion(navigator.userAgent)
|| this.searchVersion(navigator.appVersion) || this.searchVersion(navigator.appVersion)
|| "an unknown version"; || "an unknown version";
this.OS = this.searchString(this.dataOS) || "an unknown OS"; this.OS = this.searchString(this.dataOS) || "an unknown OS";
}, },
searchString: function (data) { searchString: function (data) {
for (var i=0;i<data.length;i++) { for (var i=0;i<data.length;i++) {
var dataString = data[i].string; var dataString = data[i].string;
var dataProp = data[i].prop; var dataProp = data[i].prop;
this.versionSearchString = data[i].versionSearch || data[i].identity; this.versionSearchString = data[i].versionSearch || data[i].identity;
if (dataString) { if (dataString) {
if (dataString.indexOf(data[i].subString) != -1) if (dataString.indexOf(data[i].subString) != -1)
return data[i].identity; return data[i].identity;
} }
else if (dataProp) else if (dataProp)
return data[i].identity; return data[i].identity;
} }
}, },
searchVersion: function (dataString) { searchVersion: function (dataString) {
var index = dataString.indexOf(this.versionSearchString); var index = dataString.indexOf(this.versionSearchString);
if (index == -1) return; if (index == -1) return;
return parseFloat(dataString.substring(index+this.versionSearchString.length+1)); return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
}, },
dataBrowser: [ dataBrowser: [
{ {
string: navigator.userAgent, string: navigator.userAgent,
subString: "Chrome", subString: "Chrome",
identity: "Chrome" identity: "Chrome"
}, },
{ string: navigator.userAgent, { string: navigator.userAgent,
subString: "OmniWeb", subString: "OmniWeb",
versionSearch: "OmniWeb/", versionSearch: "OmniWeb/",
identity: "OmniWeb" identity: "OmniWeb"
}, },
{ {
string: navigator.vendor, string: navigator.vendor,
subString: "Apple", subString: "Apple",
identity: "Safari", identity: "Safari",
versionSearch: "Version" versionSearch: "Version"
}, },
{ {
prop: window.opera, prop: window.opera,
identity: "Opera" identity: "Opera"
}, },
{ {
string: navigator.vendor, string: navigator.vendor,
subString: "iCab", subString: "iCab",
identity: "iCab" identity: "iCab"
}, },
{ {
string: navigator.vendor, string: navigator.vendor,
subString: "KDE", subString: "KDE",
identity: "Konqueror" identity: "Konqueror"
}, },
{ {
string: navigator.userAgent, string: navigator.userAgent,
subString: "Firefox", subString: "Firefox",
identity: "Firefox" identity: "Firefox"
}, },
{ {
string: navigator.vendor, string: navigator.vendor,
subString: "Camino", subString: "Camino",
identity: "Camino" identity: "Camino"
}, },
{ // for newer Netscapes (6+) { // for newer Netscapes (6+)
string: navigator.userAgent, string: navigator.userAgent,
subString: "Netscape", subString: "Netscape",
identity: "Netscape" identity: "Netscape"
}, },
{ {
string: navigator.userAgent, string: navigator.userAgent,
subString: "MSIE", subString: "MSIE",
identity: "Explorer", identity: "Explorer",
versionSearch: "MSIE" versionSearch: "MSIE"
}, },
{ {
string: navigator.userAgent, string: navigator.userAgent,
subString: "Gecko", subString: "Gecko",
identity: "Mozilla", identity: "Mozilla",
versionSearch: "rv" versionSearch: "rv"
}, },
{ // for older Netscapes (4-) { // for older Netscapes (4-)
string: navigator.userAgent, string: navigator.userAgent,
subString: "Mozilla", subString: "Mozilla",
identity: "Netscape", identity: "Netscape",
versionSearch: "Mozilla" versionSearch: "Mozilla"
} }
], ],
dataOS : [ dataOS : [
{ {
string: navigator.platform, string: navigator.platform,
subString: "Win", subString: "Win",
identity: "Windows" identity: "Windows"
}, },
{ {
string: navigator.platform, string: navigator.platform,
subString: "Mac", subString: "Mac",
identity: "Mac" identity: "Mac"
}, },
{ {
string: navigator.userAgent, string: navigator.userAgent,
subString: "iPhone", subString: "iPhone",
identity: "iPhone/iPod" identity: "iPhone/iPod"
}, },
{ {
string: navigator.platform, string: navigator.platform,
subString: "Linux", subString: "Linux",
identity: "Linux" identity: "Linux"
} }
] ]
}; };
BrowserDetect.init(); BrowserDetect.init();

View file

@ -20,7 +20,7 @@ var Bubble = (function () {
var self = {}; var self = {};
/** /**
* Closes all the opened bubbles * Closes all the opened bubbles
* @public * @public
* @return {boolean} * @return {boolean}

View file

@ -39,7 +39,7 @@ var Caps = (function () {
}; };
/** /**
* Returns an array of the Jappix disco#infos * Returns an array of the Jappix disco#infos
* @public * @public
* @return {object} * @return {object}
@ -468,7 +468,7 @@ var Caps = (function () {
}; };
/** /**
* Generates the Jappix CAPS hash * Generates the Jappix CAPS hash
* @public * @public
* @return {string} * @return {string}

View file

@ -20,7 +20,7 @@ var Chat = (function () {
var self = {}; var self = {};
/** /**
* Correctly opens a new chat * Correctly opens a new chat
* @public * @public
* @param {string} xid * @param {string} xid

View file

@ -20,7 +20,7 @@ var ChatState = (function () {
var self = {}; var self = {};
/** /**
* Sends a given chatstate to a given entity * Sends a given chatstate to a given entity
* @public * @public
* @param {string} state * @param {string} state

View file

@ -20,7 +20,7 @@ var Common = (function () {
var self = {}; var self = {};
/** /**
* Checks if an element exists in the DOM * Checks if an element exists in the DOM
* @public * @public
* @param {string} path * @param {string} path
@ -162,7 +162,7 @@ var Common = (function () {
}; };
/** /**
* Replaces '%s' to a given value for a translated string * Replaces '%s' to a given value for a translated string
* @public * @public
* @param {string} string * @param {string} string
@ -298,7 +298,7 @@ var Common = (function () {
}; };
/** /**
* nodepreps an XMPP node * nodepreps an XMPP node
* @public * @public
* @param {string} node * @param {string} node
@ -360,8 +360,9 @@ var Common = (function () {
xid = self.cutResource(xid); xid = self.cutResource(xid);
// Launch nodeprep // Launch nodeprep
if(xid.indexOf('@') != -1) if(xid.indexOf('@') != -1) {
xid = self.nodeprep(self.getXIDNick(xid)) + '@' + self.getXIDHost(xid); xid = self.nodeprep(self.getXIDNick(xid)) + '@' + self.getXIDHost(xid);
}
return xid; return xid;
} catch(e) { } catch(e) {
@ -417,7 +418,7 @@ var Common = (function () {
}; };
/** /**
* Gets the host from a XID * Gets the host from a XID
* @public * @public
* @param {string} aXID * @param {string} aXID
@ -482,7 +483,7 @@ var Common = (function () {
}; };
/** /**
* Gets the full XID of the user * Gets the full XID of the user
* @public * @public
* @return {string} * @return {string}
@ -572,8 +573,9 @@ var Common = (function () {
var from = stanza.getFrom(); var from = stanza.getFrom();
// No from, we assume this is our XID // No from, we assume this is our XID
if(!from) if(!from) {
from = self.getXID(); from = self.getXID();
}
return from; return from;
} catch(e) { } catch(e) {
@ -583,6 +585,29 @@ var Common = (function () {
}; };
/**
* Returns whether the stanza has been really sent from our own server or entity
* @public
* @param {object} stanza
* @return {string}
*/
self.isSafeStanza = function(stanza) {
var is_safe = false;
try {
var from = self.getStanzaFrom(stanza);
is_safe = (!from || from == con.domain || from == self.getXID()) && true;
} catch(e) {
Console.error('Common.isSafeStanza', e);
} finally {
return is_safe;
}
};
/** /**
* Adds a zero to a date when needed * Adds a zero to a date when needed
* @public * @public
@ -610,17 +635,31 @@ var Common = (function () {
/** /**
* Escapes a string for a regex usage * Escapes a string (or an array of string) for a regex usage. In case of an
* array, escapes are not done "in place", keeping the query unmodified
* @public * @public
* @param {string} query * @param {object} query
* @return {string} * @return {object}
*/ */
self.escapeRegex = function(query) { self.escapeRegex = function(query) {
try { if (query instanceof Array) {
return query.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); var result = new Array(query.length);
} catch(e) { for(i=0; i<query.length; i++) {
Console.error('Common.escapeRegex', e); try {
result[i] = Common.escapeRegex(query[i]);
} catch(e) {
Console.error('Common.escapeRegex', e);
result[i] = null;
}
}
return result;
} else {
try {
return query.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
} catch(e) {
Console.error('Common.escapeRegex', e);
}
} }
}; };
@ -663,7 +702,7 @@ var Common = (function () {
}; };
/** /**
* Converts a XML document to a string * Converts a XML document to a string
* @public * @public
* @param {object} xmlData * @param {object} xmlData

View file

@ -29,7 +29,7 @@ var Connection = (function () {
self.resume = false; self.resume = false;
/** /**
* Does the user login * Does the user login
* @public * @public
* @param {string} lNick * @param {string} lNick
@ -363,7 +363,7 @@ var Connection = (function () {
}; };
/** /**
* Triggers the connected state * Triggers the connected state
* @public * @public
* @return {undefined} * @return {undefined}
@ -513,7 +513,7 @@ var Connection = (function () {
}; };
/** /**
* Quits a session * Quits a session
* @public * @public
* @param {type} name * @param {type} name
@ -710,7 +710,7 @@ var Connection = (function () {
}; };
/** /**
* Resets the connection markers * Resets the connection markers
* @public * @public
* @return {undefined} * @return {undefined}

View file

@ -178,54 +178,54 @@ var BOSH_SAME_ORIGIN = false;
// XMPP error stanzas // XMPP error stanzas
function STANZA_ERROR(code, type, cond) { function STANZA_ERROR(code, type, cond) {
if(window == this) { if(window == this) {
return new STANZA_ERROR(code, type, cond); return new STANZA_ERROR(code, type, cond);
} }
this.code = code; this.code = code;
this.type = type; this.type = type;
this.cond = cond; this.cond = cond;
} }
var ERR_BAD_REQUEST = var ERR_BAD_REQUEST =
STANZA_ERROR('400', 'modify', 'bad-request'); STANZA_ERROR('400', 'modify', 'bad-request');
var ERR_CONFLICT = var ERR_CONFLICT =
STANZA_ERROR('409', 'cancel', 'conflict'); STANZA_ERROR('409', 'cancel', 'conflict');
var ERR_FEATURE_NOT_IMPLEMENTED = var ERR_FEATURE_NOT_IMPLEMENTED =
STANZA_ERROR('501', 'cancel', 'feature-not-implemented'); STANZA_ERROR('501', 'cancel', 'feature-not-implemented');
var ERR_FORBIDDEN = var ERR_FORBIDDEN =
STANZA_ERROR('403', 'auth', 'forbidden'); STANZA_ERROR('403', 'auth', 'forbidden');
var ERR_GONE = var ERR_GONE =
STANZA_ERROR('302', 'modify', 'gone'); STANZA_ERROR('302', 'modify', 'gone');
var ERR_INTERNAL_SERVER_ERROR = var ERR_INTERNAL_SERVER_ERROR =
STANZA_ERROR('500', 'wait', 'internal-server-error'); STANZA_ERROR('500', 'wait', 'internal-server-error');
var ERR_ITEM_NOT_FOUND = var ERR_ITEM_NOT_FOUND =
STANZA_ERROR('404', 'cancel', 'item-not-found'); STANZA_ERROR('404', 'cancel', 'item-not-found');
var ERR_JID_MALFORMED = var ERR_JID_MALFORMED =
STANZA_ERROR('400', 'modify', 'jid-malformed'); STANZA_ERROR('400', 'modify', 'jid-malformed');
var ERR_NOT_ACCEPTABLE = var ERR_NOT_ACCEPTABLE =
STANZA_ERROR('406', 'modify', 'not-acceptable'); STANZA_ERROR('406', 'modify', 'not-acceptable');
var ERR_NOT_ALLOWED = var ERR_NOT_ALLOWED =
STANZA_ERROR('405', 'cancel', 'not-allowed'); STANZA_ERROR('405', 'cancel', 'not-allowed');
var ERR_NOT_AUTHORIZED = var ERR_NOT_AUTHORIZED =
STANZA_ERROR('401', 'auth', 'not-authorized'); STANZA_ERROR('401', 'auth', 'not-authorized');
var ERR_PAYMENT_REQUIRED = var ERR_PAYMENT_REQUIRED =
STANZA_ERROR('402', 'auth', 'payment-required'); STANZA_ERROR('402', 'auth', 'payment-required');
var ERR_RECIPIENT_UNAVAILABLE = var ERR_RECIPIENT_UNAVAILABLE =
STANZA_ERROR('404', 'wait', 'recipient-unavailable'); STANZA_ERROR('404', 'wait', 'recipient-unavailable');
var ERR_REDIRECT = var ERR_REDIRECT =
STANZA_ERROR('302', 'modify', 'redirect'); STANZA_ERROR('302', 'modify', 'redirect');
var ERR_REGISTRATION_REQUIRED = var ERR_REGISTRATION_REQUIRED =
STANZA_ERROR('407', 'auth', 'registration-required'); STANZA_ERROR('407', 'auth', 'registration-required');
var ERR_REMOTE_SERVER_NOT_FOUND = var ERR_REMOTE_SERVER_NOT_FOUND =
STANZA_ERROR('404', 'cancel', 'remote-server-not-found'); STANZA_ERROR('404', 'cancel', 'remote-server-not-found');
var ERR_REMOTE_SERVER_TIMEOUT = var ERR_REMOTE_SERVER_TIMEOUT =
STANZA_ERROR('504', 'wait', 'remote-server-timeout'); STANZA_ERROR('504', 'wait', 'remote-server-timeout');
var ERR_RESOURCE_CONSTRAINT = var ERR_RESOURCE_CONSTRAINT =
STANZA_ERROR('500', 'wait', 'resource-constraint'); STANZA_ERROR('500', 'wait', 'resource-constraint');
var ERR_SERVICE_UNAVAILABLE = var ERR_SERVICE_UNAVAILABLE =
STANZA_ERROR('503', 'cancel', 'service-unavailable'); STANZA_ERROR('503', 'cancel', 'service-unavailable');
var ERR_SUBSCRIPTION_REQUIRED = var ERR_SUBSCRIPTION_REQUIRED =
STANZA_ERROR('407', 'auth', 'subscription-required'); STANZA_ERROR('407', 'auth', 'subscription-required');
var ERR_UNEXPECTED_REQUEST = var ERR_UNEXPECTED_REQUEST =
STANZA_ERROR('400', 'wait', 'unexpected-request'); STANZA_ERROR('400', 'wait', 'unexpected-request');

View file

@ -20,7 +20,7 @@ var DataForm = (function () {
var self = {}; var self = {};
/** /**
* Gets the defined dataform elements * Gets the defined dataform elements
* @public * @public
* @param {string} host * @param {string} host
@ -384,7 +384,7 @@ var DataForm = (function () {
}; };
/** /**
* Handles the command dataform * Handles the command dataform
* @public * @public
* @param {object} iq * @param {object} iq
@ -943,7 +943,7 @@ var DataForm = (function () {
}; };
/** /**
* Gets the dataform type * Gets the dataform type
* @public * @public
* @param {string} host * @param {string} host

View file

@ -25,7 +25,7 @@ var DataStore = (function () {
self._persistent_emulated = {}; self._persistent_emulated = {};
/** /**
* Common: storage adapter * Common: storage adapter
* @public * @public
* @param {object} storage_native * @param {object} storage_native
@ -234,7 +234,7 @@ var DataStore = (function () {
}; };
/** /**
* Temporary: used to check a database entry exists * Temporary: used to check a database entry exists
* @public * @public
* @param {string} dbID * @param {string} dbID
@ -378,7 +378,7 @@ var DataStore = (function () {
}; };
/** /**
* Persistent: used to remove a database entry * Persistent: used to remove a database entry
* @public * @public
* @param {string} dbID * @param {string} dbID

View file

@ -25,7 +25,7 @@ var DateUtils = (function () {
self.presence_last_activity = 0; self.presence_last_activity = 0;
/** /**
* Gets a stamp from a date * Gets a stamp from a date
* @public * @public
* @param {Date} date * @param {Date} date
@ -115,7 +115,7 @@ var DateUtils = (function () {
}; };
/** /**
* Generates the time for XMPP * Generates the time for XMPP
* @public * @public
* @param {string} location * @param {string} location
@ -288,7 +288,7 @@ var DateUtils = (function () {
}; };
/** /**
* Parses a XMPP date (hh-mm-ss) into an human-readable one * Parses a XMPP date (hh-mm-ss) into an human-readable one
* @public * @public
* @param {string} to_parse * @param {string} to_parse

View file

@ -20,7 +20,7 @@ var Directory = (function () {
var self = {}; var self = {};
/** /**
* Opens the directory popup * Opens the directory popup
* @public * @public
* @return {boolean} * @return {boolean}

View file

@ -20,7 +20,7 @@ var Discovery = (function () {
var self = {}; var self = {};
/** /**
* Opens the discovery popup * Opens the discovery popup
* @public * @public
* @return {boolean} * @return {boolean}

View file

@ -20,7 +20,7 @@ var Errors = (function () {
var self = {}; var self = {};
/** /**
* Shows the given error output * Shows the given error output
* @public * @public
* @param {string} condition * @param {string} condition

View file

@ -20,7 +20,7 @@ var Favorites = (function () {
var self = {}; var self = {};
/** /**
* Opens the favorites popup * Opens the favorites popup
* @public * @public
* @return {undefined} * @return {undefined}
@ -255,7 +255,7 @@ var Favorites = (function () {
}; };
/** /**
* Edits a favorite * Edits a favorite
* @public * @public
* @return {undefined} * @return {undefined}
@ -365,6 +365,8 @@ var Favorites = (function () {
Console.info('Action on this bookmark: ' + room + '@' + server + ' / ' + type); Console.info('Action on this bookmark: ' + room + '@' + server + ' / ' + type);
} catch(e) { } catch(e) {
Console.error('Favorites.terminateThis', e); Console.error('Favorites.terminateThis', e);
} finally {
return false;
} }
}; };
@ -444,7 +446,7 @@ var Favorites = (function () {
}; };
/** /**
* Gets a list of the MUC items on a given server * Gets a list of the MUC items on a given server
* @public * @public
* @return {undefined} * @return {undefined}
@ -663,11 +665,11 @@ var Favorites = (function () {
if(e.keyCode == 13) { if(e.keyCode == 13) {
// Edit a favorite // Edit a favorite
if($(path + 'fedit-edit').is(':visible')) if($(path + 'fedit-edit').is(':visible'))
terminateThis('edit'); self.terminateThis('edit');
// Add a favorite // Add a favorite
else else
terminateThis('add'); self.terminateThis('add');
} }
}); });
@ -690,15 +692,15 @@ var Favorites = (function () {
}); });
$(path + 'fedit-add').click(function() { $(path + 'fedit-add').click(function() {
return terminateThis('add'); return self.terminateThis('add');
}); });
$(path + 'fedit-edit').click(function() { $(path + 'fedit-edit').click(function() {
return terminateThis('edit'); return self.terminateThis('edit');
}); });
$(path + 'fedit-remove').click(function() { $(path + 'fedit-remove').click(function() {
return terminateThis('remove'); return self.terminateThis('remove');
}); });
$(path + 'bottom .finish').click(function() { $(path + 'bottom .finish').click(function() {

View file

@ -20,7 +20,23 @@ var Features = (function () {
var self = {}; var self = {};
/** /* Constants */
self.SERVER_NAMES = [
'metronome',
'prosody',
'ejabberd',
'jabberd',
'openfire',
'tigase',
'isode'
];
/* Variables */
self.server_name = null;
/**
* Gets the features of a server * Gets the features of a server
* @public * @public
* @return {undefined} * @return {undefined}
@ -89,10 +105,12 @@ var Features = (function () {
// Markers // Markers
var namespaces = [NS_PUBSUB, NS_PUBSUB_CN, NS_URN_MAM, NS_COMMANDS, NS_URN_CARBONS]; var namespaces = [NS_PUBSUB, NS_PUBSUB_CN, NS_URN_MAM, NS_COMMANDS, NS_URN_CARBONS];
var identity = selector.find('identity');
var cur_feature; var cur_feature;
var features = { var features = {
// This weird selector fixes the same IE8 bug as above... // This weird selector fixes the same IE8 bug as above...
'pep': (selector.find('identity').filter(function() { 'pep': (identity.filter(function() {
var this_sel = $(this); var this_sel = $(this);
return (this_sel.attr('category') == 'pubsub' && this_sel.attr('type') == 'pep'); return (this_sel.attr('category') == 'pubsub' && this_sel.attr('type') == 'pep');
}).size() && true) }).size() && true)
@ -105,7 +123,12 @@ var Features = (function () {
self.enable(namespace); self.enable(namespace);
} }
}); });
// Retrieve server identity
self.server_name = self._normalizeServerName(
identity.filter('[category="server"]').attr('name')
);
// Enable the pep elements if available // Enable the pep elements if available
if(features.pep === true) { if(features.pep === true) {
// Update our database // Update our database
@ -246,7 +269,7 @@ var Features = (function () {
}; };
/** /**
* Returns the XMPP server PEP support * Returns the XMPP server PEP support
* @public * @public
* @return {boolean} * @return {boolean}
@ -362,6 +385,49 @@ var Features = (function () {
}; };
/**
* Normalizes the XMPP server name
* @private
* @return {string}
*/
self._normalizeServerName = function(name) {
try {
var cur_r;
for(var i in self.SERVER_NAMES) {
cur_r = new RegExp(self.SERVER_NAMES[i], 'gi');
if(cur_r.exec(name) !== null) {
name = self.SERVER_NAMES[i];
break;
}
}
} catch(e) {
Console.error('Features._normalizeServerName', e);
} finally {
return name;
}
};
/**
* Returns the XMPP server name
* @public
* @return {string}
*/
self.getServerName = function() {
try {
return self.server_name;
} catch(e) {
Console.error('Features.getServerName', e);
}
};
/** /**
* Return class scope * Return class scope
*/ */

View file

@ -20,7 +20,7 @@ var Filter = (function () {
var self = {}; var self = {};
/** /**
* Generates a given emoticon HTML code * Generates a given emoticon HTML code
* @public * @public
* @param {string} image * @param {string} image

View file

@ -24,7 +24,7 @@ var Groupchat = (function () {
var JOIN_SUGGEST = []; var JOIN_SUGGEST = [];
/** /**
* Displays the MUC admin elements * Displays the MUC admin elements
* @public * @public
* @param {string} affiliation * @param {string} affiliation
@ -348,7 +348,7 @@ var Groupchat = (function () {
}; };
/** /**
* Generates a groupchat to join array * Generates a groupchat to join array
* @public * @public
* @return {object} * @return {object}

View file

@ -20,7 +20,7 @@ var Home = (function () {
var self = {}; var self = {};
/** /**
* Allows the user to switch the difference home page elements * Allows the user to switch the difference home page elements
* @public * @public
* @param {string} div * @param {string} div

View file

@ -20,7 +20,7 @@ var HTTPAuth = (function () {
var self = {}; var self = {};
/** /**
* Login to a HTTP session * Login to a HTTP session
* @public * @public
* @param {string} lNick * @param {string} lNick
@ -55,7 +55,7 @@ var HTTPAuth = (function () {
} }
// And we handle everything that happen // And we handle everything that happen
self.setupCon(con); Connection.setupCon(con);
// Generate a resource // Generate a resource
var random_resource = DataStore.getDB(Connection.desktop_hash, 'session', 'resource'); var random_resource = DataStore.getDB(Connection.desktop_hash, 'session', 'resource');

View file

@ -20,7 +20,7 @@ var Inbox = (function () {
var self = {}; var self = {};
/** /**
* Opens the inbox popup * Opens the inbox popup
* @public * @public
* @return {boolean} * @return {boolean}
@ -232,7 +232,7 @@ var Inbox = (function () {
}; };
/** /**
* Cleans the inbox * Cleans the inbox
* @public * @public
* @return {undefined} * @return {undefined}
@ -469,7 +469,7 @@ var Inbox = (function () {
}; };
/** /**
* Stores an inbox message * Stores an inbox message
* @public * @public
* @param {string} from * @param {string} from
@ -715,7 +715,7 @@ var Inbox = (function () {
}; };
/** /**
* Hides a normal message content * Hides a normal message content
* @public * @public
* @param {string} id * @param {string} id

View file

@ -20,7 +20,7 @@ var IntegrateBox = (function () {
var self = {}; var self = {};
/** /**
* Opens the integratebox popup * Opens the integratebox popup
* @public * @public
* @return {undefined} * @return {undefined}
@ -309,7 +309,7 @@ var IntegrateBox = (function () {
}; };
/** /**
* Filters a string to apply the integratebox links * Filters a string to apply the integratebox links
* @public * @public
* @param {string} data * @param {string} data

View file

@ -24,7 +24,7 @@ var Interface = (function () {
self.chat_focus_hash = null; self.chat_focus_hash = null;
/** /**
* Changes the title of the document * Changes the title of the document
* @public * @public
* @param {string} new_title * @param {string} new_title
@ -166,7 +166,7 @@ var Interface = (function () {
}; };
/** /**
* Loads the complete chat switcher * Loads the complete chat switcher
* @public * @public
* @return {undefined} * @return {undefined}
@ -433,7 +433,7 @@ var Interface = (function () {
}; };
/** /**
* Notifies the user from a new incoming message * Notifies the user from a new incoming message
* @public * @public
* @param {string} hash * @param {string} hash
@ -451,17 +451,19 @@ var Interface = (function () {
// We notify the user if he has not the focus on the chat // We notify the user if he has not the focus on the chat
if(!active || !Common.isFocused() || (self.chat_focus_hash != hash)) { if(!active || !Common.isFocused() || (self.chat_focus_hash != hash)) {
if(!active) { if(!active) {
if(type == 'personal') if(type == 'personal') {
$(tested + ', ' + chat_switch + 'more-button').addClass('chan-newmessage'); $(tested + ', ' + chat_switch + 'more-button').addClass('chan-newmessage');
else if(type == 'unread') } else if(type == 'unread') {
$(tested).addClass('chan-unread'); $(tested).addClass('chan-unread');
}
} }
// Count the number of pending messages // Count the number of pending messages
var pending = 1; var pending = 1;
if(Common.exists('#' + hash + '[data-counter]')) if(Common.exists('#' + hash + '[data-counter]')) {
pending = parseInt($('#' + hash).attr('data-counter')) + 1; pending = parseInt($('#' + hash).attr('data-counter')) + 1;
}
$('#' + hash).attr('data-counter', pending); $('#' + hash).attr('data-counter', pending);
} }
@ -570,7 +572,7 @@ var Interface = (function () {
}; };
/** /**
* Shows all the buddies in the roster * Shows all the buddies in the roster
* @public * @public
* @param {string} from * @param {string} from

View file

@ -15,340 +15,340 @@ Author: Camaran
* Released under MIT license, http://cubiq.org/license * Released under MIT license, http://cubiq.org/license
*/ */
var addToHome = (function (w) { var addToHome = (function (w) {
var nav = w.navigator, var nav = w.navigator,
isIDevice = 'platform' in nav && (/iphone|ipod|ipad/gi).test(nav.platform), isIDevice = 'platform' in nav && (/iphone|ipod|ipad/gi).test(nav.platform),
isIPad, isIPad,
isRetina, isRetina,
isSafari, isSafari,
isStandalone, isStandalone,
OSVersion, OSVersion,
startX = 0, startX = 0,
startY = 0, startY = 0,
lastVisit = 0, lastVisit = 0,
isExpired, isExpired,
isSessionActive, isSessionActive,
isReturningVisitor, isReturningVisitor,
balloon, balloon,
overrideChecks, overrideChecks,
positionInterval, positionInterval,
closeTimeout, closeTimeout,
options = { options = {
autostart: true, // Automatically open the balloon autostart: true, // Automatically open the balloon
returningVisitor: false, // Show the balloon to returning visitors only (setting this to true is highly recommended) returningVisitor: false, // Show the balloon to returning visitors only (setting this to true is highly recommended)
animationIn: 'drop', // drop || bubble || fade animationIn: 'drop', // drop || bubble || fade
animationOut: 'fade', // drop || bubble || fade animationOut: 'fade', // drop || bubble || fade
startDelay: 2000, // 2 seconds from page load before the balloon appears startDelay: 2000, // 2 seconds from page load before the balloon appears
lifespan: 15000, // 15 seconds before it is automatically destroyed lifespan: 15000, // 15 seconds before it is automatically destroyed
bottomOffset: 14, // Distance of the balloon from bottom bottomOffset: 14, // Distance of the balloon from bottom
expire: 0, // Minutes to wait before showing the popup again (0 = always displayed) expire: 0, // Minutes to wait before showing the popup again (0 = always displayed)
message: '', // Customize your message or force a language ('' = automatic) message: '', // Customize your message or force a language ('' = automatic)
touchIcon: false, // Display the touch icon touchIcon: false, // Display the touch icon
arrow: true, // Display the balloon arrow arrow: true, // Display the balloon arrow
hookOnLoad: true, // Should we hook to onload event? (really advanced usage) hookOnLoad: true, // Should we hook to onload event? (really advanced usage)
closeButton: true, // Let the user close the balloon closeButton: true, // Let the user close the balloon
iterations: 100 // Internal/debug use iterations: 100 // Internal/debug use
}, },
intl = { intl = {
ar: '<span dir="rtl">قم بتثبيت هذا التطبيق على <span dir="ltr">%device:</span>انقر<span dir="ltr">%icon</span> ،<strong>ثم اضفه الى الشاشة الرئيسية.</strong></span>', ar: '<span dir="rtl">قم بتثبيت هذا التطبيق على <span dir="ltr">%device:</span>انقر<span dir="ltr">%icon</span> ،<strong>ثم اضفه الى الشاشة الرئيسية.</strong></span>',
ca_es: 'Per instal·lar aquesta aplicació al vostre %device premeu %icon i llavors <strong>Afegir a pantalla d\'inici</strong>.', ca_es: 'Per instal·lar aquesta aplicació al vostre %device premeu %icon i llavors <strong>Afegir a pantalla d\'inici</strong>.',
cs_cz: 'Pro instalaci aplikace na Váš %device, stiskněte %icon a v nabídce <strong>Přidat na plochu</strong>.', cs_cz: 'Pro instalaci aplikace na Váš %device, stiskněte %icon a v nabídce <strong>Přidat na plochu</strong>.',
da_dk: 'Tilføj denne side til din %device: tryk på %icon og derefter <strong>Føj til hjemmeskærm</strong>.', da_dk: 'Tilføj denne side til din %device: tryk på %icon og derefter <strong>Føj til hjemmeskærm</strong>.',
de_de: 'Installieren Sie diese App auf Ihrem %device: %icon antippen und dann <strong>Zum Home-Bildschirm</strong>.', de_de: 'Installieren Sie diese App auf Ihrem %device: %icon antippen und dann <strong>Zum Home-Bildschirm</strong>.',
el_gr: 'Εγκαταστήσετε αυτήν την Εφαρμογή στήν συσκευή σας %device: %icon μετά πατάτε <strong>Προσθήκη σε Αφετηρία</strong>.', el_gr: 'Εγκαταστήσετε αυτήν την Εφαρμογή στήν συσκευή σας %device: %icon μετά πατάτε <strong>Προσθήκη σε Αφετηρία</strong>.',
en_us: 'Install this web app on your %device: tap %icon and then <strong>Add to Home Screen</strong>.', en_us: 'Install this web app on your %device: tap %icon and then <strong>Add to Home Screen</strong>.',
es_es: 'Para instalar esta app en su %device, pulse %icon y seleccione <strong>Añadir a pantalla de inicio</strong>.', es_es: 'Para instalar esta app en su %device, pulse %icon y seleccione <strong>Añadir a pantalla de inicio</strong>.',
fi_fi: 'Asenna tämä web-sovellus laitteeseesi %device: paina %icon ja sen jälkeen valitse <strong>Lisää Koti-valikkoon</strong>.', fi_fi: 'Asenna tämä web-sovellus laitteeseesi %device: paina %icon ja sen jälkeen valitse <strong>Lisää Koti-valikkoon</strong>.',
fr_fr: 'Ajoutez cette application sur votre %device en cliquant sur %icon, puis <strong>Ajouter à l\'écran d\'accueil</strong>.', fr_fr: 'Ajoutez cette application sur votre %device en cliquant sur %icon, puis <strong>Ajouter à l\'écran d\'accueil</strong>.',
he_il: '<span dir="rtl">התקן אפליקציה זו על ה-%device שלך: הקש %icon ואז <strong>הוסף למסך הבית</strong>.</span>', he_il: '<span dir="rtl">התקן אפליקציה זו על ה-%device שלך: הקש %icon ואז <strong>הוסף למסך הבית</strong>.</span>',
hr_hr: 'Instaliraj ovu aplikaciju na svoj %device: klikni na %icon i odaberi <strong>Dodaj u početni zaslon</strong>.', hr_hr: 'Instaliraj ovu aplikaciju na svoj %device: klikni na %icon i odaberi <strong>Dodaj u početni zaslon</strong>.',
hu_hu: 'Telepítse ezt a web-alkalmazást az Ön %device-jára: nyomjon a %icon-ra majd a <strong>Főképernyőhöz adás</strong> gombra.', hu_hu: 'Telepítse ezt a web-alkalmazást az Ön %device-jára: nyomjon a %icon-ra majd a <strong>Főképernyőhöz adás</strong> gombra.',
it_it: 'Installa questa applicazione sul tuo %device: premi su %icon e poi <strong>Aggiungi a Home</strong>.', it_it: 'Installa questa applicazione sul tuo %device: premi su %icon e poi <strong>Aggiungi a Home</strong>.',
ja_jp: 'このウェブアプリをあなたの%deviceにインストールするには%iconをタップして<strong>ホーム画面に追加</strong>を選んでください。', ja_jp: 'このウェブアプリをあなたの%deviceにインストールするには%iconをタップして<strong>ホーム画面に追加</strong>を選んでください。',
ko_kr: '%device에 웹앱을 설치하려면 %icon을 터치 후 "홈화면에 추가"를 선택하세요', ko_kr: '%device에 웹앱을 설치하려면 %icon을 터치 후 "홈화면에 추가"를 선택하세요',
nb_no: 'Installer denne appen på din %device: trykk på %icon og deretter <strong>Legg til på Hjem-skjerm</strong>', nb_no: 'Installer denne appen på din %device: trykk på %icon og deretter <strong>Legg til på Hjem-skjerm</strong>',
nl_nl: 'Installeer deze webapp op uw %device: tik %icon en dan <strong>Voeg toe aan beginscherm</strong>.', nl_nl: 'Installeer deze webapp op uw %device: tik %icon en dan <strong>Voeg toe aan beginscherm</strong>.',
pl_pl: 'Aby zainstalować tę aplikacje na %device: naciśnij %icon a następnie <strong>Dodaj jako ikonę</strong>.', pl_pl: 'Aby zainstalować tę aplikacje na %device: naciśnij %icon a następnie <strong>Dodaj jako ikonę</strong>.',
pt_br: 'Instale este aplicativo em seu %device: aperte %icon e selecione <strong>Adicionar à Tela Inicio</strong>.', pt_br: 'Instale este aplicativo em seu %device: aperte %icon e selecione <strong>Adicionar à Tela Inicio</strong>.',
pt_pt: 'Para instalar esta aplicação no seu %device, prima o %icon e depois em <strong>Adicionar ao ecrã principal</strong>.', pt_pt: 'Para instalar esta aplicação no seu %device, prima o %icon e depois em <strong>Adicionar ao ecrã principal</strong>.',
ru_ru: 'Установите это веб-приложение на ваш %device: нажмите %icon, затем <strong>Добавить в «Домой»</strong>.', ru_ru: 'Установите это веб-приложение на ваш %device: нажмите %icon, затем <strong>Добавить в «Домой»</strong>.',
sv_se: 'Lägg till denna webbapplikation på din %device: tryck på %icon och därefter <strong>Lägg till på hemskärmen</strong>.', sv_se: 'Lägg till denna webbapplikation på din %device: tryck på %icon och därefter <strong>Lägg till på hemskärmen</strong>.',
th_th: 'ติดตั้งเว็บแอพฯ นี้บน %device ของคุณ: แตะ %icon และ <strong>เพิ่มที่หน้าจอโฮม</strong>', th_th: 'ติดตั้งเว็บแอพฯ นี้บน %device ของคุณ: แตะ %icon และ <strong>เพิ่มที่หน้าจอโฮม</strong>',
tr_tr: 'Bu uygulamayı %device\'a eklemek için %icon simgesine sonrasında <strong>Ana Ekrana Ekle</strong> düğmesine basın.', tr_tr: 'Bu uygulamayı %device\'a eklemek için %icon simgesine sonrasında <strong>Ana Ekrana Ekle</strong> düğmesine basın.',
uk_ua: 'Встановіть цей веб сайт на Ваш %device: натисніть %icon, а потім <strong>На початковий екран</strong>.', uk_ua: 'Встановіть цей веб сайт на Ваш %device: натисніть %icon, а потім <strong>На початковий екран</strong>.',
zh_cn: '您可以将此应用程式安装到您的 %device 上。请按 %icon 然后点选<strong>添加至主屏幕</strong>。', zh_cn: '您可以将此应用程式安装到您的 %device 上。请按 %icon 然后点选<strong>添加至主屏幕</strong>。',
zh_tw: '您可以將此應用程式安裝到您的 %device 上。請按 %icon 然後點選<strong>加入主畫面螢幕</strong>。' zh_tw: '您可以將此應用程式安裝到您的 %device 上。請按 %icon 然後點選<strong>加入主畫面螢幕</strong>。'
}; };
function init () { function init () {
// Preliminary check, all further checks are performed on iDevices only // Preliminary check, all further checks are performed on iDevices only
if ( !isIDevice ) return; if ( !isIDevice ) return;
var now = Date.now(), var now = Date.now(),
i; i;
// Merge local with global options // Merge local with global options
if ( w.addToHomeConfig ) { if ( w.addToHomeConfig ) {
for ( i in w.addToHomeConfig ) { for ( i in w.addToHomeConfig ) {
options[i] = w.addToHomeConfig[i]; options[i] = w.addToHomeConfig[i];
} }
} }
if ( !options.autostart ) options.hookOnLoad = false; if ( !options.autostart ) options.hookOnLoad = false;
isIPad = (/ipad/gi).test(nav.platform); isIPad = (/ipad/gi).test(nav.platform);
isRetina = w.devicePixelRatio && w.devicePixelRatio > 1; isRetina = w.devicePixelRatio && w.devicePixelRatio > 1;
isSafari = (/Safari/i).test(nav.appVersion) && !(/CriOS/i).test(nav.appVersion); isSafari = (/Safari/i).test(nav.appVersion) && !(/CriOS/i).test(nav.appVersion);
isStandalone = nav.standalone; isStandalone = nav.standalone;
OSVersion = nav.appVersion.match(/OS (\d+_\d+)/i); OSVersion = nav.appVersion.match(/OS (\d+_\d+)/i);
OSVersion = OSVersion && OSVersion[1] ? +OSVersion[1].replace('_', '.') : 0; OSVersion = OSVersion && OSVersion[1] ? +OSVersion[1].replace('_', '.') : 0;
lastVisit = +w.localStorage.getItem('addToHome'); lastVisit = +w.localStorage.getItem('addToHome');
isSessionActive = w.sessionStorage.getItem('addToHomeSession'); isSessionActive = w.sessionStorage.getItem('addToHomeSession');
isReturningVisitor = options.returningVisitor ? lastVisit && lastVisit + 28*24*60*60*1000 > now : true; isReturningVisitor = options.returningVisitor ? lastVisit && lastVisit + 28*24*60*60*1000 > now : true;
if ( !lastVisit ) lastVisit = now; if ( !lastVisit ) lastVisit = now;
// If it is expired we need to reissue a new balloon // If it is expired we need to reissue a new balloon
isExpired = isReturningVisitor && lastVisit <= now; isExpired = isReturningVisitor && lastVisit <= now;
if ( options.hookOnLoad ) w.addEventListener('load', loaded, false); if ( options.hookOnLoad ) w.addEventListener('load', loaded, false);
else if ( !options.hookOnLoad && options.autostart ) loaded(); else if ( !options.hookOnLoad && options.autostart ) loaded();
} }
function loaded () { function loaded () {
w.removeEventListener('load', loaded, false); w.removeEventListener('load', loaded, false);
if ( !isReturningVisitor ) w.localStorage.setItem('addToHome', Date.now()); if ( !isReturningVisitor ) w.localStorage.setItem('addToHome', Date.now());
else if ( options.expire && isExpired ) w.localStorage.setItem('addToHome', Date.now() + options.expire * 60000); else if ( options.expire && isExpired ) w.localStorage.setItem('addToHome', Date.now() + options.expire * 60000);
if ( !overrideChecks && ( !isSafari || !isExpired || isSessionActive || isStandalone || !isReturningVisitor ) ) return; if ( !overrideChecks && ( !isSafari || !isExpired || isSessionActive || isStandalone || !isReturningVisitor ) ) return;
var touchIcon = '', var touchIcon = '',
platform = nav.platform.split(' ')[0], platform = nav.platform.split(' ')[0],
language = nav.language.replace('-', '_'); language = nav.language.replace('-', '_');
balloon = document.createElement('div'); balloon = document.createElement('div');
balloon.id = 'addToHomeScreen'; balloon.id = 'addToHomeScreen';
balloon.style.cssText += 'left:-9999px;-webkit-transition-property:-webkit-transform,opacity;-webkit-transition-duration:0;-webkit-transform:translate3d(0,0,0);position:' + (OSVersion < 5 ? 'absolute' : 'fixed'); balloon.style.cssText += 'left:-9999px;-webkit-transition-property:-webkit-transform,opacity;-webkit-transition-duration:0;-webkit-transform:translate3d(0,0,0);position:' + (OSVersion < 5 ? 'absolute' : 'fixed');
// Localize message // Localize message
if ( options.message in intl ) { // You may force a language despite the user's locale if ( options.message in intl ) { // You may force a language despite the user's locale
language = options.message; language = options.message;
options.message = ''; options.message = '';
} }
if ( options.message === '' ) { // We look for a suitable language (defaulted to en_us) if ( options.message === '' ) { // We look for a suitable language (defaulted to en_us)
options.message = language in intl ? intl[language] : intl['en_us']; options.message = language in intl ? intl[language] : intl['en_us'];
} }
if ( options.touchIcon ) { if ( options.touchIcon ) {
touchIcon = isRetina ? touchIcon = isRetina ?
document.querySelector('head link[rel^=apple-touch-icon][sizes="114x114"],head link[rel^=apple-touch-icon][sizes="144x144"],head link[rel^=apple-touch-icon]') : document.querySelector('head link[rel^=apple-touch-icon][sizes="114x114"],head link[rel^=apple-touch-icon][sizes="144x144"],head link[rel^=apple-touch-icon]') :
document.querySelector('head link[rel^=apple-touch-icon][sizes="57x57"],head link[rel^=apple-touch-icon]'); document.querySelector('head link[rel^=apple-touch-icon][sizes="57x57"],head link[rel^=apple-touch-icon]');
if ( touchIcon ) { if ( touchIcon ) {
touchIcon = '<span style="background-image:url(' + touchIcon.href + ')" class="addToHomeTouchIcon"></span>'; touchIcon = '<span style="background-image:url(' + touchIcon.href + ')" class="addToHomeTouchIcon"></span>';
} }
} }
balloon.className = (isIPad ? 'addToHomeIpad' : 'addToHomeIphone') + (touchIcon ? ' addToHomeWide' : ''); balloon.className = (isIPad ? 'addToHomeIpad' : 'addToHomeIphone') + (touchIcon ? ' addToHomeWide' : '');
balloon.innerHTML = touchIcon + balloon.innerHTML = touchIcon +
options.message.replace('%device', platform).replace('%icon', OSVersion >= 4.2 ? '<span class="addToHomeShare' + (OSVersion >= 7 ? ' addToHomeShareOS7' : '') + '"></span>' : '<span class="addToHomePlus">+</span>') + options.message.replace('%device', platform).replace('%icon', OSVersion >= 4.2 ? '<span class="addToHomeShare' + (OSVersion >= 7 ? ' addToHomeShareOS7' : '') + '"></span>' : '<span class="addToHomePlus">+</span>') +
(options.arrow ? '<span class="addToHomeArrow"></span>' : '') + (options.arrow ? '<span class="addToHomeArrow"></span>' : '') +
(options.closeButton ? '<span class="addToHomeClose">\u00D7</span>' : ''); (options.closeButton ? '<span class="addToHomeClose">\u00D7</span>' : '');
document.body.appendChild(balloon); document.body.appendChild(balloon);
// Add the close action // Add the close action
if ( options.closeButton ) balloon.addEventListener('click', clicked, false); if ( options.closeButton ) balloon.addEventListener('click', clicked, false);
if ( !isIPad && OSVersion >= 6 ) window.addEventListener('orientationchange', orientationCheck, false); if ( !isIPad && OSVersion >= 6 ) window.addEventListener('orientationchange', orientationCheck, false);
setTimeout(show, options.startDelay); setTimeout(show, options.startDelay);
} }
function show () { function show () {
var duration, var duration,
iPadXShift = 208; iPadXShift = 208;
// Set the initial position // Set the initial position
if ( isIPad ) { if ( isIPad ) {
if ( OSVersion < 5 ) { if ( OSVersion < 5 ) {
startY = w.scrollY; startY = w.scrollY;
startX = w.scrollX; startX = w.scrollX;
} else if ( OSVersion < 6 ) { } else if ( OSVersion < 6 ) {
iPadXShift = 160; iPadXShift = 160;
} }
balloon.style.top = startY + options.bottomOffset + 'px'; balloon.style.top = startY + options.bottomOffset + 'px';
balloon.style.left = startX + iPadXShift - Math.round(balloon.offsetWidth / 2) + 'px'; balloon.style.left = startX + iPadXShift - Math.round(balloon.offsetWidth / 2) + 'px';
switch ( options.animationIn ) { switch ( options.animationIn ) {
case 'drop': case 'drop':
duration = '0.6s'; duration = '0.6s';
balloon.style.webkitTransform = 'translate3d(0,' + -(w.scrollY + options.bottomOffset + balloon.offsetHeight) + 'px,0)'; balloon.style.webkitTransform = 'translate3d(0,' + -(w.scrollY + options.bottomOffset + balloon.offsetHeight) + 'px,0)';
break; break;
case 'bubble': case 'bubble':
duration = '0.6s'; duration = '0.6s';
balloon.style.opacity = '0'; balloon.style.opacity = '0';
balloon.style.webkitTransform = 'translate3d(0,' + (startY + 50) + 'px,0)'; balloon.style.webkitTransform = 'translate3d(0,' + (startY + 50) + 'px,0)';
break; break;
default: default:
duration = '1s'; duration = '1s';
balloon.style.opacity = '0'; balloon.style.opacity = '0';
} }
} else { } else {
startY = w.innerHeight + w.scrollY; startY = w.innerHeight + w.scrollY;
if ( OSVersion < 5 ) { if ( OSVersion < 5 ) {
startX = Math.round((w.innerWidth - balloon.offsetWidth) / 2) + w.scrollX; startX = Math.round((w.innerWidth - balloon.offsetWidth) / 2) + w.scrollX;
balloon.style.left = startX + 'px'; balloon.style.left = startX + 'px';
balloon.style.top = startY - balloon.offsetHeight - options.bottomOffset + 'px'; balloon.style.top = startY - balloon.offsetHeight - options.bottomOffset + 'px';
} else { } else {
balloon.style.left = '50%'; balloon.style.left = '50%';
balloon.style.marginLeft = -Math.round(balloon.offsetWidth / 2) - ( w.orientation%180 && OSVersion >= 6 ? 40 : 0 ) + 'px'; balloon.style.marginLeft = -Math.round(balloon.offsetWidth / 2) - ( w.orientation%180 && OSVersion >= 6 ? 40 : 0 ) + 'px';
balloon.style.bottom = options.bottomOffset + 'px'; balloon.style.bottom = options.bottomOffset + 'px';
} }
switch (options.animationIn) { switch (options.animationIn) {
case 'drop': case 'drop':
duration = '1s'; duration = '1s';
balloon.style.webkitTransform = 'translate3d(0,' + -(startY + options.bottomOffset) + 'px,0)'; balloon.style.webkitTransform = 'translate3d(0,' + -(startY + options.bottomOffset) + 'px,0)';
break; break;
case 'bubble': case 'bubble':
duration = '0.6s'; duration = '0.6s';
balloon.style.webkitTransform = 'translate3d(0,' + (balloon.offsetHeight + options.bottomOffset + 50) + 'px,0)'; balloon.style.webkitTransform = 'translate3d(0,' + (balloon.offsetHeight + options.bottomOffset + 50) + 'px,0)';
break; break;
default: default:
duration = '1s'; duration = '1s';
balloon.style.opacity = '0'; balloon.style.opacity = '0';
} }
} }
balloon.offsetHeight; // repaint trick balloon.offsetHeight; // repaint trick
balloon.style.webkitTransitionDuration = duration; balloon.style.webkitTransitionDuration = duration;
balloon.style.opacity = '1'; balloon.style.opacity = '1';
balloon.style.webkitTransform = 'translate3d(0,0,0)'; balloon.style.webkitTransform = 'translate3d(0,0,0)';
balloon.addEventListener('webkitTransitionEnd', transitionEnd, false); balloon.addEventListener('webkitTransitionEnd', transitionEnd, false);
closeTimeout = setTimeout(close, options.lifespan); closeTimeout = setTimeout(close, options.lifespan);
} }
function manualShow (override) { function manualShow (override) {
if ( !isIDevice || balloon ) return; if ( !isIDevice || balloon ) return;
overrideChecks = override; overrideChecks = override;
loaded(); loaded();
} }
function close () { function close () {
clearInterval( positionInterval ); clearInterval( positionInterval );
clearTimeout( closeTimeout ); clearTimeout( closeTimeout );
closeTimeout = null; closeTimeout = null;
// check if the popup is displayed and prevent errors // check if the popup is displayed and prevent errors
if ( !balloon ) return; if ( !balloon ) return;
var posY = 0, var posY = 0,
posX = 0, posX = 0,
opacity = '1', opacity = '1',
duration = '0'; duration = '0';
if ( options.closeButton ) balloon.removeEventListener('click', clicked, false); if ( options.closeButton ) balloon.removeEventListener('click', clicked, false);
if ( !isIPad && OSVersion >= 6 ) window.removeEventListener('orientationchange', orientationCheck, false); if ( !isIPad && OSVersion >= 6 ) window.removeEventListener('orientationchange', orientationCheck, false);
if ( OSVersion < 5 ) { if ( OSVersion < 5 ) {
posY = isIPad ? w.scrollY - startY : w.scrollY + w.innerHeight - startY; posY = isIPad ? w.scrollY - startY : w.scrollY + w.innerHeight - startY;
posX = isIPad ? w.scrollX - startX : w.scrollX + Math.round((w.innerWidth - balloon.offsetWidth)/2) - startX; posX = isIPad ? w.scrollX - startX : w.scrollX + Math.round((w.innerWidth - balloon.offsetWidth)/2) - startX;
} }
balloon.style.webkitTransitionProperty = '-webkit-transform,opacity'; balloon.style.webkitTransitionProperty = '-webkit-transform,opacity';
switch ( options.animationOut ) { switch ( options.animationOut ) {
case 'drop': case 'drop':
if ( isIPad ) { if ( isIPad ) {
duration = '0.4s'; duration = '0.4s';
opacity = '0'; opacity = '0';
posY += 50; posY += 50;
} else { } else {
duration = '0.6s'; duration = '0.6s';
posY += balloon.offsetHeight + options.bottomOffset + 50; posY += balloon.offsetHeight + options.bottomOffset + 50;
} }
break; break;
case 'bubble': case 'bubble':
if ( isIPad ) { if ( isIPad ) {
duration = '0.8s'; duration = '0.8s';
posY -= balloon.offsetHeight + options.bottomOffset + 50; posY -= balloon.offsetHeight + options.bottomOffset + 50;
} else { } else {
duration = '0.4s'; duration = '0.4s';
opacity = '0'; opacity = '0';
posY -= 50; posY -= 50;
} }
break; break;
default: default:
duration = '0.8s'; duration = '0.8s';
opacity = '0'; opacity = '0';
} }
balloon.addEventListener('webkitTransitionEnd', transitionEnd, false); balloon.addEventListener('webkitTransitionEnd', transitionEnd, false);
balloon.style.opacity = opacity; balloon.style.opacity = opacity;
balloon.style.webkitTransitionDuration = duration; balloon.style.webkitTransitionDuration = duration;
balloon.style.webkitTransform = 'translate3d(' + posX + 'px,' + posY + 'px,0)'; balloon.style.webkitTransform = 'translate3d(' + posX + 'px,' + posY + 'px,0)';
} }
function clicked () { function clicked () {
w.sessionStorage.setItem('addToHomeSession', '1'); w.sessionStorage.setItem('addToHomeSession', '1');
isSessionActive = true; isSessionActive = true;
close(); close();
} }
function transitionEnd () { function transitionEnd () {
balloon.removeEventListener('webkitTransitionEnd', transitionEnd, false); balloon.removeEventListener('webkitTransitionEnd', transitionEnd, false);
balloon.style.webkitTransitionProperty = '-webkit-transform'; balloon.style.webkitTransitionProperty = '-webkit-transform';
balloon.style.webkitTransitionDuration = '0.2s'; balloon.style.webkitTransitionDuration = '0.2s';
// We reached the end! // We reached the end!
if ( !closeTimeout ) { if ( !closeTimeout ) {
balloon.parentNode.removeChild(balloon); balloon.parentNode.removeChild(balloon);
balloon = null; balloon = null;
return; return;
} }
// On iOS 4 we start checking the element position // On iOS 4 we start checking the element position
if ( OSVersion < 5 && closeTimeout ) positionInterval = setInterval(setPosition, options.iterations); if ( OSVersion < 5 && closeTimeout ) positionInterval = setInterval(setPosition, options.iterations);
} }
function setPosition () { function setPosition () {
var matrix = new WebKitCSSMatrix(w.getComputedStyle(balloon, null).webkitTransform), var matrix = new WebKitCSSMatrix(w.getComputedStyle(balloon, null).webkitTransform),
posY = isIPad ? w.scrollY - startY : w.scrollY + w.innerHeight - startY, posY = isIPad ? w.scrollY - startY : w.scrollY + w.innerHeight - startY,
posX = isIPad ? w.scrollX - startX : w.scrollX + Math.round((w.innerWidth - balloon.offsetWidth) / 2) - startX; posX = isIPad ? w.scrollX - startX : w.scrollX + Math.round((w.innerWidth - balloon.offsetWidth) / 2) - startX;
// Screen didn't move // Screen didn't move
if ( posY == matrix.m42 && posX == matrix.m41 ) return; if ( posY == matrix.m42 && posX == matrix.m41 ) return;
balloon.style.webkitTransform = 'translate3d(' + posX + 'px,' + posY + 'px,0)'; balloon.style.webkitTransform = 'translate3d(' + posX + 'px,' + posY + 'px,0)';
} }
// Clear local and session storages (this is useful primarily in development) // Clear local and session storages (this is useful primarily in development)
function reset () { function reset () {
w.localStorage.removeItem('addToHome'); w.localStorage.removeItem('addToHome');
w.sessionStorage.removeItem('addToHomeSession'); w.sessionStorage.removeItem('addToHomeSession');
} }
function orientationCheck () { function orientationCheck () {
balloon.style.marginLeft = -Math.round(balloon.offsetWidth / 2) - ( w.orientation%180 && OSVersion >= 6 ? 40 : 0 ) + 'px'; balloon.style.marginLeft = -Math.round(balloon.offsetWidth / 2) - ( w.orientation%180 && OSVersion >= 6 ? 40 : 0 ) + 'px';
} }
// Bootstrap! // Bootstrap!
init(); init();
return { return {
show: manualShow, show: manualShow,
close: close, close: close,
reset: reset reset: reset
}; };
})(window); })(window);

View file

@ -20,7 +20,7 @@ var IQ = (function () {
var self = {}; var self = {};
/** /**
* Handles an incoming IQ packet * Handles an incoming IQ packet
* @public * @public
* @param {object} iq * @param {object} iq
@ -109,7 +109,7 @@ var IQ = (function () {
} }
// Privacy lists push // Privacy lists push
else if((iqQueryXMLNS == NS_PRIVACY) && (iqType == 'set')) { else if((iqQueryXMLNS == NS_PRIVACY) && (iqType == 'set') && Common.isSafeStanza(iq)) {
// REF : http://xmpp.org/extensions/xep-0016.html // REF : http://xmpp.org/extensions/xep-0016.html
// Roster push // Roster push
@ -124,7 +124,7 @@ var IQ = (function () {
} }
// Roster push // Roster push
else if((iqQueryXMLNS == NS_ROSTER) && (iqType == 'set')) { else if((iqQueryXMLNS == NS_ROSTER) && (iqType == 'set') && Common.isSafeStanza(iq)) {
// REF : http://xmpp.org/extensions/xep-0092.html // REF : http://xmpp.org/extensions/xep-0092.html
// Roster push // Roster push

View file

@ -29,7 +29,7 @@ var Jingle = (function() {
/** /**
* Provides an adapter to the JSJaCJingle console implementation which is different * Provides an adapter to the JSJaCJingle console implementation which is different
* @public * @private
* @return {object} * @return {object}
*/ */
self._consoleAdapter = (function() { self._consoleAdapter = (function() {

File diff suppressed because it is too large Load diff

View file

@ -14,188 +14,188 @@
* @license MIT License <http://www.opensource.org/licenses/mit-license.php> * @license MIT License <http://www.opensource.org/licenses/mit-license.php>
*/ */
(function ($) { (function ($) {
'use strict'; 'use strict';
var escape = /["\\\x00-\x1f\x7f-\x9f]/g, var escape = /["\\\x00-\x1f\x7f-\x9f]/g,
meta = { meta = {
'\b': '\\b', '\b': '\\b',
'\t': '\\t', '\t': '\\t',
'\n': '\\n', '\n': '\\n',
'\f': '\\f', '\f': '\\f',
'\r': '\\r', '\r': '\\r',
'"' : '\\"', '"' : '\\"',
'\\': '\\\\' '\\': '\\\\'
}, },
hasOwn = Object.prototype.hasOwnProperty; hasOwn = Object.prototype.hasOwnProperty;
/** /**
* jQuery.toJSON * jQuery.toJSON
* Converts the given argument into a JSON representation. * Converts the given argument into a JSON representation.
* *
* @param o {Mixed} The json-serializable *thing* to be converted * @param o {Mixed} The json-serializable *thing* to be converted
* *
* If an object has a toJSON prototype, that will be used to get the representation. * If an object has a toJSON prototype, that will be used to get the representation.
* Non-integer/string keys are skipped in the object, as are keys that point to a * Non-integer/string keys are skipped in the object, as are keys that point to a
* function. * function.
* *
*/ */
$.toJSON = typeof JSON === 'object' && JSON.stringify ? JSON.stringify : function (o) { $.toJSON = typeof JSON === 'object' && JSON.stringify ? JSON.stringify : function (o) {
if (o === null) { if (o === null) {
return 'null'; return 'null';
} }
var pairs, k, name, val, var pairs, k, name, val,
type = $.type(o); type = $.type(o);
if (type === 'undefined') { if (type === 'undefined') {
return undefined; return undefined;
} }
// Also covers instantiated Number and Boolean objects, // Also covers instantiated Number and Boolean objects,
// which are typeof 'object' but thanks to $.type, we // which are typeof 'object' but thanks to $.type, we
// catch them here. I don't know whether it is right // catch them here. I don't know whether it is right
// or wrong that instantiated primitives are not // or wrong that instantiated primitives are not
// exported to JSON as an {"object":..}. // exported to JSON as an {"object":..}.
// We choose this path because that's what the browsers did. // We choose this path because that's what the browsers did.
if (type === 'number' || type === 'boolean') { if (type === 'number' || type === 'boolean') {
return String(o); return String(o);
} }
if (type === 'string') { if (type === 'string') {
return $.quoteString(o); return $.quoteString(o);
} }
if (typeof o.toJSON === 'function') { if (typeof o.toJSON === 'function') {
return $.toJSON(o.toJSON()); return $.toJSON(o.toJSON());
} }
if (type === 'date') { if (type === 'date') {
var month = o.getUTCMonth() + 1, var month = o.getUTCMonth() + 1,
day = o.getUTCDate(), day = o.getUTCDate(),
year = o.getUTCFullYear(), year = o.getUTCFullYear(),
hours = o.getUTCHours(), hours = o.getUTCHours(),
minutes = o.getUTCMinutes(), minutes = o.getUTCMinutes(),
seconds = o.getUTCSeconds(), seconds = o.getUTCSeconds(),
milli = o.getUTCMilliseconds(); milli = o.getUTCMilliseconds();
if (month < 10) { if (month < 10) {
month = '0' + month; month = '0' + month;
} }
if (day < 10) { if (day < 10) {
day = '0' + day; day = '0' + day;
} }
if (hours < 10) { if (hours < 10) {
hours = '0' + hours; hours = '0' + hours;
} }
if (minutes < 10) { if (minutes < 10) {
minutes = '0' + minutes; minutes = '0' + minutes;
} }
if (seconds < 10) { if (seconds < 10) {
seconds = '0' + seconds; seconds = '0' + seconds;
} }
if (milli < 100) { if (milli < 100) {
milli = '0' + milli; milli = '0' + milli;
} }
if (milli < 10) { if (milli < 10) {
milli = '0' + milli; milli = '0' + milli;
} }
return '"' + year + '-' + month + '-' + day + 'T' + return '"' + year + '-' + month + '-' + day + 'T' +
hours + ':' + minutes + ':' + seconds + hours + ':' + minutes + ':' + seconds +
'.' + milli + 'Z"'; '.' + milli + 'Z"';
} }
pairs = []; pairs = [];
if ($.isArray(o)) { if ($.isArray(o)) {
for (k = 0; k < o.length; k++) { for (k = 0; k < o.length; k++) {
pairs.push($.toJSON(o[k]) || 'null'); pairs.push($.toJSON(o[k]) || 'null');
} }
return '[' + pairs.join(',') + ']'; return '[' + pairs.join(',') + ']';
} }
// Any other object (plain object, RegExp, ..) // Any other object (plain object, RegExp, ..)
// Need to do typeof instead of $.type, because we also // Need to do typeof instead of $.type, because we also
// want to catch non-plain objects. // want to catch non-plain objects.
if (typeof o === 'object') { if (typeof o === 'object') {
for (k in o) { for (k in o) {
// Only include own properties, // Only include own properties,
// Filter out inherited prototypes // Filter out inherited prototypes
if (hasOwn.call(o, k)) { if (hasOwn.call(o, k)) {
// Keys must be numerical or string. Skip others // Keys must be numerical or string. Skip others
type = typeof k; type = typeof k;
if (type === 'number') { if (type === 'number') {
name = '"' + k + '"'; name = '"' + k + '"';
} else if (type === 'string') { } else if (type === 'string') {
name = $.quoteString(k); name = $.quoteString(k);
} else { } else {
continue; continue;
} }
type = typeof o[k]; type = typeof o[k];
// Invalid values like these return undefined // Invalid values like these return undefined
// from toJSON, however those object members // from toJSON, however those object members
// shouldn't be included in the JSON string at all. // shouldn't be included in the JSON string at all.
if (type !== 'function' && type !== 'undefined') { if (type !== 'function' && type !== 'undefined') {
val = $.toJSON(o[k]); val = $.toJSON(o[k]);
pairs.push(name + ':' + val); pairs.push(name + ':' + val);
} }
} }
} }
return '{' + pairs.join(',') + '}'; return '{' + pairs.join(',') + '}';
} }
}; };
/** /**
* jQuery.evalJSON * jQuery.evalJSON
* Evaluates a given json string. * Evaluates a given json string.
* *
* @param str {String} * @param str {String}
*/ */
$.evalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) { $.evalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) {
/*jshint evil: true */ /*jshint evil: true */
return eval('(' + str + ')'); return eval('(' + str + ')');
}; };
/** /**
* jQuery.secureEvalJSON * jQuery.secureEvalJSON
* Evals JSON in a way that is *more* secure. * Evals JSON in a way that is *more* secure.
* *
* @param str {String} * @param str {String}
*/ */
$.secureEvalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) { $.secureEvalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) {
var filtered = var filtered =
str str
.replace(/\\["\\\/bfnrtu]/g, '@') .replace(/\\["\\\/bfnrtu]/g, '@')
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
.replace(/(?:^|:|,)(?:\s*\[)+/g, ''); .replace(/(?:^|:|,)(?:\s*\[)+/g, '');
if (/^[\],:{}\s]*$/.test(filtered)) { if (/^[\],:{}\s]*$/.test(filtered)) {
/*jshint evil: true */ /*jshint evil: true */
return eval('(' + str + ')'); return eval('(' + str + ')');
} }
throw new SyntaxError('Error parsing JSON, source is not valid.'); throw new SyntaxError('Error parsing JSON, source is not valid.');
}; };
/** /**
* jQuery.quoteString * jQuery.quoteString
* Returns a string-repr of a string, escaping quotes intelligently. * Returns a string-repr of a string, escaping quotes intelligently.
* Mostly a support function for toJSON. * Mostly a support function for toJSON.
* Examples: * Examples:
* >>> jQuery.quoteString('apple') * >>> jQuery.quoteString('apple')
* "apple" * "apple"
* *
* >>> jQuery.quoteString('"Where are we going?", she asked.') * >>> jQuery.quoteString('"Where are we going?", she asked.')
* "\"Where are we going?\", she asked." * "\"Where are we going?\", she asked."
*/ */
$.quoteString = function (str) { $.quoteString = function (str) {
if (str.match(escape)) { if (str.match(escape)) {
return '"' + str.replace(escape, function (a) { return '"' + str.replace(escape, function (a) {
var c = meta[a]; var c = meta[a];
if (typeof c === 'string') { if (typeof c === 'string') {
return c; return c;
} }
c = a.charCodeAt(); c = a.charCodeAt();
return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16); return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
}) + '"'; }) + '"';
} }
return '"' + str + '"'; return '"' + str + '"';
}; };
}(jQuery)); }(jQuery));

View file

@ -1,157 +1,157 @@
/*! http://mths.be/placeholder v2.0.7 by @mathias */ /*! http://mths.be/placeholder v2.0.7 by @mathias */
;(function(window, document, $) { ;(function(window, document, $) {
var isInputSupported = 'placeholder' in document.createElement('input'), var isInputSupported = 'placeholder' in document.createElement('input'),
isTextareaSupported = 'placeholder' in document.createElement('textarea'), isTextareaSupported = 'placeholder' in document.createElement('textarea'),
prototype = $.fn, prototype = $.fn,
valHooks = $.valHooks, valHooks = $.valHooks,
hooks, hooks,
placeholder; placeholder;
if (isInputSupported && isTextareaSupported) { if (isInputSupported && isTextareaSupported) {
placeholder = prototype.placeholder = function() { placeholder = prototype.placeholder = function() {
return this; return this;
}; };
placeholder.input = placeholder.textarea = true; placeholder.input = placeholder.textarea = true;
} else { } else {
placeholder = prototype.placeholder = function() { placeholder = prototype.placeholder = function() {
var $this = this; var $this = this;
$this $this
.filter((isInputSupported ? 'textarea' : ':input') + '[placeholder]') .filter((isInputSupported ? 'textarea' : ':input') + '[placeholder]')
.not('.placeholder') .not('.placeholder')
.bind({ .bind({
'focus.placeholder': clearPlaceholder, 'focus.placeholder': clearPlaceholder,
'blur.placeholder': setPlaceholder 'blur.placeholder': setPlaceholder
}) })
.data('placeholder-enabled', true) .data('placeholder-enabled', true)
.trigger('blur.placeholder'); .trigger('blur.placeholder');
return $this; return $this;
}; };
placeholder.input = isInputSupported; placeholder.input = isInputSupported;
placeholder.textarea = isTextareaSupported; placeholder.textarea = isTextareaSupported;
hooks = { hooks = {
'get': function(element) { 'get': function(element) {
var $element = $(element); var $element = $(element);
return $element.data('placeholder-enabled') && $element.hasClass('placeholder') ? '' : element.value; return $element.data('placeholder-enabled') && $element.hasClass('placeholder') ? '' : element.value;
}, },
'set': function(element, value) { 'set': function(element, value) {
var $element = $(element); var $element = $(element);
if (!$element.data('placeholder-enabled')) { if (!$element.data('placeholder-enabled')) {
return element.value = value; return element.value = value;
} }
if (value == '') { if (value == '') {
element.value = value; element.value = value;
// Issue #56: Setting the placeholder causes problems if the element continues to have focus. // Issue #56: Setting the placeholder causes problems if the element continues to have focus.
if (element != document.activeElement) { if (element != document.activeElement) {
// We can't use `triggerHandler` here because of dummy text/password inputs :( // We can't use `triggerHandler` here because of dummy text/password inputs :(
setPlaceholder.call(element); setPlaceholder.call(element);
} }
} else if ($element.hasClass('placeholder')) { } else if ($element.hasClass('placeholder')) {
clearPlaceholder.call(element, true, value) || (element.value = value); clearPlaceholder.call(element, true, value) || (element.value = value);
} else { } else {
element.value = value; element.value = value;
} }
// `set` can not return `undefined`; see http://jsapi.info/jquery/1.7.1/val#L2363 // `set` can not return `undefined`; see http://jsapi.info/jquery/1.7.1/val#L2363
return $element; return $element;
} }
}; };
isInputSupported || (valHooks.input = hooks); isInputSupported || (valHooks.input = hooks);
isTextareaSupported || (valHooks.textarea = hooks); isTextareaSupported || (valHooks.textarea = hooks);
$(function() { $(function() {
// Look for forms // Look for forms
$(document).delegate('form', 'submit.placeholder', function() { $(document).delegate('form', 'submit.placeholder', function() {
// Clear the placeholder values so they don't get submitted // Clear the placeholder values so they don't get submitted
var $inputs = $('.placeholder', this).each(clearPlaceholder); var $inputs = $('.placeholder', this).each(clearPlaceholder);
setTimeout(function() { setTimeout(function() {
$inputs.each(setPlaceholder); $inputs.each(setPlaceholder);
}, 10); }, 10);
}); });
}); });
// Clear placeholder values upon page reload // Clear placeholder values upon page reload
$(window).bind('beforeunload.placeholder', function() { $(window).bind('beforeunload.placeholder', function() {
$('.placeholder').each(function() { $('.placeholder').each(function() {
this.value = ''; this.value = '';
}); });
}); });
} }
function args(elem) { function args(elem) {
// Return an object of element attributes // Return an object of element attributes
var newAttrs = {}, var newAttrs = {},
rinlinejQuery = /^jQuery\d+$/; rinlinejQuery = /^jQuery\d+$/;
$.each(elem.attributes, function(i, attr) { $.each(elem.attributes, function(i, attr) {
if (attr.specified && !rinlinejQuery.test(attr.name)) { if (attr.specified && !rinlinejQuery.test(attr.name)) {
newAttrs[attr.name] = attr.value; newAttrs[attr.name] = attr.value;
} }
}); });
return newAttrs; return newAttrs;
} }
function clearPlaceholder(event, value) { function clearPlaceholder(event, value) {
var input = this, var input = this,
$input = $(input); $input = $(input);
if (input.value == $input.attr('placeholder') && $input.hasClass('placeholder')) { if (input.value == $input.attr('placeholder') && $input.hasClass('placeholder')) {
if ($input.data('placeholder-password')) { if ($input.data('placeholder-password')) {
$input = $input.hide().next().show().attr('id', $input.removeAttr('id').data('placeholder-id')); $input = $input.hide().next().show().attr('id', $input.removeAttr('id').data('placeholder-id'));
// If `clearPlaceholder` was called from `$.valHooks.input.set` // If `clearPlaceholder` was called from `$.valHooks.input.set`
if (event === true) { if (event === true) {
return $input[0].value = value; return $input[0].value = value;
} }
$input.focus(); $input.focus();
} else { } else {
input.value = ''; input.value = '';
$input.removeClass('placeholder'); $input.removeClass('placeholder');
input == document.activeElement && input.select(); input == document.activeElement && input.select();
} }
} }
} }
function setPlaceholder() { function setPlaceholder() {
var $replacement, var $replacement,
input = this, input = this,
$input = $(input), $input = $(input),
$origInput = $input, $origInput = $input,
id = this.id; id = this.id;
if (input.value == '') { if (input.value == '') {
if (input.type == 'password') { if (input.type == 'password') {
if (!$input.data('placeholder-textinput')) { if (!$input.data('placeholder-textinput')) {
try { try {
$replacement = $input.clone().attr({ 'type': 'text' }); $replacement = $input.clone().attr({ 'type': 'text' });
} catch(e) { } catch(e) {
$replacement = $('<input>').attr($.extend(args(this), { 'type': 'text' })); $replacement = $('<input>').attr($.extend(args(this), { 'type': 'text' }));
} }
$replacement $replacement
.removeAttr('name') .removeAttr('name')
.data({ .data({
'placeholder-password': true, 'placeholder-password': true,
'placeholder-id': id 'placeholder-id': id
}) })
.bind('focus.placeholder', clearPlaceholder); .bind('focus.placeholder', clearPlaceholder);
$input $input
.data({ .data({
'placeholder-textinput': $replacement, 'placeholder-textinput': $replacement,
'placeholder-id': id 'placeholder-id': id
}) })
.before($replacement); .before($replacement);
} }
$input = $input.removeAttr('id').hide().prev().attr('id', id).show(); $input = $input.removeAttr('id').hide().prev().attr('id', id).show();
// Note: `$input[0] != input` now! // Note: `$input[0] != input` now!
} }
$input.addClass('placeholder'); $input.addClass('placeholder');
$input[0].value = $input.attr('placeholder'); $input[0].value = $input.attr('placeholder');
} else { } else {
$input.removeClass('placeholder'); $input.removeClass('placeholder');
} }
} }
}(this, document, jQuery)); }(this, document, jQuery));

View file

@ -17,169 +17,169 @@
} }
}(function ($) { }(function ($) {
var $scrollTo = $.scrollTo = function( target, duration, settings ) { var $scrollTo = $.scrollTo = function( target, duration, settings ) {
return $(window).scrollTo( target, duration, settings ); return $(window).scrollTo( target, duration, settings );
}; };
$scrollTo.defaults = { $scrollTo.defaults = {
axis:'xy', axis:'xy',
duration: parseFloat($.fn.jquery) >= 1.3 ? 0 : 1, duration: parseFloat($.fn.jquery) >= 1.3 ? 0 : 1,
limit:true limit:true
}; };
// Returns the element that needs to be animated to scroll the window. // Returns the element that needs to be animated to scroll the window.
// Kept for backwards compatibility (specially for localScroll & serialScroll) // Kept for backwards compatibility (specially for localScroll & serialScroll)
$scrollTo.window = function( scope ) { $scrollTo.window = function( scope ) {
return $(window)._scrollable(); return $(window)._scrollable();
}; };
// Hack, hack, hack :) // Hack, hack, hack :)
// Returns the real elements to scroll (supports window/iframes, documents and regular nodes) // Returns the real elements to scroll (supports window/iframes, documents and regular nodes)
$.fn._scrollable = function() { $.fn._scrollable = function() {
return this.map(function() { return this.map(function() {
var elem = this, var elem = this,
isWin = !elem.nodeName || $.inArray( elem.nodeName.toLowerCase(), ['iframe','#document','html','body'] ) != -1; isWin = !elem.nodeName || $.inArray( elem.nodeName.toLowerCase(), ['iframe','#document','html','body'] ) != -1;
if (!isWin) if (!isWin)
return elem; return elem;
var doc = (elem.contentWindow || elem).document || elem.ownerDocument || elem; var doc = (elem.contentWindow || elem).document || elem.ownerDocument || elem;
return /webkit/i.test(navigator.userAgent) || doc.compatMode == 'BackCompat' ? return /webkit/i.test(navigator.userAgent) || doc.compatMode == 'BackCompat' ?
doc.body : doc.body :
doc.documentElement; doc.documentElement;
}); });
}; };
$.fn.scrollTo = function( target, duration, settings ) { $.fn.scrollTo = function( target, duration, settings ) {
if (typeof duration == 'object') { if (typeof duration == 'object') {
settings = duration; settings = duration;
duration = 0; duration = 0;
} }
if (typeof settings == 'function') if (typeof settings == 'function')
settings = { onAfter:settings }; settings = { onAfter:settings };
if (target == 'max') if (target == 'max')
target = 9e9; target = 9e9;
settings = $.extend( {}, $scrollTo.defaults, settings ); settings = $.extend( {}, $scrollTo.defaults, settings );
// Speed is still recognized for backwards compatibility // Speed is still recognized for backwards compatibility
duration = duration || settings.duration; duration = duration || settings.duration;
// Make sure the settings are given right // Make sure the settings are given right
settings.queue = settings.queue && settings.axis.length > 1; settings.queue = settings.queue && settings.axis.length > 1;
if (settings.queue) if (settings.queue)
// Let's keep the overall duration // Let's keep the overall duration
duration /= 2; duration /= 2;
settings.offset = both( settings.offset ); settings.offset = both( settings.offset );
settings.over = both( settings.over ); settings.over = both( settings.over );
return this._scrollable().each(function() { return this._scrollable().each(function() {
// Null target yields nothing, just like jQuery does // Null target yields nothing, just like jQuery does
if (target == null) return; if (target == null) return;
var elem = this, var elem = this,
$elem = $(elem), $elem = $(elem),
targ = target, toff, attr = {}, targ = target, toff, attr = {},
win = $elem.is('html,body'); win = $elem.is('html,body');
switch (typeof targ) { switch (typeof targ) {
// A number will pass the regex // A number will pass the regex
case 'number': case 'number':
case 'string': case 'string':
if (/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(targ)) { if (/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(targ)) {
targ = both( targ ); targ = both( targ );
// We are done // We are done
break; break;
} }
// Relative selector, no break! // Relative selector, no break!
targ = $(targ,this); targ = $(targ,this);
if (!targ.length) return; if (!targ.length) return;
case 'object': case 'object':
// DOMElement / jQuery // DOMElement / jQuery
if (targ.is || targ.style) if (targ.is || targ.style)
// Get the real position of the target // Get the real position of the target
toff = (targ = $(targ)).offset(); toff = (targ = $(targ)).offset();
} }
var offset = $.isFunction(settings.offset) && settings.offset(elem, targ) || settings.offset; var offset = $.isFunction(settings.offset) && settings.offset(elem, targ) || settings.offset;
$.each( settings.axis.split(''), function( i, axis ) { $.each( settings.axis.split(''), function( i, axis ) {
var Pos = axis == 'x' ? 'Left' : 'Top', var Pos = axis == 'x' ? 'Left' : 'Top',
pos = Pos.toLowerCase(), pos = Pos.toLowerCase(),
key = 'scroll' + Pos, key = 'scroll' + Pos,
old = elem[key], old = elem[key],
max = $scrollTo.max(elem, axis); max = $scrollTo.max(elem, axis);
if (toff) {// jQuery / DOMElement if (toff) {// jQuery / DOMElement
attr[key] = toff[pos] + ( win ? 0 : old - $elem.offset()[pos] ); attr[key] = toff[pos] + ( win ? 0 : old - $elem.offset()[pos] );
// If it's a dom element, reduce the margin // If it's a dom element, reduce the margin
if (settings.margin) { if (settings.margin) {
attr[key] -= parseInt(targ.css('margin'+Pos)) || 0; attr[key] -= parseInt(targ.css('margin'+Pos)) || 0;
attr[key] -= parseInt(targ.css('border'+Pos+'Width')) || 0; attr[key] -= parseInt(targ.css('border'+Pos+'Width')) || 0;
} }
attr[key] += offset[pos] || 0; attr[key] += offset[pos] || 0;
if(settings.over[pos]) if(settings.over[pos])
// Scroll to a fraction of its width/height // Scroll to a fraction of its width/height
attr[key] += targ[axis=='x'?'width':'height']() * settings.over[pos]; attr[key] += targ[axis=='x'?'width':'height']() * settings.over[pos];
} else { } else {
var val = targ[pos]; var val = targ[pos];
// Handle percentage values // Handle percentage values
attr[key] = val.slice && val.slice(-1) == '%' ? attr[key] = val.slice && val.slice(-1) == '%' ?
parseFloat(val) / 100 * max parseFloat(val) / 100 * max
: val; : val;
} }
// Number or 'number' // Number or 'number'
if (settings.limit && /^\d+$/.test(attr[key])) if (settings.limit && /^\d+$/.test(attr[key]))
// Check the limits // Check the limits
attr[key] = attr[key] <= 0 ? 0 : Math.min( attr[key], max ); attr[key] = attr[key] <= 0 ? 0 : Math.min( attr[key], max );
// Queueing axes // Queueing axes
if (!i && settings.queue) { if (!i && settings.queue) {
// Don't waste time animating, if there's no need. // Don't waste time animating, if there's no need.
if (old != attr[key]) if (old != attr[key])
// Intermediate animation // Intermediate animation
animate( settings.onAfterFirst ); animate( settings.onAfterFirst );
// Don't animate this axis again in the next iteration. // Don't animate this axis again in the next iteration.
delete attr[key]; delete attr[key];
} }
}); });
animate( settings.onAfter ); animate( settings.onAfter );
function animate( callback ) { function animate( callback ) {
$elem.animate( attr, duration, settings.easing, callback && function() { $elem.animate( attr, duration, settings.easing, callback && function() {
callback.call(this, targ, settings); callback.call(this, targ, settings);
}); });
}; };
}).end(); }).end();
}; };
// Max scrolling position, works on quirks mode // Max scrolling position, works on quirks mode
// It only fails (not too badly) on IE, quirks mode. // It only fails (not too badly) on IE, quirks mode.
$scrollTo.max = function( elem, axis ) { $scrollTo.max = function( elem, axis ) {
var Dim = axis == 'x' ? 'Width' : 'Height', var Dim = axis == 'x' ? 'Width' : 'Height',
scroll = 'scroll'+Dim; scroll = 'scroll'+Dim;
if (!$(elem).is('html,body')) if (!$(elem).is('html,body'))
return elem[scroll] - $(elem)[Dim.toLowerCase()](); return elem[scroll] - $(elem)[Dim.toLowerCase()]();
var size = 'client' + Dim, var size = 'client' + Dim,
html = elem.ownerDocument.documentElement, html = elem.ownerDocument.documentElement,
body = elem.ownerDocument.body; body = elem.ownerDocument.body;
return Math.max( html[scroll], body[scroll] ) return Math.max( html[scroll], body[scroll] )
- Math.min( html[size] , body[size] ); - Math.min( html[size] , body[size] );
}; };
function both( val ) { function both( val ) {
return $.isFunction(val) || typeof val == 'object' ? val : { top:val, left:val }; return $.isFunction(val) || typeof val == 'object' ? val : { top:val, left:val };
}; };
// AMD requirement // AMD requirement
return $scrollTo; return $scrollTo;

View file

@ -10,129 +10,129 @@
**/ **/
jQuery.fn.extend({ jQuery.fn.extend({
everyTime: function(interval, label, fn, times) { everyTime: function(interval, label, fn, times) {
return this.each(function() { return this.each(function() {
jQuery.timer.add(this, interval, label, fn, times); jQuery.timer.add(this, interval, label, fn, times);
}); });
}, },
oneTime: function(interval, label, fn) { oneTime: function(interval, label, fn) {
return this.each(function() { return this.each(function() {
jQuery.timer.add(this, interval, label, fn, 1); jQuery.timer.add(this, interval, label, fn, 1);
}); });
}, },
stopTime: function(label, fn) { stopTime: function(label, fn) {
return this.each(function() { return this.each(function() {
jQuery.timer.remove(this, label, fn); jQuery.timer.remove(this, label, fn);
}); });
} }
}); });
jQuery.extend({ jQuery.extend({
timer: { timer: {
global: [], global: [],
guid: 1, guid: 1,
dataKey: "jQuery.timer", dataKey: "jQuery.timer",
regex: /^([0-9]+(?:\.[0-9]*)?)\s*(.*s)?$/, regex: /^([0-9]+(?:\.[0-9]*)?)\s*(.*s)?$/,
powers: { powers: {
// Yeah this is major overkill... // Yeah this is major overkill...
'ms': 1, 'ms': 1,
'cs': 10, 'cs': 10,
'ds': 100, 'ds': 100,
's': 1000, 's': 1000,
'das': 10000, 'das': 10000,
'hs': 100000, 'hs': 100000,
'ks': 1000000 'ks': 1000000
}, },
timeParse: function(value) { timeParse: function(value) {
if (value == undefined || value == null) if (value == undefined || value == null)
return null; return null;
var result = this.regex.exec(jQuery.trim(value.toString())); var result = this.regex.exec(jQuery.trim(value.toString()));
if (result[2]) { if (result[2]) {
var num = parseFloat(result[1]); var num = parseFloat(result[1]);
var mult = this.powers[result[2]] || 1; var mult = this.powers[result[2]] || 1;
return num * mult; return num * mult;
} else { } else {
return value; return value;
} }
}, },
add: function(element, interval, label, fn, times) { add: function(element, interval, label, fn, times) {
var counter = 0; var counter = 0;
if (jQuery.isFunction(label)) { if (jQuery.isFunction(label)) {
if (!times) if (!times)
times = fn; times = fn;
fn = label; fn = label;
label = interval; label = interval;
} }
interval = jQuery.timer.timeParse(interval); interval = jQuery.timer.timeParse(interval);
if (typeof interval != 'number' || isNaN(interval) || interval < 0) if (typeof interval != 'number' || isNaN(interval) || interval < 0)
return; return;
if (typeof times != 'number' || isNaN(times) || times < 0) if (typeof times != 'number' || isNaN(times) || times < 0)
times = 0; times = 0;
times = times || 0; times = times || 0;
var timers = jQuery.data(element, this.dataKey) || jQuery.data(element, this.dataKey, {}); var timers = jQuery.data(element, this.dataKey) || jQuery.data(element, this.dataKey, {});
if (!timers[label]) if (!timers[label])
timers[label] = {}; timers[label] = {};
fn.timerID = fn.timerID || this.guid++; fn.timerID = fn.timerID || this.guid++;
var handler = function() { var handler = function() {
if ((++counter > times && times !== 0) || fn.call(element, counter) === false) if ((++counter > times && times !== 0) || fn.call(element, counter) === false)
jQuery.timer.remove(element, label, fn); jQuery.timer.remove(element, label, fn);
}; };
handler.timerID = fn.timerID; handler.timerID = fn.timerID;
if (!timers[label][fn.timerID]) if (!timers[label][fn.timerID])
timers[label][fn.timerID] = window.setInterval(handler,interval); timers[label][fn.timerID] = window.setInterval(handler,interval);
this.global.push( element ); this.global.push( element );
}, },
remove: function(element, label, fn) { remove: function(element, label, fn) {
var timers = jQuery.data(element, this.dataKey), ret; var timers = jQuery.data(element, this.dataKey), ret;
if ( timers ) { if ( timers ) {
if (!label) { if (!label) {
for ( label in timers ) for ( label in timers )
this.remove(element, label, fn); this.remove(element, label, fn);
} else if ( timers[label] ) { } else if ( timers[label] ) {
if ( fn ) { if ( fn ) {
if ( fn.timerID ) { if ( fn.timerID ) {
window.clearInterval(timers[label][fn.timerID]); window.clearInterval(timers[label][fn.timerID]);
delete timers[label][fn.timerID]; delete timers[label][fn.timerID];
} }
} else { } else {
for ( var fn in timers[label] ) { for ( var fn in timers[label] ) {
window.clearInterval(timers[label][fn]); window.clearInterval(timers[label][fn]);
delete timers[label][fn]; delete timers[label][fn];
} }
} }
for ( ret in timers[label] ) break; for ( ret in timers[label] ) break;
if ( !ret ) { if ( !ret ) {
ret = null; ret = null;
delete timers[label]; delete timers[label];
} }
} }
for ( ret in timers ) break; for ( ret in timers ) break;
if ( !ret ) if ( !ret )
jQuery.removeData(element, this.dataKey); jQuery.removeData(element, this.dataKey);
} }
} }
} }
}); });
jQuery(window).bind("unload", function() { jQuery(window).bind("unload", function() {
jQuery.each(jQuery.timer.global, function(index, item) { jQuery.each(jQuery.timer.global, function(index, item) {
jQuery.timer.remove(item); jQuery.timer.remove(item);
}); });
}); });

File diff suppressed because it is too large Load diff

View file

@ -77,7 +77,7 @@ XmlHttp.create = function () {
} }
// Fallback on JSONP // Fallback on JSONP
return new jXHR(); return new jXHR();
} }
// Might be local-domain? // Might be local-domain?
if (window.XMLHttpRequest) { if (window.XMLHttpRequest) {
@ -86,12 +86,12 @@ XmlHttp.create = function () {
// some versions of Moz do not support the readyState property // some versions of Moz do not support the readyState property
// and the onreadystate event so we patch it! // and the onreadystate event so we patch it!
if (req.readyState == null) { if (req.readyState == null) {
req.readyState = 1; req.readyState = 1;
req.addEventListener("load", function () { req.addEventListener("load", function () {
req.readyState = 4; req.readyState = 4;
if (typeof req.onreadystatechange == "function") if (typeof req.onreadystatechange == "function")
req.onreadystatechange(); req.onreadystatechange();
}, false); }, false);
} }
return req; return req;
@ -146,12 +146,12 @@ XmlDocument.create = function (name,ns) {
// some versions of Moz do not support the readyState property // some versions of Moz do not support the readyState property
// and the onreadystate event so we patch it! // and the onreadystate event so we patch it!
if (doc.readyState == null) { if (doc.readyState == null) {
doc.readyState = 1; doc.readyState = 1;
doc.addEventListener("load", function () { doc.addEventListener("load", function () {
doc.readyState = 4; doc.readyState = 4;
if (typeof doc.onreadystatechange == "function") if (typeof doc.onreadystatechange == "function")
doc.onreadystatechange(); doc.onreadystatechange();
}, false); }, false);
} }
} else if (window.ActiveXObject) { } else if (window.ActiveXObject) {
doc = new ActiveXObject(XmlDocument.getPrefix() + ".DomDocument"); doc = new ActiveXObject(XmlDocument.getPrefix() + ".DomDocument");
@ -218,14 +218,14 @@ if (typeof(Document) != 'undefined' && window.DOMParser) {
* @private * @private
*/ */
Document.prototype.loadXML = function (s) { Document.prototype.loadXML = function (s) {
// parse the string to a new doc // parse the string to a new doc
var doc2 = (new DOMParser()).parseFromString(s, "text/xml"); var doc2 = (new DOMParser()).parseFromString(s, "text/xml");
// remove all initial children // remove all initial children
while (this.hasChildNodes()) while (this.hasChildNodes())
this.removeChild(this.lastChild); this.removeChild(this.lastChild);
// insert and import nodes // insert and import nodes
for (var i = 0; i < doc2.childNodes.length; i++) { for (var i = 0; i < doc2.childNodes.length; i++) {
this.appendChild(this.importNode(doc2.childNodes[i], true)); this.appendChild(this.importNode(doc2.childNodes[i], true));
@ -312,7 +312,7 @@ String.prototype.htmlEnc = function() {
String.prototype.revertHtmlEnc = function() { String.prototype.revertHtmlEnc = function() {
if(!this) if(!this)
return this; return this;
var str = this.replace(/&amp;/gi,'&'); var str = this.replace(/&amp;/gi,'&');
str = str.replace(/&lt;/gi,'<'); str = str.replace(/&lt;/gi,'<');
str = str.replace(/&gt;/gi,'>'); str = str.replace(/&gt;/gi,'>');
@ -333,7 +333,7 @@ String.prototype.revertHtmlEnc = function() {
Date.jab2date = function(ts) { Date.jab2date = function(ts) {
// Timestamp // Timestamp
if(!isNaN(ts)) if(!isNaN(ts))
return new Date(ts * 1000); return new Date(ts * 1000);
// Get the UTC date // Get the UTC date
var date = new Date(Date.UTC(ts.substr(0,4),ts.substr(5,2)-1,ts.substr(8,2),ts.substr(11,2),ts.substr(14,2),ts.substr(17,2))); var date = new Date(Date.UTC(ts.substr(0,4),ts.substr(5,2)-1,ts.substr(8,2),ts.substr(11,2),ts.substr(14,2),ts.substr(17,2)));
@ -361,7 +361,17 @@ Date.hrTime = function(ts) {
return Date.jab2date(ts).toLocaleString(); return Date.jab2date(ts).toLocaleString();
}; };
/**
/**
* Current timestamp.
* @return Seconds since 1.1.1970.
* @type int
*/
if (!Date.now) {
Date.now = function() { return new Date().getTime(); }
}
/**
* somewhat opposit to {@link #hrTime} * somewhat opposit to {@link #hrTime}
* expects a javascript Date object as parameter and returns a jabber * expects a javascript Date object as parameter and returns a jabber
* date string conforming to * date string conforming to
@ -1195,6 +1205,7 @@ function cnonce(size) {
JSJAC_HAVEKEYS = true; // whether to use keys JSJAC_HAVEKEYS = true; // whether to use keys
JSJAC_NKEYS = 16; // number of keys to generate JSJAC_NKEYS = 16; // number of keys to generate
JSJAC_INACTIVITY = 300; // qnd hack to make suspend/resume JSJAC_INACTIVITY = 300; // qnd hack to make suspend/resume
// work more smoothly with polling // work more smoothly with polling
JSJAC_ERR_COUNT = 10; // number of retries in case of connection JSJAC_ERR_COUNT = 10; // number of retries in case of connection
@ -1209,11 +1220,19 @@ JSJAC_TIMERVAL = 2000; // default polling interval
JSJAC_ALLOW_PLAIN = true; // whether to allow plaintext logins JSJAC_ALLOW_PLAIN = true; // whether to allow plaintext logins
JSJAC_ALLOW_SCRAM = false; // allow usage of SCRAM-SHA-1 authentication; please note that it is quite slow so it is disable by default JSJAC_ALLOW_SCRAM = false; // allow usage of SCRAM-SHA-1 authentication; please note that it is quite slow so it is disable by default
// Options specific to HTTP Binding (BOSH) JSJAC_RETRYDELAY = 5000; // msecs to wait before trying next
JSJACHBC_MAX_HOLD = 1; // default for number of connections held by // request after error
// connection manager
JSJACHBC_MAX_WAIT = 20; // default 'wait' param - how long an idle connection JSJAC_REGID_TIMEOUT = 20000; // time in msec until registered
// should be held by connection manager // callbacks for ids timeout
/* Options specific to HTTP Binding (BOSH) */
JSJACHBC_MAX_HOLD = 1; // default for number of connctions
// held by connection manager
JSJACHBC_MAX_WAIT = 300; // default 'wait' param - how long an
// idle connection should be held by
// connection manager
JSJACHBC_BOSH_VERSION = "1.6"; JSJACHBC_BOSH_VERSION = "1.6";
JSJACHBC_USE_BOSH_VER = true; JSJACHBC_USE_BOSH_VER = true;
@ -1265,7 +1284,7 @@ JSJaCJSON.toString = function (obj) {
v = x[i]; v = x[i];
f = s[typeof v]; f = s[typeof v];
if (f) { if (f) {
try { try {
v = f(v); v = f(v);
if (typeof v == 'string') { if (typeof v == 'string') {
if (b) { if (b) {
@ -1274,8 +1293,8 @@ JSJaCJSON.toString = function (obj) {
a[a.length] = v; a[a.length] = v;
b = true; b = true;
} }
} catch(e) { } catch(e) {
} }
} }
} }
a[a.length] = ']'; a[a.length] = ']';
@ -1301,7 +1320,7 @@ JSJaCJSON.toString = function (obj) {
v = x[i]; v = x[i];
f = s[typeof v]; f = s[typeof v];
if (f) { if (f) {
try { try {
v = f(v); v = f(v);
if (typeof v == 'string') { if (typeof v == 'string') {
if (b) { if (b) {
@ -1310,8 +1329,8 @@ JSJaCJSON.toString = function (obj) {
a.push(s.string(i), ':', v); a.push(s.string(i), ':', v);
b = true; b = true;
} }
} catch(e) { } catch(e) {
} }
} }
} }
} }
@ -1517,7 +1536,7 @@ JSJaCJID.prototype.clone = function() {
*/ */
JSJaCJID.prototype.isEntity = function(jid) { JSJaCJID.prototype.isEntity = function(jid) {
if (typeof jid == 'string') if (typeof jid == 'string')
jid = (new JSJaCJID(jid)); jid = (new JSJaCJID(jid));
jid.removeResource(); jid.removeResource();
return (this.clone().removeResource().toString() === jid.toString()); return (this.clone().removeResource().toString() === jid.toString());
}; };
@ -2263,7 +2282,7 @@ JSJaCIQ.prototype.setQuery = function(xmlns) {
query = this.getDoc().createElementNS(xmlns,'query'); query = this.getDoc().createElementNS(xmlns,'query');
} catch (e) { } catch (e) {
query = this.getDoc().createElement('query'); query = this.getDoc().createElement('query');
query.setAttribute('xmlns',xmlns); query.setAttribute('xmlns',xmlns);
} }
this.getNode().appendChild(query); this.getNode().appendChild(query);
return query; return query;
@ -2483,7 +2502,7 @@ function JSJaCError(code,type,condition) {
* @constructor * @constructor
* @param {Function} func The hash function to be used for creating the keys * @param {Function} func The hash function to be used for creating the keys
* @param {Debugger} oDbg Reference to debugger implementation [optional] * @param {Debugger} oDbg Reference to debugger implementation [optional]
*/ */
function JSJaCKeys(func,oDbg) { function JSJaCKeys(func,oDbg) {
var seed = Math.random(); var seed = Math.random();
@ -2965,9 +2984,9 @@ JSJaCConnection.prototype.resumeFromData = function(data) {
this._handleEvent('onresume'); this._handleEvent('onresume');
setTimeout(JSJaC.bind(this._resume, this),this.getPollInterval()); setTimeout(JSJaC.bind(this._resume, this),this.getPollInterval());
this._interval = setInterval(JSJaC.bind(this._checkQueue, this), this._interval = setInterval(JSJaC.bind(this._checkQueue, this),
JSJAC_CHECKQUEUEINTERVAL); JSJAC_CHECKQUEUEINTERVAL);
this._inQto = setInterval(JSJaC.bind(this._checkInQ, this), this._inQto = setInterval(JSJaC.bind(this._checkInQ, this),
JSJAC_CHECKINQUEUEINTERVAL); JSJAC_CHECKINQUEUEINTERVAL);
} }
return (this._connected === true); return (this._connected === true);
@ -3009,7 +3028,7 @@ JSJaCConnection.prototype.send = function(packet,cb,arg) {
// remember id for response if callback present // remember id for response if callback present
if (cb) if (cb)
this._registerPID(packet.getID(),cb,arg); this._registerPID(packet, cb, arg);
try { try {
this._handleEvent(packet.pType()+'_out', packet); this._handleEvent(packet.pType()+'_out', packet);
@ -3063,7 +3082,7 @@ JSJaCConnection.prototype.sendIQ = function(iq, handlers, arg) {
/** /**
* Sets polling interval for this connection * Sets polling interval for this connection
* @param {int} millisecs Milliseconds to set timer to * @param {int} timerval Milliseconds to set timer to
* @return effective interval this connection has been set to * @return effective interval this connection has been set to
* @type int * @type int
*/ */
@ -3502,6 +3521,11 @@ JSJaCConnection.prototype._doXMPPSess = function(iq) {
this.fulljid = iq.getChildVal("jid"); this.fulljid = iq.getChildVal("jid");
this.jid = this.fulljid.substring(0,this.fulljid.lastIndexOf('/')); this.jid = this.fulljid.substring(0,this.fulljid.lastIndexOf('/'));
if (!this.legacy_sessions) {
this._handleEvent('onconnect');
return;
}
iq = new JSJaCIQ(); iq = new JSJaCIQ();
iq.setIQ(null,'set','sess_1'); iq.setIQ(null,'set','sess_1');
iq.appendNode("session", {xmlns: "urn:ietf:params:xml:ns:xmpp-session"}, iq.appendNode("session", {xmlns: "urn:ietf:params:xml:ns:xmpp-session"},
@ -3539,8 +3563,8 @@ JSJaCConnection.prototype._handleEvent = function(event,arg) {
if (arg) { if (arg) {
if (arg.pType) { // it's a packet if (arg.pType) { // it's a packet
if ((!arg.getNode().hasChildNodes() && aEvent.childName != '*') || if ((!arg.getNode().hasChildNodes() && aEvent.childName != '*') ||
(arg.getNode().hasChildNodes() && (arg.getNode().hasChildNodes() &&
!arg.getChild(aEvent.childName, aEvent.childNS))) !arg.getChild(aEvent.childName, aEvent.childNS)))
continue; continue;
if (aEvent.type != '*' && if (aEvent.type != '*' &&
arg.getType() != aEvent.type) arg.getType() != aEvent.type)
@ -3573,29 +3597,39 @@ JSJaCConnection.prototype._handleEvent = function(event,arg) {
/** /**
* @private * @private
*/ */
JSJaCConnection.prototype._handlePID = function(aJSJaCPacket) { JSJaCConnection.prototype._handlePID = function(packet) {
if (!aJSJaCPacket.getID()) if (!packet.getID())
return false; return false;
for (var i in this._regIDs) {
if (this._regIDs.hasOwnProperty(i) && if (packet.pType() != 'iq' ||
this._regIDs[i] && i == aJSJaCPacket.getID()) { (packet.getType() != 'error' && packet.getType() != 'result'))
var pID = aJSJaCPacket.getID(); return false;
this.oDbg.log("handling "+pID,3);
try { var jid = packet.getFrom() || this.jid;
if (this._regIDs[i].cb.call(this, aJSJaCPacket, this._regIDs[i].arg) === false) {
// don't unregister if (packet.getFrom() == this.domain)
return false; jid = this.jid;
} else {
this._unregisterPID(pID); var id = packet.getID();
return true; if (this._regIDs[jid] && this._regIDs[jid][id]) {
} try {
} catch (e) { this.oDbg.log("handling id "+id,3);
// broken handler? var reg = this._regIDs[jid][id];
this.oDbg.log(e.name+": "+ e.message, 1); if (reg.cb.call(this, packet, reg.arg) === false) {
this._unregisterPID(pID); // don't unregister
return false;
} else {
delete this._regIDs[jid][id];
return true; return true;
} }
} catch (e) {
// broken handler?
this.oDbg.log(e.name+": "+ e.message, 1);
delete this._regIDs[jid][id];
return true;
} }
} else {
this.oDbg.log("not handling id '"+id+"' from jid "+jid, 1);
} }
return false; return false;
}; };
@ -3686,6 +3720,12 @@ JSJaCConnection.prototype._parseStreamFeatures = function(doc) {
break; break;
} }
} }
// Get legacy session capability if available
this.legacy_sessions=null;
if (doc.getElementsByTagName("session")[0]) {
this.legacy_sessions=true;
}
return true; return true;
}; };
@ -3784,20 +3824,69 @@ JSJaCConnection.prototype._process = function(timerval) {
/** /**
* @private * @private
@param {JSJaCPacket} packet The packet to be sent.
@param {function} cb The callback to be called when response is received.
@param {any} arg Optional arguments to be passed to 'cb' when executing it.
@return Whether registering an ID was successful
@type boolean
*/ */
JSJaCConnection.prototype._registerPID = function(pID,cb,arg) { JSJaCConnection.prototype._registerPID = function(packet, cb, arg) {
if (!pID || !cb) this.oDbg.log("registering id for packet "+packet.xml(), 3);
var id = packet.getID();
if (!id) {
this.oDbg.log("id missing", 1);
return false; return false;
this._regIDs[pID] = new Object(); }
this._regIDs[pID].cb = cb;
if (arg) if (typeof cb != 'function') {
this._regIDs[pID].arg = arg; this.oDbg.log("callback is not a function", 1);
this.oDbg.log("registered "+pID,3); return false;
}
var jid = packet.getTo() || this.jid;
if (packet.getTo() == this.domain)
jid = this.jid;
if (!this._regIDs[jid]) {
this._regIDs[jid] = {};
}
if (this._regIDs[jid][id] != null) {
this.oDbg.log("id already registered: " + id, 1);
return false;
}
this._regIDs[jid][id] = {
cb: cb,
arg: arg,
ts: Date.now()
};
this.oDbg.log("registered id "+id,3);
this._cleanupRegisteredPIDs();
return true; return true;
}; };
/** /**
* partial function binding sendEmpty to callback * @private
*/
JSJaCConnection.prototype._cleanupRegisteredPIDs = function() {
var now = Date.now();
for (var jid in this._regIDs) {
if (this._regIDs.hasOwnProperty(jid)) {
for (var id in this._regIDs[jid]) {
if (this._regIDs[jid].hasOwnProperty(id)) {
if (this._regIDs[jid][id].ts + JSJAC_REGID_TIMEOUT < now) {
this.oDbg.log("deleting registered id '"+id+ "' due to timeout", 1);
delete this._regIDs[jid][id];
}
}
}
}
}
};
/**
* Partial function binding sendEmpty to callback
* @private * @private
*/ */
JSJaCConnection.prototype._prepSendEmpty = function(cb, ctx) { JSJaCConnection.prototype._prepSendEmpty = function(cb, ctx) {
@ -3862,17 +3951,6 @@ JSJaCConnection.prototype._setStatus = function(status) {
} }
}; };
/**
* @private
*/
JSJaCConnection.prototype._unregisterPID = function(pID) {
if (!this._regIDs[pID])
return false;
this._regIDs[pID] = null;
this.oDbg.log("unregistered "+pID,3);
return true;
};
/** /**
* @fileoverview All stuff related to HTTP Binding * @fileoverview All stuff related to HTTP Binding
@ -4240,18 +4318,18 @@ JSJaCHttpBindingConnection.prototype._parseResponse = function(req) {
} }
} catch (e) { } catch (e) {
this.oDbg.log("XMLHttpRequest error: status not available", 1); this.oDbg.log("XMLHttpRequest error: status not available", 1);
this._errcnt++; this._errcnt++;
if (this._errcnt > JSJAC_ERR_COUNT) { if (this._errcnt > JSJAC_ERR_COUNT) {
// abort // abort
this._abort(); this._abort();
} else { } else {
if (this.connected()) { if (this.connected()) {
this.oDbg.log("repeating ("+this._errcnt+")",1); this.oDbg.log("repeating ("+this._errcnt+")",1);
this._setStatus('proto_error_fallback'); this._setStatus('proto_error_fallback');
// schedule next tick // schedule next tick
setTimeout(JSJaC.bind(this._resume, this), setTimeout(JSJaC.bind(this._resume, this),
this.getPollInterval()); this.getPollInterval());
} }
} }
@ -4260,7 +4338,7 @@ JSJaCHttpBindingConnection.prototype._parseResponse = function(req) {
var body = r.responseXML.documentElement; var body = r.responseXML.documentElement;
if (!body || body.tagName != 'body' || if (!body || body.tagName != 'body' ||
body.namespaceURI != 'http://jabber.org/protocol/httpbind') { body.namespaceURI != 'http://jabber.org/protocol/httpbind') {
this.oDbg.log("invalid response:\n" + r.responseText,1); this.oDbg.log("invalid response:\n" + r.responseText,1);
clearTimeout(this._timeout); // remove timer clearTimeout(this._timeout); // remove timer
@ -4273,7 +4351,7 @@ JSJaCHttpBindingConnection.prototype._parseResponse = function(req) {
this._setStatus('internal_server_error'); this._setStatus('internal_server_error');
this._handleEvent('onerror', this._handleEvent('onerror',
JSJaCError('500','wait','internal-server-error')); JSJaCError('500','wait','internal-server-error'));
return null; return null;
} }
@ -4841,7 +4919,7 @@ JSJaCWebSocketConnection.prototype.send = function(packet, cb, arg) {
} }
// register callback with id // register callback with id
this._registerPID(packet.getID(), cb, arg); this._registerPID(packet, cb, arg);
} }
try { try {

View file

@ -5,112 +5,112 @@
// for http://www.iadvize.com // for http://www.iadvize.com
(function(global){ (function(global){
var SETTIMEOUT = global.setTimeout, // for better compression var SETTIMEOUT = global.setTimeout, // for better compression
doc = global.document, doc = global.document,
callback_counter = 0; callback_counter = 0;
global.jXHR = function() { global.jXHR = function() {
var script_url, var script_url,
script_loaded, script_loaded,
jsonp_callback, jsonp_callback,
scriptElem, scriptElem,
publicAPI = null; publicAPI = null;
function removeScript() { try { scriptElem.parentNode.removeChild(scriptElem); } catch (err) { } } function removeScript() { try { scriptElem.parentNode.removeChild(scriptElem); } catch (err) { } }
function reset() { function reset() {
script_loaded = false; script_loaded = false;
script_url = ""; script_url = "";
removeScript(); removeScript();
scriptElem = null; scriptElem = null;
fireReadyStateChange(0); fireReadyStateChange(0);
} }
function ThrowError(msg) { function ThrowError(msg) {
try { try {
publicAPI.onerror.call(publicAPI,msg,script_url); publicAPI.onerror.call(publicAPI,msg,script_url);
} catch (err) { } catch (err) {
//throw new Error(msg); //throw new Error(msg);
} }
} }
function handleScriptLoad() { function handleScriptLoad() {
if ((this.readyState && this.readyState!=="complete" && this.readyState!=="loaded") || script_loaded) { return; } if ((this.readyState && this.readyState!=="complete" && this.readyState!=="loaded") || script_loaded) { return; }
this.onload = this.onreadystatechange = null; // prevent memory leak this.onload = this.onreadystatechange = null; // prevent memory leak
script_loaded = true; script_loaded = true;
if (publicAPI.readyState !== 4) ThrowError("handleScriptLoad: Script failed to load ["+script_url+"]."); if (publicAPI.readyState !== 4) ThrowError("handleScriptLoad: Script failed to load ["+script_url+"].");
removeScript(); removeScript();
} }
function parseXMLString(xmlStr) { function parseXMLString(xmlStr) {
var xmlDoc = null; var xmlDoc = null;
if(window.DOMParser) { if(window.DOMParser) {
var parser = new DOMParser(); var parser = new DOMParser();
xmlDoc = parser.parseFromString(xmlStr,"text/xml"); xmlDoc = parser.parseFromString(xmlStr,"text/xml");
} }
else { else {
xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false"; xmlDoc.async="false";
xmlDoc.loadXML(xmlStr); xmlDoc.loadXML(xmlStr);
} }
return xmlDoc; return xmlDoc;
} }
function fireReadyStateChange(rs,args) { function fireReadyStateChange(rs,args) {
args = args || []; args = args || [];
publicAPI.readyState = rs; publicAPI.readyState = rs;
if (rs == 4) { if (rs == 4) {
publicAPI.responseText = args[0].reply; publicAPI.responseText = args[0].reply;
publicAPI.responseXML = parseXMLString(args[0].reply); publicAPI.responseXML = parseXMLString(args[0].reply);
} }
if (typeof publicAPI.onreadystatechange === "function") publicAPI.onreadystatechange.apply(publicAPI,args); if (typeof publicAPI.onreadystatechange === "function") publicAPI.onreadystatechange.apply(publicAPI,args);
} }
publicAPI = { publicAPI = {
onerror:null, onerror:null,
onreadystatechange:null, onreadystatechange:null,
readyState:0, readyState:0,
status:200, status:200,
responseBody: null, responseBody: null,
responseText: null, responseText: null,
responseXML: null, responseXML: null,
open:function(method,url){ open:function(method,url){
reset(); reset();
var internal_callback = "cb"+(callback_counter++); var internal_callback = "cb"+(callback_counter++);
(function(icb){ (function(icb){
global.jXHR[icb] = function() { global.jXHR[icb] = function() {
try { fireReadyStateChange.call(publicAPI,4,arguments); } try { fireReadyStateChange.call(publicAPI,4,arguments); }
catch(err) { catch(err) {
publicAPI.readyState = -1; publicAPI.readyState = -1;
ThrowError("Script failed to run ["+script_url+"]."); ThrowError("Script failed to run ["+script_url+"].");
} }
global.jXHR[icb] = null; global.jXHR[icb] = null;
}; };
})(internal_callback); })(internal_callback);
script_url = url + '?callback=?jXHR&data='; script_url = url + '?callback=?jXHR&data=';
script_url = script_url.replace(/=\?jXHR/,"=jXHR."+internal_callback); script_url = script_url.replace(/=\?jXHR/,"=jXHR."+internal_callback);
fireReadyStateChange(1); fireReadyStateChange(1);
}, },
send:function(data){ send:function(data){
script_url = script_url + encodeURIComponent(data); script_url = script_url + encodeURIComponent(data);
SETTIMEOUT(function(){ SETTIMEOUT(function(){
scriptElem = doc.createElement("script"); scriptElem = doc.createElement("script");
scriptElem.setAttribute("type","text/javascript"); scriptElem.setAttribute("type","text/javascript");
scriptElem.onload = scriptElem.onreadystatechange = function(){handleScriptLoad.call(scriptElem);}; scriptElem.onload = scriptElem.onreadystatechange = function(){handleScriptLoad.call(scriptElem);};
scriptElem.setAttribute("src",script_url); scriptElem.setAttribute("src",script_url);
doc.getElementsByTagName("head")[0].appendChild(scriptElem); doc.getElementsByTagName("head")[0].appendChild(scriptElem);
},0); },0);
fireReadyStateChange(2); fireReadyStateChange(2);
}, },
abort:function(){}, abort:function(){},
setRequestHeader:function(){}, // noop setRequestHeader:function(){}, // noop
getResponseHeader:function(){return "";}, // basically noop getResponseHeader:function(){return "";}, // basically noop
getAllResponseHeaders:function(){return [];} // ditto getAllResponseHeaders:function(){return [];} // ditto
}; };
reset(); reset();
return publicAPI; return publicAPI;
}; };
})(window); })(window);

View file

@ -38,7 +38,7 @@ var MAM = (function () {
self.msg_queue = {}; self.msg_queue = {};
/** /**
* Gets the MAM configuration * Gets the MAM configuration
* @public * @public
* @return {undefined} * @return {undefined}
@ -210,7 +210,7 @@ var MAM = (function () {
}; };
/** /**
* Handles the MAM configuration * Handles the MAM configuration
* @public * @public
* @param {object} iq * @param {object} iq

View file

@ -20,7 +20,7 @@ var Me = (function () {
var self = {}; var self = {};
/** /**
* Opens the Me tools * Opens the Me tools
* @public * @public
* @return {undefined} * @return {undefined}

View file

@ -20,7 +20,7 @@ var Message = (function () {
var self = {}; var self = {};
/** /**
* Handles the incoming message packets * Handles the incoming message packets
* @public * @public
* @param {object} message * @param {object} message
@ -392,8 +392,9 @@ var Message = (function () {
var html_escape = true; var html_escape = true;
// IE bug fix // IE bug fix
if((BrowserDetect.browser == 'Explorer') && (BrowserDetect.version < 9)) if((BrowserDetect.browser == 'Explorer') && (BrowserDetect.version < 9)) {
xHTML = 0; xHTML = 0;
}
//If this is a xHTML message //If this is a xHTML message
if(xHTML) { if(xHTML) {
@ -411,12 +412,14 @@ var Message = (function () {
var message_type = 'user-message'; var message_type = 'user-message';
// This is an old message // This is an old message
if(delay && resource) if(delay && resource) {
message_type = 'old-message'; message_type = 'old-message';
}
// This is a system message // This is a system message
else if(!resource) else if(!resource) {
message_type = 'system-message'; message_type = 'system-message';
}
var nickQuote = ''; var nickQuote = '';
@ -442,8 +445,9 @@ var Message = (function () {
Interface.messageNotify(hash, 'unread'); Interface.messageNotify(hash, 'unread');
// Play sound to all users in the MUC, except user who sent the message. // Play sound to all users in the MUC, except user who sent the message.
if(myNick != resource) if(myNick != resource) {
Audio.play('receive-message'); Audio.play('receive-message');
}
} }
} }
@ -462,10 +466,11 @@ var Message = (function () {
Receipts.sendReceived(type, from, id); Receipts.sendReceived(type, from, id);
// It does not come from a groupchat user, get the full name // It does not come from a groupchat user, get the full name
if(!GCUser) if(!GCUser) {
fromName = Name.getBuddy(xid); fromName = Name.getBuddy(xid);
else } else {
chatType = 'private'; chatType = 'private';
}
// If the chat isn't yet opened, open it ! // If the chat isn't yet opened, open it !
if(!Common.exists('#' + hash)) { if(!Common.exists('#' + hash)) {

View file

@ -18,9 +18,9 @@ var Microblog = (function () {
* @private * @private
*/ */
var self = {}; var self = {};
/** /**
* Completes arrays of an entry's attached files * Completes arrays of an entry's attached files
* @public * @public
* @param {string} selector * @param {string} selector
@ -515,7 +515,7 @@ var Microblog = (function () {
}; };
/** /**
* Gets a given microblog comments node * Gets a given microblog comments node
* @public * @public
* @param {string} server * @param {string} server
@ -930,7 +930,7 @@ var Microblog = (function () {
}; };
/** /**
* Adapts the comment elements width * Adapts the comment elements width
* @public * @public
* @param {string} id * @param {string} id
@ -1085,7 +1085,7 @@ var Microblog = (function () {
}; };
/** /**
* Handles the user's microblog to create it in case of error * Handles the user's microblog to create it in case of error
* @public * @public
* @param {object} iq * @param {object} iq
@ -1199,7 +1199,7 @@ var Microblog = (function () {
// Create a new individual channel // Create a new individual channel
$('#channel .content.mixed').after( $('#channel .content.mixed').after(
'<div class="content individual microblog-' + hash + '">' + '<div class="content individual microblog-' + hash + '">' +
'<a href="#" class="more home-images" onclick="if($(\'#channel .footer div.fetch\').is(\':hidden\')) { return self.get(\'' + Utils.encodeOnclick(xid) + '\', \'' + Utils.encodeOnclick(hash) + '\'); } return false;">' + Common._e("More notices...") + '</a>' + '<a href="#" class="more home-images" onclick="if($(\'#channel .footer div.fetch\').is(\':hidden\')) { return Microblog.get(\'' + Utils.encodeOnclick(xid) + '\', \'' + Utils.encodeOnclick(hash) + '\'); } return false;">' + Common._e("More notices...") + '</a>' +
'</div>' '</div>'
) )
@ -1283,7 +1283,7 @@ var Microblog = (function () {
}; };
/** /**
* Gets the microblog configuration * Gets the microblog configuration
* @public * @public
* @return {undefined} * @return {undefined}
@ -1455,7 +1455,7 @@ var Microblog = (function () {
}; };
/** /**
* Publishes a given microblog item * Publishes a given microblog item
* @public * @public
* @param {type} body * @param {type} body

View file

@ -11,39 +11,39 @@ Authors: Valérian Saliou, hunterjm, Camaran, regilero, Kloadut, Maranda
*/ */
// Jappix Mini globals // Jappix Mini globals
var MINI_DISCONNECT = false; var MINI_DISCONNECT = false;
var MINI_AUTOCONNECT = false; var MINI_AUTOCONNECT = false;
var MINI_SHOWPANE = false; var MINI_SHOWPANE = false;
var MINI_INITIALIZED = false; var MINI_INITIALIZED = false;
var MINI_ROSTER_INIT = false; var MINI_ROSTER_INIT = false;
var MINI_ROSTER_NOGROUP = 'jm_nogroup'; var MINI_ROSTER_NOGROUP = 'jm_nogroup';
var MINI_ANONYMOUS = false; var MINI_ANONYMOUS = false;
var MINI_ANIMATE = false; var MINI_ANIMATE = false;
var MINI_RANDNICK = false; var MINI_RANDNICK = false;
var MINI_GROUPCHAT_PRESENCE = false; var MINI_GROUPCHAT_PRESENCE = false;
var MINI_DISABLE_MOBILE = false; var MINI_DISABLE_MOBILE = false;
var MINI_NICKNAME = ''; var MINI_NICKNAME = '';
var MINI_TITLE = null; var MINI_TITLE = null;
var MINI_DOMAIN = null; var MINI_DOMAIN = null;
var MINI_USER = null; var MINI_USER = null;
var MINI_PASSWORD = null; var MINI_PASSWORD = null;
var MINI_HASH = null; var MINI_HASH = null;
var MINI_ACTIVE = null; var MINI_ACTIVE = null;
var MINI_RECONNECT = 0; var MINI_RECONNECT = 0;
var MINI_RECONNECT_MAX = 100; var MINI_RECONNECT_MAX = 100;
var MINI_RECONNECT_INTERVAL = 1; var MINI_RECONNECT_INTERVAL = 1;
var MINI_PIXEL_STREAM_DURATION = 300; var MINI_PIXEL_STREAM_DURATION = 300;
var MINI_PIXEL_STREAM_INTERVAL = 7200; var MINI_PIXEL_STREAM_INTERVAL = 7200;
var MINI_QUEUE = []; var MINI_QUEUE = [];
var MINI_CHATS = []; var MINI_CHATS = [];
var MINI_GROUPCHATS = []; var MINI_GROUPCHATS = [];
var MINI_SUGGEST_CHATS = []; var MINI_SUGGEST_CHATS = [];
var MINI_SUGGEST_GROUPCHATS = []; var MINI_SUGGEST_GROUPCHATS = [];
var MINI_SUGGEST_PASSWORDS = []; var MINI_SUGGEST_PASSWORDS = [];
var MINI_PASSWORDS = []; var MINI_PASSWORDS = [];
var MINI_PRIORITY = 1; var MINI_PRIORITY = 1;
var MINI_RESOURCE = JAPPIX_RESOURCE + ' Mini'; var MINI_RESOURCE = JAPPIX_RESOURCE + ' Mini';
var MINI_ERROR_LINK = 'https://mini.jappix.com/issues'; var MINI_ERROR_LINK = 'https://mini.jappix.com/issues';
// Bundle // Bundle
@ -56,7 +56,7 @@ var JappixMini = (function () {
var self = {}; var self = {};
/** /**
* Setups connection handlers * Setups connection handlers
* @public * @public
* @param {object} con * @param {object} con
@ -298,7 +298,7 @@ var JappixMini = (function () {
}; };
/** /**
* Flushes Jappix Mini storage database * Flushes Jappix Mini storage database
* @public * @public
* @param {string} r_override * @param {string} r_override
@ -604,7 +604,7 @@ var JappixMini = (function () {
}; };
/** /**
* Handles the incoming IQs * Handles the incoming IQs
* @public * @public
* @param {object} iq * @param {object} iq
@ -843,7 +843,7 @@ var JappixMini = (function () {
}; };
/** /**
* Removes a given presence resource for an user * Removes a given presence resource for an user
* @public * @public
* @param {string} xid * @param {string} xid
@ -1174,7 +1174,7 @@ var JappixMini = (function () {
}; };
/** /**
* Updates the user presence * Updates the user presence
* @public * @public
* @param {string} type * @param {string} type
@ -1371,7 +1371,7 @@ var JappixMini = (function () {
}; };
/** /**
* Unserializes and update the queue storage * Unserializes and update the queue storage
* @public * @public
* @return {undefined} * @return {undefined}
@ -1526,7 +1526,7 @@ var JappixMini = (function () {
}; };
/** /**
* Clears the notifications * Clears the notifications
* @public * @public
* @param {string} hash * @param {string} hash
@ -2431,7 +2431,7 @@ var JappixMini = (function () {
}; };
/** /**
* Buddy events * Buddy events
* @public * @public
* @param {string} path * @param {string} path
@ -2745,7 +2745,7 @@ var JappixMini = (function () {
}; };
/** /**
* Returns the prompt value * Returns the prompt value
* @public * @public
* @return {string} * @return {string}
@ -3159,7 +3159,7 @@ var JappixMini = (function () {
}; };
/** /**
* Shows the roster * Shows the roster
* @public * @public
* @return {undefined} * @return {undefined}
@ -3363,7 +3363,7 @@ var JappixMini = (function () {
}; };
/** /**
* Displays a roster buddy * Displays a roster buddy
* @public * @public
* @param {string} xid * @param {string} xid
@ -3654,7 +3654,7 @@ var JappixMini = (function () {
}; };
/** /**
* Adapts the roster height to the window * Adapts the roster height to the window
* @public * @public
* @return {undefined} * @return {undefined}
@ -3861,7 +3861,7 @@ var JappixMini = (function () {
}; };
/** /**
* Adds the chatstate events * Adds the chatstate events
* @public * @public
* @param {string} xid * @param {string} xid

View file

@ -20,7 +20,7 @@ var Mobile = (function () {
var self = {}; var self = {};
/** /**
* Proceeds connection * Proceeds connection
* @public * @public
* @param {object} aForm * @param {object} aForm
@ -207,7 +207,7 @@ var Mobile = (function () {
}; };
/** /**
* Resets DOM to its initial state * Resets DOM to its initial state
* @public * @public
* @return {undefined} * @return {undefined}
@ -286,7 +286,7 @@ var Mobile = (function () {
}; };
/** /**
* Handles message stanza * Handles message stanza
* @public * @public
* @param {object} msg * @param {object} msg
@ -504,7 +504,7 @@ var Mobile = (function () {
}; };
/** /**
* Handles disconnected state * Handles disconnected state
* @public * @public
* @return {undefined} * @return {undefined}
@ -664,7 +664,7 @@ var Mobile = (function () {
}; };
/** /**
* Gets user nick (the dumb way) * Gets user nick (the dumb way)
* @public * @public
* @param {string} xid * @param {string} xid
@ -770,7 +770,7 @@ var Mobile = (function () {
}; };
/** /**
* Gets the host part of a XID * Gets the host part of a XID
* @public * @public
* @param {string} aXID * @param {string} aXID
@ -899,7 +899,7 @@ var Mobile = (function () {
}; };
/** /**
* Creates given chat * Creates given chat
* @public * @public
* @param {string} xid * @param {string} xid

View file

@ -20,7 +20,7 @@ var MUCAdmin = (function () {
var self = {}; var self = {};
/** /**
* Opens the MUC admin popup * Opens the MUC admin popup
* @public * @public
* @param {string} xid * @param {string} xid
@ -251,7 +251,7 @@ var MUCAdmin = (function () {
}; };
/** /**
* Handles the MUC admin form * Handles the MUC admin form
* @public * @public
* @param {object} iq * @param {object} iq
@ -449,7 +449,7 @@ var MUCAdmin = (function () {
}; };
/** /**
* Destroys a MUC room * Destroys a MUC room
* @public * @public
* @param {string} xid * @param {string} xid

View file

@ -20,7 +20,7 @@ var Music = (function () {
var self = {}; var self = {};
/** /**
* Opens the music bubble * Opens the music bubble
* @public * @public
* @return {boolean} * @return {boolean}
@ -281,7 +281,7 @@ var Music = (function () {
}; };
/** /**
* Adds a music title to the results * Adds a music title to the results
* @public * @public
* @param {string} id * @param {string} id

View file

@ -20,7 +20,7 @@ var Name = (function () {
var self = {}; var self = {};
/** /**
* Gets an user name for buddy add tool * Gets an user name for buddy add tool
* @public * @public
* @param {string} xid * @param {string} xid
@ -181,7 +181,7 @@ var Name = (function () {
}; };
/** /**
* Gets the full name of the user * Gets the full name of the user
* @public * @public
* @return {string} * @return {string}

View file

@ -20,7 +20,7 @@ var Notification = (function () {
var self = {}; var self = {};
/** /**
* Resets the notifications alert if no one remaining * Resets the notifications alert if no one remaining
* @public * @public
* @return {undefined} * @return {undefined}
@ -405,7 +405,7 @@ var Notification = (function () {
}; };
/** /**
* Gets the pending social notifications * Gets the pending social notifications
* @public * @public
* @return {undefined} * @return {undefined}
@ -588,7 +588,7 @@ var Notification = (function () {
}; };
/** /**
* Adapt the notifications bubble max-height * Adapt the notifications bubble max-height
* @public * @public
* @return {undefined} * @return {undefined}

View file

@ -20,7 +20,7 @@ var OOB = (function () {
var self = {}; var self = {};
/** /**
* Sends an OOB request to someone * Sends an OOB request to someone
* @public * @public
* @param {string} to * @param {string} to

View file

@ -20,7 +20,7 @@ var Options = (function () {
var self = {}; var self = {};
/** /**
* Opens the options popup * Opens the options popup
* @public * @public
* @return {boolean} * @return {boolean}
@ -315,7 +315,7 @@ var Options = (function () {
}; };
/** /**
* Sends the options to the XMPP server * Sends the options to the XMPP server
* @public * @public
* @return {undefined} * @return {undefined}
@ -559,7 +559,7 @@ var Options = (function () {
}; };
/** /**
* Handles the account deletion request * Handles the account deletion request
* @public * @public
* @param {object} iq * @param {object} iq
@ -747,7 +747,7 @@ var Options = (function () {
}; };
/** /**
* Loads the user options * Loads the user options
* @public * @public
* @return {undefined} * @return {undefined}

View file

@ -20,7 +20,7 @@ var PEP = (function () {
var self = {}; var self = {};
/** /**
* Stores the PEP items * Stores the PEP items
* @public * @public
* @param {string} xid * @param {string} xid
@ -549,7 +549,7 @@ var PEP = (function () {
}; };
/** /**
* Sends the user's activity * Sends the user's activity
* @public * @public
* @param {string} main * @param {string} main
@ -777,7 +777,7 @@ var PEP = (function () {
}; };
/** /**
* Geolocates the user * Geolocates the user
* @public * @public
* @return {undefined} * @return {undefined}
@ -809,7 +809,7 @@ var PEP = (function () {
/** /**
* Gets the user's microblog to check it exists * Gets the user's geolocation to check it exists
* @public * @public
* @return {undefined} * @return {undefined}
*/ */
@ -833,7 +833,7 @@ var PEP = (function () {
/** /**
* Handles the user's microblog to create it in case of error * Handles the user's geolocation to create note in case of error
* @public * @public
* @param {object} iq * @param {object} iq
* @return {undefined} * @return {undefined}

View file

@ -20,7 +20,7 @@ var Popup = (function () {
var self = {}; var self = {};
/** /**
* Creates a popup code * Creates a popup code
* @public * @public
* @param {string} id * @param {string} id

View file

@ -25,7 +25,7 @@ var Presence = (function () {
self.auto_idle = false; self.auto_idle = false;
/** /**
* Sends the user first presence * Sends the user first presence
* @public * @public
* @param {string} checksum * @param {string} checksum
@ -753,7 +753,7 @@ var Presence = (function () {
}; };
/** /**
* Process the chat presence position * Process the chat presence position
* @public * @public
* @param {string} hash * @param {string} hash
@ -997,7 +997,7 @@ var Presence = (function () {
}; };
/** /**
* Returns the highest presence priority XID for an user * Returns the highest presence priority XID for an user
* @public * @public
* @param {string} xid * @param {string} xid
@ -1130,7 +1130,7 @@ var Presence = (function () {
}; };
/** /**
* Makes something easy to process for the presence IA * Makes something easy to process for the presence IA
* @public * @public
* @param {string} xid * @param {string} xid
@ -1356,7 +1356,7 @@ var Presence = (function () {
}; };
/** /**
* Accepts the subscription from another entity * Accepts the subscription from another entity
* @public * @public
* @param {string} xid * @param {string} xid
@ -1526,7 +1526,7 @@ var Presence = (function () {
}; };
/** /**
* Gets the user presence show * Gets the user presence show
* @public * @public
* @return {string} * @return {string}

View file

@ -20,7 +20,7 @@ var Privacy = (function () {
var self = {}; var self = {};
/** /**
* Opens the privacy popup * Opens the privacy popup
* @public * @public
* @return {boolean} * @return {boolean}
@ -243,7 +243,7 @@ var Privacy = (function () {
}; };
/** /**
* Gets privacy lists * Gets privacy lists
* @public * @public
* @param {object} list * @param {object} list
@ -536,7 +536,7 @@ var Privacy = (function () {
}; };
/** /**
* Checks the privacy status (action) of a value * Checks the privacy status (action) of a value
* @public * @public
* @param {string} list * @param {string} list
@ -844,7 +844,7 @@ var Privacy = (function () {
}; };
/** /**
* Clears the privacy list form * Clears the privacy list form
* @public * @public
* @return {undefined} * @return {undefined}

View file

@ -20,7 +20,7 @@ var Receipts = (function () {
var self = {}; var self = {};
/** /**
* Checks if we can send a receipt request * Checks if we can send a receipt request
* @public * @public
* @param {string} hash * @param {string} hash
@ -158,7 +158,7 @@ var Receipts = (function () {
}; };
/** /**
* Checks if the message has been received * Checks if the message has been received
* @public * @public
* @param {string} hash * @param {string} hash

View file

@ -24,7 +24,7 @@ var Roster = (function () {
self.blist_all = false; self.blist_all = false;
/** /**
* Gets the roster items * Gets the roster items
* @public * @public
* @return {undefined} * @return {undefined}
@ -66,7 +66,10 @@ var Roster = (function () {
// Request user microblog (populates channel) // Request user microblog (populates channel)
if(user_xid && ((user_subscription == 'both') || (user_subscription == 'to'))) { if(user_xid && ((user_subscription == 'both') || (user_subscription == 'to'))) {
Microblog.request(user_xid, 1, null, Microblog.handleRoster); // Openfire has an issue, forget about it!
if(Features.getServerName() != 'openfire') {
Microblog.request(user_xid, 1, null, Microblog.handleRoster);
}
} }
}); });
@ -316,7 +319,7 @@ var Roster = (function () {
}; };
/** /**
* Applies the buddy editing input events * Applies the buddy editing input events
* @public * @public
* @param {string} xid * @param {string} xid
@ -704,7 +707,7 @@ var Roster = (function () {
}; };
/** /**
* Gets an array of all the groups in the roster * Gets an array of all the groups in the roster
* @public * @public
* @param {type} name * @param {type} name
@ -945,7 +948,7 @@ var Roster = (function () {
}; };
/** /**
* Gets all the buddies in our roster * Gets all the buddies in our roster
* @public * @public
* @return {object} * @return {object}

View file

@ -20,7 +20,7 @@ var RosterX = (function () {
var self = {}; var self = {};
/** /**
* Opens the rosterx tools * Opens the rosterx tools
* @public * @public
* @param {string} data * @param {string} data
@ -238,7 +238,7 @@ var RosterX = (function () {
}; };
/** /**
* Plugin launcher * Plugin launcher
* @public * @public
* @return {undefined} * @return {undefined}

View file

@ -24,7 +24,7 @@ var Search = (function () {
self.search_filtered = false; self.search_filtered = false;
/** /**
* Searches in the user's buddy list * Searches in the user's buddy list
* @public * @public
* @param {string} query * @param {string} query

View file

@ -20,7 +20,7 @@ var Smileys = (function () {
var self = {}; var self = {};
/** /**
* Generates the correct HTML code for an emoticon insertion tool * Generates the correct HTML code for an emoticon insertion tool
* @public * @public
* @param {string} smiley * @param {string} smiley

View file

@ -20,7 +20,7 @@ var Talk = (function () {
var self = {}; var self = {};
/** /**
* Creates the talkpage events * Creates the talkpage events
* @public * @public
* @return {undefined} * @return {undefined}

View file

@ -20,7 +20,7 @@ var Tooltip = (function () {
var self = {}; var self = {};
/** /**
* Creates a tooltip code * Creates a tooltip code
* @public * @public
* @param {string} xid * @param {string} xid

View file

@ -20,7 +20,7 @@ var UserInfos = (function () {
var self = {}; var self = {};
/** /**
* Opens the user-infos popup * Opens the user-infos popup
* @public * @public
* @param {string} xid * @param {string} xid
@ -263,7 +263,7 @@ var UserInfos = (function () {
}; };
/** /**
* Displays the buddy comments * Displays the buddy comments
* @public * @public
* @param {string} xid * @param {string} xid
@ -463,7 +463,7 @@ var UserInfos = (function () {
}; };
/** /**
* Sends the buddy comments * Sends the buddy comments
* @public * @public
* @return {boolean} * @return {boolean}

View file

@ -85,7 +85,7 @@ var Utils = (function () {
}; };
/** /**
* Truncates a string * Truncates a string
* @public * @public
* @param {string} string * @param {string} string
@ -181,7 +181,7 @@ var Utils = (function () {
}; };
/** /**
* Checks if this is a private chat user * Checks if this is a private chat user
* @public * @public
* @param {string} xid * @param {string} xid
@ -303,7 +303,7 @@ var Utils = (function () {
}; };
/** /**
* Gets the password of the user * Gets the password of the user
* @public * @public
* @return {string} * @return {string}
@ -321,22 +321,27 @@ var Utils = (function () {
/** /**
* Quotes the nick of an user * Quotes the nick of an user. If a message is given, the nick is inserted at its end.
* @public * @public
* @param {string} hash * @param {string} hash
* @param {string} nick * @param {string} nick
* @param {string} message
* @return {undefined} * @return {undefined}
*/ */
self.quoteMyNick = function(hash, nick) { self.quoteMyNick = function(hash, nick, message) {
try { try {
$(document).oneTime(10, function() { $(document).oneTime(10, function() {
$('#page-engine #' + hash + ' .message-area').val(nick + ', ').focus(); if (message === undefined || message.length === 0) {
$('#page-engine #' + hash + ' .message-area').val(nick + ', ').focus();
} else {
$('#page-engine #' + hash + ' .message-area').val(message + nick).focus();
}
}); });
} catch(e) { } catch(e) {
Console.error('Utils.quoteMyNick', e); Console.error('Utils.quoteMyNick', e);
} }
}; };
@ -551,7 +556,7 @@ var Utils = (function () {
}; };
/** /**
* Removes a value from an array * Removes a value from an array
* @public * @public
* @param {object} array * @param {object} array

View file

@ -20,7 +20,7 @@ var vCard = (function () {
var self = {}; var self = {};
/** /**
* Opens the vCard popup * Opens the vCard popup
* @public * @public
* @return {boolean} * @return {boolean}
@ -294,7 +294,7 @@ var vCard = (function () {
}; };
/** /**
* Deletes the encoded avatar of an user * Deletes the encoded avatar of an user
* @public * @public
* @return {boolean} * @return {boolean}
@ -428,7 +428,7 @@ var vCard = (function () {
}; };
/** /**
* Handles a vCard stanza * Handles a vCard stanza
* @public * @public
* @param {object} iq * @param {object} iq

View file

@ -24,7 +24,7 @@ var Welcome = (function () {
self.is_done = false; self.is_done = false;
/** /**
* Opens the welcome tools * Opens the welcome tools
* @public * @public
* @return {undefined} * @return {undefined}
@ -324,7 +324,7 @@ var Welcome = (function () {
}; };
/** /**
* Goes to the next welcome step * Goes to the next welcome step
* @public * @public
* @return {boolean} * @return {boolean}

View file

@ -20,7 +20,7 @@ var XMPPLinks = (function () {
var self = {}; var self = {};
/** /**
* Does an action with the provided XMPP link * Does an action with the provided XMPP link
* @public * @public
* @param {string} link * @param {string} link

View file

@ -11,19 +11,19 @@ Author: Valérian Saliou
*/ */
#adhoc .content { #adhoc .content {
padding: 10px 0 10px 0; padding: 10px 0 10px 0;
} }
#adhoc .adhoc-head { #adhoc .adhoc-head {
background-color: #f1f6fd; background-color: #f1f6fd;
border: 1px #9dc4fc solid; border: 1px #9dc4fc solid;
width: 598px; width: 598px;
height: 18px; height: 18px;
font-size: 0.9em; font-size: 0.9em;
margin: 0 10px 12px 10px; margin: 0 10px 12px 10px;
padding: 6px 10px; padding: 6px 10px;
} }
#adhoc .one-actions .one-button { #adhoc .one-actions .one-button {
float: right; float: right;
} }

View file

@ -11,19 +11,19 @@ Author: Valérian Saliou
*/ */
#top-content { #top-content {
min-width: 500px !important; min-width: 500px !important;
} }
#main-content { #main-content {
min-width: 490px !important; min-width: 490px !important;
min-height: 450px !important; min-height: 450px !important;
} }
#left-content { #left-content {
display: none; display: none;
} }
#right-content { #right-content {
left: 0 !important; left: 0 !important;
right: 0 !important; right: 0 !important;
} }

View file

@ -11,36 +11,36 @@ Author: Valérian Saliou
*/ */
#board .one-board { #board .one-board {
display: none; display: none;
position: fixed; position: fixed;
top: 0; top: 0;
left: 0; left: 0;
right: 0; right: 0;
height: 20px; height: 20px;
z-index: 10000; z-index: 10000;
font-size: 0.92em; font-size: 0.92em;
padding: 6px 8px 5px 8px; padding: 6px 8px 5px 8px;
-moz-box-shadow: 0 0 8px #5c5c5c; -moz-box-shadow: 0 0 8px #5c5c5c;
-webkit-box-shadow: 0 0 8px #5c5c5c; -webkit-box-shadow: 0 0 8px #5c5c5c;
box-shadow: 0 0 8px #5c5c5c; box-shadow: 0 0 8px #5c5c5c;
} }
#board .one-board:hover { #board .one-board:hover {
cursor: pointer; cursor: pointer;
} }
#board .one-board.visible { #board .one-board.visible {
display: block; display: block;
} }
#board .one-board.error { #board .one-board.error {
background-color: rgb(241,160,160); background-color: rgb(241,160,160);
background-color: rgba(241,160,160,0.9); background-color: rgba(241,160,160,0.9);
color: #420c0c; color: #420c0c;
} }
#board .one-board.info { #board .one-board.info {
background-color: rgb(248,246,186); background-color: rgb(248,246,186);
background-color: rgba(248,246,186,0.9); background-color: rgba(248,246,186,0.9);
color: #2f2a02; color: #2f2a02;
} }

View file

@ -11,636 +11,636 @@ Author: Valérian Saliou
*/ */
#channel .top div.update { #channel .top div.update {
position: absolute; position: absolute;
top: 12px; top: 12px;
left: 115px; left: 115px;
right: 15px; right: 15px;
bottom: 15px; bottom: 15px;
-moz-border-radius: 20px; -moz-border-radius: 20px;
-webkit-border-radius: 20px; -webkit-border-radius: 20px;
border-radius: 20px; border-radius: 20px;
} }
html[dir="rtl"] #channel .top div.update { html[dir="rtl"] #channel .top div.update {
right: 115px; right: 115px;
left: 15px; left: 15px;
} }
#channel .top p { #channel .top p {
font-size: 0.9em; font-size: 0.9em;
margin-bottom: 10px; margin-bottom: 10px;
} }
#channel .top h2 { #channel .top h2 {
font-size: 1.5em; font-size: 1.5em;
margin-bottom: 10px; margin-bottom: 10px;
color: #232323; color: #232323;
} }
#channel .top a { #channel .top a {
font-size: 0.9em; font-size: 0.9em;
color: #232323; color: #232323;
} }
#channel .top.individual div.update { #channel .top.individual div.update {
right: 36px; right: 36px;
} }
#channel .top.individual div.shortcuts, #channel .top.individual div.shortcuts,
#userinfos .main-infos div.shortcuts { #userinfos .main-infos div.shortcuts {
width: 16px; width: 16px;
float: right; float: right;
} }
#channel .top.individual div.shortcuts { #channel .top.individual div.shortcuts {
margin: 2px 5px 0 0; margin: 2px 5px 0 0;
} }
#channel .top.individual div.shortcuts a, #channel .top.individual div.shortcuts a,
#userinfos .main-infos div.shortcuts a { #userinfos .main-infos div.shortcuts a {
height: 16px; height: 16px;
width: 16px; width: 16px;
margin-bottom: 4px; margin-bottom: 4px;
display: block; display: block;
} }
#channel .top.individual div.shortcuts a.message, #channel .top.individual div.shortcuts a.message,
#userinfos .main-infos a.message { #userinfos .main-infos a.message {
background-position: 0 -1717px; background-position: 0 -1717px;
} }
#channel .top.individual div.shortcuts a.chat, #channel .top.individual div.shortcuts a.chat,
#userinfos .main-infos a.chat { #userinfos .main-infos a.chat {
background-position: 0 -1737px; background-position: 0 -1737px;
} }
#channel .top.individual div.shortcuts a.command, #channel .top.individual div.shortcuts a.command,
#userinfos .main-infos a.command { #userinfos .main-infos a.command {
background-position: 0 -1758px; background-position: 0 -1758px;
} }
#channel .microblog-body { #channel .microblog-body {
height: 20px; height: 20px;
margin-right: 50px; margin-right: 50px;
} }
html[dir="rtl"] #channel .microblog-body { html[dir="rtl"] #channel .microblog-body {
margin-right: auto; margin-right: auto;
margin-left: 50px; margin-left: 50px;
} }
#channel .microblog-body input { #channel .microblog-body input {
width: 100%; width: 100%;
height: 100%; height: 100%;
padding: 8px; padding: 8px;
} }
#channel .one-microblog-icon { #channel .one-microblog-icon {
position: absolute; position: absolute;
top: 38px; top: 38px;
right: 0; right: 0;
} }
html[dir="rtl"] #channel .one-microblog-icon { html[dir="rtl"] #channel .one-microblog-icon {
left: 0; left: 0;
right: auto; right: auto;
} }
#channel div.update .one-microblog-icon, #channel div.update .one-microblog-icon,
#channel div.update .postit { #channel div.update .postit {
width: 16px; width: 16px;
height: 16px; height: 16px;
display: block; display: block;
} }
#channel div.update .attach { #channel div.update .attach {
background-position: 0 -79px; background-position: 0 -79px;
display: none; display: none;
} }
#attach { #attach {
position: absolute; position: absolute;
width: 263px; width: 263px;
margin-left: -227px; margin-left: -227px;
color: white; color: white;
font-size: 0.85em; font-size: 0.85em;
z-index: 9998; z-index: 9998;
text-align: left; text-align: left;
display: none; display: none;
} }
#attach p { #attach p {
margin-bottom: 6px !important; margin-bottom: 6px !important;
} }
#attach input[type="submit"] { #attach input[type="submit"] {
margin: 8px 0 6px 0; margin: 8px 0 6px 0;
} }
#attach .wait { #attach .wait {
float: right; float: right;
margin: 7px 5px; margin: 7px 5px;
} }
#attach div.one-file { #attach div.one-file {
height: 16px; height: 16px;
margin-top: 2px; margin-top: 2px;
} }
#attach div.one-file a.link { #attach div.one-file a.link {
color: white; color: white;
width: 215px; width: 215px;
height: 14px; height: 14px;
margin-left: 2px; margin-left: 2px;
overflow: hidden; overflow: hidden;
float: left; float: left;
} }
html[dir="rtl"] #attach div.one-file a.link { html[dir="rtl"] #attach div.one-file a.link {
text-align: right; text-align: right;
margin-left: auto; margin-left: auto;
margin-right: 2px; margin-right: 2px;
float: right; float: right;
} }
#attach div.one-file a.remove { #attach div.one-file a.remove {
width: 16px; width: 16px;
height: 16px; height: 16px;
float: left; float: left;
} }
html[dir="rtl"] #attach div.one-file a.remove { html[dir="rtl"] #attach div.one-file a.remove {
float: right; float: right;
} }
.attach-subarrow { .attach-subarrow {
background-position: 0 -241px; background-position: 0 -241px;
opacity: 0.8; opacity: 0.8;
height: 10px; height: 10px;
width: 18px; width: 18px;
margin-left: 226px; margin-left: 226px;
} }
.attach-subitem { .attach-subitem {
background-color: rgb(0,0,0); background-color: rgb(0,0,0);
background-color: rgba(0,0,0,0.8); background-color: rgba(0,0,0,0.8);
padding: 10px; padding: 10px;
text-shadow: 0 1px 1px black; text-shadow: 0 1px 1px black;
-moz-border-radius: 5px; -moz-border-radius: 5px;
-webkit-border-radius: 5px; -webkit-border-radius: 5px;
border-radius: 5px; border-radius: 5px;
} }
html[dir="rtl"] .attach-subitem { html[dir="rtl"] .attach-subitem {
position: absolute; position: absolute;
left: 238px; left: 238px;
} }
.attach-p { .attach-p {
font-weight: bold; font-weight: bold;
float: left; float: left;
} }
#channel .one-update { #channel .one-update {
margin-bottom: 12px; margin-bottom: 12px;
padding: 6px 6px 8px 6px; padding: 6px 6px 8px 6px;
border-bottom: 1px dotted #d0d0d0; border-bottom: 1px dotted #d0d0d0;
min-height: 50px; min-height: 50px;
color: black; color: black;
position: relative; position: relative;
display: none; display: none;
} }
#channel .one-update .avatar-container { #channel .one-update .avatar-container {
text-align: center; text-align: center;
margin-right: 16px; margin-right: 16px;
float: left; float: left;
height: 50px; height: 50px;
width: 50px; width: 50px;
} }
html[dir="rtl"] #channel .one-update .avatar-container { html[dir="rtl"] #channel .one-update .avatar-container {
margin-right: auto; margin-right: auto;
margin-left: 16px; margin-left: 16px;
float: right; float: right;
} }
#channel .one-update .avatar-container:hover { #channel .one-update .avatar-container:hover {
cursor: pointer; cursor: pointer;
} }
#channel .one-update img.avatar { #channel .one-update img.avatar {
max-height: 50px; max-height: 50px;
max-width: 50px; max-width: 50px;
} }
#channel .one-update div.body { #channel .one-update div.body {
line-height: 1.4; line-height: 1.4;
margin-left: 65px; margin-left: 65px;
opacity: 0.8; opacity: 0.8;
} }
#channel .one-update:hover div.body { #channel .one-update:hover div.body {
opacity: 1; opacity: 1;
} }
#channel .one-update a.repeat { #channel .one-update a.repeat {
background-position: 0 -1681px; background-position: 0 -1681px;
height: 16px; height: 16px;
width: 16px; width: 16px;
margin-right: 4px; margin-right: 4px;
float: left; float: left;
} }
#channel .one-update span a { #channel .one-update span a {
text-decoration: underline; text-decoration: underline;
} }
#channel .one-update p { #channel .one-update p {
display: block; display: block;
margin: 0 12px 5px 0; margin: 0 12px 5px 0;
} }
html[dir="rtl"] #channel .one-update p { html[dir="rtl"] #channel .one-update p {
margin-right: auto; margin-right: auto;
margin-left: 12px; margin-left: 12px;
} }
#channel .one-update p b.name:hover { #channel .one-update p b.name:hover {
cursor: pointer; cursor: pointer;
text-decoration: underline; text-decoration: underline;
} }
html[dir="rtl"] #channel .one-update p b.name { html[dir="rtl"] #channel .one-update p b.name {
margin-left: 4px; margin-left: 4px;
float: right; float: right;
} }
#channel .one-update p.infos { #channel .one-update p.infos {
font-size: 0.9em; font-size: 0.9em;
} }
#channel .one-update p.infos a.geoloc { #channel .one-update p.infos a.geoloc {
background-position: 0 -1778px; background-position: 0 -1778px;
color: #363636; color: #363636;
margin-left: 18px; margin-left: 18px;
padding-left: 14px; padding-left: 14px;
} }
html[dir="rtl"] #channel .one-update p.infos a.geoloc { html[dir="rtl"] #channel .one-update p.infos a.geoloc {
float: right; float: right;
} }
#channel .one-update p.infos a.geoloc:hover, #channel .one-update p.infos a.geoloc:hover,
#channel .one-update p.infos a.geoloc:focus, #channel .one-update p.infos a.geoloc:focus,
#channel .one-update p.infos a.geoloc:active { #channel .one-update p.infos a.geoloc:active {
color: #141414; color: #141414;
} }
#channel .one-update p.file { #channel .one-update p.file {
font-size: 0.9em; font-size: 0.9em;
margin: 6px 0 5px 10px; margin: 6px 0 5px 10px;
} }
#channel .one-update p.file a.link, #channel .one-update p.file a.link,
#inbox .inbox-new-file a.file { #inbox .inbox-new-file a.file {
min-height: 16px; min-height: 16px;
padding-left: 22px; padding-left: 22px;
text-decoration: underline; text-decoration: underline;
display: block; display: block;
} }
#channel .one-update p.file a.link { #channel .one-update p.file a.link {
margin-top: 4px; margin-top: 4px;
} }
#channel p.file a, #channel p.file a,
#inbox .inbox-new-file a.file { #inbox .inbox-new-file a.file {
background-position: 0 -988px; background-position: 0 -988px;
} }
#channel p.file a.audio, #channel p.file a.audio,
#inbox .inbox-new-file a.file.audio { #inbox .inbox-new-file a.file.audio {
background-position: 0 -899px; background-position: 0 -899px;
} }
#channel p.file a.image, #channel p.file a.image,
#inbox .inbox-new-file a.file.image { #inbox .inbox-new-file a.file.image {
background-position: 0 -917px; background-position: 0 -917px;
} }
#channel p.file a.video, #channel p.file a.video,
#inbox .inbox-new-file a.file.video { #inbox .inbox-new-file a.file.video {
background-position: 0 -935px; background-position: 0 -935px;
} }
#channel p.file a.document, #channel p.file a.document,
#inbox .inbox-new-file a.file.document { #inbox .inbox-new-file a.file.document {
background-position: 0 -953px; background-position: 0 -953px;
} }
#channel p.file a.package, #channel p.file a.package,
#inbox .inbox-new-file a.file.package { #inbox .inbox-new-file a.file.package {
background-position: 0 -971px; background-position: 0 -971px;
} }
#channel .one-update p.file a.thumb img { #channel .one-update p.file a.thumb img {
border: 1px solid #a2a2a2; border: 1px solid #a2a2a2;
max-width: 140px; max-width: 140px;
max-height: 105px; max-height: 105px;
margin: 4px 10px 2px 0; margin: 4px 10px 2px 0;
padding: 1px; padding: 1px;
} }
#channel .one-update p.file a.thumb img:hover { #channel .one-update p.file a.thumb img:hover {
border-color: #464646; border-color: #464646;
} }
#channel .one-update div.comments, #channel .one-update div.comments,
.popup.large div.comments { .popup.large div.comments {
width: 410px; width: 410px;
margin: 2px 0 2px 76px; margin: 2px 0 2px 76px;
} }
html[dir="rtl"] #channel .one-update div.comments { html[dir="rtl"] #channel .one-update div.comments {
margin-left: auto; margin-left: auto;
margin-right: 76px; margin-right: 76px;
} }
#channel .one-update div.comments div.arrow, #channel .one-update div.comments div.arrow,
.popup.large div.comments div.arrow { .popup.large div.comments div.arrow {
background-position: 0 -1702px; background-position: 0 -1702px;
width: 20px; width: 20px;
height: 8px; height: 8px;
margin-left: 20px; margin-left: 20px;
display: block; display: block;
} }
html[dir="rtl"] #channel .one-update div.comments div.arrow, html[dir="rtl"] #channel .one-update div.comments div.arrow,
html[dir="rtl"] .popup.large div.comments div.arrow { html[dir="rtl"] .popup.large div.comments div.arrow {
margin-left: auto; margin-left: auto;
margin-right: 20px; margin-right: 20px;
} }
#channel .one-update div.comments div.comments-content, #channel .one-update div.comments div.comments-content,
.popup.large div.comments div.comments-content { .popup.large div.comments div.comments-content {
background-color: #e5ebec; background-color: #e5ebec;
color: black; color: black;
font-size: 0.9em; font-size: 0.9em;
text-shadow: 0 1px 0 white; text-shadow: 0 1px 0 white;
} }
#channel .one-update div.comments input, #channel .one-update div.comments input,
.popup.large div.comments input { .popup.large div.comments input {
width: 356px; width: 356px;
margin: 6px 0; margin: 6px 0;
padding: 4px 5px; padding: 4px 5px;
} }
#channel .one-update div.comments span.icon, #channel .one-update div.comments span.icon,
.popup.large div.comments span.icon { .popup.large div.comments span.icon {
background-position: 0 -1082px; background-position: 0 -1082px;
height: 16px; height: 16px;
width: 16px; width: 16px;
margin: 10px; margin: 10px;
float: left; float: left;
} }
html[dir="rtl"] #channel .one-update div.comments span.icon, html[dir="rtl"] #channel .one-update div.comments span.icon,
html[dir="rtl"] .popup.large div.comments span.icon { html[dir="rtl"] .popup.large div.comments span.icon {
float: right; float: right;
} }
#channel .one-update div.comments .one-comment.loading span.icon, #channel .one-update div.comments .one-comment.loading span.icon,
.popup.large div.comments .one-comment.loading span.icon { .popup.large div.comments .one-comment.loading span.icon {
margin: 0 10px 0 0; margin: 0 10px 0 0;
} }
html[dir="rtl"] #channel .one-update div.comments .one-comment.loading span.icon, html[dir="rtl"] #channel .one-update div.comments .one-comment.loading span.icon,
html[dir="rtl"] .popup.large div.comments .one-comment.loading span.icon { html[dir="rtl"] .popup.large div.comments .one-comment.loading span.icon {
margin: 0 0 0 10px; margin: 0 0 0 10px;
} }
#channel .one-update div.comments .one-comment, #channel .one-update div.comments .one-comment,
.popup.large div.comments .one-comment { .popup.large div.comments .one-comment {
border-bottom: 1px solid #f4f4f4; border-bottom: 1px solid #f4f4f4;
padding: 4px 8px 0 8px; padding: 4px 8px 0 8px;
position: relative; position: relative;
display: block; display: block;
} }
#channel .one-update div.comments .one-comment.compose, #channel .one-update div.comments .one-comment.compose,
.popup.large div.comments .one-comment.compose { .popup.large div.comments .one-comment.compose {
border-bottom: 2px solid #f4f4f4; border-bottom: 2px solid #f4f4f4;
height: 36px; height: 36px;
padding: 0; padding: 0;
} }
#channel .one-update div.comments .one-comment.new, #channel .one-update div.comments .one-comment.new,
.popup.large div.comments .one-comment.new { .popup.large div.comments .one-comment.new {
display: none; display: none;
} }
#channel .one-update div.comments a.one-comment, #channel .one-update div.comments a.one-comment,
.popup.large div.comments a.one-comment { .popup.large div.comments a.one-comment {
text-decoration: none; text-decoration: none;
} }
#channel .one-update div.comments a.one-comment:hover, #channel .one-update div.comments a.one-comment:hover,
#channel .one-update div.comments a.one-comment:focus, #channel .one-update div.comments a.one-comment:focus,
.popup.large div.comments a.one-comment:hover, .popup.large div.comments a.one-comment:hover,
.popup.large div.comments a.one-comment:focus { .popup.large div.comments a.one-comment:focus {
text-decoration: underline; text-decoration: underline;
} }
#channel .one-update div.comments .one-comment.loading, #channel .one-update div.comments .one-comment.loading,
.popup.large div.comments .one-comment.loading { .popup.large div.comments .one-comment.loading {
padding-bottom: 5px; padding-bottom: 5px;
} }
#channel .one-update div.comments .one-comment div.marker, #channel .one-update div.comments .one-comment div.marker,
.popup.large div.comments .one-comment div.marker { .popup.large div.comments .one-comment div.marker {
background-color: #6d8387; background-color: #6d8387;
width: 2px; width: 2px;
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; left: 0;
bottom: 0; bottom: 0;
} }
#channel .one-update div.comments .one-comment .avatar-container, #channel .one-update div.comments .one-comment .avatar-container,
.popup.large div.comments .one-comment .avatar-container { .popup.large div.comments .one-comment .avatar-container {
text-align: center; text-align: center;
width: 30px; width: 30px;
height: 30px; height: 30px;
margin: 2px 8px 0 0; margin: 2px 8px 0 0;
float: left; float: left;
} }
html[dir="rtl"] #channel .one-update div.comments .one-comment .avatar-container, html[dir="rtl"] #channel .one-update div.comments .one-comment .avatar-container,
html[dir="rtl"] .popup.large div.comments .one-comment .avatar-container { html[dir="rtl"] .popup.large div.comments .one-comment .avatar-container {
margin-right: auto; margin-right: auto;
margin-left: 8px; margin-left: 8px;
float: right; float: right;
} }
#channel .one-update div.comments .one-comment .avatar-container:hover, #channel .one-update div.comments .one-comment .avatar-container:hover,
.popup.large div.comments .one-comment .avatar-container:hover { .popup.large div.comments .one-comment .avatar-container:hover {
cursor: pointer; cursor: pointer;
} }
#channel .one-update div.comments .one-comment img.avatar, #channel .one-update div.comments .one-comment img.avatar,
.popup.large div.comments .one-comment img.avatar { .popup.large div.comments .one-comment img.avatar {
max-height: 30px; max-height: 30px;
max-width: 30px; max-width: 30px;
} }
#channel .one-update div.comments .one-comment .comment-container, #channel .one-update div.comments .one-comment .comment-container,
.popup.large div.comments .one-comment .comment-container { .popup.large div.comments .one-comment .comment-container {
float: left; float: left;
} }
#channel .one-update div.comments .one-comment a.name, #channel .one-update div.comments .one-comment a.name,
.popup.large div.comments .one-comment a.name { .popup.large div.comments .one-comment a.name {
font-weight: bold; font-weight: bold;
text-decoration: none; text-decoration: none;
font-size: 0.95em; font-size: 0.95em;
padding-bottom: 2px; padding-bottom: 2px;
float: left; float: left;
} }
html[dir="rtl"] #channel .one-update div.comments .one-comment a.name, html[dir="rtl"] #channel .one-update div.comments .one-comment a.name,
html[dir="rtl"] .popup.large div.comments .one-comment a.name { html[dir="rtl"] .popup.large div.comments .one-comment a.name {
float: right; float: right;
} }
#channel .one-update div.comments .one-comment a.name:hover, #channel .one-update div.comments .one-comment a.name:hover,
#channel .one-update div.comments .one-comment a.name:focus, #channel .one-update div.comments .one-comment a.name:focus,
.popup.large div.comments .one-comment a.name:hover, .popup.large div.comments .one-comment a.name:hover,
.popup.large div.comments .one-comment a.name:focus { .popup.large div.comments .one-comment a.name:focus {
text-decoration: underline; text-decoration: underline;
} }
#channel .one-update div.comments .one-comment span.date, #channel .one-update div.comments .one-comment span.date,
#channel .one-update div.comments .one-comment a.remove, #channel .one-update div.comments .one-comment a.remove,
.popup.large div.comments .one-comment span.date, .popup.large div.comments .one-comment span.date,
.popup.large div.comments .one-comment a.remove { .popup.large div.comments .one-comment a.remove {
font-size: 0.85em; font-size: 0.85em;
float: right; float: right;
} }
html[dir="rtl"] #channel .one-update div.comments .one-comment span.date, html[dir="rtl"] #channel .one-update div.comments .one-comment span.date,
html[dir="rtl"] #channel .one-update div.comments .one-comment a.remove, html[dir="rtl"] #channel .one-update div.comments .one-comment a.remove,
html[dir="rtl"] .popup.large div.comments .one-comment span.date, html[dir="rtl"] .popup.large div.comments .one-comment span.date,
html[dir="rtl"] .popup.large div.comments .one-comment a.remove { html[dir="rtl"] .popup.large div.comments .one-comment a.remove {
margin-left: 2px; margin-left: 2px;
float: left; float: left;
} }
#channel .one-update div.comments .one-comment.me:hover span.date, #channel .one-update div.comments .one-comment.me:hover span.date,
.popup.large div.comments .one-comment.me:hover span.date { .popup.large div.comments .one-comment.me:hover span.date {
display: none; display: none;
} }
#channel .one-update div.comments .one-comment.me a.remove, #channel .one-update div.comments .one-comment.me a.remove,
.popup.large div.comments .one-comment.me a.remove { .popup.large div.comments .one-comment.me a.remove {
display: none; display: none;
} }
#channel .one-update div.comments .one-comment.me:hover a.remove, #channel .one-update div.comments .one-comment.me:hover a.remove,
.popup.large div.comments .one-comment.me:hover a.remove { .popup.large div.comments .one-comment.me:hover a.remove {
display: block; display: block;
} }
#channel .one-update div.comments .one-comment p.body, #channel .one-update div.comments .one-comment p.body,
.popup.large div.comments .one-comment p.body { .popup.large div.comments .one-comment p.body {
clear: both; clear: both;
} }
#channel a.more { #channel a.more {
background-position: 0 -334px; background-position: 0 -334px;
color: black; color: black;
height: 16px; height: 16px;
text-decoration: none; text-decoration: none;
margin: -2px 0 14px 4px; margin: -2px 0 14px 4px;
padding-left: 20px; padding-left: 20px;
display: block; display: block;
visibility: hidden; visibility: hidden;
} }
#channel a.more:hover, #channel a.more:hover,
#channel a.more:focus { #channel a.more:focus {
text-decoration: underline; text-decoration: underline;
} }
#channel a.mbtool { #channel a.mbtool {
width: 11px; width: 11px;
height: 11px; height: 11px;
display: none; display: none;
position: absolute; position: absolute;
right: 0; right: 0;
} }
html[dir="rtl"] #channel a.mbtool { html[dir="rtl"] #channel a.mbtool {
right: auto; right: auto;
left: 0; left: 0;
} }
#channel .one-update:hover a.mbtool { #channel .one-update:hover a.mbtool {
display: block; display: block;
} }
#channel a.mbtool:hover, #channel a.mbtool:hover,
#channel a.mbtool:focus { #channel a.mbtool:focus {
text-decoration: none; text-decoration: none;
} }
#channel a.mbtool.profile { #channel a.mbtool.profile {
background-position: -1px -1333px; background-position: -1px -1333px;
top: 24px; top: 24px;
} }
#channel a.mbtool.repost { #channel a.mbtool.repost {
background-position: -1px -1354px; background-position: -1px -1354px;
} }
#channel a.mbtool.remove { #channel a.mbtool.remove {
background-position: -1px -1312px; background-position: -1px -1312px;
} }
#channel a.mbtool.repost, #channel a.mbtool.repost,
#channel a.mbtool.remove { #channel a.mbtool.remove {
top: 6px; top: 6px;
} }
#channel .footer { #channel .footer {
bottom: 0; bottom: 0;
-moz-border-radius-bottomleft: 4px; -moz-border-radius-bottomleft: 4px;
-moz-border-radius-bottomright: 4px; -moz-border-radius-bottomright: 4px;
-webkit-border-bottom-left-radius: 4px; -webkit-border-bottom-left-radius: 4px;
-webkit-border-bottom-right-radius: 4px; -webkit-border-bottom-right-radius: 4px;
border-bottom-left-radius: 4px; border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px; border-bottom-right-radius: 4px;
} }
#channel .footer div { #channel .footer div {
margin-left: 5px; margin-left: 5px;
padding-left: 24px; padding-left: 24px;
min-height: 16px; min-height: 16px;
font-size: 0.85em; font-size: 0.85em;
width: auto !important; width: auto !important;
} }
html[dir="rtl"] #channel .footer div { html[dir="rtl"] #channel .footer div {
float: right; float: right;
} }
#channel .footer .sync { #channel .footer .sync {
background-position: 0 -804px; background-position: 0 -804px;
display: none; display: none;
} }
#channel .footer .unsync { #channel .footer .unsync {
background-position: 0 -830px; background-position: 0 -830px;
display: none; display: none;
} }

View file

@ -11,5 +11,5 @@ Author: Valérian Saliou
*/ */
#directory .content { #directory .content {
padding: 10px 0 10px 0; padding: 10px 0 10px 0;
} }

View file

@ -11,68 +11,68 @@ Author: Valérian Saliou
*/ */
#discovery .content { #discovery .content {
padding: 10px 0 10px 0; padding: 10px 0 10px 0;
} }
#discovery .content p { #discovery .content p {
margin: 5px 10px 5px 10px; margin: 5px 10px 5px 10px;
text-align: justify; text-align: justify;
font-size: 0.85em; font-size: 0.85em;
} }
#discovery .discovery-head, #discovery .discovery-head,
#directory .directory-head, #directory .directory-head,
#rosterx .rosterx-head, #rosterx .rosterx-head,
#privacy .privacy-head { #privacy .privacy-head {
width: 606px; width: 606px;
height: 24px; height: 24px;
margin: 0 10px 10px 10px; margin: 0 10px 10px 10px;
padding: 6px; padding: 6px;
background: #f1f6fd; background: #f1f6fd;
border: 1px #9dc4fc solid; border: 1px #9dc4fc solid;
} }
#discovery .disco-server-text, #discovery .disco-server-text,
#directory .directory-server-text { #directory .directory-server-text {
float: left; float: left;
font-size: 0.9em; font-size: 0.9em;
margin: 3px; margin: 3px;
} }
html[dir="rtl"] #discovery .disco-server-text, html[dir="rtl"] #discovery .disco-server-text,
html[dir="rtl"] #directory .directory-server-text { html[dir="rtl"] #directory .directory-server-text {
float: right; float: right;
} }
#discovery .disco-server-input, #discovery .disco-server-input,
#directory .directory-server-input { #directory .directory-server-input {
width: 200px; width: 200px;
height: 18px; height: 18px;
float: right; float: right;
margin-right: 10px; margin-right: 10px;
padding: 2px; padding: 2px;
} }
html[dir="rtl"] #discovery .disco-server-input, html[dir="rtl"] #discovery .disco-server-input,
html[dir="rtl"] #directory .directory-server-input { html[dir="rtl"] #directory .directory-server-input {
margin-right: 0; margin-right: 0;
margin-left: 10px; margin-left: 10px;
float: left; float: left;
} }
#discovery .disco-category { #discovery .disco-category {
display: none; display: none;
margin-bottom: 22px; margin-bottom: 22px;
} }
#discovery .disco-category-title { #discovery .disco-category-title {
font-weight: bold; font-weight: bold;
} }
#discovery .one-actions .one-button { #discovery .one-actions .one-button {
float: right; float: right;
} }
html[dir="rtl"] #discovery .one-actions .one-button { html[dir="rtl"] #discovery .one-actions .one-button {
float: left; float: left;
} }

View file

@ -11,141 +11,141 @@ Author: Valérian Saliou
*/ */
#favorites .content { #favorites .content {
padding: 10px 0 10px 0; padding: 10px 0 10px 0;
} }
#favorites .fedit-head-select { #favorites .fedit-head-select {
min-width: 190px; min-width: 190px;
max-width: 210px; max-width: 210px;
} }
#favorites .switch-fav { #favorites .switch-fav {
margin: 0 10px 0 10px; margin: 0 10px 0 10px;
width: 200px; width: 200px;
height: 355px; height: 355px;
border-right: 1px #c0c0c0 dotted; border-right: 1px #c0c0c0 dotted;
float: left; float: left;
} }
#favorites .room-switcher { #favorites .room-switcher {
width: 188px; width: 188px;
height: 18px; height: 18px;
border-bottom: 1px #9dc4fc solid; border-bottom: 1px #9dc4fc solid;
float: left; float: left;
padding: 10px 6px; padding: 10px 6px;
font-size: 0.9em; font-size: 0.9em;
} }
#favorites .room-switcher:hover { #favorites .room-switcher:hover {
background-color: #e9f1fd; background-color: #e9f1fd;
cursor: pointer; cursor: pointer;
} }
#favorites .room-switcher:active { #favorites .room-switcher:active {
background-color: #f1f6fd; background-color: #f1f6fd;
} }
#favorites .switch-fav .icon { #favorites .switch-fav .icon {
float: left; float: left;
height: 16px; height: 16px;
width: 16px; width: 16px;
margin: 0 8px 0 0; margin: 0 8px 0 0;
} }
#favorites .switch-fav .room-list .list-icon { #favorites .switch-fav .room-list .list-icon {
background-position: 0 -855px; background-position: 0 -855px;
} }
#favorites .switch-fav .room-search .search-icon { #favorites .switch-fav .room-search .search-icon {
background-position: 0 -876px; background-position: 0 -876px;
} }
#favorites .static-fav { #favorites .static-fav {
width: 385px; width: 385px;
height: 335px; height: 335px;
margin: 0 10px 0 0; margin: 0 10px 0 0;
padding: 10px; padding: 10px;
float: right; float: right;
} }
#favorites .favorites-search { #favorites .favorites-search {
display: none; display: none;
} }
#favorites .static-fav-head { #favorites .static-fav-head {
width: 393px; width: 393px;
margin: -10px; margin: -10px;
} }
#favorites .static-fav-results { #favorites .static-fav-results {
width: 406px; width: 406px;
height: 314px; height: 314px;
margin: 10px -10px -10px -10px; margin: 10px -10px -10px -10px;
padding: 6px 0 0 0; padding: 6px 0 0 0;
} }
#favorites .fedit-line { #favorites .fedit-line {
height: 30px; height: 30px;
font-size: 0.9em; font-size: 0.9em;
padding: 10px 0 4px 4px; padding: 10px 0 4px 4px;
border-bottom: 1px #9dc4fc solid; border-bottom: 1px #9dc4fc solid;
} }
#favorites .fedit-line:hover { #favorites .fedit-line:hover {
background: #e9f1fd; background: #e9f1fd;
} }
#favorites label { #favorites label {
width: 140px; width: 140px;
margin-top: 3px; margin-top: 3px;
} }
#favorites input { #favorites input {
height: 18px; height: 18px;
width: 186px; width: 186px;
margin-top: 0; margin-top: 0;
padding: 2px; padding: 2px;
} }
#favorites .fedit-select { #favorites .fedit-select {
min-width: 160px; min-width: 160px;
} }
#favorites .fedit-actions { #favorites .fedit-actions {
margin: 10px 0 0; margin: 10px 0 0;
font-size: 0.9em; font-size: 0.9em;
float: right; float: right;
} }
#favorites input[type="checkbox"] { #favorites input[type="checkbox"] {
margin-top: 5px; margin-top: 5px;
width: auto; width: auto;
} }
#favorites .fedit-terminate { #favorites .fedit-terminate {
float: right; float: right;
} }
#favorites .fedit-add { #favorites .fedit-add {
display: block; display: block;
} }
#favorites .fedit-edit { #favorites .fedit-edit {
background-position: 2px -1240px; background-position: 2px -1240px;
} }
#favorites .fedit-remove { #favorites .fedit-remove {
margin: 0 8px 0 0; margin: 0 8px 0 0;
} }
#favorites .add, #favorites .add,
.popup .results .one-button.one-add { .popup .results .one-button.one-add {
background-position: 3px -1177px; background-position: 3px -1177px;
} }
#favorites .remove, #favorites .remove,
#inbox .remove { #inbox .remove {
background-position: 3px -1196px; background-position: 3px -1196px;
} }
#favorites .join, #favorites .join,
@ -153,32 +153,32 @@ Author: Valérian Saliou
#inbox .send, #inbox .send,
.popup .results .one-button.one-chat, .popup .results .one-button.one-chat,
.popup .results a.one-profile { .popup .results a.one-profile {
background-position: 3px -124px; background-position: 3px -124px;
} }
#favorites .one-button, #favorites .one-button,
#inbox .one-button, #inbox .one-button,
.popup .results .one-button { .popup .results .one-button {
padding-left: 20px !important; padding-left: 20px !important;
font-size: 0.98em; font-size: 0.98em;
} }
#favorites .fsearch-results { #favorites .fsearch-results {
overflow: auto; overflow: auto;
} }
#favorites .room-name { #favorites .room-name {
margin: 4px 2px 5px; margin: 4px 2px 5px;
max-width: 210px; max-width: 210px;
float: left; float: left;
} }
html[dir="rtl"] #favorites .room-name { html[dir="rtl"] #favorites .room-name {
float: right; float: right;
} }
#favorites .fsearch-noresults { #favorites .fsearch-noresults {
display: none; display: none;
font-size: 0.9em; font-size: 0.9em;
font-weight: bold; font-weight: bold;
} }

View file

@ -11,41 +11,41 @@ Author: Valérian Saliou
*/ */
@font-face { @font-face {
font-family: 'PT Sans'; font-family: 'PT Sans';
src: url('../fonts/eot/ptsans.eot'); src: url('../fonts/eot/ptsans.eot');
src: url('../fonts/eot/ptsans.eot?#iefix') format('embedded-opentype'), src: url('../fonts/eot/ptsans.eot?#iefix') format('embedded-opentype'),
url('../fonts/woff/ptsans.woff') format('woff'), url('../fonts/woff/ptsans.woff') format('woff'),
url('../fonts/ttf/ptsans.ttf') format('truetype'), url('../fonts/ttf/ptsans.ttf') format('truetype'),
url('../fonts/svg/ptsans.svg#pt_sansregular') format('svg'); url('../fonts/svg/ptsans.svg#pt_sansregular') format('svg');
} }
@font-face { @font-face {
font-family: 'PT Sans'; font-family: 'PT Sans';
font-style: italic; font-style: italic;
src: url('../fonts/eot/ptsansitalic.eot'); src: url('../fonts/eot/ptsansitalic.eot');
src: url('../fonts/eot/ptsansitalic.eot?#iefix') format('embedded-opentype'), src: url('../fonts/eot/ptsansitalic.eot?#iefix') format('embedded-opentype'),
url('../fonts/woff/ptsansitalic.woff') format('woff'), url('../fonts/woff/ptsansitalic.woff') format('woff'),
url('../fonts/ttf/ptsansitalic.ttf') format('truetype'), url('../fonts/ttf/ptsansitalic.ttf') format('truetype'),
url('../fonts/svg/ptsansitalic.svg#pt_sansitalic') format('svg'); url('../fonts/svg/ptsansitalic.svg#pt_sansitalic') format('svg');
} }
@font-face { @font-face {
font-family: 'PT Sans'; font-family: 'PT Sans';
font-weight: bold; font-weight: bold;
src: url('../fonts/eot/ptsansbold.eot'); src: url('../fonts/eot/ptsansbold.eot');
src: url('../fonts/eot/ptsansbold.eot?#iefix') format('embedded-opentype'), src: url('../fonts/eot/ptsansbold.eot?#iefix') format('embedded-opentype'),
url('../fonts/woff/ptsansbold.woff') format('woff'), url('../fonts/woff/ptsansbold.woff') format('woff'),
url('../fonts/ttf/ptsansbold.ttf') format('truetype'), url('../fonts/ttf/ptsansbold.ttf') format('truetype'),
url('../fonts/svg/ptsansbold.svg#pt_sansbold') format('svg'); url('../fonts/svg/ptsansbold.svg#pt_sansbold') format('svg');
} }
@font-face { @font-face {
font-family: 'PT Sans'; font-family: 'PT Sans';
font-weight: bold; font-weight: bold;
font-style: italic; font-style: italic;
src: url('../fonts/eot/ptsansbolditalic.eot'); src: url('../fonts/eot/ptsansbolditalic.eot');
src: url('../fonts/eot/ptsansbolditalic.eot?#iefix') format('embedded-opentype'), src: url('../fonts/eot/ptsansbolditalic.eot?#iefix') format('embedded-opentype'),
url('../fonts/woff/ptsansbolditalic.woff') format('woff'), url('../fonts/woff/ptsansbolditalic.woff') format('woff'),
url('../fonts/ttf/ptsansbolditalic.ttf') format('truetype'), url('../fonts/ttf/ptsansbolditalic.ttf') format('truetype'),
url('../fonts/svg/ptsansbolditalic.svg#pt_sansbold_italic') format('svg'); url('../fonts/svg/ptsansbolditalic.svg#pt_sansbold_italic') format('svg');
} }

File diff suppressed because it is too large Load diff

View file

@ -13,41 +13,41 @@ Author: Valérian Saliou
/* Fix custom fonts */ /* Fix custom fonts */
@font-face { @font-face {
font-family: 'PT Sans'; font-family: 'PT Sans';
src: url(../fonts/eot/ptsans.eot); src: url(../fonts/eot/ptsans.eot);
} }
@font-face { @font-face {
font-family: 'PT Sans'; font-family: 'PT Sans';
font-style: italic; font-style: italic;
src: url(../fonts/eot/ptsansitalic.eot); src: url(../fonts/eot/ptsansitalic.eot);
} }
@font-face { @font-face {
font-family: 'PT Sans'; font-family: 'PT Sans';
font-weight: bold; font-weight: bold;
src: url(../fonts/eot/ptsansbold.eot); src: url(../fonts/eot/ptsansbold.eot);
} }
@font-face { @font-face {
font-family: 'PT Sans'; font-family: 'PT Sans';
font-weight: bold; font-weight: bold;
font-style: italic; font-style: italic;
src: url(../fonts/eot/ptsansbolditalic.eot); src: url(../fonts/eot/ptsansbolditalic.eot);
} }
/* rgba(255,255,255,0.9) */ /* rgba(255,255,255,0.9) */
.search ul { .search ul {
background: transparent; background: transparent;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#edffffff,endColorstr=#edffffff); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#edffffff,endColorstr=#edffffff);
} }
/* rgba(255,255,255,0.3) */ /* rgba(255,255,255,0.3) */
a.finish:active, a.finish:active,
#manager-buttons input:active, #manager-buttons input:active,
#install-buttons input:active { #install-buttons input:active {
background: transparent; background: transparent;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#49ffffff,endColorstr=#49ffffff); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#49ffffff,endColorstr=#49ffffff);
} }
/* rgba(255,255,255,0.2) */ /* rgba(255,255,255,0.2) */
@ -58,15 +58,15 @@ a.finish:focus,
#install-buttons input:hover, #install-buttons input:hover,
#install-buttons input:focus, #install-buttons input:focus,
.notifications-content .one-notification:active { .notifications-content .one-notification:active {
background: transparent; background: transparent;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#33ffffff,endColorstr=#33ffffff); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#33ffffff,endColorstr=#33ffffff);
} }
/* rgba(255,255,255,0.14) */ /* rgba(255,255,255,0.14) */
#home .corporation .corp_network a:active, #home .corporation .corp_network a:active,
#home .locale .list a:active { #home .locale .list a:active {
background: transparent; background: transparent;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#2fffffff,endColorstr=#2fffffff); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#2fffffff,endColorstr=#2fffffff);
} }
/* rgba(255,255,255,0.1) */ /* rgba(255,255,255,0.1) */
@ -82,44 +82,44 @@ a.finish.disabled:active,
#install-buttons input, #install-buttons input,
.notifications-content .one-notification:hover, .notifications-content .one-notification:hover,
.notifications-content .one-notification:focus { .notifications-content .one-notification:focus {
background: transparent; background: transparent;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#20ffffff,endColorstr=#20ffffff); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#20ffffff,endColorstr=#20ffffff);
} }
/* rgba(255,239,104,0.8) */ /* rgba(255,239,104,0.8) */
.popup .infos { .popup .infos {
background: transparent; background: transparent;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#deffef68,endColorstr=#deffef68); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#deffef68,endColorstr=#deffef68);
} }
/* rgba(225,160,20,0.3) */ /* rgba(225,160,20,0.3) */
.search ul li.hovered { .search ul li.hovered {
background: transparent; background: transparent;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#46e1a014,endColorstr=#46e1a014); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#46e1a014,endColorstr=#46e1a014);
} }
/* rgba(248,246,186,0.9) */ /* rgba(248,246,186,0.9) */
#board .one-board.info { #board .one-board.info {
background: transparent; background: transparent;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#edf8f6ba,endColorstr=#edf8f6ba); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#edf8f6ba,endColorstr=#edf8f6ba);
} }
/* rgba(241,160,160,0.9) */ /* rgba(241,160,160,0.9) */
#board .one-board.error { #board .one-board.error {
background: transparent; background: transparent;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#edf1a0a0,endColorstr=#edf1a0a0); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#edf1a0a0,endColorstr=#edf1a0a0);
} }
/* rgba(234,234,234,0.8) */ /* rgba(234,234,234,0.8) */
#page-engine .chatstate { #page-engine .chatstate {
background: transparent; background: transparent;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#deeaeaea,endColorstr=#deeaeaea); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#deeaeaea,endColorstr=#deeaeaea);
} }
/* rgba(20,20,20,0.6) */ /* rgba(20,20,20,0.6) */
#home .notice.simple { #home .notice.simple {
background: transparent; background: transparent;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#a0141414,endColorstr=#a0141414); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#a0141414,endColorstr=#a0141414);
} }
/* rgba(20,20,20,0.8) */ /* rgba(20,20,20,0.8) */
@ -129,29 +129,29 @@ a.finish.disabled:active,
#roster, #roster,
#manager, #manager,
#install { #install {
background: transparent; background: transparent;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#de141414,endColorstr=#de141414); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#de141414,endColorstr=#de141414);
} }
#home .main { #home .main {
background: #141414; background: #141414;
} }
/* rgba(20,20,20,0.9) */ /* rgba(20,20,20,0.9) */
.popup { .popup {
background: transparent; background: transparent;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ed141414,endColorstr=#ed141414); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ed141414,endColorstr=#ed141414);
} }
/* rgba(0,0,0,0.2) */ /* rgba(0,0,0,0.2) */
#install-top .step { #install-top .step {
background: transparent; background: transparent;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#33000000,endColorstr=#33000000); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#33000000,endColorstr=#33000000);
} }
/* rgba(0,0,0,0.6) */ /* rgba(0,0,0,0.6) */
.lock { .lock {
background: url(../images/others/lock.png) repeat !important; background: url(../images/others/lock.png) repeat !important;
} }
/* rgba(0,0,0,0.8) */ /* rgba(0,0,0,0.8) */
@ -160,20 +160,20 @@ a.finish.disabled:active,
.buddy-infos-subitem, .buddy-infos-subitem,
.buddy-conf-subitem, .buddy-conf-subitem,
.tools-content-subitem { .tools-content-subitem {
background: transparent; background: transparent;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#de000000,endColorstr=#de000000); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#de000000,endColorstr=#de000000);
} }
/* Fix a fieldset padding bug */ /* Fix a fieldset padding bug */
legend { legend {
margin-bottom: 5px !important; margin-bottom: 5px !important;
} }
/* Fix opacity bugs */ /* Fix opacity bugs */
#options .forms.in_background fieldset { #options .forms.in_background fieldset {
filter: alpha(opacity = 50) !important; filter: alpha(opacity = 50) !important;
} }
a.finish.disabled { a.finish.disabled {
filter: alpha(opacity = 20) !important; filter: alpha(opacity = 20) !important;
} }

View file

@ -11,90 +11,90 @@ Author: Valérian Saliou
*/ */
.body-images { .body-images {
background-image: url(../images/sprites/background.png); background-image: url(../images/sprites/background.png);
background-repeat: repeat; background-repeat: repeat;
background-color: #93c5fa; background-color: #93c5fa;
} }
.install-images { .install-images {
background-image: url(../images/sprites/install.png); background-image: url(../images/sprites/install.png);
background-repeat: no-repeat; background-repeat: no-repeat;
} }
.home-images { .home-images {
background-image: url(../images/sprites/home.png); background-image: url(../images/sprites/home.png);
background-repeat: no-repeat; background-repeat: no-repeat;
} }
.browsers-images { .browsers-images {
background-image: url(../images/sprites/browsers.png); background-image: url(../images/sprites/browsers.png);
background-repeat: no-repeat; background-repeat: no-repeat;
} }
.buttons-images { .buttons-images {
background-image: url(../images/sprites/buttons.png); background-image: url(../images/sprites/buttons.png);
background-repeat: repeat-x; background-repeat: repeat-x;
} }
.talk-images { .talk-images {
background-image: url(../images/sprites/talk.png); background-image: url(../images/sprites/talk.png);
background-repeat: no-repeat; background-repeat: no-repeat;
} }
.smileys-images { .smileys-images {
background-image: url(../images/sprites/smileys.png); background-image: url(../images/sprites/smileys.png);
background-repeat: no-repeat; background-repeat: no-repeat;
} }
.welcome-images { .welcome-images {
background-image: url(../images/sprites/welcome.png); background-image: url(../images/sprites/welcome.png);
background-repeat: no-repeat; background-repeat: no-repeat;
} }
.me-images { .me-images {
background-image: url(../images/sprites/me.png); background-image: url(../images/sprites/me.png);
background-repeat: no-repeat; background-repeat: no-repeat;
} }
.jingle-images { .jingle-images {
background-image: url(../images/sprites/jingle.png); background-image: url(../images/sprites/jingle.png);
background-repeat: no-repeat; background-repeat: no-repeat;
} }
.manager-images { .manager-images {
background-image: url(../images/sprites/manager.png); background-image: url(../images/sprites/manager.png);
background-repeat: no-repeat; background-repeat: no-repeat;
} }
.mobile-images { .mobile-images {
background-image: url(../images/sprites/mobile.png); background-image: url(../images/sprites/mobile.png);
background-repeat: no-repeat; background-repeat: no-repeat;
} }
.wait-small { .wait-small {
background-image: url(../images/wait/wait-small.gif); background-image: url(../images/wait/wait-small.gif);
background-repeat: no-repeat; background-repeat: no-repeat;
height: 16px; height: 16px;
width: 16px; width: 16px;
} }
.wait-medium { .wait-medium {
background-image: url(../images/wait/wait-medium.png); background-image: url(../images/wait/wait-medium.png);
background-repeat: no-repeat; background-repeat: no-repeat;
height: 24px; height: 24px;
width: 24px; width: 24px;
} }
.wait-big { .wait-big {
background-image: url(../images/wait/wait-big.gif); background-image: url(../images/wait/wait-big.gif);
background-repeat: no-repeat; background-repeat: no-repeat;
height: 30px; height: 30px;
width: 30px; width: 30px;
} }
.wait-typing { .wait-typing {
background-image: url(../images/wait/wait-typing.gif); background-image: url(../images/wait/wait-typing.gif);
background-repeat: no-repeat; background-repeat: no-repeat;
height: 4px; height: 4px;
width: 16px; width: 16px;
} }

View file

@ -11,234 +11,234 @@ Author: Valérian Saliou
*/ */
#inbox .content { #inbox .content {
padding: 10px 0 10px 0; padding: 10px 0 10px 0;
} }
#inbox .content p { #inbox .content p {
margin: 3px 10px; margin: 3px 10px;
text-align: justify; text-align: justify;
font-size: 0.9em; font-size: 0.9em;
} }
#inbox .inbox-results { #inbox .inbox-results {
height: 310px; height: 310px;
width: 620px; width: 620px;
margin: -5px 0 0 10px; margin: -5px 0 0 10px;
padding: 6px 0 0 0; padding: 6px 0 0 0;
overflow: auto; overflow: auto;
} }
html[dir="rtl"] #inbox .inbox-results { html[dir="rtl"] #inbox .inbox-results {
margin-left: auto; margin-left: auto;
margin-right: 10px; margin-right: 10px;
} }
#inbox .message-unread { #inbox .message-unread {
background-color: #E9F1FD; background-color: #E9F1FD;
} }
#inbox .one-message { #inbox .one-message {
font-size: 0.9em; font-size: 0.9em;
border-bottom: 1px #b2c7cb solid; border-bottom: 1px #b2c7cb solid;
} }
#inbox .message-head { #inbox .message-head {
padding: 6px 0 7px 4px; padding: 6px 0 7px 4px;
overflow: hidden; overflow: hidden;
} }
#inbox .message-head:hover { #inbox .message-head:hover {
background-color: #e9f1fd; background-color: #e9f1fd;
cursor: pointer; cursor: pointer;
} }
#inbox .message-head:active { #inbox .message-head:active {
background-color: #f1f6fd; background-color: #f1f6fd;
} }
#inbox .one-message.message-reading, #inbox .one-message.message-reading,
#inbox .one-message.message-reading .message-head { #inbox .one-message.message-reading .message-head {
background-color: #f1f6fd; background-color: #f1f6fd;
} }
html[dir="rtl"] #inbox .one-message a.one-button { html[dir="rtl"] #inbox .one-message a.one-button {
float: right; float: right;
} }
#inbox .avatar-container { #inbox .avatar-container {
float: left; float: left;
width: 40px; width: 40px;
height: 40px; height: 40px;
margin-right: 7px; margin-right: 7px;
text-align: center; text-align: center;
background-repeat: no-repeat; background-repeat: no-repeat;
} }
html[dir="rtl"] #inbox .avatar-container { html[dir="rtl"] #inbox .avatar-container {
margin-left: 7px; margin-left: 7px;
margin-right: auto; margin-right: auto;
float: right; float: right;
} }
#inbox .avatar { #inbox .avatar {
max-width: 40px; max-width: 40px;
max-height: 40px; max-height: 40px;
} }
#inbox .message-jid, #inbox .message-jid,
#inbox .message-subject { #inbox .message-subject {
float: left; float: left;
margin: 0 2px; margin: 0 2px;
overflow: hidden; overflow: hidden;
} }
html[dir="rtl"] #inbox .message-jid, html[dir="rtl"] #inbox .message-jid,
html[dir="rtl"] #inbox .message-subject { html[dir="rtl"] #inbox .message-subject {
float: right; float: right;
} }
#inbox .message-jid { #inbox .message-jid {
width: 165px; width: 165px;
font-weight: bold; font-weight: bold;
} }
#inbox .message-subject { #inbox .message-subject {
width: 355px; width: 355px;
} }
#inbox .message-truncated { #inbox .message-truncated {
color: #42646b; color: #42646b;
font-size: 0.8em; font-size: 0.8em;
margin: 23px 0 0 49px; margin: 23px 0 0 49px;
} }
#inbox .message-body { #inbox .message-body {
padding: 8px 5px 5px 5px; padding: 8px 5px 5px 5px;
} }
#inbox .message-body a { #inbox .message-body a {
text-decoration: underline; text-decoration: underline;
} }
#inbox .message-meta { #inbox .message-meta {
margin-top: 6px; margin-top: 6px;
padding: 3px 4px; padding: 3px 4px;
border-top: 1px #b2c7cb dotted; border-top: 1px #b2c7cb dotted;
} }
#inbox .message-meta span.date { #inbox .message-meta span.date {
color: #28474e; color: #28474e;
font-size: 0.8em; font-size: 0.8em;
margin: 10px 0 0 4px; margin: 10px 0 0 4px;
float: left; float: left;
} }
#inbox .message-meta a { #inbox .message-meta a {
font-size: 0.98em; font-size: 0.98em;
margin: 5px; margin: 5px;
float: right; float: right;
display: block; display: block;
} }
#inbox .inbox-noresults { #inbox .inbox-noresults {
font-weight: bold; font-weight: bold;
display: none; display: none;
} }
#inbox .a-show-messages { #inbox .a-show-messages {
display: none; display: none;
} }
#inbox .inbox-new { #inbox .inbox-new {
display: none; display: none;
height: 300px; height: 300px;
width: 620px; width: 620px;
margin: -5px 0 0 10px; margin: -5px 0 0 10px;
padding: 16px 0 0 0; padding: 16px 0 0 0;
} }
#inbox .inbox-new-block { #inbox .inbox-new-block {
border-top: 1px #686868 dotted; border-top: 1px #686868 dotted;
padding-top: 9px; padding-top: 9px;
min-height: 32px; min-height: 32px;
clear: both; clear: both;
} }
#inbox .inbox-new-text { #inbox .inbox-new-text {
float: left; float: left;
width: 100px; width: 100px;
} }
#inbox .inbox-new-textarea { #inbox .inbox-new-textarea {
width: 460px; width: 460px;
height: 109px; height: 109px;
margin-bottom: 10px; margin-bottom: 10px;
float: left; float: left;
} }
#inbox .inbox-new input { #inbox .inbox-new input {
float: left; float: left;
} }
html[dir="rtl"] #inbox .inbox-new-text, html[dir="rtl"] #inbox .inbox-new-text,
html[dir="rtl"] #inbox .inbox-new-textarea, html[dir="rtl"] #inbox .inbox-new-textarea,
html[dir="rtl"] #inbox .inbox-new input { html[dir="rtl"] #inbox .inbox-new input {
float: right; float: right;
} }
html[dir="rtl"] #inbox .inbox-new-text { html[dir="rtl"] #inbox .inbox-new-text {
margin-right: 20px; margin-right: 20px;
} }
html[dir="rtl"] #inbox .inbox-new input { html[dir="rtl"] #inbox .inbox-new input {
margin-right: auto; margin-right: auto;
} }
#inbox .inbox-new-to ul { #inbox .inbox-new-to ul {
width: 264px; width: 264px;
max-height: 168px; max-height: 168px;
font-size: 0.9em; font-size: 0.9em;
left: 120px; left: 120px;
top: 31px; top: 31px;
} }
html[dir="rtl"] #inbox .inbox-new-to ul { html[dir="rtl"] #inbox .inbox-new-to ul {
left: auto; left: auto;
right: 130px; right: 130px;
} }
#inbox .inbox-new-to-input { #inbox .inbox-new-to-input {
width: 260px; width: 260px;
} }
#inbox .inbox-new-subject-input { #inbox .inbox-new-subject-input {
width: 380px; width: 380px;
} }
#inbox .inbox-new-file a { #inbox .inbox-new-file a {
display: block; display: block;
float: left; float: left;
} }
#inbox .inbox-new-file a.file { #inbox .inbox-new-file a.file {
font-size: 0.85em; font-size: 0.85em;
height: 16px; height: 16px;
max-width: 320px; max-width: 320px;
margin: 3px 0 15px 013px; margin: 3px 0 15px 013px;
overflow: hidden; overflow: hidden;
} }
#inbox .inbox-new-file a.one-button { #inbox .inbox-new-file a.one-button {
font-size: 0.85em; font-size: 0.85em;
margin: -2px 0 0 25px; margin: -2px 0 0 25px;
} }
#inbox .inbox-new-send a { #inbox .inbox-new-send a {
font-size: 0.85em; font-size: 0.85em;
float: right; float: right;
display: block; display: block;
} }
html[dir="rtl"] #inbox .inbox-new-send a { html[dir="rtl"] #inbox .inbox-new-send a {
margin-right: 18px; margin-right: 18px;
} }

View file

@ -11,294 +11,294 @@ Author: Valérian Saliou
*/ */
body { body {
color: white; color: white;
} }
#install { #install {
background-color: rgb(20,20,20); background-color: rgb(20,20,20);
background-color: rgba(20,20,20,0.85); background-color: rgba(20,20,20,0.85);
width: 800px; width: 800px;
margin: 35px auto; margin: 35px auto;
padding-bottom: 17px; padding-bottom: 17px;
-moz-border-radius: 6px; -moz-border-radius: 6px;
-webkit-border-radius: 6px; -webkit-border-radius: 6px;
border-radius: 6px; border-radius: 6px;
-moz-box-shadow: 0 0 35px #5c5c5c; -moz-box-shadow: 0 0 35px #5c5c5c;
-webkit-box-shadow: 0 0 35px #5c5c5c; -webkit-box-shadow: 0 0 35px #5c5c5c;
box-shadow: 0 0 35px #5c5c5c; box-shadow: 0 0 35px #5c5c5c;
} }
#install a { #install a {
color: black; color: black;
text-decoration: underline; text-decoration: underline;
} }
#install .clear { #install .clear {
clear: both; clear: both;
} }
#install fieldset { #install fieldset {
border: 1px solid black; border: 1px solid black;
margin: 22px 0 15px 0; margin: 22px 0 15px 0;
padding: 7px 2px 5px 2px; padding: 7px 2px 5px 2px;
-moz-border-radius: 3px; -moz-border-radius: 3px;
-webkit-border-radius: 3px; -webkit-border-radius: 3px;
border-radius: 3px; border-radius: 3px;
} }
#install legend { #install legend {
font-size: 0.9em; font-size: 0.9em;
margin: 0 0 0 15px; margin: 0 0 0 15px;
padding: 0 2px; padding: 0 2px;
text-transform: uppercase; text-transform: uppercase;
} }
#install label { #install label {
width: 200px; width: 200px;
display: block; display: block;
float: left; float: left;
clear: both; clear: both;
margin: 0 0 9px 12px; margin: 0 0 9px 12px;
} }
html[dir="rtl"] #install label { html[dir="rtl"] #install label {
margin-right: 12px; margin-right: 12px;
margin-left: 0; margin-left: 0;
float: right; float: right;
} }
#install input, #install input,
#install select { #install select {
float: left; float: left;
margin-bottom: 5px; margin-bottom: 5px;
} }
html[dir="rtl"] #install input, html[dir="rtl"] #install input,
html[dir="rtl"] #install select { html[dir="rtl"] #install select {
float: right; float: right;
} }
#install input[type="text"], #install input[type="text"],
#install input[type="url"], #install input[type="url"],
#install input[type="password"] { #install input[type="password"] {
margin-top: -2px; margin-top: -2px;
padding: 3px; padding: 3px;
font-size: 0.95em; font-size: 0.95em;
min-width: 220px; min-width: 220px;
} }
#install input.icon { #install input.icon {
padding-left: 24px; padding-left: 24px;
min-width: 199px; min-width: 199px;
max-height: 18px; max-height: 18px;
} }
#install input.icon#user_name { #install input.icon#user_name {
background-position: 4px -204px; background-position: 4px -204px;
} }
#install input.icon#user_password { #install input.icon#user_password {
background-position: 4px -226px; background-position: 4px -226px;
} }
#install input.icon#user_repassword { #install input.icon#user_repassword {
background-position: 4px -248px; background-position: 4px -248px;
} }
#install-top { #install-top {
padding: 30px 45px; padding: 30px 45px;
} }
#install-top .logo { #install-top .logo {
background-position: 0 0; background-position: 0 0;
min-width: 88px; min-width: 88px;
height: 36px; height: 36px;
padding: 32px 0 0 66px; padding: 32px 0 0 66px;
font-size: 32px; font-size: 32px;
color: white; color: white;
text-transform: lowercase; text-transform: lowercase;
float: left; float: left;
text-shadow: 0 1px 1px black; text-shadow: 0 1px 1px black;
} }
#install-top .step { #install-top .step {
background-color: rgb(0,0,0); background-color: rgb(0,0,0);
background-color: rgba(0,0,0,0.2); background-color: rgba(0,0,0,0.2);
border: 2px solid white; border: 2px solid white;
padding: 6px 21px; padding: 6px 21px;
font-size: 2.7em; font-size: 2.7em;
text-shadow: 0 1px 1px black; text-shadow: 0 1px 1px black;
float: right; float: right;
-moz-border-radius: 40px; -moz-border-radius: 40px;
-webkit-border-radius: 40px; -webkit-border-radius: 40px;
border-radius: 40px; border-radius: 40px;
-moz-box-shadow: 0 0 10px #202020; -moz-box-shadow: 0 0 10px #202020;
-webkit-box-shadow: 0 0 10px #202020; -webkit-box-shadow: 0 0 10px #202020;
box-shadow: 0 0 10px #202020; box-shadow: 0 0 10px #202020;
} }
#install-top .step span { #install-top .step span {
font-size: 0.6em; font-size: 0.6em;
} }
#install-content { #install-content {
background: #e4eef9; background: #e4eef9;
background: -moz-linear-gradient(top, #e4eef9, #d0e5fa); background: -moz-linear-gradient(top, #e4eef9, #d0e5fa);
background: -webkit-gradient(linear, left top, left bottom, from(#e4eef9), to(#d0e5fa)); background: -webkit-gradient(linear, left top, left bottom, from(#e4eef9), to(#d0e5fa));
background: -webkit-linear-gradient(top, #e4eef9 0%, #d0e5fa 100%); background: -webkit-linear-gradient(top, #e4eef9 0%, #d0e5fa 100%);
background: -o-linear-gradient(top, #e4eef9 0%, #d0e5fa 100%); background: -o-linear-gradient(top, #e4eef9 0%, #d0e5fa 100%);
color: black; color: black;
font-size: 0.9em; font-size: 0.9em;
margin: 0 10px; margin: 0 10px;
padding: 20px 24px; padding: 20px 24px;
min-height: 260px; min-height: 260px;
clear: both; clear: both;
right: 10px; right: 10px;
-moz-border-radius: 3px; -moz-border-radius: 3px;
-webkit-border-radius: 3px; -webkit-border-radius: 3px;
border-radius: 3px; border-radius: 3px;
-moz-box-shadow: 0 0 20px #202020; -moz-box-shadow: 0 0 20px #202020;
-webkit-box-shadow: 0 0 20px #202020; -webkit-box-shadow: 0 0 20px #202020;
box-shadow: 0 0 20px #202020; box-shadow: 0 0 20px #202020;
} }
#install-content h3 { #install-content h3 {
padding-left: 24px; padding-left: 24px;
margin-bottom: 15px; margin-bottom: 15px;
float: left; float: left;
} }
html[dir="rtl"] #install-content h3 { html[dir="rtl"] #install-content h3 {
float: right; float: right;
} }
#install-content h3.start { #install-content h3.start {
background-position: 0 -73px; background-position: 0 -73px;
} }
#install-content h3.storage { #install-content h3.storage {
background-position: 0 -95px; background-position: 0 -95px;
} }
#install-content h3.account { #install-content h3.account {
background-position: 0 -117px; background-position: 0 -117px;
} }
#install-content h3.main { #install-content h3.main {
background-position: 0 -139px; background-position: 0 -139px;
} }
#install-content h3.hosts { #install-content h3.hosts {
background-position: 0 -161px; background-position: 0 -161px;
} }
#install-content h3.services { #install-content h3.services {
background-position: 0 -183px; background-position: 0 -183px;
} }
#install-content p { #install-content p {
margin-bottom: 10px; margin-bottom: 10px;
clear: both; clear: both;
} }
#install-content .info { #install-content .info {
color: black; color: black;
border-width: 1px; border-width: 1px;
border-style: dashed; border-style: dashed;
padding: 6px 8px; padding: 6px 8px;
display: block; display: block;
text-decoration: none; text-decoration: none;
} }
#install-content .info.smallspace { #install-content .info.smallspace {
margin: 14px 0 10px 0; margin: 14px 0 10px 0;
} }
#install-content .info.bigspace { #install-content .info.bigspace {
margin: 35px 0 20px 0; margin: 35px 0 20px 0;
} }
#install-content .info.first { #install-content .info.first {
margin-top: 28px; margin-top: 28px;
} }
#install-content .info.last { #install-content .info.last {
margin-bottom: 28px; margin-bottom: 28px;
} }
#install-content .info.neutral { #install-content .info.neutral {
background-color: #f0f19d; background-color: #f0f19d;
border-color: #b3ad4f; border-color: #b3ad4f;
} }
#install-content a.info.neutral:hover, #install-content a.info.neutral:hover,
#install-content a.info.neutral:focus { #install-content a.info.neutral:focus {
background-color: #eced96; background-color: #eced96;
} }
#install-content a.info.neutral:active { #install-content a.info.neutral:active {
background-color: #e9ea93; background-color: #e9ea93;
} }
#install-content .info.success { #install-content .info.success {
background-color: #a8dca9; background-color: #a8dca9;
border-color: #5e9f5f; border-color: #5e9f5f;
} }
#install-content a.info.success:hover, #install-content a.info.success:hover,
#install-content a.info.success:focus { #install-content a.info.success:focus {
background-color: #a0d5a1; background-color: #a0d5a1;
} }
#install-content a.info.success:active { #install-content a.info.success:active {
background-color: #9ad09b; background-color: #9ad09b;
} }
#install-content .info.fail { #install-content .info.fail {
background-color: #f19d9d; background-color: #f19d9d;
border-color: #b34f4f; border-color: #b34f4f;
} }
#install-content ol { #install-content ol {
margin: 20px 30px; margin: 20px 30px;
} }
#install-content ol li { #install-content ol li {
margin-bottom: 1px; margin-bottom: 1px;
} }
#install-buttons { #install-buttons {
margin-top: 22px; margin-top: 22px;
} }
#install-buttons input { #install-buttons input {
border: 1px solid white; border: 1px solid white;
background-color: rgb(255,255,255); background-color: rgb(255,255,255);
background-color: rgba(255,255,255,0.1); background-color: rgba(255,255,255,0.1);
color: white; color: white;
padding: 4px 8px; padding: 4px 8px;
margin-right: 20px; margin-right: 20px;
text-shadow: 0 1px 1px black; text-shadow: 0 1px 1px black;
float: right; float: right;
-moz-border-radius: 3px; -moz-border-radius: 3px;
-webkit-border-radius: 3px; -webkit-border-radius: 3px;
border-radius: 3px; border-radius: 3px;
-moz-box-shadow: 0 0 5px #202020; -moz-box-shadow: 0 0 5px #202020;
-webkit-box-shadow: 0 0 5px #202020; -webkit-box-shadow: 0 0 5px #202020;
box-shadow: 0 0 5px #202020; box-shadow: 0 0 5px #202020;
} }
#install-buttons input:hover, #install-buttons input:hover,
#install-buttons input:focus { #install-buttons input:focus {
cursor: pointer; cursor: pointer;
background-color: rgb(255,255,255); background-color: rgb(255,255,255);
background-color: rgba(255,255,255,0.2); background-color: rgba(255,255,255,0.2);
-moz-box-shadow: 0 0 15px #202020; -moz-box-shadow: 0 0 15px #202020;
-webkit-box-shadow: 0 0 15px #202020; -webkit-box-shadow: 0 0 15px #202020;
box-shadow: 0 0 15px #202020; box-shadow: 0 0 15px #202020;
} }
#install-buttons input:active { #install-buttons input:active {
background-color: rgb(255,255,255); background-color: rgb(255,255,255);
background-color: rgba(255,255,255,0.3); background-color: rgba(255,255,255,0.3);
} }

View file

@ -11,27 +11,27 @@ Author: Valérian Saliou
*/ */
#integratebox .top { #integratebox .top {
height: 40px; height: 40px;
} }
#integratebox .content { #integratebox .content {
text-align: center; text-align: center;
height: 385px; height: 385px;
} }
#integratebox .one-media img { #integratebox .one-media img {
max-height: 385px; max-height: 385px;
max-width: 640px; max-width: 640px;
} }
#integratebox .one-media a img { #integratebox .one-media a img {
border: none; border: none;
} }
#integratebox .one-media audio { #integratebox .one-media audio {
margin-top: 170px; margin-top: 170px;
} }
#integratebox .bottom { #integratebox .bottom {
left: 10px; left: 10px;
} }

View file

@ -16,32 +16,32 @@ Author: Camaran
* *
*/ */
#addToHomeScreen { #addToHomeScreen {
z-index:9999; z-index:9999;
-webkit-user-select:none; -webkit-user-select:none;
user-select:none; user-select:none;
-webkit-box-sizing:border-box; -webkit-box-sizing:border-box;
box-sizing:border-box; box-sizing:border-box;
-webkit-touch-callout:none; -webkit-touch-callout:none;
touch-callout:none; touch-callout:none;
width:240px; width:240px;
font-size:15px; font-size:15px;
padding:12px 14px; padding:12px 14px;
text-align:left; text-align:left;
font-family:helvetica; font-family:helvetica;
background-image:-webkit-gradient(linear,0 0,0 100%,color-stop(0,#fff),color-stop(0.02,#eee),color-stop(0.98,#ccc),color-stop(1,#a3a3a3)); background-image:-webkit-gradient(linear,0 0,0 100%,color-stop(0,#fff),color-stop(0.02,#eee),color-stop(0.98,#ccc),color-stop(1,#a3a3a3));
border:1px solid #505050; border:1px solid #505050;
-webkit-border-radius:8px; -webkit-border-radius:8px;
-webkit-background-clip:padding-box; -webkit-background-clip:padding-box;
color:#333; color:#333;
text-shadow:0 1px 0 rgba(255,255,255,0.75); text-shadow:0 1px 0 rgba(255,255,255,0.75);
line-height:130%; line-height:130%;
-webkit-box-shadow:0 0 4px rgba(0,0,0,0.5); -webkit-box-shadow:0 0 4px rgba(0,0,0,0.5);
} }
#addToHomeScreen.addToHomeIpad { #addToHomeScreen.addToHomeIpad {
width:268px; width:268px;
font-size:18px; font-size:18px;
padding:14px; padding:14px;
} }
/** /**
@ -50,13 +50,13 @@ Author: Camaran
* *
*/ */
#addToHomeScreen.addToHomeWide { #addToHomeScreen.addToHomeWide {
width:296px; width:296px;
} }
#addToHomeScreen.addToHomeIpad.addToHomeWide { #addToHomeScreen.addToHomeIpad.addToHomeWide {
width:320px; width:320px;
font-size:18px; font-size:18px;
padding:14px; padding:14px;
} }
/** /**
@ -65,17 +65,17 @@ Author: Camaran
* *
*/ */
#addToHomeScreen .addToHomeArrow { #addToHomeScreen .addToHomeArrow {
position:absolute; position:absolute;
background-image:-webkit-gradient(linear,0 0,100% 100%,color-stop(0,rgba(204,204,204,0)),color-stop(0.4,rgba(204,204,204,0)),color-stop(0.4,#ccc)); background-image:-webkit-gradient(linear,0 0,100% 100%,color-stop(0,rgba(204,204,204,0)),color-stop(0.4,rgba(204,204,204,0)),color-stop(0.4,#ccc));
border-width:0 1px 1px 0; border-width:0 1px 1px 0;
border-style:solid; border-style:solid;
border-color:#505050; border-color:#505050;
width:16px; height:16px; width:16px; height:16px;
-webkit-transform:rotateZ(45deg); -webkit-transform:rotateZ(45deg);
bottom:-9px; left:50%; bottom:-9px; left:50%;
margin-left:-8px; margin-left:-8px;
-webkit-box-shadow:inset -1px -1px 0 #a9a9a9; -webkit-box-shadow:inset -1px -1px 0 #a9a9a9;
-webkit-border-bottom-right-radius:2px; -webkit-border-bottom-right-radius:2px;
} }
@ -85,10 +85,10 @@ Author: Camaran
* *
*/ */
#addToHomeScreen.addToHomeIpad .addToHomeArrow { #addToHomeScreen.addToHomeIpad .addToHomeArrow {
-webkit-transform:rotateZ(-135deg); -webkit-transform:rotateZ(-135deg);
background-image:-webkit-gradient(linear,0 0,100% 100%,color-stop(0,rgba(238,238,238,0)),color-stop(0.4,rgba(238,238,238,0)),color-stop(0.4,#eee)); background-image:-webkit-gradient(linear,0 0,100% 100%,color-stop(0,rgba(238,238,238,0)),color-stop(0.4,rgba(238,238,238,0)),color-stop(0.4,#eee));
-webkit-box-shadow:inset -1px -1px 0 #fff; -webkit-box-shadow:inset -1px -1px 0 #fff;
top:-9px; bottom:auto; left:50%; top:-9px; bottom:auto; left:50%;
} }
@ -98,19 +98,19 @@ Author: Camaran
* *
*/ */
#addToHomeScreen .addToHomeClose { #addToHomeScreen .addToHomeClose {
-webkit-box-sizing:border-box; -webkit-box-sizing:border-box;
position:absolute; position:absolute;
right:4px; right:4px;
top:4px; top:4px;
width:18px; width:18px;
height:18px; line-height:14px; height:18px; line-height:14px;
text-align:center; text-align:center;
text-indent:1px; text-indent:1px;
-webkit-border-radius:9px; -webkit-border-radius:9px;
background:rgba(0,0,0,0.12); background:rgba(0,0,0,0.12);
color:#707070; color:#707070;
-webkit-box-shadow:0 1px 0 #fff; -webkit-box-shadow:0 1px 0 #fff;
font-size:16px; font-size:16px;
} }
@ -120,8 +120,8 @@ Author: Camaran
* *
*/ */
#addToHomeScreen .addToHomePlus { #addToHomeScreen .addToHomePlus {
font-weight:bold; font-weight:bold;
font-size:1.3em; font-size:1.3em;
} }
@ -131,20 +131,20 @@ Author: Camaran
* *
*/ */
#addToHomeScreen .addToHomeShare { #addToHomeScreen .addToHomeShare {
display:inline-block; display:inline-block;
width:18px; width:18px;
height:15px; height:15px;
background-repeat:no-repeat; background-repeat:no-repeat;
background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAeCAQAAADu6HTYAAADPElEQVR4Xq3TX2gcRRzA8e/M7mVv2+TSNpc/TZtrY6jUGqgaSAmEChKLrYK0YH0RFC2CSCkEfCghiKU04J8qNigq6os+iQV98MHWFwVBrQQRWs21lBw5cw3NNb1/udu72RGG5Y77IzXW77D7sAwf5scyYoL6BGXSDKFZwaGpLvIUaeoCkvX1MmsM0Ny6oRSQYOLuIS+YZOpfQdqslpUxcZrzTVAz4qPwW2O3CeIwC/RSzeY6Ow1QhUrkr+YOWfEKDkEP8Rij7CHKJmrFSDHBdwGEE5wiGChPN+PnT8VdRtEIl1d4gRj/1EVe5ZSBKGh8iqQpo/Fo5+3C/gz0MYg4zgwbqday1/Q4B8BGQ45d/Hi54lakCrU5obOcidJpu1+Lg9whjabyaOYLnrIBFFaRD+xe2ybMDWY66GmP/WA9cGfGp0CWhy0wkMN8inepFiH2rV1j0NQSNQbFLRQnS8/8YSDBBpadfv4CYDub2fmeHDNAsL1MBWUel0iA+Xik6eHcyvD3vAMSU1TGuA/YRS+dD7ovCQN43GKRFCU20Kd3V/avDVVyAZ5niTEuLA5/zBGWg9EEEhfJKN200Tat8CmRAQb9+wv7soPlHt2tQorsz1uPbr0HTY4sJwrH47zJZwABBAKLMBoQXepwgTwdHCo+fXMkQ4lrxEmQ5AaXipPqDY9V2vn09tgvTPI71EEGYxM+/uMJLJ4svpgaWGKOi/xKgmqLSUGSUd5f2vIVJ/CgBaTIUsZ7ZBsn0+NzfMOXLFCXQyTcybN6ep5ZZgUOHn7jpfUpsZshdugPGf+E5zjbyHTSRyQ8xfRPPM/s63RHeuknSoT22mjmmnAOIMkUZ6D1xSfPPAfd1WFKM3sO2CMaHx8M1NjnXKHaAGGkOW0C02WeYHUz4qMtx+w5gUDS8NckYe5lHsMYwCZEPyEEmjLDZFmAS7CDviMdxyTkMNVBKEmYLvbiQQBIBBbCQG04bGQvFWz6CfsCQLWCigILFwcfkGYBiOpbYuOizTAyYyDdCtrGaRG1LCkIgMYEFhI0WqQZoSlbGRyHKe4qOx7iv2bVQW9dp4dlM/x6kmwnWQcd/Q3FCqwTEiT5s+6D5v/pb0SSHyg7uhMWAAAAAElFTkSuQmCC); background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAeCAQAAADu6HTYAAADPElEQVR4Xq3TX2gcRRzA8e/M7mVv2+TSNpc/TZtrY6jUGqgaSAmEChKLrYK0YH0RFC2CSCkEfCghiKU04J8qNigq6os+iQV98MHWFwVBrQQRWs21lBw5cw3NNb1/udu72RGG5Y77IzXW77D7sAwf5scyYoL6BGXSDKFZwaGpLvIUaeoCkvX1MmsM0Ny6oRSQYOLuIS+YZOpfQdqslpUxcZrzTVAz4qPwW2O3CeIwC/RSzeY6Ow1QhUrkr+YOWfEKDkEP8Rij7CHKJmrFSDHBdwGEE5wiGChPN+PnT8VdRtEIl1d4gRj/1EVe5ZSBKGh8iqQpo/Fo5+3C/gz0MYg4zgwbqday1/Q4B8BGQ45d/Hi54lakCrU5obOcidJpu1+Lg9whjabyaOYLnrIBFFaRD+xe2ybMDWY66GmP/WA9cGfGp0CWhy0wkMN8inepFiH2rV1j0NQSNQbFLRQnS8/8YSDBBpadfv4CYDub2fmeHDNAsL1MBWUel0iA+Xik6eHcyvD3vAMSU1TGuA/YRS+dD7ovCQN43GKRFCU20Kd3V/avDVVyAZ5niTEuLA5/zBGWg9EEEhfJKN200Tat8CmRAQb9+wv7soPlHt2tQorsz1uPbr0HTY4sJwrH47zJZwABBAKLMBoQXepwgTwdHCo+fXMkQ4lrxEmQ5AaXipPqDY9V2vn09tgvTPI71EEGYxM+/uMJLJ4svpgaWGKOi/xKgmqLSUGSUd5f2vIVJ/CgBaTIUsZ7ZBsn0+NzfMOXLFCXQyTcybN6ep5ZZgUOHn7jpfUpsZshdugPGf+E5zjbyHTSRyQ8xfRPPM/s63RHeuknSoT22mjmmnAOIMkUZ6D1xSfPPAfd1WFKM3sO2CMaHx8M1NjnXKHaAGGkOW0C02WeYHUz4qMtx+w5gUDS8NckYe5lHsMYwCZEPyEEmjLDZFmAS7CDviMdxyTkMNVBKEmYLvbiQQBIBBbCQG04bGQvFWz6CfsCQLWCigILFwcfkGYBiOpbYuOizTAyYyDdCtrGaRG1LCkIgMYEFhI0WqQZoSlbGRyHKe4qOx7iv2bVQW9dp4dlM/x6kmwnWQcd/Q3FCqwTEiT5s+6D5v/pb0SSHyg7uhMWAAAAAElFTkSuQmCC);
background-size:18px 15px; background-size:18px 15px;
text-indent:-9999em; text-indent:-9999em;
overflow:hidden; overflow:hidden;
} }
#addToHomeScreen .addToHomeShare.addToHomeShareOS7 { #addToHomeScreen .addToHomeShare.addToHomeShareOS7 {
width:11px; width:11px;
background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAA8CAYAAAAQTCjdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAASCQAAEgkB80sG3AAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKjSURBVGiB7dpPiFVVHMDxz7m9NCtMyI2bEJEC25WrEkzHUXCRraIwdNE8ZxfYIlcis1ZEbGEzT1QCF4XgH1CyWhUoJKIWNRGEiCNKmkSiYTzfcfGuOokx77x3ZlS8382959zfn+/invvn3RdijHIRBrwkOINCYXEcdjpb7VyiYdBsLScwt5y6IloYdzqXo36Ro0gY9IKWo+5JwmzBt2HQnBw9ehYNazyn5TBee8Dh+Vq+CWu92GufnkTDR6ab7gDeBNHouMM/l9tXTXM0fGBmL726Fg1Dam74EsvKqR8VNowL2Yzj5f7rnnE4DHq2235diYYhhTGfC94up35T0y+6di/ITU0rKVd+sEi0P7xr2pSJOu8zvF+OzqEv7vDH/WFxt7/cshy/ticsN8sXYUht0kXDOlsF9XJ4UaEvNoz9X3zc5bKaZThbyr5jzJ4wlNY7KTgM+ES0vhz+KeiPw36fKC/ucAF9uFBOrTZm26SJCtaV27+xIo7cXdkTEhvOoh+XyxprU1qnim7CQdGK2HAyKRexYVShT3RItDElN+mkjiP2Ym+S3f01hv2EVal5WW6hU0ElmptaqJuBpXg6MbeFH2LDpU6CQ93zWIKnEvs0cayGU3glMfkOo1jQYewZzOuyz7FC95Jwo5OgUFfgeg993hh/eTqCTxOSm/iuk8DY0Ap1b2GhtHXxsfZN4j/X0fOx4auEIknEhqv4OiUn1L13Z/+xWfWVaG4q0dxUormpRHNTieamEs1NJZqbJ1Q0jHvdiJo5S2cVjSNOCHZhn3/SnuYnIvl3yomIIz7MXZMn9hydRCrR3FSiualEc1OJ5qYSzU0lmptKNDePjWgwcPePT7/g+4cp8wCW4GXaryK3tL+mLdD5x62ppllgu7bso8q/2HIbzGWdNmWnSJwAAAAASUVORK5CYII=); background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAA8CAYAAAAQTCjdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAASCQAAEgkB80sG3AAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKjSURBVGiB7dpPiFVVHMDxz7m9NCtMyI2bEJEC25WrEkzHUXCRraIwdNE8ZxfYIlcis1ZEbGEzT1QCF4XgH1CyWhUoJKIWNRGEiCNKmkSiYTzfcfGuOokx77x3ZlS8382959zfn+/invvn3RdijHIRBrwkOINCYXEcdjpb7VyiYdBsLScwt5y6IloYdzqXo36Ro0gY9IKWo+5JwmzBt2HQnBw9ehYNazyn5TBee8Dh+Vq+CWu92GufnkTDR6ab7gDeBNHouMM/l9tXTXM0fGBmL726Fg1Dam74EsvKqR8VNowL2Yzj5f7rnnE4DHq2235diYYhhTGfC94up35T0y+6di/ITU0rKVd+sEi0P7xr2pSJOu8zvF+OzqEv7vDH/WFxt7/cshy/ticsN8sXYUht0kXDOlsF9XJ4UaEvNoz9X3zc5bKaZThbyr5jzJ4wlNY7KTgM+ES0vhz+KeiPw36fKC/ucAF9uFBOrTZm26SJCtaV27+xIo7cXdkTEhvOoh+XyxprU1qnim7CQdGK2HAyKRexYVShT3RItDElN+mkjiP2Ym+S3f01hv2EVal5WW6hU0ElmptaqJuBpXg6MbeFH2LDpU6CQ93zWIKnEvs0cayGU3glMfkOo1jQYewZzOuyz7FC95Jwo5OgUFfgeg993hh/eTqCTxOSm/iuk8DY0Ap1b2GhtHXxsfZN4j/X0fOx4auEIknEhqv4OiUn1L13Z/+xWfWVaG4q0dxUormpRHNTieamEs1NJZqbJ1Q0jHvdiJo5S2cVjSNOCHZhn3/SnuYnIvl3yomIIz7MXZMn9hydRCrR3FSiualEc1OJ5qYSzU0lmptKNDePjWgwcPePT7/g+4cp8wCW4GXaryK3tL+mLdD5x62ppllgu7bso8q/2HIbzGWdNmWnSJwAAAAASUVORK5CYII=);
background-size:11px 15px; background-size:11px 15px;
} }
/** /**
@ -153,20 +153,20 @@ Author: Camaran
* *
*/ */
#addToHomeScreen .addToHomeTouchIcon { #addToHomeScreen .addToHomeTouchIcon {
display:block; display:block;
float:left; float:left;
-webkit-border-radius:6px; -webkit-border-radius:6px;
border-radius:6px; border-radius:6px;
-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.5), -webkit-box-shadow:0 1px 3px rgba(0,0,0,0.5),
inset 0 0 2px rgba(255,255,255,0.9); inset 0 0 2px rgba(255,255,255,0.9);
box-shadow:0 1px 3px rgba(0,0,0,0.5), box-shadow:0 1px 3px rgba(0,0,0,0.5),
inset 0 0 2px rgba(255,255,255,0.9); inset 0 0 2px rgba(255,255,255,0.9);
background-repeat:no-repeat; background-repeat:no-repeat;
width:57px; height:57px; width:57px; height:57px;
-webkit-background-size:57px 57px; -webkit-background-size:57px 57px;
background-size:57px 57px; background-size:57px 57px;
margin:0 12px 0 0; margin:0 12px 0 0;
border:1px solid #333; border:1px solid #333;
-webkit-background-clip:padding-box; -webkit-background-clip:padding-box;
background-clip:padding-box; background-clip:padding-box;
} }

View file

@ -11,122 +11,122 @@ Author: Valérian Saliou
*/ */
* { * {
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
body { body {
font: normal 14.6px 'PT Sans', sans-serif; font: normal 14.6px 'PT Sans', sans-serif;
text-shadow: 0 0 5px white; text-shadow: 0 0 5px white;
} }
h1 { h1 {
margin-bottom: 15px; margin-bottom: 15px;
} }
a { a {
text-decoration: none; text-decoration: none;
color: black; color: black;
outline-style: none; outline-style: none;
} }
a:hover, a:hover,
a:focus { a:focus {
cursor: pointer; cursor: pointer;
text-decoration: underline; text-decoration: underline;
} }
legend { legend {
color: black; color: black;
} }
input, input,
textarea { textarea {
background-color: white; background-color: white;
border: 1px solid #636363; border: 1px solid #636363;
font-size: 0.95em; font-size: 0.95em;
padding: 2px; padding: 2px;
outline-style: none; outline-style: none;
-moz-border-radius: 2px; -moz-border-radius: 2px;
-webkit-border-radius: 2px; -webkit-border-radius: 2px;
border-radius: 2px; border-radius: 2px;
-moz-box-shadow: inset 0 3px 10px #dcdcdc; -moz-box-shadow: inset 0 3px 10px #dcdcdc;
-webkit-box-shadow: inset 0 3px 10px #dcdcdc; -webkit-box-shadow: inset 0 3px 10px #dcdcdc;
box-shadow: inset 0 3px 10px #dcdcdc; box-shadow: inset 0 3px 10px #dcdcdc;
} }
textarea { textarea {
font-size: 1.1em; font-size: 1.1em;
resize: none; resize: none;
} }
input:focus, input:focus,
input[type="submit"]:hover, input[type="submit"]:hover,
input[type="reset"]:hover, input[type="reset"]:hover,
textarea:focus { textarea:focus {
border: 1px solid #e1a014; border: 1px solid #e1a014;
-moz-box-shadow: inset 0 3px 10px #edd9bc; -moz-box-shadow: inset 0 3px 10px #edd9bc;
-webkit-box-shadow: inset 0 3px 10px #edd9bc; -webkit-box-shadow: inset 0 3px 10px #edd9bc;
box-shadow: inset 0 3px 10px #edd9bc; box-shadow: inset 0 3px 10px #edd9bc;
} }
input[type="submit"], input[type="submit"],
input[type="reset"] { input[type="reset"] {
cursor: pointer; cursor: pointer;
} }
input[type="submit"]:active, input[type="submit"]:active,
input[type="reset"]:active { input[type="reset"]:active {
-moz-box-shadow: inset 0 3px 15px #e1a753; -moz-box-shadow: inset 0 3px 15px #e1a753;
-webkit-box-shadow: inset 0 3px 15px #e1a753; -webkit-box-shadow: inset 0 3px 15px #e1a753;
box-shadow: inset 0 3px 15px #e1a753; box-shadow: inset 0 3px 15px #e1a753;
} }
input[disabled], input[disabled],
textarea[disabled] { textarea[disabled] {
background-color: #f3f3f3; background-color: #f3f3f3;
border: 1px solid #989898; border: 1px solid #989898;
} }
input:placeholder { input:placeholder {
color: #78868a !important; color: #78868a !important;
} }
input:-moz-placeholder { input:-moz-placeholder {
color: #78868a !important; color: #78868a !important;
} }
input::-webkit-input-placeholder { input::-webkit-input-placeholder {
color: #78868a !important; color: #78868a !important;
} }
input.placeholder { input.placeholder {
color: #78868a !important; color: #78868a !important;
} }
input[type="checkbox"] { input[type="checkbox"] {
margin-top: 2px; margin-top: 2px;
} }
input[type="checkbox"], input[type="checkbox"],
input[type="radio"] { input[type="radio"] {
background: transparent none !important; background: transparent none !important;
border: 0 none !important; border: 0 none !important;
} }
.please-complete, .please-complete,
.please-complete:hover, .please-complete:hover,
.please-complete:focus { .please-complete:focus {
border: 1px #ac2525 solid !important; border: 1px #ac2525 solid !important;
-moz-box-shadow: inset 0 3px 10px #f39c9c !important; -moz-box-shadow: inset 0 3px 10px #f39c9c !important;
-webkit-box-shadow: inset 0 3px 10px #f39c9c !important; -webkit-box-shadow: inset 0 3px 10px #f39c9c !important;
box-shadow: inset 0 3px 10px #f39c9c !important; box-shadow: inset 0 3px 10px #f39c9c !important;
} }
.hidden { .hidden {
display: none !important; display: none !important;
} }
.clear { .clear {
clear: both !important; clear: both !important;
} }

View file

@ -11,602 +11,602 @@ Author: Valérian Saliou
*/ */
#manager { #manager {
background-color: rgb(20,20,20); background-color: rgb(20,20,20);
background-color: rgba(20,20,20,0.85); background-color: rgba(20,20,20,0.85);
width: 945px; width: 945px;
margin: 0 auto 25px; margin: 0 auto 25px;
padding-bottom: 17px; padding-bottom: 17px;
-moz-border-radius-bottomleft: 4px; -moz-border-radius-bottomleft: 4px;
-moz-border-radius-bottomright: 4px; -moz-border-radius-bottomright: 4px;
-webkit-border-bottom-left-radius: 4px; -webkit-border-bottom-left-radius: 4px;
-webkit-border-bottom-right-radius: 4px; -webkit-border-bottom-right-radius: 4px;
border-bottom-left-radius: 4px; border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px; border-bottom-right-radius: 4px;
-moz-box-shadow: 0 0 35px #5c5c5c; -moz-box-shadow: 0 0 35px #5c5c5c;
-webkit-box-shadow: 0 0 35px #5c5c5c; -webkit-box-shadow: 0 0 35px #5c5c5c;
box-shadow: 0 0 35px #5c5c5c; box-shadow: 0 0 35px #5c5c5c;
} }
#manager a { #manager a {
color: black; color: black;
text-decoration: underline; text-decoration: underline;
} }
#manager .clear { #manager .clear {
clear: both; clear: both;
} }
#manager fieldset { #manager fieldset {
border: 1px solid black; border: 1px solid black;
margin: 22px 0 15px 0; margin: 22px 0 15px 0;
padding: 7px 2px 5px 2px; padding: 7px 2px 5px 2px;
-moz-border-radius: 3px; -moz-border-radius: 3px;
-webkit-border-radius: 3px; -webkit-border-radius: 3px;
border-radius: 3px; border-radius: 3px;
} }
#manager legend { #manager legend {
font-size: 0.9em; font-size: 0.9em;
margin: 0 0 0 15px; margin: 0 0 0 15px;
padding: 0 2px; padding: 0 2px;
text-transform: uppercase; text-transform: uppercase;
} }
#manager label { #manager label {
width: 200px; width: 200px;
display: block; display: block;
float: left; float: left;
clear: both; clear: both;
margin: 0 0 9px 12px; margin: 0 0 9px 12px;
} }
html[dir="rtl"] #manager label { html[dir="rtl"] #manager label {
margin-left: 0; margin-left: 0;
margin-right: 12px; margin-right: 12px;
float: right; float: right;
} }
#manager label.master { #manager label.master {
text-decoration: underline; text-decoration: underline;
} }
#manager input, #manager input,
#manager select { #manager select {
float: left; float: left;
margin-bottom: 5px; margin-bottom: 5px;
} }
html[dir="rtl"] #manager input, html[dir="rtl"] #manager input,
html[dir="rtl"] #manager select { html[dir="rtl"] #manager select {
float: right; float: right;
} }
#manager input[type="radio"] { #manager input[type="radio"] {
margin: 2px 8px 5px 0; margin: 2px 8px 5px 0;
} }
html[dir="rtl"] #manager input[type="radio"] { html[dir="rtl"] #manager input[type="radio"] {
margin-right: 0; margin-right: 0;
margin-left: 8px; margin-left: 8px;
} }
#manager input[type="text"], #manager input[type="text"],
#manager input[type="url"], #manager input[type="url"],
#manager input[type="password"], #manager input[type="password"],
#manager select { #manager select {
margin-top: -2px; margin-top: -2px;
font-size: 0.95em; font-size: 0.95em;
} }
#manager input[type="text"], #manager input[type="text"],
#manager input[type="url"], #manager input[type="url"],
#manager input[type="password"] { #manager input[type="password"] {
padding: 3px; padding: 3px;
min-width: 220px; min-width: 220px;
} }
#manager input.icon { #manager input.icon {
padding-left: 24px; padding-left: 24px;
min-width: 199px; min-width: 199px;
max-height: 18px; max-height: 18px;
} }
#manager input.icon#admin_name { #manager input.icon#admin_name {
background-position: 4px -510px; background-position: 4px -510px;
} }
#manager input.icon#admin_password, #manager input.icon#admin_password,
#manager input.icon#user_repassword { #manager input.icon#user_repassword {
background-position: 4px -532px; background-position: 4px -532px;
} }
#manager input.icon#user_name, #manager input.icon#user_name,
#manager input.icon#music_artist { #manager input.icon#music_artist {
background-position: 4px -554px; background-position: 4px -554px;
} }
#manager input.icon#user_password { #manager input.icon#user_password {
background-position: 4px -576px; background-position: 4px -576px;
} }
#manager input.icon#music_title { #manager input.icon#music_title {
background-position: 4px -598px; background-position: 4px -598px;
} }
#manager input.icon#music_album { #manager input.icon#music_album {
background-position: 4px -620px; background-position: 4px -620px;
} }
#manager input.icon#background_image_color, #manager input.icon#background_image_color,
#manager input.icon#background_color_color { #manager input.icon#background_color_color {
background-position: 4px -641px; background-position: 4px -641px;
} }
#manager select { #manager select {
min-width: 160px; min-width: 160px;
max-width: 230px; max-width: 230px;
} }
#manager-top { #manager-top {
padding: 25px 45px 30px; padding: 25px 45px 30px;
} }
#manager-top .logo { #manager-top .logo {
background-position: 0 0; background-position: 0 0;
min-width: 89px; min-width: 89px;
height: 40px; height: 40px;
padding: 28px 0 0 65px; padding: 28px 0 0 65px;
font-size: 32px; font-size: 32px;
color: white; color: white;
text-transform: lowercase; text-transform: lowercase;
float: left; float: left;
text-shadow: 0 1px 1px black; text-shadow: 0 1px 1px black;
} }
#manager-top .meta { #manager-top .meta {
background-color: #e0eaec; background-color: #e0eaec;
font-size: 0.9em; font-size: 0.9em;
padding: 12px 7px 12px 14px; padding: 12px 7px 12px 14px;
float: right; float: right;
-moz-border-radius: 3px; -moz-border-radius: 3px;
-webkit-border-radius: 3px; -webkit-border-radius: 3px;
border-radius: 3px; border-radius: 3px;
-moz-box-shadow: 0 0 10px #202020; -moz-box-shadow: 0 0 10px #202020;
-webkit-box-shadow: 0 0 10px #202020; -webkit-box-shadow: 0 0 10px #202020;
box-shadow: 0 0 10px #202020; box-shadow: 0 0 10px #202020;
} }
html[dir="rtl"] #manager-top .meta { html[dir="rtl"] #manager-top .meta {
padding-left: 7px; padding-left: 7px;
padding-right: 14px; padding-right: 14px;
} }
#manager-top .meta span { #manager-top .meta span {
margin-right: 10px; margin-right: 10px;
color: black; color: black;
} }
html[dir="rtl"] #manager-top .meta span { html[dir="rtl"] #manager-top .meta span {
margin-right: 0; margin-right: 0;
margin-left: 10px; margin-left: 10px;
} }
#manager-top .meta a { #manager-top .meta a {
background-color: #f1f6fd; background-color: #f1f6fd;
border: 1px solid #b9cbcf; border: 1px solid #b9cbcf;
color: #224249; color: #224249;
padding: 4px 8px 4px 21px; padding: 4px 8px 4px 21px;
margin-left: 2px; margin-left: 2px;
text-decoration: none; text-decoration: none;
-moz-border-radius: 2px; -moz-border-radius: 2px;
-webkit-border-radius: 2px; -webkit-border-radius: 2px;
border-radius: 2px; border-radius: 2px;
} }
#manager-top .meta a:hover, #manager-top .meta a:hover,
#manager-top .meta a:focus { #manager-top .meta a:focus {
border: 1px solid #95b1b7; border: 1px solid #95b1b7;
} }
#manager-top .meta a:active { #manager-top .meta a:active {
border: 1px solid #77989f; border: 1px solid #77989f;
} }
#manager-top .meta a.logout { #manager-top .meta a.logout {
background-position: 3px -69px; background-position: 3px -69px;
} }
#manager-top .meta a.close { #manager-top .meta a.close {
background-position: 3px -90px; background-position: 3px -90px;
} }
#manager-tabs { #manager-tabs {
margin-left: 12px; margin-left: 12px;
} }
html[dir="rtl"] #manager-tabs { html[dir="rtl"] #manager-tabs {
margin-left: 0; margin-left: 0;
margin-right: 12px; margin-right: 12px;
} }
#manager-tabs a { #manager-tabs a {
background-color: #d9e7ea; background-color: #d9e7ea;
color: #204249; color: #204249;
width: 107px; width: 107px;
height: 17px; height: 17px;
padding: 4px 4px 4px 16px; padding: 4px 4px 4px 16px;
margin-left: 4px; margin-left: 4px;
font-size: 0.94em; font-size: 0.94em;
text-decoration: none; text-decoration: none;
overflow: hidden; overflow: hidden;
float: left; float: left;
-moz-border-radius-topright: 3px; -moz-border-radius-topright: 3px;
-moz-border-radius-topleft: 3px; -moz-border-radius-topleft: 3px;
-webkit-border-top-right-radius: 3px; -webkit-border-top-right-radius: 3px;
-webkit-border-top-left-radius: 3px; -webkit-border-top-left-radius: 3px;
border-top-right-radius: 3px; border-top-right-radius: 3px;
border-top-left-radius: 3px; border-top-left-radius: 3px;
} }
html[dir="rtl"] #manager-tabs a { html[dir="rtl"] #manager-tabs a {
margin-left: 0; margin-left: 0;
margin-right: 4px; margin-right: 4px;
padding-left: 4px; padding-left: 4px;
padding-right: 16px; padding-right: 16px;
float: right; float: right;
} }
#manager-tabs a:hover, #manager-tabs a:hover,
#manager-tabs a:focus { #manager-tabs a:focus {
background-color: #cedee1; background-color: #cedee1;
text-decoration: none; text-decoration: none;
} }
#manager-tabs a:active { #manager-tabs a:active {
background-color: #c3d3d7; background-color: #c3d3d7;
text-decoration: none; text-decoration: none;
} }
#manager-tabs a.tab-active { #manager-tabs a.tab-active {
background-color: #e4eef9 !important; background-color: #e4eef9 !important;
} }
#manager-content { #manager-content {
background: #e4eef9; background: #e4eef9;
background: -moz-linear-gradient(top, #e4eef9, #d0e5fa); background: -moz-linear-gradient(top, #e4eef9, #d0e5fa);
background: -webkit-gradient(linear, left top, left bottom, from(#e4eef9), to(#d0e5fa)); background: -webkit-gradient(linear, left top, left bottom, from(#e4eef9), to(#d0e5fa));
background: -webkit-linear-gradient(top, #e4eef9 0%, #d0e5fa 100%); background: -webkit-linear-gradient(top, #e4eef9 0%, #d0e5fa 100%);
background: -o-linear-gradient(top, #e4eef9 0%, #d0e5fa 100%); background: -o-linear-gradient(top, #e4eef9 0%, #d0e5fa 100%);
color: black; color: black;
font-size: 0.9em; font-size: 0.9em;
margin: 0 10px; margin: 0 10px;
padding: 20px 24px; padding: 20px 24px;
min-height: 260px; min-height: 260px;
clear: both; clear: both;
right: 10px; right: 10px;
-moz-border-radius: 3px; -moz-border-radius: 3px;
-webkit-border-radius: 3px; -webkit-border-radius: 3px;
border-radius: 3px; border-radius: 3px;
-moz-box-shadow: 0 0 20px #202020; -moz-box-shadow: 0 0 20px #202020;
-webkit-box-shadow: 0 0 20px #202020; -webkit-box-shadow: 0 0 20px #202020;
box-shadow: 0 0 20px #202020; box-shadow: 0 0 20px #202020;
} }
#manager-content h3 { #manager-content h3 {
padding-left: 24px; padding-left: 24px;
margin-bottom: 15px; margin-bottom: 15px;
float: left; float: left;
} }
html[dir="rtl"] #manager-content h3 { html[dir="rtl"] #manager-content h3 {
float: right; float: right;
} }
#manager-content h3.login { #manager-content h3.login {
background-position: 0 -466px; background-position: 0 -466px;
} }
#manager-content h3.statistics { #manager-content h3.statistics {
background-position: 0 -203px; background-position: 0 -203px;
} }
#manager-content h3.configuration { #manager-content h3.configuration {
background-position: 0 -224px; background-position: 0 -224px;
} }
#manager-content h3.hosts { #manager-content h3.hosts {
background-position: 0 -246px; background-position: 0 -246px;
} }
#manager-content h3.storage { #manager-content h3.storage {
background-position: 0 -268px; background-position: 0 -268px;
} }
#manager-content h3.design { #manager-content h3.design {
background-position: 0 -290px; background-position: 0 -290px;
} }
#manager-content h3.users { #manager-content h3.users {
background-position: 0 -312px; background-position: 0 -312px;
} }
#manager-content h3.updates { #manager-content h3.updates {
background-position: 0 -334px; background-position: 0 -334px;
} }
#manager-content h4 { #manager-content h4 {
border-top: 1px dotted black; border-top: 1px dotted black;
padding-top: 5px; padding-top: 5px;
margin: 20px 0 14px; margin: 20px 0 14px;
clear: both; clear: both;
} }
#manager-content ul, #manager-content ul,
#manager-content ol { #manager-content ol {
width: 380px; width: 380px;
margin: 8px 0 20px 18px; margin: 8px 0 20px 18px;
} }
html[dir="rtl"] #manager-content ul, html[dir="rtl"] #manager-content ul,
html[dir="rtl"] #manager-content ol { html[dir="rtl"] #manager-content ol {
margin-left: 0; margin-left: 0;
margin-right: 18px; margin-right: 18px;
} }
#manager-content li { #manager-content li {
margin-bottom: 3px; margin-bottom: 3px;
} }
html[dir="rtl"] #manager-content li { html[dir="rtl"] #manager-content li {
margin-right: 15px; margin-right: 15px;
} }
#manager-content li.total { #manager-content li.total {
margin-bottom: 14px; margin-bottom: 14px;
} }
#manager-content li b { #manager-content li b {
width: 190px; width: 190px;
display: inline-block; display: inline-block;
} }
#manager-content li span { #manager-content li span {
margin-left: 10px; margin-left: 10px;
display: inline-block; display: inline-block;
} }
#manager-content ul.stats, #manager-content ul.stats,
#manager-content ol.stats { #manager-content ol.stats {
float: left; float: left;
} }
#manager-content object.stats { #manager-content object.stats {
border: 1px dotted #bed4d9; border: 1px dotted #bed4d9;
width: 450px; width: 450px;
height: 270px; height: 270px;
margin-bottom: 20px; margin-bottom: 20px;
float: right; float: right;
} }
#manager-content p, #manager-content p,
#manager-content div { #manager-content div {
margin-bottom: 10px; margin-bottom: 10px;
clear: both; clear: both;
} }
#manager-content .info { #manager-content .info {
color: black; color: black;
border-width: 1px; border-width: 1px;
border-style: dashed; border-style: dashed;
padding: 6px 8px; padding: 6px 8px;
display: block; display: block;
text-decoration: none; text-decoration: none;
} }
#manager-content .info.bottomspace { #manager-content .info.bottomspace {
margin-bottom: 16px; margin-bottom: 16px;
} }
#manager-content .info.smallspace { #manager-content .info.smallspace {
margin: 14px 0 10px 0; margin: 14px 0 10px 0;
} }
#manager-content .info.bigspace { #manager-content .info.bigspace {
margin: 35px 0 20px 0; margin: 35px 0 20px 0;
} }
#manager-content .info.neutral { #manager-content .info.neutral {
background-color: #f0f19d; background-color: #f0f19d;
border-color: #b3ad4f; border-color: #b3ad4f;
} }
#manager-content a.info.neutral:hover, #manager-content a.info.neutral:hover,
#manager-content a.info.neutral:focus { #manager-content a.info.neutral:focus {
background-color: #eced96; background-color: #eced96;
} }
#manager-content a.info.neutral:active { #manager-content a.info.neutral:active {
background-color: #e9ea93; background-color: #e9ea93;
} }
#manager-content .info.success { #manager-content .info.success {
background-color: #a8dca9; background-color: #a8dca9;
border-color: #5e9f5f; border-color: #5e9f5f;
} }
#manager-content a.info.success:hover, #manager-content a.info.success:hover,
#manager-content a.info.success:focus { #manager-content a.info.success:focus {
background-color: #a0d5a1; background-color: #a0d5a1;
} }
#manager-content a.info.success:active { #manager-content a.info.success:active {
background-color: #9ad09b; background-color: #9ad09b;
} }
#manager-content .info.fail { #manager-content .info.fail {
background-color: #f19d9d; background-color: #f19d9d;
border-color: #b34f4f; border-color: #b34f4f;
} }
#manager-content a.info.fail:hover, #manager-content a.info.fail:hover,
#manager-content a.info.fail:focus { #manager-content a.info.fail:focus {
background-color: #ea9595; background-color: #ea9595;
} }
#manager-content a.info.fail:active { #manager-content a.info.fail:active {
background-color: #e59090; background-color: #e59090;
} }
#manager-content .browse { #manager-content .browse {
margin: 2px 0 6px; margin: 2px 0 6px;
max-height: 243px; max-height: 243px;
overflow: auto; overflow: auto;
} }
#manager-content .browse .one-browse { #manager-content .browse .one-browse {
padding: 5px 10px 5px 34px; padding: 5px 10px 5px 34px;
height: 17px; height: 17px;
} }
html[dir="rtl"] #manager-content .browse .one-browse a, html[dir="rtl"] #manager-content .browse .one-browse a,
html[dir="rtl"] #manager-content .browse .one-browse span { html[dir="rtl"] #manager-content .browse .one-browse span {
float: left; float: left;
} }
#manager-content .browse .user { #manager-content .browse .user {
background-position: 9px -111px; background-position: 9px -111px;
} }
#manager-content .browse .other { #manager-content .browse .other {
background-position: 9px -133px; background-position: 9px -133px;
} }
#manager-content .browse .folder { #manager-content .browse .folder {
background-position: 9px -178px; background-position: 9px -178px;
} }
#manager-content .browse .audio { #manager-content .browse .audio {
background-position: 9px -154px; background-position: 9px -154px;
} }
#manager-content .browse .alert { #manager-content .browse .alert {
background-position: 9px -353px; background-position: 9px -353px;
} }
#manager-content .browse .image { #manager-content .browse .image {
background-position: 9px -374px; background-position: 9px -374px;
} }
#manager-content .browse .video { #manager-content .browse .video {
background-position: 9px -397px; background-position: 9px -397px;
} }
#manager-content .browse .document { #manager-content .browse .document {
background-position: 9px -418px; background-position: 9px -418px;
} }
#manager-content .browse .package { #manager-content .browse .package {
background-position: 9px -441px; background-position: 9px -441px;
} }
#manager-content .browse .previous { #manager-content .browse .previous {
background-position: 9px -485px; background-position: 9px -485px;
margin-bottom: 4px; margin-bottom: 4px;
} }
#manager-content .browse div { #manager-content .browse div {
margin: 0; margin: 0;
} }
#manager-content .browse input { #manager-content .browse input {
float: right; float: right;
margin: 1px 0; margin: 1px 0;
} }
#manager-content .browse .odd { #manager-content .browse .odd {
background-color: #e9f1fd; background-color: #e9f1fd;
} }
#manager-content .browse .even { #manager-content .browse .even {
background-color: #f1f6fd; background-color: #f1f6fd;
} }
#manager-content .sub { #manager-content .sub {
border-width: 0 0 0 1px; border-width: 0 0 0 1px;
border-style: solid; border-style: solid;
border-color: black; border-color: black;
margin: 5px 0 20px 22px; margin: 5px 0 20px 22px;
padding-left: 12px; padding-left: 12px;
clear: both; clear: both;
} }
html[dir="rtl"] #manager-content .sub { html[dir="rtl"] #manager-content .sub {
border-width: 0 1px 0 0; border-width: 0 1px 0 0;
padding-right: 12px; padding-right: 12px;
padding-left: 0; padding-left: 0;
} }
#manager span.logo_links a { #manager span.logo_links a {
width: 16px; width: 16px;
height: 16px; height: 16px;
margin-right: 6px; margin-right: 6px;
float: left; float: left;
} }
#manager span.logo_links a.remove { #manager span.logo_links a.remove {
background-position: 0 -688px; background-position: 0 -688px;
} }
#manager span.logo_links a.view { #manager span.logo_links a.view {
background-position: 0 -666px; background-position: 0 -666px;
} }
#manager-content .clear { #manager-content .clear {
margin: 0; margin: 0;
} }
#manager-content textarea.notice-text { #manager-content textarea.notice-text {
height: 70px; height: 70px;
width: 600px; width: 600px;
margin-left: 4px; margin-left: 4px;
padding: 5px; padding: 5px;
font-size: 1.2em; font-size: 1.2em;
} }
#manager-buttons { #manager-buttons {
margin-top: 22px; margin-top: 22px;
} }
#manager-buttons input { #manager-buttons input {
border: 1px solid white; border: 1px solid white;
background-color: rgb(255,255,255); background-color: rgb(255,255,255);
background-color: rgba(255,255,255,0.1); background-color: rgba(255,255,255,0.1);
color: white; color: white;
padding: 4px 8px; padding: 4px 8px;
margin-left: -12px; margin-left: -12px;
margin-right: 20px; margin-right: 20px;
font-size: 1em; font-size: 1em;
text-shadow: 0 1px 1px black; text-shadow: 0 1px 1px black;
float: right; float: right;
-moz-border-radius: 3px; -moz-border-radius: 3px;
-webkit-border-radius: 3px; -webkit-border-radius: 3px;
border-radius: 3px; border-radius: 3px;
-moz-box-shadow: 0 0 5px #202020; -moz-box-shadow: 0 0 5px #202020;
-webkit-box-shadow: 0 0 5px #202020; -webkit-box-shadow: 0 0 5px #202020;
box-shadow: 0 0 5px #202020; box-shadow: 0 0 5px #202020;
} }
#manager-buttons input:hover, #manager-buttons input:hover,
#manager-buttons input:focus { #manager-buttons input:focus {
cursor: pointer; cursor: pointer;
background-color: rgb(255,255,255); background-color: rgb(255,255,255);
background-color: rgba(255,255,255,0.2); background-color: rgba(255,255,255,0.2);
-moz-box-shadow: 0 0 15px #202020; -moz-box-shadow: 0 0 15px #202020;
-webkit-box-shadow: 0 0 15px #202020; -webkit-box-shadow: 0 0 15px #202020;
box-shadow: 0 0 15px #202020; box-shadow: 0 0 15px #202020;
} }
#manager-buttons input:active { #manager-buttons input:active {
background-color: rgb(255,255,255); background-color: rgb(255,255,255);
background-color: rgba(255,255,255,0.3); background-color: rgba(255,255,255,0.3);
} }

Some files were not shown because too many files have changed in this diff Show more