+++ /dev/null
-jappixmini/jappix/
-jappixmini/jappix.zip
--- /dev/null
+Jappix - An open social platform
+These are the authors of Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 15/01/12
+
+-------------------------------------------------
+
+Here are the Jappix contributors, who coded or translated the application (Codingteam.net nicknames):
+
+# DEVELOPERS
+ - am0ur3ux
+ - LinkMauve
+ - Maranda
+ - Mathieui
+ - Olivier
+ - sim6
+ - Vanaryon
+
+# TRANSLATORS
+ - allan
+ - Arsimael
+ - Belzeneph
+ - Catdarko
+ - Cerritus
+ - chunzu
+ - ebraminio
+ - Finkregh
+ - hamano
+ - JanCBorchardt
+ - jarda
+ - joeka
+ - kr2ysiek
+ - krohn
+ - Lenwe
+ - LinkMauve
+ - Liverbool
+ - lwj
+ - m1st
+ - Maime
+ - Maranda
+ - mbajur
+ - mentalo
+ - mkwm
+ - Otourly
+ - pocamon
+ - quimi
+ - sahwar
+ - Vanaryon
+ - vitalyster
+ - Zash
--- /dev/null
+ GNU AFFERO GENERAL PUBLIC LICENSE
+ Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU Affero General Public License is a free, copyleft license
+for software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+ The licenses for most software and other practical works are
+designed to take away your freedom to share and change the works. By
+contrast, our General Public Licenses are intended to guarantee your
+freedom to share and change all versions of a program--to make sure it
+remains free software for all its users.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+ A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate. Many developers of free software are heartened and
+encouraged by the resulting cooperation. However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+ The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community. It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server. Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+ An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals. This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU Affero General Public
+License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds
+of works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further restriction,
+you may remove that term. If a license document contains a further
+restriction but permits relicensing or conveying under this License, you
+may add to a covered work material governed by the terms of that license
+document, provided that the further restriction does not survive such
+relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Remote Network Interaction; Use with the GNU General Public License.
+
+ Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software. This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+ Notwithstanding any other provision of this License, you have permission
+to link or combine any covered work with a work licensed under version 3
+of the GNU General Public License into a single combined work, and to
+convey the resulting work. The terms of this License will continue to
+apply to the part which is the covered work, but the work with which it is
+combined will remain governed by version 3 of the GNU General Public
+License.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may differ
+in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU Affero
+General Public License "or any later version" applies to it, you have
+the option of following the terms and conditions either of that
+numbered version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number
+of the GNU Affero General Public License, you may choose any version
+ever published by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that
+proxy's public statement of acceptance of a version permanently
+authorizes you to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source. For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code. There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<http://www.gnu.org/licenses/>.
\ No newline at end of file
--- /dev/null
+Jappix - An open social platform
+These are the installation instructions for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 15/09/10
+
+-------------------------------------------------
+
+It's very simple to install Jappix on your webserver, you just have to follow these things:
+
+# INSTALLATION
+ - The HTTP server : http://codingteam.net/project/jappix/doc/HttpServer
+ - The XMPP server : http://codingteam.net/project/jappix/doc/XmppServer
+ - The BOSH server : http://codingteam.net/project/jappix/doc/BoshServer
+ - The Jappix app. : http://codingteam.net/project/jappix/doc/JappixApp
+
+# MORE
+ - The whole documentation is available at : http://codingteam.net/project/jappix/doc
+
+Now, you can use Jappix. Happy socializing!
--- /dev/null
+Jappix - An open social platform
+This is the readme file for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 18/02/11
+
+-------------------------------------------------
+
+Please refer to the installation instructions that are located in the INSTALL file to process the Jappix installation.
+
+The Jappix Project official service: https://www.jappix.com/
+The Jappix Project website: https://project.jappix.com/
+The Jappix Project panel: http://codingteam.net/project/jappix
+
+Jappix is released under the terms of the AGPL license. See COPYING for details.
+
+Have fun with Jappix!
--- /dev/null
+Jappix - An open social platform
+These are the special thanks for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 16/02/11
+
+-------------------------------------------------
+
+We would like to thanks the authors of these tools, coming from other projects:
+
+# PROJECTS
+ - Base64 http://rumkin.com
+ - DrawSVGChart http://codingteam.net/project/codingteam
+ - idzXHR http://www.iadvize.com/plugin_strophe_xmpp.html
+ - JSJaC http://blog.jwchat.org/jsjac/
+ - jQuery http://jquery.com/
+ - jQuery Form http://jquery.malsup.com/form/
+ - jQuery Timers http://plugins.jquery.com/project/timers
+ - jXHR http://mulletxhr.com/
+ - Mobile Detect http://code.google.com/p/php-mobile-detect/
+ - JSMin http://github.com/rgrove/jsmin-php/
+ - PHP-gettext https://launchpad.net/php-gettext
+ - Silk icons http://www.famfamfam.com/lab/icons/silk/
+ - Smileys http://www.gajim.org/
--- /dev/null
+Spaco [0.9]
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the Ad-Hoc CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 20/12/10
+
+*/
+
+#adhoc .content {
+ padding: 10px 0 10px 0;
+}
+
+#adhoc .adhoc-head {
+ background-color: #f1f6fd;
+ border: 1px #9dc4fc solid;
+ width: 598px;
+ height: 18px;
+ font-size: 0.9em;
+ margin: 0 10px 12px 10px;
+ padding: 6px 10px;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the anonymous mode CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 06/11/10
+
+*/
+
+#top-content {
+ min-width: 500px !important;
+}
+
+#main-content {
+ min-width: 490px !important;
+ min-height: 450px !important;
+}
+
+#left-content {
+ display: none;
+}
+
+#right-content {
+ left: 0;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the archives CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 19/12/10
+
+*/
+
+#archives .content {
+ padding: 10px 0 10px 0;
+}
+
+#archives .filter {
+ background-color: #e9f1fd;
+ border-right: 1px solid #9dc4fc;
+ width: 180px;
+ padding: 12px;
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ float: left;
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+ -moz-border-radius-topleft: 4px;
+ -moz-border-radius-bottomleft: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+}
+
+#archives .filter .friend {
+ margin-bottom: 12px;
+}
+
+#archives .filter .friend {
+ height: 210px;
+ width: 180px;
+ float: none;
+}
+
+#archives .current,
+#archives .logs {
+ position: absolute;
+ bottom: 0;
+ right: 0;
+ left: 204px;
+}
+
+#archives .current {
+ background-color: #e4eef9;
+ border-bottom: 1px solid #9dc4fc;
+ font-size: 0.9em;
+ height: 16px;
+ padding: 6px;
+ top: 0;
+}
+
+#archives .current span {
+ height: 16px;
+ overflow: hidden;
+}
+
+#archives .current .name {
+ max-width: 160px;
+ font-weight: bold;
+ float: left;
+}
+
+#archives .current .time {
+ color: #47646a;
+ font-size: 0.95em;
+ float: right;
+}
+
+#archives .logs {
+ color: black;
+ font-size: 0.9em;
+ overflow: auto;
+ padding: 8px 10px 0;
+ float: left;
+ position: absolute;
+ top: 29px;
+}
+
+#archives .logs a {
+ color: black;
+ text-decoration: underline;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the board CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 26/08/11
+
+*/
+
+#board .one-board {
+ display: none;
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 18px;
+ z-index: 10000;
+ font-size: 0.92em;
+ padding: 6px 8px;
+ box-shadow: 0 0 8px #5c5c5c;
+ -moz-box-shadow: 0 0 8px #5c5c5c;
+ -webkit-box-shadow: 0 0 8px #5c5c5c;
+}
+
+#board .one-board:hover {
+ cursor: pointer;
+}
+
+#board .one-board.visible {
+ display: block;
+}
+
+#board .one-board.error {
+ background-color: rgb(241,160,160);
+ background-color: rgba(241,160,160,0.9);
+ color: #420c0c;
+}
+
+#board .one-board.info {
+ background-color: rgb(248,246,186);
+ background-color: rgba(248,246,186,0.9);
+ color: #2f2a02;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the buddy-list CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 31/08/11
+
+*/
+
+#buddy-list {
+ background-color: rgb(20,20,20);
+ background-color: rgba(20,20,20,0.85);
+ color: #919191;
+ padding: 15px 6px 4px 6px;
+ border-radius: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ box-shadow: 0 0 6px #5c5c5c;
+ -moz-box-shadow: 0 0 6px #5c5c5c;
+ -webkit-box-shadow: 0 0 6px #5c5c5c;
+}
+
+#buddy-list .content {
+ background: #e8f1f3;
+ background: -moz-linear-gradient(top, #e8f1f3, #e4edef);
+ background: -webkit-gradient(linear, left top, left bottom, from(#e8f1f3), to(#e4edef));
+ color: #666666;
+ height: 207px;
+ padding: 4px 4px 0 4px;
+ overflow-x: hidden;
+ overflow-y: auto;
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+ -moz-border-radius-topleft: 3px;
+ -moz-border-radius-topright: 3px;
+ -webkit-border-top-left-radius: 3px;
+ -webkit-border-top-right-radius: 3px;
+}
+
+#buddy-list .one-group {
+ margin-bottom: 10px;
+}
+
+#buddy-list .one-group a.group {
+ color: #202c2f;
+ font-size: 0.8em;
+ margin: 3px 6px;
+ padding-left: 12px;
+ max-height: 15px;
+ text-decoration: none;
+ overflow: hidden;
+ display: block;
+}
+
+#buddy-list .one-group a.group.plus {
+ background-position: -4px -1143px;
+}
+
+#buddy-list .one-group a.group.minus {
+ background-position: -4px -1162px;
+}
+
+#buddy-list .one-group a.group:hover {
+ cursor: pointer;
+}
+
+#buddy-list .hidden-buddy,
+#buddy-list .foot-edit-finish,
+.buddy-conf-more-display-available {
+ display: none;
+}
+
+#buddy-list .buddy {
+ width: 100%;
+ height: 50px;
+ margin-bottom: 4px;
+}
+
+#buddy-list .buddy-click {
+ background: #d9e7ea;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ border-radius: 3px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+}
+
+#buddy-list .buddy-click:hover,
+#buddy-list .buddy-click:focus {
+ background: #cedee1;
+ cursor: pointer;
+}
+
+#buddy-list .buddy-click:active {
+ background: #c3d3d7;
+}
+
+#buddy-list .gateway {
+ height: 27px;
+}
+
+#buddy-list .gateway .name {
+ margin-left: 0;
+}
+
+#buddy-list .gateway .buddy-presence {
+ float: left;
+ overflow: hidden;
+ width: 0;
+ margin: 0 4px;
+}
+
+#buddy-list .avatar-container {
+ float: left;
+ text-align: center;
+ margin: 3px;
+ width: 46px;
+ height: 46px;
+}
+
+#buddy-list .avatar {
+ max-width: 44px;
+ max-height: 44px;
+}
+
+#buddy-list .name {
+ margin: 4px 3px 5px 56px;
+}
+
+#buddy-list .buddy-name {
+ height: 17px;
+ font-weight: bold;
+ font-size: 0.8em;
+ color: #264249;
+ margin: 5px 0 5px 2px;
+ overflow: hidden;
+}
+
+#buddy-list .buddy.blocked p.buddy-name {
+ text-decoration: line-through;
+}
+
+#buddy-list .buddy-presence {
+ height: 14px;
+ font-size: 0.7em;
+ color: #3a585e;
+ padding: 2px 0 0 16px;
+ margin-top: -3px;
+}
+
+#buddy-list .unavailable,
+#page-switch .unavailable,
+#page-engine p.bc-infos span.show.unavailable {
+ background-position: 0 -153px;
+}
+
+#buddy-list .available,
+#page-engine p.bc-infos span.show.available,
+#page-engine .list .available,
+#page-engine .list .chat,
+#page-switch .available,
+#my-infos .f-presence a[data-value=available] span {
+ background-position: 0 -169px;
+}
+
+#buddy-list .away,
+#page-engine p.bc-infos span.show.away,
+#page-engine .list .away,
+#page-switch .away,
+#my-infos .f-presence a[data-value=away] span {
+ background-position: 0 -185px;
+}
+
+#buddy-list .busy,
+#page-engine p.bc-infos span.show.busy,
+#page-engine .list .xa,
+#page-engine .list .dnd,
+#page-switch .busy,
+#my-infos .f-presence a[data-value=xa] span {
+ background-position: 0 -201px;
+}
+
+#buddy-list .error,
+#page-switch .error,
+#page-engine p.bc-infos span.show.error {
+ background-position: 0 -217px;
+}
+
+#buddy-list .buddy-infos {
+ position: absolute;
+ z-index: 100;
+ width: 337px;
+ color: white;
+ font-size: 0.8em;
+}
+
+.buddy-infos-subarrow {
+ background-position: 0 -241px;
+ opacity: 0.8;
+ width: 9px;
+ height: 20px;
+ margin-top: 12px;
+ float: left;
+}
+
+.buddy-infos-subitem {
+ background-color: rgb(0,0,0);
+ background-color: rgba(0,0,0,0.8);
+ padding: 8px 10px;
+ width: 308px;
+ text-shadow: 0 1px 1px black;
+ float: left;
+ border-radius: 5px;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+}
+
+.manage-infos p.bm-authorize,
+#rosterx .oneresult span.action.add {
+ background-position: 0 -1181px;
+}
+
+.manage-infos p.bm-remove,
+#rosterx .oneresult span.action.delete,
+#attach div.one-file a.remove {
+ background-position: 0 -1200px;
+}
+
+.manage-infos p.bm-remove {
+ margin-bottom: 18px;
+}
+
+.manage-infos p.bm-rename {
+ background-position: 0 -1216px;
+}
+
+.manage-infos p.bm-group {
+ background-position: 0 -1241px;
+}
+
+.manage-infos div.bm-choose {
+ max-height: 95px;
+ margin: 0 0 8px 102px;
+ overflow: auto;
+}
+
+.manage-infos div.bm-choose label {
+ float: left;
+ clear: both;
+ margin-bottom: 1px;
+}
+
+.manage-infos div.bm-choose input {
+ float: left;
+}
+
+.manage-infos div.bm-choose input[type=checkbox] {
+ margin: 0 6px 0 0;
+}
+
+.manage-infos div.bm-choose div {
+ clear: both;
+}
+
+.manage-infos p.bm-rename,
+.manage-infos p.bm-group {
+ height: 26px;
+}
+
+.manage-infos p.bm-rename label,
+.manage-infos p.bm-group label {
+ width: 80px;
+ padding-top: 3px;
+ float: left;
+}
+
+.manage-infos p.bm-rename input,
+.manage-infos p.bm-group input {
+ float: left;
+ width: 155px;
+}
+
+.manage-infos a.save {
+ float: right;
+ margin: 4px;
+}
+
+.buddy-infos-subitem p {
+ margin: 6px 0;
+ padding-left: 22px;
+ height: 16px;
+ overflow: hidden;
+}
+
+.buddy-infos-subitem a {
+ color: white;
+ text-decoration: underline;
+}
+
+.tune-note {
+ background-position: 0 -676px;
+}
+
+.location-world {
+ background-position: 0 -658px;
+}
+
+.view-individual {
+ background-position: 0 -34px;
+}
+
+.edit-buddy {
+ background-position: 0 -1008px;
+}
+
+#buddy-list .filter {
+ background-color: white;
+ border-top: 1px solid #b8c2c4;
+ height: 15px;
+ padding: 2px 4px;
+ font-size: 0.8em;
+ border-bottom-left-radius: 3px;
+ border-bottom-right-radius: 3px;
+ -moz-border-radius-bottomleft: 3px;
+ -moz-border-radius-bottomright: 3px;
+ -webkit-border-bottom-left-radius: 3px;
+ -webkit-border-bottom-right-radius: 3px;
+}
+
+#buddy-list .filter input {
+ border: none;
+ color: #273a3f;
+ width: 211px;
+ padding: 0;
+ box-shadow: none;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+}
+
+#buddy-list .filter a {
+ display: none;
+ background-color: #9a2d2d;
+ color: white;
+ height: 13px;
+ width: 13px;
+ margin-top: 1px;
+ font-size: 0.8em;
+ text-align: center;
+ text-decoration: none;
+ float: right;
+ border-radius: 2px;
+ -moz-border-radius: 2px;
+ -webkit-border-radius: 2px;
+}
+
+#buddy-list .filter a:hover,
+#buddy-list .filter a:focus {
+ background-color: #8c2121;
+}
+
+#buddy-list .filter a:active {
+ background-color: #7e1919;
+}
+
+#buddy-list .foot {
+ padding: 9px 1px 3px;
+}
+
+#buddy-list .buddy-list-icon {
+ height: 16px;
+ width: 16px;
+ margin: -3px 5px 0 0;
+ float: left;
+}
+
+#buddy-list .buddy-list-icon a.talk-images {
+ height: 16px;
+ width: 16px;
+ display: block;
+}
+
+#buddy-list .add,
+#page-engine .text .tools-add {
+ background-position: 0 -1047px;
+}
+
+#buddy-list .join {
+ background-position: 0 -1065px;
+}
+
+#buddy-list .groupchat,
+#page-switch .groupchat-default {
+ background-position: 0 -1082px;
+}
+
+#buddy-list .more {
+ background-position: 0 -1100px;
+}
+
+#buddy-list .foot-edit-finish a {
+ color: white;
+ font-size: 0.8em;
+ margin: -3px 4px 0 0;
+ float: right;
+ display: block;
+}
+
+#buddy-list .foot-edit-finish a:hover,
+#buddy-list .foot-edit-finish a:focus {
+ text-decoration: underline;
+ cursor: pointer;
+}
+
+.buddy-conf-item {
+ position: absolute;
+ width: 263px;
+ color: white;
+ z-index: 9998;
+ text-align: left;
+ font-size: 0.8em;
+ margin-left: -10px;
+}
+
+.buddy-conf-item:hover {
+ cursor: default;
+}
+
+.buddy-conf-subarrow {
+ background-position: 0 -241px;
+ opacity: 0.8;
+ height: 10px;
+ width: 18px;
+ margin-left: 9px;
+}
+
+.buddy-conf-subitem {
+ background-color: rgb(0,0,0);
+ background-color: rgba(0,0,0,0.8);
+ padding: 10px;
+ text-shadow: 0 1px 1px black;
+ border-radius: 5px;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+}
+
+.buddy-conf-p {
+ margin-bottom: 4px;
+ width: 220px;
+ font-weight: bold;
+ float: left;
+}
+
+.buddy-conf-input {
+ padding-top: 2px;
+}
+
+.buddy-conf-text {
+ font-size: 11px;
+ clear: both;
+ margin-bottom: 3px;
+}
+
+.buddy-conf-text a {
+ color: white;
+}
+
+.buddy-conf-text a:hover,
+.buddy-conf-text a:focus {
+ cursor: pointer;
+ text-decoration: underline;
+}
+
+.buddy-conf-text a.buddy-conf-add-search {
+ text-decoration: underline;
+ margin-top: 6px;
+ display: block;
+}
+
+.buddy-conf-select {
+ font-size: 1.1em;
+ clear: both;
+ margin-bottom: 8px;
+ width: 180px;
+ height: 23px;
+}
+
+.join-jid {
+ width: 220px;
+ margin-top: 5px;
+}
+
+.add-contact-jid,
+.add-contact-name,
+.add-contact-gateway {
+ width: 156px;
+ margin-bottom: 4px;
+}
+
+.add-contact-name-get {
+ font-size: 0.8em;
+ display: none;
+}
+
+.buddy-conf-subitem label {
+ clear: both;
+}
+
+.buddy-conf-subitem label span {
+ width: 76px;
+ height: 14px;
+ margin-top: 3px;
+ overflow: hidden;
+ float: left;
+}
+
+#buddy-conf-join ul {
+ width: 224px;
+ max-height: 160px;
+ left: 10px;
+ top: 51px;
+}
+
+.buddy-conf-join-select {
+ margin: 8px 0 0 0;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the channel CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 26/08/11
+
+*/
+
+#channel .top div.update {
+ position: absolute;
+ top: 12px;
+ left: 115px;
+ right: 15px;
+ bottom: 15px;
+ border-radius: 20px;
+ -moz-border-radius: 20px;
+ -webkit-border-radius: 20px;
+}
+
+#channel .top p {
+ font-size: 0.9em;
+ margin-bottom: 10px;
+}
+
+#channel .top h2 {
+ font-size: 1.6em;
+ margin-bottom: 10px;
+ color: #232323;
+}
+
+#channel .top a {
+ font-size: 0.9em;
+ color: #232323;
+}
+
+#channel .top.individual div.update {
+ right: 36px;
+}
+
+#channel .top.individual div.shortcuts,
+#userinfos .main-infos div.shortcuts {
+ width: 16px;
+ float: right;
+}
+
+#channel .top.individual div.shortcuts {
+ margin: 2px 5px 0 0;
+}
+
+#channel .top.individual div.shortcuts a,
+#userinfos .main-infos div.shortcuts a {
+ height: 16px;
+ width: 16px;
+ margin-bottom: 4px;
+ display: block;
+}
+
+#channel .top.individual div.shortcuts a.message,
+#userinfos .main-infos a.message {
+ background-position: 0 -1717px;
+}
+
+#channel .top.individual div.shortcuts a.chat,
+#userinfos .main-infos a.chat {
+ background-position: 0 -1737px;
+}
+
+#channel .top.individual div.shortcuts a.command,
+#userinfos .main-infos a.command {
+ background-position: 0 -1758px;
+}
+
+#channel .microblog-body {
+ height: 20px;
+ margin-right: 50px;
+}
+
+#channel .microblog-body input {
+ width: 100%;
+ height: 100%;
+ padding: 8px;
+}
+
+#channel .one-microblog-icon {
+ position: absolute;
+ top: 38px;
+ right: 0;
+}
+
+#channel div.update .one-microblog-icon,
+#channel div.update .postit {
+ width: 16px;
+ height: 16px;
+ display: block;
+}
+
+#channel div.update .attach {
+ background-position: 0 -79px;
+ display: none;
+}
+
+#attach {
+ position: absolute;
+ width: 263px;
+ margin-left: -227px;
+ color: white;
+ font-size: 0.85em;
+ z-index: 9998;
+ text-align: left;
+ display: none;
+}
+
+#attach p {
+ margin-bottom: 6px !important;
+}
+
+#attach input[type=submit] {
+ margin: 8px 0 6px 0;
+}
+
+#attach .wait {
+ float: right;
+ margin: 7px 5px;
+}
+
+#attach div.one-file {
+ height: 16px;
+ margin-top: 2px;
+}
+
+#attach div.one-file a.link {
+ color: white;
+ width: 215px;
+ height: 14px;
+ margin-left: 2px;
+ overflow: hidden;
+ float: left;
+}
+
+#attach div.one-file a.remove {
+ width: 16px;
+ height: 16px;
+ float: left;
+}
+
+.attach-subarrow {
+ background-position: 0 -241px;
+ opacity: 0.8;
+ height: 10px;
+ width: 18px;
+ margin-left: 226px;
+}
+
+.attach-subitem {
+ background-color: rgb(0,0,0);
+ background-color: rgba(0,0,0,0.8);
+ padding: 10px;
+ text-shadow: 0 1px 1px black;
+ border-radius: 5px;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+}
+
+.attach-p {
+ font-weight: bold;
+ float: left;
+}
+
+#channel .one-update {
+ margin-bottom: 12px;
+ padding: 6px 6px 8px 6px;
+ border-bottom: 1px dotted #d0d0d0;
+ min-height: 50px;
+ color: black;
+ position: relative;
+ display: none;
+}
+
+#channel .one-update .avatar-container {
+ text-align: center;
+ margin-right: 16px;
+ float: left;
+ height: 50px;
+ width: 50px;
+}
+
+#channel .one-update .avatar-container:hover {
+ cursor: pointer;
+}
+
+#channel .one-update img.avatar {
+ max-height: 50px;
+ max-width: 50px;
+}
+
+#channel .one-update div.body {
+ margin-left: 65px;
+ opacity: 0.8;
+}
+
+#channel .one-update:hover div.body {
+ opacity: 1;
+}
+
+#channel .one-update a.repeat {
+ background-position: 0 -1681px;
+ height: 16px;
+ width: 16px;
+ margin-right: 4px;
+ float: left;
+}
+
+#channel .one-update span a {
+ text-decoration: underline;
+}
+
+#channel .one-update p {
+ display: block;
+ margin: 0 12px 5px 0;
+}
+
+#channel .one-update p b.name:hover {
+ cursor: pointer;
+ text-decoration: underline;
+}
+
+#channel .one-update p.infos {
+ font-size: 0.9em;
+}
+
+#channel .one-update p.infos a.geoloc {
+ background-position: 0 -1778px;
+ color: #363636;
+ margin-left: 18px;
+ padding-left: 14px;
+}
+
+#channel .one-update p.infos a.geoloc:hover,
+#channel .one-update p.infos a.geoloc:focus,
+#channel .one-update p.infos a.geoloc:active {
+ color: #141414;
+}
+
+#channel .one-update p.file {
+ font-size: 0.9em;
+ margin: 6px 0 5px 10px;
+}
+
+#channel .one-update p.file a.link,
+#inbox .inbox-new-file a.file {
+ min-height: 16px;
+ padding-left: 22px;
+ text-decoration: underline;
+ display: block;
+}
+
+#channel .one-update p.file a.link {
+ margin-top: 4px;
+}
+
+#channel p.file a,
+#inbox .inbox-new-file a.file {
+ background-position: 0 -988px;
+}
+
+#channel p.file a.audio,
+#inbox .inbox-new-file a.file.audio {
+ background-position: 0 -899px;
+}
+
+#channel p.file a.image,
+#inbox .inbox-new-file a.file.image {
+ background-position: 0 -917px;
+}
+
+#channel p.file a.video,
+#inbox .inbox-new-file a.file.video {
+ background-position: 0 -935px;
+}
+
+#channel p.file a.document,
+#inbox .inbox-new-file a.file.document {
+ background-position: 0 -953px;
+}
+
+#channel p.file a.package,
+#inbox .inbox-new-file a.file.package {
+ background-position: 0 -971px;
+}
+
+#channel .one-update p.file a.thumb img {
+ border: 1px solid #a2a2a2;
+ max-width: 140px;
+ max-height: 105px;
+ margin: 4px 10px 2px 0;
+ padding: 1px;
+}
+
+#channel .one-update p.file a.thumb img:hover {
+ border-color: #464646;
+}
+
+#channel .one-update div.comments,
+.popup.large div.comments {
+ width: 410px;
+ margin: 2px 0 2px 76px;
+}
+
+#channel .one-update div.comments div.arrow,
+.popup.large div.comments div.arrow {
+ background-position: 0 -1702px;
+ width: 20px;
+ height: 8px;
+ margin-left: 20px;
+ display: block;
+}
+
+#channel .one-update div.comments div.comments-content,
+.popup.large div.comments div.comments-content {
+ background-color: #e5ebec;
+ color: black;
+ font-size: 0.9em;
+ text-shadow: 0 1px 0 white;
+}
+
+#channel .one-update div.comments input,
+.popup.large div.comments input {
+ width: 356px;
+ margin: 6px 0;
+ padding: 4px 5px;
+}
+
+#channel .one-update div.comments span.icon,
+.popup.large div.comments span.icon {
+ background-position: 0 -1082px;
+ height: 16px;
+ width: 16px;
+ margin: 10px;
+ float: left;
+}
+
+#channel .one-update div.comments .one-comment.loading span.icon,
+.popup.large div.comments .one-comment.loading span.icon {
+ margin: 0 10px 0 0;
+}
+
+#channel .one-update div.comments .one-comment,
+.popup.large div.comments .one-comment {
+ border-bottom: 1px solid #f4f4f4;
+ padding: 4px 8px 0px 8px;
+ position: relative;
+ display: block;
+}
+
+#channel .one-update div.comments .one-comment.compose,
+.popup.large div.comments .one-comment.compose {
+ border-bottom: 2px solid #f4f4f4;
+ height: 36px;
+ padding: 0;
+}
+
+#channel .one-update div.comments .one-comment.new,
+.popup.large div.comments .one-comment.new {
+ display: none;
+}
+
+#channel .one-update div.comments a.one-comment,
+.popup.large div.comments a.one-comment {
+ text-decoration: none;
+}
+
+#channel .one-update div.comments a.one-comment:hover,
+#channel .one-update div.comments a.one-comment:focus,
+.popup.large div.comments a.one-comment:hover,
+.popup.large div.comments a.one-comment:focus {
+ text-decoration: underline;
+}
+
+#channel .one-update div.comments .one-comment.loading,
+.popup.large div.comments .one-comment.loading {
+ padding-bottom: 5px;
+}
+
+#channel .one-update div.comments .one-comment div.marker,
+.popup.large div.comments .one-comment div.marker {
+ background-color: #6d8387;
+ width: 2px;
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+}
+
+#channel .one-update div.comments .one-comment .avatar-container,
+.popup.large div.comments .one-comment .avatar-container {
+ text-align: center;
+ width: 30px;
+ height: 30px;
+ margin: 2px 8px 0 0;
+ float: left;
+}
+
+#channel .one-update div.comments .one-comment .avatar-container:hover,
+.popup.large div.comments .one-comment .avatar-container:hover {
+ cursor: pointer;
+}
+
+#channel .one-update div.comments .one-comment img.avatar,
+.popup.large div.comments .one-comment img.avatar {
+ max-height: 30px;
+ max-width: 30px;
+}
+
+#channel .one-update div.comments .one-comment .comment-container,
+.popup.large div.comments .one-comment .comment-container {
+ float: left;
+}
+
+#channel .one-update div.comments .one-comment a.name,
+.popup.large div.comments .one-comment a.name {
+ font-weight: bold;
+ text-decoration: none;
+ font-size: 0.95em;
+ padding-bottom: 2px;
+ float: left;
+}
+
+#channel .one-update div.comments .one-comment a.name:hover,
+#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:focus {
+ text-decoration: underline;
+}
+
+#channel .one-update div.comments .one-comment span.date,
+#channel .one-update div.comments .one-comment a.remove,
+.popup.large div.comments .one-comment span.date,
+.popup.large div.comments .one-comment a.remove {
+ font-size: 0.85em;
+ float: right;
+}
+
+#channel .one-update div.comments .one-comment.me:hover span.date,
+.popup.large div.comments .one-comment.me:hover span.date {
+ display: none;
+}
+
+#channel .one-update div.comments .one-comment.me a.remove,
+.popup.large div.comments .one-comment.me a.remove {
+ display: none;
+}
+
+#channel .one-update div.comments .one-comment.me:hover a.remove,
+.popup.large div.comments .one-comment.me:hover a.remove {
+ display: block;
+}
+
+#channel .one-update div.comments .one-comment p.body,
+.popup.large div.comments .one-comment p.body {
+ clear: both;
+}
+
+#channel a.more {
+ background-position: 0 -334px;
+ color: black;
+ height: 16px;
+ text-decoration: none;
+ margin: -2px 0 0 4px;
+ padding: 0 0 14px 20px;
+ display: block;
+ visibility: hidden;
+}
+
+#channel a.more:hover,
+#channel a.more:focus {
+ text-decoration: underline;
+}
+
+#channel a.mbtool {
+ width: 11px;
+ height: 11px;
+ display: none;
+ position: absolute;
+ right: 0;
+}
+
+#channel .one-update:hover a.mbtool {
+ display: block;
+}
+
+#channel a.mbtool:hover,
+#channel a.mbtool:focus {
+ text-decoration: none;
+}
+
+#channel a.mbtool.profile {
+ background-position: -1px -1333px;
+ top: 24px;
+}
+
+#channel a.mbtool.repost {
+ background-position: -1px -1354px;
+}
+
+#channel a.mbtool.remove {
+ background-position: -1px -1312px;
+}
+
+#channel a.mbtool.repost,
+#channel a.mbtool.remove {
+ top: 6px;
+}
+
+#channel .footer {
+ bottom: 0;
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ -moz-border-radius-bottomleft: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+}
+
+#channel .footer div {
+ margin-left: 5px;
+ padding-left: 24px;
+ min-height: 16px;
+ font-size: 0.85em;
+ width: auto !important;
+}
+
+#channel .footer .sync {
+ background-position: 0 -804px;
+ display: none;
+}
+
+#channel .footer .unsync {
+ background-position: 0 -830px;
+ display: none;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the directory tool CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 13/02/11
+
+*/
+
+#directory .content {
+ padding: 10px 0 10px 0;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the discovery CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 13/02/11
+
+*/
+
+#discovery .content {
+ padding: 10px 0 10px 0;
+}
+
+#discovery .content p {
+ margin: 5px 10px 5px 10px;
+ text-align: justify;
+ font-size: 0.85em;
+}
+
+#discovery .discovery-head,
+#directory .directory-head,
+#rosterx .rosterx-head,
+#privacy .privacy-head {
+ width: 606px;
+ height: 24px;
+ margin: 0 10px 10px 10px;
+ padding: 6px;
+ background: #f1f6fd;
+ border: 1px #9dc4fc solid;
+}
+
+#discovery .disco-server-text,
+#directory .directory-server-text {
+ float: left;
+ font-size: 0.9em;
+ margin: 3px;
+}
+
+#discovery .disco-server-input,
+#directory .directory-server-input {
+ float: right;
+ width: 200px;
+ padding: 2px;
+ height: 18px;
+ float: right;
+ margin-right: 10px;
+ padding: 2px;
+}
+
+#discovery .disco-category {
+ display: none;
+ margin-bottom: 22px;
+}
+
+#discovery .disco-category-title {
+ font-weight: bold;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the favorites CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 28/12/10
+
+*/
+
+#favorites .content {
+ padding: 10px 0 10px 0;
+}
+
+#favorites .fedit-head-select {
+ min-width: 190px;
+ max-width: 210px;
+}
+
+#favorites .switch-fav {
+ margin: 0 10px 0 10px;
+ width: 200px;
+ height: 355px;
+ border-right: 1px #c0c0c0 dotted;
+ float: left;
+}
+
+#favorites .room-switcher {
+ width: 188px;
+ height: 18px;
+ border-bottom: 1px #9dc4fc solid;
+ float: left;
+ padding: 10px 6px;
+ font-size: 0.9em;
+}
+
+#favorites .room-switcher:hover {
+ background-color: #e9f1fd;
+ cursor: pointer;
+}
+
+#favorites .room-switcher:active {
+ background-color: #f1f6fd;
+}
+
+#favorites .switch-fav .icon {
+ float: left;
+ height: 16px;
+ width: 16px;
+ margin: 0 8px 0 0;
+}
+
+#favorites .switch-fav .room-list .list-icon {
+ background-position: 0 -855px;
+}
+
+#favorites .switch-fav .room-search .search-icon {
+ background-position: 0 -876px;
+}
+
+#favorites .static-fav {
+ width: 385px;
+ height: 335px;
+ margin: 0 10px 0 0;
+ padding: 10px;
+ float: right;
+}
+
+#favorites .favorites-search {
+ display: none;
+}
+
+#favorites .static-fav-head {
+ width: 393px;
+ margin: -10px;
+}
+
+#favorites .static-fav-results {
+ width: 406px;
+ height: 314px;
+ margin: 10px -10px -10px -10px;
+ padding: 6px 0 0 0;
+}
+
+#favorites .fedit-line {
+ height: 30px;
+ font-size: 0.9em;
+ padding: 10px 0 4px 4px;
+ border-bottom: 1px #9dc4fc solid;
+}
+
+#favorites .fedit-line:hover {
+ background: #e9f1fd;
+}
+
+#favorites label {
+ width: 140px;
+ margin-top: 3px;
+}
+
+#favorites input {
+ height: 18px;
+ width: 186px;
+ margin-top: 0;
+ padding: 2px;
+}
+
+#favorites .fedit-select {
+ min-width: 160px;
+}
+
+#favorites .fedit-actions {
+ margin: 10px 0 0;
+ font-size: 0.9em;
+ float: right;
+}
+
+#favorites input[type=checkbox] {
+ margin-top: 5px;
+}
+
+#favorites .fedit-terminate {
+ float: right;
+}
+
+#favorites .fedit-add {
+ display: block;
+}
+
+#favorites .fedit-edit {
+ background-position: 2px -1240px;
+}
+
+#favorites .fedit-remove {
+ margin: 0 8px 0 0;
+}
+
+#favorites .add,
+.popup .results .one-button.one-add {
+ background-position: 3px -1177px;
+}
+
+#favorites .remove,
+#inbox .remove {
+ background-position: 3px -1196px;
+}
+
+#favorites .join,
+#inbox .reply,
+#inbox .send,
+.popup .results .one-button.one-chat {
+ background-position: 3px -124px;
+}
+
+#favorites .one-button,
+#inbox .one-button,
+.popup .results .one-button {
+ padding-left: 20px !important;
+ font-size: 0.98em;
+}
+
+#favorites .fsearch-results {
+ overflow: auto;
+}
+
+#favorites .room-name {
+ margin: 4px 2px 5px;
+ max-width: 210px;
+ float: left;
+}
+
+#favorites .fsearch-noresults {
+ display: none;
+ font-size: 0.9em;
+ font-weight: bold;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the home CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 15/01/12
+
+*/
+
+#home {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ min-height: 550px;
+ min-width: 875px;
+}
+
+#home .corporation,
+#home .corporation .corp_network,
+#home .locale,
+#home .obsolete {
+ background-color: rgb(20,20,20);
+ background-color: rgba(20,20,20,0.70);
+ color: white;
+ position: absolute;
+ top: 0;
+ text-shadow: 0 0 1px black;
+ z-index: 100;
+ border-bottom-left-radius: 3px;
+ border-bottom-right-radius: 3px;
+ -moz-border-radius-bottomleft: 3px;
+ -moz-border-radius-bottomright: 3px;
+ -webkit-border-bottom-left-radius: 3px;
+ -webkit-border-bottom-right-radius: 3px;
+}
+
+#home .corporation {
+ background-position: 9px -357px;
+ left: 12px;
+ height: 26px;
+ width: 34px;
+}
+
+#home .corporation.hovered {
+ height: 28px;
+ border-radius: 0;
+ -moz-border-radius: 0;
+ -webkit-border-radius: 0;
+}
+
+#home .corporation .corp_network {
+ width: 180px;
+ padding: 10px 12px;
+ top: 28px;
+ display: none;
+ border-top-right-radius: 3px;
+ -moz-border-radius-topright: 3px;
+ -webkit-border-top-right-radius: 3px;
+}
+
+#home .corporation.hovered .corp_network {
+ display: block;
+}
+
+#home .corporation .corp_network h2 {
+ font-size: 1.1em;
+ margin: 14px 0 4px 0;
+}
+
+#home .corporation .corp_network h2.nomargin {
+ margin-top: 0;
+}
+
+#home .corporation .corp_network a {
+ font-size: 0.8em;
+ margin: 2px 0;
+ padding: 2px 6px;
+ border-radius: 2px;
+ -moz-border-radius: 2px;
+ -webkit-border-radius: 2px;
+}
+
+#home .corporation .corp_network a span {
+ margin: 2px 0;
+ display: block;
+}
+
+#home .corporation .corp_network a span.name {
+ font-weight: bold;
+}
+
+#home .corporation .corp_network a span.desc {
+ font-size: 0.9em;
+ margin-left: 2px;
+}
+
+#home .locale {
+ left: 52px;
+ font-size: 0.8em;
+}
+
+#home .locale .current {
+ height: 19px;
+ padding: 3px 12px 4px 12px;
+ font-weight: bold;
+}
+
+#home .locale .current:hover {
+ cursor: default;
+}
+
+#home .locale .current .current_align {
+ height: 19px;
+ vertical-align: middle;
+ display: table-cell;
+}
+
+#home .locale .list {
+ margin: 2px 0 2px;
+}
+
+#home .locale .list a,
+#home .corporation .corp_network a {
+ color: white;
+ text-decoration: none;
+ display: block;
+}
+
+#home .locale .list a {
+ padding: 3px 10px;
+}
+
+#home .locale .list a:hover,
+#home .locale .list a:focus,
+#home .corporation .corp_network a:hover,
+#home .corporation .corp_network a:focus {
+ background-color: rgb(255,255,255);
+ background-color: rgba(255,255,255,0.1);
+ cursor: pointer;
+}
+
+#home .locale .list a:active,
+#home .corporation .corp_network a:active {
+ background-color: rgb(255,255,255);
+ background-color: rgba(255,255,255,0.14);
+}
+
+#home .obsolete {
+ height: 60px;
+ padding: 4px 10px;
+ right: 12px;
+ font-size: 0.9em;
+ font-weight: bold;
+ display: none;
+}
+
+#home .obsolete a {
+ height: 33px;
+ width: 33px;
+ margin: 5px 2px 0 0;
+ float: left;
+}
+
+#home .obsolete a:hover,
+#home .obsolete a:focus {
+ opacity: 0.8;
+}
+
+#home .obsolete a:active {
+ opacity: 0.6;
+}
+
+#home .obsolete a.firefox {
+ background-position: 1px 0;
+}
+
+#home .obsolete a.chrome {
+ background-position: -34px 0;
+}
+
+#home .obsolete a.safari {
+ background-position: -68px 0;
+}
+
+#home .obsolete a.opera {
+ background-position: -101px 0;
+}
+
+#home .obsolete a.ie {
+ background-position: -135px 0;
+}
+
+#home .plane {
+ background-position: 0 -384px;
+ width: 507px;
+ height: 328px;
+ position: absolute;
+ left: 0;
+ top: 60px;
+}
+
+#home .main {
+ background-color: rgb(20,20,20);
+ background-color: rgba(20,20,20,0.85);
+ position: absolute;
+ top: 50%;
+ margin-top: -200px;
+ width: 800px;
+ height: 400px;
+ left: 50%;
+ margin-left: -400px;
+ z-index: 50;
+ border-radius: 10px;
+ -moz-border-radius: 10px;
+ -webkit-border-radius: 10px;
+ box-shadow: 0 0 35px #5c5c5c;
+ -moz-box-shadow: 0 0 35px #5c5c5c;
+ -webkit-box-shadow: 0 0 35px #5c5c5c;
+}
+
+#home .left {
+ float: left;
+ width: 350px;
+ height: 370px;
+ margin: 15px 0 15px 15px;
+ color: white;
+ text-align: center;
+ text-shadow: 0 1px 1px black;
+}
+
+#home .left .logo {
+ background-position: 0 0;
+ float: left;
+ margin: 30px 20px;
+ width: 311px;
+ height: 113px;
+}
+
+#home .left p.upper {
+ margin: 12px 0 20px 0;
+}
+
+#home .left p.secondary {
+ margin: 8px 0 0 16px;
+ font-size: 0.9em;
+ width: 320px;
+}
+
+#home .right {
+ background: #e4eef9;
+ background: -moz-linear-gradient(top, #e4eef9, #C5E1FF);
+ background: -webkit-gradient(linear, left top, left bottom, from(#e4eef9), to(#C5E1FF));
+ float: right;
+ width: 385px;
+ height: 350px;
+ margin: 15px 15px 15px 0;
+ padding: 10px;
+ font-size: 13px;
+ text-align: justify;
+ border-radius: 5px;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ box-shadow: 0 0 20px black;
+ -moz-box-shadow: 0 0 20px black;
+ -webkit-box-shadow: 0 0 20px black;
+}
+
+#home .right h1 {
+ font-size: 16px;
+ padding-bottom: 4px;
+ border-bottom: 1px black dotted;
+}
+
+#home .right p {
+ margin-bottom: 4px;
+}
+
+#home .right p a {
+ border-width: 0 0 1px 0;
+ border-style: dotted;
+ border-color: black;
+}
+
+#home .right p a:hover,
+#home .right p a:focus {
+ border-style: solid;
+ text-decoration: none;
+}
+
+#home .right button {
+ display: block;
+ margin-left: 22px;
+ width: 342px;
+ height: 64px;
+ text-decoration: none;
+ font-weight: bold;
+ border-radius: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+}
+
+#home .right button:hover {
+ cursor: pointer;
+}
+
+#home .right button span {
+ float: left;
+}
+
+#home .right button span.home-images {
+ height: 16px;
+ width: 16px;
+ margin: 5px 7px 7px 24px;
+}
+
+#home .right button span.text {
+ padding-left: 20px;
+ font-size: 1.5em;
+}
+
+#home .right .login {
+ background-color: #72d071;
+ background-position: 0 0;
+ border: 1px solid #5cb55c;
+ margin-top: 22px;
+ box-shadow: 0 0 10px #89e389;
+ -moz-box-shadow: 0 0 10px #89e389;
+ -webkit-box-shadow: 0 0 10px #89e389;
+}
+
+#home .right .login:hover,
+#home .right .login:focus {
+ border: 1px solid #419141;
+ box-shadow: 0 0 15px #72d071;
+ -moz-box-shadow: 0 0 15px #72d071;
+ -webkit-box-shadow: 0 0 15px #72d071;
+}
+
+#home .right .login:active {
+ background-color: #97e896;
+ background-position: 0 -80px;
+}
+
+#home .right .login span.text {
+ color: #2d612d;
+ text-shadow: 1px 1px 1px #5cb55c;
+}
+
+#home .right .login span.home-images {
+ background-position: 0 -230px;
+}
+
+#home .right .register {
+ background-color: #f6ef82;
+ background-position: 0 -160px;
+ border: 1px solid #e3db56;
+ margin-top: 15px;
+ box-shadow: 0 0 15px #f1e968;
+ -moz-box-shadow: 0 0 15px #f1e968;
+ -webkit-box-shadow: 0 0 15px #f1e968;
+}
+
+#home .right .register:hover,
+#home .right .register:focus {
+ border: 1px solid #d2c93f;
+ box-shadow: 0 0 15px #e0d743;
+ -moz-box-shadow: 0 0 15px #e0d743;
+ -webkit-box-shadow: 0 0 15px #e0d743;
+}
+
+#home .right .register:active {
+ background-color: #fdf7af;
+ background-position: 0 -240px;
+}
+
+#home .right .register span.text {
+ color: #6d6813;
+ text-shadow: 1px 1px 1px #dbd56e;
+}
+
+#home .right .register span.home-images {
+ background-position: 0 -204px;
+}
+
+#home .right p.notice {
+ margin-top: 24px;
+ font-size: 0.9em;
+}
+
+#home .right .navigation {
+ clear: both;
+ width: 385px;
+ border-top: 1px black dotted;
+ position: absolute;
+ text-align: right;
+ bottom: 25px;
+ right: 25px;
+ padding-top: 6px;
+}
+
+#home .right .navigation a {
+ margin-left: 9px;
+ color: black;
+ text-decoration: none;
+ font-size: 0.9em;
+ height: 12px;
+ padding: 0 0 4px 20px;
+ float: right;
+}
+
+#home .right .navigation a:hover,
+#home .right .navigation a:focus {
+ text-decoration: underline;
+}
+
+#home .right .navigation a.unencrypted {
+ background-position: 0 -256px;
+}
+
+#home .right .navigation a.encrypted {
+ background-position: 0 -282px;
+}
+
+#home .right .navigation a.project {
+ background-position: 0 -126px;
+}
+
+#home .right .navigation a.manager {
+ background-position: 0 -152px;
+}
+
+#home .right .navigation a.mobile {
+ background-position: 0 -178px;
+}
+
+#home a.advanced {
+ background-position: 0 -334px;
+ font-size: 0.9em;
+ height: 16px;
+ margin-bottom: 10px;
+ padding-left: 16px;
+ display: block;
+}
+
+#home fieldset.advanced {
+ display: none;
+}
+
+#home .anonymouser input[type=text] {
+ width: 160px;
+}
+
+#home .homediv.registerer .success a {
+ font-weight: bold;
+ text-decoration: underline;
+}
+
+#home fieldset {
+ border: 1px solid black;
+ margin: 12px 0 12px 0;
+ padding: 5px 0 4px 0;
+ border-radius: 3px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+}
+
+#home legend {
+ font-size: 0.9em;
+ margin: 0 0 0 15px;
+ padding: 0 2px;
+ text-transform: uppercase;
+}
+
+#home label {
+ width: 110px;
+ display: block;
+ float: left;
+ clear: both;
+ margin: 0 0 5px 12px;
+}
+
+#home input,
+#home select {
+ float: left;
+ margin-bottom: 5px;
+}
+
+#home input[type=text],
+#home input[type=password],
+#home select {
+ width: 140px;
+ margin-top: -2px;
+}
+
+#home input[type=submit] {
+ min-width: 120px;
+ float: right;
+}
+
+#home span.jid {
+ display: block;
+ float: left;
+ margin: 0 4px;
+}
+
+#home input.nick, #home input.server {
+ width: 110px;
+}
+
+#home .info {
+ padding: 6px;
+ position: absolute;
+ bottom: 62px;
+ right: 35px;
+ border-width: 1px;
+ border-style: dotted;
+ clear: both;
+ width: 350px;
+}
+
+#home .info.success {
+ background-color: #aee578;
+ border-color: #85b05c;
+ display: none;
+}
+
+#home .info.fail {
+ background-color: #f19d9d;
+ border-color: #b34f4f;
+}
+
+#home .info.report {
+ background-color: #f3f48b;
+ border-color: #c9c66b;
+ display: none;
+}
+
+#home .info.report span {
+ text-decoration: underline;
+}
+
+#home .notice.simple {
+ background-color: rgb(20,20,20);
+ background-color: rgba(20,20,20,0.7);
+ color: white;
+ font-size: 0.9em;
+ text-decoration: none;
+ text-shadow: 0 1px 0 black;
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ padding: 8px 20px;
+ z-index: 100;
+ box-shadow: 0 0 25px #ababab;
+ -moz-box-shadow: 0 0 25px #ababab;
+ -webkit-box-shadow: 0 0 25px #ababab;
+}
+
+#home .notice.simple .title {
+ background-color: rgb(20,20,20);
+ background-color: rgba(20,20,20,0.4);
+ background-position: 8px -299px;
+ border-width: 0 1px 1px 1px;
+ border-style: solid;
+ border-color: #141414;
+ font-weight: bold;
+ padding: 8px 8px 8px 30px;
+}
+
+#home .notice.simple .text {
+ margin-left: 20px;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are all the IE compliant CSS classes
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 22/04/11
+
+*/
+
+/* rgba(255,255,255,0.9) */
+.search ul {
+ background: transparent;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#edffffff,endColorstr=#edffffff);
+}
+
+/* rgba(255,255,255,0.3) */
+a.finish:active,
+#manager-buttons input:active,
+#install-buttons input:active {
+ background: transparent;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#49ffffff,endColorstr=#49ffffff);
+}
+
+/* rgba(255,255,255,0.2) */
+a.finish:hover,
+a.finish:focus,
+#manager-buttons input:hover,
+#manager-buttons input:focus,
+#install-buttons input:hover,
+#install-buttons input:focus,
+.notifications-content .one-notification:active {
+ background: transparent;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#33ffffff,endColorstr=#33ffffff);
+}
+
+/* rgba(255,255,255,0.14) */
+#home .locale .list a:active {
+ background: transparent;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#2fffffff,endColorstr=#2fffffff);
+}
+
+/* rgba(255,255,255,0.1) */
+#home .locale .list a:hover,
+#home .locale .list a:focus,
+a.finish,
+a.finish.disabled:hover,
+a.finish.disabled:focus,
+a.finish.disabled:active,
+#manager-buttons input,
+#install-buttons input,
+.notifications-content .one-notification:hover,
+.notifications-content .one-notification:focus {
+ background: transparent;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#20ffffff,endColorstr=#20ffffff);
+}
+
+/* rgba(255,239,104,0.8) */
+.popup .infos {
+ background: transparent;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#deffef68,endColorstr=#deffef68);
+}
+
+/* rgba(225,160,20,0.3) */
+.search ul li.hovered {
+ background: transparent;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#46e1a014,endColorstr=#46e1a014);
+}
+
+/* rgba(248,246,186,0.9) */
+#board .one-board.info {
+ background: transparent;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#edf8f6ba,endColorstr=#edf8f6ba);
+}
+
+/* rgba(241,160,160,0.9) */
+#board .one-board.error {
+ background: transparent;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#edf1a0a0,endColorstr=#edf1a0a0);
+}
+
+/* rgba(234,234,234,0.8) */
+#page-engine .chatstate {
+ background: transparent;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#deeaeaea,endColorstr=#deeaeaea);
+}
+
+/* rgba(20,20,20,0.6) */
+#home .locale,
+#home .obsolete,
+#home .notice.simple {
+ background: transparent;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#a0141414,endColorstr=#a0141414);
+}
+
+/* rgba(20,20,20,0.8) */
+#home .main,
+#reconnect .pane,
+#my-infos,
+#right-content,
+#buddy-list,
+#manager,
+#install {
+ background: transparent;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#de141414,endColorstr=#de141414);
+}
+
+/* rgba(20,20,20,0.9) */
+.popup {
+ background: transparent;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ed141414,endColorstr=#ed141414);
+}
+
+/* rgba(0,0,0,0.2) */
+#install-top .step {
+ background: transparent;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#33000000,endColorstr=#33000000);
+}
+
+/* rgba(0,0,0,0.6) */
+.lock {
+ background: url(../img/others/lock.png) repeat !important;
+}
+
+/* rgba(0,0,0,0.8) */
+#page-engine .tooltip-subitem,
+.attach-subitem,
+.buddy-infos-subitem,
+.buddy-conf-subitem,
+.tools-content-subitem {
+ background: transparent;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#de000000,endColorstr=#de000000);
+}
+
+/* Fix a fieldset padding bug */
+legend {
+ margin-bottom: 5px !important;
+}
+
+/* Fix an opacity bug */
+a.finish.disabled {
+ filter: alpha(opacity = 20) !important;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the images CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 16/01/12
+
+*/
+
+.body-images {
+ background-image: url(../img/sprites/background.png);
+ background-repeat: repeat;
+ background-color: #93c5fa;
+}
+
+.install-images {
+ background-image: url(../img/sprites/install.png);
+ background-repeat: no-repeat;
+}
+
+.home-images {
+ background-image: url(../img/sprites/home.png);
+ background-repeat: no-repeat;
+}
+
+.browsers-images {
+ background-image: url(../img/sprites/browsers.png);
+ background-repeat: no-repeat;
+}
+
+.buttons-images {
+ background-image: url(../img/sprites/buttons.png);
+ background-repeat: repeat-x;
+}
+
+.talk-images {
+ background-image: url(../img/sprites/talk.png);
+ background-repeat: no-repeat;
+}
+
+.smileys-images {
+ background-image: url(../img/sprites/smileys.png);
+ background-repeat: no-repeat;
+}
+
+.welcome-images {
+ background-image: url(../img/sprites/welcome.png);
+ background-repeat: no-repeat;
+}
+
+.me-images {
+ background-image: url(../img/sprites/me.png);
+ background-repeat: no-repeat;
+}
+
+.manager-images {
+ background-image: url(../img/sprites/manager.png);
+ background-repeat: no-repeat;
+}
+
+.mobile-images {
+ background-image: url(../img/sprites/mobile.png);
+ background-repeat: no-repeat;
+}
+
+.wait-small {
+ background-image: url(../img/wait/wait-small.gif);
+ background-repeat: no-repeat;
+ height: 16px;
+ width: 16px;
+}
+
+.wait-medium {
+ background-image: url(../img/wait/wait-medium.png);
+ background-repeat: no-repeat;
+ height: 24px;
+ width: 24px;
+}
+
+.wait-big {
+ background-image: url(../img/wait/wait-big.gif);
+ background-repeat: no-repeat;
+ height: 30px;
+ width: 30px;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the inbox CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 28/12/10
+
+*/
+
+#inbox .content {
+ padding: 10px 0 10px 0;
+}
+
+#inbox .content p {
+ margin: 3px 10px;
+ text-align: justify;
+ font-size: 0.9em;
+}
+
+#inbox .inbox-results {
+ height: 310px;
+ width: 620px;
+ margin: -5px 0 0 10px;
+ padding: 6px 0 0 0;
+ overflow: auto;
+}
+
+#inbox .message-unread {
+ background-color: #E9F1FD;
+}
+
+#inbox .one-message {
+ font-size: 0.9em;
+ border-bottom: 1px #b2c7cb solid;
+}
+
+#inbox .message-head {
+ padding: 6px 0 7px 4px;
+ overflow: hidden;
+}
+
+#inbox .message-head:hover {
+ background-color: #e9f1fd;
+ cursor: pointer;
+}
+
+#inbox .message-head:active {
+ background-color: #f1f6fd;
+}
+
+#inbox .one-message.message-reading,
+#inbox .one-message.message-reading .message-head {
+ background-color: #f1f6fd;
+}
+
+#inbox .avatar-container {
+ float: left;
+ width: 40px;
+ height: 40px;
+ margin-right: 7px;
+ text-align: center;
+ background-repeat: no-repeat;
+}
+
+#inbox .avatar {
+ max-width: 40px;
+ max-height: 40px;
+}
+
+#inbox .message-jid,
+#inbox .message-subject {
+ float: left;
+ margin: 0 2px;
+ overflow: hidden;
+}
+
+#inbox .message-jid {
+ width: 165px;
+ font-weight: bold;
+}
+
+#inbox .message-subject {
+ width: 355px;
+}
+
+#inbox .message-truncated {
+ color: #42646b;
+ font-size: 0.8em;
+ margin: 23px 0 0 49px;
+}
+
+#inbox .message-body {
+ padding: 8px 5px 5px 5px;
+}
+
+#inbox .message-body a {
+ text-decoration: underline;
+}
+
+#inbox .message-meta {
+ margin-top: 6px;
+ padding: 3px 4px;
+ border-top: 1px #b2c7cb dotted;
+}
+
+#inbox .message-meta span.date {
+ color: #28474e;
+ font-size: 0.8em;
+ margin: 10px 0 0 4px;
+ float: left;
+}
+
+#inbox .message-meta a {
+ font-size: 0.98em;
+ margin: 5px;
+ float: right;
+ display: block;
+}
+
+#inbox .inbox-noresults {
+ font-weight: bold;
+ display: none;
+}
+
+#inbox .a-show-messages {
+ display: none;
+}
+
+#inbox .inbox-new {
+ display: none;
+ height: 300px;
+ width: 620px;
+ margin: -5px 0 0 10px;
+ padding: 16px 0 0 0;
+}
+
+#inbox .inbox-new-block {
+ border-top: 1px #686868 dotted;
+ padding-top: 9px;
+ min-height: 32px;
+ clear: both;
+}
+
+#inbox .inbox-new-text {
+ float: left;
+ width: 100px;
+}
+
+#inbox .inbox-new-textarea {
+ width: 460px;
+ height: 109px;
+ margin-bottom: 10px;
+ float: left;
+}
+
+#inbox .inbox-new input {
+ float: left;
+}
+
+#inbox .inbox-new-to ul {
+ width: 264px;
+ max-height: 168px;
+ font-size: 0.9em;
+ left: 120px;
+ top: 31px;
+}
+
+#inbox .inbox-new-to-input {
+ width: 260px;
+}
+
+#inbox .inbox-new-subject-input {
+ width: 380px;
+}
+
+#inbox .inbox-new-file a {
+ display: block;
+ float: left;
+}
+
+#inbox .inbox-new-file a.file {
+ font-size: 0.85em;
+ height: 16px;
+ max-width: 320px;
+ margin: 3px 0 15px 013px;
+ overflow: hidden;
+}
+
+#inbox .inbox-new-file a.one-button {
+ font-size: 0.85em;
+ margin: -2px 0 0 25px;
+}
+
+#inbox .inbox-new-send a {
+ font-size: 0.85em;
+ float: right;
+ display: block;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the install CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 08/06/11
+
+*/
+
+body {
+ color: white;
+}
+
+#install {
+ background-color: rgb(20,20,20);
+ background-color: rgba(20,20,20,0.85);
+ width: 800px;
+ margin: 35px auto;
+ padding-bottom: 17px;
+ border-radius: 6px;
+ -moz-border-radius: 6px;
+ -webkit-border-radius: 6px;
+ box-shadow: 0 0 35px #5c5c5c;
+ -moz-box-shadow: 0 0 35px #5c5c5c;
+ -webkit-box-shadow: 0 0 35px #5c5c5c;
+}
+
+#install a {
+ color: black;
+ text-decoration: underline;
+}
+
+#install .clear {
+ clear: both;
+}
+
+#install fieldset {
+ border: 1px solid black;
+ margin: 22px 0 15px 0;
+ padding: 7px 2px 5px 2px;
+ border-radius: 3px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+}
+
+#install legend {
+ font-size: 0.9em;
+ margin: 0 0 0 15px;
+ padding: 0 2px;
+ text-transform: uppercase;
+}
+
+#install label {
+ width: 200px;
+ display: block;
+ float: left;
+ clear: both;
+ margin: 0 0 9px 12px;
+}
+
+#install input {
+ float: left;
+ margin-bottom: 5px;
+}
+
+#install input[type=text],
+#install input[type=url],
+#install input[type=password] {
+ margin-top: -2px;
+ padding: 3px;
+ font-size: 0.95em;
+ min-width: 220px;
+}
+
+#install input.icon {
+ padding-left: 24px;
+ min-width: 199px;
+ max-height: 18px;
+}
+
+#install input.icon#user_name {
+ background-position: 4px -204px;
+}
+
+#install input.icon#user_password {
+ background-position: 4px -226px;
+}
+
+#install input.icon#user_repassword {
+ background-position: 4px -248px;
+}
+
+#install-top {
+ padding: 30px 45px;
+}
+
+#install-top .logo {
+ background-position: 0 0;
+ min-width: 88px;
+ height: 36px;
+ padding: 32px 0 0 66px;
+ font-size: 32px;
+ color: white;
+ text-transform: lowercase;
+ float: left;
+ text-shadow: 0 1px 1px black;
+}
+
+#install-top .step {
+ background-color: rgb(0,0,0);
+ background-color: rgba(0,0,0,0.2);
+ border: 2px solid white;
+ padding: 6px 21px;
+ font-size: 2.7em;
+ text-shadow: 0 1px 1px black;
+ float: right;
+ border-radius: 40px;
+ -moz-border-radius: 40px;
+ -webkit-border-radius: 40px;
+ box-shadow: 0 0 10px #202020;
+ -moz-box-shadow: 0 0 10px #202020;
+ -webkit-box-shadow: 0 0 10px #202020;
+}
+
+#install-top .step span {
+ font-size: 0.6em;
+}
+
+#install-content {
+ background: #e4eef9;
+ background: -moz-linear-gradient(top, #e4eef9, #d0e5fa);
+ background: -webkit-gradient(linear, left top, left bottom, from(#e4eef9), to(#d0e5fa));
+ color: black;
+ font-size: 0.9em;
+ margin: 0 10px;
+ padding: 20px 24px;
+ min-height: 260px;
+ clear: both;
+ right: 10px;
+ border-radius: 3px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ box-shadow: 0 0 20px #202020;
+ -moz-box-shadow: 0 0 20px #202020;
+ -webkit-box-shadow: 0 0 20px #202020;
+}
+
+#install-content h3 {
+ padding-left: 24px;
+ margin-bottom: 15px;
+}
+
+#install-content h3.start {
+ background-position: 0 -73px;
+}
+
+#install-content h3.storage {
+ background-position: 0 -95px;
+}
+
+#install-content h3.account {
+ background-position: 0 -117px;
+}
+
+#install-content h3.main {
+ background-position: 0 -139px;
+}
+
+#install-content h3.hosts {
+ background-position: 0 -161px;
+}
+
+#install-content h3.services {
+ background-position: 0 -183px;
+}
+
+#install-content p {
+ margin-bottom: 10px;
+}
+
+#install-content .info {
+ color: black;
+ border-width: 1px;
+ border-style: dashed;
+ padding: 6px 8px;
+ display: block;
+ text-decoration: none;
+}
+
+#install-content .info.smallspace {
+ margin: 14px 0 10px 0;
+}
+
+#install-content .info.bigspace {
+ margin: 35px 0 20px 0;
+}
+
+#install-content .info.first {
+ margin-top: 28px;
+}
+
+#install-content .info.last {
+ margin-bottom: 28px;
+}
+
+#install-content .info.neutral {
+ background-color: #f0f19d;
+ border-color: #b3ad4f;
+}
+
+#install-content a.info.neutral:hover,
+#install-content a.info.neutral:focus {
+ background-color: #eced96;
+}
+
+#install-content a.info.neutral:active {
+ background-color: #e9ea93;
+}
+
+#install-content .info.success {
+ background-color: #a8dca9;
+ border-color: #5e9f5f;
+}
+
+#install-content a.info.success:hover,
+#install-content a.info.success:focus {
+ background-color: #a0d5a1;
+}
+
+#install-content a.info.success:active {
+ background-color: #9ad09b;
+}
+
+#install-content .info.fail {
+ background-color: #f19d9d;
+ border-color: #b34f4f;
+}
+
+#install-content ol {
+ margin: 20px 30px;
+}
+
+#install-content ol li {
+ margin-bottom: 1px;
+}
+
+#install-buttons {
+ margin-top: 22px;
+}
+
+#install-buttons input {
+ border: 1px solid white;
+ background-color: rgb(255,255,255);
+ background-color: rgba(255,255,255,0.1);
+ color: white;
+ padding: 4px 8px;
+ margin-right: 20px;
+ text-shadow: 0 1px 1px black;
+ float: right;
+ border-radius: 3px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ box-shadow: 0 0 5px #202020;
+ -moz-box-shadow: 0 0 5px #202020;
+ -webkit-box-shadow: 0 0 5px #202020;
+}
+
+#install-buttons input:hover,
+#install-buttons input:focus {
+ cursor: pointer;
+ background-color: rgb(255,255,255);
+ background-color: rgba(255,255,255,0.2);
+ box-shadow: 0 0 15px #202020;
+ -moz-box-shadow: 0 0 15px #202020;
+ -webkit-box-shadow: 0 0 15px #202020;
+}
+
+#install-buttons input:active {
+ background-color: rgb(255,255,255);
+ background-color: rgba(255,255,255,0.3);
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the integratebox CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 06/11/10
+
+*/
+
+#integratebox .top {
+ height: 40px;
+}
+
+#integratebox .content {
+ text-align: center;
+ height: 385px;
+}
+
+#integratebox .one-media img {
+ max-height: 385px;
+ max-width: 640px;
+}
+
+#integratebox .one-media a img {
+ border: none;
+}
+
+#integratebox .one-media audio {
+ margin-top: 170px;
+}
--- /dev/null
+/*\r
+\r
+Jappix - An open social platform\r
+This is the datepicker CSS stylesheet\r
+\r
+-------------------------------------------------\r
+\r
+License: AGPL\r
+Author: Vanaryon\r
+Last revision: 28/12/10\r
+\r
+*/\r
+\r
+div.datepicker {\r
+ position: relative;\r
+ font-family: Arial, Helvetica, sans-serif;\r
+ font-size: 12px;\r
+ width: 196px;\r
+ height: 147px;\r
+ position: absolute;\r
+ cursor: default;\r
+ top: 0;\r
+ left: 0;\r
+ display: none;\r
+}\r
+\r
+.datepickerHidden {\r
+ display: none;\r
+}\r
+\r
+div.datepicker table {\r
+ border-collapse:collapse;\r
+}\r
+\r
+div.datepicker a {\r
+ text-decoration: none;\r
+ cursor: default;\r
+ outline: none;\r
+}\r
+\r
+div.datepicker table td {\r
+ text-align: right;\r
+ padding: 0;\r
+ margin: 0;\r
+}\r
+\r
+div.datepicker th {\r
+ text-align: center;\r
+ color: #47646a;\r
+ font-weight: normal;\r
+}\r
+\r
+div.datepicker tbody th {\r
+ text-align: left;\r
+}\r
+\r
+div.datepicker tbody a {\r
+ display: block;\r
+}\r
+\r
+.datepickerDays a {\r
+ width: 20px;\r
+ line-height: 16px;\r
+ height: 16px;\r
+ padding-right: 2px;\r
+}\r
+\r
+.datepickerYears a,\r
+.datepickerMonths a {\r
+ width: 44px;\r
+ line-height: 36px;\r
+ height: 36px;\r
+ text-align: center;\r
+}\r
+\r
+td.datepickerNotInMonth {\r
+ background: #c7d1d4;\r
+}\r
+\r
+tbody.datepickerDays td.datepickerSelected {\r
+ background: #b0bdc1;\r
+}\r
+\r
+tbody.datepickerYears td.datepickerSelected,\r
+tbody.datepickerMonths td.datepickerSelected {\r
+ background: #9daaae;\r
+}\r
+\r
+div.datepicker a:hover,\r
+div.datepicker a:focus {\r
+ color: #3d7682;\r
+}\r
+\r
+div.datepicker tbody th {\r
+ text-align: left;\r
+}\r
+\r
+.datepickerSpace div {\r
+ width: 20px;\r
+}\r
+\r
+.datepickerGoNext a,\r
+.datepickerGoPrev a,\r
+.datepickerMonth a {\r
+ text-align: center;\r
+ height: 20px;\r
+ line-height: 20px;\r
+}\r
+\r
+.datepickerGoNext a {\r
+ float: right;\r
+ width: 20px;\r
+}\r
+\r
+.datepickerGoPrev a {\r
+ float: left;\r
+ width: 20px;\r
+}\r
+\r
+table.datepickerViewDays tbody.datepickerMonths,\r
+table.datepickerViewDays tbody.datepickerYears {\r
+ display: none;\r
+}\r
+\r
+table.datepickerViewMonths tbody.datepickerDays,\r
+table.datepickerViewMonths tbody.datepickerYears,\r
+table.datepickerViewMonths tr.datepickerDoW {\r
+ display: none;\r
+}\r
+\r
+table.datepickerViewYears tbody.datepickerDays,\r
+table.datepickerViewYears tbody.datepickerMonths,\r
+table.datepickerViewYears tr.datepickerDoW {\r
+ display: none;\r
+}\r
+\r
+td.datepickerDisabled a,\r
+td.datepickerDisabled.datepickerNotInMonth a {\r
+ color: #333;\r
+}\r
+\r
+td.datepickerSpecial a {\r
+ background: #700;\r
+}\r
+\r
+td.datepickerSpecial.datepickerSelected a {\r
+ background: #a00;\r
+}\r
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the main CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 05/10/11
+
+*/
+
+* {
+ margin: 0;
+ padding: 0;
+}
+
+body {
+ font: normal 14.4px Helvetica, Verdana, sans-serif;
+ text-shadow: 0 0 5px white;
+}
+
+h1 {
+ margin-bottom: 15px;
+}
+
+a {
+ text-decoration: none;
+ color: black;
+ outline-style: none;
+}
+
+a:hover,
+a:focus {
+ cursor: pointer;
+ text-decoration: underline;
+}
+
+legend {
+ color: black;
+}
+
+input,
+textarea {
+ background-color: white;
+ border: 1px solid #636363;
+ font-size: 0.95em;
+ padding: 2px;
+ border-radius: 2px;
+ -moz-border-radius: 2px;
+ -webkit-border-radius: 2px;
+ box-shadow: inset 0 3px 10px #dcdcdc;
+ -moz-box-shadow: inset 0 3px 10px #dcdcdc;
+ -webkit-box-shadow: inset 0 3px 10px #dcdcdc;
+}
+
+textarea {
+ font-size: 1.1em;
+}
+
+input:focus,
+input[type=submit]:hover,
+input[type=reset]:hover,
+textarea:focus {
+ border: 1px solid #e1a014;
+ box-shadow: inset 0 3px 10px #edd9bc;
+ -moz-box-shadow: inset 0 3px 10px #edd9bc;
+ -webkit-box-shadow: inset 0 3px 10px #edd9bc;
+}
+
+input[type=submit],
+input[type=reset] {
+ cursor: pointer;
+}
+
+input[type=submit]:active,
+input[type=reset]:active {
+ box-shadow: inset 0 3px 15px #e1a753;
+ -moz-box-shadow: inset 0 3px 15px #e1a753;
+ -webkit-box-shadow: inset 0 3px 15px #e1a753;
+}
+
+input[disabled],
+textarea[disabled] {
+ background-color: #f3f3f3;
+ border: 1px solid #989898;
+}
+
+input:placeholder {
+ color: #67787c !important;
+}
+
+input:-moz-placeholder {
+ color: #67787c !important;
+}
+
+input::-webkit-input-placeholder {
+ color: #67787c !important;
+}
+
+input.placeholder {
+ color: #67787c !important;
+}
+
+input[type=checkbox] {
+ margin-top: 2px;
+}
+
+input[type=checkbox],
+input[type=radio] {
+ background: transparent none !important;
+ border: 0 none !important;
+}
+
+.please-complete,
+.please-complete:hover,
+.please-complete:focus {
+ border: 1px #ac2525 solid !important;
+ 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;
+}
+
+.hidden {
+ display: none !important;
+}
+
+.clear {
+ clear: both !important;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the manager CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 31/08/11
+
+*/
+
+#manager {
+ background-color: rgb(20,20,20);
+ background-color: rgba(20,20,20,0.85);
+ width: 945px;
+ margin: 0 auto 25px;
+ padding-bottom: 17px;
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ -moz-border-radius-bottomleft: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ box-shadow: 0 0 35px #5c5c5c;
+ -moz-box-shadow: 0 0 35px #5c5c5c;
+ -webkit-box-shadow: 0 0 35px #5c5c5c;
+}
+
+#manager a {
+ color: black;
+ text-decoration: underline;
+}
+
+#manager .clear {
+ clear: both;
+}
+
+#manager fieldset {
+ border: 1px solid black;
+ margin: 22px 0 15px 0;
+ padding: 7px 2px 5px 2px;
+ border-radius: 3px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+}
+
+#manager legend {
+ font-size: 0.9em;
+ margin: 0 0 0 15px;
+ padding: 0 2px;
+ text-transform: uppercase;
+}
+
+#manager label {
+ width: 200px;
+ display: block;
+ float: left;
+ clear: both;
+ margin: 0 0 9px 12px;
+}
+
+#manager label.master {
+ text-decoration: underline;
+}
+
+#manager input,
+#manager select {
+ float: left;
+ margin-bottom: 5px;
+}
+
+#manager input[type=radio] {
+ margin: 2px 8px 5px 0;
+}
+
+#manager input[type=text],
+#manager input[type=url],
+#manager input[type=password],
+#manager select {
+ margin-top: -2px;
+ font-size: 0.95em;
+}
+
+#manager input[type=text],
+#manager input[type=url],
+#manager input[type=password] {
+ padding: 3px;
+ min-width: 220px;
+}
+
+#manager input.icon {
+ padding-left: 24px;
+ min-width: 199px;
+ max-height: 18px;
+}
+
+#manager input.icon#admin_name {
+ background-position: 4px -510px;
+}
+
+#manager input.icon#admin_password,
+#manager input.icon#user_repassword {
+ background-position: 4px -532px;
+}
+
+#manager input.icon#user_name,
+#manager input.icon#music_artist {
+ background-position: 4px -554px;
+}
+
+#manager input.icon#user_password {
+ background-position: 4px -576px;
+}
+
+#manager input.icon#music_title {
+ background-position: 4px -598px;
+}
+
+#manager input.icon#music_album {
+ background-position: 4px -620px;
+}
+
+#manager input.icon#background_image_color,
+#manager input.icon#background_color_color {
+ background-position: 4px -641px;
+}
+
+#manager select {
+ min-width: 160px;
+ max-width: 230px;
+}
+
+#manager-top {
+ padding: 25px 45px 30px;
+}
+
+#manager-top .logo {
+ background-position: 0 0;
+ min-width: 89px;
+ height: 40px;
+ padding: 28px 0 0 65px;
+ font-size: 32px;
+ color: white;
+ text-transform: lowercase;
+ float: left;
+ text-shadow: 0 1px 1px black;
+}
+
+#manager-top .meta {
+ background-color: #e0eaec;
+ font-size: 0.9em;
+ padding: 12px 7px 12px 14px;
+ float: right;
+ border-radius: 3px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ box-shadow: 0 0 10px #202020;
+ -moz-box-shadow: 0 0 10px #202020;
+ -webkit-box-shadow: 0 0 10px #202020;
+}
+
+#manager-top .meta span {
+ margin-right: 10px;
+ color: black;
+}
+
+#manager-top .meta a {
+ background-color: #f1f6fd;
+ border: 1px solid #b9cbcf;
+ color: #224249;
+ padding: 4px 8px 4px 21px;
+ margin-left: 2px;
+ text-decoration: none;
+ border-radius: 2px;
+ -moz-border-radius: 2px;
+ -webkit-border-radius: 2px;
+}
+
+#manager-top .meta a:hover,
+#manager-top .meta a:focus {
+ border: 1px solid #95b1b7;
+}
+
+#manager-top .meta a:active {
+ border: 1px solid #77989f;
+}
+
+#manager-top .meta a.logout {
+ background-position: 3px -69px;
+}
+
+#manager-top .meta a.close {
+ background-position: 3px -90px;
+}
+
+#manager-tabs {
+ margin-left: 12px;
+}
+
+#manager-tabs a {
+ background-color: #d9e7ea;
+ color: #204249;
+ width: 107px;
+ height: 17px;
+ padding: 4px 4px 4px 16px;
+ margin-left: 4px;
+ font-size: 0.94em;
+ text-decoration: none;
+ overflow: hidden;
+ float: left;
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+ -moz-border-radius-topright: 3px;
+ -moz-border-radius-topleft: 3px;
+ -webkit-border-top-right-radius: 3px;
+ -webkit-border-top-left-radius: 3px;
+}
+
+#manager-tabs a:hover,
+#manager-tabs a:focus {
+ background-color: #cedee1;
+ text-decoration: none;
+}
+
+#manager-tabs a:active {
+ background-color: #c3d3d7;
+ text-decoration: none;
+}
+
+#manager-tabs a.tab-active {
+ background-color: #e4eef9 !important;
+}
+
+#manager-content {
+ background: #e4eef9;
+ background: -moz-linear-gradient(top, #e4eef9, #d0e5fa);
+ background: -webkit-gradient(linear, left top, left bottom, from(#e4eef9), to(#d0e5fa));
+ color: black;
+ font-size: 0.9em;
+ margin: 0 10px;
+ padding: 20px 24px;
+ min-height: 260px;
+ clear: both;
+ right: 10px;
+ border-radius: 3px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ box-shadow: 0 0 20px #202020;
+ -moz-box-shadow: 0 0 20px #202020;
+ -webkit-box-shadow: 0 0 20px #202020;
+}
+
+#manager-content h3 {
+ padding-left: 24px;
+ margin-bottom: 15px;
+}
+
+#manager-content h3.login {
+ background-position: 0 -466px;
+}
+
+#manager-content h3.statistics {
+ background-position: 0 -203px;
+}
+
+#manager-content h3.configuration {
+ background-position: 0 -224px;
+}
+
+#manager-content h3.hosts {
+ background-position: 0 -246px;
+}
+
+#manager-content h3.storage {
+ background-position: 0 -268px;
+}
+
+#manager-content h3.design {
+ background-position: 0 -290px;
+}
+
+#manager-content h3.users {
+ background-position: 0 -312px;
+}
+
+#manager-content h3.updates {
+ background-position: 0 -334px;
+}
+
+#manager-content h4 {
+ border-top: 1px dotted black;
+ padding-top: 5px;
+ margin: 20px 0 14px;
+ clear: both;
+}
+
+#manager-content ul,
+#manager-content ol {
+ width: 380px;
+ margin: 8px 0 20px 18px;
+}
+
+#manager-content li {
+ margin-bottom: 3px;
+}
+
+#manager-content li.total {
+ margin-bottom: 14px;
+}
+
+#manager-content li b {
+ width: 190px;
+ float: left;
+}
+
+#manager-content li span {
+ margin-left: 10px;
+ float: left;
+}
+
+#manager-content ul.stats,
+#manager-content ol.stats {
+ float: left;
+}
+
+#manager-content object.stats {
+ border: 1px dotted #bed4d9;
+ width: 450px;
+ height: 270px;
+ margin-bottom: 20px;
+ float: right;
+}
+
+#manager-content p,
+#manager-content div {
+ margin-bottom: 10px;
+}
+
+#manager-content .info {
+ color: black;
+ border-width: 1px;
+ border-style: dashed;
+ padding: 6px 8px;
+ display: block;
+ text-decoration: none;
+}
+
+#manager-content .info.bottomspace {
+ margin-bottom: 16px;
+}
+
+#manager-content .info.smallspace {
+ margin: 14px 0 10px 0;
+}
+
+#manager-content .info.bigspace {
+ margin: 35px 0 20px 0;
+}
+
+#manager-content .info.neutral {
+ background-color: #f0f19d;
+ border-color: #b3ad4f;
+}
+
+#manager-content a.info.neutral:hover,
+#manager-content a.info.neutral:focus {
+ background-color: #eced96;
+}
+
+#manager-content a.info.neutral:active {
+ background-color: #e9ea93;
+}
+
+#manager-content .info.success {
+ background-color: #a8dca9;
+ border-color: #5e9f5f;
+}
+
+#manager-content a.info.success:hover,
+#manager-content a.info.success:focus {
+ background-color: #a0d5a1;
+}
+
+#manager-content a.info.success:active {
+ background-color: #9ad09b;
+}
+
+#manager-content .info.fail {
+ background-color: #f19d9d;
+ border-color: #b34f4f;
+}
+
+#manager-content a.info.fail:hover,
+#manager-content a.info.fail:focus {
+ background-color: #ea9595;
+}
+
+#manager-content a.info.fail:active {
+ background-color: #e59090;
+}
+
+#manager-content .browse {
+ margin: 2px 0 6px;
+ max-height: 243px;
+ overflow: auto;
+}
+
+#manager-content .browse .one-browse {
+ padding: 5px 10px 5px 34px;
+ height: 17px;
+}
+
+#manager-content .browse .user {
+ background-position: 9px -111px;
+}
+
+#manager-content .browse .other {
+ background-position: 9px -133px;
+}
+
+#manager-content .browse .folder {
+ background-position: 9px -178px;
+}
+
+#manager-content .browse .audio {
+ background-position: 9px -154px;
+}
+
+#manager-content .browse .alert {
+ background-position: 9px -353px;
+}
+
+#manager-content .browse .image {
+ background-position: 9px -374px;
+}
+
+#manager-content .browse .video {
+ background-position: 9px -397px;
+}
+
+#manager-content .browse .document {
+ background-position: 9px -418px;
+}
+
+#manager-content .browse .package {
+ background-position: 9px -441px;
+}
+
+#manager-content .browse .previous {
+ background-position: 9px -485px;
+ margin-bottom: 4px;
+}
+
+#manager-content .browse div {
+ margin: 0;
+}
+
+#manager-content .browse input {
+ float: right;
+ margin: 1px 0;
+}
+
+#manager-content .browse .odd {
+ background-color: #e9f1fd;
+}
+
+#manager-content .browse .even {
+ background-color: #f1f6fd;
+}
+
+#manager-content .sub {
+ border-left: 1px solid black;
+ margin: 5px 0 20px 22px;
+ padding-left: 12px;
+ clear: both;
+}
+
+#manager span.logo_links a {
+ width: 16px;
+ height: 16px;
+ margin-right: 6px;
+ float: left;
+}
+
+#manager span.logo_links a.remove {
+ background-position: 0 -688px;
+}
+
+#manager span.logo_links a.view {
+ background-position: 0 -666px;
+}
+
+#manager-content .clear {
+ margin: 0;
+}
+
+#manager-content textarea.notice-text {
+ height: 70px;
+ width: 600px;
+ margin-left: 4px;
+ padding: 5px;
+ font-size: 1.2em;
+}
+
+#manager-buttons {
+ margin-top: 22px;
+}
+
+#manager-buttons input {
+ border: 1px solid white;
+ background-color: rgb(255,255,255);
+ background-color: rgba(255,255,255,0.1);
+ color: white;
+ padding: 4px 8px;
+ margin-left: -12px;
+ margin-right: 20px;
+ font-size: 1em;
+ text-shadow: 0 1px 1px black;
+ float: right;
+ border-radius: 3px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ box-shadow: 0 0 5px #202020;
+ -moz-box-shadow: 0 0 5px #202020;
+ -webkit-box-shadow: 0 0 5px #202020;
+}
+
+#manager-buttons input:hover,
+#manager-buttons input:focus {
+ cursor: pointer;
+ background-color: rgb(255,255,255);
+ background-color: rgba(255,255,255,0.2);
+ box-shadow: 0 0 15px #202020;
+ -moz-box-shadow: 0 0 15px #202020;
+ -webkit-box-shadow: 0 0 15px #202020;
+}
+
+#manager-buttons input:active {
+ background-color: rgb(255,255,255);
+ background-color: rgba(255,255,255,0.3);
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the Jappix Me tool CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 16/01/12
+
+*/
+
+#me .content {
+ padding: 10px 0;
+}
+
+#me .logo {
+ background-position: 0 0;
+ width: 300px;
+ height: 61px;
+ margin: 20px auto 0 auto;
+ display: block;
+}
+
+#me .infos {
+ margin-top: 30px;
+}
+
+#me .infos p {
+ margin-top: 8px;
+}
+
+#me .infos p.infos-title {
+ margin-top: 0;
+}
+
+#me .infos a {
+ text-decoration: underline;
+}
+
+#me a.go {
+ text-align: center;
+ font-weight: bold;
+ width: 300px;
+ margin: 30px auto 0 auto;
+ padding: 8px 12px;
+ display: block;
+}
\ No newline at end of file
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the Jappix Mini legacy IE CSS stylesheet
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 20/03/11
+
+*/
+
+#jappix_mini {
+ width: expression(document.documentElement.clientWidth - 150 + 'px') !important;
+ position: absolute !important;
+ bottom: auto !important;
+ right: auto !important;
+ top: expression(((document.documentElement.clientHeight - this.offsetHeight) + (ignoreMiniTop = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop)) + 'px') !important;
+ left: expression((150 + this.offsetWidth - (document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth) + (ignoreMiniLeft = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft)) + 'px') !important;
+}
+
+#jappix_mini .jm_images {
+ background-image: url(../img/sprites/mini.gif) !important;
+}
+
+#jappix_mini .jm_images_animate {
+ background-image: url(../img/sprites/animate.gif) !important;
+}
+
+#jappix_mini a.jm_button {
+ width: 1px !important;
+}
+
+#jappix_mini div.jm_roster {
+ right: -1px !important;
+ bottom: 23px !important;
+}
+
+#jappix_mini div.jm_roster div.jm_buddies {
+ height: expression(this.scrollHeight > (document.documentElement.clientHeight - 70) ? (document.documentElement.clientHeight - 70) + 'px' : 'auto') !important;
+}
+
+#jappix_mini a.jm_pane {
+ height: 12px !important;
+ overflow-y: hidden !important;
+}
+
+#jappix_mini a.jm_button.jm_clicked {
+ background-image: none !important;
+}
+
+#jappix_mini div.jm_conversations a.jm_clicked {
+ border-right: none !important;
+ padding: 7px 6px 6px 6px !important;
+}
+
+#jappix_mini div.jm_chat-content {
+ bottom: 23px !important;
+ right: -2px !important;
+}
+
+#jappix_popup {
+ height: expression(document.documentElement.clientHeight + 'px') !important;
+ width: expression(document.documentElement.clientWidth + 'px') !important;
+ position: absolute !important;
+ top: expression(((ignorePopupTop = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop)) + 'px') !important;
+ left: expression(((ignorePopupLeft = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft)) + 'px') !important;
+}
+
+#jappix_popup div.jm_prompt {
+ position: absolute !important;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the Jappix Mini CSS stylesheet
+
+-------------------------------------------------
+
+License: AGPL
+Authors: Vanaryon, Julien
+Last revision: 16/01/12
+
+*/
+
+#jappix_mini,
+#jappix_popup {
+ font: normal 11px helvetica, "Lucida Grande", "Lucida Sans", "Lucida Sans Unicode", Arial, sans-serif;
+}
+
+#jappix_mini {
+ margin-left: 130px;
+ position: fixed;
+ bottom: 0;
+ right: 20px;
+ z-index: 999;
+}
+
+#jappix_mini *,
+#jappix_popup * {
+ border: none;
+ color: black;
+ width: auto;
+ height: auto;
+ margin: 0;
+ padding: 0;
+ overflow: visible;
+ font-size: 11px;
+ text-align: left;
+ text-transform: none;
+ text-shadow: none;
+ opacity: 1.0;
+ border-radius: 0;
+ -moz-border-radius: 0;
+ -webkit-border-radius: 0;
+ box-shadow: none;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+}
+
+#jappix_mini .jm_images {
+ background-image: url(../img/sprites/mini.png);
+ background-repeat: no-repeat;
+}
+
+#jappix_mini .jm_images_animate {
+ background-image: url(../img/sprites/animate.png);
+ background-repeat: no-repeat;
+}
+
+#jappix_mini a {
+ text-decoration: none;
+ cursor: pointer;
+}
+
+#jappix_mini a:hover {
+ cursor: pointer;
+}
+
+#jappix_mini div.jm_position {
+ float: right;
+}
+
+#jappix_mini a.jm_pane {
+ background-color: #f4f4f4;
+ background-position: 0 -100px;
+ background-repeat: repeat-x;
+ border-color: #999999;
+ border-style: solid;
+ border-width: 1px 1px 0 1px;
+ font-weight: bold;
+ outline-style: none;
+ display: block;
+ padding: 6px;
+ height: 13px;
+}
+
+#jappix_mini a.jm_pane:hover {
+ background: white;
+}
+
+#jappix_mini a.jm_pane:hover,
+#jappix_mini a.jm_pane:focus {
+ border-color: #666666;
+}
+
+#jappix_mini div.jm_starter,
+#jappix_mini div.jm_conversations,
+#jappix_mini div.jm_conversation {
+ float: left;
+ position: relative;
+}
+
+#jappix_mini div.jm_conversation {
+ width: 153px;
+}
+
+#jappix_mini a.jm_chat-tab {
+ border-width: 1px 0 0 1px;
+ width: 140px;
+ float: right;
+ overflow: hidden;
+}
+
+#jappix_mini a.jm_chat-tab.jm_clicked {
+ background: white;
+ position: relative;
+ border-top: none;
+ border-left: 1px solid #999999;
+ padding-top: 7px;
+}
+
+#jappix_mini a.jm_chat-tab span.jm_notify {
+ position: absolute;
+ top: 6px;
+ right: 9px;
+}
+
+#jappix_mini a.jm_chat-tab span.jm_notify span {
+ float: left;
+}
+
+#jappix_mini a.jm_chat-tab span.jm_notify span.jm_notify_left {
+ background-position: 0 -360px;
+}
+
+#jappix_mini a.jm_chat-tab span.jm_notify span.jm_notify_right {
+ background-position: -7px -360px;
+}
+
+#jappix_mini a.jm_chat-tab span.jm_notify span.jm_notify_left,
+#jappix_mini a.jm_chat-tab span.jm_notify span.jm_notify_right {
+ height: 16px;
+ width: 7px;
+}
+
+#jappix_mini a.jm_chat-tab span.jm_notify span.jm_notify_middle {
+ background-color: #c60505;
+ color: white;
+ font-size: 0.85em;
+ height: 14px;
+ padding-top: 2px;
+}
+
+#jappix_mini div.jm_conversation.jm_type_groupchat span.jm_name {
+ margin-left: 4px;
+}
+
+#jappix_mini div.jm_chat-content {
+ background-color: white;
+ border: 1px solid #999999;
+ height: 300px;
+ width: 260px;
+ position: absolute;
+ right: -1px;
+ bottom: 25px;
+ display: none;
+}
+
+#jappix_mini div.jm_actions {
+ background-color: #565d5e;
+ border-bottom: 1px solid #3a3a3a;
+ height: 14px;
+ padding: 4px 6px;
+ font-weight: bold;
+ overflow: hidden;
+}
+
+#jappix_mini div.jm_actions span.jm_nick {
+ color: white;
+ height: 16px;
+ width: 225px;
+ overflow: hidden;
+ float: left;
+}
+
+#jappix_mini div.jm_actions a.jm_one-action {
+ background-color: #727879;
+ margin: 0 -2px 0 5px;
+ height: 15px;
+ width: 15px;
+ outline-style: none;
+ float: right;
+}
+
+#jappix_mini div.jm_actions a.jm_one-action:hover,
+#jappix_mini div.jm_actions a.jm_one-action:focus {
+ background-color: #7f8788;
+}
+
+#jappix_mini div.jm_actions a.jm_one-action:active {
+ background-color: #8c9293;
+}
+
+#jappix_mini div.jm_actions a.jm_logo {
+ background-position: 7px 2px;
+ width: 81px;
+ height: 22px;
+ margin: -4px 0 0 -2px;
+ outline-style: none;
+ float: left;
+}
+
+#jappix_mini div.jm_actions a.jm_logo:hover,
+#jappix_mini div.jm_actions a.jm_logo:focus {
+ background-color: #636a6b;
+}
+
+#jappix_mini div.jm_actions a.jm_logo:active {
+ background-color: #707677;
+}
+
+#jappix_mini div.jm_actions a.jm_close {
+ background-position: 1px -341px;
+}
+
+#jappix_mini div.jm_actions a.jm_join {
+ background-position: 0 -327px;
+}
+
+#jappix_mini div.jm_received-messages {
+ background-color: white;
+ padding: 5px 0 4px;
+ height: 242px;
+ overflow: auto;
+}
+
+#jappix_mini div.jm_received-messages p {
+ margin: 3px 0;
+ word-wrap: break-word;
+}
+
+#jappix_mini div.jm_received-messages p,
+#jappix_mini div.jm_received-messages a {
+ color: black !important;
+}
+
+#jappix_mini div.jm_received-messages div.jm_group {
+ margin: 2px 6px 9px 6px;
+ padding-bottom: 8px;
+ border-bottom: 1px solid #eaeaea;
+}
+
+#jappix_mini div.jm_received-messages div.jm_system-message p,
+#jappix_mini div.jm_received-messages div.jm_system-message a {
+ color: #053805 !important;
+ font-style: italic !important;
+}
+
+#jappix_mini div.jm_received-messages p a {
+ text-decoration: underline;
+}
+
+#jappix_mini div.jm_received-messages b {
+ margin-bottom: 3px;
+ display: block;
+}
+
+#jappix_mini div.jm_received-messages b.jm_me {
+ color: #123a5c;
+}
+
+#jappix_mini div.jm_received-messages b.jm_him {
+ color: #801e1e;
+}
+
+#jappix_mini div.jm_received-messages span.jm_date {
+ font-size: 0.8em;
+ float: right;
+ display: none;
+}
+
+#jappix_mini div.jm_received-messages div.jm_group:hover span.jm_date {
+ display: block;
+}
+
+#jappix_mini input.jm_send-messages {
+ background-color: white;
+ border-color: #999999;
+ border-style: solid;
+ border-width: 1px 0 0 0;
+ padding: 5px;
+ width: 250px;
+ min-height: 14px;
+}
+
+#jappix_mini div.jm_disabled div.jm_chat-content,
+#jappix_mini div.jm_disabled input.jm_send-messages,
+#jappix_mini div.jm_disabled a.jm_pane {
+ background: #f3f3f3 !important;
+}
+
+#jappix_mini div.jm_disabled input.jm_send-messages {
+ color: #9d9d9d;
+}
+
+#jappix_mini div.jm_roster {
+ background-color: white;
+ border: 1px solid #999999;
+ width: 160px;
+ position: absolute;
+ right: 0;
+ bottom: 25px;
+ display: none;
+}
+
+#jappix_mini div.jm_roster div.jm_buddies {
+ width: 100%;
+ max-height: 300px;
+ padding: 5px 0;
+ overflow: auto;
+}
+
+#jappix_mini div.jm_roster div.jm_grouped {
+ margin: 2px 0;
+}
+
+#jappix_mini div.jm_roster div.jm_grouped div.jm_name {
+ margin-bottom: 2px;
+ padding: 4px 8px 0;
+ font-weight: bold;
+}
+
+#jappix_mini a.jm_friend {
+ border-color: white;
+ border-style: solid;
+ border-width: 1px 0;
+ outline-style: none;
+ padding: 6px;
+ display: block;
+}
+
+#jappix_mini a.jm_friend.jm_offline {
+ display: none;
+}
+
+#jappix_mini a.jm_friend:hover,
+#jappix_mini a.jm_friend:focus {
+ background-color: #888888;
+ border-color: #494949;
+ color: white;
+}
+
+#jappix_mini a.jm_friend:hover span.jm_presence,
+#jappix_mini a.jm_friend:focus span.jm_presence {
+ background-position: 0 -84px;
+}
+
+#jappix_mini a.jm_button {
+ padding: 6px 10px;
+ position: relative;
+ z-index: 1;
+}
+
+#jappix_mini a.jm_button.jm_clicked {
+ background: white;
+ border-top: none;
+ border-left: 1px solid #999999;
+ border-right: 1px solid #999999;
+ padding: 7px 10px 6px 10px;
+}
+
+#jappix_mini span.jm_animate {
+ background-position: 0 0;
+ width: 111px;
+ height: 102px;
+ position: absolute;
+ top: -100px;
+ left: -74px;
+ z-index: 1;
+ display: block;
+}
+
+#jappix_mini span.jm_counter {
+ background-position: 0 -288px;
+ color: #333333;
+ height: 16px;
+ padding-left: 25px;
+ display: block;
+}
+
+#jappix_mini span.jm_counter.jm_error {
+ background-position: 0 -305px;
+}
+
+#jappix_mini span.jm_presence {
+ display: block;
+ height: 16px;
+ width: 16px;
+ margin-right: 4px;
+ float: left;
+}
+
+#jappix_mini span.jm_name {
+ color: #272727;
+ height: 14px;
+ width: 105px;
+ overflow: hidden;
+ float: left;
+}
+
+#jappix_mini .jm_available,
+#jappix_mini .jm_chat {
+ background-position: 0 -20px;
+}
+
+#jappix_mini .jm_away {
+ background-position: 0 -36px;
+}
+
+#jappix_mini .jm_xa,
+#jappix_mini .jm_dnd {
+ background-position: 0 -52px;
+}
+
+#jappix_mini .jm_unavailable {
+ background-position: 0 -68px;
+}
+
+#jappix_mini .jm_smiley {
+ border: 0 none;
+ height: 16px;
+ width: 16px;
+ vertical-align: bottom;
+}
+
+#jappix_mini .jm_smiley-wink {
+ background-position: 0 -148px;
+}
+
+#jappix_mini .jm_smiley-waii {
+ background-position: 0 -164px;
+}
+
+#jappix_mini .jm_smiley-unhappy {
+ background-position: 0 -180px;
+}
+
+#jappix_mini .jm_smiley-tongue {
+ background-position: 0 -196px;
+}
+
+#jappix_mini .jm_smiley-surprised {
+ background-position: 0 -212px;
+}
+
+#jappix_mini .jm_smiley-smile {
+ background-position: 0 -228px;
+}
+
+#jappix_mini .jm_smiley-happy {
+ background-position: 0 -244px;
+}
+
+#jappix_mini .jm_smiley-grin {
+ background-position: 0 -260px;
+}
+
+#jappix_popup {
+ background: url(../img/others/blank.gif) repeat;
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ z-index: 999;
+}
+
+#jappix_popup div.jm_prompt {
+ background-color: #565d5e;
+ border: 1px solid #3a3a3a;
+ width: 346px;
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ margin-left: -175px;
+ padding: 16px 2px 2px 2px;
+ border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ -moz-border-radius-topright: 4px;
+ -moz-border-radius-topleft: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ box-shadow: 0 0 35px #232323;
+ -moz-box-shadow: 0 0 35px #232323;
+ -webkit-box-shadow: 0 0 35px #232323;
+}
+
+#jappix_popup div.jm_prompt form {
+ background-color: white;
+ border: 1px solid #3a3a3a;
+ width: 332px;
+ padding: 6px;
+}
+
+#jappix_popup div.jm_prompt form input {
+ background-color: #f9f9f9;
+ border: 1px solid #666666;
+ font-size: 1.1em;
+ padding: 1px 2px;
+}
+
+#jappix_popup div.jm_prompt form input:hover,
+#jappix_popup div.jm_prompt form input:focus {
+ border: 1px solid #202020;
+}
+
+#jappix_popup div.jm_prompt form input.jm_text {
+ width: 326px;
+ margin: 6px 0;
+ display: block;
+}
+
+#jappix_popup div.jm_prompt form input.jm_submit {
+ text-align: center;
+ margin-left: 3px;
+ float: right;
+}
+
+#jappix_popup div.jm_prompt form input.jm_submit:hover,
+#jappix_popup div.jm_prompt form input.jm_submit:focus {
+ background-color: #f3f3f3;
+ cursor: pointer;
+}
+
+#jappix_popup div.jm_prompt form input.jm_submit:active {
+ background-color: #e8e8e8;
+}
+
+#jappix_popup div.jm_prompt div.jm_clear {
+ clear: both;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the Jappix Mobile CSS stylesheet
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 05/10/11
+
+*/
+
+/* BEGIN GENERAL STYLE */
+
+* {
+ margin: 0;
+ padding: 0;
+}
+
+body {
+ font: normal 14.4px Helvetica, Verdana, sans-serif;
+ background-color: #dcdcdc;
+ margin: 0 auto;
+ text-align: center;
+ min-width: 200px;
+ min-height: 260px;
+}
+
+a {
+ color: black;
+}
+
+/* END GENERAL STYLE */
+
+/* BEGIN HEADER STYLE */
+
+.header {
+ background-color: #2d2d2d;
+ border-bottom: 1px solid #6d6d6d;
+ color: #405964;
+ padding: 6px 0;
+ height: 30px;
+}
+
+.header div {
+ background-position: 0 0;
+ width: 83px;
+ height: 30px;
+}
+
+/* END HEADER STYLE */
+
+/* BEGIN HOME STYLE */
+
+#home .header div {
+ margin: 0 auto;
+}
+
+#home .notification {
+ padding: 2px;
+ margin-top: -1px;
+}
+
+#noscript {
+ background: #86a2ff;
+ border-bottom: 1px solid #5890d6;
+ color: #1e4b82;
+}
+
+#error {
+ background: #ff8686;
+ border-bottom: 1px solid #d65858;
+ color: #821e1e;
+ display: none;
+}
+
+#info {
+ background: #f3eba7;
+ border-bottom: 1px solid #d9d085;
+ color: #5e5616;
+ display: none;
+}
+
+#home .login {
+ padding: 8px 0;
+ margin: 30px 0 30px 0;
+}
+
+#home .login input {
+ margin-top: 5px;
+ padding: 2px;
+}
+
+#home .login input.xid,
+#home .login input.password {
+ display: block;
+ margin: 4px auto;
+ font-size: 0.85em;
+ padding: 4px;
+ background-color: white;
+ border: 1px solid #636363;
+ width: 150px;
+ padding-left: 24px;
+}
+
+#home .login input.xid {
+ background-position: 4px -30px;
+}
+
+#home .login input.password {
+ background-position: 4px -53px;
+}
+
+#home .login label {
+ margin-bottom: 12px;
+ display: block;
+}
+
+#home .login label input {
+ margin-right: 4px;
+}
+
+#home a {
+ font-size: 0.8em;
+}
+
+/* END HOME STYLE */
+
+/* BEGIN TALK STYLE */
+
+#talk .header div,
+#chat .header div {
+ float: left;
+ margin-left: 7px;
+}
+
+#talk .header button,
+#chat .header button {
+ float: right;
+ margin-right: 7px;
+ padding: 2px;
+}
+
+#talk a.one-buddy {
+ display: none;
+ background-color: #87a5ab;
+ border-bottom: 1px solid #5b8088;
+ text-shadow: 1px 1px 1px #5b8088;
+ text-decoration: none;
+ color: white;
+ outline-style: none;
+ padding: 10px 0;
+}
+
+#talk a.one-buddy:hover {
+ cursor: pointer;
+}
+
+#talk a.available,
+#talk a.chat {
+ background-color: #83b187;
+ border-bottom: 1px solid #4d8252;
+ text-shadow: 1px 1px 1px #4d8252;
+}
+
+#talk a.available:hover,
+#talk a.chat:hover,
+#talk a.available:focus,
+#talk a.chat:focus {
+ background-color: #89c68e;
+}
+
+#talk a.available:active,
+#talk a.chat:active {
+ background-color: #90d496;
+}
+
+#talk a.away {
+ background-color: #e0be7b;
+ border-bottom: 1px solid #ae8941;
+ text-shadow: 1px 1px 1px #ae8941;
+}
+
+#talk a.away:hover,
+#talk a.away:focus {
+ background-color: #eac784;
+}
+
+#talk a.away:active {
+ background-color: #f3d294;
+}
+
+#talk a.xa,
+#talk a.dnd {
+ background-color: #db8989;
+ border-bottom: 1px solid #a24343;
+ text-shadow: 1px 1px 1px #a24343;
+}
+
+#talk a.xa:hover,
+#talk a.dnd:hover,
+#talk a.xa:focus,
+#talk a.dnd:focus {
+ background-color: #e89797;
+}
+
+#talk a.xa:active,
+#talk a.dnd:active {
+ background-color: #ef9f9f;
+}
+
+/* END TALK STYLE */
+
+/* BEGIN CHAT STYLE */
+
+#chat {
+ display: none;
+}
+
+#chat .one-chat,
+#chat .one-chat p,
+#chat .one-chat div,
+#chat .one-chat input {
+ position: absolute;
+ bottom: 0;
+ right: 0;
+}
+
+#chat .one-chat {
+ top: 43px;
+ left: 0;
+}
+
+#chat .one-chat p {
+ background-color: #87a5ab;
+ border-bottom: 1px solid #5b8088;
+ text-shadow: 1px 1px 1px #5b8088;
+ color: white;
+ top: 0;
+ left: 0;
+ height: 18px;
+ padding: 2px 0;
+ font-size: 0.9em;
+}
+
+#chat .one-chat div {
+ border-bottom: 1px solid #cbcbcb;
+ top: 23px;
+ left: 0;
+ bottom: 25px;
+ overflow: auto;
+ text-align: left;
+}
+
+#chat .one-chat span {
+ display: block;
+ font-size: 0.85em;
+ margin: 4px 6px;
+ word-wrap: break-word;
+}
+
+#chat .one-chat b {
+ margin-right: 3px;
+}
+
+#chat .one-chat b.me {
+ color: #123a5c;
+}
+
+#chat .one-chat b.him {
+ color: #801e1e;
+}
+
+#chat .one-chat input {
+ background-color: white;
+ bottom: 0;
+ height: 25px;
+ width: 100%;
+ border: none;
+}
+
+#chat .one-chat input.submit {
+ right: 0;
+ width: 35px;
+}
+
+/* END CHAT STYLE */
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the mucadmin CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 11/05/11
+
+*/
+
+#mucadmin .content {
+ padding: 10px 0 10px 0;
+}
+
+#mucadmin .content p {
+ margin: 5px 10px 5px 10px;
+ text-align: justify;
+}
+
+#mucadmin .mucadmin-head-jid {
+ text-decoration: underline;
+ font-size: 0.9em;
+ float: right;
+ margin: 1px 4px 1px 1px;
+}
+
+#mucadmin .mucadmin-forms {
+ height: 310px;
+ width: 620px;
+ margin: -5px 0 0 10px;
+ padding: 6px 0 0 0;
+ overflow: auto;
+}
+
+#mucadmin .mucadmin-forms label {
+ width: 260px;
+}
+
+#mucadmin .mucadmin-topic label,
+#mucadmin .mucadmin-aut label,
+#mucadmin .mucadmin-others label {
+ font-size: 0.9em;
+}
+
+#mucadmin .mucadmin-forms textarea {
+ height: 60px;
+ width: 300px;
+ margin: 5px 12px 10px 0;
+}
+
+#mucadmin .results {
+ height: auto;
+ width: auto;
+ overflow: visible;
+ margin: 5px;
+}
+
+#mucadmin .aut-group {
+ float: left;
+ padding-bottom: 4px;
+}
+
+#mucadmin .one-aut {
+ clear: both;
+ margin: 0 10px 5px 0;
+}
+
+#mucadmin .aut-add {
+ clear: both;
+ float: left;
+ margin-bottom: 5px;
+ font-size: 0.9em;
+}
+
+#mucadmin .aut-remove {
+ float: left;
+}
+
+#mucadmin .aut-remove:hover,
+#mucadmin .aut-remove:focus {
+ font-weight: bold;
+ text-decoration: none;
+}
+
+#mucadmin .mucadmin-others a {
+ float: left;
+ font-size: 0.9em;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the my-infos CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 31/08/11
+
+*/
+
+#my-infos {
+ background-color: rgb(20,20,20);
+ background-color: rgba(20,20,20,0.85);
+ color: #919191;
+ margin-top: 8px;
+ padding: 15px 6px 6px 6px;
+ border-radius: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ box-shadow: 0 0 6px #5c5c5c;
+ -moz-box-shadow: 0 0 6px #5c5c5c;
+ -webkit-box-shadow: 0 0 6px #5c5c5c;
+}
+
+#my-infos .content {
+ background: #e8f1f3;
+ background: -moz-linear-gradient(top, #e4edef, #e8f1f3);
+ background: -webkit-gradient(linear, left top, left bottom, from(#e4edef), to(#e8f1f3));
+ color: #919191;
+ max-height: 140px;
+ padding: 1px 0;
+ border-radius: 3px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+}
+
+#my-infos .element {
+ height: 24px;
+ margin: 6px 0;
+ position: relative;
+}
+
+#my-infos .element .icon {
+ background-color: white;
+ border-color: #636363;
+ border-width: 1px;
+ border-style: solid;
+ margin-left: 6px;
+ height: 22px;
+ width: 25px;
+ border-radius: 2px;
+ -moz-border-radius: 2px;
+ -webkit-border-radius: 2px;
+}
+
+#my-infos .element div.bubble a {
+ width: 100%;
+ height: 20px;
+}
+
+#my-infos .element .icon:hover,
+#my-infos .element div.bubble a:hover {
+ background-color: #f4f4f4;
+}
+
+#my-infos .element .icon:active,
+#my-infos .element div.bubble a:active {
+ background-color: #ededed;
+}
+
+#my-infos .f-presence div.bubble a[data-value=available] {
+ background-position: 4px -167px;
+}
+
+#my-infos .f-presence div.bubble a[data-value=away] {
+ background-position: 4px -183px;
+}
+
+#my-infos .f-presence div.bubble a[data-value=xa] {
+ background-position: 4px -199px;
+}
+
+#my-infos .f-mood div.bubble a[data-value=crazy] {
+ background-position: 4px -296px;
+}
+
+#my-infos .f-mood div.bubble a[data-value=excited] {
+ background-position: 4px -314px;
+}
+
+#my-infos .f-mood div.bubble a[data-value=playful] {
+ background-position: 4px -332px;
+}
+
+#my-infos .f-mood div.bubble a[data-value=happy] {
+ background-position: 4px -350px;
+}
+
+#my-infos .f-mood div.bubble a[data-value=shocked] {
+ background-position: 4px -368px;
+}
+
+#my-infos .f-mood div.bubble a[data-value=hot] {
+ background-position: 4px -386px;
+}
+
+#my-infos .f-mood div.bubble a[data-value=sad] {
+ background-position: 4px -404px;
+}
+
+#my-infos .f-mood div.bubble a[data-value=amorous] {
+ background-position: 4px -422px;
+}
+
+#my-infos .f-mood div.bubble a[data-value=confident] {
+ background-position: 4px -440px;
+}
+
+#my-infos .f-mood a[data-value] span {
+ background-position: 0 -352px;
+}
+
+#my-infos .f-mood a[data-value=crazy] span,
+.mood-one {
+ background-position: 0 -298px;
+}
+
+#my-infos .f-mood a[data-value=excited] span,
+.mood-two {
+ background-position: 0 -316px;
+}
+
+#my-infos .f-mood a[data-value=playful] span,
+.mood-three {
+ background-position: 0 -334px;
+}
+
+#my-infos .f-mood a[data-value=happy] span,
+.mood-four {
+ background-position: 0 -352px;
+}
+
+#my-infos .f-mood a[data-value=shocked] span,
+.mood-five {
+ background-position: 0 -370px;
+}
+
+#my-infos .f-mood a[data-value=hot] span,
+.mood-six {
+ background-position: 0 -388px;
+}
+
+#my-infos .f-mood a[data-value=sad] span,
+.mood-seven {
+ background-position: 0 -406px;
+}
+
+#my-infos .f-mood a[data-value=amorous] span,
+.mood-eight {
+ background-position: 0 -424px;
+}
+
+#my-infos .f-mood a[data-value=confident] span,
+.mood-nine {
+ background-position: 0 -442px;
+}
+
+#my-infos .f-activity div.bubble a[data-value=doing_chores] {
+ background-position: 4px -458px;
+}
+
+#my-infos .f-activity div.bubble a[data-value=drinking] {
+ background-position: 4px -476px;
+}
+
+#my-infos .f-activity div.bubble a[data-value=eating] {
+ background-position: 4px -494px;
+}
+
+#my-infos .f-activity div.bubble a[data-value=exercising] {
+ background-position: 4px -512px;
+}
+
+#my-infos .f-activity div.bubble a[data-value=grooming] {
+ background-position: 4px -548px;
+}
+
+#my-infos .f-activity div.bubble a[data-value=having_appointment] {
+ background-position: 4px -566px;
+}
+
+#my-infos .f-activity div.bubble a[data-value=inactive] {
+ background-position: 4px -530px;
+}
+
+#my-infos .f-activity div.bubble a[data-value=relaxing] {
+ background-position: 4px -620px;
+}
+
+#my-infos .f-activity div.bubble a[data-value=talking] {
+ background-position: 4px -602px;
+}
+
+#my-infos .f-activity div.bubble a[data-value=traveling] {
+ background-position: 4px -584px;
+}
+
+#my-infos .f-activity div.bubble a[data-value=working] {
+ background-position: 4px -638px;
+}
+
+#my-infos .f-activity a[data-value] span {
+ background-position: 0 -514px;
+}
+
+#my-infos .f-activity a[data-value=doing_chores] span,
+.activity-doing_chores {
+ background-position: 0 -460px;
+}
+
+#my-infos .f-activity a[data-value=drinking] span,
+.activity-drinking {
+ background-position: 0 -478px;
+}
+
+#my-infos .f-activity a[data-value=eating] span,
+.activity-eating {
+ background-position: 0 -496px;
+}
+
+#my-infos .f-activity a[data-value=exercising] span,
+.activity-exercising {
+ background-position: 0 -514px;
+}
+
+#my-infos .f-activity a[data-value=grooming] span,
+.activity-grooming {
+ background-position: 0 -550px;
+}
+
+#my-infos .f-activity a[data-value=having_appointment] span,
+.activity-having_appointment {
+ background-position: 0 -568px;
+}
+
+#my-infos .f-activity a[data-value=inactive] span,
+.activity-inactive {
+ background-position: 0 -532px;
+}
+
+#my-infos .f-activity a[data-value=relaxing] span,
+.activity-relaxing {
+ background-position: 0 -622px;
+}
+
+#my-infos .f-activity a[data-value=talking] span,
+.activity-talking {
+ background-position: 0 -604px;
+}
+
+#my-infos .f-activity a[data-value=traveling] span,
+.activity-traveling {
+ background-position: 0 -586px;
+}
+
+#my-infos .f-activity a[data-value=working] span,
+.activity-working {
+ background-position: 0 -640px;
+}
+
+#my-infos .element .icon.picker {
+ border-width: 1px 0 1px 1px;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ -moz-border-radius-topright: 0;
+ -moz-border-radius-bottomright: 0;
+ -webkit-border-top-right-radius: 0;
+ -webkit-border-bottom-right-radius: 0;
+}
+
+#my-infos .element .icon.disabled {
+ background-color: #f3f3f3;
+ border-color: #989898;
+ cursor: default;
+}
+
+#my-infos .element div.bubble {
+ background-color: white;
+ border-color: #636363;
+ border-width: 1px 1px 0 1px;
+ border-style: solid;
+ width: 25px;
+ padding: 1px 0;
+ position: absolute;
+ bottom: 21px;
+ left: 6px;
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px;
+ -moz-border-radius-topleft: 2px;
+ -moz-border-radius-topright: 2px;
+ -webkit-border-top-left-radius: 2px;
+ -webkit-border-top-right-radius: 2px;
+}
+
+#my-infos .element a {
+ float: left;
+}
+
+#my-infos .element .icon span {
+ height: 16px;
+ width: 16px;
+ margin: 3px 4px;
+ display: block;
+}
+
+#my-infos .element input {
+ height: 18px;
+ width: 190px;
+ font-size: 0.85em;
+ padding-left: 4px;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ -moz-border-radius-topleft: 0;
+ -moz-border-radius-bottomleft: 0;
+ -webkit-border-top-left-radius: 0;
+ -webkit-border-top-bottom-radius: 0;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the options CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 26/04/11
+
+*/
+
+#options label {
+ width: 190px;
+ font-size: 0.94em;
+}
+
+#options .forms {
+ width: 610px;
+ height: 328px;
+ margin: 15px 15px 15px 15px;
+ float: left;
+}
+
+#options .forms select {
+ margin-top: -3px;
+ min-width: 120px;
+ float: left;
+}
+
+#options .forms a.linked {
+ font-size: 0.9em;
+ float: left;
+}
+
+#options fieldset.privacy {
+ display: none;
+}
+
+#options .sub-ask-delete, #options .sub-ask-pass, #options .sub-ask-pass-success {
+ display: none;
+}
+
+#options .sub-ask {
+ display: none;
+ width: 592px;
+ padding: 8px;
+ float: left;
+ border: 1px #879da2 dotted;
+ background: #cbdde1;
+}
+
+#options .sub-ask-top {
+ font-size: 0.9em;
+ margin-top: -3px;
+}
+
+#options .sub-ask-title {
+ margin-bottom: 4px;
+ float: left;
+}
+
+#options .sub-ask-close {
+ float: right;
+}
+
+#options .sub-ask-close:hover {
+ cursor: pointer;
+}
+
+#options .sub-ask-content {
+ clear: both;
+ height: 25px;
+ font-size: 0.9em;
+ border-top: 1px #416972 solid;
+ padding: 12px 0;
+}
+
+#options .sub-ask-content label {
+ width: 125px;
+}
+
+#options .sub-ask-content input {
+ width: 125px;
+}
+
+#options .sub-ask-bottom {
+ clear: both;
+ font-size: 0.9em;
+ float: right;
+ text-decoration: underline;
+}
+
+#options .sub-ask-bottom:hover {
+ cursor: pointer;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the others CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 31/08/11
+
+*/
+
+#audio {
+ display: none;
+}
+
+#top-content {
+ position: absolute;
+ right: 5px;
+ left: 5px;
+ top: 0;
+ min-width: 860px;
+ z-index: 50;
+}
+
+#main-content {
+ position: absolute;
+ top: 34px;
+ left: 5px;
+ right: 5px;
+ bottom: 5px;
+ min-width: 850px;
+ min-height: 450px;
+}
+
+#left-content {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ width: 248px;
+}
+
+#right-content {
+ background-color: rgb(20,20,20);
+ background-color: rgba(20,20,20,0.85);
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 260px;
+ z-index: 10;
+ border-radius: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ box-shadow: 0 0 6px #5c5c5c;
+ -moz-box-shadow: 0 0 6px #5c5c5c;
+ -webkit-box-shadow: 0 0 6px #5c5c5c;
+}
+
+#general-wait {
+ background: url(../img/others/blank.gif) repeat;
+ z-index: 10000;
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+}
+
+.general-wait-content {
+ background-color: rgb(255,255,255);
+ background-color: rgba(255,255,255,0.9);
+ background-position: 8px 8px;
+ padding: 8px;
+ position: absolute;
+ right: 5px;
+ bottom: 5px;
+ border-radius: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ box-shadow: 0 0 2px #000;
+ -moz-box-shadow: 0 0 2px #000;
+ -webkit-box-shadow: 0 0 2px #000;
+}
+
+.inbox-hidable,
+.options-hidable,
+.pep-hidable,
+.pubsub-hidable,
+.archives-hidable,
+.commands-hidable,
+.privacy-hidable,
+.xmpplinks-hidable {
+ display: none;
+}
+
+#reconnect .pane {
+ background-color: rgb(20,20,20);
+ background-color: rgba(20,20,20,0.85);
+ color: white;
+ padding: 25px;
+ z-index: 10000;
+ text-shadow: 0 1px 1px black;
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ box-shadow: 0 0 35px #232323;
+ -moz-box-shadow: 0 0 35px #232323;
+ -webkit-box-shadow: 0 0 35px #232323;
+}
+
+#reconnect .pane a {
+ margin-top: -4px;
+ float: right;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the page-engine CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 31/08/11
+
+*/
+
+#page-engine {
+ background-color: #f4f4f4;
+ position: absolute;
+ top: 40px;
+ bottom: 6px;
+ right: 6px;
+ left: 6px;
+ z-index: 8;
+ border-radius: 3px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+}
+
+#page-engine .top {
+ background: #e8f1f3;
+ background: -moz-linear-gradient(top, #e8f1f3, #dee8ea);
+ background: -webkit-gradient(linear, left top, left bottom, from(#e8f1f3), to(#dee8ea));
+ border-bottom: 1px solid #d0d0d0;
+ color: black;
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ padding: 6px;
+ height: 80px;
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+ -moz-border-radius-topright: 3px;
+ -moz-border-radius-topleft: 3px;
+ -webkit-border-top-right-radius: 3px;
+ -webkit-border-top-left-radius: 3px;
+}
+
+#page-engine .top .avatar-container {
+ text-align: center;
+ margin: 2px 0 0 10px;
+ height: 76px;
+ width: 76px;
+ float: left;
+}
+
+#page-engine .top .avatar {
+ max-height: 76px;
+ max-width: 76px;
+}
+
+#page-engine .top .name {
+ text-align: right;
+ padding: 7px;
+}
+
+#page-engine p.bc-name {
+ font-size: 2.3em;
+ margin-bottom: 5px;
+}
+
+#page-engine p.bc-infos {
+ font-size: 0.85em;
+ height: 16px;
+ overflow: hidden;
+ position: absolute;
+ left: 115px;
+ right: 12px;
+}
+
+#page-engine .page-engine-chan[data-type=groupchat] p.bc-infos {
+ left: 12px;
+}
+
+#page-engine p.bc-infos span.show {
+ padding-left: 18px;
+}
+
+#page-engine p.bc-infos a {
+ text-decoration: underline;
+}
+
+#page-engine div.bc-pep {
+ float: right;
+}
+
+#page-engine div.bc-pep a {
+ height: 16px;
+ width: 16px;
+ margin-left: 4px;
+ float: left;
+}
+
+#page-engine div.bc-pep a:hover {
+ cursor: default;
+}
+
+#page-engine div.bc-pep a[href]:hover {
+ cursor: pointer;
+}
+
+#page-engine .content,
+#page-engine .list {
+ font-size: 0.9em;
+ position: absolute;
+ top: 93px;
+ right: 0;
+ bottom: 29px;
+ overflow: auto;
+ box-shadow: inset 0 3px 10px #e8e8e8;
+ -moz-box-shadow: inset 0 3px 10px #e8e8e8;
+ -webkit-box-shadow: inset 0 3px 10px #e8e8e8;
+}
+
+#page-engine .content {
+ left: 0;
+ padding: 12px 14px 0;
+}
+
+#page-engine .content a {
+ text-decoration: underline;
+}
+
+#page-engine .page-engine-chan {
+ display: none;
+}
+
+#page-engine .chat .content,
+#page-engine .chat .list {
+ bottom: 93px;
+}
+
+#page-engine .chat .content {
+ padding-bottom: 24px;
+}
+
+#page-engine .groupchat-content {
+ padding-bottom: 16px !important;
+ right: 191px !important;
+}
+
+#page-engine .list {
+ border-left: 1px solid #c8c8c8;
+ padding: 8px 0 0;
+ width: 190px;
+ right: 0;
+}
+
+#page-engine .list .role {
+ display: none;
+ margin-bottom: 10px;
+}
+
+#page-engine .list .title {
+ font-weight: bold;
+ color: #383838;
+ margin-left: 8px;
+}
+
+#page-engine .list .user {
+ background: #eff2f2;
+ background: -moz-linear-gradient(top, #eff2f2, #ecefef);
+ background: -webkit-gradient(linear, left top, left bottom, from(#eff2f2), to(#ecefef));
+ border-color: #c8c8c8;
+ border-width: 1px 0;
+ border-style: solid;
+ color: #383838;
+ margin-bottom: 3px;
+ height: 32px;
+ overflow: hidden;
+}
+
+#page-engine .list .user:hover {
+ background: #e9ecec;
+ cursor: pointer;
+}
+
+#page-engine .list .user:active {
+ background: #e3e7e7;
+}
+
+#page-engine .list .user.myself {
+ background-color: #eff2f2;
+ cursor: default;
+}
+
+#page-engine .list .user .name {
+ float: left;
+ height: 18px;
+ overflow: hidden;
+ margin: 7px 0 7px 3px;
+ padding-left: 18px;
+}
+
+#page-engine .list .user .avatar-container {
+ text-align: center;
+ float: right;
+ height: 32px;
+ width: 32px;
+}
+
+#page-engine .list .user .avatar {
+ max-height: 32px;
+ max-width: 32px;
+}
+
+#page-engine .one-group,
+#archives .one-group {
+ border-bottom: 1px dotted #d0d0d0;
+ padding-bottom: 8px;
+ margin-bottom: 10px;
+}
+
+#page-engine .one-line,
+#archives .one-line,
+#page-engine .one-group b.name,
+#archives .one-group b.name {
+ padding-left: 50px;
+ word-wrap: break-word;
+}
+
+#page-engine .one-group b.name,
+#archives .one-group b.name {
+ display: block;
+ margin-bottom: 4px;
+}
+
+#page-engine .one-group b.name.me,
+#archives .one-group b.name.me {
+ color: #123a5c;
+}
+
+#page-engine .one-group b.name.him,
+#archives .one-group b.name.him {
+ color: #801e1e;
+}
+
+#page-engine .one-group span.date,
+#archives .one-group span.date {
+ float: right;
+ font-size: 0.9em;
+}
+
+#page-engine .one-group .avatar-container,
+#archives .one-group .avatar-container {
+ text-align: center;
+ margin: 4px 0 0 6px;
+ height: 30px;
+ width: 30px;
+ float: left;
+}
+
+#page-engine .one-group .avatar,
+#archives .one-group .avatar {
+ max-height: 30px;
+ max-width: 30px;
+}
+
+#page-engine b.name.talk-images {
+ background-position: 50px -99px;
+ padding-left: 68px;
+}
+
+#page-engine .user-message,
+#archives .user-message {
+ margin-bottom: 3px;
+}
+
+#page-engine .system-message {
+ color: #053805 !important;
+ margin-bottom: 3px !important;
+ padding-left: 0 !important;
+}
+
+#page-engine .system-message a {
+ color: #053805 !important;
+}
+
+#page-engine .system-message p.help b {
+ margin-bottom: 5px;
+ text-decoration: underline;
+ display: block;
+}
+
+#page-engine .system-message p.help em {
+ width: 240px;
+ text-decoration: underline;
+ margin-left: 5px;
+ float: left;
+}
+
+#page-engine .my-nick {
+ font-weight: bold;
+}
+
+#page-engine .old-message {
+ font-size: 11px !important;
+ margin-bottom: 1px !important;
+}
+
+#page-engine .chatstate {
+ background-color: rgb(234,234,234);
+ background-color: rgba(234,234,234,0.8);
+ color: #2c2c2c;
+ padding: 3px 10px 2px 8px;
+ position: absolute;
+ bottom: 93px;
+ left: 0;
+ font-size: 0.75em;
+ border-top-right-radius: 3px;
+ -moz-border-radius-topright: 3px;
+ -webkit-border-top-right-radius: 3px;
+}
+
+#page-engine .text {
+ height: 93px;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+}
+
+#page-engine .footer {
+ background: #e8f1f3;
+ background: -moz-linear-gradient(top, #dee8ea, #e8f1f3);
+ background: -webkit-gradient(linear, left top, left bottom, from(#dee8ea), to(#e8f1f3));
+ border-color: #d0d0d0;
+ border-width: 1px 0 0;
+ border-style: solid;
+ color: black;
+ position: absolute;
+ left: 0;
+ right: 0;
+ padding: 6px;
+ height: 16px;
+}
+
+#page-engine .chat .footer {
+ border-width: 1px 0;
+ position: static;
+}
+
+#page-engine .chat-tools-content {
+ height: 16px;
+ width: 16px;
+ margin-right: 8px;
+ float: left;
+}
+
+#page-engine .tools-tooltip {
+ display: block;
+ height: 16px;
+ width: 16px;
+ overflow: hidden;
+ float: left;
+}
+
+#page-engine .text .chat-tools-smileys {
+ margin-left: 4px;
+}
+
+#page-engine .text .chat-tools-file {
+ display: none;
+}
+
+#page-engine .text .chat-tools-file.mini .bubble-file {
+ z-index: 39;
+}
+
+#page-engine .text .chat-tools-file.mini .tooltip-subitem {
+ width: 22px;
+ height: 20px;
+}
+
+#page-engine .text .chat-tools-file.mini .wait {
+ margin: -2px 0 0 -1px;
+}
+
+#page-engine .text .tools-smileys {
+ background-position: 0 -388px;
+}
+
+#page-engine .text .tools-style {
+ background-position: 0 -700px;
+}
+
+#page-engine .text .tools-file {
+ background-position: 0 -1956px;
+}
+
+#page-engine .text .tools-save {
+ background-position: 0 -719px;
+}
+
+#page-engine .text .tools-clear {
+ background-position: 0 -739px;
+}
+
+#page-engine .text .tools-infos,
+#channel .top div.shortcuts a.profile {
+ background-position: 0 -758px;
+}
+
+#page-engine .text .tools-add,
+#page-engine .text .tools-archives,
+#page-engine .text .tools-mucadmin {
+ display: none;
+}
+
+#page-engine .text .tools-mucadmin {
+ background-position: 0 -777px;
+}
+
+#page-engine .bubble-style label.bold {
+ font-weight: bold;
+}
+
+#page-engine .bubble-style label.italic {
+ font-style: italic;
+}
+
+#page-engine .bubble-style label.underline {
+ text-decoration: underline;
+}
+
+#page-engine .bubble-style a.color {
+ height: 18px;
+ width: 18px;
+ border-color: white;
+ border-width: 1px;
+ border-style: solid;
+ margin: 6px 5px 0 0;
+ float: left;
+ opacity: 0.6;
+ border-radius: 3px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ box-shadow: 0 0 5px black;
+ -moz-box-shadow: 0 0 5px black;
+ -webkit-box-shadow: 0 0 5px black;
+}
+
+#page-engine .bubble-style a.color:hover,
+#page-engine .bubble-style a.color:focus {
+ opacity: 0.7;
+}
+
+#page-engine .bubble-style a.color.selected {
+ opacity: 1;
+ border-color: #ffb20d;
+}
+
+#page-engine .bubble-file .tooltip-subitem {
+ width: 240px;
+}
+
+#page-engine .bubble-file input[type=file] {
+ width: 220px;
+}
+
+#page-engine .bubble-file input[type=submit],
+#page-engine .bubble-file input[type=reset] {
+ margin: 4px 4px 0 0;
+}
+
+#page-engine .text .compose,
+#page-engine .muc-ask {
+ position: absolute;
+ left: 0;
+}
+
+#page-engine .text .compose {
+ top: 29px;
+ right: 12px;
+ bottom: 12px;
+}
+
+#page-engine .muc-ask {
+ right: 0;
+ bottom: 0;
+}
+
+#page-engine .text textarea {
+ border: 1px solid #c8c8c8;
+ padding: 5px;
+ height: 100%;
+ width: 100%;
+ font-size: 1.1em;
+ border-radius: 3px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+ -moz-border-radius-topright: 0;
+ -moz-border-radius-topleft: 0;
+ -webkit-border-top-right-radius: 0;
+ -webkit-border-top-left-radius: 0;
+}
+
+#page-engine .muc-ask {
+ background-color: #e8f1f3;
+ height: 64px;
+ font-size: 0.9em;
+ right: 0;
+ z-index: 2;
+ border-bottom-left-radius: 3px;
+ border-bottom-right-radius: 3px;
+ -moz-border-radius-bottomleft: 3px;
+ -moz-border-radius-bottomright: 3px;
+ -webkit-border-bottom-left-radius: 3px;
+ -webkit-border-bottom-right-radius: 3px;
+}
+
+#page-engine .muc-ask label {
+ color: #224249;
+ margin: 23px 10px 0 16px;
+ font-weight: bold;
+}
+
+#page-engine .muc-ask input {
+ width: 200px;
+ margin: 19px 10px 0 10px;
+ padding: 3px;
+}
+
+#page-engine .tooltip {
+ position: absolute;
+ bottom: 84px;
+ margin-left: -13px;
+ z-index: 40;
+ font-size: 0.8em;
+ color: white;
+}
+
+#page-engine .tooltip a {
+ color: white;
+ text-decoration: underline;
+}
+
+#page-engine .tooltip-subitem {
+ background-color: rgb(0,0,0);
+ background-color: rgba(0,0,0,0.8);
+ padding: 10px;
+ width: 200px;
+ height: 110px;
+ text-shadow: 0 1px 1px black;
+ border-radius: 5px;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+}
+
+#page-engine .tooltip-subarrow {
+ background-position: 0 -251px;
+ opacity: 0.8;
+ height: 10px;
+ width: 18px;
+ margin-left: 12px;
+}
+
+#page-engine .tooltip .tooltip-top {
+ margin-bottom: 8px;
+ font-weight: bold;
+}
+
+#page-engine .tooltip label {
+ margin-bottom: 4px;
+ float: left;
+ clear: both;
+}
+
+#page-engine .tooltip label input[type=checkbox] {
+ margin: 0 6px 0 0;
+ float: left;
+}
+
+#page-engine .tooltip label.select {
+ margin-top: 5px;
+}
+
+#page-engine .tooltip input,
+#page-engine .tooltip select {
+ float: left;
+}
+
+#page-engine .tooltip select {
+ width: 100px;
+}
+
+#page-engine .tooltip .tooltip-actionlog:hover,
+#page-engine .tooltip .tooltip-actionlog:focus {
+ cursor: pointer;
+ text-decoration: underline;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the page-switch CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 22/05/11
+
+*/
+
+#page-switch {
+ position: absolute;
+ top: 15px;
+ left: 10px;
+ right: 10px;
+ z-index: 9;
+}
+
+#page-switch .chans {
+ position: absolute;
+ left: 0;
+ right: 40px;
+ top: 0;
+ height: 25px;
+ overflow: hidden;
+}
+
+#page-switch .more {
+ position: absolute;
+ right: 0;
+ top: 0;
+}
+
+#page-switch .more-button {
+ background-position: 6px -1372px;
+ background-color: #d9e7ea;
+ width: 7px;
+ height: 17px;
+ padding: 1px 6px;
+ font-size: 0.9em;
+ text-decoration: none;
+ border-radius: 2px;
+ -moz-border-radius: 2px;
+ -webkit-border-radius: 2px;
+}
+
+#page-switch .more-content {
+ background-color: #d9e7ea;
+ width: 200px;
+ max-height: 400px;
+ overflow: auto;
+ position: absolute;
+ margin: -2px 0 0 -181px;
+ padding: 4px 0;
+ font-size: 0.95em;
+ border-top-left-radius: 3px;
+ border-bottom-left-radius: 3px;
+ border-bottom-right-radius: 3px;
+ -moz-border-radius-topleft: 3px;
+ -moz-border-radius-bottomleft: 3px;
+ -moz-border-radius-bottomright: 3px;
+ -webkit-border-top-left-radius: 3px;
+ -webkit-border-bottom-left-radius: 3px;
+ -webkit-border-bottom-right-radius: 3px;
+}
+
+#page-switch .switcher {
+ background-color: #d9e7ea;
+ color: #17353b;
+ height: 15px;
+ padding: 5px 10px 5px 5px;
+ margin: 0 2px;
+ font-size: 0.85em;
+ float: left;
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+ -moz-border-radius-topright: 3px;
+ -moz-border-radius-topleft: 3px;
+ -webkit-border-top-right-radius: 3px;
+ -webkit-border-top-left-radius: 3px;
+}
+
+#page-switch .more-content .switcher {
+ background-color: #d9e7ea;
+ float: none;
+ margin: 0;
+ font-size: 0.9em;
+ border-radius: 0;
+ -moz-border-radius: 0;
+ -webkit-border-radius: 0;
+}
+
+#page-switch .more-content .switcher .exit {
+ display: block;
+}
+
+#page-switch .more-button:hover,
+#page-switch .more-button:focus,
+#page-switch .switcher:hover,
+#page-switch .switcher:focus,
+#page-switch .more-content .switcher:hover,
+#page-switch .more-content .switcher:focus {
+ background-color: #cedee1;
+ cursor: pointer;
+}
+
+#page-switch .more-button:active,
+#page-switch .switcher:active,
+#page-switch .more-content .switcher:active {
+ background-color: #c3d3d7;
+}
+
+#page-switch .switcher.activechan {
+ background-color: #e8f1f3;
+}
+
+#page-switch .more-content .switcher.activechan {
+ background-color: #d1e0e3;
+}
+
+#page-switch .icon {
+ height: 16px;
+ width: 16px;
+ float: left;
+}
+
+#page-switch .name {
+ float: left;
+ margin-left: 4px;
+ max-height: 16px;
+ max-width: 140px;
+ overflow: hidden;
+}
+
+#page-switch .exit {
+ display: none;
+ background-color: #bdd9dc;
+ border: 1px solid #80aab0;
+ color: #355e64;
+ height: 14px;
+ width: 13px;
+ margin-left: 10px;
+ font-size: 0.85em;
+ text-align: center;
+ text-decoration: none;
+ float: right;
+ border-radius: 2px;
+ -moz-border-radius: 2px;
+ -webkit-border-radius: 2px;
+}
+
+#page-switch .exit:hover,
+#page-switch .exit:focus {
+ background-color: #aac7cb;
+}
+
+#page-switch .exit:active {
+ background-color: #9bbdc1;
+}
+
+#page-switch .activechan .exit {
+ display: block;
+ float: right;
+}
+
+#page-switch .chan-newmessage {
+ background-color: #f6edc3 !important;
+}
+
+#page-switch .chan-newmessage:hover,
+#page-switch .chan-newmessage:focus {
+ background-color: #f1eac0 !important;
+}
+
+#page-switch .chan-newmessage:active {
+ background-color: #ede4b8 !important;
+}
+
+#page-switch .composing,
+#page-engine .list .user.composing {
+ color: #217021 !important;
+}
+
+#page-switch .paused,
+#page-switch .chan-unread .name,
+#page-engine .list .user.paused {
+ color: #2431ac !important;
+}
+
+#page-switch .active,
+#page-engine .list .user.active {
+ color: #353535 !important;
+}
+
+#page-switch .inactive,
+#page-engine .list .user.inactive {
+ color: #585858 !important;
+}
+
+#page-switch .gone {
+ color: #851313 !important;
+}
+
+#page-switch .channel .icon {
+ background-position: 0 -55px;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the popup CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 02/05/11
+
+*/
+
+.lock {
+ background-color: rgb(0,0,0);
+ background-color: rgba(0,0,0,0.6);
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ position: fixed;
+ z-index: 9999;
+}
+
+.popup {
+ background-color: rgb(20,20,20);
+ background-color: rgba(20,20,20,0.95);
+ margin-top: -250px;
+ margin-left: -330px;
+ width: 640px;
+ height: 500px;
+ padding: 0 10px;
+ position: absolute;
+ z-index: 10000;
+ left: 50%;
+ top: 50%;
+ border-radius: 5px;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ box-shadow: 0 0 35px #232323;
+ -moz-box-shadow: 0 0 35px #232323;
+ -webkit-box-shadow: 0 0 35px #232323;
+}
+
+.popup.large {
+ margin-left: -460px;
+ width: 920px;
+}
+
+.popup .top {
+ width: 600px;
+ height: 45px;
+ font-size: 1.2em;
+ padding-top: 9px;
+ color: white;
+ margin: 14px 0 0 40px;
+ text-transform: uppercase;
+ text-decoration: none;
+ font-weight: bold;
+ text-shadow: 0 2px 2px black;
+}
+
+.popup .tab {
+ width: 620px;
+ height: 25px;
+ margin: -5px 10px 0 10px;
+ position: relative;
+ z-index: 1;
+}
+
+.popup .tab a {
+ background-color: #d9e7ea;
+ color: #204249;
+ width: 180px;
+ height: 17px;
+ padding: 4px 4px 4px 16px;
+ margin-left: 5px;
+ font-size: 0.94em;
+ overflow: hidden;
+ float: left;
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+ -moz-border-radius-topright: 3px;
+ -moz-border-radius-topleft: 3px;
+ -webkit-border-top-right-radius: 3px;
+ -webkit-border-top-left-radius: 3px;
+}
+
+.popup .tab a:hover,
+.popup .tab a:focus {
+ background-color: #cedee1;
+ text-decoration: none;
+}
+
+.popup .tab a:active {
+ background-color: #c3d3d7;
+ text-decoration: none;
+}
+
+.popup .tab a.tab-active {
+ background-color: #e4eef9 !important;
+}
+
+.popup .one-lap {
+ display: none;
+}
+
+.popup .one-lap.lap-active {
+ display: block;
+}
+
+.popup .content {
+ background: #e4eef9;
+ background: -moz-linear-gradient(top, #e4eef9, #D0E5FA);
+ background: -webkit-gradient(linear, left top, left bottom, from(#e4eef9), to(#D0E5FA));
+ height: 358px;
+ width: 640px;
+ position: absolute;
+ left: 10px;
+ border-radius: 3px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ box-shadow: 0 0 20px black;
+ -moz-box-shadow: 0 0 20px black;
+ -webkit-box-shadow: 0 0 20px black;
+}
+
+.popup .content,
+.popup .content a {
+ color: #112a2f;
+}
+
+.popup.large div.comments {
+ background-color: #f4f4f4;
+ width: 272px;
+ margin: 0;
+ position: absolute;
+ right: 10px;
+ top: 63px;
+ bottom: 10px;
+ overflow-x: hidden;
+ overflow-y: auto;
+ border-radius: 3px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+}
+
+.popup.large div.comments div.comments-content {
+ font-size: 0.8em;
+}
+
+.popup.large div.comments input {
+ width: 185px;
+ min-width: 0;
+}
+
+.popup.large div.comments .one-comment {
+ padding-bottom: 4px;
+}
+
+.popup.large div.comments .one-comment a {
+ text-decoration: underline;
+}
+
+.popup.large div.comments div.comments-content {
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+ -moz-border-radius-topright: 3px;
+ -moz-border-radius-topleft: 3px;
+ -webkit-border-top-right-radius: 3px;
+ -webkit-border-top-left-radius: 3px;
+}
+
+.popup .head {
+ background: #f1f6fd;
+ border: 1px #9dc4fc solid;
+ width: 606px;
+ height: 24px;
+ margin: 0 10px 10px 10px;
+ padding: 6px;
+}
+
+.popup .head-text {
+ float: left;
+ font-size: 0.9em;
+ margin: 3px;
+}
+
+.popup .head-actions {
+ float: right;
+ margin-top: 2px;
+}
+
+.popup .head-actions a {
+ font-size: 0.9em;
+ margin: 0 4px;
+}
+
+.popup .actions a {
+ color: #30575f;
+ font-size: 0.9em;
+ margin-left: 5px;
+}
+
+.popup .head .head-input {
+ float: right;
+ width: 200px;
+ padding: 2px;
+}
+
+.popup .head .head-select {
+ float: right;
+ height: 24px;
+}
+
+.popup .forms {
+ width: 390px;
+ height: 328px;
+ margin: 15px;
+ float: left;
+}
+
+.popup fieldset {
+ border: 1px #547177 solid;
+ margin: 0 0 15px 0;
+ padding: 8px 2px 3px 2px;
+ border-radius: 3px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+}
+
+.popup legend {
+ font-size: 0.9em;
+ margin: 0 0 0 15px;
+ padding: 0 2px;
+ text-transform: uppercase;
+}
+
+.popup label {
+ color: #1b1b1b;
+ width: 150px;
+ margin: 0 0 10px 12px;
+ clear: both;
+ float: left;
+}
+
+.popup input,
+.popup select {
+ margin: 0 10px 10px 0;
+ float: left;
+}
+
+.popup input[type=text] {
+ min-width: 174px;
+}
+
+.popup select {
+ min-height: 20px;
+}
+
+.popup .results {
+ height: 310px;
+ width: 620px;
+ margin: -5px 0 0 10px;
+ padding: 6px 0 0 0;
+ overflow: auto;
+}
+
+.popup .results .no-results {
+ margin: 6px 0;
+ font-size: 0.85em;
+ font-weight: bold;
+}
+
+.popup .results label {
+ width: 180px;
+ margin: 6px 4px 4px 4px;
+}
+
+.popup .results input,
+.popup .results textarea,
+.popup .results select {
+ margin: 4px;
+}
+
+.popup .results input,
+.popup .results select {
+ min-width: 180px;
+}
+
+.popup .results input[type=checkbox],
+.popup .results input[type=radio] {
+ margin-top: 7px;
+}
+
+.popup .results textarea {
+ width: 380px;
+}
+
+.popup .results .avatar-container {
+ float: left;
+ width: 60px;
+ height: 60px;
+ margin: 5px 12px 5px 9px;
+ text-align: center;
+ background-repeat: no-repeat;
+}
+
+.popup .results img.avatar {
+ max-width: 60px;
+ max-height: 60px;
+}
+
+.popup .results .one-icon {
+ height: 16px;
+ width: 16px;
+ margin: 10px 3px 0 8px;
+ float: left;
+}
+
+.popup .results .one-icon.account,
+.popup .results .one-icon.auth {
+ background-position: 0 -777px;
+}
+
+.popup .results .one-icon.automation,
+.popup .results .one-icon.client {
+ background-position: 0 -1500px;
+}
+
+.popup .results .one-icon.collaboration {
+ background-position: 0 -1520px;
+}
+
+.popup .results .one-icon.proxy,
+.popup .results .one-icon.server,
+.popup .results .one-icon.others {
+ background-position: 0 -1540px;
+}
+
+.popup .results .one-icon.component,
+.popup .results .one-icon.gateway {
+ background-position: 0 -1560px;
+}
+
+.popup .results .one-icon.conference {
+ background-position: 0 -1082px;
+}
+
+.popup .results .one-icon.directory {
+ background-position: 0 -876px;
+}
+
+.popup .results .one-icon.headline,
+.popup .results .one-icon.hierarchy {
+ background-position: 0 -1580px;
+}
+
+.popup .results .one-icon.pubsub,
+.popup .results .one-icon.store {
+ background-position: 0 -1600px;
+}
+
+.popup .results .one-icon.loading {
+ background-position: 0 -1620px;
+}
+
+.popup .results .one-icon.down {
+ background-position: 0 -1640px;
+}
+
+.popup .results .one-host {
+ font-weight: bold;
+ width: 170px;
+}
+
+.popup .results .one-type {
+ width: 210px;
+}
+
+.popup .results .one-type,
+.popup .results .one-host {
+ float: left;
+ overflow: hidden;
+ margin: 9px 8px;
+}
+
+.popup .results .one-jid,
+.popup .results .one-ctry,
+.popup .results .one-fn {
+ margin: 4px;
+ width: 400px;
+}
+
+.popup .results .one-fn {
+ font-weight: bold;
+}
+
+.popup .results .one-jid {
+ margin-top: 8px;
+ font-size: 0.9em;
+}
+
+.popup .results .one-name {
+ float: left;
+ margin: 4px;
+}
+
+.popup a.one-button {
+ display: none;
+ background-color: #f1f6fd;
+ border: 1px solid #b9cbcf;
+ margin-top: 1px;
+ padding: 4px 8px;
+ text-decoration: none;
+ border-radius: 2px;
+ -moz-border-radius: 2px;
+ -webkit-border-radius: 2px;
+}
+
+.popup a.one-button:hover,
+.popup a.one-button:focus {
+ border: 1px solid #95b1b7;
+}
+
+.popup a.one-button:active {
+ border: 1px solid #77989f;
+}
+
+.popup .results .oneresult:hover a.one-button {
+ display: block;
+}
+
+.popup .results a.one-button,
+#inbox .one-message a.one-button {
+ float: right;
+ padding: 3px 6px;
+ margin-right: 4px;
+}
+
+.popup .results a.one-vjud {
+ position: absolute;
+ right: 4px;
+}
+
+.popup .results a.one-add {
+ top: 8px;
+}
+
+.popup .results a.one-chat {
+ top: 42px;
+}
+
+.popup .results .one-next {
+ float: right;
+ margin: 4px 8px 4px 4px;
+ font-weight: bold;
+}
+
+.popup .results .one-actions {
+ width: 148px;
+ margin: 4px;
+ float: left;
+}
+
+.popup .results .one-actions a {
+ width: 16px;
+ height: 16px;
+ padding: 2px 2px 4px 5px !important;
+ margin-top: 2px;
+}
+
+.popup .results .one-actions a.browse {
+ background-position: 3px -1396px;
+}
+
+.popup .results .one-actions a.command {
+ background-position: 3px -1415px;
+}
+
+.popup .results .one-actions a.subscribe {
+ background-position: 4px -1435px;
+}
+
+.popup .results .one-actions a.join {
+ background-position: 3px -1455px;
+}
+
+.popup .results .one-actions a.search {
+ background-position: 4px -1475px;
+}
+
+.popup .results a.submit,
+.popup .results a.cancel,
+.popup .results a.back {
+ margin-right: 8px;
+ float: right;
+}
+
+.popup .onetitle {
+ font-size: 0.9em;
+ padding: 4px;
+ font-weight: bold;
+}
+
+.popup .oneinstructions {
+ font-size: 0.9em;
+ padding: 4px;
+ margin: 8px 0;
+}
+
+.popup .oneresult {
+ font-size: 0.9em;
+ padding: 3px 0 4px 4px;
+ border-bottom: 1px #9dc4fc solid;
+ overflow: hidden;
+ position: relative;
+}
+
+.popup .oneresult:hover {
+ background: #e9f1fd;
+}
+
+.popup .oneresult[onclick]:hover {
+ cursor: pointer;
+}
+
+.popup .oneresult[onclick]:active {
+ background: #f1f6fd;
+}
+
+.popup .infos {
+ background-color: rgb(255,239,104);
+ background-color: rgba(255,239,104,0.8);
+ border: 1px #decb2f solid;
+ color: #3f3f3f;
+ padding: 8px;
+ margin: 10px;
+ font-size: 0.8em;
+}
+
+.popup .infos p {
+ margin-top: 10px;
+}
+
+.popup .infos p.infos-title {
+ font-weight: bold;
+}
+
+.popup .bottom {
+ width: 640px;
+ height: 40px;
+ position: absolute;
+ bottom: 8px;
+}
+
+.popup .wait {
+ display: none;
+ margin: 8px 0 0 3px;
+ float: left;
+}
+
+a.finish {
+ border: 1px solid white;
+ background-color: rgb(255,255,255);
+ background-color: rgba(255,255,255,0.1);
+ color: white;
+ padding: 4px 8px;
+ margin-right: 7px;
+ font-size: 0.95em;
+ text-align: center;
+ text-decoration: none;
+ text-shadow: 0 1px 1px black;
+ border-radius: 3px;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ box-shadow: 0 0 5px black;
+ -moz-box-shadow: 0 0 5px black;
+ -webkit-box-shadow: 0 0 5px black;
+}
+
+a.finish:hover,
+a.finish:focus {
+ cursor: pointer;
+ background-color: rgb(255,255,255);
+ background-color: rgba(255,255,255,0.2);
+ box-shadow: 0 0 15px black;
+ -moz-box-shadow: 0 0 15px black;
+ -webkit-box-shadow: 0 0 15px black;
+}
+
+a.finish:active {
+ background-color: rgb(255,255,255);
+ background-color: rgba(255,255,255,0.3);
+}
+
+a.finish.disabled {
+ opacity: 0.2;
+}
+
+a.finish.disabled:hover,
+a.finish.disabled:focus,
+a.finish.disabled:active {
+ cursor: default;
+ background-color: rgb(255,255,255);
+ background-color: rgba(255,255,255,0.1);
+}
+
+.popup a.finish {
+ margin-top: 6px;
+ float: right;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the privacy CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 16/02/11
+
+*/
+
+#privacy .content {
+ padding: 10px 0 10px 0;
+}
+
+#privacy .privacy-head div.list-left,
+#privacy .privacy-head div.list-center,
+#privacy .privacy-head div.list-right,
+#privacy .privacy-first {
+ float: left;
+}
+
+#privacy .privacy-head div.list-left {
+ margin-left: 5px;
+}
+
+#privacy .privacy-head div.list-center {
+ border-right: 1px dotted #1b393f;
+ height: 24px;
+ width: 1px;
+ margin-right: 15px;
+ padding-left: 18px;
+}
+
+#privacy .privacy-head span,
+#privacy .privacy-head a,
+#privacy .privacy-item span,
+#privacy .privacy-item a {
+ float: left;
+}
+
+#privacy .privacy-head span {
+ font-size: 0.9em;
+ font-weight: bold;
+ margin: 3px 10px 0 0;
+}
+
+#privacy .privacy-head input,
+#privacy .privacy-head select {
+ width: 180px;
+}
+
+#privacy .privacy-head input {
+ margin-top: 1px;
+}
+
+#privacy .privacy-head select,
+#privacy .privacy-item select {
+ margin-top: -2px;
+}
+
+#privacy .privacy-head span.left-space {
+ margin-left: 16px;
+}
+
+#privacy .privacy-head a,
+#privacy .privacy-item a {
+ width: 20px;
+ height: 20px;
+ padding: 0;
+ display: block;
+}
+
+#privacy .privacy-item a.item-add {
+ background-position: 2px -1178px;
+}
+
+#privacy .privacy-head a.list-remove,
+#privacy .privacy-item a.item-remove {
+ background-position: 2px -1197px;
+}
+
+#privacy .privacy-item a.item-save {
+ background-position: 3px -126px;
+ width: auto;
+ height: 19px;
+ padding: 1px 7px 0 21px;
+}
+
+#privacy .privacy-item,
+#privacy form,
+#privacy .privacy-active {
+ clear: both;
+}
+
+#privacy .privacy-item {
+ margin: 17px 12px;
+ font-size: 0.9em;
+}
+
+#privacy .privacy-item span {
+ font-weight: bold;
+}
+
+#privacy .privacy-item select {
+ width: 300px;
+ margin: -4px 30px 0 10px;
+}
+
+#privacy .privacy-item a {
+ margin: -2px 6px 0 0;
+}
+
+#privacy .privacy-first,
+#privacy .privacy-second,
+#privacy .privacy-third {
+ height: 195px;
+ font-size: 0.9em;
+ margin: 10px 0 0 10px;
+ float: left;
+}
+
+#privacy .privacy-first,
+#privacy .privacy-second {
+ border-right: 1px dotted #1b393f;
+ padding-right: 14px;
+}
+
+#privacy .privacy-first {
+ width: 125px;
+}
+
+#privacy .privacy-first label {
+ margin: 50px 0 0 15px;
+}
+
+#privacy .privacy-first label input {
+ margin-top: 2px;
+}
+
+#privacy .privacy-second {
+ width: 205px;
+}
+
+#privacy .privacy-second label {
+ margin: 2px 0 0 12px;
+}
+
+#privacy .privacy-second input[type=radio],
+#privacy .privacy-third input[type=checkbox] {
+ margin-top: 2px;
+ margin-bottom: 2px;
+}
+
+#privacy .privacy-second input[type=text],
+#privacy .privacy-second select {
+ width: 170px;
+ margin: 2px 0 11px 12px;
+ float: none;
+}
+
+#privacy .privacy-third label {
+ width: auto;
+ margin-top: 11px;
+}
+
+#privacy .privacy-third {
+ width: 240px;
+}
+
+#privacy .privacy-active {
+ margin: 34px 16px 0 16px;
+ font-size: 0.9em;
+}
+
+#privacy .privacy-active-elements {
+ float: right;
+}
+
+#privacy .privacy-active input[type=text] {
+ width: 30px;
+ margin: 0 0 0 8px;
+ float: none;
+}
+
+#privacy .privacy-active input[type=checkbox] {
+ margin: 2px 8px 0 0;
+ float: left;
+}
+
+#privacy .privacy-active label {
+ width: auto;
+ margin: 0 15px 0 0;
+ clear: none;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the Roster Item Exchange tool CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 05/02/11
+
+*/
+
+#rosterx .content {
+ padding: 10px 0 10px 0;
+}
+
+#rosterx .rosterx-head a {
+ font-size: 0.9em;
+ margin: 3px 4px;
+ float: left;
+}
+
+#rosterx .oneresult:hover {
+ cursor: pointer;
+}
+
+#rosterx .oneresult span {
+ margin: 2px 5px 0 5px;
+ overflow: hidden;
+ float: left;
+}
+
+#rosterx .oneresult span.name {
+ width: 230px;
+ font-weight: bold;
+}
+
+#rosterx .oneresult span.xid {
+ width: 270px;
+ font-size: 0.9em;
+}
+
+#rosterx .oneresult span.action {
+ width: 16px;
+ height: 16px;
+ margin-top: 4px;
+ float: right;
+}
+
+#rosterx .oneresult span.action.modify {
+ background-position: 0 -1244px;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the search tool CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 23/01/11
+
+*/
+
+.search {
+ position: relative;
+}
+
+.search input.suggested {
+ border-bottom: 1px solid white;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+ -moz-border-radius-bottomright: 0;
+ -moz-border-radius-bottomleft: 0;
+ -webkit-border-bottom-right-radius: 0;
+ -webkit-border-bottom-left-radius: 0;
+}
+
+.search ul {
+ background-color: rgb(255,255,255);
+ background-color: rgba(255,255,255,0.9);
+ border-color: #e1a014;
+ border-style: solid;
+ border-width: 0 1px 1px 1px;
+ position: absolute;
+ z-index: 1;
+ padding: 3px 0;
+ list-style: none;
+ overflow: auto;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+ -moz-border-radius-bottomright: 3px;
+ -moz-border-radius-bottomleft: 3px;
+ -webkit-border-bottom-right-radius: 3px;
+ -webkit-border-bottom-left-radius: 3px;
+}
+
+.search ul li {
+ padding: 2px 6px;
+ color: #3d3d3d;
+ text-shadow: none;
+}
+
+.search ul li:hover {
+ cursor: pointer;
+}
+
+.search ul li.hovered {
+ background-color: rgb(225,160,20);
+ background-color: rgba(225,160,20,0.3);
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the smileys CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 16/02/11
+
+*/
+
+.emoticon {
+ width: 16px;
+ height: 16px;
+}
+
+a.emoticon {
+ margin: 2px;
+ float: left;
+}
+
+a.emoticon:hover,
+a.emoticon:focus {
+ opacity: 0.8;
+}
+
+a.emoticon:active {
+ opacity: 0.7;
+}
+
+img.emoticon {
+ border: 0 none;
+ vertical-align: bottom;
+}
+
+.emoticon-biggrin {
+ background-position: 0 0;
+}
+
+.emoticon-devil {
+ background-position: -16px 0;
+}
+
+.emoticon-coolglasses {
+ background-position: -32px 0;
+}
+
+.emoticon-tongue {
+ background-position: -48px 0;
+}
+
+.emoticon-smile {
+ background-position: -64px 0;
+}
+
+.emoticon-wink {
+ background-position: -80px 0;
+}
+
+.emoticon-blush {
+ background-position: -96px 0;
+}
+
+.emoticon-stare {
+ background-position: -112px 0;
+}
+
+.emoticon-frowning {
+ background-position: -128px 0;
+}
+
+.emoticon-oh {
+ background-position: -144px 0;
+}
+
+.emoticon-unhappy {
+ background-position: -160px 0;
+}
+
+.emoticon-cry {
+ background-position: -176px 0;
+}
+
+.emoticon-angry {
+ background-position: -192px 0;
+}
+
+.emoticon-puke {
+ background-position: -208px 0;
+}
+
+.emoticon-hugright {
+ background-position: -224px 0;
+}
+
+.emoticon-hugleft {
+ background-position: -240px 0;
+}
+
+.emoticon-lion {
+ background-position: -256px 0;
+}
+
+.emoticon-pussy {
+ background-position: -272px 0;
+}
+
+.emoticon-bat {
+ background-position: -288px 0;
+}
+
+.emoticon-kiss {
+ background-position: -304px 0;
+}
+
+.emoticon-heart {
+ background-position: -320px 0;
+}
+
+.emoticon-brheart {
+ background-position: -336px 0;
+}
+
+.emoticon-flower {
+ background-position: -352px 0;
+}
+
+.emoticon-brflower {
+ background-position: -368px 0;
+}
+
+.emoticon-thumbup {
+ background-position: -384px 0;
+}
+
+.emoticon-thumbdown {
+ background-position: -400px 0;
+}
+
+.emoticon-lamp {
+ background-position: -416px 0;
+}
+
+.emoticon-coffee {
+ background-position: -432px 0;
+}
+
+.emoticon-drink {
+ background-position: -448px 0;
+}
+
+.emoticon-beer {
+ background-position: -464px 0;
+}
+
+.emoticon-boy {
+ background-position: -480px 0;
+}
+
+.emoticon-girl {
+ background-position: -496px 0;
+}
+
+.emoticon-phone {
+ background-position: -512px 0;
+}
+
+.emoticon-photo {
+ background-position: -528px 0;
+}
+
+.emoticon-music {
+ background-position: -544px 0;
+}
+
+.emoticon-cuffs {
+ background-position: -560px 0;
+}
+
+.emoticon-mail {
+ background-position: -576px 0;
+}
+
+.emoticon-rainbow {
+ background-position: -592px 0;
+}
+
+.emoticon-star {
+ background-position: -608px 0;
+}
+
+.emoticon-moon {
+ background-position: -624px 0;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the SVG stats CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Erwan Briand, Vanaryon
+Last revision: 20/11/10
+
+*/
+
+svg {
+ background-color: #e8f1f3;
+}
+
+.refline {
+ stroke: #596171;
+ stroke-width: 2px;
+}
+
+.refleft {
+ fill: #000000;
+ font-family: "Inconsolata", "DejaVu Serif sans", Verdana, sans-serif;
+ font-size: 8px;
+}
+
+.reftext {
+ fill: #586070;
+ font-family: "Inconsolata", "DejaVu Serif sans", Verdana, sans-serif;
+ font-size: 10px;
+}
+
+.bubbletextblue,
+.bubbletextred {
+ fill: none;
+ font-family: "Inconsolata", "DejaVu Serif sans", Verdana, sans-serif;
+ font-size: 8px;
+ text-anchor: end;
+}
+
+.bluebar {
+ fill: "#6C84C0";
+ fill-opacity: "0.6";
+}
+
+.gbar:hover .bluebar {
+ fill: #2A3F73;
+}
+
+.gbar:hover .redbar {
+ fill: #C70705;
+}
+
+.gbar:hover #bubble {
+ fill: white;
+ stroke: grey;
+}
+
+.gbar:hover .bubbletextblue {
+ fill: #2A3F73;
+}
+
+.gbar:hover .bubbletextred {
+ fill: #C70705;
+}
+
+.gbar:hover .reftext {
+ fill: #000000;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the tools CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 27/08/11
+
+*/
+
+#top-content .tools {
+ background-color: rgb(232,241,243);
+ background-color: rgba(232,241,243,0.6);
+ padding: 3px 8px 5px 8px;
+ min-width: 10px;
+ height: 17px;
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ -moz-border-radius-bottomleft: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+}
+
+#top-content .tools a {
+ color: black;
+ padding: 0 3px;
+ margin: 0 1.5px;
+}
+
+#top-content .tools a:hover,
+#top-content .tools a:focus {
+ cursor: pointer;
+ text-decoration: underline;
+}
+
+#top-content .tools-logo {
+ background-position: 9px 2px;
+ width: 74px;
+ float: left;
+}
+
+#top-content .tools-all {
+ float: right;
+ text-align: right;
+ margin-left: 8px;
+ font-size: 0.9em;
+ color: black;
+}
+
+#top-content .notifications {
+ background-position: 7px -1264px;
+}
+
+#top-content .music {
+ background-position: 6px -1286px;
+}
+
+#top-content .notifications:hover,
+#top-content .music:hover {
+ cursor: pointer;
+}
+
+#top-content .music:hover,
+#top-content .notifications:hover,
+#top-content .music:focus,
+#top-content .notifications:focus {
+ background-color: rgb(232,241,243);
+ background-color: rgba(232,241,243,0.7);
+}
+
+#top-content .music:active,
+#top-content .notifications:active {
+ background-color: rgb(232,241,243);
+ background-color: rgba(232,241,243,0.8);
+}
+
+#top-content .actived,
+#top-content .actived:hover,
+#top-content .actived:focus,
+#top-content .actived:active {
+ background-color: rgb(232,241,243) !important;
+ background-color: rgba(232,241,243,0.9) !important;
+}
+
+#top-content .notify {
+ background-color: #c60505;
+ color: white;
+ font-size: 0.7em;
+ font-weight: bold;
+ margin-left: -10px;
+ padding: 1px 4px;
+ position: absolute;
+ bottom: -2px;
+ border-radius: 10px;
+ -moz-border-radius: 10px;
+ -webkit-border-radius: 10px;
+}
+
+#top-content .tools-content {
+ display: none;
+ position: absolute;
+ top: 25px;
+ margin-left: -8px;
+}
+
+.tools-content-subarrow {
+ background-position: 0 -241px;
+ opacity: 0.8;
+ height: 10px;
+ width: 18px;
+ margin-left: 12px;
+}
+
+.tools-content-subitem {
+ background-color: rgb(0,0,0);
+ background-color: rgba(0,0,0,0.8);
+ padding: 14px 6px 6px 6px;
+ border-radius: 5px;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+}
+
+.notifications-content {
+ width: 240px;
+}
+
+.notifications-content .tools-content-subitem {
+ max-height: 250px;
+ color: white;
+ text-shadow: 0 1px 1px black;
+ text-align: left;
+ overflow-x: none;
+ overflow-y: auto;
+}
+
+.notifications-content .empty {
+ color: white;
+ font-size: 0.9em;
+ text-decoration: underline;
+ margin: -8px 4px 2px 0;
+ display: none;
+ float: right;
+}
+
+.notifications-content .nothing {
+ font-size: 0.9em;
+ margin: 5px;
+}
+
+.notifications-content .one-notification {
+ padding: 6px 4px;
+ font-size: 0.85em;
+ clear: both;
+ border-radius: 2px;
+ -moz-border-radius: 2px;
+ -webkit-border-radius: 2px;
+}
+
+.notifications-content .one-notification:hover,
+.notifications-content .one-notification:focus {
+ background-color: rgb(255,255,255);
+ background-color: rgba(255,255,255,0.1);
+}
+
+.notifications-content .one-notification:active {
+ background-color: rgb(255,255,255);
+ background-color: rgba(255,255,255,0.2);
+}
+
+.notifications-content .avatar-container {
+ float: left;
+ width: 40px;
+ height: 40px;
+ margin: 0 8px 8px 0;
+ text-align: center;
+ background-repeat: no-repeat;
+}
+
+.notifications-content .avatar {
+ max-width: 40px;
+ max-height: 40px;
+}
+
+.notifications-content .notification-text,
+.notifications-content .notification-actions {
+ margin-left: 48px;
+ overflow: hidden;
+}
+
+.notifications-content .notification-actions {
+ margin-top: 3px;
+}
+
+.notifications-content .notification-actions a {
+ color: white;
+ font-weight: bold;
+ font-size: 0.9em;
+ text-decoration: underline;
+ margin-right: 8px;
+}
+
+.notifications-content .one-notification .notification-actions span.talk-images {
+ background-position: 0 -1828px;
+ width: 16px;
+ height: 16px;
+ margin: -1px 6px 0 0;
+ float: left;
+}
+
+.notifications-content .one-notification[data-type=subscribe] .notification-actions span.talk-images {
+ background-position: 0 -1796px;
+}
+
+.notifications-content .one-notification[data-type=invite_room] .notification-actions span.talk-images {
+ background-position: 0 -1812px;
+}
+
+.notifications-content .one-notification[data-type=send] .notification-actions span.talk-images,
+.notifications-content .one-notification[data-type=send_accept] .notification-actions span.talk-images,
+.notifications-content .one-notification[data-type=send_reject] .notification-actions span.talk-images,
+.notifications-content .one-notification[data-type=send_fail] .notification-actions span.talk-images {
+ background-position: 0 -1956px;
+}
+
+.notifications-content .one-notification[data-type=rosterx] .notification-actions span.talk-images {
+ background-position: 0 -1844px;
+}
+
+.notifications-content .one-notification[data-type=comment] .notification-actions span.talk-images {
+ background-position: 0 -1860px;
+}
+
+.notifications-content .one-notification[data-type=like] .notification-actions span.talk-images {
+ background-position: 0 -1876px;
+}
+
+.notifications-content .one-notification[data-type=quote] .notification-actions span.talk-images {
+ background-position: 0 -1892px;
+}
+
+.notifications-content .one-notification[data-type=wall] .notification-actions span.talk-images {
+ background-position: 0 -1908px;
+}
+
+.notifications-content .one-notification[data-type=photo] .notification-actions span.talk-images {
+ background-position: 0 -1924px;
+}
+
+.notifications-content .one-notification[data-type=video] .notification-actions span.talk-images {
+ background-position: 0 -1940px;
+}
+
+.music-content {
+ width: 220px;
+}
+
+.music-content .tools-content-subitem {
+ height: 247px;
+}
+
+.music-content .player {
+ background: #b5d5db;
+ background: -moz-linear-gradient(top, #b5d5db, #adced4);
+ background: -webkit-gradient(linear, left top, left bottom, from(#b5d5db), to(#adced4));
+ height: 20px;
+ padding: 2px 5px;
+ border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ -moz-border-radius-topright: 4px;
+ -moz-border-radius-topleft: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+}
+
+.music-content .player a {
+ margin: 2px;
+ height: 16px;
+ width: 16px;
+ float: left;
+}
+
+.music-content .player a:hover,
+.music-content .player a:focus {
+ opacity: 0.8;
+}
+
+.music-content .player a:active {
+ opacity: 0.6;
+}
+
+.music-content .stop {
+ display: none;
+ background-position: 0 -270px;
+}
+
+.music-content .list {
+ background-color: #e8f1f3;
+ height: 188px;
+ padding: 5px;
+ text-align: left;
+ overflow-y: auto;
+ overflow-x: hidden;
+}
+
+.music-content p.no-results {
+ display: none;
+ color: black;
+ font-size: 0.9em;
+}
+
+.music-content div.special {
+ padding-bottom: 2px;
+ margin-bottom: 6px;
+ border-bottom: 1px solid #c3d4d7;
+}
+
+.music-content .song {
+ display: block;
+ margin: 3px 0;
+ font-size: 0.8em;
+}
+
+.music-content .playing {
+ font-weight: bold;
+}
+
+.music-content .search {
+ background-color: #e8f1f3;
+ height: 25px;
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ -moz-border-radius-bottomleft: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+}
+
+.music-content .search input {
+ margin: 2px;
+ width: 198px;
+ height: 15px;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the user-infos CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 27/03/11
+
+*/
+
+#userinfos .content {
+ overflow: auto;
+}
+
+#userinfos .one-lap a {
+ text-decoration: underline;
+}
+
+#userinfos .main-infos {
+ margin: 20px 20px 8px 20px;
+ height: 120px;
+ background: white;
+ position: relative;
+ border-radius: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+}
+
+#userinfos .avatar-container {
+ float: left;
+ text-align: center;
+ margin: 20px 35px;
+ width: 80px;
+ height: 80px;
+}
+
+#userinfos .avatar {
+ max-width: 80px;
+ max-height: 80px;
+}
+
+#userinfos h1,
+#userinfos h2,
+#userinfos h3 {
+ width: 410px;
+ overflow: hidden;
+}
+
+#userinfos h1 {
+ font-size: 2em;
+ padding-top: 12px;
+ margin-bottom: 4px;
+}
+
+#userinfos h2 {
+ color: #447079;
+ font-size: 1.1em;
+ margin-bottom: 10px;
+}
+
+#userinfos h3 {
+ color: #6e8388;
+ font-size: 0.8em;
+}
+
+#userinfos .main-infos div.shortcuts {
+ position: absolute;
+ top: 10px;
+ right: 12px;
+}
+
+#userinfos .block-infos {
+ margin: 7px 20px;
+ float: left;
+}
+
+#userinfos .one-line {
+ margin: 4px 0;
+ font-size: 0.9em;
+ float: left;
+}
+
+#userinfos .one-line b {
+ width: 120px;
+ float: left;
+}
+
+#userinfos .one-line span.reset-info {
+ float: left;
+ width: 460px;
+}
+
+#userinfos textarea {
+ margin: 30px 0 0 30px;
+ width: 572px;
+ height: 292px;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the vCard CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 16/01/12
+
+*/
+
+#vcard label {
+ font-size: 0.94em;
+ margin-top: 2px;
+}
+
+#vcard #vcard-avatar input[type=file] {
+ margin-left: 15px;
+}
+
+#vcard .avatar-container {
+ float: left;
+ text-align: center;
+ margin: 20px 0 35px 35px;
+ max-width: 96px;
+ max-height: 96px;
+}
+
+#vcard .avatar {
+ max-width: 96px;
+ max-height: 96px;
+}
+
+#vcard .avatar-delete {
+ background-position: 3px -1195px;
+ margin: 12px 25px 0 025px;
+ padding-left: 20px;
+ font-size: 0.9em;
+ float: right;
+}
+
+#vcard .no-avatar {
+ width: 300px;
+ color: #7c2222;
+ padding: 10px;
+ margin: 15px 0 20px 40px;
+ background: #f8cece;
+ border: 1px #ba6d6d solid;
+ font-size: 0.8em;
+}
+
+#vcard .forms textarea {
+ height: 111px;
+ width: 358px;
+ margin: 5px 12px 10px 12px;
+}
+
+#vcard .forms .avatar-info {
+ border-width: 1px;
+ border-style: solid;
+ display: none;
+ width: 370px;
+ height: 15px;
+ font-size: 0.85em;
+ padding: 10px;
+}
+
+#vcard .forms .avatar-wait {
+ background-color: #9bcbed;
+ color: #0a3858;
+ border-color: #306780;
+}
+
+#vcard .forms .avatar-ok {
+ background-color: #c4ed9b;
+ color: #325213;
+ border-color: #578030;
+}
+
+#vcard .forms .avatar-error {
+ background-color: #e79595;
+ color: #6a0b0b;
+ border-color: #7c1010;
+}
+
+#vcard .infos {
+ width: 179px;
+ height: 328px;
+ margin: 15px 15px 15px 0;
+ padding: 0 8px;
+ float: right;
+}
+
+#vcard .infos a {
+ text-decoration: underline;
+}
+
+#vcard .send {
+ float: right;
+}
+
+#vcard .send:hover {
+ cursor: pointer;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the welcome tool CSS stylesheet for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 26/04/11
+
+*/
+
+#welcome .infos {
+ margin: 15px;
+}
+
+#welcome .infos p {
+ margin-top: 6px;
+}
+
+#welcome .infos p.infos-title {
+ margin-top: 0;
+}
+
+#welcome a.box {
+ background-color: #e4eef9;
+ border: 1px solid #ccdbde;
+ margin: 12px 11px 4px 15px;
+ padding: 10px;
+ width: 270px;
+ text-decoration: none;
+ float: left;
+ border-radius: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+}
+
+#welcome a.box.share {
+ width: 350px;
+ margin: 4px 130px;
+ padding: 4px 10px;
+ clear: both;
+}
+
+#welcome a.box.share.first {
+ margin-top: 0;
+}
+
+#welcome a.box.share:hover span.go {
+ display: block;
+}
+
+#welcome a.box:hover,
+#welcome a.box:focus {
+ border: 1px solid #93c5fa;
+}
+
+#welcome a.box:active {
+ border: 1px solid #419afa;
+}
+
+#welcome a.box.enabled {
+ background-color: #f1f6fd;
+ border: 1px solid #9dc4fc;
+}
+
+#welcome a.box span {
+ margin: 3px 0;
+ display: block;
+}
+
+#welcome a.box span.logo {
+ height: 35px;
+ width: 35px;
+ margin-right: 15px;
+ float: left;
+}
+
+#welcome a.box span.logo.facebook {
+ background-position: 0 0;
+}
+
+#welcome a.box span.logo.twitter {
+ background-position: -35px 0;
+}
+
+#welcome a.box span.logo.buzz {
+ background-position: -70px 0;
+}
+
+#welcome a.box span.logo.identica {
+ background-position: -105px 0;
+}
+
+#welcome a.box span.option,
+#welcome a.box span.name {
+ font-size: 0.9em;
+ font-weight: bold;
+}
+
+#welcome a.box span.description {
+ font-size: 0.7em;
+ margin-top: 7px;
+}
+
+#welcome a.box.share span.description {
+ margin-top: 4px;
+}
+
+#welcome a.box span.image {
+ height: 16px;
+ width: 16px;
+ margin: -30px 12px 0 0;
+ float: right;
+}
+
+#welcome a.box span.image.sound {
+ background-position: 0 -900px;
+}
+
+#welcome a.box span.image.geolocation {
+ background-position: 0 -658px;
+}
+
+#welcome a.box span.image.xmpp {
+ background-position: 0 -990px;
+}
+
+#welcome a.box span.image.archives,
+#page-engine .text .tools-archives {
+ background-position: 0 -1025px;
+}
+
+#welcome a.box span.image.offline {
+ background-position: 0 -80px;
+}
+
+#welcome a.box span.tick,
+#welcome a.box span.go {
+ height: 16px;
+ width: 16px;
+ display: none;
+ float: right;
+}
+
+#welcome a.box span.tick {
+ background-position: 0 -1661px;
+ margin: -52px -15px 0 0;
+}
+
+#welcome a.box span.go {
+ background-position: 0 -1120px;
+ margin: -28px 5px 0 0;
+}
+
+#welcome a.box.enabled span.tick {
+ display: block;
+}
+
+#welcome div.results {
+ margin: -7px 15px;
+ padding: 0;
+ height: 272px;
+ overflow: auto;
+}
+
+#welcome .bottom .finish.save {
+ display: none;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the Ad-Hoc JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 11/07/11
+
+*/
+
+// Opens the adhoc popup
+function openAdHoc() {
+ // Popup HTML content
+ var html =
+ '<div class="top">' + _e("Commands") + '</div>' +
+
+ '<div class="content">' +
+ '<div class="adhoc-head"></div>' +
+
+ '<div class="results adhoc-results"></div>' +
+ '</div>' +
+
+ '<div class="bottom">' +
+ '<div class="wait wait-medium"></div>' +
+
+ '<a href="#" class="finish">' + _e("Close") + '</a>' +
+ '</div>';
+
+ // Create the popup
+ createPopup('adhoc', html);
+
+ // Associate the events
+ launchAdHoc();
+
+ return false;
+}
+
+// Quits the adhoc popup
+function closeAdHoc() {
+ // Destroy the popup
+ destroyPopup('adhoc');
+
+ return false;
+}
+
+// Retrieves an entity adhoc command
+function retrieveAdHoc(xid) {
+ // Open the popup
+ openAdHoc();
+
+ // Add a XID marker
+ $('#adhoc .adhoc-head').html('<b>' + getBuddyName(xid).htmlEnc() + '</b> (' + xid.htmlEnc() + ')');
+
+ // Get the highest entity resource
+ var highest = getHighestResource(xid);
+
+ if(highest)
+ xid = highest;
+
+ // Start a new adhoc command
+ dataForm(xid, 'command', '', '', 'adhoc');
+
+ return false;
+}
+
+// Starts an adhoc command on the user server
+function serverAdHoc(server) {
+ // Open the popup
+ openAdHoc();
+
+ // Add a XID marker
+ $('#adhoc .adhoc-head').html('<b>' + server.htmlEnc() + '</b>');
+
+ // Start a new adhoc command
+ dataForm(server, 'command', '', '', 'adhoc');
+}
+
+// Plugin launcher
+function launchAdHoc() {
+ // Click event
+ $('#adhoc .bottom .finish').click(closeAdHoc);
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the anonymous mode JS script for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Authors: Vanaryon, LinkMauve
+Last revision: 02/10/11
+
+*/
+
+// Connected to an anonymous session
+function anonymousConnected(con) {
+ logThis('Jappix (anonymous) is now connected.', 3);
+
+ // Connected marker
+ CONNECTED = true;
+ CURRENT_SESSION = true;
+ RECONNECT_TRY = 0;
+ RECONNECT_TIMER = 0;
+
+ // Not resumed?
+ if(!RESUME) {
+ // Create the app
+ createTalkPage();
+
+ // Send our first presence
+ firstPresence('');
+
+ // Set last activity stamp
+ LAST_ACTIVITY = getTimeStamp();
+
+ // Create the new groupchat
+ checkChatCreate(generateXID(ANONYMOUS_ROOM, 'groupchat'), 'groupchat');
+
+ // Remove some nasty elements for the anonymous mode
+ $('.tools-mucadmin, .tools-add').remove();
+ }
+
+ // Resumed
+ else {
+ // Send again our presence
+ presenceSend();
+
+ // Change the title
+ updateTitle();
+ }
+
+ // Remove the waiting icon
+ removeGeneralWait();
+}
+
+// Disconnected from an anonymous session
+function anonymousDisconnected() {
+ logThis('Jappix (anonymous) is now disconnected.', 3);
+}
+
+// Logins to a anonymous account
+function anonymousLogin(server) {
+ try {
+ // We define the http binding parameters
+ oArgs = new Object();
+
+ if(HOST_BOSH_MAIN)
+ oArgs.httpbase = HOST_BOSH_MAIN;
+ else
+ oArgs.httpbase = HOST_BOSH;
+
+ // We create the new http-binding connection
+ con = new JSJaCHttpBindingConnection(oArgs);
+
+ // And we handle everything that happen
+ con.registerHandler('message', handleMessage);
+ con.registerHandler('presence', handlePresence);
+ con.registerHandler('iq', handleIQ);
+ con.registerHandler('onconnect', anonymousConnected);
+ con.registerHandler('onerror', handleError);
+ con.registerHandler('ondisconnect', anonymousDisconnected);
+
+ // We set the anonymous connection parameters
+ oArgs = new Object();
+ oArgs.domain = server;
+ oArgs.authtype = 'saslanon';
+ oArgs.resource = JAPPIX_RESOURCE + ' Anonymous (' + (new Date()).getTime() + ')';
+ oArgs.secure = true;
+ oArgs.xmllang = XML_LANG;
+
+ // We connect !
+ con.connect(oArgs);
+
+ // Change the page title
+ pageTitle('wait');
+ }
+
+ catch(e) {
+ // Logs errors
+ logThis('Error while anonymous loggin in: ' + e, 1);
+
+ // Reset Jappix
+ anonymousDisconnected();
+
+ // Open an unknown error
+ openThisError(2);
+ }
+
+ finally {
+ return false;
+ }
+}
+
+// Plugin launcher
+function launchAnonymous() {
+ logThis('Anonymous mode detected, connecting...', 3);
+
+ // We add the login wait div
+ showGeneralWait();
+
+ // Get the vars
+ if(LINK_VARS['r'])
+ ANONYMOUS_ROOM = LINK_VARS['r'];
+ if(LINK_VARS['n'])
+ ANONYMOUS_NICK = LINK_VARS['n'];
+
+ // Fire the login action
+ anonymousLogin(HOST_ANONYMOUS);
+}
+
+// Launch this plugin!
+$(document).ready(launchAnonymous);
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the archives functions for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 03/03/11
+
+*/
+
+// Opens the archive tools
+function openArchives() {
+ // Popup HTML content
+ var html =
+ '<div class="top">' + _e("Message archives") + '</div>' +
+
+ '<div class="content">' +
+ '<div class="filter">' +
+ '<select class="friend" multiple=""></select>' +
+
+ '<div class="date"></div>' +
+ '</div>' +
+
+ '<div class="current">' +
+ '<span class="name"></span>' +
+ '<span class="time">' + _e("Please select a friend to view the chat history.") + '</span>' +
+ '</div>' +
+
+ '<div class="logs" id="chat-content-archives"></div>' +
+ '</div>' +
+
+ '<div class="bottom">' +
+ '<div class="wait wait-medium"></div>' +
+
+ '<a href="#" class="finish">' + _e("Close") + '</a>' +
+ '</div>';
+
+ // Create the popup
+ createPopup('archives', html);
+
+ // Associate the events
+ launchArchives();
+
+ // Get all the buddies in our roster
+ var buddies = getAllBuddies();
+ var options = '';
+
+ for(i in buddies) {
+ var current = buddies[i];
+
+ // Add the current buddy
+ options += '<option value="' + encodeQuotes(current) + '">' + getBuddyName(current).htmlEnc() + '</option>';
+ }
+
+ // Can append the buddy HTML code?
+ if(options)
+ $('#archives .filter .friend').append(options);
+
+ return false;
+}
+
+// Closes the archive tools
+function closeArchives() {
+ // Destroy the popup
+ destroyPopup('archives');
+
+ return false;
+}
+
+// Gets the archives list for a buddy
+function getListArchives(xid) {
+ // Reset the archives viewer
+ $('#archives .logs').empty();
+
+ // Show the waiting icon
+ $('#archives .wait').show();
+
+ // Apply the ID
+ var id = genID();
+ $('#archives').attr('data-session', id);
+
+ // New IQ
+ var iq = new JSJaCIQ();
+ iq.setType('get');
+ iq.setID(id);
+
+ var list = iq.appendNode('list', {'xmlns': NS_URN_ARCHIVE, 'with': xid});
+ var set = list.appendChild(iq.buildNode('set', {'xmlns': NS_RSM}));
+ set.appendChild(iq.buildNode('max', {'xmlns': NS_RSM}, '0'));
+
+ con.send(iq, handleListArchives);
+
+ logThis('Getting archives list for: ' + xid + '...');
+}
+
+// Handles the archives list for a buddy
+function handleListArchives(iq) {
+ // Hide the waiting icon
+ $('#archives .wait').hide();
+
+ // Any error?
+ if(handleErrorReply(iq) || !exists('#archives[data-session=' + iq.getID() + ']'))
+ return;
+
+ // Get the last archive date
+ var last = $(iq.getNode()).find('list set changed').text();
+
+ // Any last archive?
+ if(last) {
+ // Read the date
+ var date = Date.jab2date(last);
+
+ // Change the datepicker value
+ $('#archives .filter .date').DatePickerSetDate(date, true);
+
+ // Retrieve the archives
+ checkChangeArchives();
+ }
+
+ logThis('Got archives list.', 2);
+}
+
+// Gets the archives for a day
+function getDayArchives(xid, date) {
+ // Reset the archives viewer
+ $('#archives .logs').empty();
+
+ // Show the waiting icon
+ $('#archives .wait').show();
+
+ // Apply the ID
+ var id = genID();
+ $('#archives').attr('data-session', id);
+
+ // New IQ
+ var iq = new JSJaCIQ();
+ iq.setType('get');
+ iq.setID(id);
+
+ iq.appendNode('list', {'xmlns': NS_URN_ARCHIVE, 'with': xid, 'start': date + 'T00:00:00Z', 'end': date + 'T23:59:59Z'});
+
+ con.send(iq, handleDayArchives);
+
+ logThis('Getting day archives (' + date + ') for: ' + xid + '...');
+}
+
+// Handles the archives for a day
+function handleDayArchives(iq) {
+ // Hide the waiting icon
+ $('#archives .wait').hide();
+
+ // Any error?
+ if(handleErrorReply(iq) || !exists('#archives[data-session=' + iq.getID() + ']'))
+ return;
+
+ // Get each archive thread
+ $(iq.getNode()).find('chat').each(function() {
+ // Current values
+ var xid = $(this).attr('with');
+ var start = $(this).attr('start');
+
+ if(xid && start)
+ $('#archives .logs').append('<input class="archives-pending" type="hidden" data-with="' + encodeQuotes(xid) + '" data-start="' + encodeQuotes(start) + '" />');
+ });
+
+ // Display the day
+ var date = parseDay($('#archives .filter .date').DatePickerGetDate(true) + 'T00:00:00Z' + getDateTZO());
+
+ // Try to get the first thread
+ var pending = '#archives input.archives-pending:first';
+
+ if(!exists(pending))
+ date = printf(_e("Nothing found for: %s"), date);
+
+ else {
+ retrieveArchives($(pending).attr('data-with'), $(pending).attr('data-start'));
+ $(pending).remove();
+ }
+
+ $('#archives .current .time').text(date);
+
+ logThis('Got day archives.', 2);
+}
+
+// Retrieves a specified archive collection
+function retrieveArchives(xid, start) {
+ // Show the waiting icon
+ $('#archives .wait').show();
+
+ // Apply the ID
+ var id = genID();
+ $('#archives').attr('data-session', id);
+
+ // New IQ
+ var iq = new JSJaCIQ();
+ iq.setType('get');
+ iq.setID(id);
+
+ var list = iq.appendNode('retrieve', {'xmlns': NS_URN_ARCHIVE, 'with': xid, 'start': start});
+
+ con.send(iq, handleRetrieveArchives);
+
+ logThis('Retrieving archives (start: ' + start + ') for: ' + xid + '...');
+}
+
+// Handles a specified archive collection
+function handleRetrieveArchives(iq) {
+ // Hide the waiting icon
+ $('#archives .wait').hide();
+
+ // Any error?
+ if(handleErrorReply(iq) || !exists('#archives[data-session=' + iq.getID() + ']'))
+ return;
+
+ // Get the node
+ var chat = $(iq.getNode()).find('chat:first');
+
+ // Get the buddy XID
+ var xid = bareXID(chat.attr('with'));
+
+ // Get the start date & stamp
+ var start_date = Date.jab2date(chat.attr('start'));
+ var start_stamp = extractStamp(start_date);
+
+ // Parse the result chat
+ chat.find('to, from').each(function() {
+ var node = (this).nodeName;
+ var stamp = start_stamp + parseInt($(this).attr('secs'));
+ var date = extractTime(new Date(stamp * 1000));
+ var body = $(this).find('body').text();
+
+ // Is it my message?
+ if((node == 'to') && body)
+ displayMessage('chat', getXID(), 'archives', getBuddyName(getXID()).htmlEnc(), body, date, start_stamp, 'user-message', true, '', 'me');
+
+ // Is it a buddy message?
+ else if((node == 'from') && body)
+ displayMessage('chat', xid, 'archives', getBuddyName(xid).htmlEnc(), body, date, start_stamp, 'user-message', true, '', 'him');
+ });
+
+ // Not the latest thread?
+ var pending = '#archives input.archives-pending:first';
+
+ if(exists(pending)) {
+ retrieveArchives($(pending).attr('data-with'), $(pending).attr('data-start'));
+ $(pending).remove();
+ }
+
+ // Everything has been retrieved, get the avatars
+ else {
+ getAvatar(getXID(), 'cache', 'true', 'forget');
+ getAvatar(xid, 'cache', 'true', 'forget');
+ }
+
+ logThis('Got archives.', 2);
+}
+
+// Gets the archiving configuration
+function getConfigArchives() {
+ // Lock the archiving options
+ $('#archiving').attr('checked', false).attr('disabled', true);
+
+ // Get the archiving configuration
+ var iq = new JSJaCIQ();
+ iq.setType('get');
+
+ iq.appendNode('pref', {'xmlns': NS_URN_ARCHIVE});
+
+ con.send(iq, handleGetConfigArchives);
+}
+
+// Handles the archiving configuration
+function handleGetConfigArchives(iq) {
+ // Reset the options stuffs
+ waitOptions('archives');
+
+ // Unlock the archiving options
+ $('#archiving').removeAttr('disabled');
+
+ // End if not a result
+ if(!iq || (iq.getType() != 'result'))
+ return;
+
+ // Extract the preferences from the IQ
+ var enabled = $(iq.getNode()).find('pref auto').attr('save');
+
+ // Define the input enabling/disabling vars
+ var checked = true;
+
+ if(enabled != 'true')
+ checked = false;
+
+ // Apply the values
+ $('#archiving').attr('checked', checked);
+}
+
+// Configures the archiving on the server
+function configArchives(enabled) {
+ // Configure the auto element
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ iq.appendNode('auto', {'xmlns': NS_URN_ARCHIVE, 'save': enabled});
+
+ con.send(iq, handleConfigArchives);
+
+ // Configure the default element
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ var pref = iq.appendNode('pref', {'xmlns': NS_URN_ARCHIVE});
+ pref.appendChild(iq.appendNode('default', {'xmlns': NS_URN_ARCHIVE, 'otr': 'concede', 'save': 'body'}));
+
+ con.send(iq);
+
+ // Configure the method element
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ var mType = new Array('auto', 'local', 'manual');
+ var mUse = new Array('prefer', 'concede', 'concede');
+
+ var pref = iq.appendNode('pref', {'xmlns': NS_URN_ARCHIVE});
+
+ for(i in mType)
+ pref.appendChild(iq.appendNode('method', {'xmlns': NS_URN_ARCHIVE, 'type': mType[i], 'use': mUse[i]}));
+
+ con.send(iq);
+
+ // Logger
+ logThis('Configuring archives...', 3);
+}
+
+// Handles the archives configuration
+function handleConfigArchives(iq) {
+ if(!iq || (iq.getType() != 'result'))
+ logThis('Archives not configured.', 2);
+ else
+ logThis('Archives configured.', 3);
+}
+
+// Checks if the datepicker has changed
+function checkChangeArchives() {
+ var xid = $('#archives .filter .friend').val();
+ var date = $('#archives .filter .date').DatePickerGetDate(true);
+
+ // No XID?
+ if(!xid || !xid.length)
+ return;
+
+ // Too many value?
+ if(xid.length > 1) {
+ $('#archives .filter .friend').val(xid[0]);
+
+ return;
+ }
+
+ // Get the first XID
+ xid = xid[0];
+
+ // Get the archives
+ getDayArchives(xid, date);
+}
+
+// Update the archives with the selected XID
+function updateArchives() {
+ // Read the values
+ var xid = $('#archives .filter .friend').val();
+ var date = $('#archives .filter .date').DatePickerGetDate(true);
+
+ // No XID?
+ if(!xid || !xid.length)
+ return;
+
+ // Too many value?
+ if(xid.length > 1) {
+ $('#archives .filter .friend').val(xid[0]);
+
+ return;
+ }
+
+ // Get the first XID
+ xid = xid[0];
+
+ // Apply the current marker
+ $('#archives .current .name').text(getBuddyName(xid));
+ $('#archives .current .time').text(parseDay(date + 'T00:00:00Z' + getDateTZO()));
+
+ // Get the archives
+ getListArchives(xid, date);
+}
+
+// Plugin launcher
+function launchArchives() {
+ // Current date
+ var current_date = explodeThis('T', getXMPPTime(), 0);
+
+ // Datepicker
+ $('#archives .filter .date').DatePicker({
+ flat: true,
+ date: current_date,
+ current: current_date,
+ calendars: 1,
+ starts: 1,
+ onChange: checkChangeArchives
+ });
+
+ // Click events
+ $('#archives .bottom .finish').click(function() {
+ return closeArchives();
+ });
+
+ // Change event
+ $('#archives .filter .friend').change(updateArchives);
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the audio JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 10/08/11
+
+*/
+
+// Plays the given sound ID
+function soundPlay(num) {
+ try {
+ // Not supported!
+ if((BrowserDetect.browser == 'Explorer') && (BrowserDetect.version < 9))
+ return false;
+
+ // If the sounds are enabled
+ if(getDB('options', 'sounds') == '1') {
+ // If the audio elements aren't yet in the DOM
+ if(!exists('#audio')) {
+ $('body').append(
+ '<div id="audio">' +
+ '<audio id="new-chat" src="./snd/new-chat.oga" type="audio/ogg" />' +
+ '<audio id="receive-message" src="./snd/receive-message.oga" type="audio/ogg" />' +
+ '<audio id="notification" src="./snd/notification.oga" type="audio/ogg" />' +
+ '</div>'
+ );
+ }
+
+ // We play the target sound
+ var playThis = document.getElementById('audio').getElementsByTagName('audio')[num];
+ playThis.load();
+ playThis.play();
+ }
+ }
+
+ catch(e) {}
+
+ finally {
+ return false;
+ }
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the autocompletion tools JS script for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 12/11/10
+
+*/
+
+// Sort an array with insensitivity to the case
+function caseInsensitiveSort(a, b) {
+ // Put the two strings into lower case
+ a = a.toLowerCase();
+ b = b.toLowerCase();
+
+ // Process the sort
+ if(a > b)
+ return 1;
+ if(a < b)
+ return -1;
+}
+
+// Creates an array with the autocompletion results
+function processAutocompletion(query, id) {
+ // Replace forbidden characters in regex
+ query = escapeRegex(query);
+
+ // Create an empty array
+ var results = new Array();
+
+ // Search in the roster
+ $('#' + id + ' .user').each(function() {
+ var nick = $(this).find('.name').text();
+ var regex = new RegExp('(^)' + query, 'gi');
+
+ if(nick.match(regex))
+ results.push(nick);
+ });
+
+ // Sort the array
+ results = results.sort(caseInsensitiveSort);
+
+ // Return the results array
+ return results;
+}
+
+// Resets the autocompletion tools
+function resetAutocompletion(hash) {
+ $('#' + hash + ' .message-area').removeAttr('data-autocompletion-pointer').removeAttr('data-autocompletion-query');
+}
+
+// Autocompletes the chat input nick
+function createAutocompletion(hash) {
+ // Initialize
+ var vSelector = $('#' + hash + ' .message-area');
+ var value = vSelector.val();
+ if(!value)
+ resetAutocompletion(hash);
+ var query = vSelector.attr('data-autocompletion-query');
+
+ // The autocompletion has not been yet launched
+ if(query == undefined) {
+ query = value;
+ vSelector.attr('data-autocompletion-query', query);
+ }
+
+ // Get the pointer
+ var pointer = vSelector.attr('data-autocompletion-pointer');
+ var i = 0;
+
+ if(pointer)
+ i = parseInt(pointer);
+
+ // We get the nickname
+ var nick = processAutocompletion(query, hash)[i];
+
+ // Shit, this is my nick!
+ if((nick != undefined) && (nick.toLowerCase() == getMUCNick(hash).toLowerCase())) {
+ // Increment
+ i++;
+
+ // Get the next nick
+ nick = processAutocompletion(query, hash)[i];
+ }
+
+ // We quote the nick
+ if(nick != undefined) {
+ // Increment
+ i++;
+ quoteMyNick(hash, nick);
+
+ // Put a pointer
+ vSelector.attr('data-autocompletion-pointer', i);
+ }
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the avatar JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 01/03/11
+
+*/
+
+// Requests the avatar of a given user
+var AVATAR_PENDING = [];
+
+function getAvatar(xid, mode, enabled, photo) {
+ /* REF: http://xmpp.org/extensions/xep-0153.html */
+
+ // No need to get the avatar, another process is yet running
+ if(existArrayValue(AVATAR_PENDING, xid))
+ return false;
+
+ // Initialize: XML data is in one SQL entry, because some browser are sloooow with SQL requests
+ var xml = XMLFromString(getPersistent('avatar', xid));
+ var forced = false;
+
+ // Retrieving forced?
+ if($(xml).find('forced').text() == 'true')
+ forced = true;
+
+ // No avatar in presence
+ if(!photo && !forced && (enabled == 'true')) {
+ // Pending marker
+ AVATAR_PENDING.push(xid);
+
+ // Reset the avatar
+ resetAvatar(xid, hex_md5(xid));
+
+ logThis('No avatar for: ' + xid, 2);
+ }
+
+ // Try to catch the avatar
+ else {
+ // Define some stuffs
+ var type = $(xml).find('type').text();
+ var binval = $(xml).find('binval').text();
+ var checksum = $(xml).find('checksum').text();
+ var updated = false;
+
+ // Process the checksum of the avatar
+ if((checksum == photo) || (photo == 'forget') || forced)
+ updated = true;
+
+ // If the avatar is yet stored and a new retrieving is not needed
+ if((mode == 'cache') && type && binval && checksum && updated) {
+ // Pending marker
+ AVATAR_PENDING.push(xid);
+
+ // Display the cache avatar
+ displayAvatar(xid, hex_md5(xid), type, binval);
+
+ logThis('Read avatar from cache: ' + xid, 3);
+ }
+
+ // Else if the request has not yet been fired, we get it
+ else if((!updated || (mode == 'cache' && !updated) || (mode == 'force') || (photo = 'forget')) && (enabled != 'false')) {
+ // Pending marker
+ AVATAR_PENDING.push(xid);
+
+ // Get the latest avatar
+ var iq = new JSJaCIQ();
+ iq.setType('get');
+ iq.setTo(xid);
+
+ iq.appendNode('vCard', {'xmlns': NS_VCARD});
+
+ con.send(iq, handleAvatar);
+
+ logThis('Get avatar from server: ' + xid, 3);
+ }
+ }
+
+ return true;
+}
+
+// Handles the avatar
+function handleAvatar(iq) {
+ // Extract the XML values
+ var handleXML = iq.getNode();
+ var handleFrom = fullXID(getStanzaFrom(iq));
+
+ // Is this me? Remove the resource!
+ if(bareXID(handleFrom) == getXID())
+ handleFrom = bareXID(handleFrom);
+
+ // Get some other values
+ var hash = hex_md5(handleFrom);
+ var find = $(handleXML).find('vCard');
+ var aChecksum = 'none';
+ var oChecksum = null;
+
+ // Read our own checksum
+ if(handleFrom == getXID()) {
+ oChecksum = getDB('checksum', 1);
+
+ // Avoid the "null" value
+ if(!oChecksum)
+ oChecksum = '';
+ }
+
+ // vCard not empty?
+ if(find.size()) {
+ // We get our profile details
+ if(handleFrom == getXID()) {
+ // Get the names
+ var names = generateBuddyName(iq);
+
+ // Write the values to the database
+ setDB('profile', 'name', names[0]);
+ setDB('profile', 'nick', names[1]);
+ }
+
+ // We get the avatar
+ var aType = find.find('TYPE:first').text();
+ var aBinval = find.find('BINVAL:first').text();
+
+ // No binval?
+ if(!aBinval) {
+ aType = 'none';
+ aBinval = 'none';
+ }
+
+ // Enough data
+ else {
+ // No type?
+ if(!aType)
+ aType = 'image/png';
+
+ // Process the checksum
+ else
+ aChecksum = hex_sha1(Base64.decode(aBinval));
+ }
+
+ // We display the user avatar
+ displayAvatar(handleFrom, hash, aType, aBinval);
+
+ // Store the avatar
+ setPersistent('avatar', handleFrom, '<avatar><type>' + aType + '</type><binval>' + aBinval + '</binval><checksum>' + aChecksum + '</checksum><forced>false</forced></avatar>');
+
+ logThis('Avatar retrieved from server: ' + handleFrom, 3);
+ }
+
+ // vCard is empty
+ else
+ resetAvatar(handleFrom);
+
+ // We got a new checksum for us?
+ if(((oChecksum != null) && (oChecksum != aChecksum)) || !FIRST_PRESENCE_SENT) {
+ // Define a proper checksum
+ var pChecksum = aChecksum;
+
+ if(pChecksum == 'none')
+ pChecksum = '';
+
+ // Update our temp. checksum
+ setDB('checksum', 1, pChecksum);
+
+ // Send the stanza
+ if(FIRST_PRESENCE_SENT)
+ presenceSend(pChecksum);
+ else
+ getStorage(NS_OPTIONS);
+ }
+}
+
+// Reset the avatar of an user
+function resetAvatar(xid, hash) {
+ // Store the empty avatar
+ setPersistent('avatar', xid, '<avatar><type>none</type><binval>none</binval><checksum>none</checksum><forced>false</forced></avatar>');
+
+ // Display the empty avatar
+ displayAvatar(xid, hash, 'none', 'none');
+}
+
+// Displays the avatar of an user
+function displayAvatar(xid, hash, type, binval) {
+ // Initialize the vars
+ var container = hash + ' .avatar-container';
+ var code = '<img class="avatar" src="';
+
+ // If the avatar exists
+ if((type != 'none') && (binval != 'none'))
+ code += 'data:' + type + ';base64,' + binval;
+ else
+ code += './img/others/default-avatar.png';
+
+ code += '" alt="" />';
+
+ // Replace with the new avatar (in the roster and in the chat)
+ $('.' + container).html(code);
+
+ // We can remove the pending marker
+ removeArrayValue(AVATAR_PENDING, xid);
+}
--- /dev/null
+// This code was written by Tyler Akins and has been placed in the
+// public domain. It would be nice if you left this header intact.
+// Base64 code from Tyler Akins -- http://rumkin.com
+
+var Base64 = (function () {
+ var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+
+ var obj = {
+ /**
+ * Encodes a string in base64
+ * @param {String} input The string to encode in base64.
+ */
+ encode: function (input) {
+ var output = "";
+ var chr1, chr2, chr3;
+ var enc1, enc2, enc3, enc4;
+ var i = 0;
+
+ do {
+ chr1 = input.charCodeAt(i++);
+ chr2 = input.charCodeAt(i++);
+ chr3 = input.charCodeAt(i++);
+
+ enc1 = chr1 >> 2;
+ enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
+ enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
+ enc4 = chr3 & 63;
+
+ if (isNaN(chr2)) {
+ enc3 = enc4 = 64;
+ } else if (isNaN(chr3)) {
+ enc4 = 64;
+ }
+
+ output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) +
+ keyStr.charAt(enc3) + keyStr.charAt(enc4);
+ } while (i < input.length);
+
+ return output;
+ },
+
+ /**
+ * Decodes a base64 string.
+ * @param {String} input The string to decode.
+ */
+ decode: function (input) {
+ var output = "";
+ var chr1, chr2, chr3;
+ var enc1, enc2, enc3, enc4;
+ var i = 0;
+
+ // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
+ input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
+
+ do {
+ enc1 = keyStr.indexOf(input.charAt(i++));
+ enc2 = keyStr.indexOf(input.charAt(i++));
+ enc3 = keyStr.indexOf(input.charAt(i++));
+ enc4 = keyStr.indexOf(input.charAt(i++));
+
+ chr1 = (enc1 << 2) | (enc2 >> 4);
+ chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
+ chr3 = ((enc3 & 3) << 6) | enc4;
+
+ output = output + String.fromCharCode(chr1);
+
+ if (enc3 != 64) {
+ output = output + String.fromCharCode(chr2);
+ }
+ if (enc4 != 64) {
+ output = output + String.fromCharCode(chr3);
+ }
+ } while (i < input.length);
+
+ return output;
+ }
+ };
+
+ return obj;
+})();
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the notification board JS script for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 12/03/11
+
+*/
+
+// Creates a board panel
+function createBoard(type, id) {
+ // Text var
+ var text = '';
+
+ // Info
+ if(type == 'info') {
+ switch(id) {
+ // Password change
+ case 1:
+ text = _e("Your password has been changed, now you can connect to your account with your new login data.");
+
+ break;
+
+ // Account deletion
+ case 2:
+ text = _e("Your XMPP account has been removed, bye!");
+
+ break;
+
+ // Account logout
+ case 3:
+ text = _e("You have been logged out of your XMPP account, have a nice day!");
+
+ break;
+
+ // Groupchat join
+ case 4:
+ text = _e("The room you joined seems not to exist. You should create it!");
+
+ break;
+
+ // Groupchat removal
+ case 5:
+ text = _e("The groupchat has been removed, now someone else will be able to recreate it.");
+
+ break;
+
+ // Non-existant groupchat user
+ case 6:
+ text = _e("The user that you want to reach is not present in the room.");
+
+ break;
+ }
+ }
+
+ // Error
+ else {
+ switch(id) {
+ // Custom error
+ case 1:
+ text = '<b>' + _e("Error") + '</b> » <span></span>';
+
+ break;
+
+ // Network error
+ case 2:
+ text = _e("Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience.");
+
+ break;
+
+ // List retrieving error
+ case 3:
+ text = _e("The element list on this server could not be obtained!");
+
+ break;
+
+ // Attaching error
+ case 4:
+ text = printf(_e("An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"), JAPPIX_MAX_UPLOAD);
+
+ break;
+ }
+ }
+
+ // No text?
+ if(!text)
+ return false;
+
+ // Append the content
+ $('#board').append('<div class="one-board ' + type + '" data-id="' + id + '">' + text + '</div>');
+
+ // Events (click and auto-hide)
+ $('#board .one-board.' + type + '[data-id=' + id + ']')
+
+ .click(function() {
+ closeThisBoard(this);
+ })
+
+ .oneTime('5s', function() {
+ closeThisBoard(this);
+ })
+
+ .slideDown();
+
+ return true;
+}
+
+// Destroys the existing board notifications
+function destroyBoard() {
+ $('#board').empty();
+}
+
+// Executes a given action on the notification board
+function actionBoard(id, type) {
+ // In a first, we destroy other boards
+ destroyBoard();
+
+ // Then we display the board
+ createBoard(type, id);
+}
+
+// Opens a given error ID
+function openThisError(id) {
+ actionBoard(id, 'error');
+}
+
+// Opens a given info ID
+function openThisInfo(id) {
+ actionBoard(id, 'info');
+}
+
+// Closes a given board
+function closeThisBoard(board) {
+ $(board).slideUp('normal', function() {
+ $(this).remove();
+ });
+}
--- /dev/null
+/* BROWSER DETECT
+ * http://www.quirksmode.org/js/detect.html
+ */
+
+var BrowserDetect = {
+ init: function () {
+ this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
+ this.version = this.searchVersion(navigator.userAgent)
+ || this.searchVersion(navigator.appVersion)
+ || "an unknown version";
+ this.OS = this.searchString(this.dataOS) || "an unknown OS";
+ },
+
+ searchString: function (data) {
+ for (var i=0;i<data.length;i++) {
+ var dataString = data[i].string;
+ var dataProp = data[i].prop;
+ this.versionSearchString = data[i].versionSearch || data[i].identity;
+ if (dataString) {
+ if (dataString.indexOf(data[i].subString) != -1)
+ return data[i].identity;
+ }
+ else if (dataProp)
+ return data[i].identity;
+ }
+ },
+
+ searchVersion: function (dataString) {
+ var index = dataString.indexOf(this.versionSearchString);
+ if (index == -1) return;
+ return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
+ },
+
+ dataBrowser: [
+ {
+ string: navigator.userAgent,
+ subString: "Chrome",
+ identity: "Chrome"
+ },
+ { string: navigator.userAgent,
+ subString: "OmniWeb",
+ versionSearch: "OmniWeb/",
+ identity: "OmniWeb"
+ },
+ {
+ string: navigator.vendor,
+ subString: "Apple",
+ identity: "Safari",
+ versionSearch: "Version"
+ },
+ {
+ prop: window.opera,
+ identity: "Opera"
+ },
+ {
+ string: navigator.vendor,
+ subString: "iCab",
+ identity: "iCab"
+ },
+ {
+ string: navigator.vendor,
+ subString: "KDE",
+ identity: "Konqueror"
+ },
+ {
+ string: navigator.userAgent,
+ subString: "Firefox",
+ identity: "Firefox"
+ },
+ {
+ string: navigator.vendor,
+ subString: "Camino",
+ identity: "Camino"
+ },
+ { // for newer Netscapes (6+)
+ string: navigator.userAgent,
+ subString: "Netscape",
+ identity: "Netscape"
+ },
+ {
+ string: navigator.userAgent,
+ subString: "MSIE",
+ identity: "Explorer",
+ versionSearch: "MSIE"
+ },
+ {
+ string: navigator.userAgent,
+ subString: "Gecko",
+ identity: "Mozilla",
+ versionSearch: "rv"
+ },
+ { // for older Netscapes (4-)
+ string: navigator.userAgent,
+ subString: "Mozilla",
+ identity: "Netscape",
+ versionSearch: "Mozilla"
+ }
+ ],
+
+ dataOS : [
+ {
+ string: navigator.platform,
+ subString: "Win",
+ identity: "Windows"
+ },
+ {
+ string: navigator.platform,
+ subString: "Mac",
+ identity: "Mac"
+ },
+ {
+ string: navigator.userAgent,
+ subString: "iPhone",
+ identity: "iPhone/iPod"
+ },
+ {
+ string: navigator.platform,
+ subString: "Linux",
+ identity: "Linux"
+ }
+ ]
+};
+
+BrowserDetect.init();
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the bubble JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 11/12/10
+
+*/
+
+// Closes all the opened bubbles
+function closeBubbles() {
+ // Destroy all the elements
+ $('.bubble.hidable:visible').hide();
+ $('.bubble.removable').remove();
+ $('body').die('click');
+
+ return false;
+}
+
+// Click function when a bubble is opened
+function showBubble(selector) {
+ // Hidable bubbles special things
+ if($(selector).is('.hidable')) {
+ // This bubble is yet displayed? So abort!
+ if($(selector).is(':visible'))
+ return closeBubbles();
+
+ // Close all the bubbles
+ closeBubbles();
+
+ // Show the requested bubble
+ $(selector).show();
+ }
+
+ // Removable bubbles special things
+ else {
+ // This bubble is yet added? So abort!
+ if(exists(selector))
+ return closeBubbles();
+
+ // Close all the bubbles
+ closeBubbles();
+ }
+
+ // Creates a new click event to close the bubble
+ $('body').live('click', function(evt) {
+ var target = evt.target;
+
+ // If this is a click away from a bubble
+ if(!$(target).parents('.ibubble').size())
+ closeBubbles();
+ });
+
+ return false;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the CAPS JS script for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 26/08/11
+
+*/
+
+// Returns an array of the Jappix disco#infos
+function myDiscoInfos() {
+ var fArray = new Array(
+ NS_MUC,
+ NS_MUC_USER,
+ NS_MUC_ADMIN,
+ NS_MUC_OWNER,
+ NS_MUC_CONFIG,
+ NS_DISCO_INFO,
+ NS_DISCO_ITEMS,
+ NS_PUBSUB_RI,
+ NS_BOSH,
+ NS_CAPS,
+ NS_MOOD,
+ NS_ACTIVITY,
+ NS_TUNE,
+ NS_GEOLOC,
+ NS_NICK,
+ NS_URN_ADATA,
+ NS_URN_AMETA,
+ NS_URN_MBLOG,
+ NS_URN_INBOX,
+ NS_MOOD + NS_NOTIFY,
+ NS_ACTIVITY + NS_NOTIFY,
+ NS_TUNE + NS_NOTIFY,
+ NS_GEOLOC + NS_NOTIFY,
+ NS_URN_MBLOG + NS_NOTIFY,
+ NS_URN_INBOX + NS_NOTIFY,
+ NS_URN_DELAY,
+ NS_ROSTER,
+ NS_ROSTERX,
+ NS_HTTP_AUTH,
+ NS_CHATSTATES,
+ NS_XHTML_IM,
+ NS_IPV6,
+ NS_LAST,
+ NS_PRIVATE,
+ NS_REGISTER,
+ NS_SEARCH,
+ NS_COMMANDS,
+ NS_VERSION,
+ NS_XDATA,
+ NS_VCARD,
+ NS_URN_TIME,
+ NS_URN_PING,
+ NS_URN_ARCHIVE,
+ NS_URN_AR_PREF,
+ NS_URN_RECEIPTS,
+ NS_PRIVACY,
+ NS_IQOOB,
+ NS_XOOB
+ );
+
+ return fArray;
+}
+
+// Gets the disco#infos of an entity
+function getDiscoInfos(to, caps) {
+ // No CAPS
+ if(!caps) {
+ logThis('No CAPS: ' + to, 2);
+
+ displayDiscoInfos(to, '');
+
+ return false;
+ }
+
+ // Get the stored disco infos
+ var xml = XMLFromString(getPersistent('caps', caps));
+
+ // Yet stored
+ if(xml) {
+ logThis('CAPS from cache: ' + to, 3);
+
+ displayDiscoInfos(to, xml);
+
+ return true;
+ }
+
+ logThis('CAPS from the network: ' + to, 3);
+
+ // Not stored: get the disco#infos
+ var iq = new JSJaCIQ();
+
+ iq.setTo(to);
+ iq.setType('get');
+ iq.setQuery(NS_DISCO_INFO);
+
+ con.send(iq, handleDiscoInfos);
+
+ return true;
+}
+
+// Handles the disco#infos of an entity
+function handleDiscoInfos(iq) {
+ if(!iq || (iq.getType() == 'error'))
+ return;
+
+ // IQ received, get some values
+ var from = fullXID(getStanzaFrom(iq));
+ var query = iq.getQuery();
+
+ // Generate the CAPS-processing values
+ var identities = new Array();
+ var features = new Array();
+ var data_forms = new Array();
+
+ // Identity values
+ $(query).find('identity').each(function() {
+ var pCategory = $(this).attr('category');
+ var pType = $(this).attr('type');
+ var pLang = $(this).attr('xml:lang');
+ var pName = $(this).attr('name');
+
+ if(!pCategory)
+ pCategory = '';
+ if(!pType)
+ pType = '';
+ if(!pLang)
+ pLang = '';
+ if(!pName)
+ pName = '';
+
+ identities.push(pCategory + '/' + pType + '/' + pLang + '/' + pName);
+ });
+
+ // Feature values
+ $(query).find('feature').each(function() {
+ var pVar = $(this).attr('var');
+
+ // Add the current value to the array
+ if(pVar)
+ features.push(pVar);
+ });
+
+ // Data-form values
+ $(query).find('x[xmlns=' + NS_XDATA + ']').each(function() {
+ // Initialize some stuffs
+ var pString = '';
+ var sortVar = new Array();
+
+ // Add the form type field
+ $(this).find('field[var=FORM_TYPE] value').each(function() {
+ var cText = $(this).text();
+
+ if(cText)
+ pString += cText + '<';
+ });
+
+ // Add the var attributes into an array
+ $(this).find('field:not([var=FORM_TYPE])').each(function() {
+ var cVar = $(this).attr('var');
+
+ if(cVar)
+ sortVar.push(cVar);
+ });
+
+ // Sort the var attributes
+ sortVar = sortVar.sort();
+
+ // Loop this sorted var attributes
+ for(i in sortVar) {
+ // Initialize the value sorting
+ var sortVal = new Array();
+
+ // Append it to the string
+ pString += sortVar[i] + '<';
+
+ // Add each value to the array
+ $(this).find('field[var=' + sortVar[i] + '] value').each(function() {
+ sortVal.push($(this).text());
+ });
+
+ // Sort the values
+ sortVal = sortVal.sort();
+
+ // Append the values to the string
+ for(j in sortVal)
+ pString += sortVal[j] + '<';
+ }
+
+ // Any string?
+ if(pString) {
+ // Remove the undesired double '<' from the string
+ if(pString.match(/(.+)(<)+$/))
+ pString = pString.substring(0, pString.length - 1);
+
+ // Add the current string to the array
+ data_forms.push(pString);
+ }
+ });
+
+ // Process the CAPS
+ var caps = processCaps(identities, features, data_forms);
+
+ // Get the XML string
+ var xml = xmlToString(query);
+
+ // Store the disco infos
+ setPersistent('caps', caps, xml);
+
+ // This is our server
+ if(from == getServer()) {
+ // Handle the features
+ handleFeatures(xml);
+
+ logThis('Got our server CAPS', 3);
+ }
+
+ else {
+ // Display the disco infos
+ displayDiscoInfos(from, xml);
+
+ logThis('Got CAPS: ' + from, 3);
+ }
+}
+
+// Displays the disco#infos everywhere needed for an entity
+function displayDiscoInfos(from, xml) {
+ // Generate the chat path
+ var xid = bareXID(from);
+
+ // This comes from a private groupchat chat?
+ if(isPrivate(xid))
+ xid = from;
+
+ hash = hex_md5(xid);
+
+ // Support indicators
+ var xhtml_im = false;
+ var iq_oob = false;
+ var x_oob = false;
+ var receipts = false;
+
+ // Display the supported features
+ $(xml).find('feature').each(function() {
+ var current = $(this).attr('var');
+
+ // xHTML-IM
+ if(current == NS_XHTML_IM)
+ xhtml_im = true;
+
+ // Out of Band Data (IQ)
+ if(current == NS_IQOOB)
+ iq_oob = true;
+
+ // Out of Band Data (X)
+ if(current == NS_XOOB)
+ x_oob = true;
+
+ // Receipts
+ else if(current == NS_URN_RECEIPTS)
+ receipts = true;
+ });
+
+ // Paths
+ var path = $('#' + hash);
+ var message_area = path.find('.message-area');
+ var style = path.find('.chat-tools-style');
+ var file = path.find('.chat-tools-file');
+
+ // Apply xHTML-IM
+ if(xhtml_im)
+ style.show();
+ else {
+ // Remove the tooltip elements
+ style.hide();
+ style.find('.bubble-style').remove();
+
+ // Reset the markers
+ message_area.removeAttr('style')
+ .removeAttr('data-color')
+ .removeAttr('data-bold')
+ .removeAttr('data-italic')
+ .removeAttr('data-underline');
+ }
+
+ // Apply Out of Band Data
+ if(iq_oob || x_oob) {
+ file.show();
+
+ // Set a marker
+ if(iq_oob)
+ file.attr('data-oob', 'iq');
+ else
+ file.attr('data-oob', 'x');
+ }
+
+ else {
+ // Remove the tooltip elements
+ file.hide();
+ file.find('.bubble-style').remove();
+
+ // Reset the marker
+ file.removeAttr('data-oob');
+ }
+
+ // Apply receipts
+ if(receipts)
+ message_area.attr('data-receipts', 'true');
+ else
+ message_area.removeAttr('data-receipts');
+}
+
+// Generates the CAPS hash
+function processCaps(cIdentities, cFeatures, cDataForms) {
+ // Initialize
+ var cString = '';
+
+ // Sort the arrays
+ cIdentities = cIdentities.sort();
+ cFeatures = cFeatures.sort();
+ cDataForms = cDataForms.sort();
+
+ // Process the sorted identity string
+ for(a in cIdentities)
+ cString += cIdentities[a] + '<';
+
+ // Process the sorted feature string
+ for(b in cFeatures)
+ cString += cFeatures[b] + '<';
+
+ // Process the sorted data-form string
+ for(c in cDataForms)
+ cString += cDataForms[c] + '<';
+
+ // Process the SHA-1 hash
+ var cHash = b64_sha1(cString);
+
+ return cHash;
+}
+
+// Generates the Jappix CAPS hash
+function myCaps() {
+ return processCaps(new Array('client/web//Jappix'), myDiscoInfos(), new Array());
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the chat JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Authors: Vanaryon, Eric
+Last revision: 16/10/11
+
+*/
+
+// Correctly opens a new chat
+function checkChatCreate(xid, type, nickname, password, title) {
+ // No XID?
+ if(!xid)
+ return false;
+
+ // We generate some stuffs
+ var hash = hex_md5(xid);
+ var name;
+
+ // Gets the name of the user/title of the room
+ if(title)
+ name = title;
+
+ else {
+ // Private groupchat chat
+ if(type == 'private')
+ name = thisResource(xid);
+
+ // XMPP-ID
+ else if(xid.indexOf('@') != -1)
+ name = getBuddyName(xid);
+
+ // Gateway
+ else
+ name = xid;
+ }
+
+ // If the target div does not exist
+ if(!exists('#' + hash)) {
+ // We check the type of the chat to open
+ if((type == 'chat') || (type == 'private'))
+ chatCreate(hash, xid, name, type);
+
+ else if(type == 'groupchat') {
+ // Try to read the room stored configuration
+ if(!isAnonymous() && (!nickname || !password || !title)) {
+ // Catch the room data
+ var fData = $(XMLFromString(getDB('favorites', xid)));
+ var fNick = fData.find('nick').text();
+ var fPwd = fData.find('password').text();
+ var fName = fData.find('name').text();
+
+ // Apply the room data
+ if(!nickname && fNick)
+ nickname = fNick;
+ if(!password && fPwd)
+ password = fPwd;
+ if(!title && fName)
+ name = fName;
+ }
+
+ groupchatCreate(hash, xid, name, nickname, password);
+ }
+ }
+
+ // Switch to the newly-created chat
+ switchChan(hash);
+
+ return false;
+}
+
+// Generates the chat DOM elements
+function generateChat(type, id, xid, nick) {
+ // Generate some stuffs
+ var path = '#' + id + ' .';
+ var escaped_xid = escape(xid);
+
+ // Special code
+ var specialAttributes, specialAvatar, specialName, specialCode, specialLink, specialDisabled, specialStyle;
+
+ // Groupchat special code
+ if(type == 'groupchat') {
+ specialAttributes = ' data-type="groupchat"';
+ specialAvatar = '';
+ specialName = '<p class="bc-infos"><b>' + _e("Subject") + '</b> <span class="muc-topic">' + _e("no subject defined for this room.") + '</span></p>';
+ specialCode = '<div class="content groupchat-content" id="chat-content-' + id + '"></div><div class="list"><div class="moderator role"><p class="title">' + _e("Moderators") + '</p></div><div class="participant role"><p class="title">' + _e("Participants") + '</p></div><div class="visitor role"><p class="title">' + _e("Visitors") + '</p></div><div class="none role"><p class="title">' + _e("Others") + '</p></div></div>';
+ specialLink = '<a href="#" class="tools-mucadmin tools-tooltip talk-images chat-tools-content" title="' + _e("Administration panel for this room") + '"></a>';
+ specialStyle = '';
+
+ // Is this a gateway?
+ if(xid.match(/%/))
+ specialDisabled = '';
+ else
+ specialDisabled = ' disabled=""';
+ }
+
+ // Chat (or other things?!) special code
+ else {
+ specialAttributes = ' data-type="chat"';
+ specialAvatar = '<div class="avatar-container"><img class="avatar" src="' + './img/others/default-avatar.png' + '" alt="" /></div>';
+ specialName = '<div class="bc-pep"></div><p class="bc-infos"><span class="unavailable show talk-images"></span></p>';
+ specialCode = '<div class="content" id="chat-content-' + id + '"></div>';
+ specialLink = '<a href="#" class="tools-archives tools-tooltip talk-images chat-tools-content" title="' + _e("View chat history") + '"></a><a href="#" class="tools-infos tools-tooltip talk-images chat-tools-content" title="' + _e("Show user profile") + '"></a>';
+ specialStyle = ' style="display: none;"';
+ specialDisabled = '';
+ }
+
+ // Not a groupchat private chat, we can use the buddy add icon
+ if((type == 'chat') || (type == 'groupchat')) {
+ var addTitle;
+
+ if(type == 'chat')
+ addTitle = _e("Add this contact to your friends");
+ else
+ addTitle = _e("Add this groupchat to your favorites");
+
+ specialLink += '<a href="#" class="tools-add tools-tooltip talk-images chat-tools-content" title="' + addTitle + '"></a>';
+ }
+
+ // IE DOM parsing bug fix
+ var specialStylePicker = '<div class="chat-tools-content chat-tools-style"' + specialStyle + '>' +
+ '<a href="#" class="tools-style tools-tooltip talk-images"></a>' +
+ '</div>';
+
+ if((BrowserDetect.browser == 'Explorer') && (BrowserDetect.version < 9))
+ specialStylePicker = '';
+
+ // Append the chat HTML code
+ $('#page-engine').append(
+ '<div id="' + id + '" class="page-engine-chan chat one-counter"' + specialAttributes + ' data-xid="' + escaped_xid + '">' +
+ '<div class="top ' + id + '">' +
+ specialAvatar +
+
+ '<div class="name">' +
+ '<p class="bc-name bc-name-nick">' + nick.htmlEnc() + '</p>' +
+ specialName +
+ '</div>' +
+ '</div>' +
+
+ specialCode +
+
+ '<div class="text">' +
+ '<div class="footer">' +
+ '<div class="chat-tools-content chat-tools-smileys">' +
+ '<a href="#" class="tools-smileys tools-tooltip talk-images"></a>' +
+ '</div>' +
+
+ specialStylePicker +
+
+ '<div class="chat-tools-content chat-tools-file">' +
+ '<a href="#" class="tools-file tools-tooltip talk-images"></a>' +
+ '</div>' +
+
+ '<div class="chat-tools-content chat-tools-save">' +
+ '<a href="#" class="tools-save tools-tooltip talk-images"></a>' +
+ '</div>' +
+
+ '<a href="#" class="tools-clear tools-tooltip talk-images chat-tools-content" title="' + _e("Clean current chat") + '"></a>' +
+
+ specialLink +
+ '</div>' +
+
+ '<div class="compose">' +
+ '<textarea class="message-area focusable" ' + specialDisabled + ' data-to="' + escaped_xid + '" /></textarea>' +
+ '</div>' +
+ '</div>' +
+ '</div>'
+ );
+
+ // Click event: chat cleaner
+ $(path + 'tools-clear').click(function() {
+ cleanChat(id);
+ });
+
+ // Click event: user-infos
+ $(path + 'tools-infos').click(function() {
+ openUserInfos(xid);
+ });
+}
+
+// Generates the chat switch elements
+function generateSwitch(type, id, xid, nick) {
+ // Path to the element
+ var chat_switch = '#page-switch .';
+
+ // Special code
+ var specialClass = ' unavailable';
+ var show_close = true;
+
+ // Groupchat
+ if(type == 'groupchat') {
+ specialClass = ' groupchat-default';
+
+ if(isAnonymous() && (xid == generateXID(ANONYMOUS_ROOM, 'groupchat')))
+ show_close = false;
+ }
+
+ // Generate the HTML code
+ var html = '<div class="' + id + ' switcher chan" onclick="return switchChan(\'' + encodeOnclick(id) + '\')">' +
+ '<div class="icon talk-images' + specialClass + '"></div>' +
+
+ '<div class="name">' + nick.htmlEnc() + '</div>';
+
+ // Show the close button if not MUC and not anonymous
+ if(show_close)
+ html += '<div class="exit" title="' + _e("Close this tab") + '" onclick="return quitThisChat(\'' + encodeOnclick(xid) + '\', \'' + encodeOnclick(id) + '\', \'' + encodeOnclick(type) + '\');">x</div>';
+
+ // Close the HTML
+ html += '</div>';
+
+ // Append the HTML code
+ $(chat_switch + 'chans, ' + chat_switch + 'more-content').append(html);
+}
+
+// Cleans given the chat lines
+function cleanChat(chat) {
+ $('#page-engine #' + chat + ' .content .one-group').remove();
+
+ $(document).oneTime(10, function() {
+ $('#page-engine #' + chat + ' .text .message-area').focus();
+ });
+}
+
+// Creates a new chat
+function chatCreate(hash, xid, nick, type) {
+ logThis('New chat: ' + xid, 3);
+
+ // Create the chat content
+ generateChat(type, hash, xid, nick);
+
+ // Create the chat switcher
+ generateSwitch(type, hash, xid, nick);
+
+ // If the user is not in our buddy-list
+ if(type == 'chat') {
+ // Add button
+ if(!exists('#buddy-list .buddy[data-xid=' + escape(xid) + ']'))
+ $('#' + hash + ' .tools-add').click(function() {
+ // Hide the icon (to tell the user all is okay)
+ $(this).hide();
+
+ // Send the subscribe request
+ addThisContact(xid, nick);
+ }).show();
+
+ // Archives button
+ else if(enabledArchives() || enabledArchives('auto') || enabledArchives('manual') || enabledArchives('manage'))
+ $('#' + hash + ' .tools-archives').click(function() {
+ // Open the archives popup
+ openArchives();
+
+ // Get the archives for this user
+ $('#archives .filter .friend').val(xid);
+ updateArchives();
+ }).show();
+ }
+
+ // We catch the user's informations (like this avatar, vcard, and so on...)
+ getUserInfos(hash, xid, nick, type);
+
+ // The icons-hover functions
+ tooltipIcons(xid, hash);
+
+ // The event handlers
+ var inputDetect = $('#page-engine #' + hash + ' .message-area');
+
+ inputDetect.focus(function() {
+ chanCleanNotify(hash);
+ })
+
+ inputDetect.keypress(function(e) {
+ // Enter key
+ if(e.keyCode == 13) {
+ // Add a new line
+ if(e.shiftKey)
+ inputDetect.val(inputDetect.val() + '\n');
+
+ // Send the message
+ else {
+ // Send the message
+ sendMessage(hash, 'chat');
+
+ // Reset the composing database entry
+ setDB('chatstate', xid, 'off');
+ }
+
+ return false;
+ }
+ });
+
+ // Chatstate events
+ eventsChatState(inputDetect, xid, hash);
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the chatstate JS script for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 25/08/11
+
+*/
+
+// Sends a given chatstate to a given entity
+function chatStateSend(state, xid, hash) {
+ var user_type = $('#' + hash).attr('data-type');
+
+ // If the friend client supports chatstates and is online
+ if((user_type == 'groupchat') || ((user_type == 'chat') && $('#' + hash + ' .message-area').attr('data-chatstates') && !exists('#page-switch .' + hash + ' .unavailable'))) {
+ // Already sent?
+ if(getDB('currentchatstate', xid) == state)
+ return;
+
+ // Write the state
+ setDB('currentchatstate', xid, state);
+
+ // New message stanza
+ var aMsg = new JSJaCMessage();
+ aMsg.setTo(xid);
+ aMsg.setType(user_type);
+
+ // Append the chatstate node
+ aMsg.appendNode(state, {'xmlns': NS_CHATSTATES});
+
+ // Send this!
+ con.send(aMsg);
+ }
+}
+
+// Displays a given chatstate in a given chat
+function displayChatState(state, hash, type) {
+ // Groupchat?
+ if(type == 'groupchat') {
+ resetChatState(hash, type);
+
+ // "gone" state not allowed
+ if(state != 'gone')
+ $('#page-engine .page-engine-chan .user.' + hash).addClass(state);
+ }
+
+ // Chat
+ else {
+ // We change the buddy name color in the page-switch
+ resetChatState(hash, type);
+ $('#page-switch .' + hash + ' .name').addClass(state);
+
+ // We generate the chatstate text
+ var text = '';
+
+ switch(state) {
+ // Active
+ case 'active':
+ text = _e("Your friend is paying attention to the conversation.");
+
+ break;
+
+ // Composing
+ case 'composing':
+ text = _e("Your friend is writing a message...");
+
+ break;
+
+ // Paused
+ case 'paused':
+ text = _e("Your friend stopped writing a message.");
+
+ break;
+
+ // Inactive
+ case 'inactive':
+ text = _e("Your friend is doing something else.");
+
+ break;
+
+ // Gone
+ case 'gone':
+ text = _e("Your friend closed the chat.");
+
+ break;
+ }
+
+ // We reset the previous state
+ $('#' + hash + ' .chatstate').remove();
+
+ // We create the chatstate
+ $('#' + hash + ' .content').after('<div class="' + state + ' chatstate">' + text + '</div>');
+ }
+}
+
+// Resets the chatstate switcher marker
+function resetChatState(hash, type) {
+ // Define the selector
+ var selector;
+
+ if(type == 'groupchat')
+ selector = $('#page-engine .page-engine-chan .user.' + hash);
+ else
+ selector = $('#page-switch .' + hash + ' .name');
+
+ // Reset!
+ selector.removeClass('active')
+ selector.removeClass('composing')
+ selector.removeClass('paused')
+ selector.removeClass('inactive')
+ selector.removeClass('gone');
+}
+
+// Adds the chatstate events
+function eventsChatState(target, xid, hash) {
+ target.keyup(function(e) {
+ if(e.keyCode != 13) {
+ // Composing a message
+ if($(this).val() && (getDB('chatstate', xid) != 'on')) {
+ // We change the state detect input
+ setDB('chatstate', xid, 'on');
+
+ // We send the friend a "composing" chatstate
+ chatStateSend('composing', xid, hash);
+ }
+
+ // Stopped composing a message
+ else if(!$(this).val() && (getDB('chatstate', xid) == 'on')) {
+ // We change the state detect input
+ setDB('chatstate', xid, 'off');
+
+ // We send the friend an "active" chatstate
+ chatStateSend('active', xid, hash);
+ }
+ }
+ });
+
+ target.change(function() {
+ // Reset the composing database entry
+ setDB('chatstate', xid, 'off');
+ });
+
+ target.focus(function() {
+ // Not needed
+ if(target.is(':disabled'))
+ return;
+
+ // Nothing in the input, user is active
+ if(!$(this).val())
+ chatStateSend('active', xid, hash);
+
+ // Something was written, user started writing again
+ else
+ chatStateSend('composing', xid, hash);
+ });
+
+ target.blur(function() {
+ // Not needed
+ if(target.is(':disabled'))
+ return;
+
+ // Nothing in the input, user is inactive
+ if(!$(this).val())
+ chatStateSend('inactive', xid, hash);
+
+ // Something was written, user paused
+ else
+ chatStateSend('paused', xid, hash);
+ });
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the common JS script for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Authors: Vanaryon, olivierm
+Last revision: 24/06/11
+
+*/
+
+// Checks if an element exists in the DOM
+function exists(selector) {
+ if(jQuery(selector).size() > 0)
+ return true;
+ else
+ return false;
+}
+
+// Checks if Jappix is connected
+function isConnected() {
+ if((typeof con != 'undefined') && con && con.connected())
+ return true;
+
+ return false;
+}
+
+// Checks if Jappix has focus
+function isFocused() {
+ try {
+ if(document.hasFocus())
+ return true;
+
+ return false;
+ }
+
+ catch(e) {
+ return true;
+ }
+}
+
+// Generates the good XID
+function generateXID(xid, type) {
+ // XID needs to be transformed
+ if(xid && (xid.indexOf('@') == -1)) {
+ // Groupchat
+ if(type == 'groupchat')
+ return xid + '@' + HOST_MUC;
+
+ // One-to-one chat
+ if(xid.indexOf('.') == -1)
+ return xid + '@' + HOST_MAIN;
+
+ // It might be a gateway?
+ return xid;
+ }
+
+ // Nothing special (yet bare XID)
+ return xid;
+}
+
+// Gets the asked translated string
+function _e(string) {
+ return string;
+}
+
+// Replaces '%s' to a given value for a translated string
+function printf(string, value) {
+ return string.replace('%s', value);
+}
+
+// Properly explodes a string with a given character
+function explodeThis(toEx, toStr, i) {
+ // Get the index of our char to explode
+ var index = toStr.indexOf(toEx);
+
+ // We split if necessary the string
+ if(index != -1) {
+ if(i == 0)
+ toStr = toStr.substr(0, index);
+ else
+ toStr = toStr.substr(index + 1);
+ }
+
+ // We return the value
+ return toStr;
+}
+
+// Cuts the resource of a XID
+function cutResource(aXID) {
+ return explodeThis('/', aXID, 0);
+}
+
+// Gets the resource of a XID
+function thisResource(aXID) {
+ // Any resource?
+ if(aXID.indexOf('/') != -1)
+ return explodeThis('/', aXID, 1);
+
+ // No resource
+ return '';
+}
+
+// Does stringprep on a string
+function stringPrep(string) {
+ // Replacement arrays
+ var invalid = new Array('Å ', 'Å”', 'Ä', 'Ä', 'Ž', 'ž', 'Ä', 'Ä', 'Ä', 'Ä', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć
', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć', 'Ć ', 'Ć”', 'Ć¢', 'Ć£', 'Ƥ', 'Ć„', 'Ʀ', 'Ƨ', 'ĆØ', 'Ć©', 'ĆŖ', 'Ć«', 'Ƭ', 'Ć', 'Ć®', 'ĆÆ', 'Ć°', 'Ʊ', 'Ć²', 'Ć³', 'Ć“', 'Ƶ', 'ƶ', 'Ćø', 'Ć¹', 'Ćŗ', 'Ć»', 'Ć½', 'Ć¾', 'Ćæ', 'Å', 'Å');
+
+ var valid = new Array('S', 's', 'Dj', 'dj', 'Z', 'z', 'C', 'c', 'C', 'c', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 'B', 'Ss', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'o', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'y', 'b', 'y', 'R', 'r');
+
+ // Compute a new string
+ for(i in invalid)
+ string = string.replace(invalid[i], valid[i]);
+
+ return string;
+}
+
+// Encodes quotes in a string
+function encodeQuotes(str) {
+ return (str + '').replace(/"/g, '"');
+}
+
+// Gets the bare XID from a XID
+function bareXID(xid) {
+ // Cut the resource
+ xid = cutResource(xid);
+
+ // Launch the stringprep
+ xid = stringPrep(xid);
+
+ // Set the XID to lower case
+ xid = xid.toLowerCase();
+
+ return xid;
+}
+
+// Gets the full XID from a XID
+function fullXID(xid) {
+ // Normalizes the XID
+ var full = bareXID(xid);
+ var resource = thisResource(xid);
+
+ // Any resource?
+ if(resource)
+ full += '/' + resource;
+
+ return full;
+}
+
+// Gets the nick from a XID
+function getXIDNick(aXID) {
+ return explodeThis('@', aXID, 0);
+}
+
+// Gets the host from a XID
+function getXIDHost(aXID) {
+ return explodeThis('@', aXID, 1);
+}
+
+// Checks if we are in developer mode
+function isDeveloper() {
+ if(DEVELOPER == 'on')
+ return true;
+
+ return false;
+}
+
+// Checks if anonymous mode is allowed
+function allowedAnonymous() {
+ if(ANONYMOUS == 'on')
+ return true;
+
+ return false;
+}
+
+// Checks if host is locked
+function lockHost() {
+ if(LOCK_HOST == 'on')
+ return true;
+
+ return false;
+}
+
+// Gets the full XID of the user
+function getXID() {
+ // Return the XID of the user
+ if(con.username && con.domain)
+ return con.username + '@' + con.domain;
+
+ return '';
+}
+
+// Generates the colors for a given user XID
+function generateColor(xid) {
+ var colors = new Array(
+ 'ac0000',
+ 'a66200',
+ '007703',
+ '00705f',
+ '00236b',
+ '4e005c'
+ );
+
+ var number = 0;
+
+ for(var i = 0; i < xid.length; i++)
+ number += xid.charCodeAt(i);
+
+ var color = '#' + colors[number % (colors.length)];
+
+ return color;
+}
+
+// Checks if the XID is a gateway
+function isGateway(xid) {
+ if(xid.indexOf('@') != -1)
+ return false;
+
+ return true;
+}
+
+// Gets the from attribute of a stanza (overrides some servers like Prosody missing from attributes)
+function getStanzaFrom(stanza) {
+ var from = stanza.getFrom();
+
+ // No from, we assume this is our XID
+ if(!from)
+ from = getXID();
+
+ return from;
+}
+
+// Logs a given data in the console
+function logThis(data, level) {
+ // Console not available
+ if(!isDeveloper() || (typeof(console) == 'undefined'))
+ return false;
+
+ // Switch the log level
+ switch(level) {
+ // Debug
+ case 0:
+ console.debug(data);
+
+ break;
+
+ // Error
+ case 1:
+ console.error(data);
+
+ break;
+
+ // Warning
+ case 2:
+ console.warn(data);
+
+ break;
+
+ // Information
+ case 3:
+ console.info(data);
+
+ break;
+
+ // Default log level
+ default:
+ console.log(data);
+
+ break;
+ }
+
+ return true;
+}
+
+// Gets the current Jappix app. location
+function getJappixLocation() {
+ var url = window.location.href;
+
+ // If the URL has variables, remove them
+ if(url.indexOf('?') != -1)
+ url = url.split('?')[0];
+ if(url.indexOf('#') != -1)
+ url = url.split('#')[0];
+
+ // No "/" at the end
+ if(!url.match(/(.+)\/$/))
+ url += '/';
+
+ return url;
+}
+
+// Removes spaces at the beginning & the end of a string
+function trim(str) {
+ return str.replace(/^\s+/g,'').replace(/\s+$/g,'');
+}
+
+// Adds a zero to a date when needed
+function padZero(i) {
+ // Negative number (without first 0)
+ if(i > -10 && i < 0)
+ return '-0' + (i * -1);
+
+ // Positive number (without first 0)
+ if(i < 10 && i >= 0)
+ return '0' + i;
+
+ // All is okay
+ return i;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the connection JS script for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 29/08/11
+
+*/
+
+// Does the user login
+var CURRENT_SESSION = false;
+
+function doLogin(lNick, lServer, lPass, lResource, lPriority, lRemember) {
+ try {
+ // We remove the not completed class to avoid problems
+ $('#home .loginer input').removeClass('please-complete');
+
+ // We add the login wait div
+ showGeneralWait();
+
+ // We define the http binding parameters
+ oArgs = new Object();
+
+ if(HOST_BOSH_MAIN)
+ oArgs.httpbase = HOST_BOSH_MAIN;
+ else
+ oArgs.httpbase = HOST_BOSH;
+
+ // We create the new http-binding connection
+ con = new JSJaCHttpBindingConnection(oArgs);
+
+ // And we handle everything that happen
+ setupCon(con);
+
+ // Generate a resource
+ var random_resource = getDB('session', 'resource');
+
+ if(!random_resource)
+ random_resource = lResource + ' (' + (new Date()).getTime() + ')';
+
+ // We retrieve what the user typed in the login inputs
+ oArgs = new Object();
+ oArgs.domain = trim(lServer);
+ oArgs.username = trim(lNick);
+ oArgs.resource = random_resource;
+ oArgs.pass = lPass;
+ oArgs.secure = true;
+ oArgs.xmllang = XML_LANG;
+
+ // Store the resource (for reconnection)
+ setDB('session', 'resource', random_resource);
+
+ // Generate a session XML to be stored
+ session_xml = '<session><stored>true</stored><domain>' + lServer.htmlEnc() + '</domain><username>' + lNick.htmlEnc() + '</username><resource>' + lResource.htmlEnc() + '</resource><password>' + lPass.htmlEnc() + '</password><priority>' + lPriority.htmlEnc() + '</priority></session>';
+
+ // Save the session parameters (for reconnect if network issue)
+ CURRENT_SESSION = session_xml;
+
+ // Remember me?
+ if(lRemember)
+ setDB('remember', 'session', 1);
+
+ // We store the infos of the user into the data-base
+ setDB('priority', 1, lPriority);
+
+ // We connect !
+ con.connect(oArgs);
+
+ // Change the page title
+ pageTitle('wait');
+
+ logThis('Jappix is connecting...', 3);
+ }
+
+ catch(e) {
+ // Logs errors
+ logThis('Error while logging in: ' + e, 1);
+
+ // Reset Jappix
+ destroyTalkPage();
+
+ // Open an unknown error
+ openThisError(2);
+ }
+
+ finally {
+ return false;
+ }
+}
+
+// Handles the user registration
+function handleRegistered() {
+ logThis('A new account has been registered.', 3);
+
+ // We remove the waiting image
+ removeGeneralWait();
+
+ // Reset the title
+ pageTitle('home');
+
+ // We show the success information
+ $('#home .registerer .success').fadeIn('fast');
+
+ // We quit the session
+ logout();
+}
+
+// Does the user registration
+function doRegister(username, domain, pass) {
+ logThis('Trying to register an account...', 3);
+
+ try {
+ // We define the http binding parameters
+ oArgs = new Object();
+
+ if(HOST_BOSH_MAIN)
+ oArgs.httpbase = HOST_BOSH_MAIN;
+ else
+ oArgs.httpbase = HOST_BOSH;
+
+ // We create the new http-binding connection
+ con = new JSJaCHttpBindingConnection(oArgs);
+
+ // We setup the connection !
+ con.registerHandler('onconnect', handleRegistered);
+ con.registerHandler('onerror', handleError);
+
+ // We retrieve what the user typed in the register inputs
+ oArgs = new Object();
+ oArgs.domain = trim(domain);
+ oArgs.username = trim(username);
+ oArgs.resource = JAPPIX_RESOURCE + ' Register (' + (new Date()).getTime() + ')';
+ oArgs.pass = pass;
+ oArgs.register = true;
+ oArgs.secure = true;
+ oArgs.xmllang = XML_LANG;
+
+ con.connect(oArgs);
+
+ // We change the registered information text
+ $('#home .homediv.registerer').append(
+ '<div class="info success">' +
+ _e("You have been registered, here is your XMPP address:") + ' <b>' + con.username.htmlEnc() + '@' + con.domain.htmlEnc() + '</b> - <a href="#">' + _e("Login") + '</a>' +
+ '</div>'
+ );
+
+ // Login link
+ $('#home .homediv.registerer .success a').click(function() {
+ return doLogin(con.username, con.domain, con.pass, con.resource, '10', false);
+ });
+
+ // Show the waiting image
+ showGeneralWait();
+
+ // Change the page title
+ pageTitle('wait');
+ }
+
+ catch(e) {
+ // Logs errors
+ logThis(e, 1);
+ }
+
+ finally {
+ return false;
+ }
+}
+
+// Does the user anonymous login
+function doAnonymous() {
+ logThis('Trying to login anonymously...', 3);
+
+ var aPath = '#home .anonymouser ';
+ var room = $(aPath + '.room').val();
+ var nick = $(aPath + '.nick').val();
+
+ // If the form is correctly completed
+ if(room && nick) {
+ // We remove the not completed class to avoid problems
+ $('#home .anonymouser input').removeClass('please-complete');
+
+ // Redirect the user to the anonymous room
+ window.location.href = JAPPIX_LOCATION + '?r=' + room + '&n=' + nick;
+ }
+
+ // We check if the form is entirely completed
+ else {
+ $(aPath + 'input[type=text]').each(function() {
+ var select = $(this);
+
+ if(!select.val())
+ $(document).oneTime(10, function() {
+ select.addClass('please-complete').focus();
+ });
+ else
+ select.removeClass('please-complete');
+ });
+ }
+
+ return false;
+}
+
+// Handles the user connected event
+var CONNECTED = false;
+
+function handleConnected() {
+ logThis('Jappix is now connected.', 3);
+
+ // Connection markers
+ CONNECTED = true;
+ RECONNECT_TRY = 0;
+ RECONNECT_TIMER = 0;
+
+ // We hide the home page
+ $('#home').hide();
+
+ // Not resumed?
+ if(!RESUME) {
+ // Remember the session?
+ if(getDB('remember', 'session'))
+ setPersistent('session', 1, CURRENT_SESSION);
+
+ // We show the chatting app.
+ createTalkPage();
+
+ // We reset the homepage
+ switchHome('default');
+
+ // We get all the other things
+ getEverything();
+
+ // Set last activity stamp
+ LAST_ACTIVITY = getTimeStamp();
+ }
+
+ // Resumed
+ else {
+ // Send our presence
+ presenceSend();
+
+ // Change the title
+ updateTitle();
+ }
+
+ // Remove the waiting item
+ removeGeneralWait();
+}
+
+// Handles the user disconnected event
+function handleDisconnected() {
+ logThis('Jappix is now disconnected.', 3);
+
+ // Normal disconnection
+ if(!CURRENT_SESSION && !CONNECTED)
+ destroyTalkPage();
+}
+
+// Setups the normal connection
+function setupCon(con) {
+ // We setup all the necessary handlers for the connection
+ con.registerHandler('message', handleMessage);
+ con.registerHandler('presence', handlePresence);
+ con.registerHandler('iq', handleIQ);
+ con.registerHandler('onconnect', handleConnected);
+ con.registerHandler('onerror', handleError);
+ con.registerHandler('ondisconnect', handleDisconnected);
+}
+
+// Logouts from the server
+function logout() {
+ // We are not connected
+ if(!isConnected())
+ return false;
+
+ // Disconnect from the XMPP server
+ con.disconnect();
+
+ logThis('Jappix is disconnecting...', 3);
+}
+
+// Terminates a session
+function terminate() {
+ if(!isConnected())
+ return;
+
+ // Clear temporary session storage
+ resetConMarkers();
+
+ // Show the waiting item (useful if BOSH is sloooow)
+ showGeneralWait();
+
+ // Change the page title
+ pageTitle('wait');
+
+ // Disconnect from the XMPP server
+ logout();
+}
+
+// Quitss a session
+function quit() {
+ if(!isConnected())
+ return;
+
+ // We show the waiting image
+ showGeneralWait();
+
+ // Change the page title
+ pageTitle('wait');
+
+ // We disconnect from the XMPP server
+ logout();
+}
+
+// Creates the reconnect pane
+var RECONNECT_TRY = 0;
+var RECONNECT_TIMER = 0;
+
+function createReconnect(mode) {
+ logThis('This is not a normal disconnection, show the reconnect pane...', 1);
+
+ // Reconnect pane not yet displayed?
+ if(!exists('#reconnect')) {
+ // Blur the focused input/textarea/select
+ $('input, select, textarea').blur();
+
+ // Create the HTML code
+ var html = '<div id="reconnect" class="lock">' +
+ '<div class="pane">' +
+ _e("Due to a network issue, you were disconnected. What do you want to do now?");
+
+ // Can we cancel reconnection?
+ if(mode == 'normal')
+ html += '<a href="#" class="finish cancel">' + _e("Cancel") + '</a>';
+
+ html += '<a href="#" class="finish reconnect">' + _e("Reconnect") + '</a>' +
+ '</div></div>';
+
+ // Append the code
+ $('body').append(html);
+
+ // Click events
+ if(mode == 'normal')
+ $('#reconnect a.finish.cancel').click(function() {
+ return cancelReconnect();
+ });
+
+ $('#reconnect a.finish.reconnect').click(function() {
+ return acceptReconnect(mode);
+ });
+
+ // Try to reconnect automatically after a while
+ if(RECONNECT_TRY < 5)
+ RECONNECT_TIMER = 5 + (5 * RECONNECT_TRY);
+ else
+ RECONNECT_TIMER = 120;
+
+ // Change the try number
+ RECONNECT_TRY++;
+
+ // Fire the event!
+ $('#reconnect a.finish.reconnect').everyTime('1s', function() {
+ // We can reconnect!
+ if(RECONNECT_TIMER == 0)
+ return acceptReconnect(mode);
+
+ // Button text
+ if(RECONNECT_TIMER <= 10)
+ $(this).text(_e("Reconnect") + ' (' + RECONNECT_TIMER + ')');
+
+ // Remove 1 second
+ RECONNECT_TIMER--;
+ });
+
+ // Page title
+ updateTitle();
+ }
+}
+
+// Reconnects the user if he was disconnected (network issue)
+var RESUME = false;
+
+function acceptReconnect(mode) {
+ logThis('Trying to reconnect the user...', 3);
+
+ // Resume marker
+ RESUME = true;
+
+ // Show waiting item
+ showGeneralWait();
+
+ // Reset some various stuffs
+ var groupchats = '#page-engine .page-engine-chan[data-type=groupchat]';
+ $(groupchats + ' .list .role').hide();
+ $(groupchats + ' .one-group, ' + groupchats + ' .list .user').remove();
+ $(groupchats).attr('data-initial', 'false');
+
+ // Stop the timer
+ $('#reconnect a.finish.reconnect').stopTime();
+
+ // Remove the reconnect pane
+ $('#reconnect').remove();
+
+ // Try to login again
+ if(mode == 'normal')
+ loginFromSession(XMLFromString(CURRENT_SESSION));
+ else if(mode == 'anonymous')
+ anonymousLogin(HOST_ANONYMOUS);
+
+ return false;
+}
+
+// Cancel the reconnection of user account (network issue)
+function cancelReconnect() {
+ logThis('User has canceled automatic reconnection...', 3);
+
+ // Stop the timer
+ $('#reconnect a.finish.reconnect').stopTime();
+
+ // Remove the reconnect pane
+ $('#reconnect').remove();
+
+ // Destroy the talk page
+ destroyTalkPage();
+
+ // Renitialize the previous session parameters
+ resetConMarkers();
+
+ return false;
+}
+
+// Clears session reminder database
+function clearLastSession() {
+ // Clear temporary storage
+ resetConMarkers();
+
+ // Clear persistent storage
+ if($(XMLFromString(getPersistent('session', 1))).find('stored').text() == 'true')
+ removePersistent('session', 1);
+}
+
+// Resets the connection markers
+function resetConMarkers() {
+ CURRENT_SESSION = false;
+ CONNECTED = false;
+ RESUME = false;
+ RECONNECT_TRY = 0;
+ RECONNECT_TIMER = 0;
+}
+
+// Logins from a saved session
+function loginFromSession(data) {
+ // Select the data
+ var session = $(data);
+
+ // Fire the login event
+ doLogin(
+ session.find('username').text(),
+ session.find('domain').text(),
+ session.find('password').text(),
+ session.find('resource').text(),
+ session.find('priority').text(),
+ false
+ );
+}
+
+// Quits a session normally
+function normalQuit() {
+ // Reset our database
+ clearLastSession();
+
+ // We quit the current session
+ quit();
+
+ // We show an info
+ openThisInfo(3);
+
+ return false;
+}
+
+// Gets all the users stuffs
+function getEverything() {
+ getFeatures();
+ getRoster();
+ listPrivacy();
+ getStorage(NS_ROSTERNOTES);
+}
+
+// Plugin launcher
+function launchConnection() {
+ // Logouts when Jappix is closed
+ $(window).bind('beforeunload', terminate);
+
+ // Nothing to do when anonymous!
+ if(isAnonymous())
+ return;
+
+ // Try to resume a stored session, if not anonymous
+ var session = XMLFromString(getPersistent('session', 1));
+
+ if($(session).find('stored').text() == 'true') {
+ // Hide the homepage
+ $('#home').hide();
+
+ // Show the waiting icon
+ showGeneralWait();
+
+ // Login!
+ loginFromSession(session);
+
+ logThis('Saved session found, resuming it...', 3);
+ }
+
+ // Not connected, maybe a XMPP link is submitted?
+ else if((parent.location.hash != '#OK') && LINK_VARS['x']) {
+ switchHome('loginer');
+
+ logThis('A XMPP link is set, switch to login page.', 3);
+ }
+}
+
+// Launch this plugin!
+$(document).ready(launchConnection);
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the constants JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Authors: Stefan Strigler, Vanaryon
+Last revision: 26/08/11
+
+*/
+
+// XMPP XMLNS attributes
+var NS_PROTOCOL = 'http://jabber.org/protocol/';
+var NS_FEATURES = 'http://jabber.org/features/';
+var NS_CLIENT = 'jabber:client';
+var NS_IQ = 'jabber:iq:';
+var NS_X = 'jabber:x:';
+var NS_IETF = 'urn:ietf:params:xml:ns:xmpp-';
+var NS_XMPP = 'urn:xmpp:';
+
+var NS_STORAGE = 'storage:';
+var NS_BOOKMARKS = NS_STORAGE + 'bookmarks';
+var NS_ROSTERNOTES = NS_STORAGE + 'rosternotes';
+
+var NS_JAPPIX = 'jappix:';
+var NS_INBOX = NS_JAPPIX + 'inbox';
+var NS_OPTIONS = NS_JAPPIX + 'options';
+
+var NS_DISCO_ITEMS = NS_PROTOCOL + 'disco#items';
+var NS_DISCO_INFO = NS_PROTOCOL + 'disco#info';
+var NS_VCARD = 'vcard-temp';
+var NS_VCARD_P = NS_VCARD + ':x:update';
+var NS_AUTH = NS_IQ + 'auth';
+var NS_AUTH_ERROR = NS_IQ + 'auth:error';
+var NS_REGISTER = NS_IQ + 'register';
+var NS_SEARCH = NS_IQ + 'search';
+var NS_ROSTER = NS_IQ + 'roster';
+var NS_PRIVACY = NS_IQ + 'privacy';
+var NS_PRIVATE = NS_IQ + 'private';
+var NS_VERSION = NS_IQ + 'version';
+var NS_TIME = NS_IQ + 'time';
+var NS_LAST = NS_IQ + 'last';
+var NS_IQDATA = NS_IQ + 'data';
+var NS_XDATA = NS_X + 'data';
+var NS_IQOOB = NS_IQ + 'oob';
+var NS_XOOB = NS_X + 'oob';
+var NS_DELAY = NS_X + 'delay';
+var NS_EXPIRE = NS_X + 'expire';
+var NS_EVENT = NS_X + 'event';
+var NS_XCONFERENCE = NS_X + 'conference';
+var NS_STATS = NS_PROTOCOL + 'stats';
+var NS_MUC = NS_PROTOCOL + 'muc';
+var NS_MUC_USER = NS_MUC + '#user';
+var NS_MUC_ADMIN = NS_MUC + '#admin';
+var NS_MUC_OWNER = NS_MUC + '#owner';
+var NS_MUC_CONFIG = NS_MUC + '#roomconfig';
+var NS_PUBSUB = NS_PROTOCOL + 'pubsub';
+var NS_PUBSUB_EVENT = NS_PUBSUB + '#event';
+var NS_PUBSUB_OWNER = NS_PUBSUB + '#owner';
+var NS_PUBSUB_NMI = NS_PUBSUB + '#node-meta-info';
+var NS_PUBSUB_NC = NS_PUBSUB + '#node_config';
+var NS_PUBSUB_RI = NS_PUBSUB + '#retrieve-items';
+var NS_COMMANDS = NS_PROTOCOL + 'commands';
+var NS_BOSH = NS_PROTOCOL + 'httpbind';
+var NS_STREAM = 'http://etherx.jabber.org/streams';
+var NS_URN_TIME = NS_XMPP + 'time';
+var NS_URN_PING = NS_XMPP + 'ping';
+var NS_URN_ADATA = NS_XMPP + 'avatar:data';
+var NS_URN_AMETA = NS_XMPP + 'avatar:metadata';
+var NS_URN_MBLOG = NS_XMPP + 'microblog:0';
+var NS_URN_INBOX = NS_XMPP + 'inbox';
+var NS_URN_ARCHIVE = NS_XMPP + 'archive';
+var NS_URN_AR_PREF = NS_URN_ARCHIVE + ':pref';
+var NS_URN_AR_AUTO = NS_URN_ARCHIVE + ':auto';
+var NS_URN_AR_MANUAL = NS_URN_ARCHIVE + ':manual';
+var NS_URN_AR_MANAGE = NS_URN_ARCHIVE + ':manage';
+var NS_URN_DELAY = NS_XMPP + 'delay';
+var NS_URN_RECEIPTS = NS_XMPP + 'receipts';
+var NS_RSM = NS_PROTOCOL + 'rsm';
+var NS_IPV6 = 'ipv6';
+var NS_XHTML = 'http://www.w3.org/1999/xhtml';
+var NS_XHTML_IM = NS_PROTOCOL + 'xhtml-im';
+var NS_CHATSTATES = NS_PROTOCOL + 'chatstates';
+var NS_HTTP_AUTH = NS_PROTOCOL + 'http-auth';
+var NS_ROSTERX = NS_PROTOCOL + 'rosterx';
+var NS_MOOD = NS_PROTOCOL + 'mood';
+var NS_ACTIVITY = NS_PROTOCOL + 'activity';
+var NS_TUNE = NS_PROTOCOL + 'tune';
+var NS_GEOLOC = NS_PROTOCOL + 'geoloc';
+var NS_NICK = NS_PROTOCOL + 'nick';
+var NS_NOTIFY = '+notify';
+var NS_CAPS = NS_PROTOCOL + 'caps';
+var NS_ATOM = 'http://www.w3.org/2005/Atom';
+
+var NS_STANZAS = NS_IETF + 'stanzas';
+var NS_STREAMS = NS_IETF + 'streams';
+
+var NS_TLS = NS_IETF + 'tls';
+var NS_SASL = NS_IETF + 'sasl';
+var NS_SESSION = NS_IETF + 'session';
+var NS_BIND = NS_IETF + 'bind';
+
+var NS_FEATURE_IQAUTH = NS_FEATURES + 'iq-auth';
+var NS_FEATURE_IQREGISTER = NS_FEATURES + 'iq-register';
+var NS_FEATURE_COMPRESS = NS_FEATURES + 'compress';
+
+var NS_COMPRESS = NS_PROTOCOL + 'compress';
+
+// Available locales
+var LOCALES_AVAILABLE_ID = new Array();
+var LOCALES_AVAILABLE_NAMES = new Array();
+
+// XML lang
+var XML_LANG = null;
+
+// Jappix parameters
+var JAPPIX_STATIC = null;
+var JAPPIX_VERSION = null;
+var JAPPIX_MAX_FILE_SIZE = null;
+var JAPPIX_MAX_UPLOAD = null;
+
+// Jappix main configuration
+var SERVICE_NAME = null;
+var SERVICE_DESC = null;
+var JAPPIX_RESOURCE = null;
+var LOCK_HOST = null;
+var ANONYMOUS = null;
+var REGISTRATION = null;
+var BOSH_PROXY = null;
+var MANAGER_LINK = null;
+var GROUPCHATS_JOIN = null;
+var ENCRYPTION = null;
+var HTTPS_STORAGE = null;
+var HTTPS_FORCE = null;
+var COMPRESSION = null;
+var MULTI_FILES = null;
+var DEVELOPER = null;
+
+// Jappix hosts configuration
+var HOST_MAIN = null;
+var HOST_MUC = null;
+var HOST_PUBSUB = null;
+var HOST_VJUD = null;
+var HOST_ANONYMOUS = null;
+var HOST_BOSH = null;
+var HOST_BOSH_MAIN = null;
+var HOST_BOSH_MINI = null;
+var HOST_STATIC = null;
+var HOST_UPLOAD = null;
+
+// Anonymous mode
+var ANONYMOUS_ROOM = null;
+var ANONYMOUS_NICK = null;
+
+// Node parameters
+var JAPPIX_LOCATION = getJappixLocation();
+
+// XMPP error stanzas
+function STANZA_ERROR(code, type, cond) {
+ if (window == this)
+ return new STANZA_ERROR(code, type, cond);
+
+ this.code = code;
+ this.type = type;
+ this.cond = cond;
+}
+
+var ERR_BAD_REQUEST =
+ STANZA_ERROR('400', 'modify', 'bad-request');
+var ERR_CONFLICT =
+ STANZA_ERROR('409', 'cancel', 'conflict');
+var ERR_FEATURE_NOT_IMPLEMENTED =
+ STANZA_ERROR('501', 'cancel', 'feature-not-implemented');
+var ERR_FORBIDDEN =
+ STANZA_ERROR('403', 'auth', 'forbidden');
+var ERR_GONE =
+ STANZA_ERROR('302', 'modify', 'gone');
+var ERR_INTERNAL_SERVER_ERROR =
+ STANZA_ERROR('500', 'wait', 'internal-server-error');
+var ERR_ITEM_NOT_FOUND =
+ STANZA_ERROR('404', 'cancel', 'item-not-found');
+var ERR_JID_MALFORMED =
+ STANZA_ERROR('400', 'modify', 'jid-malformed');
+var ERR_NOT_ACCEPTABLE =
+ STANZA_ERROR('406', 'modify', 'not-acceptable');
+var ERR_NOT_ALLOWED =
+ STANZA_ERROR('405', 'cancel', 'not-allowed');
+var ERR_NOT_AUTHORIZED =
+ STANZA_ERROR('401', 'auth', 'not-authorized');
+var ERR_PAYMENT_REQUIRED =
+ STANZA_ERROR('402', 'auth', 'payment-required');
+var ERR_RECIPIENT_UNAVAILABLE =
+ STANZA_ERROR('404', 'wait', 'recipient-unavailable');
+var ERR_REDIRECT =
+ STANZA_ERROR('302', 'modify', 'redirect');
+var ERR_REGISTRATION_REQUIRED =
+ STANZA_ERROR('407', 'auth', 'registration-required');
+var ERR_REMOTE_SERVER_NOT_FOUND =
+ STANZA_ERROR('404', 'cancel', 'remote-server-not-found');
+var ERR_REMOTE_SERVER_TIMEOUT =
+ STANZA_ERROR('504', 'wait', 'remote-server-timeout');
+var ERR_RESOURCE_CONSTRAINT =
+ STANZA_ERROR('500', 'wait', 'resource-constraint');
+var ERR_SERVICE_UNAVAILABLE =
+ STANZA_ERROR('503', 'cancel', 'service-unavailable');
+var ERR_SUBSCRIPTION_REQUIRED =
+ STANZA_ERROR('407', 'auth', 'subscription-required');
+var ERR_UNEXPECTED_REQUEST =
+ STANZA_ERROR('400', 'wait', 'unexpected-request');
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the dataform JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 28/08/11
+
+*/
+
+// Gets the defined dataform elements
+function dataForm(host, type, node, action, target) {
+ // Clean the current session
+ cleanDataForm(target);
+
+ // We tell the user that a search has been launched
+ $('#' + target + ' .wait').show();
+
+ // If we have enough data
+ if(host && type) {
+ // Generate a session ID
+ var sessionID = Math.round(100000.5 + (((900000.49999) - (100000.5)) * Math.random()));
+ var id = target + '-' + sessionID + '-' + genID();
+ $('.' + target + '-results').attr('data-session', target + '-' + sessionID);
+
+ // We request the service item
+ var iq = new JSJaCIQ();
+ iq.setID(id);
+ iq.setTo(host);
+ iq.setType('get');
+
+ // MUC admin query
+ if(type == 'muc') {
+ iq.setQuery(NS_MUC_OWNER);
+ con.send(iq, handleDataFormMuc);
+ }
+
+ // Browse query
+ else if(type == 'browse') {
+ var iqQuery = iq.setQuery(NS_DISCO_ITEMS);
+
+ if(node)
+ iqQuery.setAttribute('node', node);
+
+ con.send(iq, handleDataFormBrowse);
+ }
+
+ // Command
+ else if(type == 'command') {
+ var items;
+
+ if(node)
+ items = iq.appendNode('command', {'node': node, 'xmlns': NS_COMMANDS});
+
+ else {
+ items = iq.setQuery(NS_DISCO_ITEMS);
+ items.setAttribute('node', NS_COMMANDS);
+ }
+
+ if(action && node) {
+ iq.setType('set');
+ items.setAttribute('action', action);
+ }
+
+ con.send(iq, handleDataFormCommand);
+ }
+
+ // Search query
+ else if(type == 'search') {
+ iq.setQuery(NS_SEARCH);
+ con.send(iq, handleDataFormSearch);
+ }
+
+ // Subscribe query
+ else if(type == 'subscribe') {
+ iq.setQuery(NS_REGISTER);
+ con.send(iq, handleDataFormSubscribe);
+ }
+
+ // Join
+ else if(type == 'join') {
+ if(target == 'discovery')
+ closeDiscovery();
+
+ checkChatCreate(host, 'groupchat');
+ }
+ }
+
+ return false;
+}
+
+// Sends a given dataform
+function sendDataForm(type, action, x_type, id, xid, node, sessionid, target) {
+ // Path
+ var pathID = '#' + target + ' .results[data-session=' + id + ']';
+
+ // New IQ
+ var iq = new JSJaCIQ();
+ iq.setTo(xid);
+ iq.setType('set');
+
+ // Set the correct query
+ var query;
+
+ if(type == 'subscribe')
+ iqQuery = iq.setQuery(NS_REGISTER);
+ else if(type == 'search')
+ iqQuery = iq.setQuery(NS_SEARCH);
+ else if(type == 'command')
+ iqQuery = iq.appendNode('command', {'xmlns': NS_COMMANDS, 'node': node, 'sessionid': sessionid, 'action': action});
+ else if(type == 'x')
+ iqQuery = iq.setQuery(NS_MUC_OWNER);
+
+ // Build the XML document
+ if(action != 'cancel') {
+ // No X node
+ if(exists('input.register-special') && (type == 'subscribe')) {
+ $('input.register-special').each(function() {
+ var iName = $(this).attr('name');
+ var iValue = $(this).val();
+
+ iqQuery.appendChild(iq.buildNode(iName, {'xmlns': NS_REGISTER}, iValue));
+ });
+ }
+
+ // Can create the X node
+ else {
+ var iqX = iqQuery.appendChild(iq.buildNode('x', {'xmlns': NS_XDATA, 'type': x_type}));
+
+ // Each input
+ $(pathID + ' .oneresult input, ' + pathID + ' .oneresult textarea, ' + pathID + ' .oneresult select').each(function() {
+ // Get the current input value
+ var iVar = $(this).attr('name');
+ var iType = $(this).attr('data-type');
+ var iValue = $(this).val();
+
+ // Build a new field node
+ var field = iqX.appendChild(iq.buildNode('field', {'var': iVar, 'type': iType, 'xmlns': NS_XDATA}));
+
+ // Boolean input?
+ if(iType == 'boolean') {
+ if($(this).filter(':checked').size())
+ iValue = '1';
+ else
+ iValue = '0';
+ }
+
+ // JID-multi input?
+ if(iType == 'jid-multi') {
+ // Values array
+ var xid_arr = [iValue];
+ var xid_check = [];
+
+ // Try to split it
+ if(iValue.indexOf(',') != -1)
+ xid_arr = iValue.split(',');
+
+ // Append each value to the XML document
+ for(i in xid_arr) {
+ // Get the current value
+ xid_current = trim(xid_arr[i]);
+
+ // No current value?
+ if(!xid_current)
+ continue;
+
+ // Add the current value
+ if(!existArrayValue(xid_check, xid_current)) {
+ xid_check.push(xid_current);
+ field.appendChild(iq.buildNode('value', {'xmlns': NS_XDATA}, xid_current));
+ }
+ }
+ }
+
+ // List-multi selector?
+ else if(iType == 'list-multi') {
+ // Any value?
+ if(iValue && iValue.length) {
+ for(i in iValue)
+ field.appendChild(iq.buildNode('value', {'xmlns': NS_XDATA}, iValue[i]));
+ }
+ }
+
+ // Other inputs?
+ else
+ field.appendChild(iq.buildNode('value', {'xmlns': NS_XDATA}, iValue));
+ });
+ }
+ }
+
+ // Clean the current session
+ cleanDataForm(target);
+
+ // Show the waiting item
+ $('#' + target + ' .wait').show();
+
+ // Change the ID of the current discovered item
+ var iqID = target + '-' + genID();
+ $('#' + target + ' .' + target + '-results').attr('data-session', iqID);
+ iq.setID(iqID);
+
+ // Send the IQ
+ if(type == 'subscribe')
+ con.send(iq, handleDataFormSubscribe);
+ else if(type == 'search')
+ con.send(iq, handleDataFormSearch);
+ else if(type == 'command')
+ con.send(iq, handleDataFormCommand);
+ else
+ con.send(iq);
+
+ return false;
+}
+
+// Displays the good dataform buttons
+function buttonsDataForm(type, action, id, xid, node, sessionid, target, pathID) {
+ // No need to use buttons?
+ if(type == 'muc')
+ return;
+
+ // Override the "undefined" output
+ if(!id)
+ id = '';
+ if(!xid)
+ xid = '';
+ if(!node)
+ node = '';
+ if(!sessionid)
+ sessionid = '';
+
+ // We generate the buttons code
+ var buttonsCode = '<div class="oneresult ' + target + '-oneresult ' + target + '-formtools">';
+
+ if(action == 'submit') {
+ if((target == 'adhoc') && (type == 'command')) {
+ buttonsCode += '<a href="#" class="submit" onclick="return sendDataForm(\'' + encodeOnclick(type) + '\', \'execute\', \'submit\', \'' + encodeOnclick(id) + '\', \'' + encodeOnclick(xid) + '\', \'' + encodeOnclick(node) + '\', \'' + encodeOnclick(sessionid) + '\', \'' + encodeOnclick(target) + '\');">' + _e("Submit") + '</a>';
+
+ // When keyup on one text input
+ $(pathID + ' input').keyup(function(e) {
+ if(e.keyCode == 13) {
+ sendDataForm(type, 'execute', 'submit', id, xid, node, sessionid, target);
+
+ return false;
+ }
+ });
+ }
+
+ else {
+ buttonsCode += '<a href="#" class="submit" onclick="return sendDataForm(\'' + encodeOnclick(type) + '\', \'submit\', \'submit\', \'' + encodeOnclick(id) + '\', \'' + encodeOnclick(xid) + '\', \'' + encodeOnclick(node) + '\', \'' + encodeOnclick(sessionid) + '\', \'' + encodeOnclick(target) + '\');">' + _e("Submit") + '</a>';
+
+ // When keyup on one text input
+ $(pathID + ' input').keyup(function(e) {
+ if(e.keyCode == 13) {
+ sendDataForm(type, 'submit', 'submit', id, xid, node, sessionid, target);
+
+ return false;
+ }
+ });
+ }
+ }
+
+ if((action == 'submit') && (type != 'subscribe') && (type != 'search'))
+ buttonsCode += '<a href="#" class="submit" onclick="return sendDataForm(\'' + encodeOnclick(type) + '\', \'cancel\', \'cancel\', \'' + encodeOnclick(id) + '\', \'' + encodeOnclick(xid) + '\', \'' + encodeOnclick(node) + '\', \'' + encodeOnclick(sessionid) + '\', \'' + encodeOnclick(target) + '\');">' + _e("Cancel") + '</a>';
+
+ if(((action == 'back') || (type == 'subscribe') || (type == 'search')) && (target == 'discovery'))
+ buttonsCode += '<a href="#" class="back" onclick="return startDiscovery();">' + _e("Close") + '</a>';
+
+ if((action == 'back') && ((target == 'welcome') || (target == 'directory')))
+ buttonsCode += '<a href="#" class="back" onclick="return dataForm(HOST_VJUD, \'search\', \'\', \'\', \'' + target + '\');">' + _e("Previous") + '</a>';
+
+ if((action == 'back') && (target == 'adhoc'))
+ buttonsCode += '<a href="#" class="back" onclick="return dataForm(\'' + encodeOnclick(xid) + '\', \'command\', \'\', \'\', \'adhoc\');">' + _e("Previous") + '</a>';
+
+ buttonsCode += '</div>';
+
+ // We display the buttons code
+ $(pathID).append(buttonsCode);
+
+ // If no submit link, lock the form
+ if(!exists(pathID + ' a.submit'))
+ $(pathID + ' input, ' + pathID + ' textarea').attr('readonly', true);
+}
+
+// Handles the MUC dataform
+function handleDataFormMuc(iq) {
+ handleErrorReply(iq);
+ handleDataFormContent(iq, 'muc');
+}
+
+// Handles the browse dataform
+function handleDataFormBrowse(iq) {
+ handleErrorReply(iq);
+ handleDataFormContent(iq, 'browse');
+}
+
+// Handles the command dataform
+function handleDataFormCommand(iq) {
+ handleErrorReply(iq);
+ handleDataFormContent(iq, 'command');
+}
+
+// Handles the subscribe dataform
+function handleDataFormSubscribe(iq) {
+ handleErrorReply(iq);
+ handleDataFormContent(iq, 'subscribe');
+}
+
+// Handles the search dataform
+function handleDataFormSearch(iq) {
+ handleErrorReply(iq);
+ handleDataFormContent(iq, 'search');
+}
+
+// Handles the dataform content
+function handleDataFormContent(iq, type) {
+ // Get the ID
+ var sID = iq.getID();
+
+ // Get the target
+ var splitted = sID.split('-');
+ var target = splitted[0];
+ var sessionID = target + '-' + splitted[1];
+ var from = fullXID(getStanzaFrom(iq));
+ var pathID = '#' + target + ' .results[data-session=' + sessionID + ']';
+
+ // If an error occured
+ if(!iq || (iq.getType() != 'result'))
+ noResultDataForm(pathID);
+
+ // If we got something okay
+ else {
+ var handleXML = iq.getNode();
+
+ if(type == 'browse') {
+ if($(handleXML).find('item').attr('jid')) {
+ // Get the query node
+ var queryNode = $(handleXML).find('query').attr('node');
+
+ $(handleXML).find('item').each(function() {
+ // We parse the received xml
+ var itemHost = $(this).attr('jid');
+ var itemNode = $(this).attr('node');
+ var itemName = $(this).attr('name');
+ var itemHash = hex_md5(itemHost);
+
+ // Node
+ if(itemNode)
+ $(pathID).append(
+ '<div class="oneresult ' + target + '-oneresult" onclick="return dataForm(\'' + encodeOnclick(itemHost) + '\', \'browse\', \'' + encodeOnclick(itemNode) + '\', \'\', \'' + encodeOnclick(target) + '\');">' +
+ '<div class="one-name">' + itemNode.htmlEnc() + '</div>' +
+ '</div>'
+ );
+
+ // Item
+ else if(queryNode && itemName)
+ $(pathID).append(
+ '<div class="oneresult ' + target + '-oneresult">' +
+ '<div class="one-name">' + itemName.htmlEnc() + '</div>' +
+ '</div>'
+ );
+
+ // Item with children
+ else {
+ // We display the waiting element
+ $(pathID + ' .disco-wait .disco-category-title').after(
+ '<div class="oneresult ' + target + '-oneresult ' + itemHash + '">' +
+ '<div class="one-icon loading talk-images"></div>' +
+ '<div class="one-host">' + itemHost + '</div>' +
+ '<div class="one-type">' + _e("Requesting this service...") + '</div>' +
+ '</div>'
+ );
+
+ // We display the category
+ $('#' + target + ' .disco-wait').show();
+
+ // We ask the server what's the service type
+ getDataFormType(itemHost, itemNode, sessionID);
+ }
+ });
+ }
+
+ // Else, there are no items for this query
+ else
+ noResultDataForm(pathID);
+ }
+
+ else if((type == 'muc') || (type == 'search') || (type == 'subscribe') || ((type == 'command') && $(handleXML).find('command').attr('xmlns'))) {
+ // Get some values
+ var xCommand = $(handleXML).find('command');
+ var bNode = xCommand.attr('node');
+ var bSession = xCommand.attr('sessionid');
+ var bStatus = xCommand.attr('status');
+ var xRegister = $(handleXML).find('query[xmlns=' + NS_REGISTER + ']').text();
+ var xElement = $(handleXML).find('x');
+
+ // Search done
+ if((xElement.attr('type') == 'result') && (type == 'search')) {
+ var bPath = pathID;
+
+ // Display the result
+ $(handleXML).find('item').each(function() {
+ var bXID = $(this).find('field[var=jid] value:first').text();
+ var bName = $(this).find('field[var=fn] value:first').text();
+ var bCountry = $(this).find('field[var=ctry] value:first').text();
+ var dName = bName;
+
+ // Override "undefined" value
+ if(!bXID)
+ bXID = '';
+ if(!bName)
+ bName = _e("Unknown name");
+ if(!bCountry)
+ bCountry = _e("Unknown country");
+
+ // User hash
+ var bHash = hex_md5(bXID);
+
+ // HTML code
+ var bHTML = '<div class="oneresult ' + target + '-oneresult ' + bHash + '">' +
+ '<div class="avatar-container">' +
+ '<img class="avatar" src="' + './img/others/default-avatar.png' + '" alt="" />' +
+ '</div>' +
+ '<div class="one-fn">' + bName + '</div>' +
+ '<div class="one-ctry">' + bCountry + '</div>' +
+ '<div class="one-jid">' + bXID + '</div>' +
+ '<div class="buttons-container">';
+
+ // The buddy is not in our buddy list?
+ if(!exists('#buddy-list .buddy[data-xid=' + escape(bXID) + ']'))
+ bHTML += '<a href="#" class="one-add one-vjud one-button talk-images">' + _e("Add") + '</a>';
+
+ // Chat button, if not in welcome/directory mode
+ if(target == 'discovery')
+ bHTML += '<a href="#" class="one-chat one-vjud one-button talk-images">' + _e("Chat") + '</a>';
+
+ // Close the HTML element
+ bHTML += '</div></div>';
+
+ $(bPath).append(bHTML);
+
+ // Click events
+ $(bPath + ' .' + bHash + ' a').click(function() {
+ // Buddy add
+ if($(this).is('.one-add')) {
+ $(this).hide();
+
+ addThisContact(bXID, dName);
+ }
+
+ // Buddy chat
+ if($(this).is('.one-chat')) {
+ if(target == 'discovery')
+ closeDiscovery();
+
+ checkChatCreate(bXID , 'chat', '', '', dName);
+ }
+
+ return false;
+ });
+
+ // Get the user's avatar
+ if(bXID)
+ getAvatar(bXID, 'cache', 'true', 'forget');
+ });
+
+ // No result?
+ if(!$(handleXML).find('item').size())
+ noResultDataForm(pathID);
+
+ // Previous button
+ buttonsDataForm(type, 'back', sessionID, from, bNode, bSession, target, pathID);
+ }
+
+ // Command to complete
+ else if(xElement.attr('xmlns') || ((type == 'subscribe') && xRegister)) {
+ // We display the elements
+ fillDataForm(handleXML, sessionID);
+
+ // We display the buttons
+ if(bStatus != 'completed')
+ buttonsDataForm(type, 'submit', sessionID, from, bNode, bSession, target, pathID);
+ else
+ buttonsDataForm(type, 'back', sessionID, from, bNode, bSession, target, pathID);
+ }
+
+ // Command completed or subscription done
+ else if(((bStatus == 'completed') && (type == 'command')) || (!xRegister && (type == 'subscribe'))) {
+ // Display the good text
+ var cNote = $(xCommand).find('note');
+
+ // Any note?
+ if(cNote.size()) {
+ cNote.each(function() {
+ $(pathID).append(
+ '<div class="onetitle ' + target + '-oneresult">' + $(this).text().htmlEnc() + '</div>'
+ );
+ });
+ }
+
+ // Default text
+ else
+ $(pathID).append('<div class="oneinstructions ' + target + '-oneresult">' + _e("Your form has been sent.") + '</div>');
+
+ // Display the back button
+ buttonsDataForm(type, 'back', sessionID, from, '', '', target, pathID);
+
+ // Add the gateway to our roster if subscribed
+ if(type == 'subscribe')
+ addThisContact(from);
+ }
+
+ // Command canceled
+ else if((bStatus == 'canceled') && (type == 'command')) {
+ if(target == 'discovery')
+ startDiscovery();
+ else if(target == 'adhoc')
+ dataForm(from, 'command', '', '', 'adhoc');
+ }
+
+ // No items for this query
+ else
+ noResultDataForm(pathID);
+ }
+
+ else if(type == 'command') {
+ if($(handleXML).find('item').attr('jid')) {
+ // We display the elements
+ $(handleXML).find('item').each(function() {
+ // We parse the received xml
+ var itemHost = $(this).attr('jid');
+ var itemNode = $(this).attr('node');
+ var itemName = $(this).attr('name');
+ var itemHash = hex_md5(itemHost);
+
+ // We display the waiting element
+ $(pathID).prepend(
+ '<div class="oneresult ' + target + '-oneresult ' + itemHash + '" onclick="return dataForm(\'' + encodeOnclick(itemHost) + '\', \'command\', \'' + encodeOnclick(itemNode) + '\', \'execute\', \'' + encodeOnclick(target) + '\');">' +
+ '<div class="one-name">' + itemName + '</div>' +
+ '<div class="one-next">Ā»</div>' +
+ '</div>'
+ );
+ });
+ }
+
+ // Else, there are no items for this query
+ else
+ noResultDataForm(pathID);
+ }
+ }
+
+ // Focus on the first input
+ $(document).oneTime(10, function() {
+ $(pathID + ' input:visible:first').focus();
+ });
+
+ // Hide the wait icon
+ $('#' + target + ' .wait').hide();
+}
+
+// Fills the dataform elements
+function fillDataForm(xml, id) {
+ /* REF: http://xmpp.org/extensions/xep-0004.html */
+
+ // Initialize new vars
+ var target = id.split('-')[0];
+ var pathID = '#' + target + ' .results[data-session=' + id + ']';
+ var selector, is_dataform;
+
+ // Is it a dataform?
+ if($(xml).find('x[xmlns=' + NS_XDATA + ']').size())
+ is_dataform = true;
+ else
+ is_dataform = false;
+
+ // Determines the good selector to use
+ if(is_dataform)
+ selector = $(xml).find('x[xmlns=' + NS_XDATA + ']');
+ else
+ selector = $(xml);
+
+ // Form title
+ selector.find('title').each(function() {
+ $(pathID).append(
+ '<div class="onetitle ' + target + '-oneresult">' + $(this).text().htmlEnc() + '</div>'
+ );
+ });
+
+ // Form instructions
+ selector.find('instructions').each(function() {
+ $(pathID).append(
+ '<div class="oneinstructions ' + target + '-oneresult">' + $(this).text().htmlEnc() + '</div>'
+ );
+ });
+
+ // Register?
+ if(!is_dataform) {
+ // Items to detect
+ var reg_names = [_e("Nickname"), _e("Name"), _e("Password"), _e("E-mail")];
+ var reg_ids = ['username', 'name', 'password', 'email'];
+
+ // Append these inputs
+ for(a in reg_names) {
+ selector.find(reg_ids[a]).each(function() {
+ $(pathID).append(
+ '<div class="oneresult ' + target + '-oneresult">' +
+ '<label>' + reg_names[a] + '</label>' +
+ '<input name="' + reg_ids[a] + '" type="text" class="register-special dataform-i" />' +
+ '</div>'
+ );
+ });
+ }
+
+ return false;
+ }
+
+ // Dataform?
+ selector.find('field').each(function() {
+ // We parse the received xml
+ var type = $(this).attr('type');
+ var label = $(this).attr('label');
+ var field = $(this).attr('var');
+ var value = $(this).find('value:first').text();
+ var required = '';
+
+ // No value?
+ if(!field)
+ return;
+
+ // Required input?
+ if($(this).find('required').size())
+ required = ' required=""';
+
+ // Compatibility fix
+ if(!label)
+ label = field;
+
+ if(!type)
+ type = '';
+
+ // Generate some values
+ var input;
+ var hideThis = '';
+
+ // Fixed field
+ if(type == 'fixed')
+ $(pathID).append('<div class="oneinstructions">' + value.htmlEnc() + '</div>');
+
+ else {
+ // Hidden field
+ if(type == 'hidden') {
+ hideThis = ' style="display: none;"';
+ input = '<input name="' + encodeQuotes(field) + '" data-type="' + encodeQuotes(type) + '" type="hidden" class="dataform-i" value="' + encodeQuotes(value) + '" ' + required + ' />';
+ }
+
+ // Boolean field
+ else if(type == 'boolean') {
+ var checked;
+
+ if(value == '1')
+ checked = 'checked';
+ else
+ checked = '';
+
+ input = '<input name="' + encodeQuotes(field) + '" type="checkbox" data-type="' + encodeQuotes(type) + '" class="dataform-i df-checkbox" ' + checked + required + ' />';
+ }
+
+ // List-single/list-multi field
+ else if((type == 'list-single') || (type == 'list-multi')) {
+ var multiple = '';
+
+ // Multiple options?
+ if(type == 'list-multi')
+ multiple = ' multiple=""';
+
+ // Append the select field
+ input = '<select name="' + encodeQuotes(field) + '" data-type="' + encodeQuotes(type) + '" class="dataform-i"' + required + multiple + '>';
+ var selected;
+
+ // Append the available options
+ $(this).find('option').each(function() {
+ var nLabel = $(this).attr('label');
+ var nValue = $(this).find('value').text();
+
+ // No label?
+ if(!nLabel)
+ nLabel = nValue;
+
+ // If this is the selected value
+ if(nValue == value)
+ selected = 'selected';
+ else
+ selected = '';
+
+ input += '<option ' + selected + ' value="' + encodeQuotes(nValue) + '">' + nLabel.htmlEnc() + '</option>';
+ });
+
+ input += '</select>';
+ }
+
+ // Text-multi field
+ else if(type == 'text-multi')
+ input = '<textarea rows="8" cols="60" data-type="' + encodeQuotes(type) + '" name="' + encodeQuotes(field) + '" class="dataform-i"' + required + '>' + value.htmlEnc() + '</textarea>';
+
+ // JID-multi field
+ else if(type == 'jid-multi') {
+ // Put the XID into an array
+ var xid_arr = [];
+
+ $(this).find('value').each(function() {
+ var cValue = $(this).text();
+
+ if(!existArrayValue(xid_arr, cValue))
+ xid_arr.push(cValue);
+ });
+
+ // Sort the array
+ xid_arr.sort();
+
+ // Create the input
+ var xid_value = '';
+
+ if(xid_arr.length) {
+ for(i in xid_arr) {
+ // Any pre-value
+ if(xid_value)
+ xid_value += ', ';
+
+ // Add the current XID
+ xid_value += xid_arr[i];
+ }
+ }
+
+ input = '<input name="' + encodeQuotes(field) + '" data-type="' + encodeQuotes(type) + '" type="text" class="dataform-i" value="' + encodeQuotes(xid_value) + '" placeholder="jack@jappix.com, jones@jappix.com"' + required + ' />';
+ }
+
+ // Other stuffs that are similar
+ else {
+ // Text-single field
+ var iType = 'text';
+
+ // Text-private field
+ if(type == 'text-private')
+ iType = 'password';
+
+ // JID-single field
+ else if(type == 'jid-single')
+ iType = 'email';
+
+ input = '<input name="' + encodeQuotes(field) + '" data-type="' + encodeQuotes(type) + '" type="' + iType + '" class="dataform-i" value="' + encodeQuotes(value) + '"' + required + ' />';
+ }
+
+ // Append the HTML markup for this field
+ $(pathID).append(
+ '<div class="oneresult ' + target + '-oneresult"' + hideThis + '>' +
+ '<label>' + label.htmlEnc() + '</label>' +
+ input +
+ '</div>'
+ );
+ }
+ });
+
+ return false;
+}
+
+// Gets the dataform type
+function getDataFormType(host, node, id) {
+ var iq = new JSJaCIQ();
+ iq.setID(id + '-' + genID());
+ iq.setTo(host);
+ iq.setType('get');
+
+ var iqQuery = iq.setQuery(NS_DISCO_INFO);
+
+ if(node)
+ iqQuery.setAttribute('node', node);
+
+ con.send(iq, handleThisBrowse);
+}
+
+// Handles the browse stanza
+function handleThisBrowse(iq) {
+ /* REF: http://xmpp.org/registrar/disco-categories.html */
+
+ var id = iq.getID();
+ var splitted = id.split('-');
+ var target = splitted[0];
+ var sessionID = target + '-' + splitted[1];
+ var from = fullXID(getStanzaFrom(iq));
+ var hash = hex_md5(from);
+ var handleXML = iq.getQuery();
+ var pathID = '#' + target + ' .results[data-session=' + sessionID + ']';
+
+ // We first remove the waiting element
+ $(pathID + ' .disco-wait .' + hash).remove();
+
+ if($(handleXML).find('identity').attr('type')) {
+ var category = $(handleXML).find('identity').attr('category');
+ var type = $(handleXML).find('identity').attr('type');
+ var named = $(handleXML).find('identity').attr('name');
+
+ if(named)
+ gName = named;
+ else
+ gName = '';
+
+ var one, two, three, four, five;
+
+ // Get the features that this entity supports
+ var findFeature = $(handleXML).find('feature');
+
+ for(i in findFeature) {
+ var current = findFeature.eq(i).attr('var');
+
+ switch(current) {
+ case NS_SEARCH:
+ one = 1;
+ break;
+
+ case NS_MUC:
+ two = 1;
+ break;
+
+ case NS_REGISTER:
+ three = 1;
+ break;
+
+ case NS_COMMANDS:
+ four = 1;
+ break;
+
+ case NS_DISCO_ITEMS:
+ five = 1;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ var buttons = Array(one, two, three, four, five);
+
+ // We define the toolbox links depending on the supported features
+ var tools = '';
+ var aTools = Array('search', 'join', 'subscribe', 'command', 'browse');
+ var bTools = Array(_e("Search"), _e("Join"), _e("Subscribe"), _e("Command"), _e("Browse"));
+
+ for(i in buttons) {
+ if(buttons[i])
+ tools += '<a href="#" class="one-button ' + aTools[i] + ' talk-images" onclick="return dataForm(\'' + encodeOnclick(from) + '\', \'' + encodeOnclick(aTools[i]) + '\', \'\', \'\', \'' + encodeOnclick(target) + '\');" title="' + encodeOnclick(bTools[i]) + '"></a>';
+ }
+
+ // As defined in the ref, we detect the type of each category to put an icon
+ switch(category) {
+ case 'account':
+ case 'auth':
+ case 'automation':
+ case 'client':
+ case 'collaboration':
+ case 'component':
+ case 'conference':
+ case 'directory':
+ case 'gateway':
+ case 'headline':
+ case 'hierarchy':
+ case 'proxy':
+ case 'pubsub':
+ case 'server':
+ case 'store':
+ break;
+
+ default:
+ category = 'others';
+ }
+
+ // We display the item we found
+ $(pathID + ' .disco-' + category + ' .disco-category-title').after(
+ '<div class="oneresult ' + target + '-oneresult ' + hash + '">' +
+ '<div class="one-icon ' + category + ' talk-images"></div>' +
+ '<div class="one-host">' + from + '</div>' +
+ '<div class="one-type">' + gName + '</div>' +
+ '<div class="one-actions">' + tools + '</div>' +
+ '</div>'
+ );
+
+ // We display the category
+ $(pathID + ' .disco-' + category).show();
+ }
+
+ else {
+ $(pathID + ' .disco-others .disco-category-title').after(
+ '<div class="oneresult ' + target + '-oneresult">' +
+ '<div class="one-icon down talk-images"></div>' +
+ '<div class="one-host">' + from + '</div>' +
+ '<div class="one-type">' + _e("Service offline or broken") + '</div>' +
+ '</div>'
+ );
+
+ // We display the category
+ $(pathID + ' .disco-others').show();
+ }
+
+ // We hide the waiting stuffs if there's no remaining loading items
+ if(!$(pathID + ' .disco-wait .' + target + '-oneresult').size())
+ $(pathID + ' .disco-wait, #' + target + ' .wait').hide();
+}
+
+// Cleans the current data-form popup
+function cleanDataForm(target) {
+ if(target == 'discovery')
+ cleanDiscovery();
+ else
+ $('#' + target + ' div.results').empty();
+}
+
+// Displays the no result indicator
+function noResultDataForm(path) {
+ $(path).prepend('<p class="no-results">' + _e("Sorry, but the entity didn't return any result!") + '</p>');
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the temporary/persistent data store functions
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 23/06/11
+
+*/
+
+// Temporary: returns whether it is available or not
+function hasDB() {
+ if(window.sessionStorage)
+ return true;
+
+ return false;
+}
+
+// Temporary: used to read a database entry
+function getDB(type, id) {
+ try {
+ return sessionStorage.getItem(type + '_' + id);
+ }
+
+ catch(e) {
+ logThis('Error while getting a temporary database entry (' + type + ' -> ' + id + '): ' + e, 1);
+
+ return null;
+ }
+}
+
+// Temporary: used to update a database entry
+function setDB(type, id, value) {
+ try {
+ sessionStorage.setItem(type + '_' + id, value);
+
+ return true;
+ }
+
+ catch(e) {
+ logThis('Error while writing a temporary database entry (' + type + ' -> ' + id + '): ' + e, 1);
+
+ return false;
+ }
+}
+
+// Temporary: used to remove a database entry
+function removeDB(type, id) {
+ try {
+ sessionStorage.removeItem(type + '_' + id);
+
+ return true;
+ }
+
+ catch(e) {
+ logThis('Error while removing a temporary database entry (' + type + ' -> ' + id + '): ' + e, 1);
+
+ return false;
+ }
+}
+
+// Temporary: used to check a database entry exists
+function existDB(type, id) {
+ var read = getDB(type, id);
+
+ if(read != null)
+ return true;
+
+ return false;
+}
+
+// Temporary: used to clear all the database
+function resetDB() {
+ try {
+ sessionStorage.clear();
+
+ logThis('Temporary database cleared.', 3);
+
+ return true;
+ }
+
+ catch(e) {
+ logThis('Error while clearing temporary database: ' + e, 1);
+
+ return false;
+ }
+}
+
+// Persistent: returns whether it is available or not
+function hasPersistent() {
+ if(window.localStorage)
+ return true;
+
+ return false;
+}
+
+// Persistent: used to read a database entry
+function getPersistent(type, id) {
+ try {
+ return localStorage.getItem(type + '_' + id);
+ }
+
+ catch(e) {
+ logThis('Error while getting a persistent database entry (' + type + ' -> ' + id + '): ' + e, 1);
+
+ return null;
+ }
+}
+
+// Persistent: used to update a database entry
+function setPersistent(type, id, value) {
+ try {
+ localStorage.setItem(type + '_' + id, value);
+
+ return true;
+ }
+
+ // Database might be full
+ catch(e) {
+ logThis('Retrying: could not write a persistent database entry (' + type + ' -> ' + id + '): ' + e, 2);
+
+ // Flush it!
+ flushPersistent();
+
+ // Set the item again
+ try {
+ localStorage.setItem(type + '_' + id, value);
+
+ return true;
+ }
+
+ // New error!
+ catch(e) {
+ logThis('Aborted: error while writing a persistent database entry (' + type + ' -> ' + id + '): ' + e, 1);
+
+ return false;
+ }
+ }
+}
+
+// Persistent: used to remove a database entry
+function removePersistent(type, id) {
+ try {
+ localStorage.removeItem(type + '_' + id);
+
+ return true;
+ }
+
+ catch(e) {
+ logThis('Error while removing a persistent database entry (' + type + ' -> ' + id + '): ' + e, 1);
+
+ return false;
+ }
+}
+
+// Persistent: used to check a database entry exists
+function existPersistent(type, id) {
+ var read = getPersistent(type, id);
+
+ if(read != null)
+ return true;
+
+ return false;
+}
+
+// Persistent: used to clear all the database
+function resetPersistent() {
+ try {
+ localStorage.clear();
+
+ logThis('Persistent database cleared.', 3);
+
+ return true;
+ }
+
+ catch(e) {
+ logThis('Error while clearing persistent database: ' + e, 1);
+
+ return false;
+ }
+}
+
+// Persistent: used to flush the database
+function flushPersistent() {
+ try {
+ // Get the stored session entry
+ var session = getPersistent('session', 1);
+
+ // Clear the persistent database
+ localStorage.clear();
+
+ // Restaure the stored session entry
+ if(session)
+ setPersistent('session', 1, session);
+
+ logThis('Persistent database flushed.', 3);
+
+ return true;
+ }
+
+ catch(e) {
+ logThis('Error while flushing persistent database: ' + e, 1);
+
+ return false;
+ }
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the date related JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 17/08/11
+
+*/
+
+// Gets a stamp from a date
+function extractStamp(date) {
+ return Math.round(date.getTime() / 1000);
+}
+
+// Gets the time from a date
+function extractTime(date) {
+ return date.toLocaleTimeString();
+}
+
+// Gets the actual date stamp
+function getTimeStamp() {
+ return extractStamp(new Date());
+}
+
+// Gets the last user activity in seconds
+var LAST_ACTIVITY = 0;
+
+function getLastActivity() {
+ // Last activity not yet initialized?
+ if(LAST_ACTIVITY == 0)
+ return 0;
+
+ return getTimeStamp() - LAST_ACTIVITY;
+}
+
+// Gets the last user available presence in seconds
+var PRESENCE_LAST_ACTIVITY = 0;
+
+function getPresenceLast() {
+ // Last presence stamp not yet initialized?
+ if(PRESENCE_LAST_ACTIVITY == 0)
+ return 0;
+
+ return getTimeStamp() - PRESENCE_LAST_ACTIVITY;
+}
+
+// Generates the time for XMPP
+function getXMPPTime(location) {
+ /* FROM : http://trac.jwchat.org/jsjac/browser/branches/jsjac_1.0/jsextras.js?rev=221 */
+
+ // Initialize
+ var jInit = new Date();
+ var year, month, day, hours, minutes, seconds;
+
+ // Gets the UTC date
+ if(location == 'utc') {
+ year = jInit.getUTCFullYear();
+ month = jInit.getUTCMonth();
+ day = jInit.getUTCDate();
+ hours = jInit.getUTCHours();
+ minutes = jInit.getUTCMinutes();
+ seconds = jInit.getUTCSeconds();
+ }
+
+ // Gets the local date
+ else {
+ year = jInit.getFullYear();
+ month = jInit.getMonth();
+ day = jInit.getDate();
+ hours = jInit.getHours();
+ minutes = jInit.getMinutes();
+ seconds = jInit.getSeconds();
+ }
+
+ // Generates the date string
+ var jDate = year + '-';
+ jDate += padZero(month + 1) + '-';
+ jDate += padZero(day) + 'T';
+ jDate += padZero(hours) + ':';
+ jDate += padZero(minutes) + ':';
+ jDate += padZero(seconds) + 'Z';
+
+ // Returns the date string
+ return jDate;
+}
+
+// Generates then human time
+function getCompleteTime() {
+ var init = new Date();
+ var time = padZero(init.getHours()) + ':';
+ time += padZero(init.getMinutes()) + ':';
+ time += padZero(init.getSeconds());
+
+ return time;
+}
+
+// Gets the TZO of a date
+function getDateTZO() {
+ // Get the date
+ var date = new Date();
+ var offset = date.getTimezoneOffset();
+
+ // Default vars
+ var sign = '';
+ var hours = 0;
+ var minutes = 0;
+
+ // Process a neutral offset
+ if(offset < 0) {
+ offset = offset * -1;
+ sign = '+';
+ }
+
+ // Get the values
+ var n_date = new Date(offset * 60 * 1000);
+ hours = n_date.getHours() - 1;
+ minutes = n_date.getMinutes();
+
+ // Process the TZO
+ tzo = sign + padZero(hours) + ':' + padZero(minutes);
+
+ // Return the processed value
+ return tzo;
+}
+
+// Parses a XMPP date (yyyy-mm-dd, hh-mm-ss) into an human-readable one
+function parseDate(to_parse) {
+ var date = Date.jab2date(to_parse);
+ var parsed = date.toLocaleDateString() + ' (' + date.toLocaleTimeString() + ')';
+
+ return parsed;
+}
+
+// Parses a XMPP date (yyyy-mm-dd) into an human-readable one
+function parseDay(to_parse) {
+ var date = Date.jab2date(to_parse);
+ var parsed = date.toLocaleDateString();
+
+ return parsed;
+}
+
+// Parses a XMPP date (hh-mm-ss) into an human-readable one
+function parseTime(to_parse) {
+ var date = Date.jab2date(to_parse);
+ var parsed = date.toLocaleTimeString();
+
+ return parsed;
+}
+
+// Parses a XMPP date stamp into a relative one
+function relativeDate(to_parse) {
+ // Get the current date
+ var current_date = Date.jab2date(getXMPPTime('utc'));
+ var current_day = current_date.getDate();
+ var current_stamp = current_date.getTime();
+
+ // Parse the given date
+ var old_date = Date.jab2date(to_parse);
+ var old_day = old_date.getDate();
+ var old_stamp = old_date.getTime();
+ var old_time = old_date.toLocaleTimeString();
+
+ // Get the day number between the two dates
+ var days = Math.round((current_stamp - old_stamp) / 86400000);
+
+ // Invalid date?
+ if(isNaN(old_stamp) || isNaN(days))
+ return getCompleteTime();
+
+ // Is it today?
+ if(current_day == old_day)
+ return old_time;
+
+ // It is yesterday?
+ if(days <= 1)
+ return _e("Yesterday") + ' - ' + old_time;
+
+ // Is it less than a week ago?
+ if(days <= 7)
+ return printf(_e("%s days ago"), days) + ' - ' + old_time;
+
+ // Another longer period
+ return old_date.toLocaleDateString() + ' - ' + old_time;
+}
+
+// Reads a message delay
+function readMessageDelay(node) {
+ // Initialize
+ var delay, d_delay;
+
+ // Read the delay
+ d_delay = jQuery(node).find('delay[xmlns=' + NS_URN_DELAY + ']:first').attr('stamp');
+
+ // New delay (valid XEP)
+ if(d_delay)
+ delay = d_delay;
+
+ // Old delay (obsolete XEP!)
+ else {
+ // Try to read the old-school delay
+ var x_delay = jQuery(node).find('x[xmlns=' + NS_DELAY + ']:first').attr('stamp');
+
+ if(x_delay)
+ delay = x_delay.replace(/^(\w{4})(\w{2})(\w{2})T(\w{2}):(\w{2}):(\w{2})Z?(\S+)?/, '$1-$2-$3T$4:$5:$6Z$7');
+ }
+
+ return delay;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the directory JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 03/03/11
+
+*/
+
+// Opens the directory popup
+function openDirectory() {
+ // Popup HTML content
+ var html =
+ '<div class="top">' + _e("User directory") + '</div>' +
+
+ '<div class="content">' +
+ '<div class="directory-head">' +
+ '<div class="directory-server-text">' + _e("Server to query") + '</div>' +
+
+ '<input name="directory-server-input" class="directory-server-input" value="' + encodeQuotes(HOST_VJUD) + '" />' +
+ '</div>' +
+
+ '<div class="results directory-results"></div>' +
+ '</div>' +
+
+ '<div class="bottom">' +
+ '<div class="wait wait-medium"></div>' +
+
+ '<a href="#" class="finish">' + _e("Close") + '</a>' +
+ '</div>';
+
+ // Create the popup
+ createPopup('directory', html);
+
+ // Associate the events
+ launchDirectory();
+
+ // Start a search!
+ startDirectory();
+
+ return false;
+}
+
+// Quits the directory popup
+function closeDirectory() {
+ // Destroy the popup
+ destroyPopup('directory');
+
+ return false;
+}
+
+// Launches a directory search
+function startDirectory() {
+ // Get the server to query
+ var server = $('#directory .directory-server-input').val();
+
+ // Launch the search!
+ dataForm($('#directory .directory-server-input').val(), 'search', '', '', 'directory');
+
+ logThis('Directory search launched: ' + server);
+
+ return false;
+}
+
+// Plugin launcher
+function launchDirectory() {
+ // Click event
+ $('#directory .bottom .finish').click(closeDirectory);
+
+ // Keyboard event
+ $('#directory .directory-server-input').keyup(function(e) {
+ if(e.keyCode == 13) {
+ // No value?
+ if(!$(this).val())
+ $(this).val(HOST_VJUD);
+
+ // Start the directory search
+ startDirectory();
+
+ return false;
+ }
+ });
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the discovery JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 03/03/11
+
+*/
+
+// Opens the discovery popup
+function openDiscovery() {
+ // Popup HTML content
+ var html =
+ '<div class="top">' + _e("Service discovery") + '</div>' +
+
+ '<div class="content">' +
+ '<div class="discovery-head">' +
+ '<div class="disco-server-text">' + _e("Server to query") + '</div>' +
+
+ '<input name="disco-server-input" class="disco-server-input" value="' + encodeQuotes(HOST_MAIN) + '" />' +
+ '</div>' +
+
+ '<div class="results discovery-results">' +
+ '<div class="disco-category disco-account">' +
+ '<p class="disco-category-title">' + _e("Accounts") + '</p>' +
+ '</div>' +
+
+ '<div class="disco-category disco-auth">' +
+ '<p class="disco-category-title">' + _e("Authentications") + '</p>' +
+ '</div>' +
+
+ '<div class="disco-category disco-automation">' +
+ '<p class="disco-category-title">' + _e("Automation") + '</p>' +
+ '</div>' +
+
+ '<div class="disco-category disco-client">' +
+ '<p class="disco-category-title">' + _e("Clients") + '</p>' +
+ '</div>' +
+
+ '<div class="disco-category disco-collaboration">' +
+ '<p class="disco-category-title">' + _e("Collaboration") + '</p>' +
+ '</div>' +
+
+ '<div class="disco-category disco-component">' +
+ '<p class="disco-category-title">' + _e("Components") + '</p>' +
+ '</div>' +
+
+ '<div class="disco-category disco-conference">' +
+ '<p class="disco-category-title">' + _e("Rooms") + '</p>' +
+ '</div>' +
+
+ '<div class="disco-category disco-directory">' +
+ '<p class="disco-category-title">' + _e("Directories") + '</p>' +
+ '</div>' +
+
+ '<div class="disco-category disco-gateway">' +
+ '<p class="disco-category-title">' + _e("Gateways") + '</p>' +
+ '</div>' +
+
+ '<div class="disco-category disco-headline">' +
+ '<p class="disco-category-title">' + _e("News") + '</p>' +
+ '</div>' +
+
+ '<div class="disco-category disco-hierarchy">' +
+ '<p class="disco-category-title">' + _e("Hierarchy") + '</p>' +
+ '</div>' +
+
+ '<div class="disco-category disco-proxy">' +
+ '<p class="disco-category-title">' + _e("Proxies") + '</p>' +
+ '</div>' +
+
+ '<div class="disco-category disco-pubsub">' +
+ '<p class="disco-category-title">' + _e("Publication/Subscription") + '</p>' +
+ '</div>' +
+
+ '<div class="disco-category disco-server">' +
+ '<p class="disco-category-title">' + _e("Server") + '</p>' +
+ '</div>' +
+
+ '<div class="disco-category disco-store">' +
+ '<p class="disco-category-title">' + _e("Storage") + '</p>' +
+ '</div>' +
+
+ '<div class="disco-category disco-others">' +
+ '<p class="disco-category-title">' + _e("Others") + '</p>' +
+ '</div>' +
+
+ '<div class="disco-category disco-wait">' +
+ '<p class="disco-category-title">' + _e("Loading") + '</p>' +
+ '</div>' +
+ '</div>' +
+ '</div>' +
+
+ '<div class="bottom">' +
+ '<div class="wait wait-medium"></div>' +
+
+ '<a href="#" class="finish">' + _e("Close") + '</a>' +
+ '</div>';
+
+ // Create the popup
+ createPopup('discovery', html);
+
+ // Associate the events
+ launchDiscovery();
+
+ // We request a disco to the default server
+ startDiscovery();
+
+ return false;
+}
+
+// Quits the discovery popup
+function closeDiscovery() {
+ // Destroy the popup
+ destroyPopup('discovery');
+
+ return false;
+}
+
+// Launches a discovery
+function startDiscovery() {
+ /* REF: http://xmpp.org/extensions/xep-0030.html */
+
+ // We get the server to query
+ var discoServer = $('#discovery .disco-server-input').val();
+
+ // We launch the items query
+ dataForm(discoServer, 'browse', '', '', 'discovery');
+
+ logThis('Service discovery launched: ' + discoServer);
+
+ return false;
+}
+
+// Cleans the discovery results
+function cleanDiscovery() {
+ // We remove the results
+ $('#discovery .discovery-oneresult, #discovery .oneinstructions, #discovery .onetitle, #discovery .no-results').remove();
+
+ // We clean the user info
+ $('#discovery .disco-server-info').text('');
+
+ // We hide the wait icon, the no result alert and the results
+ $('#discovery .wait, #discovery .disco-category').hide();
+}
+
+// Plugin launcher
+function launchDiscovery() {
+ // Click event
+ $('#discovery .bottom .finish').click(closeDiscovery);
+
+ // Keyboard event
+ $('#discovery .disco-server-input').keyup(function(e) {
+ if(e.keyCode == 13) {
+ // No value?
+ if(!$(this).val())
+ $(this).val(HOST_MAIN);
+
+ // Start the discovery
+ startDiscovery();
+
+ return false;
+ }
+ });
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the error functions for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 02/04/11
+
+*/
+
+// Shows the given error output
+function showError(condition, reason, type) {
+ // Enough data to output the error
+ if(condition || reason) {
+ // Initialize the error text
+ var eText = '';
+
+ // Any error condition
+ if(condition)
+ eText += condition;
+
+ // Any error type
+ if(type && eText)
+ eText += ' (' + type + ')';
+
+ // Any error reason
+ if(reason) {
+ if(eText)
+ eText += ' - ';
+
+ eText += reason;
+ }
+
+ // We reveal the error
+ openThisError(1);
+
+ // Create the error text
+ $('#board .one-board.error[data-id=1] span').text(eText);
+ }
+
+ // Not enough data to output the error: output a generic board
+ else
+ openThisError(2);
+}
+
+// Handles the error from a packet and return true if any error
+function handleError(packet) {
+ /* REF: http://xmpp.org/extensions/xep-0086.html */
+
+ // Initialize
+ var type, code, reason, condition;
+ var node = $(packet);
+
+ // First level error (connection error)
+ if(node.is('error')) {
+ // Get the value
+ code = node.attr('code');
+
+ // Specific error reason
+ switch(code) {
+ case '401':
+ reason = _e("Authorization failed");
+ break;
+
+ case '409':
+ reason = _e("Registration failed, please choose a different username");
+ break;
+
+ case '503':
+ reason = _e("Service unavailable");
+ break;
+
+ case '500':
+ reason = _e("Internal server error, try later");
+ break;
+
+ default:
+ reason = node.find('text').text();
+ break;
+ }
+
+ // Remove the general wait item (security)
+ removeGeneralWait();
+
+ // Show reconnect pane
+ if(CURRENT_SESSION && CONNECTED) {
+ // Anonymous?
+ if(isAnonymous())
+ createReconnect('anonymous');
+ else
+ createReconnect('normal');
+ }
+
+ // Show the homepage (security)
+ else if(!CURRENT_SESSION || !CONNECTED) {
+ $('#home').show();
+ pageTitle('home');
+ }
+
+ // Still connected? (security)
+ if(isConnected())
+ con.disconnect();
+
+ logThis('First level error received.', 1);
+ }
+
+ // Second level error (another error)
+ else if(node.find('error').size()) {
+ type = node.find('error').attr('type');
+ reason = node.find('error text').text();
+ condition = packet.getElementsByTagName('error').item(0).childNodes.item(0).nodeName.replace(/-/g, ' ');
+
+ logThis('Second level error received.', 1);
+ }
+
+ // No error
+ else
+ return false;
+
+ // Show the error board
+ showError(condition, reason, type);
+
+ // Return there's an error
+ return true;
+}
+
+// Handles the error reply of a packet
+function handleErrorReply(packet) {
+ return handleError(packet.getNode());
+}
+
+// Handles the error reply for a message
+function handleMessageError(packet) {
+ if(!handleErrorReply(packet))
+ handleMessage(packet);
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the favorites JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 23/06/11
+
+*/
+
+// Opens the favorites popup
+function openFavorites() {
+ // Popup HTML content
+ var html =
+ '<div class="top">' + _e("Manage favorite rooms") + '</div>' +
+
+ '<div class="content">' +
+ '<div class="switch-fav">' +
+ '<div class="room-switcher room-list">' +
+ '<div class="icon list-icon talk-images"></div>' +
+
+ _e("Change favorites") +
+ '</div>' +
+
+ '<div class="room-switcher room-search">' +
+ '<div class="icon search-icon talk-images"></div>' +
+
+ _e("Search a room") +
+ '</div>' +
+ '</div>' +
+
+ '<div class="static-fav">' +
+ '<div class="favorites-edit favorites-content">' +
+ '<div class="head fedit-head static-fav-head">' +
+ '<div class="head-text fedit-head-text">' + _e("Select a favorite") + '</div>' +
+
+ '<select name="fedit-head-select" class="head-select fedit-head-select"></select>' +
+ '</div>' +
+
+ '<div class="results fedit-results static-fav-results">' +
+ '<div class="fedit-line">' +
+ '<label>' + _e("Name") + '</label>' +
+
+ '<input class="fedit-title" type="text" required="" />' +
+ '</div>' +
+
+ '<div class="fedit-line">' +
+ '<label>' + _e("Nickname") + '</label>' +
+
+ '<input class="fedit-nick" type="text" value="' + getNick() + '" required="" />' +
+ '</div>' +
+
+ '<div class="fedit-line">' +
+ '<label>' + _e("Room") + '</label>' +
+
+ '<input class="fedit-chan" type="text" required="" />' +
+ '</div>' +
+
+ '<div class="fedit-line">' +
+ '<label>' + _e("Server") + '</label>' +
+
+ '<input class="fedit-server" type="text" value="' + HOST_MUC + '" required="" />' +
+ '</div>' +
+
+ '<div class="fedit-line">' +
+ '<label>' + _e("Password") + '</label>' +
+
+ '<input class="fedit-password" type="password" />' +
+ '</div>' +
+
+ '<div class="fedit-line">' +
+ '<label>' + _e("Automatic") + '</label>' +
+
+ '<input type="checkbox" class="fedit-autojoin" />' +
+ '</div>' +
+
+ '<div class="fedit-actions">' +
+ '<a href="#" class="fedit-terminate fedit-add add one-button talk-images">' + _e("Add") + '</a>' +
+ '<a href="#" class="fedit-terminate fedit-edit one-button talk-images">' + _e("Edit") + '</a>' +
+ '<a href="#" class="fedit-terminate fedit-remove remove one-button talk-images">' + _e("Remove") + '</a>' +
+ '</div>' +
+ '</div>' +
+ '</div>' +
+
+ '<div class="favorites-search favorites-content">' +
+ '<div class="head fsearch-head static-fav-head">' +
+ '<div class="head-text fsearch-head-text">' + _e("Search a room on") + '</div>' +
+
+ '<input type="text" class="head-input fsearch-head-server" value="' + HOST_MUC + '" />' +
+ '</div>' +
+
+ '<div class="results fsearch-results static-fav-results">' +
+ '<p class="fsearch-noresults">' + _e("No room found on this server.") + '</p>' +
+ '</div>' +
+ '</div>' +
+ '</div>' +
+ '</div>' +
+
+ '<div class="bottom">' +
+ '<div class="wait wait-medium"></div>' +
+
+ '<a href="#" class="finish">' + _e("Close") + '</a>' +
+ '</div>';
+
+ // Create the popup
+ createPopup('favorites', html);
+
+ // Load the favorites
+ loadFavorites();
+
+ // Associate the events
+ launchFavorites();
+}
+
+// Resets the favorites elements
+function resetFavorites() {
+ var path = '#favorites ';
+
+ $(path + '.wait, ' + path + '.fedit-terminate').hide();
+ $(path + '.fedit-add').show();
+ $(path + '.fsearch-oneresult').remove();
+ $(path + 'input').val('');
+ $(path + '.please-complete').removeClass('please-complete');
+ $(path + '.fedit-nick').val(getNick());
+ $(path + '.fsearch-head-server, ' + path + '.fedit-server').val(HOST_MUC);
+ $(path + '.fedit-autojoin').attr('checked', false);
+}
+
+// Quits the favorites popup
+function quitFavorites() {
+ // Destroy the popup
+ destroyPopup('favorites');
+
+ return false;
+}
+
+// Adds a room to the favorites
+function addThisFavorite(roomXID, roomName) {
+ // Button path
+ var button = '#favorites .fsearch-results div[data-xid=' + escape(roomXID) + '] a.one-button';
+
+ // Add a remove button instead of the add one
+ $(button + '.add').replaceWith('<a href="#" class="one-button remove talk-images">' + _e("Remove") + '</a>');
+
+ // Click event
+ $(button + '.remove').click(function() {
+ return removeThisFavorite(roomXID, roomName);
+ });
+
+ // Hide the add button in the (opened?) groupchat
+ $('#' + hex_md5(roomXID) + ' .tools-add').hide();
+
+ // Add the database entry
+ displayFavorites(roomXID, explodeThis(' (', roomName, 0), getNick(), '0', '');
+
+ // Publish the favorites
+ favoritePublish();
+
+ return false;
+}
+
+// Removes a room from the favorites
+function removeThisFavorite(roomXID, roomName) {
+ // Button path
+ var button = '#favorites .fsearch-results div[data-xid=' + escape(roomXID) + '] a.one-button';
+
+ // Add a remove button instead of the add one
+ $(button + '.remove').replaceWith('<a href="#" class="one-button add talk-images">' + _e("Add") + '</a>');
+
+ // Click event
+ $(button + '.add').click(function() {
+ return addThisFavorite(roomXID, roomName);
+ });
+
+ // Show the add button in the (opened?) groupchat
+ $('#' + hex_md5(roomXID) + ' .tools-add').show();
+
+ // Remove the favorite
+ removeFavorite(roomXID, true);
+
+ // Publish the favorites
+ favoritePublish();
+
+ return false;
+}
+
+// Edits a favorite
+function editFavorite() {
+ // Path to favorites
+ var favorites = '#favorites .';
+
+ // Reset the favorites
+ resetFavorites();
+
+ // Show the edit/remove button, hide the others
+ $(favorites + 'fedit-terminate').hide();
+ $(favorites + 'fedit-edit').show();
+ $(favorites + 'fedit-remove').show();
+
+ // We retrieve the values
+ var xid = $(favorites + 'fedit-head-select').val();
+ var data = XMLFromString(getDB('favorites', xid));
+
+ // If this is not the default room
+ if(xid != 'none') {
+ // We apply the values
+ $(favorites + 'fedit-title').val($(data).find('name').text());
+ $(favorites + 'fedit-nick').val($(data).find('nick').text());
+ $(favorites + 'fedit-chan').val(getXIDNick(xid));
+ $(favorites + 'fedit-server').val(getXIDHost(xid));
+ $(favorites + 'fedit-password').val($(data).find('password').text());
+
+ if($(data).find('autojoin').text() == '1')
+ $(favorites + 'fedit-autojoin').attr('checked', true);
+ }
+
+ else
+ resetFavorites();
+}
+
+// Adds a favorite
+function addFavorite() {
+ // Path to favorites
+ var favorites = '#favorites .';
+
+ // We reset the inputs
+ $(favorites + 'fedit-title, ' + favorites + 'fedit-nick, ' + favorites + 'fedit-chan, ' + favorites + 'fedit-server, ' + favorites + 'fedit-password').val('');
+
+ // Show the add button, hide the others
+ $(favorites + 'fedit-terminate').hide();
+ $(favorites + 'fedit-add').show();
+}
+
+// Terminate a favorite editing
+function terminateThisFavorite(type) {
+ // Path to favorites
+ var favorites = '#favorites ';
+
+ // We get the values of the current edited groupchat
+ var old_xid = $(favorites + '.fedit-head-select').val();
+
+ var title = $(favorites + '.fedit-title').val();
+ var nick = $(favorites + '.fedit-nick').val();
+ var room = $(favorites + '.fedit-chan').val();
+ var server = $(favorites + '.fedit-server').val();
+ var xid = room + '@' + server;
+ var password = $(favorites + '.fedit-password').val();
+ var autojoin = '0';
+
+ if($(favorites + '.fedit-autojoin').filter(':checked').size())
+ autojoin = '1';
+
+ // We check the missing values and send this if okay
+ if((type == 'add') || (type == 'edit')) {
+ if(title && nick && room && server) {
+ // Remove the edited room
+ if(type == 'edit')
+ removeFavorite(old_xid, true);
+
+ // Display the favorites
+ displayFavorites(xid, title, nick, autojoin, password);
+
+ // Reset the inputs
+ resetFavorites();
+ }
+
+ else {
+ $(favorites + 'input[required]').each(function() {
+ var select = $(this);
+
+ if(!select.val())
+ $(document).oneTime(10, function() {
+ select.addClass('please-complete').focus();
+ });
+ else
+ select.removeClass('please-complete');
+ });
+ }
+ }
+
+ // Must remove a favorite?
+ else if(type == 'remove') {
+ removeFavorite(old_xid, true);
+
+ // Reset the inputs
+ resetFavorites();
+ }
+
+ // Publish the new favorites
+ favoritePublish();
+
+ logThis('Action on this bookmark: ' + room + '@' + server + ' / ' + type, 3);
+
+ return false;
+}
+
+// Removes a favorite
+function removeFavorite(xid, database) {
+ // We remove the target favorite everywhere needed
+ $('.buddy-conf-groupchat-select option[value=' + xid + ']').remove();
+ $('.fedit-head-select option[value=' + xid + ']').remove();
+
+ // Must remove it from database?
+ if(database)
+ removeDB('favorites', xid);
+}
+
+// Sends a favorite to the XMPP server
+function favoritePublish() {
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ var query = iq.setQuery(NS_PRIVATE);
+ var storage = query.appendChild(iq.buildNode('storage', {'xmlns': NS_BOOKMARKS}));
+
+ // We generate the XML
+ for(var i = 0; i < sessionStorage.length; i++) {
+ // Get the pointer values
+ var current = sessionStorage.key(i);
+
+ // If the pointer is on a stored favorite
+ if(explodeThis('_', current, 0) == 'favorites') {
+ var data = XMLFromString(sessionStorage.getItem(current));
+ var xid = $(data).find('xid').text();
+ var rName = $(data).find('name').text();
+ var nick = $(data).find('nick').text();
+ var password = $(data).find('password').text();
+ var autojoin = $(data).find('autojoin').text();
+
+ // We create the node for this groupchat
+ var item = storage.appendChild(iq.buildNode('conference', {'name': rName, 'jid': xid, 'autojoin': autojoin, xmlns: NS_BOOKMARKS}));
+ item.appendChild(iq.buildNode('nick', {xmlns: NS_BOOKMARKS}, nick));
+
+ if(password)
+ item.appendChild(iq.buildNode('password', {xmlns: NS_BOOKMARKS}, password));
+
+ logThis('Bookmark sent: ' + xid, 3);
+ }
+ }
+
+ con.send(iq);
+}
+
+// Gets a list of the MUC items on a given server
+function getGCList() {
+ var path = '#favorites .';
+ var gcServer = $('.fsearch-head-server').val();
+
+ // We reset some things
+ $(path + 'fsearch-oneresult').remove();
+ $(path + 'fsearch-noresults').hide();
+ $(path + 'wait').show();
+
+ var iq = new JSJaCIQ();
+ iq.setType('get');
+ iq.setTo(gcServer);
+
+ iq.setQuery(NS_DISCO_ITEMS);
+
+ con.send(iq, handleGCList);
+}
+
+// Handles the MUC items list
+function handleGCList(iq) {
+ var path = '#favorites .';
+ var from = fullXID(getStanzaFrom(iq));
+
+ if (!iq || (iq.getType() != 'result')) {
+ openThisError(3);
+
+ $(path + 'wait').hide();
+
+ logThis('Error while retrieving the rooms: ' + from, 1);
+ }
+
+ else {
+ var handleXML = iq.getQuery();
+
+ if($(handleXML).find('item').size()) {
+ // Initialize the HTML code
+ var html = '';
+
+ $(handleXML).find('item').each(function() {
+ var roomXID = $(this).attr('jid');
+ var roomName = $(this).attr('name');
+
+ if(roomXID && roomName) {
+ // Escaped values
+ var escaped_xid = encodeOnclick(roomXID);
+ var escaped_name = encodeOnclick(roomName);
+
+ // Initialize the room HTML
+ html += '<div class="oneresult fsearch-oneresult" data-xid="' + escape(roomXID) + '">' +
+ '<div class="room-name">' + roomName.htmlEnc() + '</div>' +
+ '<a href="#" class="one-button join talk-images" onclick="return joinFavorite(\'' + escaped_xid + '\');">' + _e("Join") + '</a>';
+
+ // This room is yet a favorite
+ if(existDB('favorites', roomXID))
+ html += '<a href="#" class="one-button remove talk-images" onclick="return removeThisFavorite(\'' + escaped_xid + '\', \'' + escaped_name + '\');">' + _e("Remove") + '</a>';
+ else
+ html += '<a href="#" class="one-button add talk-images" onclick="return addThisFavorite(\'' + escaped_xid + '\', \'' + escaped_name + '\');">' + _e("Add") + '</a>';
+
+ // Close the room HTML
+ html += '</div>';
+ }
+ });
+
+ // Append this code to the popup
+ $(path + 'fsearch-results').append(html);
+ }
+
+ else
+ $(path + 'fsearch-noresults').show();
+
+ logThis('Rooms retrieved: ' + from, 3);
+ }
+
+ $(path + 'wait').hide();
+}
+
+// Joins a groupchat from favorites
+function joinFavorite(room) {
+ quitFavorites();
+ checkChatCreate(room, 'groupchat', '', '', getXIDNick(room));
+
+ return false;
+}
+
+// Displays a given favorite
+function displayFavorites(xid, name, nick, autojoin, password) {
+ // Generate the HTML code
+ var html = '<option value="' + encodeQuotes(xid) + '">' + name.htmlEnc() + '</option>';
+
+ // Remove the existing favorite
+ removeFavorite(xid, false);
+
+ // We complete the select forms
+ $('#buddy-list .gc-join-first-option, #favorites .fedit-head-select-first-option').after(html);
+
+ // We store the informations
+ var value = '<groupchat><xid>' + xid.htmlEnc() + '</xid><name>' + name.htmlEnc() + '</name><nick>' + nick.htmlEnc() + '</nick><autojoin>' + autojoin.htmlEnc() + '</autojoin><password>' + password.htmlEnc() + '</password></groupchat>';
+ setDB('favorites', xid, value);
+}
+
+// Loads the favorites for the popup
+function loadFavorites() {
+ // Initialize the HTML code
+ var html = '';
+
+ // Read the database
+ for(var i = 0; i < sessionStorage.length; i++) {
+ // Get the pointer values
+ var current = sessionStorage.key(i);
+
+ // If the pointer is on a stored favorite
+ if(explodeThis('_', current, 0) == 'favorites') {
+ var data = XMLFromString(sessionStorage.getItem(current));
+
+ // Add the current favorite to the HTML code
+ html += '<option value="' + encodeQuotes($(data).find('xid').text()) + '">' + $(data).find('name').text().htmlEnc() + '</option>';
+ }
+ }
+
+ // Generate specific HTML code
+ var favorites_bubble = '<option value="none" class="gc-join-first-option" selected="">' + _e("Select a favorite") + '</option>' + html;
+ var favorites_popup = '<option value="none" class="fedit-head-select-first-option" selected="">' + _e("Select a favorite") + '</option>' + html;
+
+ // Append the HTML code
+ $('#buddy-list .buddy-conf-groupchat-select').html(favorites_bubble);
+ $('#favorites .fedit-head-select').html(favorites_popup);
+}
+
+// Plugin launcher
+function launchFavorites() {
+ var path = '#favorites .';
+
+ // Keyboard events
+ $(path + 'fsearch-head-server').keyup(function(e) {
+ if(e.keyCode == 13) {
+ // No value?
+ if(!$(this).val())
+ $(this).val(HOST_MUC);
+
+ // Get the list
+ getGCList();
+ }
+ });
+
+ $(path + 'fedit-line input').keyup(function(e) {
+ if(e.keyCode == 13) {
+ // Edit a favorite
+ if($(path + 'fedit-edit').is(':visible'))
+ terminateThisFavorite('edit');
+
+ // Add a favorite
+ else
+ terminateThisFavorite('add');
+ }
+ });
+
+ // Change events
+ $('.fedit-head-select').change(editFavorite);
+
+ // Click events
+ $(path + 'room-switcher').click(function() {
+ $(path + 'favorites-content').hide();
+ resetFavorites();
+ });
+
+ $(path + 'room-list').click(function() {
+ $(path + 'favorites-edit').show();
+ });
+
+ $(path + 'room-search').click(function() {
+ $(path + 'favorites-search').show();
+ getGCList();
+ });
+
+ $(path + 'fedit-add').click(function() {
+ return terminateThisFavorite('add');
+ });
+
+ $(path + 'fedit-edit').click(function() {
+ return terminateThisFavorite('edit');
+ });
+
+ $(path + 'fedit-remove').click(function() {
+ return terminateThisFavorite('remove');
+ });
+
+ $(path + 'bottom .finish').click(function() {
+ return quitFavorites();
+ });
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the server features JS script for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 01/06/11
+
+*/
+
+// Gets the features of a server
+function getFeatures() {
+ /* REF: http://xmpp.org/extensions/xep-0030.html */
+
+ // Get the main values
+ var to = getServer();
+ var caps = con.server_caps;
+ var xml = null;
+
+ // Try to get the stored data
+ if(caps)
+ xml = XMLFromString(getPersistent('caps', caps));
+
+ // Any stored data?
+ if(xml) {
+ handleFeatures(xml);
+
+ logThis('Read server CAPS from cache.');
+ }
+
+ // Not stored (or no CAPS)!
+ else {
+ var iq = new JSJaCIQ();
+
+ iq.setTo(to);
+ iq.setType('get');
+ iq.setQuery(NS_DISCO_INFO);
+
+ con.send(iq, handleDiscoInfos);
+
+ logThis('Read server CAPS from network.');
+ }
+}
+
+// Handles the features of a server
+function handleFeatures(xml) {
+ // Selector
+ var selector = $(xml);
+
+ // Markers
+ var pep = false;
+ var pubsub = false;
+ var archive = false;
+ var archive_auto = false;
+ var archive_manual = false;
+ var archive_manage = false;
+ var archive_pref = false;
+ var commands = false;
+
+ // Scan the features
+ if(selector.find('identity[category=pubsub][type=pep]').size())
+ pep = true;
+ if(selector.find('feature[var=' + NS_PUBSUB + ']').size())
+ pubsub = true;
+ if(selector.find('feature[var=' + NS_URN_ARCHIVE + ']').size())
+ archive = true;
+ if(selector.find('feature[var=' + NS_URN_AR_AUTO + ']').size())
+ archive_auto = true;
+ if(selector.find('feature[var=' + NS_URN_AR_MANUAL + ']').size())
+ archive_manual = true;
+ if(selector.find('feature[var=' + NS_URN_AR_MANAGE + ']').size())
+ archive_manage = true;
+ if(selector.find('feature[var=' + NS_URN_AR_PREF + ']').size())
+ archive_pref = true;
+ if(selector.find('feature[var=' + NS_COMMANDS + ']').size())
+ commands = true;
+
+ // Enable the pep elements if available
+ if(pep) {
+ // Update our database
+ enableFeature('pep');
+
+ // Get the microblog
+ getInitMicroblog();
+
+ // Get the notifications
+ getNotifications();
+
+ // Geolocate the user
+ geolocate();
+
+ // Enable microblogging send tools
+ waitMicroblog('sync');
+ $('.postit.attach').css('display', 'block');
+
+ logThis('XMPP server supports PEP.', 3);
+ }
+
+ // Disable microblogging send tools (no PEP!)
+ else {
+ waitMicroblog('unsync');
+
+ logThis('XMPP server does not support PEP.', 2);
+ }
+
+ // Enable the pubsub features if available
+ if(pubsub)
+ enableFeature(NS_PUBSUB);
+
+ // Enable the archiving features if available
+ if(archive)
+ enableFeature(NS_URN_ARCHIVE);
+
+ // Enable the archiving sub-features if available
+ if(archive_pref)
+ enableFeature(NS_URN_AR_PREF);
+ if(archive_auto)
+ enableFeature(NS_URN_AR_AUTO);
+ if(archive_manual)
+ enableFeature(NS_URN_AR_MANUAL);
+ if(archive_manage)
+ enableFeature(NS_URN_AR_MANAGE);
+
+ // Enable the commands features if available
+ if(commands)
+ enableFeature(NS_COMMANDS);
+
+ // Hide the private life fieldset if nothing to show
+ if(!pep && !archive_pref)
+ $('#options fieldset.privacy').hide();
+
+ // Apply the features
+ applyFeatures('talk');
+
+ // Process the buddy-list height
+ if(pep)
+ adaptRoster();
+
+ return false;
+}
+
+// The function to apply the features to an element
+function applyFeatures(id) {
+ // Path to the elements
+ var path = '#' + id + ' .';
+
+ // PEP features
+ if(enabledPEP())
+ $(path + 'pep-hidable').show();
+
+ // PubSub features
+ if(enabledPubSub())
+ $(path + 'pubsub-hidable').show();
+
+ // Archives features
+ if(enabledArchives() || enabledArchives('auto') || enabledArchives('manual') || enabledArchives('manage')) {
+ $(path + 'archives-hidable:not(.pref)').show();
+
+ // Sub-feature: archives preferences
+ if(enabledArchives('pref'))
+ $(path + 'archives-hidable.pref').show();
+ }
+
+ // Commands features
+ if(enabledCommands())
+ $(path + 'commands-hidable').show();
+
+ // XMPP links (browser feature)
+ if(navigator.registerProtocolHandler)
+ $(path + 'xmpplinks-hidable').show();
+}
+
+// Enables a feature
+function enableFeature(feature) {
+ setDB('feature', feature, 'true');
+}
+
+// Checks if a feature is enabled
+function enabledFeature(feature) {
+ if(getDB('feature', feature) == 'true')
+ return true;
+ else
+ return false;
+}
+
+// Returns the XMPP server PEP support
+function enabledPEP() {
+ return enabledFeature('pep');
+}
+
+// Returns the XMPP server PubSub support
+function enabledPubSub() {
+ return enabledFeature(NS_PUBSUB);
+}
+
+// Returns the XMPP server archives support
+function enabledArchives(sub) {
+ var xmlns = NS_URN_ARCHIVE;
+
+ // Any sub element sent?
+ if(sub)
+ xmlns += ':' + sub;
+
+ return enabledFeature(xmlns);
+}
+
+// Returns the XMPP server commands support
+function enabledCommands() {
+ return enabledFeature(NS_COMMANDS);
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the filtering JS script for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Authors: Vanaryon, Maranda
+Last revision: 04/08/11
+
+*/
+
+// Generates a given emoticon HTML code
+function emoteImage(image, text, after) {
+ return ' <img class="emoticon emoticon-' + image + ' smileys-images" alt="' + encodeQuotes(text) + '" src="' + './img/others/blank.gif' + '" /> ' + after;
+}
+
+// Filters a given message
+function filterThisMessage(neutralMessage, nick, html_encode) {
+ var filteredMessage = neutralMessage;
+
+ // We encode the HTML special chars
+ if(html_encode)
+ filteredMessage = filteredMessage.htmlEnc();
+
+ // /me command
+ filteredMessage = filteredMessage.replace(/((^)|((.+)(>)))(\/me )([^<]+)/, nick + ' $7')
+
+ // We replace the smilies text into images
+ .replace(/(:-?@)($|\s|<)/gi, emoteImage('angry', '$1', '$2'))
+ .replace(/(:-?\[)($|\s|<)/gi, emoteImage('bat', '$1', '$2'))
+ .replace(/(\(B\))($|\s|<)/g, emoteImage('beer', '$1', '$2'))
+ .replace(/((:-?D)|(XD))($|\s|<)/gi, emoteImage('biggrin', '$1', '$4'))
+ .replace(/(:-?\$)($|\s|<)/gi, emoteImage('blush', '$1', '$2'))
+ .replace(/(\(Z\))($|\s|<)/g, emoteImage('boy', '$1', '$2'))
+ .replace(/(\(W\))($|\s|<)/g, emoteImage('brflower', '$1', '$2'))
+ .replace(/((<\/3)|(\(U\)))($|\s|<)/g, emoteImage('brheart', '$1', '$4'))
+ .replace(/(\(C\))($|\s|<)/g, emoteImage('coffee', '$1', '$2'))
+ .replace(/((8-\))|(\(H\)))($|\s|<)/g, emoteImage('coolglasses', '$1', '$4'))
+ .replace(/(:'-?\()($|\s|<)/gi, emoteImage('cry', '$1', '$2'))
+ .replace(/(\(%\))($|\s|<)/g, emoteImage('cuffs', '$1', '$2'))
+ .replace(/(\]:-?>)($|\s|<)/gi, emoteImage('devil', '$1', '$2'))
+ .replace(/(\(D\))($|\s|<)/g, emoteImage('drink', '$1', '$2'))
+ .replace(/(@}->--)($|\s|<)/gi, emoteImage('flower', '$1', '$2'))
+ .replace(/((:-?\/)|(:-?S))($|\s|<)/gi, emoteImage('frowning', '$1', '$4'))
+ .replace(/(\(X\))($|\s|<)/g, emoteImage('girl', '$1', '$2'))
+ .replace(/((<3)|(\(L\)))($|\s|<)/g, emoteImage('heart', '$1', '$4'))
+ .replace(/(\(}\))($|\s|<)/g, emoteImage('hugleft', '$1', '$2'))
+ .replace(/(\({\))($|\s|<)/g, emoteImage('hugright', '$1', '$2'))
+ .replace(/(:-?{})($|\s|<)/gi, emoteImage('kiss', '$1', '$2'))
+ .replace(/(\(I\))($|\s|<)/g, emoteImage('lamp', '$1', '$2'))
+ .replace(/(:-?3)($|\s|<)/gi, emoteImage('lion', '$1', '$2'))
+ .replace(/(\(E\))($|\s|<)/g, emoteImage('mail', '$1', '$2'))
+ .replace(/(\(S\))($|\s|<)/g, emoteImage('moon', '$1', '$2'))
+ .replace(/(\(8\))($|\s|<)/g, emoteImage('music', '$1', '$2'))
+ .replace(/((=-?O)|(:-?O))($|\s|<)/gi, emoteImage('oh', '$1', '$4'))
+ .replace(/(\(T\))($|\s|<)/g, emoteImage('phone', '$1', '$2'))
+ .replace(/(\(P\))($|\s|<)/g, emoteImage('photo', '$1', '$2'))
+ .replace(/(:-?!)($|\s|<)/gi, emoteImage('puke', '$1', '$2'))
+ .replace(/(\(@\))($|\s|<)/g, emoteImage('pussy', '$1', '$2'))
+ .replace(/(\(R\))($|\s|<)/g, emoteImage('rainbow', '$1', '$2'))
+ .replace(/(:-?\))($|\s|<)/gi, emoteImage('smile', '$1', '$2'))
+ .replace(/(\(\*\))($|\s|<)/g, emoteImage('star', '$1', '$2'))
+ .replace(/(:-?\|)($|\s|<)/gi, emoteImage('stare', '$1', '$2'))
+ .replace(/(\(N\))($|\s|<)/g, emoteImage('thumbdown', '$1', '$2'))
+ .replace(/(\(Y\))($|\s|<)/g, emoteImage('thumbup', '$1', '$2'))
+ .replace(/(:-?P)($|\s|<)/gi, emoteImage('tongue', '$1', '$2'))
+ .replace(/(:-?\()($|\s|<)/gi, emoteImage('unhappy', '$1', '$2'))
+ .replace(/(;-?\))($|\s|<)/gi, emoteImage('wink', '$1', '$2'))
+
+ // Text in bold
+ .replace(/(^|\s|>)((\*)([^<>'"]+)(\*))($|\s|<)/gi, '$1<b>$2</b>$6')
+
+ // Italic text
+ .replace(/(^|\s|>)((\/)([^<>'"]+)(\/))($|\s|<)/gi, '$1<i>$2</i>$6')
+
+ // Underlined text
+ .replace(/(^|\s|>)((_)([^<>'"]+)(_))($|\s|<)/gi, '$1<span style="text-decoration: underline;">$2</span>$6');
+
+ // Add the links
+ if(html_encode)
+ filteredMessage = applyLinks(filteredMessage, 'desktop');
+
+ // Filter integratebox links
+ filteredMessage = filterIntegrateBox(filteredMessage);
+
+ return filteredMessage;
+}
+
+// Filters a xHTML message to be displayed in Jappix
+function filterThisXHTML(code) {
+ // Allowed elements array
+ var elements = new Array(
+ 'a',
+ 'abbr',
+ 'acronym',
+ 'address',
+ 'blockquote',
+ 'body',
+ 'br',
+ 'cite',
+ 'code',
+ 'dd',
+ 'dfn',
+ 'div',
+ 'dt',
+ 'em',
+ 'h1',
+ 'h2',
+ 'h3',
+ 'h4',
+ 'h5',
+ 'h6',
+ 'head',
+ 'html',
+ 'img',
+ 'kbd',
+ 'li',
+ 'ol',
+ 'p',
+ 'pre',
+ 'q',
+ 'samp',
+ 'span',
+ 'strong',
+ 'title',
+ 'ul',
+ 'var'
+ );
+
+ // Allowed attributes array
+ var attributes = new Array(
+ 'accesskey',
+ 'alt',
+ 'charset',
+ 'cite',
+ 'class',
+ 'height',
+ 'href',
+ 'hreflang',
+ 'id',
+ 'longdesc',
+ 'profile',
+ 'rel',
+ 'rev',
+ 'src',
+ 'style',
+ 'tabindex',
+ 'title',
+ 'type',
+ 'uri',
+ 'version',
+ 'width',
+ 'xml:lang',
+ 'xmlns'
+ );
+
+ // Remove forbidden elements
+ $(code).find('html body *').each(function() {
+ // This element is not authorized
+ if(!existArrayValue(elements, (this).nodeName.toLowerCase()))
+ $(this).remove();
+ });
+
+ // Remove forbidden attributes
+ $(code).find('html body *').each(function() {
+ // Put a pointer on this element (jQuery way & normal way)
+ var cSelector = $(this);
+ var cElement = (this);
+
+ // Loop the attributes of the current element
+ $(cElement.attributes).each(function(index) {
+ // Read the current attribute
+ var cAttr = cElement.attributes[index];
+ var cName = cAttr.name;
+ var cVal = cAttr.value;
+
+ // This attribute is not authorized, or contains JS code
+ if(!existArrayValue(attributes, cName.toLowerCase()) || ((cVal.toLowerCase()).match(/(^|"|')javascript:/)))
+ cSelector.removeAttr(cName);
+ });
+ });
+
+ // Filter some other elements
+ $(code).find('a').attr('target', '_blank');
+
+ return $(code).find('html body').html();
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the groupchat JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Authors: Vanaryon, Maranda, Eric
+Last revision: 28/08/11
+
+*/
+
+// Displays the MUC admin elements
+function displayMucAdmin(affiliation, id, xid, statuscode) {
+ // We must be in the "login" mode
+ if(isAnonymous())
+ return;
+
+ // We check if the user is a room owner or administrator to give him privileges
+ if(affiliation == 'owner' || affiliation == 'admin')
+ $('#' + id + ' .tools-mucadmin').show();
+
+ // We check if the room hasn't been yet created
+ if(statuscode == 201)
+ openThisInfo(4);
+
+ // We add the click event
+ $('#' + id + ' .tools-mucadmin').click(function() {
+ openMucAdmin(xid, affiliation);
+ });
+}
+
+// Initializes a connection with a MUC groupchat
+function getMUC(room, nickname, password) {
+ // Room hash
+ var hash = hex_md5(room);
+
+ // Reset the elements
+ $('#' + hash + ' .muc-ask').remove();
+ $('#' + hash + ' .compose').show();
+
+ // No nickname?
+ if(!nickname) {
+ // Get some values
+ if(!isAnonymous())
+ nickname = getNick();
+ else
+ nickname = ANONYMOUS_NICK;
+
+ // If the nickname could not be retrieved, ask it
+ if(!nickname)
+ generateMUCAsk('nickname', room, hash, nickname, password);
+ }
+
+ // Got our nickname?
+ if(nickname) {
+ // Get our general presence
+ var show = getDB('presence-show', 1);
+ var status = getDB('options', 'presence-status');
+
+ // Set my nick
+ $('#' + hash).attr('data-nick', escape(nickname));
+
+ // Send the appropriate presence
+ sendPresence(room + '/' + nickname, '', show, status, '', true, password, handleMUC);
+ }
+
+ return false;
+}
+
+// Handles the MUC main elements
+function handleMUC(presence) {
+ // We get the xml content
+ var xml = presence.getNode();
+ var from = fullXID(getStanzaFrom(presence));
+ var room = bareXID(from);
+ var nickname = thisResource(from);
+ var hash = hex_md5(room);
+
+ // No ID: must fix M-Link bug
+ if(presence.getID() == null)
+ presence.setID(1);
+
+ logThis('First MUC presence: ' + from, 3);
+
+ // Catch the errors
+ if(!handleError(xml)) {
+ // Define some stuffs
+ var muc_user = $(xml).find('x[xmlns=' + NS_MUC_USER + ']');
+ var affiliation = muc_user.find('item').attr('affiliation');
+ var statuscode = parseInt(muc_user.find('status').attr('code'));
+
+ // Handle my presence
+ handlePresence(presence);
+
+ // Check if I am a room owner
+ displayMucAdmin(affiliation, hash, room, statuscode);
+
+ // Tell the MUC we can notify the incoming presences
+ $(document).oneTime('15s', function() {
+ $('#' + hash).attr('data-initial', 'true');
+ });
+
+ // Enable the chatting input
+ $(document).oneTime(10, function() {
+ $('#' + hash + ' .message-area').removeAttr('disabled').focus();
+ });
+ }
+
+ // A password is required
+ else if($(xml).find('error[type=auth] not-authorized').size())
+ generateMUCAsk('password', room, hash, nickname);
+
+ // There's a nickname conflict
+ else if($(xml).find('error[type=cancel] conflict').size())
+ generateMUCAsk('nickname', room, hash);
+}
+
+// Generates a correct MUC asker
+function generateMUCAsk(type, room, hash, nickname, password) {
+ // Generate the path to the elements
+ var path_to = '#' + hash + ' .muc-ask';
+
+ // Define the label text
+ var label_text;
+
+ switch(type) {
+ case 'nickname':
+ label_text = _e("Nickname");
+ break;
+
+ case 'password':
+ label_text = _e("Password");
+ break;
+ }
+
+ // Create the HTML markup
+ $('#' + hash + ' .compose').hide();
+
+ $('#' + hash).append(
+ '<div class="muc-ask text">' +
+ '<label>' + label_text + '</label>' +
+ '<input class="focusable" type="text" />' +
+ '</div>'
+ );
+
+ // When a key is pressed in the input
+ $(path_to + ' input').keyup(function(e) {
+ var value_input = $(this).val();
+
+ // Enter key pressed
+ if((e.keyCode == 13) && value_input) {
+ if(type == 'nickname')
+ nickname = value_input;
+ else if(type == 'password')
+ password = value_input;
+
+ return getMUC(room, nickname, password);
+ }
+ });
+
+ // Focus on the input
+ $(document).oneTime(10, function() {
+ $(path_to + ' input').focus();
+ });
+}
+
+// Creates a new groupchat
+function groupchatCreate(hash, room, chan, nickname, password) {
+ /* REF: http://xmpp.org/extensions/xep-0045.html */
+
+ logThis('New groupchat: ' + room, 3);
+
+ // Create the chat content
+ generateChat('groupchat', hash, room, chan);
+
+ // Create the chat switcher
+ generateSwitch('groupchat', hash, room, chan);
+
+ // The icons-hover functions
+ tooltipIcons(room, hash);
+
+ // Click event on the add tool
+ $('#' + hash + ' .tools-add').click(function() {
+ // Hide the icon (to tell the user all is okay)
+ $(this).hide();
+
+ // Add the groupchat to the user favorites
+ addThisFavorite(room, chan);
+ });
+
+ // Must show the add button?
+ if(!existDB('favorites', room))
+ $('#' + hash + ' .tools-add').show();
+
+ // The event handlers
+ var inputDetect = $('#' + hash + ' .message-area');
+
+ // Focus event
+ inputDetect.focus(function() {
+ chanCleanNotify(hash);
+ })
+
+ // Blur event
+ inputDetect.blur(function() {
+ resetAutocompletion(hash);
+ })
+
+ // Lock to the input
+ inputDetect.keypress(function(e) {
+ // Enter key
+ if(e.keyCode == 13) {
+ // Add a new line
+ if(e.shiftKey)
+ inputDetect.val(inputDetect.val() + '\n');
+
+ // Send the message
+ else {
+ sendMessage(hash, 'groupchat');
+
+ // Reset the composing database entry
+ setDB('chatstate', room, 'off');
+ }
+
+ return false;
+ }
+
+ // Tabulation key
+ else if(e.keyCode == 9) {
+ createAutocompletion(hash);
+
+ return false;
+ }
+
+ // Reset the autocompleter
+ else
+ resetAutocompletion(hash);
+ });
+
+ // Chatstate events
+ eventsChatState(inputDetect, room, hash);
+
+ // Get the current muc informations and content
+ getMUC(room, nickname, password);
+}
+
+// Joins the defined groupchats
+function joinConfGroupchats() {
+ // Nothing to join?
+ if(!GROUPCHATS_JOIN)
+ return;
+
+ // Values array
+ var muc_arr = [GROUPCHATS_JOIN];
+ var new_arr = [];
+
+ // Try to split it
+ if(GROUPCHATS_JOIN.indexOf(',') != -1)
+ muc_arr = GROUPCHATS_JOIN.split(',');
+
+ for(i in muc_arr) {
+ // Get the current value
+ var muc_current = trim(muc_arr[i]);
+
+ // No current value?
+ if(!muc_current)
+ continue;
+
+ // Filter the current value
+ muc_current = generateXID(muc_current, 'groupchat');
+
+ // Add the current value
+ if(!existArrayValue(new_arr, muc_current))
+ new_arr.push(muc_current);
+ }
+
+ // Join the chats
+ if(new_arr.length) {
+ for(g in new_arr)
+ checkChatCreate(new_arr[g], 'groupchat');
+ }
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the homepage JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Authors: Vanaryon, LinkMauve
+Last revision: 15/01/12
+
+*/
+
+// Allows the user to switch the difference home page elements
+function switchHome(div) {
+ // Path to
+ var home = '#home .';
+ var right = home + 'right ';
+ var current = right + '.homediv.' + div;
+
+ // We switch the div
+ $(right + '.homediv, ' + right + '.top').hide();
+ $(right + '.' + div).show();
+
+ // We reset the homedivs
+ $(home + 'homediv:not(.default), ' + home + 'top:not(.default)').remove();
+
+ // Get the HTML code to display
+ var disable_form = '';
+ var lock_host = '';
+ var code = '';
+
+ // Apply the previous link
+ switch(div) {
+ case 'loginer':
+ case 'anonymouser':
+ case 'registerer':
+ if(!exists(right + '.top.sub')) {
+ // Append the HTML code for previous link
+ $(right + '.top.default').after('<h1 class="top sub loginer anonymouser registerer">« <a href="#" class="previous">' + _e("Previous") + '</a></h1>');
+
+ // Click event on previous link
+ $(home + 'top.sub a.previous').click(function() {
+ return switchHome('default');
+ });
+ }
+
+ break;
+ }
+
+ // Apply the form
+ switch(div) {
+ // Login tool
+ case 'loginer':
+ lock_host = disableInput(LOCK_HOST, 'on');
+ code = '<p>' + printf(_e("Login to your existing XMPP account. You can also use the %s to join a groupchat."), '<a href="#" class="to-anonymous">' + _e("anonymous mode") + '</a>') + '</p>' +
+
+ '<form action="#" method="post">' +
+ '<fieldset>' +
+ '<legend>' + _e("Required") + '</legend>' +
+
+ '<label for="lnick">' + _e("Address") + '</label>' +
+ '<input type="text" class="nick" id="lnick" pattern="[^@/]+" required="" /><span class="jid">@</span><input type="text" class="server" id="lserver" value="' + HOST_MAIN + '" ' + lock_host + ' pattern="[^@/]+" required="" />' +
+ '<label for="lpassword">' + _e("Password") + '</label>' +
+ '<input type="password" class="password" id="lpassword" required="" />' +
+ '<label for="lremember">' + _e("Remember me") + '</label>' +
+ '<input type="checkbox" class="remember" id="lremember" />' +
+ '</fieldset>' +
+
+ '<a href="#" class="advanced home-images">' + _e("Advanced") + '</a>' +
+
+ '<fieldset class="advanced">' +
+ '<legend>' + _e("Advanced") + '</legend>' +
+
+ '<label for="lresource">' + _e("Resource") + '</label>' +
+ '<input type="text" class="resource" id="lresource" value="' + JAPPIX_RESOURCE + '" />' +
+ '<label for="lpriority">' + _e("Priority") + '</label>' +
+ '<select class="priority" id="lpriority">' +
+ '<option value="1">' + _e("Low") + '</option>' +
+ '<option value="10" selected="">' + _e("Medium") + '</option>' +
+ '<option value="100">' + _e("High") + '</option>' +
+ '</select>' +
+ '</fieldset>' +
+
+ '<input type="submit" value="' + _e("Here we go!") + '" />' +
+ '</form>';
+
+ break;
+
+ // Anonymous login tool
+ case 'anonymouser':
+ disable_form = disableInput(ANONYMOUS, 'off');
+ code = '<p>' + printf(_e("Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."), '<a href="#" class="to-home">' + _e("login page") + '</a>') + '</p>' +
+
+ '<form action="#" method="post">' +
+ '<fieldset>' +
+ '<legend>' + _e("Required") + '</legend>' +
+
+ '<label>' + _e("Room") + '</label>' +
+ '<input type="text" class="room"' + disable_form + ' pattern="[^/]+" required="" />' +
+
+ '<label>' + _e("Nickname") + '</label>' +
+ '<input type="text" class="nick"' + disable_form + ' required="" />' +
+ '</fieldset>' +
+
+ '<input type="submit" value="' + _e("Here we go!") + '"' + disable_form + ' />' +
+ '</form>' +
+
+ '<div class="info report">' +
+ _e("Share this link with your friends:") + ' <span></span>' +
+ '</div>';
+
+ break;
+
+ // Register tool
+ case 'registerer':
+ disable_form = disableInput(REGISTRATION, 'off');
+
+ if(!disable_form)
+ lock_host = disableInput(LOCK_HOST, 'on');
+
+ code = '<p>' + _e("Register a new XMPP account to join your friends on your own social cloud. That's simple!") + '</p>' +
+
+ '<form action="#" method="post">' +
+ '<fieldset>' +
+ '<legend>' + _e("Required") + '</legend>' +
+
+ '<label for="rnick">' + _e("Address") + '</label>' +
+ '<input type="text" class="nick" id="rnick" ' + disable_form + ' pattern="[^@/]+" required="" /><span class="jid">@</span><input type="text" class="server" id="rserver" value="' + HOST_MAIN + '" ' + disable_form + lock_host + ' pattern="[^@/]+" required="" />' +
+ '<label for="rpassword">' + _e("Password") + '</label>' +
+ '<input type="password" class="password" id="rpassword" ' + disable_form + ' required="" />' +
+ '<label for="spassword">' + _e("Confirm") + '</label><input type="password" class="spassword" id="spassword" ' + disable_form + ' required="" />' +
+ '</fieldset>' +
+
+ '<input type="submit" value="' + _e("Here we go!") + '" ' + disable_form + '/>' +
+ '</form>';
+
+ break;
+ }
+
+ // Form disabled?
+ if(disable_form)
+ code += '<div class="info fail">' +
+ _e("This tool has been disabled, you cannot use it!") +
+ '</div>';
+
+ // Create this HTML code
+ if(code && !exists(current)) {
+ // Append it!
+ $(right + '.homediv.default').after('<div class="' + div + ' homediv">' + code + '</div>');
+
+ // Create the attached events
+ switch(div) {
+ // Login tool
+ case 'loginer':
+ $(current + ' a.to-anonymous').click(function() {
+ return switchHome('anonymouser');
+ });
+
+ $(current + ' a.advanced').click(showAdvanced);
+
+ $(current + ' form').submit(loginForm);
+
+ break;
+
+ // Anonymous login tool
+ case 'anonymouser':
+ $(current + ' a.to-home').click(function() {
+ return switchHome('loginer');
+ });
+
+ $(current + ' form').submit(doAnonymous);
+
+ // Keyup event on anonymous join's room input
+ $(current + ' input.room').keyup(function() {
+ var value = $(this).val();
+ var report = current + ' .report';
+ var span = report + ' span';
+
+ if(!value) {
+ $(report).hide();
+ $(span).text('');
+ }
+
+ else {
+ $(report).show();
+ $(span).text(JAPPIX_LOCATION + '?r=' + value);
+ }
+ });
+
+ break;
+
+ // Register tool
+ case 'registerer':
+ $(current + ' form').submit(registerForm);
+
+ break;
+ }
+ }
+
+ // We focus on the first input
+ $(document).oneTime(10, function() {
+ $(right + 'input:visible:first').focus();
+ });
+
+ return false;
+}
+
+// Allows the user to display the advanced login options
+function showAdvanced() {
+ // Hide the link
+ $('#home a.advanced').hide();
+
+ // Show the fieldset
+ $('#home fieldset.advanced').show();
+
+ return false;
+}
+
+// Reads the login form values
+function loginForm() {
+ // We get the values
+ var lPath = '#home .loginer ';
+ var lServer = $(lPath + '.server').val();
+ var lNick = $(lPath + '.nick').val();
+ var lPass = $(lPath + '.password').val();
+ var lResource = $(lPath + '.resource').val();
+ var lPriority = $(lPath + '.priority').val();
+ var lRemember = $(lPath + '.remember').filter(':checked').size();
+
+ // Enough values?
+ if(lServer && lNick && lPass && lResource && lPriority)
+ doLogin(lNick, lServer, lPass, lResource, lPriority, lRemember);
+
+ // Something is missing?
+ else {
+ $(lPath + 'input[type=text], ' + lPath + 'input[type=password]').each(function() {
+ var select = $(this);
+
+ if(!select.val())
+ $(document).oneTime(10, function() {
+ select.addClass('please-complete').focus();
+ });
+ else
+ select.removeClass('please-complete');
+ });
+ }
+
+ return false;
+}
+
+// Reads the register form values
+function registerForm() {
+ var rPath = '#home .registerer ';
+
+ // Remove the success info
+ $(rPath + '.success').remove();
+
+ // Get the values
+ var username = $(rPath + '.nick').val();
+ var domain = $(rPath + '.server').val();
+ var pass = $(rPath + '.password').val();
+ var spass = $(rPath + '.spassword').val();
+
+ // Enough values?
+ if(domain && username && pass && spass && (pass == spass)) {
+ // We remove the not completed class to avoid problems
+ $('#home .registerer input').removeClass('please-complete');
+
+ // Fire the register event!
+ doRegister(username, domain, pass);
+ }
+
+ // Something is missing?
+ else {
+ $(rPath + 'input[type=text], ' + rPath + 'input[type=password]').each(function() {
+ var select = $(this);
+
+ if(!select.val() || (select.is('#spassword') && pass && (pass != spass)))
+ $(document).oneTime(10, function() {
+ select.addClass('please-complete').focus();
+ });
+ else
+ select.removeClass('please-complete');
+ });
+ }
+
+ return false;
+}
+
+// Plugin launcher
+function launchHome() {
+ // Define the vars
+ var home = '#home ';
+ var button = home + 'button';
+ var corp = home + '.corporation';
+ var locale = home + '.locale';
+
+ // Removes the <noscript /> elements to lighten the DOM
+ $('noscript').remove();
+
+ // Allows the user to switch the home page
+ $(button).click(function() {
+ // Login button
+ if($(this).is('.login'))
+ return switchHome('loginer');
+
+ // Register button
+ else
+ return switchHome('registerer');
+ });
+
+ // Allows the user to view the corporation infobox
+ $(corp).hover(function() {
+ $(corp).addClass('hovered');
+ }, function() {
+ $(corp).removeClass('hovered');
+ });
+
+ // Allows the user to switch the language
+ $(locale).hover(function() {
+ // Initialize the HTML code
+ var keepget = $(locale).attr('data-keepget');
+ var html = '<div class="list">';
+
+ // Generate each locale HTML code
+ for(i in LOCALES_AVAILABLE_ID)
+ html += '<a href="./?l=' + LOCALES_AVAILABLE_ID[i] + keepget + '">' + LOCALES_AVAILABLE_NAMES[i].htmlEnc() + '</a>';
+
+ html += '</div>';
+
+ // Append the HTML code
+ $(locale).append(html);
+ }, function() {
+ $(locale + ' .list').remove();
+ });
+
+ // Disables the browser HTTP-requests stopper
+ $(document).keydown(function(e) {
+ if((e.keyCode == 27) && !isDeveloper())
+ return false;
+ });
+
+ // Warns for an obsolete browser
+ if(isObsolete()) {
+ // Add the code
+ $(locale).after(
+ '<div class="obsolete">' +
+ '<p>' + _e("Your browser is out of date!") + '</p>' +
+
+ '<a class="firefox browsers-images" title="' + printf(_e("Last %s version is better!"), 'Mozilla Firefox') + '" href="http://www.mozilla.com/firefox/"></a>' +
+ '<a class="chrome browsers-images" title="' + printf(_e("Last %s version is better!"), 'Google Chrome') + '" href="http://www.google.com/chrome"></a>' +
+ '<a class="safari browsers-images" title="' + printf(_e("Last %s version is better!"), 'Safari') + '" href="http://www.apple.com/safari/"></a>' +
+ '<a class="opera browsers-images" title="' + printf(_e("Last %s version is better!"), 'Opera') + '" href="http://www.opera.com/"></a>' +
+ '<a class="ie browsers-images" title="' + printf(_e("Last %s version is better!"), 'Internet Explorer') + '" href="http://www.microsoft.com/hk/windows/internet-explorer/"></a>' +
+ '</div>'
+ );
+
+ // Display it later
+ $(home + '.obsolete').oneTime('1s', function() {
+ $(this).slideDown();
+ });
+
+ logThis('Jappix does not support this browser!', 2);
+ }
+
+ logThis('Welcome to Jappix! Happy coding in developer mode!');
+}
+
+// Launch this plugin!
+$(document).ready(launchHome);
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the http-auth JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 16/11/10
+
+*/
+
+// Replies to a HTTP request
+function requestReply(value, xml) {
+ // We parse the xml content
+ var from = fullXID(getStanzaFrom(xml));
+ var confirm = $(xml.getNode()).find('confirm');
+ var xmlns = confirm.attr('xmlns');
+ var id = confirm.attr('id');
+ var method = confirm.attr('method');
+ var url = confirm.attr('url');
+
+ // We generate the reply message
+ var aMsg = new JSJaCMessage();
+ aMsg.setTo(from);
+
+ // If "no"
+ if(value == 'no') {
+ aMsg.setType('error');
+ aMsg.appendNode('error', {'code': '401', 'type': 'auth'});
+ }
+
+ // We set the confirm node
+ aMsg.appendNode('confirm', {'xmlns': xmlns, 'url': url, 'id': id, 'method': method});
+
+ // We send the message
+ con.send(aMsg, handleErrorReply);
+
+ logThis('Replying HTTP auth request: ' + from, 3);
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the inbox JS script for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 08/06/11
+
+*/
+
+// Opens the inbox popup
+function openInbox() {
+ // Popup HTML content
+ var html =
+ '<div class="top">' + _e("Your inbox") + '</div>' +
+
+ '<div class="content">' +
+ '<div class="head inbox-head">' +
+ '<div class="head-text inbox-head-text">' + _e("Available actions") + '</div>' +
+
+ '<div class="head-actions inbox-head-actions">' +
+ '<a href="#" class="a-delete-messages">' + _e("Clean") + '</a>' +
+ '<a href="#" class="a-new-message">' + _e("New") + '</a>' +
+ '<a href="#" class="a-show-messages">' + _e("Received") + '</a>' +
+ '</div>' +
+ '</div>' +
+
+ '<div class="inbox-results">' +
+ '<p class="inbox-noresults">' + _e("Your inbox is empty.") + '</p>' +
+
+ '<div class="inbox"></div>' +
+ '</div>' +
+
+ '<div class="inbox-new">' +
+ '<div class="inbox-new-to inbox-new-block search">' +
+ '<p class="inbox-new-text">' + _e("To") + '</p>' +
+
+ '<input name="inbox-new-to-input" class="inbox-new-input inbox-new-to-input" type="text" required="" />' +
+ '</div>' +
+
+ '<div class="inbox-new-topic inbox-new-block">' +
+ '<p class="inbox-new-text">' + _e("Subject") + '</p>' +
+
+ '<input name="inbox-new-subject-input" class="inbox-new-input inbox-new-subject-input" type="text" required="" />' +
+ '</div>' +
+
+ '<div class="inbox-new-body inbox-new-block">' +
+ '<p class="inbox-new-text">' + _e("Content") + '</p>' +
+
+ '<textarea class="inbox-new-textarea" rows="8" cols="60" required=""></textarea>' +
+ '</div>' +
+
+ '<form class="inbox-new-file inbox-new-block" action="./php/file-share.php" method="post" enctype="multipart/form-data">' +
+ '<p class="inbox-new-text">' + _e("File") + '</p>' +
+
+ generateFileShare() +
+ '</form>' +
+
+ '<div class="inbox-new-send inbox-new-block">' +
+ '<a href="#" class="send one-button talk-images">' + _e("Send message") + '</a>' +
+ '</div>' +
+ '</div>' +
+ '</div>' +
+
+ '<div class="bottom">' +
+ '<div class="wait wait-medium"></div>' +
+
+ '<a href="#" class="finish">' + _e("Close") + '</a>' +
+ '</div>';
+
+ // Create the popup
+ createPopup('inbox', html);
+
+ // Associate the events
+ launchInbox();
+
+ // Load the messages
+ loadInbox();
+
+ return false;
+}
+
+// Closes the inbox popup
+function closeInbox() {
+ // Destroy the popup
+ destroyPopup('inbox');
+
+ return false;
+}
+
+// Opens the message compose tool
+function composeInboxMessage(xid) {
+ // Open things
+ openInbox();
+ newInboxMessage();
+
+ // Apply XID
+ $('#inbox .inbox-new-to-input').val(xid);
+
+ // Focus to the next item
+ $(document).oneTime(10, function() {
+ $('#inbox .inbox-new-subject-input').focus();
+ });
+
+ return false;
+}
+
+// Stores the inbox
+function storeInbox() {
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+ var query = iq.setQuery(NS_PRIVATE);
+ var storage = query.appendChild(iq.buildNode('storage', {'xmlns': NS_INBOX}));
+
+ for(var i = 0; i < sessionStorage.length; i++) {
+ // Get the pointer values
+ var current = sessionStorage.key(i);
+
+ // If the pointer is on a stored message
+ if(explodeThis('_', current, 0) == 'inbox') {
+ // Get the values
+ var value = $(XMLFromString(sessionStorage.getItem(current)));
+
+ // Create the storage node
+ storage.appendChild(iq.buildNode('message', {
+ 'id': value.find('id').text().revertHtmlEnc(),
+ 'from': value.find('from').text().revertHtmlEnc(),
+ 'subject': value.find('subject').text().revertHtmlEnc(),
+ 'status': value.find('status').text().revertHtmlEnc(),
+ 'date': value.find('date').text().revertHtmlEnc(),
+ 'xmlns': NS_INBOX
+ },
+
+ value.find('content').text().revertHtmlEnc()
+ ));
+ }
+ }
+
+ con.send(iq);
+}
+
+// Creates a new normal message
+function newInboxMessage() {
+ // Init
+ var mPath = '#inbox .';
+
+ // Reset the previous buddy search
+ resetBuddySearch('#inbox .inbox-new-to');
+
+ // We switch the divs
+ $(mPath + 'inbox-results, #inbox .a-new-message, #inbox .a-delete-messages').hide();
+ $(mPath + 'inbox-new, #inbox .a-show-messages').show();
+
+ // We focus on the first input
+ $(document).oneTime(10, function() {
+ $(mPath + 'inbox-new-to-input').focus();
+ });
+
+ // We reset some stuffs
+ cleanNewInboxMessage();
+
+ return false;
+}
+
+// Cleans the inbox
+function cleanNewInboxMessage() {
+ // Init
+ var mPath = '#inbox .';
+
+ // We reset the forms
+ $(mPath + 'inbox-new-block:not(form) input, ' + mPath + 'inbox-new textarea').val('').removeClass('please-complete');
+ $(mPath + 'inbox-new-file a').remove();
+ $(mPath + 'inbox-new-file input').show();
+
+ // We close an eventual opened message
+ $(mPath + 'message-content').remove();
+ $(mPath + 'one-message').removeClass('message-reading');
+}
+
+// Sends a normal message
+function sendInboxMessage(to, subject, body) {
+ // We send the message
+ var mess = new JSJaCMessage();
+
+ // Main attributes
+ mess.setTo(to);
+ mess.setSubject(subject);
+ mess.setType('normal');
+
+ // Any file to attach?
+ var attached = '#inbox .inbox-new-file a.file';
+
+ if(exists(attached))
+ body += '\n' +
+ '\n' +
+ $(attached).attr('data-attachedtitle') + ' - ' + $(attached).attr('data-attachedhref');
+
+ // Set body
+ mess.setBody(body);
+
+ con.send(mess, handleErrorReply);
+}
+
+// Performs the normal message sender checks
+function checkInboxMessage() {
+ // We get some informations
+ var mPath = '#inbox ';
+ var to = $(mPath + '.inbox-new-to-input').val();
+ var body = $(mPath + '.inbox-new-textarea').val();
+ var subject = $(mPath + '.inbox-new-subject-input').val();
+
+ if(to && body && subject) {
+ // New array of XID
+ var xid = new Array(to);
+
+ // More than one XID
+ if(to.indexOf(',') != -1)
+ xid = to.split(',');
+
+ for(i in xid) {
+ var current = xid[i];
+
+ // No current value?
+ if(!current || current.match(/^(\s+)$/))
+ continue;
+
+ // Edit the XID if needed
+ current = current.replace(/ /g, '');
+ current = generateXID(current, 'chat');
+
+ // We send the message
+ sendInboxMessage(current, subject, body);
+
+ // We clean the inputs
+ cleanNewInboxMessage();
+
+ logThis('Inbox message sent: ' + current, 3);
+ }
+
+ // Close the inbox
+ closeInbox();
+ }
+
+ else {
+ $(mPath + 'input[type=text], ' + mPath + 'textarea').each(function() {
+ var current = this;
+
+ if(!$(current).val()) {
+ $(document).oneTime(10, function() {
+ $(current).addClass('please-complete').focus();
+ });
+ }
+
+ else
+ $(current).removeClass('please-complete');
+ });
+ }
+
+ return false;
+}
+
+// Shows the inbox messages
+function showInboxMessages() {
+ // Init
+ var mPath = '#inbox .';
+
+ // We switch the divs
+ $(mPath + 'inbox-new').hide();
+ $(mPath + 'inbox-results').show();
+
+ // We show a new link in the menu
+ $(mPath + 'a-show-messages').hide();
+ $(mPath + 'a-delete-messages').show();
+ $(mPath + 'a-new-message').show();
+
+ // We reset some stuffs
+ cleanNewInboxMessage();
+
+ return false;
+}
+
+// Displays a normal message
+function displayInboxMessage(from, subject, content, status, id, date) {
+ // Generate some paths
+ var inbox = '#inbox .';
+ var one_message = inbox + 'one-message.' + id;
+
+ // Message yet displayed!
+ if(exists(one_message))
+ return false;
+
+ // Get the nearest element
+ var stamp = extractStamp(Date.jab2date(date));
+ var nearest = sortElementByStamp(stamp, '#inbox .one-message');
+
+ // Get the buddy name
+ var name = getBuddyName(from).htmlEnc();
+
+ // We generate the html code
+ var nContent = '<div class="one-message message-' + status + ' ' + id + ' ' + hex_md5(from) + '" data-stamp="' + stamp + '">' +
+ '<div class="message-head">' +
+ '<div class="avatar-container">' +
+ '<img class="avatar" src="' + './img/others/default-avatar.png' + '" alt="" />' +
+ '</div>' +
+
+ '<div class="message-jid">' + name + '</div>' +
+ '<div class="message-subject">' + subject.htmlEnc() + '</div>' +
+
+ '<div class="message-truncated">' + truncate(noLines(content), 90).htmlEnc() + '</div>' +
+ '</div>' +
+ '</div>';
+
+ // Display the message
+ if(nearest == 0)
+ $(inbox + 'inbox-results .inbox').append(nContent);
+ else
+ $('#inbox .one-message[data-stamp=' + nearest + ']:first').before(nContent);
+
+ // Click events
+ $(one_message + ' .message-head').click(function() {
+ if(!exists(one_message + ' .message-content'))
+ revealInboxMessage(id, from, subject, content, name, date, status);
+ else
+ hideInboxMessage(id);
+
+ return false;
+ });
+
+ // Get the user avatar
+ getAvatar(from, 'cache', 'true', 'forget');
+
+ return true;
+}
+
+// Stores an inbox message
+function storeInboxMessage(from, subject, content, status, id, date) {
+ // Initialize the XML data
+ var xml = '<message><id>' + id.htmlEnc().htmlEnc() + '</id><date>' + date.htmlEnc().htmlEnc() + '</date><from>' + from.htmlEnc().htmlEnc() + '</from><subject>' + subject.htmlEnc().htmlEnc() + '</subject><status>' + status.htmlEnc().htmlEnc() + '</status><content>' + content.htmlEnc().htmlEnc() + '</content>';
+
+ // End the XML data
+ xml += '</message>';
+
+ // Store this message!
+ setDB('inbox', id, xml);
+}
+
+// Removes a given normal message
+function deleteInboxMessage(id) {
+ // Remove the message from the inbox
+ $('#inbox .one-message.' + id).remove();
+
+ // Remove the message from the database
+ removeDB('inbox', id);
+
+ // Check the unread messages
+ checkInboxMessages();
+
+ // Store the new inbox
+ storeInbox();
+
+ return false;
+}
+
+// Removes all the inbox messages
+function purgeInbox() {
+ // Remove all the messages from the database
+ for(var i = 0; i < sessionStorage.length; i++) {
+ // Get the pointer values
+ var current = sessionStorage.key(i);
+
+ // If the pointer is on a stored message
+ if(explodeThis('_', current, 0) == 'inbox')
+ removeDB('inbox', explodeThis('_', current, 1));
+ }
+
+ // Prevent the database lag
+ $(document).oneTime(100, function() {
+ // Store the new inbox
+ storeInbox();
+
+ // Remove all the messages from the inbox
+ $('#inbox .one-message').remove();
+
+ // Reload the inbox
+ loadInbox();
+ });
+
+ return false;
+}
+
+// Checks if there are new messages to be notified
+function checkInboxMessages() {
+ // Selectors
+ var inbox_link = '#top-content a.inbox-hidable';
+ var no_results = '#inbox .inbox-noresults';
+
+ // Marker
+ var has_messages = false;
+
+ // Read the number of unread messages
+ var unread = 0;
+
+ // Read the local inbox database
+ for(var i = 0; i < sessionStorage.length; i++) {
+ // Database pointer
+ var current = sessionStorage.key(i);
+
+ // Check inbox messages
+ if(explodeThis('_', current, 0) == 'inbox') {
+ // Read the current status
+ var status = $(XMLFromString(sessionStorage.getItem(current))).find('status').text();
+
+ // Found an unread message
+ if(status == 'unread')
+ unread++;
+
+ // Update the marker
+ has_messages = true;
+ }
+ }
+
+ // No message?
+ if(!has_messages)
+ $(no_results).show();
+ else
+ $(no_results).hide();
+
+ // Reset notifications
+ $(inbox_link + ' .notify').remove();
+
+ // Any unread message?
+ if(unread) {
+ // Notify the user
+ $(inbox_link).prepend('<div class="notify one-counter" data-counter="' + unread + '">' + unread + '</div>');
+
+ // Update the title
+ updateTitle();
+
+ return true;
+ }
+
+ // Anyway, update the title
+ updateTitle();
+
+ return false;
+}
+
+// Reveal a normal message content
+function revealInboxMessage(id, from, subject, content, name, date, status) {
+ // Message path
+ var all_message = '#inbox .one-message';
+ var one_message = all_message + '.' + id;
+ var one_content = one_message + ' .message-content';
+
+ // We reset all the other messages
+ $(all_message + ' .message-content').remove();
+ $(all_message).removeClass('message-reading');
+
+ // Message content
+ var html =
+ '<div class="message-content">' +
+ '<div class="message-body">' + filterThisMessage(content, name, true) + '</div>' +
+
+ '<div class="message-meta">' +
+ '<span class="date">' + parseDate(date) + '</span>' +
+
+ '<a href="#" class="reply one-button talk-images">' + _e("Reply") + '</a>' +
+ '<a href="#" class="remove one-button talk-images">' + _e("Delete") + '</a>' +
+
+ '<div class="clear">' +
+ '</div>' +
+ '</div>';
+
+ // Message content
+ html += '</div>';
+
+ $(one_message).append(html).addClass('message-reading');
+
+ // Click events
+ $(one_content + ' a.reply').click(function() {
+ return replyInboxMessage(id, from, subject, content);
+ });
+
+ $(one_content + ' a.remove').click(function() {
+ return deleteInboxMessage(id);
+ });
+
+ // Unread message
+ if(status == 'unread') {
+ // Update our database
+ var xml = getDB('inbox', id).replace(/<status>unread<\/status>/i,'<status>read</status>');
+ setDB('inbox', id, xml);
+
+ // Remove the unread class
+ $(one_message).removeClass('message-unread');
+
+ // Send it to the server!
+ storeInbox();
+ }
+
+ // Check the unread messages
+ checkInboxMessages();
+}
+
+// Hides a normal message content
+function hideInboxMessage(id) {
+ // Define the paths
+ var inbox = '#inbox .';
+ var one_message = inbox + 'one-message.' + id;
+
+ // Reset this message
+ $(one_message).removeClass('message-reading');
+ $(one_message + ' .message-content').remove();
+}
+
+// Replies to a given normal message
+function replyInboxMessage(id, from, subject, body) {
+ // We switch to the writing div
+ newInboxMessage();
+
+ // Inbox path
+ var inbox = '#inbox .';
+
+ // Generate the body
+ var body = '\n' + '____________' + '\n\n' + truncate(body, 120);
+
+ // We apply the generated values to the form
+ $(inbox + 'inbox-new-to-input').val(from);
+ $(inbox + 'inbox-new-subject-input').val(subject);
+
+ $(document).oneTime(10, function() {
+ $(inbox + 'inbox-new-textarea').val(body).focus().selectRange(1, 0);
+ });
+
+ return false;
+}
+
+// Loads the inbox messages
+function loadInbox() {
+ // Read the local database
+ for(var i = 0; i < sessionStorage.length; i++) {
+ // Get the pointer values
+ var current = sessionStorage.key(i);
+
+ // If the pointer is on a stored message
+ if(explodeThis('_', current, 0) == 'inbox') {
+ // Get the current value
+ var value = $(XMLFromString(sessionStorage.getItem(current)));
+
+ // Display the current message
+ displayInboxMessage(
+ value.find('from').text().revertHtmlEnc(),
+ value.find('subject').text().revertHtmlEnc(),
+ value.find('content').text().revertHtmlEnc(),
+ value.find('status').text().revertHtmlEnc(),
+ value.find('id').text().revertHtmlEnc(),
+ value.find('date').text().revertHtmlEnc()
+ );
+ }
+ }
+
+ // Check new messages
+ checkInboxMessages();
+}
+
+// Wait event for file attaching
+function waitInboxAttach() {
+ $('#inbox .wait').show();
+}
+
+// Success event for file attaching
+function handleInboxAttach(responseXML) {
+ // Data selector
+ var dData = $(responseXML).find('jappix');
+
+ // Process the returned data
+ if(dData.find('error').size()) {
+ openThisError(4);
+
+ logThis('Error while attaching the file: ' + dData.find('error').text(), 1);
+ }
+
+ else {
+ // Get the file values
+ var fName = dData.find('title').text();
+ var fType = dData.find('type').text();
+ var fURL = dData.find('href').text();
+
+ // Hide the attach link, show the unattach one
+ $('#inbox .inbox-new-file input').hide();
+ $('#inbox .inbox-new-file').append('<a class="file ' + encodeQuotes(fileCategory(explodeThis('/', fType, 1))) + ' talk-images" href="' + encodeQuotes(fURL) + '" target="_blank">' + fName.htmlEnc() + '</a><a href="#" class="remove one-button talk-images">' + _e("Remove") + '</a>');
+
+ // Set values to the file link
+ $('#inbox .inbox-new-file a.file').attr('data-attachedtitle', fName)
+ .attr('data-attachedhref', fURL);
+
+ // Click events
+ $('#inbox .inbox-new-file a.remove').click(function() {
+ $('#inbox .inbox-new-file a').remove();
+ $('#inbox .inbox-new-file input').show();
+
+ return false;
+ });
+
+ logThis('File attached.', 3);
+ }
+
+ // Reset the attach bubble
+ $('#inbox .inbox-new-file input[type=file]').val('');
+ $('#inbox .wait').hide();
+}
+
+// Plugin launcher
+function launchInbox() {
+ // Define the pats
+ var inbox = '#inbox .';
+
+ // Define the buddy search vars
+ var destination = inbox + 'inbox-new-to';
+ var dHovered = destination + ' ul li.hovered:first';
+
+ // Send the message when enter pressend
+ $(inbox + 'inbox-new input').keyup(function(e) {
+ if(e.keyCode == 13) {
+ if(exists(dHovered))
+ addBuddySearch(destination, $(dHovered).attr('data-xid'));
+ else
+ checkInboxMessage();
+ }
+ });
+
+ // Buddy search
+ $(inbox + 'inbox-new-to-input').keyup(function(e) {
+ if(e.keyCode != 13) {
+ // New buddy search
+ if((e.keyCode != 40) && (e.keyCode != 38))
+ createBuddySearch(destination);
+
+ // Navigating with keyboard in the results
+ arrowsBuddySearch(e, destination);
+ }
+ })
+
+ // Buddy search lost focus
+ .blur(function() {
+ if(!$(destination + ' ul').attr('mouse-hover'))
+ resetBuddySearch(destination);
+ })
+
+ // Buddy search got focus
+ .focus(function() {
+ var value = $(this).val();
+
+ // Add a comma at the end
+ if(value && !value.match(/^(.+)((,)(\s)?)$/))
+ $(this).val(value + ', ');
+ });
+
+ // Click events
+ $(inbox + 'a-delete-messages').click(purgeInbox);
+ $(inbox + 'a-new-message').click(newInboxMessage);
+ $(inbox + 'a-show-messages').click(showInboxMessages);
+ $(inbox + 'inbox-new-send a').click(checkInboxMessage);
+
+ $(inbox + 'bottom .finish').click(function() {
+ return closeInbox();
+ });
+
+ // File upload
+ var attach_options = {
+ dataType: 'xml',
+ beforeSubmit: waitInboxAttach,
+ success: handleInboxAttach
+ };
+
+ // Upload form submit event
+ $('#inbox .inbox-new-file').submit(function() {
+ if($('#inbox .wait').is(':hidden') && $('#inbox .inbox-new-file input[type=file]').val())
+ $(this).ajaxSubmit(attach_options);
+
+ return false;
+ });
+
+ // Upload input change event
+ $('#inbox .inbox-new-file input[type=file]').change(function() {
+ if($('#inbox .wait').is(':hidden') && $(this).val())
+ $('#inbox .inbox-new-file').ajaxSubmit(attach_options);
+
+ return false;
+ });
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the integratebox JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 03/12/11
+
+*/
+
+// Opens the integratebox popup
+function openIntegrateBox() {
+ // Popup HTML content
+ var html =
+ '<div class="top">' + _e("Media viewer") + '</div>' +
+
+ '<div class="content"></div>' +
+
+ '<div class="bottom">' +
+ '<div class="wait wait-medium"></div>' +
+
+ '<a href="#" class="finish close">' + _e("Close") + '</a>' +
+ '<a href="#" class="finish next disabled" title="' + _e("Next") + '">></a>' +
+ '<a href="#" class="finish previous disabled" title="' + _e("Previous") + '"><</a>' +
+ '</div>';
+
+ // Create the popup
+ createPopup('integratebox', html);
+
+ // Associate the events
+ launchIntegratebox();
+}
+
+// Closes the integratebox popup
+function closeIntegrateBox() {
+ // Destroy the popup
+ destroyPopup('integratebox');
+
+ return false;
+}
+
+// Generates the integratebox HTML code
+function codeIntegrateBox(serv, url) {
+ var code = '';
+
+ // Protocol to use
+ var protocol = 'http';
+
+ if(isHTTPS())
+ protocol = 'https';
+
+ // Legacy browser
+ var legacy = false;
+
+ if((BrowserDetect.browser == 'Explorer') && (BrowserDetect.version < 9))
+ legacy = true;
+
+ // Switch to get the good DOM code
+ switch(serv) {
+ case 'youtube':
+ if(legacy)
+ code = '<object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/' + url + '&autoplay=1"></param><embed src="http://www.youtube.com/v/' + encodeQuotes(url) + '&autoplay=1" type="application/x-shockwave-flash" width="640" height="385"></embed></object>';
+ else
+ code = '<object width="640" height="385" data="' + encodeQuotes(protocol) + '://www.youtube.com/embed/' + encodeQuotes(url) + '?autoplay=1" type="text/html"><a href="http://www.youtube.com/watch?v=' + encodeQuotes(url) + '" target="_blank">http://www.youtube.com/watch?v=' + encodeQuotes(url) + '</a></object>';
+
+ break;
+
+ case 'dailymotion':
+ code = '<object width="640" height="385"><param name="movie" value="http://www.dailymotion.com/swf/video/' + url + '&autoplay=1"></param><param name="allowFullScreen" value="false"></param><embed type="application/x-shockwave-flash" src="http://www.dailymotion.com/swf/video/' + encodeQuotes(url) + '&autoplay=1" width="640" height="385" allowfullscreen="true" allowscriptaccess="always"></embed></object>';
+
+ break;
+
+ case 'vimeo':
+ code = '<object width="640" height="385"><param name="allowfullscreen" value="true" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=' + encodeQuotes(url) + '&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1&autoplay=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=' + encodeQuotes(url) + '&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1&autoplay=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="385"></embed></object>';
+
+ break;
+
+ case 'theora':
+ case 'video':
+ code = '<video width="640" height="385" src="' + encodeQuotes(url) + '" controls autoplay><a href="' + encodeQuotes(url) + '" target="_blank">' + encodeQuotes(url) + '</a></video>';
+
+ break;
+
+ case 'vorbis':
+ case 'audio':
+ code = '<audio src="' + encodeQuotes(url) + '" controls autoplay><a href="' + encodeQuotes(url) + '" target="_blank">' + encodeQuotes(url) + '</a></audio>';
+
+ break;
+
+ case 'image':
+ code = '<a href="' + encodeQuotes(url) + '" target="_blank"><img alt="" src="' + encodeQuotes(url) + '" /></a>';
+
+ break;
+ }
+
+ return code;
+}
+
+// Applies a given integratebox element
+function applyIntegrateBox(url, service, url_list, services_list, comments_e_list, comments_n_list, width_style) {
+ // Close the integratebox
+ closeIntegrateBox();
+
+ // Media integration not wanted?
+ if(getDB('options', 'integratemedias') == '0')
+ return true;
+
+ // Apply the HTML code
+ var dom_code = codeIntegrateBox(service, url);
+
+ // Any code: apply it!
+ if(dom_code) {
+ // We show the integratebox
+ openIntegrateBox();
+
+ // We add the code to the DOM
+ $('#integratebox .content').prepend('<div class="one-media">' + dom_code + '</div>');
+
+ // Image waiting icon
+ if(service == 'image') {
+ var waitItem = $('#integratebox .wait');
+
+ // Show it while it is loading
+ waitItem.show();
+
+ // Hide it when it is loaded
+ $('#integratebox img').load(function() {
+ waitItem.hide();
+
+ // Center the image vertically
+ $(this).oneTime(10, function() {
+ $(this).css('margin-top', (($('#integratebox .content').height() - $(this).height()) / 2));
+ });
+ });
+ }
+
+ // Large style?
+ var comments_id = genID();
+
+ if(width_style == 'large') {
+ // Make the popup large
+ $('#integratebox .popup').addClass('large');
+
+ // Add the right content
+ $('#integratebox .content').after(
+ '<div class="comments" data-id="' + encodeQuotes(comments_id) + '">' +
+ '<div class="comments-content">' +
+ '<div class="one-comment loading"><span class="icon talk-images"></span>' + _e("Loading comments...") + '</div>' +
+ '</div>' +
+ '</div>'
+ );
+ }
+
+ // Previous and next items?
+ var url_array = stringToArray(url_list);
+ var services_array = stringToArray(services_list);
+ var comments_e_array = stringToArray(comments_e_list);
+ var comments_n_array = stringToArray(comments_n_list);
+ var index = indexArrayValue(url_array, url);
+
+ // Any comments?
+ if(exists('#integratebox .comments')) {
+ if(comments_e_array[index] && comments_n_array[index])
+ getCommentsMicroblog(comments_e_array[index], comments_n_array[index], comments_id);
+ else
+ $('#integratebox .comments .comments-content').html('<div class="one-comment loading"><span class="icon talk-images"></span>' + _e("Comments locked!") + '</div>');
+ }
+
+ // Get the previous values
+ var previous_url = url_array[index - 1];
+ var previous_services = services_array[index - 1];
+
+ // Get the next values
+ var next_url = url_array[index + 1];
+ var next_services = services_array[index + 1];
+
+ // Enable/disable buttons
+ if(previous_url && previous_services)
+ $('#integratebox .bottom .finish.previous').removeClass('disabled');
+ else
+ $('#integratebox .bottom .finish.previous').addClass('disabled');
+
+ if(next_url && next_services)
+ $('#integratebox .bottom .finish.next').removeClass('disabled');
+ else
+ $('#integratebox .bottom .finish.next').addClass('disabled');
+
+ // Click events
+ $('#integratebox .bottom .finish.previous, #integratebox .bottom .finish.next').click(function() {
+ // Not acceptable?
+ if($(this).is('.disabled'))
+ return false;
+
+ // Apply the event!
+ if($(this).is('.previous'))
+ applyIntegrateBox(previous_url, previous_services, url_list, services_list, comments_e_list, comments_n_list, width_style);
+ else
+ applyIntegrateBox(next_url, next_services, url_list, services_list, comments_e_list, comments_n_list, width_style);
+
+ return false;
+ });
+
+ if(width_style == 'large')
+ $('#integratebox .content a:has(img)').click(function() {
+ if(next_url && next_services)
+ applyIntegrateBox(next_url, next_services, url_list, services_list, comments_e_list, comments_n_list, width_style);
+
+ return false;
+ });
+
+ return false;
+ }
+
+ // Nothing: return true to be able to open the URL in a new tab
+ return true;
+}
+
+// Checks whether the file ext can use integratebox or not
+function canIntegrateBox(ext) {
+ // Can use?
+ if(ext && ((ext == 'jpg') || (ext == 'jpeg') || (ext == 'png') || (ext == 'gif') || (ext == 'ogg') || (ext == 'oga') || (ext == 'ogv')))
+ return true;
+
+ return false;
+}
+
+// Filters a string to apply the integratebox links
+function filterIntegrateBox(data) {
+ // Encapsulates the string into two <div /> elements
+ var xml = $('<div><div>' + data + '</div></div>').contents();
+
+ // Loop the <a /> elements
+ $(xml).find('a').each(function() {
+ // Initialize this element
+ var href = $(this).attr('href');
+ var to, url, service, event;
+
+ // XMPP ID
+ if(href.match(/^xmpp:(.+)/i))
+ to = RegExp.$1;
+
+ // YouTube video box
+ else if(href.match(/(\w{3,5})(:)(\S+)((\.youtube\.com\/watch(\?v|\?\S+v|\#\!v|\#\!\S+v)\=)|(youtu\.be\/))([^& ]+)((&\S)|(&\S)|\s|$)/gim)) {
+ url = RegExp.$8;
+ service = 'youtube';
+ }
+
+ // Dailymotion video box
+ else if(href.match(/(\w{3,5})(:)(\S+)\.dailymotion\.com\/video\/([\w\-]+)((\#[\w\-]+)|\s|$)/gim)) {
+ url = RegExp.$4;
+ service = 'dailymotion';
+ }
+
+ // Vimeo video box
+ else if(href.match(/((\w{3,5})(:)(\S+)(vimeo|www\.vimeo)\.com\/([\w\-]+))/gim)) {
+ url = RegExp.$1;
+ service = 'vimeo';
+ }
+
+ // Theora video box
+ else if(href.match(/((\w{3,5})(:)(\S+)(\.)(ogv|ogg))/gim)) {
+ url = RegExp.$1;
+ service = 'theora';
+ }
+
+ // Vorbis audio box
+ else if(href.match(/((\w{3,5})(:)(\S+)(\.oga))/gim)) {
+ url = RegExp.$1;
+ service = 'vorbis';
+ }
+
+ // Image box
+ else if(href.match(/((\w{3,5})(:)(\S+)(\.)(jpg|jpeg|png|gif|tif|bmp))/gim)) {
+ url = RegExp.$1;
+ service = 'image';
+ }
+
+ // Define the good event
+ if(to)
+ event = 'xmppLink(\'' + encodeOnclick(to) + '\')';
+ else if(url && service)
+ event = 'applyIntegrateBox(\'' + encodeOnclick(url) + '\', \'' + encodeOnclick(service) + '\')';
+
+ // Any click event to apply?
+ if(event) {
+ // Regenerate the link element (for onclick)
+ var new_a = '<a';
+ var element_a = (this);
+
+ // Attributes
+ $(element_a.attributes).each(function(index) {
+ // Read the current attribute
+ var current_attr = element_a.attributes[index];
+
+ // Apply the current attribute
+ new_a += ' ' + encodeQuotes(current_attr.name) + '="' + encodeQuotes(current_attr.value) + '"';
+ });
+
+ // Add onclick attribute
+ new_a += ' onclick="return ' + event + ';"';
+
+ // Value
+ new_a += '>' + $(this).text().htmlEnc() + '</a>';
+
+ // Replace it!
+ $(this).replaceWith(new_a);
+ }
+ });
+
+ // Regenerate the HTML code (include string into a div to be readable)
+ var string = $(xml).html();
+
+ return string;
+}
+
+// Plugin launcher
+function launchIntegratebox() {
+ // Click event
+ $('#integratebox .bottom .finish.close').click(closeIntegrateBox);
+}
+
+// Plugin keyup event
+$(document).keyup(function(e) {
+ // Previous item?
+ if((exists('#integratebox .bottom .finish.previous:not(.disabled)')) && (e.keyCode == 37)) {
+ $('#integratebox .bottom .finish.previous').click();
+
+ return false;
+ }
+
+ // Next item?
+ if((exists('#integratebox .bottom .finish.next:not(.disabled)')) && (e.keyCode == 39)) {
+ $('#integratebox .bottom .finish.next').click();
+
+ return false;
+ }
+});
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the interface JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 26/08/11
+
+*/
+
+// Changes the title of the document
+function pageTitle(title) {
+ // Anonymous mode?
+ var head_name = getName();
+
+ if(isAnonymous())
+ head_name = ANONYMOUS_ROOM + ' (' + _e("anonymous mode") + ')';
+
+ // We change the title to give essential informations
+ switch(title) {
+ case 'home':
+ document.title = SERVICE_NAME + ' ā¢ ' + _e("An open social network");
+
+ break;
+
+ case 'talk':
+ document.title = 'Jappix ā¢ ' + head_name;
+
+ break;
+
+ case 'new':
+ document.title = '[' + pendingEvents() + '] Jappix ā¢ ' + head_name;
+
+ break;
+
+ case 'wait':
+ document.title = 'Jappix ā¢ ' + _e("Please wait...");
+
+ break;
+ }
+}
+
+// Creates a general-wait item
+function showGeneralWait() {
+ // Item exists?
+ if(exists('#general-wait'))
+ return false;
+
+ // Generate the HTML code
+ var html =
+ '<div id="general-wait" class="removable">' +
+ '<div class="general-wait-content wait-big"></div>' +
+ '</div>';
+
+ // Append the HTML code
+ $('body').append(html);
+
+ return true;
+}
+
+// Removes the general-wait item
+function removeGeneralWait() {
+ $('#general-wait').remove();
+}
+
+// Generates a file upload valid form content
+function generateFileShare() {
+ return '<input type="hidden" name="MAX_FILE_SIZE" value="' + encodeQuotes(JAPPIX_MAX_FILE_SIZE) + '">' +
+ '<input type="hidden" name="user" value="' + encodeQuotes(getXID()) + '" />' +
+ '<input type="hidden" name="location" value="' + encodeQuotes(generateURL(JAPPIX_LOCATION)) + '" />' +
+ '<input type="hidden" name="id" value="' + (new Date()).getTime() + '" />' +
+ '<input type="file" name="file" required="" />' +
+ '<input type="submit" value="' + _e("Send") + '" />';
+}
+
+// Switches to the given chan
+function switchChan(id) {
+ if(exists('#' + id)) {
+ // We show the page-engine content
+ $('.page-engine-chan').hide();
+ $('#' + id).show();
+
+ // We edit the tab switcher
+ $('#page-switch .switcher').removeClass('activechan').addClass('chan');
+ $('#page-switch .' + id).addClass('activechan').removeClass('chan');
+
+ // Scroll down to the last message
+ if(id != 'channel')
+ autoScroll(id);
+
+ // Manage input focus
+ inputFocus();
+ }
+
+ return false;
+}
+
+// Loads the complete chat switcher
+function loadChatSwitch() {
+ // Path
+ var more_content = '#page-switch .more-content';
+
+ // Yet displayed?
+ if(exists(more_content))
+ return closeBubbles();
+
+ // Add the bubble
+ showBubble(more_content);
+
+ // Append the content
+ $('#page-switch .more').append(
+ '<div class="more-content bubble removable">' +
+ $('#page-switch .chans').html() +
+ '</div>'
+ );
+
+ return false;
+}
+
+// Puts the selected smiley in the good page-engine input
+function insertSmiley(smiley, hash) {
+ // We define the variables
+ var selector = $('#' + hash + ' .message-area');
+ var oValue = selector.val();
+
+ // Any old value?
+ if(oValue && !oValue.match(/^(.+)(\s)+$/))
+ oValue += ' ';
+
+ var nValue = oValue + smiley + ' ';
+
+ // Put the new value and focus on it
+ $(document).oneTime(10, function() {
+ selector.val(nValue).focus();
+ });
+
+ return false;
+}
+
+// Deletes all the associated elements of the chat we want to remove
+function deleteThisChat(hash) {
+ $('#' + hash + ', #page-switch .' + hash).remove();
+}
+
+// Closes the given chat
+function quitThisChat(xid, hash, type) {
+ if(type == 'groupchat') {
+ // Send our unavailable presence
+ sendPresence(xid + '/' + getMUCNick(hash), 'unavailable');
+
+ // Remove all presence database entries for this groupchat
+ for(var i = 0; i < sessionStorage.length; i++) {
+ // Get the pointer values
+ var current = sessionStorage.key(i);
+ var cXID = explodeThis('_', current, 1);
+
+ // If the pointer is on a presence from this groupchat
+ if((explodeThis('_', current, 0) == 'presence') && (bareXID(cXID) == xid)) {
+ // Generate the hash for the current XID
+ var cHash = hex_md5(cXID);
+
+ // Disable the message textarea
+ $('#' + cHash + ' .message-area').attr('disabled', true);
+
+ // Remove the presence for this XID
+ removeDB('presence', cXID);
+ presenceFunnel(cXID, cHash);
+ }
+ }
+ }
+
+ else
+ chatStateSend('gone', xid, hash);
+
+ // Get the chat ID which is before
+ var previous = $('#' + hash).prev().attr('id');
+
+ // Remove the chat
+ deleteThisChat(hash);
+
+ // Reset the switcher
+ if(!exists('#page-switch .switcher.activechan'))
+ switchChan(previous);
+
+ // Reset the notifications
+ chanCleanNotify(hash);
+
+ return false;
+}
+
+// Generates the chat logs
+function generateChatLog(xid, hash) {
+ // Get the main values
+ var path = '#' + hash + ' .';
+ var content = $(path + 'content').clone().contents();
+ var avatar = $(path + 'top .avatar-container:first').html();
+ var nick = $(path + 'top .bc-name').text();
+ var date = getXMPPTime('local');
+ var type = $('#' + hash).attr('data-type');
+
+ // Filter the content smileys
+ $(content).find('img.emoticon').each(function() {
+ $(this).replaceWith($(this).attr('alt'));
+ });
+
+ // Remove the useless attributes
+ $(content).removeAttr('data-type').removeAttr('data-stamp');
+
+ // Remove the content avatars
+ $(content).find('.avatar-container').remove();
+
+ // Remove the content click events
+ $(content).find('a').removeAttr('onclick');
+
+ // Extract the content HTML code
+ content = $(content).parent().html();
+
+ // No avatar?
+ if(!avatar || !avatar.match(/data:/))
+ avatar = 'none';
+
+ // POST the values to the server
+ $.post('./php/generate-chat.php', { content: content, xid: xid, nick: nick, avatar: avatar, date: date, type: type }, function(data) {
+ // Handled!
+ $(path + 'tooltip-waitlog').replaceWith('<a class="tooltip-actionlog" href="./php/download-chat.php?id=' + data + '" target="_blank">' + _e("Download file!") + '</a>');
+ });
+
+ return false;
+}
+
+// Notifies the user from a new incoming message
+function messageNotify(hash, type) {
+ // Initialize the vars
+ var chat_switch = '#page-switch .';
+ var tested = chat_switch + hash;
+ var active = $(tested).hasClass('activechan');
+
+ // We notify the user if he has not the focus on the chat
+ if(!active || !isFocused()) {
+ if(!active) {
+ if(type == 'personnal')
+ $(tested + ', ' + chat_switch + 'more-button').addClass('chan-newmessage');
+ else if(type == 'unread')
+ $(tested).addClass('chan-unread');
+ }
+
+ // Count the number of pending messages
+ var pending = 1;
+
+ if(exists('#' + hash + '[data-counter]'))
+ pending = parseInt($('#' + hash).attr('data-counter')) + 1;
+
+ $('#' + hash).attr('data-counter', pending);
+ }
+
+ // Update the page title
+ updateTitle();
+}
+
+// Returns the number of pending events
+function pendingEvents() {
+ // Count the number of notifications
+ var number = 0;
+
+ $('.one-counter[data-counter]').each(function() {
+ number = number + parseInt($(this).attr('data-counter'));
+ });
+
+ return number;
+}
+
+// Updates the page title
+function updateTitle() {
+ // Any pending events?
+ if(exists('.one-counter[data-counter]'))
+ pageTitle('new');
+ else
+ pageTitle('talk');
+}
+
+// Cleans the given chat notifications
+function chanCleanNotify(hash) {
+ // We remove the class that tell the user of a new message
+ var chat_switch = '#page-switch .';
+ $(chat_switch + hash).removeClass('chan-newmessage chan-unread');
+
+ // We reset the global notifications if no more unread messages
+ if(!$(chat_switch + 'chans .chan-newmessage').size())
+ $(chat_switch + 'more-button').removeClass('chan-newmessage');
+
+ // We reset the chat counter
+ $('#' + hash).removeAttr('data-counter');
+
+ // Update the page title
+ updateTitle();
+}
+
+// Scrolls to the last chat message
+function autoScroll(hash) {
+ // Avoid a JS error
+ if(exists('#' + hash)) {
+ var container = document.getElementById('chat-content-' + hash);
+
+ // Scroll down!
+ container.scrollTop = container.scrollHeight;
+ }
+}
+
+// Shows all the buddies in the buddy-list
+function showAllBuddies(from) {
+ // Put a marker
+ BLIST_ALL = true;
+
+ // We switch the two modes
+ $('.buddy-conf-more-display-unavailable').hide();
+ $('.buddy-conf-more-display-available').show();
+
+ // Security: reset all the groups toggle event
+ $('#buddy-list .group-buddies').show();
+ $('#buddy-list .group span').text('-');
+
+ // We show the disconnected buddies
+ $('.hidden-buddy').show();
+
+ // We show all the groups
+ $('#buddy-list .one-group').show();
+
+ if(SEARCH_FILTERED)
+ funnelFilterBuddySearch();
+
+ // Store this in the options
+ if((from == 'roster') && loadedOptions()) {
+ setDB('options', 'roster-showall', '1');
+ storeOptions();
+ }
+}
+
+// Shows only the online buddies in the buddy-list
+function showOnlineBuddies(from) {
+ // Remove the marker
+ BLIST_ALL = false;
+
+ // We switch the two modes
+ $('.buddy-conf-more-display-available').hide();
+ $('.buddy-conf-more-display-unavailable').show();
+
+ // Security: reset all the groups toggle event
+ $('#buddy-list .group-buddies').show();
+ $('#buddy-list .group span').text('-');
+
+ // We hide the disconnected buddies
+ $('.hidden-buddy').hide();
+
+ // We check the groups to hide
+ updateGroups();
+
+ if(SEARCH_FILTERED)
+ funnelFilterBuddySearch();
+
+ // Store this in the options
+ if((from == 'roster') && loadedOptions()) {
+ setDB('options', 'roster-showall', '0');
+ storeOptions();
+ }
+}
+
+// Focuses on the right input
+function inputFocus() {
+ // No popup shown
+ if(!exists('.popup'))
+ $(document).oneTime(10, function() {
+ $('.focusable:visible:first').focus();
+ });
+}
+
+// Plugin launcher
+function launchInterface() {
+ // Focus on the first visible input
+ $(window).focus(inputFocus);
+}
+
+// Launch this plugin!
+$(document).ready(launchInterface);
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the IQ JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 27/08/11
+
+*/
+
+// Handles an incoming IQ packet
+function handleIQ(iq) {
+ // Gets the IQ content
+ var iqNode = iq.getNode();
+ var iqFrom = fullXID(getStanzaFrom(iq));
+ var iqID = iq.getID();
+ var iqQueryXMLNS = iq.getQueryXMLNS();
+ var iqQuery = iq.getQuery();
+ var iqType = iq.getType();
+
+ // Build the response
+ var iqResponse = new JSJaCIQ();
+
+ iqResponse.setID(iqID);
+ iqResponse.setTo(iqFrom);
+ iqResponse.setType('result');
+
+ // OOB request
+ if((iqQueryXMLNS == NS_IQOOB) && (iqType == 'set')) {
+ /* REF: http://xmpp.org/extensions/xep-0066.html */
+
+ handleOOB(iqFrom, iqID, 'iq', iqNode);
+
+ logThis('Received IQ OOB request: ' + iqFrom);
+ }
+
+ // OOB reply
+ else if(getDB('send/url', iqID)) {
+ // Get the values
+ var oob_url = getDB('send/url', iqID);
+ var oob_desc = getDB('send/desc', iqID);
+ var notif_id = hex_md5(oob_url + oob_desc + iqType + iqFrom + iqID);
+
+ // Error?
+ if($(iqNode).find('error').size()) {
+ // Rejected?
+ if($(iqNode).find('error not-acceptable').size())
+ newNotification('send_reject', iqFrom, [iqFrom, oob_url, 'iq', iqID, iqNode], oob_desc, notif_id);
+
+ // Failed?
+ else
+ newNotification('send_fail', iqFrom, [iqFrom, oob_url, 'iq', iqID, iqNode], oob_desc, notif_id);
+
+ // Remove the file
+ $.get(oob_url + '&action=remove');
+ }
+
+ // Success?
+ else if(iqType == 'result')
+ newNotification('send_accept', iqFrom, [iqFrom, oob_url, 'iq', iqID, iqNode], oob_desc, notif_id);
+ }
+
+ // Software version query
+ else if((iqQueryXMLNS == NS_VERSION) && (iqType == 'get')) {
+ /* REF: http://xmpp.org/extensions/xep-0092.html */
+
+ var iqQuery = iqResponse.setQuery(NS_VERSION);
+
+ iqQuery.appendChild(iq.buildNode('name', {'xmlns': NS_VERSION}, 'Jappix'));
+ iqQuery.appendChild(iq.buildNode('version', {'xmlns': NS_VERSION}, JAPPIX_VERSION));
+ iqQuery.appendChild(iq.buildNode('os', {'xmlns': NS_VERSION}, BrowserDetect.OS));
+
+ con.send(iqResponse);
+
+ logThis('Received software version query: ' + iqFrom);
+ }
+
+ // Last activity query
+ else if((iqQueryXMLNS == NS_LAST) && (iqType == 'get')) {
+ /* REF: http://xmpp.org/extensions/xep-0012.html */
+
+ var iqQuery = iqResponse.setQuery(NS_LAST);
+ iqQuery.setAttribute('seconds', getLastActivity());
+
+ con.send(iqResponse);
+
+ logThis('Received last activity query: ' + iqFrom);
+ }
+
+ // Privacy lists push
+ else if((iqQueryXMLNS == NS_PRIVACY) && (iqType == 'set')) {
+ // REF : http://xmpp.org/extensions/xep-0016.html
+
+ // Roster push
+ con.send(iqResponse);
+
+ // Get the lists
+ $(iqQuery).find('list').each(function() {
+ getPrivacy($(this).attr('name'));
+ });
+
+ logThis('Received privacy lists push: ' + iqFrom);
+ }
+
+ // Roster push
+ else if((iqQueryXMLNS == NS_ROSTER) && (iqType == 'set')) {
+ // REF : http://xmpp.org/extensions/xep-0092.html
+
+ // Roster push
+ con.send(iqResponse);
+
+ // Get the values
+ $(iqQuery).find('item').each(function() {
+ parseRoster($(this), 'presence');
+ });
+
+ logThis('Received roster push: ' + iqFrom);
+ }
+
+ // Roster Item Exchange query
+ else if($(iqNode).find('x[xmlns=' + NS_ROSTERX + ']').size()) {
+ // Open a new notification
+ newNotification('rosterx', iqFrom, [iqNode], '');
+
+ logThis('Roster Item Exchange from: ' + iqFrom);
+ }
+
+ // Disco info query
+ else if((iqQueryXMLNS == NS_DISCO_INFO) && (iqType == 'get')) {
+ /* REF: http://xmpp.org/extensions/xep-0030.html */
+
+ var iqQuery = iqResponse.setQuery(NS_DISCO_INFO);
+
+ // We set the name of the client
+ iqQuery.appendChild(iq.buildNode('identity', {
+ 'category': 'client',
+ 'type': 'web',
+ 'name': 'Jappix',
+ 'xmlns': NS_DISCO_INFO
+ }));
+
+ // We set all the supported features
+ var fArray = myDiscoInfos();
+
+ for(i in fArray)
+ iqQuery.appendChild(iq.buildNode('feature', {'var': fArray[i], 'xmlns': NS_DISCO_INFO}));
+
+ con.send(iqResponse);
+
+ logThis('Received disco#infos query: ' + iqFrom);
+ }
+
+ // User time query
+ else if($(iqNode).find('time').size() && (iqType == 'get')) {
+ /* REF: http://xmpp.org/extensions/xep-0202.html */
+
+ var iqTime = iqResponse.appendNode('time', {'xmlns': NS_URN_TIME});
+ iqTime.appendChild(iq.buildNode('tzo', {'xmlns': NS_URN_TIME}, getDateTZO()));
+ iqTime.appendChild(iq.buildNode('utc', {'xmlns': NS_URN_TIME}, getXMPPTime('utc')));
+
+ con.send(iqResponse);
+
+ logThis('Received local time query: ' + iqFrom);
+ }
+
+ // Ping
+ else if($(iqNode).find('ping').size() && (iqType == 'get')) {
+ /* REF: http://xmpp.org/extensions/xep-0199.html */
+
+ con.send(iqResponse);
+
+ logThis('Received a ping: ' + iqFrom);
+ }
+
+ // Not implemented
+ else if(!$(iqNode).find('error').size() && ((iqType == 'get') || (iqType == 'set'))) {
+ // Append stanza content
+ for(var i = 0; i < iqNode.childNodes.length; i++)
+ iqResponse.getNode().appendChild(iqNode.childNodes.item(i).cloneNode(true));
+
+ // Append error content
+ var iqError = iqResponse.appendNode('error', {'xmlns': NS_CLIENT, 'code': '501', 'type': 'cancel'});
+ iqError.appendChild(iq.buildNode('feature-not-implemented', {'xmlns': NS_STANZAS}));
+ iqError.appendChild(iq.buildNode('text', {'xmlns': NS_STANZAS}, _e("The feature requested is not implemented by the recipient or server and therefore cannot be processed.")));
+
+ con.send(iqResponse);
+
+ logThis('Received an unsupported IQ query from: ' + iqFrom);
+ }
+}
--- /dev/null
+/*\r
+\r
+Jappix - An open social platform\r
+These are the datepicker JS script\r
+\r
+-------------------------------------------------\r
+\r
+Licenses: MIT, GPL, AGPL\r
+Authors: Stefan Petre, Vanaryon\r
+Last revision: 19/12/10\r
+\r
+*/\r
+\r
+(function ($) {\r
+ var DatePicker = function () {\r
+ var ids = {},\r
+ views = {\r
+ years: 'datepickerViewYears',\r
+ moths: 'datepickerViewMonths',\r
+ days: 'datepickerViewDays'\r
+ },\r
+ tpl = {\r
+ wrapper: '<div class="datepicker"><div class="datepickerBorderT" /><div class="datepickerBorderB" /><div class="datepickerBorderL" /><div class="datepickerBorderR" /><div class="datepickerBorderTL" /><div class="datepickerBorderTR" /><div class="datepickerBorderBL" /><div class="datepickerBorderBR" /><div class="datepickerContainer"><table cellspacing="0" cellpadding="0"><tbody><tr></tr></tbody></table></div></div>',\r
+ head: [\r
+ '<td>',\r
+ '<table cellspacing="0" cellpadding="0">',\r
+ '<thead>',\r
+ '<tr>',\r
+ '<th class="datepickerGoPrev"><a href="#"><span><%=prev%></span></a></th>',\r
+ '<th colspan="6" class="datepickerMonth"><a href="#"><span></span></a></th>',\r
+ '<th class="datepickerGoNext"><a href="#"><span><%=next%></span></a></th>',\r
+ '</tr>',\r
+ '<tr class="datepickerDoW">',\r
+ '<th><span><%=week%></span></th>',\r
+ '<th><span><%=day1%></span></th>',\r
+ '<th><span><%=day2%></span></th>',\r
+ '<th><span><%=day3%></span></th>',\r
+ '<th><span><%=day4%></span></th>',\r
+ '<th><span><%=day5%></span></th>',\r
+ '<th><span><%=day6%></span></th>',\r
+ '<th><span><%=day7%></span></th>',\r
+ '</tr>',\r
+ '</thead>',\r
+ '</table></td>'\r
+ ],\r
+ space : '<td class="datepickerSpace"><div></div></td>',\r
+ days: [\r
+ '<tbody class="datepickerDays">',\r
+ '<tr>',\r
+ '<th class="datepickerWeek"><a href="#"><span><%=weeks[0].week%></span></a></th>',\r
+ '<td class="<%=weeks[0].days[0].classname%>"><a href="#"><span><%=weeks[0].days[0].text%></span></a></td>',\r
+ '<td class="<%=weeks[0].days[1].classname%>"><a href="#"><span><%=weeks[0].days[1].text%></span></a></td>',\r
+ '<td class="<%=weeks[0].days[2].classname%>"><a href="#"><span><%=weeks[0].days[2].text%></span></a></td>',\r
+ '<td class="<%=weeks[0].days[3].classname%>"><a href="#"><span><%=weeks[0].days[3].text%></span></a></td>',\r
+ '<td class="<%=weeks[0].days[4].classname%>"><a href="#"><span><%=weeks[0].days[4].text%></span></a></td>',\r
+ '<td class="<%=weeks[0].days[5].classname%>"><a href="#"><span><%=weeks[0].days[5].text%></span></a></td>',\r
+ '<td class="<%=weeks[0].days[6].classname%>"><a href="#"><span><%=weeks[0].days[6].text%></span></a></td>',\r
+ '</tr>',\r
+ '<tr>',\r
+ '<th class="datepickerWeek"><a href="#"><span><%=weeks[1].week%></span></a></th>',\r
+ '<td class="<%=weeks[1].days[0].classname%>"><a href="#"><span><%=weeks[1].days[0].text%></span></a></td>',\r
+ '<td class="<%=weeks[1].days[1].classname%>"><a href="#"><span><%=weeks[1].days[1].text%></span></a></td>',\r
+ '<td class="<%=weeks[1].days[2].classname%>"><a href="#"><span><%=weeks[1].days[2].text%></span></a></td>',\r
+ '<td class="<%=weeks[1].days[3].classname%>"><a href="#"><span><%=weeks[1].days[3].text%></span></a></td>',\r
+ '<td class="<%=weeks[1].days[4].classname%>"><a href="#"><span><%=weeks[1].days[4].text%></span></a></td>',\r
+ '<td class="<%=weeks[1].days[5].classname%>"><a href="#"><span><%=weeks[1].days[5].text%></span></a></td>',\r
+ '<td class="<%=weeks[1].days[6].classname%>"><a href="#"><span><%=weeks[1].days[6].text%></span></a></td>',\r
+ '</tr>',\r
+ '<tr>',\r
+ '<th class="datepickerWeek"><a href="#"><span><%=weeks[2].week%></span></a></th>',\r
+ '<td class="<%=weeks[2].days[0].classname%>"><a href="#"><span><%=weeks[2].days[0].text%></span></a></td>',\r
+ '<td class="<%=weeks[2].days[1].classname%>"><a href="#"><span><%=weeks[2].days[1].text%></span></a></td>',\r
+ '<td class="<%=weeks[2].days[2].classname%>"><a href="#"><span><%=weeks[2].days[2].text%></span></a></td>',\r
+ '<td class="<%=weeks[2].days[3].classname%>"><a href="#"><span><%=weeks[2].days[3].text%></span></a></td>',\r
+ '<td class="<%=weeks[2].days[4].classname%>"><a href="#"><span><%=weeks[2].days[4].text%></span></a></td>',\r
+ '<td class="<%=weeks[2].days[5].classname%>"><a href="#"><span><%=weeks[2].days[5].text%></span></a></td>',\r
+ '<td class="<%=weeks[2].days[6].classname%>"><a href="#"><span><%=weeks[2].days[6].text%></span></a></td>',\r
+ '</tr>',\r
+ '<tr>',\r
+ '<th class="datepickerWeek"><a href="#"><span><%=weeks[3].week%></span></a></th>',\r
+ '<td class="<%=weeks[3].days[0].classname%>"><a href="#"><span><%=weeks[3].days[0].text%></span></a></td>',\r
+ '<td class="<%=weeks[3].days[1].classname%>"><a href="#"><span><%=weeks[3].days[1].text%></span></a></td>',\r
+ '<td class="<%=weeks[3].days[2].classname%>"><a href="#"><span><%=weeks[3].days[2].text%></span></a></td>',\r
+ '<td class="<%=weeks[3].days[3].classname%>"><a href="#"><span><%=weeks[3].days[3].text%></span></a></td>',\r
+ '<td class="<%=weeks[3].days[4].classname%>"><a href="#"><span><%=weeks[3].days[4].text%></span></a></td>',\r
+ '<td class="<%=weeks[3].days[5].classname%>"><a href="#"><span><%=weeks[3].days[5].text%></span></a></td>',\r
+ '<td class="<%=weeks[3].days[6].classname%>"><a href="#"><span><%=weeks[3].days[6].text%></span></a></td>',\r
+ '</tr>',\r
+ '<tr>',\r
+ '<th class="datepickerWeek"><a href="#"><span><%=weeks[4].week%></span></a></th>',\r
+ '<td class="<%=weeks[4].days[0].classname%>"><a href="#"><span><%=weeks[4].days[0].text%></span></a></td>',\r
+ '<td class="<%=weeks[4].days[1].classname%>"><a href="#"><span><%=weeks[4].days[1].text%></span></a></td>',\r
+ '<td class="<%=weeks[4].days[2].classname%>"><a href="#"><span><%=weeks[4].days[2].text%></span></a></td>',\r
+ '<td class="<%=weeks[4].days[3].classname%>"><a href="#"><span><%=weeks[4].days[3].text%></span></a></td>',\r
+ '<td class="<%=weeks[4].days[4].classname%>"><a href="#"><span><%=weeks[4].days[4].text%></span></a></td>',\r
+ '<td class="<%=weeks[4].days[5].classname%>"><a href="#"><span><%=weeks[4].days[5].text%></span></a></td>',\r
+ '<td class="<%=weeks[4].days[6].classname%>"><a href="#"><span><%=weeks[4].days[6].text%></span></a></td>',\r
+ '</tr>',\r
+ '<tr>',\r
+ '<th class="datepickerWeek"><a href="#"><span><%=weeks[5].week%></span></a></th>',\r
+ '<td class="<%=weeks[5].days[0].classname%>"><a href="#"><span><%=weeks[5].days[0].text%></span></a></td>',\r
+ '<td class="<%=weeks[5].days[1].classname%>"><a href="#"><span><%=weeks[5].days[1].text%></span></a></td>',\r
+ '<td class="<%=weeks[5].days[2].classname%>"><a href="#"><span><%=weeks[5].days[2].text%></span></a></td>',\r
+ '<td class="<%=weeks[5].days[3].classname%>"><a href="#"><span><%=weeks[5].days[3].text%></span></a></td>',\r
+ '<td class="<%=weeks[5].days[4].classname%>"><a href="#"><span><%=weeks[5].days[4].text%></span></a></td>',\r
+ '<td class="<%=weeks[5].days[5].classname%>"><a href="#"><span><%=weeks[5].days[5].text%></span></a></td>',\r
+ '<td class="<%=weeks[5].days[6].classname%>"><a href="#"><span><%=weeks[5].days[6].text%></span></a></td>',\r
+ '</tr>',\r
+ '</tbody>'\r
+ ],\r
+ months: [\r
+ '<tbody class="<%=className%>">',\r
+ '<tr>',\r
+ '<td colspan="2"><a href="#"><span><%=data[0]%></span></a></td>',\r
+ '<td colspan="2"><a href="#"><span><%=data[1]%></span></a></td>',\r
+ '<td colspan="2"><a href="#"><span><%=data[2]%></span></a></td>',\r
+ '<td colspan="2"><a href="#"><span><%=data[3]%></span></a></td>',\r
+ '</tr>',\r
+ '<tr>',\r
+ '<td colspan="2"><a href="#"><span><%=data[4]%></span></a></td>',\r
+ '<td colspan="2"><a href="#"><span><%=data[5]%></span></a></td>',\r
+ '<td colspan="2"><a href="#"><span><%=data[6]%></span></a></td>',\r
+ '<td colspan="2"><a href="#"><span><%=data[7]%></span></a></td>',\r
+ '</tr>',\r
+ '<tr>',\r
+ '<td colspan="2"><a href="#"><span><%=data[8]%></span></a></td>',\r
+ '<td colspan="2"><a href="#"><span><%=data[9]%></span></a></td>',\r
+ '<td colspan="2"><a href="#"><span><%=data[10]%></span></a></td>',\r
+ '<td colspan="2"><a href="#"><span><%=data[11]%></span></a></td>',\r
+ '</tr>',\r
+ '</tbody>'\r
+ ]\r
+ },\r
+ defaults = {\r
+ flat: false,\r
+ starts: 1,\r
+ prev: '◀',\r
+ next: '▶',\r
+ lastSel: false,\r
+ mode: 'single',\r
+ view: 'days',\r
+ calendars: 1,\r
+ format: 'Y-m-d',\r
+ position: 'bottom',\r
+ eventName: 'click',\r
+ onRender: function(){return {};},\r
+ onChange: function(){return true;},\r
+ onShow: function(){return true;},\r
+ onBeforeShow: function(){return true;},\r
+ onHide: function(){return true;},\r
+ locale: {\r
+ days: [_e("Sunday"), _e("Monday"), _e("Tuesday"), _e("Wednesday"), _e("Thursday"), _e("Friday"), _e("Saturday"), _e("Sunday")],\r
+ daysShort: [cut(_e("Sunday"), 3), cut(_e("Monday"), 3), cut(_e("Tuesday"), 3), cut(_e("Wednesday"), 3), cut(_e("Thursday"), 3), cut(_e("Friday"), 3), cut(_e("Saturday"), 3), cut(_e("Sunday"), 3)],\r
+ daysMin: [cut(_e("Sunday"), 2), cut(_e("Monday"), 2), cut(_e("Tuesday"), 2), cut(_e("Wednesday"), 2), cut(_e("Thursday"), 2), cut(_e("Friday"), 2), cut(_e("Saturday"), 2), cut(_e("Sunday"), 2)],\r
+ months: [_e("January"), _e("February"), _e("March"), _e("April"), _e("May"), _e("June"), _e("July"), _e("August"), _e("September"), _e("October"), _e("November"), _e("December")],\r
+ monthsShort: [cut(_e("January"), 3), cut(_e("February"), 3), cut(_e("March"), 3), cut(_e("April"), 3), cut(_e("May"), 3), cut(_e("June"), 3), cut(_e("July"), 3), cut(_e("August"), 3), cut(_e("September"), 3), cut(_e("October"), 3), cut(_e("November"), 3), cut(_e("December"), 3)],\r
+ weekMin: ''\r
+ }\r
+ },\r
+ fill = function(el) {\r
+ var options = $(el).data('datepicker');\r
+ var cal = $(el);\r
+ var currentCal = Math.floor(options.calendars/2), date, data, dow, month, cnt = 0, week, days, indic, indic2, html, tblCal;\r
+ cal.find('td>table tbody').remove();\r
+ for (var i = 0; i < options.calendars; i++) {\r
+ date = new Date(options.current);\r
+ date.addMonths(-currentCal + i);\r
+ tblCal = cal.find('table').eq(i+1);\r
+ switch (tblCal[0].className) {\r
+ case 'datepickerViewDays':\r
+ dow = formatDate(date, 'B, Y');\r
+ break;\r
+ case 'datepickerViewMonths':\r
+ dow = date.getFullYear();\r
+ break;\r
+ case 'datepickerViewYears':\r
+ dow = (date.getFullYear()-6) + ' - ' + (date.getFullYear()+5);\r
+ break;\r
+ } \r
+ tblCal.find('thead tr:first th:eq(1) span').text(dow);\r
+ dow = date.getFullYear()-6;\r
+ data = {\r
+ data: [],\r
+ className: 'datepickerYears'\r
+ }\r
+ for ( var j = 0; j < 12; j++) {\r
+ data.data.push(dow + j);\r
+ }\r
+ html = tmpl(tpl.months.join(''), data);\r
+ date.setDate(1);\r
+ data = {weeks:[], test: 10};\r
+ month = date.getMonth();\r
+ var dow = (date.getDay() - options.starts) % 7;\r
+ date.addDays(-(dow + (dow < 0 ? 7 : 0)));\r
+ week = -1;\r
+ cnt = 0;\r
+ while (cnt < 42) {\r
+ indic = parseInt(cnt/7,10);\r
+ indic2 = cnt%7;\r
+ if (!data.weeks[indic]) {\r
+ week = date.getWeekNumber();\r
+ data.weeks[indic] = {\r
+ week: week,\r
+ days: []\r
+ };\r
+ }\r
+ data.weeks[indic].days[indic2] = {\r
+ text: date.getDate(),\r
+ classname: []\r
+ };\r
+ if (month != date.getMonth()) {\r
+ data.weeks[indic].days[indic2].classname.push('datepickerNotInMonth');\r
+ }\r
+ if (date.getDay() == 0) {\r
+ data.weeks[indic].days[indic2].classname.push('datepickerSunday');\r
+ }\r
+ if (date.getDay() == 6) {\r
+ data.weeks[indic].days[indic2].classname.push('datepickerSaturday');\r
+ }\r
+ var fromUser = options.onRender(date);\r
+ var val = date.valueOf();\r
+ if (fromUser.selected || options.date == val || $.inArray(val, options.date) > -1 || (options.mode == 'range' && val >= options.date[0] && val <= options.date[1])) {\r
+ data.weeks[indic].days[indic2].classname.push('datepickerSelected');\r
+ }\r
+ if (fromUser.disabled) {\r
+ data.weeks[indic].days[indic2].classname.push('datepickerDisabled');\r
+ }\r
+ if (fromUser.className) {\r
+ data.weeks[indic].days[indic2].classname.push(fromUser.className);\r
+ }\r
+ data.weeks[indic].days[indic2].classname = data.weeks[indic].days[indic2].classname.join(' ');\r
+ cnt++;\r
+ date.addDays(1);\r
+ }\r
+ html = tmpl(tpl.days.join(''), data) + html;\r
+ data = {\r
+ data: options.locale.monthsShort,\r
+ className: 'datepickerMonths'\r
+ };\r
+ html = tmpl(tpl.months.join(''), data) + html;\r
+ tblCal.append(html);\r
+ }\r
+ },\r
+ parseDate = function (date, format) {\r
+ if (date.constructor == Date) {\r
+ return new Date(date);\r
+ }\r
+ var parts = date.split(/\W+/);\r
+ var against = format.split(/\W+/), d, m, y, h, min, now = new Date();\r
+ for (var i = 0; i < parts.length; i++) {\r
+ switch (against[i]) {\r
+ case 'd':\r
+ case 'e':\r
+ d = parseInt(parts[i],10);\r
+ break;\r
+ case 'm':\r
+ m = parseInt(parts[i], 10)-1;\r
+ break;\r
+ case 'Y':\r
+ case 'y':\r
+ y = parseInt(parts[i], 10);\r
+ y += y > 100 ? 0 : (y < 29 ? 2000 : 1900);\r
+ break;\r
+ case 'H':\r
+ case 'I':\r
+ case 'k':\r
+ case 'l':\r
+ h = parseInt(parts[i], 10);\r
+ break;\r
+ case 'P':\r
+ case 'p':\r
+ if (/pm/i.test(parts[i]) && h < 12) {\r
+ h += 12;\r
+ } else if (/am/i.test(parts[i]) && h >= 12) {\r
+ h -= 12;\r
+ }\r
+ break;\r
+ case 'M':\r
+ min = parseInt(parts[i], 10);\r
+ break;\r
+ }\r
+ }\r
+ return new Date(\r
+ y === undefined ? now.getFullYear() : y,\r
+ m === undefined ? now.getMonth() : m,\r
+ d === undefined ? now.getDate() : d,\r
+ h === undefined ? now.getHours() : h,\r
+ min === undefined ? now.getMinutes() : min,\r
+ 0\r
+ );\r
+ },\r
+ formatDate = function(date, format) {\r
+ var m = date.getMonth();\r
+ var d = date.getDate();\r
+ var y = date.getFullYear();\r
+ var wn = date.getWeekNumber();\r
+ var w = date.getDay();\r
+ var s = {};\r
+ var hr = date.getHours();\r
+ var pm = (hr >= 12);\r
+ var ir = (pm) ? (hr - 12) : hr;\r
+ var dy = date.getDayOfYear();\r
+ if (ir == 0) {\r
+ ir = 12;\r
+ }\r
+ var min = date.getMinutes();\r
+ var sec = date.getSeconds();\r
+ var parts = format.split(''), part;\r
+ for ( var i = 0; i < parts.length; i++ ) {\r
+ part = parts[i];\r
+ switch (parts[i]) {\r
+ case 'a':\r
+ part = date.getDayName();\r
+ break;\r
+ case 'A':\r
+ part = date.getDayName(true);\r
+ break;\r
+ case 'b':\r
+ part = date.getMonthName();\r
+ break;\r
+ case 'B':\r
+ part = date.getMonthName(true);\r
+ break;\r
+ case 'C':\r
+ part = 1 + Math.floor(y / 100);\r
+ break;\r
+ case 'd':\r
+ part = (d < 10) ? ("0" + d) : d;\r
+ break;\r
+ case 'e':\r
+ part = d;\r
+ break;\r
+ case 'H':\r
+ part = (hr < 10) ? ("0" + hr) : hr;\r
+ break;\r
+ case 'I':\r
+ part = (ir < 10) ? ("0" + ir) : ir;\r
+ break;\r
+ case 'j':\r
+ part = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy;\r
+ break;\r
+ case 'k':\r
+ part = hr;\r
+ break;\r
+ case 'l':\r
+ part = ir;\r
+ break;\r
+ case 'm':\r
+ part = (m < 9) ? ("0" + (1+m)) : (1+m);\r
+ break;\r
+ case 'M':\r
+ part = (min < 10) ? ("0" + min) : min;\r
+ break;\r
+ case 'p':\r
+ case 'P':\r
+ part = pm ? "PM" : "AM";\r
+ break;\r
+ case 's':\r
+ part = Math.floor(date.getTime() / 1000);\r
+ break;\r
+ case 'S':\r
+ part = (sec < 10) ? ("0" + sec) : sec;\r
+ break;\r
+ case 'u':\r
+ part = w + 1;\r
+ break;\r
+ case 'w':\r
+ part = w;\r
+ break;\r
+ case 'y':\r
+ part = ('' + y).substr(2, 2);\r
+ break;\r
+ case 'Y':\r
+ part = y;\r
+ break;\r
+ }\r
+ parts[i] = part;\r
+ }\r
+ return parts.join('');\r
+ },\r
+ extendDate = function(options) {\r
+ if (Date.prototype.tempDate) {\r
+ return;\r
+ }\r
+ Date.prototype.tempDate = null;\r
+ Date.prototype.months = options.months;\r
+ Date.prototype.monthsShort = options.monthsShort;\r
+ Date.prototype.days = options.days;\r
+ Date.prototype.daysShort = options.daysShort;\r
+ Date.prototype.getMonthName = function(fullName) {\r
+ return this[fullName ? 'months' : 'monthsShort'][this.getMonth()];\r
+ };\r
+ Date.prototype.getDayName = function(fullName) {\r
+ return this[fullName ? 'days' : 'daysShort'][this.getDay()];\r
+ };\r
+ Date.prototype.addDays = function (n) {\r
+ this.setDate(this.getDate() + n);\r
+ this.tempDate = this.getDate();\r
+ };\r
+ Date.prototype.addMonths = function (n) {\r
+ if (this.tempDate == null) {\r
+ this.tempDate = this.getDate();\r
+ }\r
+ this.setDate(1);\r
+ this.setMonth(this.getMonth() + n);\r
+ this.setDate(Math.min(this.tempDate, this.getMaxDays()));\r
+ };\r
+ Date.prototype.addYears = function (n) {\r
+ if (this.tempDate == null) {\r
+ this.tempDate = this.getDate();\r
+ }\r
+ this.setDate(1);\r
+ this.setFullYear(this.getFullYear() + n);\r
+ this.setDate(Math.min(this.tempDate, this.getMaxDays()));\r
+ };\r
+ Date.prototype.getMaxDays = function() {\r
+ var tmpDate = new Date(Date.parse(this)),\r
+ d = 28, m;\r
+ m = tmpDate.getMonth();\r
+ d = 28;\r
+ while (tmpDate.getMonth() == m) {\r
+ d ++;\r
+ tmpDate.setDate(d);\r
+ }\r
+ return d - 1;\r
+ };\r
+ Date.prototype.getFirstDay = function() {\r
+ var tmpDate = new Date(Date.parse(this));\r
+ tmpDate.setDate(1);\r
+ return tmpDate.getDay();\r
+ };\r
+ Date.prototype.getWeekNumber = function() {\r
+ var tempDate = new Date(this);\r
+ tempDate.setDate(tempDate.getDate() - (tempDate.getDay() + 6) % 7 + 3);\r
+ var dms = tempDate.valueOf();\r
+ tempDate.setMonth(0);\r
+ tempDate.setDate(4);\r
+ return Math.round((dms - tempDate.valueOf()) / (604800000)) + 1;\r
+ };\r
+ Date.prototype.getDayOfYear = function() {\r
+ var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);\r
+ var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0);\r
+ var time = now - then;\r
+ return Math.floor(time / 24*60*60*1000);\r
+ };\r
+ },\r
+ layout = function (el) {\r
+ var options = $(el).data('datepicker');\r
+ var cal = $('#' + options.id);\r
+ if (!options.extraHeight) {\r
+ var divs = $(el).find('div');\r
+ options.extraHeight = divs.get(0).offsetHeight + divs.get(1).offsetHeight;\r
+ options.extraWidth = divs.get(2).offsetWidth + divs.get(3).offsetWidth;\r
+ }\r
+ var tbl = cal.find('table:first').get(0);\r
+ var width = tbl.offsetWidth;\r
+ var height = tbl.offsetHeight;\r
+ cal.css({\r
+ width: width + options.extraWidth + 'px',\r
+ height: height + options.extraHeight + 'px'\r
+ }).find('div.datepickerContainer').css({\r
+ width: width + 'px',\r
+ height: height + 'px'\r
+ });\r
+ },\r
+ click = function(ev) {\r
+ if ($(ev.target).is('span')) {\r
+ ev.target = ev.target.parentNode;\r
+ }\r
+ var el = $(ev.target);\r
+ if (el.is('a')) {\r
+ ev.target.blur();\r
+ if (el.hasClass('datepickerDisabled')) {\r
+ return false;\r
+ }\r
+ var options = $(this).data('datepicker');\r
+ var parentEl = el.parent();\r
+ var tblEl = parentEl.parent().parent().parent();\r
+ var tblIndex = $('table', this).index(tblEl.get(0)) - 1;\r
+ var tmp = new Date(options.current);\r
+ var changed = false;\r
+ var fillIt = false;\r
+ if (parentEl.is('th')) {\r
+ if (parentEl.hasClass('datepickerWeek') && options.mode == 'range' && !parentEl.next().hasClass('datepickerDisabled')) {\r
+ var val = parseInt(parentEl.next().text(), 10);\r
+ tmp.addMonths(tblIndex - Math.floor(options.calendars/2));\r
+ if (parentEl.next().hasClass('datepickerNotInMonth')) {\r
+ tmp.addMonths(val > 15 ? -1 : 1);\r
+ }\r
+ tmp.setDate(val);\r
+ options.date[0] = (tmp.setHours(0,0,0,0)).valueOf();\r
+ tmp.setHours(23,59,59,0);\r
+ tmp.addDays(6);\r
+ options.date[1] = tmp.valueOf();\r
+ fillIt = true;\r
+ changed = true;\r
+ options.lastSel = false;\r
+ } else if (parentEl.hasClass('datepickerMonth')) {\r
+ tmp.addMonths(tblIndex - Math.floor(options.calendars/2));\r
+ switch (tblEl.get(0).className) {\r
+ case 'datepickerViewDays':\r
+ tblEl.get(0).className = 'datepickerViewMonths';\r
+ el.find('span').text(tmp.getFullYear());\r
+ break;\r
+ case 'datepickerViewMonths':\r
+ tblEl.get(0).className = 'datepickerViewYears';\r
+ el.find('span').text((tmp.getFullYear()-6) + ' - ' + (tmp.getFullYear()+5));\r
+ break;\r
+ case 'datepickerViewYears':\r
+ tblEl.get(0).className = 'datepickerViewDays';\r
+ el.find('span').text(formatDate(tmp, 'B, Y'));\r
+ break;\r
+ }\r
+ } else if (parentEl.parent().parent().is('thead')) {\r
+ switch (tblEl.get(0).className) {\r
+ case 'datepickerViewDays':\r
+ options.current.addMonths(parentEl.hasClass('datepickerGoPrev') ? -1 : 1);\r
+ break;\r
+ case 'datepickerViewMonths':\r
+ options.current.addYears(parentEl.hasClass('datepickerGoPrev') ? -1 : 1);\r
+ break;\r
+ case 'datepickerViewYears':\r
+ options.current.addYears(parentEl.hasClass('datepickerGoPrev') ? -12 : 12);\r
+ break;\r
+ }\r
+ fillIt = true;\r
+ }\r
+ } else if (parentEl.is('td') && !parentEl.hasClass('datepickerDisabled')) {\r
+ switch (tblEl.get(0).className) {\r
+ case 'datepickerViewMonths':\r
+ options.current.setMonth(tblEl.find('tbody.datepickerMonths td').index(parentEl));\r
+ options.current.setFullYear(parseInt(tblEl.find('thead th.datepickerMonth span').text(), 10));\r
+ options.current.addMonths(Math.floor(options.calendars/2) - tblIndex);\r
+ tblEl.get(0).className = 'datepickerViewDays';\r
+ break;\r
+ case 'datepickerViewYears':\r
+ options.current.setFullYear(parseInt(el.text(), 10));\r
+ tblEl.get(0).className = 'datepickerViewMonths';\r
+ break;\r
+ default:\r
+ var val = parseInt(el.text(), 10);\r
+ tmp.addMonths(tblIndex - Math.floor(options.calendars/2));\r
+ if (parentEl.hasClass('datepickerNotInMonth')) {\r
+ tmp.addMonths(val > 15 ? -1 : 1);\r
+ }\r
+ tmp.setDate(val);\r
+ switch (options.mode) {\r
+ case 'multiple':\r
+ val = (tmp.setHours(0,0,0,0)).valueOf();\r
+ if ($.inArray(val, options.date) > -1) {\r
+ $.each(options.date, function(nr, dat){\r
+ if (dat == val) {\r
+ options.date.splice(nr,1);\r
+ return false;\r
+ }\r
+ });\r
+ } else {\r
+ options.date.push(val);\r
+ }\r
+ break;\r
+ case 'range':\r
+ if (!options.lastSel) {\r
+ options.date[0] = (tmp.setHours(0,0,0,0)).valueOf();\r
+ }\r
+ val = (tmp.setHours(23,59,59,0)).valueOf();\r
+ if (val < options.date[0]) {\r
+ options.date[1] = options.date[0] + 86399000;\r
+ options.date[0] = val - 86399000;\r
+ } else {\r
+ options.date[1] = val;\r
+ }\r
+ options.lastSel = !options.lastSel;\r
+ break;\r
+ default:\r
+ options.date = tmp.valueOf();\r
+ break;\r
+ }\r
+ break;\r
+ }\r
+ fillIt = true;\r
+ changed = true;\r
+ }\r
+ if (fillIt) {\r
+ fill(this);\r
+ }\r
+ if (changed) {\r
+ options.onChange.apply(this, prepareDate(options));\r
+ }\r
+ }\r
+ return false;\r
+ },\r
+ prepareDate = function (options) {\r
+ var tmp;\r
+ if (options.mode == 'single') {\r
+ tmp = new Date(options.date);\r
+ return [formatDate(tmp, options.format), tmp, options.el];\r
+ } else {\r
+ tmp = [[],[], options.el];\r
+ $.each(options.date, function(nr, val){\r
+ var date = new Date(val);\r
+ tmp[0].push(formatDate(date, options.format));\r
+ tmp[1].push(date);\r
+ });\r
+ return tmp;\r
+ }\r
+ },\r
+ getViewport = function () {\r
+ var m = document.compatMode == 'CSS1Compat';\r
+ return {\r
+ l : window.pageXOffset || (m ? document.documentElement.scrollLeft : document.body.scrollLeft),\r
+ t : window.pageYOffset || (m ? document.documentElement.scrollTop : document.body.scrollTop),\r
+ w : window.innerWidth || (m ? document.documentElement.clientWidth : document.body.clientWidth),\r
+ h : window.innerHeight || (m ? document.documentElement.clientHeight : document.body.clientHeight)\r
+ };\r
+ },\r
+ isChildOf = function(parentEl, el, container) {\r
+ if (parentEl == el) {\r
+ return true;\r
+ }\r
+ if (parentEl.contains) {\r
+ return parentEl.contains(el);\r
+ }\r
+ if ( parentEl.compareDocumentPosition ) {\r
+ return !!(parentEl.compareDocumentPosition(el) & 16);\r
+ }\r
+ var prEl = el.parentNode;\r
+ while(prEl && prEl != container) {\r
+ if (prEl == parentEl)\r
+ return true;\r
+ prEl = prEl.parentNode;\r
+ }\r
+ return false;\r
+ },\r
+ show = function (ev) {\r
+ var cal = $('#' + $(this).data('datepickerId'));\r
+ if (!cal.is(':visible')) {\r
+ var calEl = cal.get(0);\r
+ fill(calEl);\r
+ var options = cal.data('datepicker');\r
+ options.onBeforeShow.apply(this, [cal.get(0)]);\r
+ var pos = $(this).offset();\r
+ var viewPort = getViewport();\r
+ var top = pos.top;\r
+ var left = pos.left;\r
+ var oldDisplay = $.curCSS(calEl, 'display');\r
+ cal.css({\r
+ visibility: 'hidden',\r
+ display: 'block'\r
+ });\r
+ layout(calEl);\r
+ switch (options.position){\r
+ case 'top':\r
+ top -= calEl.offsetHeight;\r
+ break;\r
+ case 'left':\r
+ left -= calEl.offsetWidth;\r
+ break;\r
+ case 'right':\r
+ left += this.offsetWidth;\r
+ break;\r
+ case 'bottom':\r
+ top += this.offsetHeight;\r
+ break;\r
+ }\r
+ if (top + calEl.offsetHeight > viewPort.t + viewPort.h) {\r
+ top = pos.top - calEl.offsetHeight;\r
+ }\r
+ if (top < viewPort.t) {\r
+ top = pos.top + this.offsetHeight + calEl.offsetHeight;\r
+ }\r
+ if (left + calEl.offsetWidth > viewPort.l + viewPort.w) {\r
+ left = pos.left - calEl.offsetWidth;\r
+ }\r
+ if (left < viewPort.l) {\r
+ left = pos.left + this.offsetWidth\r
+ }\r
+ cal.css({\r
+ visibility: 'visible',\r
+ display: 'block',\r
+ top: top + 'px',\r
+ left: left + 'px'\r
+ });\r
+ if (options.onShow.apply(this, [cal.get(0)]) != false) {\r
+ cal.show();\r
+ }\r
+ $(document).bind('mousedown', {cal: cal, trigger: this}, hide);\r
+ }\r
+ return false;\r
+ },\r
+ hide = function (ev) {\r
+ if (ev.target != ev.data.trigger && !isChildOf(ev.data.cal.get(0), ev.target, ev.data.cal.get(0))) {\r
+ if (ev.data.cal.data('datepicker').onHide.apply(this, [ev.data.cal.get(0)]) != false) {\r
+ ev.data.cal.hide();\r
+ }\r
+ $(document).unbind('mousedown', hide);\r
+ }\r
+ };\r
+ return {\r
+ init: function(options){\r
+ options = $.extend({}, defaults, options||{});\r
+ extendDate(options.locale);\r
+ options.calendars = Math.max(1, parseInt(options.calendars,10)||1);\r
+ options.mode = /single|multiple|range/.test(options.mode) ? options.mode : 'single';\r
+ return this.each(function(){\r
+ if (!$(this).data('datepicker')) {\r
+ options.el = this;\r
+ if (options.date.constructor == String) {\r
+ options.date = parseDate(options.date, options.format);\r
+ options.date.setHours(0,0,0,0);\r
+ }\r
+ if (options.mode != 'single') {\r
+ if (options.date.constructor != Array) {\r
+ options.date = [options.date.valueOf()];\r
+ if (options.mode == 'range') {\r
+ options.date.push(((new Date(options.date[0])).setHours(23,59,59,0)).valueOf());\r
+ }\r
+ } else {\r
+ for (var i = 0; i < options.date.length; i++) {\r
+ options.date[i] = (parseDate(options.date[i], options.format).setHours(0,0,0,0)).valueOf();\r
+ }\r
+ if (options.mode == 'range') {\r
+ options.date[1] = ((new Date(options.date[1])).setHours(23,59,59,0)).valueOf();\r
+ }\r
+ }\r
+ } else {\r
+ options.date = options.date.valueOf();\r
+ }\r
+ if (!options.current) {\r
+ options.current = new Date();\r
+ } else {\r
+ options.current = parseDate(options.current, options.format);\r
+ } \r
+ options.current.setDate(1);\r
+ options.current.setHours(0,0,0,0);\r
+ var id = 'datepicker_' + parseInt(Math.random() * 1000), cnt;\r
+ options.id = id;\r
+ $(this).data('datepickerId', options.id);\r
+ var cal = $(tpl.wrapper).attr('id', id).bind('click', click).data('datepicker', options);\r
+ if (options.className) {\r
+ cal.addClass(options.className);\r
+ }\r
+ var html = '';\r
+ for (var i = 0; i < options.calendars; i++) {\r
+ cnt = options.starts;\r
+ if (i > 0) {\r
+ html += tpl.space;\r
+ }\r
+ html += tmpl(tpl.head.join(''), {\r
+ week: options.locale.weekMin,\r
+ prev: options.prev,\r
+ next: options.next,\r
+ day1: options.locale.daysMin[(cnt++)%7],\r
+ day2: options.locale.daysMin[(cnt++)%7],\r
+ day3: options.locale.daysMin[(cnt++)%7],\r
+ day4: options.locale.daysMin[(cnt++)%7],\r
+ day5: options.locale.daysMin[(cnt++)%7],\r
+ day6: options.locale.daysMin[(cnt++)%7],\r
+ day7: options.locale.daysMin[(cnt++)%7]\r
+ });\r
+ }\r
+ cal\r
+ .find('tr:first').append(html)\r
+ .find('table').addClass(views[options.view]);\r
+ fill(cal.get(0));\r
+ if (options.flat) {\r
+ cal.appendTo(this).show().css('position', 'relative');\r
+ layout(cal.get(0));\r
+ } else {\r
+ cal.appendTo(document.body);\r
+ $(this).bind(options.eventName, show);\r
+ }\r
+ }\r
+ });\r
+ },\r
+ showPicker: function() {\r
+ return this.each( function () {\r
+ if ($(this).data('datepickerId')) {\r
+ show.apply(this);\r
+ }\r
+ });\r
+ },\r
+ hidePicker: function() {\r
+ return this.each( function () {\r
+ if ($(this).data('datepickerId')) {\r
+ $('#' + $(this).data('datepickerId')).hide();\r
+ }\r
+ });\r
+ },\r
+ setDate: function(date, shiftTo){\r
+ return this.each(function(){\r
+ if ($(this).data('datepickerId')) {\r
+ var cal = $('#' + $(this).data('datepickerId'));\r
+ var options = cal.data('datepicker');\r
+ options.date = date;\r
+ if (options.date.constructor == String) {\r
+ options.date = parseDate(options.date, options.format);\r
+ options.date.setHours(0,0,0,0);\r
+ }\r
+ if (options.mode != 'single') {\r
+ if (options.date.constructor != Array) {\r
+ options.date = [options.date.valueOf()];\r
+ if (options.mode == 'range') {\r
+ options.date.push(((new Date(options.date[0])).setHours(23,59,59,0)).valueOf());\r
+ }\r
+ } else {\r
+ for (var i = 0; i < options.date.length; i++) {\r
+ options.date[i] = (parseDate(options.date[i], options.format).setHours(0,0,0,0)).valueOf();\r
+ }\r
+ if (options.mode == 'range') {\r
+ options.date[1] = ((new Date(options.date[1])).setHours(23,59,59,0)).valueOf();\r
+ }\r
+ }\r
+ } else {\r
+ options.date = options.date.valueOf();\r
+ }\r
+ if (shiftTo) {\r
+ options.current = new Date (options.mode != 'single' ? options.date[0] : options.date);\r
+ }\r
+ fill(cal.get(0));\r
+ }\r
+ });\r
+ },\r
+ getDate: function(formated) {\r
+ if (this.size() > 0) {\r
+ return prepareDate($('#' + $(this).data('datepickerId')).data('datepicker'))[formated ? 0 : 1];\r
+ }\r
+ },\r
+ clear: function(){\r
+ return this.each(function(){\r
+ if ($(this).data('datepickerId')) {\r
+ var cal = $('#' + $(this).data('datepickerId'));\r
+ var options = cal.data('datepicker');\r
+ if (options.mode != 'single') {\r
+ options.date = [];\r
+ fill(cal.get(0));\r
+ }\r
+ }\r
+ });\r
+ },\r
+ fixLayout: function(){\r
+ return this.each(function(){\r
+ if ($(this).data('datepickerId')) {\r
+ var cal = $('#' + $(this).data('datepickerId'));\r
+ var options = cal.data('datepicker');\r
+ if (options.flat) {\r
+ layout(cal.get(0));\r
+ }\r
+ }\r
+ });\r
+ }\r
+ };\r
+ }();\r
+ $.fn.extend({\r
+ DatePicker: DatePicker.init,\r
+ DatePickerHide: DatePicker.hidePicker,\r
+ DatePickerShow: DatePicker.showPicker,\r
+ DatePickerSetDate: DatePicker.setDate,\r
+ DatePickerGetDate: DatePicker.getDate,\r
+ DatePickerClear: DatePicker.clear,\r
+ DatePickerLayout: DatePicker.fixLayout\r
+ });\r
+})(jQuery);\r
+\r
+(function(){\r
+ var cache = {};\r
+ \r
+ this.tmpl = function tmpl(str, data){\r
+ // Figure out if we're getting a template, or if we need to\r
+ // load the template - and be sure to cache the result.\r
+ var fn = !/\W/.test(str) ?\r
+ cache[str] = cache[str] ||\r
+ tmpl(document.getElementById(str).innerHTML) :\r
+ \r
+ // Generate a reusable function that will serve as a template\r
+ // generator (and which will be cached).\r
+ new Function("obj",\r
+ "var p=[],print=function(){p.push.apply(p,arguments);};" +\r
+ \r
+ // Introduce the data as local variables using with(){}\r
+ "with(obj){p.push('" +\r
+ \r
+ // Convert the template into pure JavaScript\r
+ str\r
+ .replace(/[\r\t\n]/g, " ")\r
+ .split("<%").join("\t")\r
+ .replace(/((^|%>)[^\t]*)'/g, "$1\r")\r
+ .replace(/\t=(.*?)%>/g, "',$1,'")\r
+ .split("\t").join("');")\r
+ .split("%>").join("p.push('")\r
+ .split("\r").join("\\'")\r
+ + "');}return p.join('');");\r
+ \r
+ // Provide some basic currying to the user\r
+ return data ? fn( data ) : fn;\r
+ };\r
+})();\r
--- /dev/null
+/*!
+ * jQuery Form Plugin
+ * version: 2.49 (18-OCT-2010)
+ * @requires jQuery v1.3.2 or later
+ *
+ * Examples and documentation at: http://malsup.com/jquery/form/
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ */
+;(function($) {
+
+/*
+ Usage Note:
+ -----------
+ Do not use both ajaxSubmit and ajaxForm on the same form. These
+ functions are intended to be exclusive. Use ajaxSubmit if you want
+ to bind your own submit handler to the form. For example,
+
+ $(document).ready(function() {
+ $('#myForm').bind('submit', function(e) {
+ e.preventDefault(); // <-- important
+ $(this).ajaxSubmit({
+ target: '#output'
+ });
+ });
+ });
+
+ Use ajaxForm when you want the plugin to manage all the event binding
+ for you. For example,
+
+ $(document).ready(function() {
+ $('#myForm').ajaxForm({
+ target: '#output'
+ });
+ });
+
+ When using ajaxForm, the ajaxSubmit function will be invoked for you
+ at the appropriate time.
+*/
+
+/**
+ * ajaxSubmit() provides a mechanism for immediately submitting
+ * an HTML form using AJAX.
+ */
+$.fn.ajaxSubmit = function(options) {
+ // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
+ if (!this.length) {
+ log('ajaxSubmit: skipping submit process - no element selected');
+ return this;
+ }
+
+ if (typeof options == 'function') {
+ options = { success: options };
+ }
+
+ var url = $.trim(this.attr('action'));
+ if (url) {
+ // clean url (don't include hash vaue)
+ url = (url.match(/^([^#]+)/)||[])[1];
+ }
+ url = url || window.location.href || '';
+
+ options = $.extend(true, {
+ url: url,
+ type: this.attr('method') || 'GET',
+ iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
+ }, options);
+
+ // hook for manipulating the form data before it is extracted;
+ // convenient for use with rich editors like tinyMCE or FCKEditor
+ var veto = {};
+ this.trigger('form-pre-serialize', [this, options, veto]);
+ if (veto.veto) {
+ log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
+ return this;
+ }
+
+ // provide opportunity to alter form data before it is serialized
+ if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
+ log('ajaxSubmit: submit aborted via beforeSerialize callback');
+ return this;
+ }
+
+ var n,v,a = this.formToArray(options.semantic);
+ if (options.data) {
+ options.extraData = options.data;
+ for (n in options.data) {
+ if(options.data[n] instanceof Array) {
+ for (var k in options.data[n]) {
+ a.push( { name: n, value: options.data[n][k] } );
+ }
+ }
+ else {
+ v = options.data[n];
+ v = $.isFunction(v) ? v() : v; // if value is fn, invoke it
+ a.push( { name: n, value: v } );
+ }
+ }
+ }
+
+ // give pre-submit callback an opportunity to abort the submit
+ if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
+ log('ajaxSubmit: submit aborted via beforeSubmit callback');
+ return this;
+ }
+
+ // fire vetoable 'validate' event
+ this.trigger('form-submit-validate', [a, this, options, veto]);
+ if (veto.veto) {
+ log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
+ return this;
+ }
+
+ var q = $.param(a);
+
+ if (options.type.toUpperCase() == 'GET') {
+ options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
+ options.data = null; // data is null for 'get'
+ }
+ else {
+ options.data = q; // data is the query string for 'post'
+ }
+
+ var $form = this, callbacks = [];
+ if (options.resetForm) {
+ callbacks.push(function() { $form.resetForm(); });
+ }
+ if (options.clearForm) {
+ callbacks.push(function() { $form.clearForm(); });
+ }
+
+ // perform a load on the target only if dataType is not provided
+ if (!options.dataType && options.target) {
+ var oldSuccess = options.success || function(){};
+ callbacks.push(function(data) {
+ var fn = options.replaceTarget ? 'replaceWith' : 'html';
+ $(options.target)[fn](data).each(oldSuccess, arguments);
+ });
+ }
+ else if (options.success) {
+ callbacks.push(options.success);
+ }
+
+ options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
+ var context = options.context || options; // jQuery 1.4+ supports scope context
+ for (var i=0, max=callbacks.length; i < max; i++) {
+ callbacks[i].apply(context, [data, status, xhr || $form, $form]);
+ }
+ };
+
+ // are there files to upload?
+ var fileInputs = $('input:file', this).length > 0;
+ var mp = 'multipart/form-data';
+ var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
+
+ // options.iframe allows user to force iframe mode
+ // 06-NOV-09: now defaulting to iframe mode if file input is detected
+ if (options.iframe !== false && (fileInputs || options.iframe || multipart)) {
+ // hack to fix Safari hang (thanks to Tim Molendijk for this)
+ // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
+ if (options.closeKeepAlive) {
+ $.get(options.closeKeepAlive, fileUpload);
+ }
+ else {
+ fileUpload();
+ }
+ }
+ else {
+ $.ajax(options);
+ }
+
+ // fire 'notify' event
+ this.trigger('form-submit-notify', [this, options]);
+ return this;
+
+
+ // private function for handling file uploads (hat tip to YAHOO!)
+ function fileUpload() {
+ var form = $form[0];
+
+ if ($(':input[name=submit],:input[id=submit]', form).length) {
+ // if there is an input with a name or id of 'submit' then we won't be
+ // able to invoke the submit fn on the form (at least not x-browser)
+ alert('Error: Form elements must not have name or id of "submit".');
+ return;
+ }
+
+ var s = $.extend(true, {}, $.ajaxSettings, options);
+ s.context = s.context || s;
+ var id = 'jqFormIO' + (new Date().getTime()), fn = '_'+id;
+ window[fn] = function() {
+ var f = $io.data('form-plugin-onload');
+ if (f) {
+ f();
+ window[fn] = undefined;
+ try { delete window[fn]; } catch(e){}
+ }
+ }
+ var $io = $('<iframe id="' + id + '" name="' + id + '" src="'+ s.iframeSrc +'" onload="window[\'_\'+this.id]()" />');
+ var io = $io[0];
+
+ $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
+
+ var xhr = { // mock object
+ aborted: 0,
+ responseText: null,
+ responseXML: null,
+ status: 0,
+ statusText: 'n/a',
+ getAllResponseHeaders: function() {},
+ getResponseHeader: function() {},
+ setRequestHeader: function() {},
+ abort: function() {
+ this.aborted = 1;
+ $io.attr('src', s.iframeSrc); // abort op in progress
+ }
+ };
+
+ var g = s.global;
+ // trigger ajax global events so that activity/block indicators work like normal
+ if (g && ! $.active++) {
+ $.event.trigger("ajaxStart");
+ }
+ if (g) {
+ $.event.trigger("ajaxSend", [xhr, s]);
+ }
+
+ if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
+ if (s.global) {
+ $.active--;
+ }
+ return;
+ }
+ if (xhr.aborted) {
+ return;
+ }
+
+ var cbInvoked = false;
+ var timedOut = 0;
+
+ // add submitting element to data if we know it
+ var sub = form.clk;
+ if (sub) {
+ var n = sub.name;
+ if (n && !sub.disabled) {
+ s.extraData = s.extraData || {};
+ s.extraData[n] = sub.value;
+ if (sub.type == "image") {
+ s.extraData[n+'.x'] = form.clk_x;
+ s.extraData[n+'.y'] = form.clk_y;
+ }
+ }
+ }
+
+ // take a breath so that pending repaints get some cpu time before the upload starts
+ function doSubmit() {
+ // make sure form attrs are set
+ var t = $form.attr('target'), a = $form.attr('action');
+
+ // update form attrs in IE friendly way
+ form.setAttribute('target',id);
+ if (form.getAttribute('method') != 'POST') {
+ form.setAttribute('method', 'POST');
+ }
+ if (form.getAttribute('action') != s.url) {
+ form.setAttribute('action', s.url);
+ }
+
+ // ie borks in some cases when setting encoding
+ if (! s.skipEncodingOverride) {
+ $form.attr({
+ encoding: 'multipart/form-data',
+ enctype: 'multipart/form-data'
+ });
+ }
+
+ // support timout
+ if (s.timeout) {
+ setTimeout(function() { timedOut = true; cb(); }, s.timeout);
+ }
+
+ // add "extra" data to form if provided in options
+ var extraInputs = [];
+ try {
+ if (s.extraData) {
+ for (var n in s.extraData) {
+ extraInputs.push(
+ $('<input type="hidden" name="'+n+'" value="'+s.extraData[n]+'" />')
+ .appendTo(form)[0]);
+ }
+ }
+
+ // add iframe to doc and submit the form
+ $io.appendTo('body');
+ $io.data('form-plugin-onload', cb);
+ form.submit();
+ }
+ finally {
+ // reset attrs and remove "extra" input elements
+ form.setAttribute('action',a);
+ if(t) {
+ form.setAttribute('target', t);
+ } else {
+ $form.removeAttr('target');
+ }
+ $(extraInputs).remove();
+ }
+ }
+
+ if (s.forceSync) {
+ doSubmit();
+ }
+ else {
+ setTimeout(doSubmit, 10); // this lets dom updates render
+ }
+
+ var data, doc, domCheckCount = 50;
+
+ function cb() {
+ if (cbInvoked) {
+ return;
+ }
+
+ $io.removeData('form-plugin-onload');
+
+ var ok = true;
+ try {
+ if (timedOut) {
+ throw 'timeout';
+ }
+ // extract the server response from the iframe
+ doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
+
+ var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
+ log('isXml='+isXml);
+ if (!isXml && window.opera && (doc.body == null || doc.body.innerHTML == '')) {
+ if (--domCheckCount) {
+ // in some browsers (Opera) the iframe DOM is not always traversable when
+ // the onload callback fires, so we loop a bit to accommodate
+ log('requeing onLoad callback, DOM not available');
+ setTimeout(cb, 250);
+ return;
+ }
+ // let this fall through because server response could be an empty document
+ //log('Could not access iframe DOM after mutiple tries.');
+ //throw 'DOMException: not available';
+ }
+
+ //log('response detected');
+ cbInvoked = true;
+ xhr.responseText = doc.documentElement ? doc.documentElement.innerHTML : null;
+ xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
+ xhr.getResponseHeader = function(header){
+ var headers = {'content-type': s.dataType};
+ return headers[header];
+ };
+
+ var scr = /(json|script)/.test(s.dataType);
+ if (scr || s.textarea) {
+ // see if user embedded response in textarea
+ var ta = doc.getElementsByTagName('textarea')[0];
+ if (ta) {
+ xhr.responseText = ta.value;
+ }
+ else if (scr) {
+ // account for browsers injecting pre around json response
+ var pre = doc.getElementsByTagName('pre')[0];
+ var b = doc.getElementsByTagName('body')[0];
+ if (pre) {
+ xhr.responseText = pre.innerHTML;
+ }
+ else if (b) {
+ xhr.responseText = b.innerHTML;
+ }
+ }
+ }
+ else if (s.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
+ xhr.responseXML = toXml(xhr.responseText);
+ }
+ data = $.httpData(xhr, s.dataType);
+ }
+ catch(e){
+ log('error caught:',e);
+ ok = false;
+ xhr.error = e;
+ $.handleError(s, xhr, 'error', e);
+ }
+
+ // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
+ if (ok) {
+ s.success.call(s.context, data, 'success', xhr);
+ if (g) {
+ $.event.trigger("ajaxSuccess", [xhr, s]);
+ }
+ }
+ if (g) {
+ $.event.trigger("ajaxComplete", [xhr, s]);
+ }
+ if (g && ! --$.active) {
+ $.event.trigger("ajaxStop");
+ }
+ if (s.complete) {
+ s.complete.call(s.context, xhr, ok ? 'success' : 'error');
+ }
+
+ // clean up
+ setTimeout(function() {
+ $io.removeData('form-plugin-onload');
+ $io.remove();
+ xhr.responseXML = null;
+ }, 100);
+ }
+
+ function toXml(s, doc) {
+ if (window.ActiveXObject) {
+ doc = new ActiveXObject('Microsoft.XMLDOM');
+ doc.async = 'false';
+ doc.loadXML(s);
+ }
+ else {
+ doc = (new DOMParser()).parseFromString(s, 'text/xml');
+ }
+ return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
+ }
+ }
+};
+
+/**
+ * ajaxForm() provides a mechanism for fully automating form submission.
+ *
+ * The advantages of using this method instead of ajaxSubmit() are:
+ *
+ * 1: This method will include coordinates for <input type="image" /> elements (if the element
+ * is used to submit the form).
+ * 2. This method will include the submit element's name/value data (for the element that was
+ * used to submit the form).
+ * 3. This method binds the submit() method to the form for you.
+ *
+ * The options argument for ajaxForm works exactly as it does for ajaxSubmit. ajaxForm merely
+ * passes the options argument along after properly binding events for submit elements and
+ * the form itself.
+ */
+$.fn.ajaxForm = function(options) {
+ // in jQuery 1.3+ we can fix mistakes with the ready state
+ if (this.length === 0) {
+ var o = { s: this.selector, c: this.context };
+ if (!$.isReady && o.s) {
+ log('DOM not ready, queuing ajaxForm');
+ $(function() {
+ $(o.s,o.c).ajaxForm(options);
+ });
+ return this;
+ }
+ // is your DOM ready? http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
+ log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
+ return this;
+ }
+
+ return this.ajaxFormUnbind().bind('submit.form-plugin', function(e) {
+ if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
+ e.preventDefault();
+ $(this).ajaxSubmit(options);
+ }
+ }).bind('click.form-plugin', function(e) {
+ var target = e.target;
+ var $el = $(target);
+ if (!($el.is(":submit,input:image"))) {
+ // is this a child element of the submit el? (ex: a span within a button)
+ var t = $el.closest(':submit');
+ if (t.length == 0) {
+ return;
+ }
+ target = t[0];
+ }
+ var form = this;
+ form.clk = target;
+ if (target.type == 'image') {
+ if (e.offsetX != undefined) {
+ form.clk_x = e.offsetX;
+ form.clk_y = e.offsetY;
+ } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
+ var offset = $el.offset();
+ form.clk_x = e.pageX - offset.left;
+ form.clk_y = e.pageY - offset.top;
+ } else {
+ form.clk_x = e.pageX - target.offsetLeft;
+ form.clk_y = e.pageY - target.offsetTop;
+ }
+ }
+ // clear form vars
+ setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
+ });
+};
+
+// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
+$.fn.ajaxFormUnbind = function() {
+ return this.unbind('submit.form-plugin click.form-plugin');
+};
+
+/**
+ * formToArray() gathers form element data into an array of objects that can
+ * be passed to any of the following ajax functions: $.get, $.post, or load.
+ * Each object in the array has both a 'name' and 'value' property. An example of
+ * an array for a simple login form might be:
+ *
+ * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
+ *
+ * It is this array that is passed to pre-submit callback functions provided to the
+ * ajaxSubmit() and ajaxForm() methods.
+ */
+$.fn.formToArray = function(semantic) {
+ var a = [];
+ if (this.length === 0) {
+ return a;
+ }
+
+ var form = this[0];
+ var els = semantic ? form.getElementsByTagName('*') : form.elements;
+ if (!els) {
+ return a;
+ }
+
+ var i,j,n,v,el,max,jmax;
+ for(i=0, max=els.length; i < max; i++) {
+ el = els[i];
+ n = el.name;
+ if (!n) {
+ continue;
+ }
+
+ if (semantic && form.clk && el.type == "image") {
+ // handle image inputs on the fly when semantic == true
+ if(!el.disabled && form.clk == el) {
+ a.push({name: n, value: $(el).val()});
+ a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+ }
+ continue;
+ }
+
+ v = $.fieldValue(el, true);
+ if (v && v.constructor == Array) {
+ for(j=0, jmax=v.length; j < jmax; j++) {
+ a.push({name: n, value: v[j]});
+ }
+ }
+ else if (v !== null && typeof v != 'undefined') {
+ a.push({name: n, value: v});
+ }
+ }
+
+ if (!semantic && form.clk) {
+ // input type=='image' are not found in elements array! handle it here
+ var $input = $(form.clk), input = $input[0];
+ n = input.name;
+ if (n && !input.disabled && input.type == 'image') {
+ a.push({name: n, value: $input.val()});
+ a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+ }
+ }
+ return a;
+};
+
+/**
+ * Serializes form data into a 'submittable' string. This method will return a string
+ * in the format: name1=value1&name2=value2
+ */
+$.fn.formSerialize = function(semantic) {
+ //hand off to jQuery.param for proper encoding
+ return $.param(this.formToArray(semantic));
+};
+
+/**
+ * Serializes all field elements in the jQuery object into a query string.
+ * This method will return a string in the format: name1=value1&name2=value2
+ */
+$.fn.fieldSerialize = function(successful) {
+ var a = [];
+ this.each(function() {
+ var n = this.name;
+ if (!n) {
+ return;
+ }
+ var v = $.fieldValue(this, successful);
+ if (v && v.constructor == Array) {
+ for (var i=0,max=v.length; i < max; i++) {
+ a.push({name: n, value: v[i]});
+ }
+ }
+ else if (v !== null && typeof v != 'undefined') {
+ a.push({name: this.name, value: v});
+ }
+ });
+ //hand off to jQuery.param for proper encoding
+ return $.param(a);
+};
+
+/**
+ * Returns the value(s) of the element in the matched set. For example, consider the following form:
+ *
+ * <form><fieldset>
+ * <input name="A" type="text" />
+ * <input name="A" type="text" />
+ * <input name="B" type="checkbox" value="B1" />
+ * <input name="B" type="checkbox" value="B2"/>
+ * <input name="C" type="radio" value="C1" />
+ * <input name="C" type="radio" value="C2" />
+ * </fieldset></form>
+ *
+ * var v = $(':text').fieldValue();
+ * // if no values are entered into the text inputs
+ * v == ['','']
+ * // if values entered into the text inputs are 'foo' and 'bar'
+ * v == ['foo','bar']
+ *
+ * var v = $(':checkbox').fieldValue();
+ * // if neither checkbox is checked
+ * v === undefined
+ * // if both checkboxes are checked
+ * v == ['B1', 'B2']
+ *
+ * var v = $(':radio').fieldValue();
+ * // if neither radio is checked
+ * v === undefined
+ * // if first radio is checked
+ * v == ['C1']
+ *
+ * The successful argument controls whether or not the field element must be 'successful'
+ * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
+ * The default value of the successful argument is true. If this value is false the value(s)
+ * for each element is returned.
+ *
+ * Note: This method *always* returns an array. If no valid value can be determined the
+ * array will be empty, otherwise it will contain one or more values.
+ */
+$.fn.fieldValue = function(successful) {
+ for (var val=[], i=0, max=this.length; i < max; i++) {
+ var el = this[i];
+ var v = $.fieldValue(el, successful);
+ if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) {
+ continue;
+ }
+ v.constructor == Array ? $.merge(val, v) : val.push(v);
+ }
+ return val;
+};
+
+/**
+ * Returns the value of the field element.
+ */
+$.fieldValue = function(el, successful) {
+ var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
+ if (successful === undefined) {
+ successful = true;
+ }
+
+ if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
+ (t == 'checkbox' || t == 'radio') && !el.checked ||
+ (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
+ tag == 'select' && el.selectedIndex == -1)) {
+ return null;
+ }
+
+ if (tag == 'select') {
+ var index = el.selectedIndex;
+ if (index < 0) {
+ return null;
+ }
+ var a = [], ops = el.options;
+ var one = (t == 'select-one');
+ var max = (one ? index+1 : ops.length);
+ for(var i=(one ? index : 0); i < max; i++) {
+ var op = ops[i];
+ if (op.selected) {
+ var v = op.value;
+ if (!v) { // extra pain for IE...
+ v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
+ }
+ if (one) {
+ return v;
+ }
+ a.push(v);
+ }
+ }
+ return a;
+ }
+ return $(el).val();
+};
+
+/**
+ * Clears the form data. Takes the following actions on the form's input fields:
+ * - input text fields will have their 'value' property set to the empty string
+ * - select elements will have their 'selectedIndex' property set to -1
+ * - checkbox and radio inputs will have their 'checked' property set to false
+ * - inputs of type submit, button, reset, and hidden will *not* be effected
+ * - button elements will *not* be effected
+ */
+$.fn.clearForm = function() {
+ return this.each(function() {
+ $('input,select,textarea', this).clearFields();
+ });
+};
+
+/**
+ * Clears the selected form elements.
+ */
+$.fn.clearFields = $.fn.clearInputs = function() {
+ return this.each(function() {
+ var t = this.type, tag = this.tagName.toLowerCase();
+ if (t == 'text' || t == 'password' || tag == 'textarea') {
+ this.value = '';
+ }
+ else if (t == 'checkbox' || t == 'radio') {
+ this.checked = false;
+ }
+ else if (tag == 'select') {
+ this.selectedIndex = -1;
+ }
+ });
+};
+
+/**
+ * Resets the form data. Causes all form elements to be reset to their original value.
+ */
+$.fn.resetForm = function() {
+ return this.each(function() {
+ // guard against an input with the name of 'reset'
+ // note that IE reports the reset function as an 'object'
+ if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) {
+ this.reset();
+ }
+ });
+};
+
+/**
+ * Enables or disables any matching elements.
+ */
+$.fn.enable = function(b) {
+ if (b === undefined) {
+ b = true;
+ }
+ return this.each(function() {
+ this.disabled = !b;
+ });
+};
+
+/**
+ * Checks/unchecks any matching checkboxes or radio buttons and
+ * selects/deselects and matching option elements.
+ */
+$.fn.selected = function(select) {
+ if (select === undefined) {
+ select = true;
+ }
+ return this.each(function() {
+ var t = this.type;
+ if (t == 'checkbox' || t == 'radio') {
+ this.checked = select;
+ }
+ else if (this.tagName.toLowerCase() == 'option') {
+ var $sel = $(this).parent('select');
+ if (select && $sel[0] && $sel[0].type == 'select-one') {
+ // deselect all other options
+ $sel.find('option').selected(false);
+ }
+ this.selected = select;
+ }
+ });
+};
+
+// helper fn for console logging
+// set $.fn.ajaxSubmit.debug to true to enable debug logging
+function log() {
+ if ($.fn.ajaxSubmit.debug) {
+ var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');
+ if (window.console && window.console.log) {
+ window.console.log(msg);
+ }
+ else if (window.opera && window.opera.postError) {
+ window.opera.postError(msg);
+ }
+ }
+};
+
+})(jQuery);
--- /dev/null
+/*!
+ * jQuery JavaScript Library v1.4.4
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Nov 11 19:04:53 2010 -0500
+ */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$,
+
+ // A central reference to the root jQuery(document)
+ rootjQuery,
+
+ // A simple way to check for HTML strings or ID strings
+ // (both of which we optimize for)
+ quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,
+
+ // Is it a simple selector
+ isSimple = /^.[^:#\[\.,]*$/,
+
+ // Check if a string has a non-whitespace character in it
+ rnotwhite = /\S/,
+ rwhite = /\s/,
+
+ // Used for trimming whitespace
+ trimLeft = /^\s+/,
+ trimRight = /\s+$/,
+
+ // Check for non-word characters
+ rnonword = /\W/,
+
+ // Check for digits
+ rdigit = /\d/,
+
+ // Match a standalone tag
+ rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+ // JSON RegExp
+ rvalidchars = /^[\],:{}\s]*$/,
+ rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+ rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+ rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+ // Useragent RegExp
+ rwebkit = /(webkit)[ \/]([\w.]+)/,
+ ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+ rmsie = /(msie) ([\w.]+)/,
+ rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+ // Keep a UserAgent string for use with jQuery.browser
+ userAgent = navigator.userAgent,
+
+ // For matching the engine and version of the browser
+ browserMatch,
+
+ // Has the ready events already been bound?
+ readyBound = false,
+
+ // The functions to execute on DOM ready
+ readyList = [],
+
+ // The ready event handler
+ DOMContentLoaded,
+
+ // Save a reference to some core methods
+ toString = Object.prototype.toString,
+ hasOwn = Object.prototype.hasOwnProperty,
+ push = Array.prototype.push,
+ slice = Array.prototype.slice,
+ trim = String.prototype.trim,
+ indexOf = Array.prototype.indexOf,
+
+ // [[Class]] -> type pairs
+ class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+ init: function( selector, context ) {
+ var match, elem, ret, doc;
+
+ // Handle $(""), $(null), or $(undefined)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle $(DOMElement)
+ if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+ }
+
+ // The body element only exists once, optimize finding it
+ if ( selector === "body" && !context && document.body ) {
+ this.context = document;
+ this[0] = document.body;
+ this.selector = "body";
+ this.length = 1;
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ // Are we dealing with HTML string or an ID?
+ match = quickExpr.exec( selector );
+
+ // Verify a match, and that no context was specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ doc = (context ? context.ownerDocument || context : document);
+
+ // If a single string is passed in and it's a single tag
+ // just do a createElement and skip the rest
+ ret = rsingleTag.exec( selector );
+
+ if ( ret ) {
+ if ( jQuery.isPlainObject( context ) ) {
+ selector = [ document.createElement( ret[1] ) ];
+ jQuery.fn.attr.call( selector, context, true );
+
+ } else {
+ selector = [ doc.createElement( ret[1] ) ];
+ }
+
+ } else {
+ ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+ selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
+ }
+
+ return jQuery.merge( this, selector );
+
+ // HANDLE: $("#id")
+ } else {
+ elem = document.getElementById( match[2] );
+
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE and Opera return items
+ // by name instead of ID
+ if ( elem.id !== match[2] ) {
+ return rootjQuery.find( selector );
+ }
+
+ // Otherwise, we inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $("TAG")
+ } else if ( !context && !rnonword.test( selector ) ) {
+ this.selector = selector;
+ this.context = document;
+ selector = document.getElementsByTagName( selector );
+ return jQuery.merge( this, selector );
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return (context || rootjQuery).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return jQuery( context ).find( selector );
+ }
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return rootjQuery.ready( selector );
+ }
+
+ if (selector.selector !== undefined) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ },
+
+ // Start with an empty selector
+ selector: "",
+
+ // The current version of jQuery being used
+ jquery: "1.4.4",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ // The number of elements contained in the matched element set
+ size: function() {
+ return this.length;
+ },
+
+ toArray: function() {
+ return slice.call( this, 0 );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num == null ?
+
+ // Return a 'clean' array
+ this.toArray() :
+
+ // Return just the object
+ ( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems, name, selector ) {
+ // Build a new jQuery matched element set
+ var ret = jQuery();
+
+ if ( jQuery.isArray( elems ) ) {
+ push.apply( ret, elems );
+
+ } else {
+ jQuery.merge( ret, elems );
+ }
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+
+ ret.context = this.context;
+
+ if ( name === "find" ) {
+ ret.selector = this.selector + (this.selector ? " " : "") + selector;
+ } else if ( name ) {
+ ret.selector = this.selector + "." + name + "(" + selector + ")";
+ }
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function( callback, args ) {
+ return jQuery.each( this, callback, args );
+ },
+
+ ready: function( fn ) {
+ // Attach the listeners
+ jQuery.bindReady();
+
+ // If the DOM is already ready
+ if ( jQuery.isReady ) {
+ // Execute the function immediately
+ fn.call( document, jQuery );
+
+ // Otherwise, remember the function for later
+ } else if ( readyList ) {
+ // Add the function to the wait list
+ readyList.push( fn );
+ }
+
+ return this;
+ },
+
+ eq: function( i ) {
+ return i === -1 ?
+ this.slice( i ) :
+ this.slice( i, +i + 1 );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ),
+ "slice", slice.call(arguments).join(",") );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ end: function() {
+ return this.prevObject || jQuery(null);
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: [].sort,
+ splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+ target = arguments[1] || {};
+ // skip the boolean and the target
+ i = 2;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+ target = {};
+ }
+
+ // extend jQuery itself if only one argument is passed
+ if ( length === i ) {
+ target = this;
+ --i;
+ }
+
+ for ( ; i < length; i++ ) {
+ // Only deal with non-null/undefined values
+ if ( (options = arguments[ i ]) != null ) {
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray(src) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend({
+ noConflict: function( deep ) {
+ window.$ = _$;
+
+ if ( deep ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+ },
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+ // A third-party is pushing the ready event forwards
+ if ( wait === true ) {
+ jQuery.readyWait--;
+ }
+
+ // Make sure that the DOM is not already loaded
+ if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) {
+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+ if ( !document.body ) {
+ return setTimeout( jQuery.ready, 1 );
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ if ( readyList ) {
+ // Execute all of them
+ var fn,
+ i = 0,
+ ready = readyList;
+
+ // Reset the list of functions
+ readyList = null;
+
+ while ( (fn = ready[ i++ ]) ) {
+ fn.call( document, jQuery );
+ }
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.trigger ) {
+ jQuery( document ).trigger( "ready" ).unbind( "ready" );
+ }
+ }
+ }
+ },
+
+ bindReady: function() {
+ if ( readyBound ) {
+ return;
+ }
+
+ readyBound = true;
+
+ // Catch cases where $(document).ready() is called after the
+ // browser event has already occurred.
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ return setTimeout( jQuery.ready, 1 );
+ }
+
+ // Mozilla, Opera and webkit nightlies currently support this event
+ if ( document.addEventListener ) {
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", jQuery.ready, false );
+
+ // If IE event model is used
+ } else if ( document.attachEvent ) {
+ // ensure firing before onload,
+ // maybe late but safe also for iframes
+ document.attachEvent("onreadystatechange", DOMContentLoaded);
+
+ // A fallback to window.onload, that will always work
+ window.attachEvent( "onload", jQuery.ready );
+
+ // If IE and not a frame
+ // continually check to see if the document is ready
+ var toplevel = false;
+
+ try {
+ toplevel = window.frameElement == null;
+ } catch(e) {}
+
+ if ( document.documentElement.doScroll && toplevel ) {
+ doScrollCheck();
+ }
+ }
+ },
+
+ // See test/unit/core.js for details concerning isFunction.
+ // Since version 1.3, DOM methods and functions like alert
+ // aren't supported. They return false on IE (#2968).
+ isFunction: function( obj ) {
+ return jQuery.type(obj) === "function";
+ },
+
+ isArray: Array.isArray || function( obj ) {
+ return jQuery.type(obj) === "array";
+ },
+
+ // A crude way of determining if an object is a window
+ isWindow: function( obj ) {
+ return obj && typeof obj === "object" && "setInterval" in obj;
+ },
+
+ isNaN: function( obj ) {
+ return obj == null || !rdigit.test( obj ) || isNaN( obj );
+ },
+
+ type: function( obj ) {
+ return obj == null ?
+ String( obj ) :
+ class2type[ toString.call(obj) ] || "object";
+ },
+
+ isPlainObject: function( obj ) {
+ // Must be an Object.
+ // Because of IE, we also have to check the presence of the constructor property.
+ // Make sure that DOM nodes and window objects don't pass through, as well
+ if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ // Not own constructor property must be Object
+ if ( obj.constructor &&
+ !hasOwn.call(obj, "constructor") &&
+ !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+ return false;
+ }
+
+ // Own properties are enumerated firstly, so to speed up,
+ // if last one is own, then all properties are own.
+
+ var key;
+ for ( key in obj ) {}
+
+ return key === undefined || hasOwn.call( obj, key );
+ },
+
+ isEmptyObject: function( obj ) {
+ for ( var name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ error: function( msg ) {
+ throw msg;
+ },
+
+ parseJSON: function( data ) {
+ if ( typeof data !== "string" || !data ) {
+ return null;
+ }
+
+ // Make sure leading/trailing whitespace is removed (IE can't handle it)
+ data = jQuery.trim( data );
+
+ // Make sure the incoming data is actual JSON
+ // Logic borrowed from http://json.org/json2.js
+ if ( rvalidchars.test(data.replace(rvalidescape, "@")
+ .replace(rvalidtokens, "]")
+ .replace(rvalidbraces, "")) ) {
+
+ // Try to use the native JSON parser first
+ return window.JSON && window.JSON.parse ?
+ window.JSON.parse( data ) :
+ (new Function("return " + data))();
+
+ } else {
+ jQuery.error( "Invalid JSON: " + data );
+ }
+ },
+
+ noop: function() {},
+
+ // Evalulates a script in a global context
+ globalEval: function( data ) {
+ if ( data && rnotwhite.test(data) ) {
+ // Inspired by code by Andrea Giammarchi
+ // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
+ var head = document.getElementsByTagName("head")[0] || document.documentElement,
+ script = document.createElement("script");
+
+ script.type = "text/javascript";
+
+ if ( jQuery.support.scriptEval ) {
+ script.appendChild( document.createTextNode( data ) );
+ } else {
+ script.text = data;
+ }
+
+ // Use insertBefore instead of appendChild to circumvent an IE6 bug.
+ // This arises when a base node is used (#2709).
+ head.insertBefore( script, head.firstChild );
+ head.removeChild( script );
+ }
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+ },
+
+ // args is for internal usage only
+ each: function( object, callback, args ) {
+ var name, i = 0,
+ length = object.length,
+ isObj = length === undefined || jQuery.isFunction(object);
+
+ if ( args ) {
+ if ( isObj ) {
+ for ( name in object ) {
+ if ( callback.apply( object[ name ], args ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( ; i < length; ) {
+ if ( callback.apply( object[ i++ ], args ) === false ) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( isObj ) {
+ for ( name in object ) {
+ if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( var value = object[0];
+ i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
+ }
+ }
+
+ return object;
+ },
+
+ // Use native String.trim function wherever possible
+ trim: trim ?
+ function( text ) {
+ return text == null ?
+ "" :
+ trim.call( text );
+ } :
+
+ // Otherwise use our own trimming functionality
+ function( text ) {
+ return text == null ?
+ "" :
+ text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( array, results ) {
+ var ret = results || [];
+
+ if ( array != null ) {
+ // The window, strings (and functions) also have 'length'
+ // The extra typeof function check is to prevent crashes
+ // in Safari 2 (See: #3039)
+ // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+ var type = jQuery.type(array);
+
+ if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+ push.call( ret, array );
+ } else {
+ jQuery.merge( ret, array );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, array ) {
+ if ( array.indexOf ) {
+ return array.indexOf( elem );
+ }
+
+ for ( var i = 0, length = array.length; i < length; i++ ) {
+ if ( array[ i ] === elem ) {
+ return i;
+ }
+ }
+
+ return -1;
+ },
+
+ merge: function( first, second ) {
+ var i = first.length,
+ j = 0;
+
+ if ( typeof second.length === "number" ) {
+ for ( var l = second.length; j < l; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ } else {
+ while ( second[j] !== undefined ) {
+ first[ i++ ] = second[ j++ ];
+ }
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, inv ) {
+ var ret = [], retVal;
+ inv = !!inv;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( var i = 0, length = elems.length; i < length; i++ ) {
+ retVal = !!callback( elems[ i ], i );
+ if ( inv !== retVal ) {
+ ret.push( elems[ i ] );
+ }
+ }
+
+ return ret;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var ret = [], value;
+
+ // Go through the array, translating each of the items to their
+ // new value (or values).
+ for ( var i = 0, length = elems.length; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret[ ret.length ] = value;
+ }
+ }
+
+ return ret.concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ proxy: function( fn, proxy, thisObject ) {
+ if ( arguments.length === 2 ) {
+ if ( typeof proxy === "string" ) {
+ thisObject = fn;
+ fn = thisObject[ proxy ];
+ proxy = undefined;
+
+ } else if ( proxy && !jQuery.isFunction( proxy ) ) {
+ thisObject = proxy;
+ proxy = undefined;
+ }
+ }
+
+ if ( !proxy && fn ) {
+ proxy = function() {
+ return fn.apply( thisObject || this, arguments );
+ };
+ }
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ if ( fn ) {
+ proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+ }
+
+ // So proxy can be declared as an argument
+ return proxy;
+ },
+
+ // Mutifunctional method to get and set values to a collection
+ // The value/s can be optionally by executed if its a function
+ access: function( elems, key, value, exec, fn, pass ) {
+ var length = elems.length;
+
+ // Setting many attributes
+ if ( typeof key === "object" ) {
+ for ( var k in key ) {
+ jQuery.access( elems, k, key[k], exec, fn, value );
+ }
+ return elems;
+ }
+
+ // Setting one attribute
+ if ( value !== undefined ) {
+ // Optionally, function values get executed if exec is true
+ exec = !pass && exec && jQuery.isFunction(value);
+
+ for ( var i = 0; i < length; i++ ) {
+ fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+ }
+
+ return elems;
+ }
+
+ // Getting an attribute
+ return length ? fn( elems[0], key ) : undefined;
+ },
+
+ now: function() {
+ return (new Date()).getTime();
+ },
+
+ // Use of jQuery.browser is frowned upon.
+ // More details: http://docs.jquery.com/Utilities/jQuery.browser
+ uaMatch: function( ua ) {
+ ua = ua.toLowerCase();
+
+ var match = rwebkit.exec( ua ) ||
+ ropera.exec( ua ) ||
+ rmsie.exec( ua ) ||
+ ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+ [];
+
+ return { browser: match[1] || "", version: match[2] || "0" };
+ },
+
+ browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+ jQuery.browser[ browserMatch.browser ] = true;
+ jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+ jQuery.browser.safari = true;
+}
+
+if ( indexOf ) {
+ jQuery.inArray = function( elem, array ) {
+ return indexOf.call( array, elem );
+ };
+}
+
+// Verify that \s matches non-breaking spaces
+// (IE fails on this test)
+if ( !rwhite.test( "\xA0" ) ) {
+ trimLeft = /^[\s\xA0]+/;
+ trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+ DOMContentLoaded = function() {
+ document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+ jQuery.ready();
+ };
+
+} else if ( document.attachEvent ) {
+ DOMContentLoaded = function() {
+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+ if ( document.readyState === "complete" ) {
+ document.detachEvent( "onreadystatechange", DOMContentLoaded );
+ jQuery.ready();
+ }
+ };
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+ if ( jQuery.isReady ) {
+ return;
+ }
+
+ try {
+ // If IE is used, use the trick by Diego Perini
+ // http://javascript.nwbox.com/IEContentLoaded/
+ document.documentElement.doScroll("left");
+ } catch(e) {
+ setTimeout( doScrollCheck, 1 );
+ return;
+ }
+
+ // and execute any waiting functions
+ jQuery.ready();
+}
+
+// Expose jQuery to the global object
+return (window.jQuery = window.$ = jQuery);
+
+})();
+
+
+(function() {
+
+ jQuery.support = {};
+
+ var root = document.documentElement,
+ script = document.createElement("script"),
+ div = document.createElement("div"),
+ id = "script" + jQuery.now();
+
+ div.style.display = "none";
+ div.innerHTML = " <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+ var all = div.getElementsByTagName("*"),
+ a = div.getElementsByTagName("a")[0],
+ select = document.createElement("select"),
+ opt = select.appendChild( document.createElement("option") );
+
+ // Can't get basic test support
+ if ( !all || !all.length || !a ) {
+ return;
+ }
+
+ jQuery.support = {
+ // IE strips leading whitespace when .innerHTML is used
+ leadingWhitespace: div.firstChild.nodeType === 3,
+
+ // Make sure that tbody elements aren't automatically inserted
+ // IE will insert them into empty tables
+ tbody: !div.getElementsByTagName("tbody").length,
+
+ // Make sure that link elements get serialized correctly by innerHTML
+ // This requires a wrapper element in IE
+ htmlSerialize: !!div.getElementsByTagName("link").length,
+
+ // Get the style information from getAttribute
+ // (IE uses .cssText insted)
+ style: /red/.test( a.getAttribute("style") ),
+
+ // Make sure that URLs aren't manipulated
+ // (IE normalizes it by default)
+ hrefNormalized: a.getAttribute("href") === "/a",
+
+ // Make sure that element opacity exists
+ // (IE uses filter instead)
+ // Use a regex to work around a WebKit issue. See #5145
+ opacity: /^0.55$/.test( a.style.opacity ),
+
+ // Verify style float existence
+ // (IE uses styleFloat instead of cssFloat)
+ cssFloat: !!a.style.cssFloat,
+
+ // Make sure that if no value is specified for a checkbox
+ // that it defaults to "on".
+ // (WebKit defaults to "" instead)
+ checkOn: div.getElementsByTagName("input")[0].value === "on",
+
+ // Make sure that a selected-by-default option has a working selected property.
+ // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+ optSelected: opt.selected,
+
+ // Will be defined later
+ deleteExpando: true,
+ optDisabled: false,
+ checkClone: false,
+ scriptEval: false,
+ noCloneEvent: true,
+ boxModel: null,
+ inlineBlockNeedsLayout: false,
+ shrinkWrapBlocks: false,
+ reliableHiddenOffsets: true
+ };
+
+ // Make sure that the options inside disabled selects aren't marked as disabled
+ // (WebKit marks them as diabled)
+ select.disabled = true;
+ jQuery.support.optDisabled = !opt.disabled;
+
+ script.type = "text/javascript";
+ try {
+ script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
+ } catch(e) {}
+
+ root.insertBefore( script, root.firstChild );
+
+ // Make sure that the execution of code works by injecting a script
+ // tag with appendChild/createTextNode
+ // (IE doesn't support this, fails, and uses .text instead)
+ if ( window[ id ] ) {
+ jQuery.support.scriptEval = true;
+ delete window[ id ];
+ }
+
+ // Test to see if it's possible to delete an expando from an element
+ // Fails in Internet Explorer
+ try {
+ delete script.test;
+
+ } catch(e) {
+ jQuery.support.deleteExpando = false;
+ }
+
+ root.removeChild( script );
+
+ if ( div.attachEvent && div.fireEvent ) {
+ div.attachEvent("onclick", function click() {
+ // Cloning a node shouldn't copy over any
+ // bound event handlers (IE does this)
+ jQuery.support.noCloneEvent = false;
+ div.detachEvent("onclick", click);
+ });
+ div.cloneNode(true).fireEvent("onclick");
+ }
+
+ div = document.createElement("div");
+ div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
+
+ var fragment = document.createDocumentFragment();
+ fragment.appendChild( div.firstChild );
+
+ // WebKit doesn't clone checked state correctly in fragments
+ jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
+
+ // Figure out if the W3C box model works as expected
+ // document.body must exist before we can do this
+ jQuery(function() {
+ var div = document.createElement("div");
+ div.style.width = div.style.paddingLeft = "1px";
+
+ document.body.appendChild( div );
+ jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
+
+ if ( "zoom" in div.style ) {
+ // Check if natively block-level elements act like inline-block
+ // elements when setting their display to 'inline' and giving
+ // them layout
+ // (IE < 8 does this)
+ div.style.display = "inline";
+ div.style.zoom = 1;
+ jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2;
+
+ // Check if elements with layout shrink-wrap their children
+ // (IE 6 does this)
+ div.style.display = "";
+ div.innerHTML = "<div style='width:4px;'></div>";
+ jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2;
+ }
+
+ div.innerHTML = "<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";
+ var tds = div.getElementsByTagName("td");
+
+ // Check if table cells still have offsetWidth/Height when they are set
+ // to display:none and there are still other visible table cells in a
+ // table row; if so, offsetWidth/Height are not reliable for use when
+ // determining if an element has been hidden directly using
+ // display:none (it is still safe to use offsets if a parent element is
+ // hidden; don safety goggles and see bug #4512 for more information).
+ // (only IE 8 fails this test)
+ jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0;
+
+ tds[0].style.display = "";
+ tds[1].style.display = "none";
+
+ // Check if empty table cells still have offsetWidth/Height
+ // (IE < 8 fail this test)
+ jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0;
+ div.innerHTML = "";
+
+ document.body.removeChild( div ).style.display = "none";
+ div = tds = null;
+ });
+
+ // Technique from Juriy Zaytsev
+ // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
+ var eventSupported = function( eventName ) {
+ var el = document.createElement("div");
+ eventName = "on" + eventName;
+
+ var isSupported = (eventName in el);
+ if ( !isSupported ) {
+ el.setAttribute(eventName, "return;");
+ isSupported = typeof el[eventName] === "function";
+ }
+ el = null;
+
+ return isSupported;
+ };
+
+ jQuery.support.submitBubbles = eventSupported("submit");
+ jQuery.support.changeBubbles = eventSupported("change");
+
+ // release memory in IE
+ root = script = div = all = a = null;
+})();
+
+
+
+var windowData = {},
+ rbrace = /^(?:\{.*\}|\[.*\])$/;
+
+jQuery.extend({
+ cache: {},
+
+ // Please use with caution
+ uuid: 0,
+
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + jQuery.now(),
+
+ // The following elements throw uncatchable exceptions if you
+ // attempt to add expando properties to them.
+ noData: {
+ "embed": true,
+ // Ban all objects except for Flash (which handle expandos)
+ "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+ "applet": true
+ },
+
+ data: function( elem, name, data ) {
+ if ( !jQuery.acceptData( elem ) ) {
+ return;
+ }
+
+ elem = elem == window ?
+ windowData :
+ elem;
+
+ var isNode = elem.nodeType,
+ id = isNode ? elem[ jQuery.expando ] : null,
+ cache = jQuery.cache, thisCache;
+
+ if ( isNode && !id && typeof name === "string" && data === undefined ) {
+ return;
+ }
+
+ // Get the data from the object directly
+ if ( !isNode ) {
+ cache = elem;
+
+ // Compute a unique ID for the element
+ } else if ( !id ) {
+ elem[ jQuery.expando ] = id = ++jQuery.uuid;
+ }
+
+ // Avoid generating a new cache unless none exists and we
+ // want to manipulate it.
+ if ( typeof name === "object" ) {
+ if ( isNode ) {
+ cache[ id ] = jQuery.extend(cache[ id ], name);
+
+ } else {
+ jQuery.extend( cache, name );
+ }
+
+ } else if ( isNode && !cache[ id ] ) {
+ cache[ id ] = {};
+ }
+
+ thisCache = isNode ? cache[ id ] : cache;
+
+ // Prevent overriding the named cache with undefined values
+ if ( data !== undefined ) {
+ thisCache[ name ] = data;
+ }
+
+ return typeof name === "string" ? thisCache[ name ] : thisCache;
+ },
+
+ removeData: function( elem, name ) {
+ if ( !jQuery.acceptData( elem ) ) {
+ return;
+ }
+
+ elem = elem == window ?
+ windowData :
+ elem;
+
+ var isNode = elem.nodeType,
+ id = isNode ? elem[ jQuery.expando ] : elem,
+ cache = jQuery.cache,
+ thisCache = isNode ? cache[ id ] : id;
+
+ // If we want to remove a specific section of the element's data
+ if ( name ) {
+ if ( thisCache ) {
+ // Remove the section of cache data
+ delete thisCache[ name ];
+
+ // If we've removed all the data, remove the element's cache
+ if ( isNode && jQuery.isEmptyObject(thisCache) ) {
+ jQuery.removeData( elem );
+ }
+ }
+
+ // Otherwise, we want to remove all of the element's data
+ } else {
+ if ( isNode && jQuery.support.deleteExpando ) {
+ delete elem[ jQuery.expando ];
+
+ } else if ( elem.removeAttribute ) {
+ elem.removeAttribute( jQuery.expando );
+
+ // Completely remove the data cache
+ } else if ( isNode ) {
+ delete cache[ id ];
+
+ // Remove all fields from the object
+ } else {
+ for ( var n in elem ) {
+ delete elem[ n ];
+ }
+ }
+ }
+ },
+
+ // A method for determining if a DOM node can handle the data expando
+ acceptData: function( elem ) {
+ if ( elem.nodeName ) {
+ var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+ if ( match ) {
+ return !(match === true || elem.getAttribute("classid") !== match);
+ }
+ }
+
+ return true;
+ }
+});
+
+jQuery.fn.extend({
+ data: function( key, value ) {
+ var data = null;
+
+ if ( typeof key === "undefined" ) {
+ if ( this.length ) {
+ var attr = this[0].attributes, name;
+ data = jQuery.data( this[0] );
+
+ for ( var i = 0, l = attr.length; i < l; i++ ) {
+ name = attr[i].name;
+
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = name.substr( 5 );
+ dataAttr( this[0], name, data[ name ] );
+ }
+ }
+ }
+
+ return data;
+
+ } else if ( typeof key === "object" ) {
+ return this.each(function() {
+ jQuery.data( this, key );
+ });
+ }
+
+ var parts = key.split(".");
+ parts[1] = parts[1] ? "." + parts[1] : "";
+
+ if ( value === undefined ) {
+ data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+ // Try to fetch any internally stored data first
+ if ( data === undefined && this.length ) {
+ data = jQuery.data( this[0], key );
+ data = dataAttr( this[0], key, data );
+ }
+
+ return data === undefined && parts[1] ?
+ this.data( parts[0] ) :
+ data;
+
+ } else {
+ return this.each(function() {
+ var $this = jQuery( this ),
+ args = [ parts[0], value ];
+
+ $this.triggerHandler( "setData" + parts[1] + "!", args );
+ jQuery.data( this, key, value );
+ $this.triggerHandler( "changeData" + parts[1] + "!", args );
+ });
+ }
+ },
+
+ removeData: function( key ) {
+ return this.each(function() {
+ jQuery.removeData( this, key );
+ });
+ }
+});
+
+function dataAttr( elem, key, data ) {
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ data = elem.getAttribute( "data-" + key );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ !jQuery.isNaN( data ) ? parseFloat( data ) :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ jQuery.data( elem, key, data );
+
+ } else {
+ data = undefined;
+ }
+ }
+
+ return data;
+}
+
+
+
+
+jQuery.extend({
+ queue: function( elem, type, data ) {
+ if ( !elem ) {
+ return;
+ }
+
+ type = (type || "fx") + "queue";
+ var q = jQuery.data( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( !data ) {
+ return q || [];
+ }
+
+ if ( !q || jQuery.isArray(data) ) {
+ q = jQuery.data( elem, type, jQuery.makeArray(data) );
+
+ } else {
+ q.push( data );
+ }
+
+ return q;
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ fn = queue.shift();
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ }
+
+ if ( fn ) {
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift("inprogress");
+ }
+
+ fn.call(elem, function() {
+ jQuery.dequeue(elem, type);
+ });
+ }
+ }
+});
+
+jQuery.fn.extend({
+ queue: function( type, data ) {
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ }
+
+ if ( data === undefined ) {
+ return jQuery.queue( this[0], type );
+ }
+ return this.each(function( i ) {
+ var queue = jQuery.queue( this, type, data );
+
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ dequeue: function( type ) {
+ return this.each(function() {
+ jQuery.dequeue( this, type );
+ });
+ },
+
+ // Based off of the plugin by Clint Helfers, with permission.
+ // http://blindsignals.com/index.php/2009/07/jquery-delay/
+ delay: function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function() {
+ var elem = this;
+ setTimeout(function() {
+ jQuery.dequeue( elem, type );
+ }, time );
+ });
+ },
+
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ }
+});
+
+
+
+
+var rclass = /[\n\t]/g,
+ rspaces = /\s+/,
+ rreturn = /\r/g,
+ rspecialurl = /^(?:href|src|style)$/,
+ rtype = /^(?:button|input)$/i,
+ rfocusable = /^(?:button|input|object|select|textarea)$/i,
+ rclickable = /^a(?:rea)?$/i,
+ rradiocheck = /^(?:radio|checkbox)$/i;
+
+jQuery.props = {
+ "for": "htmlFor",
+ "class": "className",
+ readonly: "readOnly",
+ maxlength: "maxLength",
+ cellspacing: "cellSpacing",
+ rowspan: "rowSpan",
+ colspan: "colSpan",
+ tabindex: "tabIndex",
+ usemap: "useMap",
+ frameborder: "frameBorder"
+};
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return jQuery.access( this, name, value, true, jQuery.attr );
+ },
+
+ removeAttr: function( name, fn ) {
+ return this.each(function(){
+ jQuery.attr( this, name, "" );
+ if ( this.nodeType === 1 ) {
+ this.removeAttribute( name );
+ }
+ });
+ },
+
+ addClass: function( value ) {
+ if ( jQuery.isFunction(value) ) {
+ return this.each(function(i) {
+ var self = jQuery(this);
+ self.addClass( value.call(this, i, self.attr("class")) );
+ });
+ }
+
+ if ( value && typeof value === "string" ) {
+ var classNames = (value || "").split( rspaces );
+
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ var elem = this[i];
+
+ if ( elem.nodeType === 1 ) {
+ if ( !elem.className ) {
+ elem.className = value;
+
+ } else {
+ var className = " " + elem.className + " ",
+ setClass = elem.className;
+
+ for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
+ if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
+ setClass += " " + classNames[c];
+ }
+ }
+ elem.className = jQuery.trim( setClass );
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ if ( jQuery.isFunction(value) ) {
+ return this.each(function(i) {
+ var self = jQuery(this);
+ self.removeClass( value.call(this, i, self.attr("class")) );
+ });
+ }
+
+ if ( (value && typeof value === "string") || value === undefined ) {
+ var classNames = (value || "").split( rspaces );
+
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ var elem = this[i];
+
+ if ( elem.nodeType === 1 && elem.className ) {
+ if ( value ) {
+ var className = (" " + elem.className + " ").replace(rclass, " ");
+ for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
+ className = className.replace(" " + classNames[c] + " ", " ");
+ }
+ elem.className = jQuery.trim( className );
+
+ } else {
+ elem.className = "";
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value,
+ isBool = typeof stateVal === "boolean";
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function(i) {
+ var self = jQuery(this);
+ self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
+ });
+ }
+
+ return this.each(function() {
+ if ( type === "string" ) {
+ // toggle individual class names
+ var className,
+ i = 0,
+ self = jQuery( this ),
+ state = stateVal,
+ classNames = value.split( rspaces );
+
+ while ( (className = classNames[ i++ ]) ) {
+ // check each className given, space seperated list
+ state = isBool ? state : !self.hasClass( className );
+ self[ state ? "addClass" : "removeClass" ]( className );
+ }
+
+ } else if ( type === "undefined" || type === "boolean" ) {
+ if ( this.className ) {
+ // store className if set
+ jQuery.data( this, "__className__", this.className );
+ }
+
+ // toggle whole className
+ this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
+ }
+ });
+ },
+
+ hasClass: function( selector ) {
+ var className = " " + selector + " ";
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ val: function( value ) {
+ if ( !arguments.length ) {
+ var elem = this[0];
+
+ if ( elem ) {
+ if ( jQuery.nodeName( elem, "option" ) ) {
+ // attributes.value is undefined in Blackberry 4.7 but
+ // uses .value. See #6932
+ var val = elem.attributes.value;
+ return !val || val.specified ? elem.value : elem.text;
+ }
+
+ // We need to handle select boxes special
+ if ( jQuery.nodeName( elem, "select" ) ) {
+ var index = elem.selectedIndex,
+ values = [],
+ options = elem.options,
+ one = elem.type === "select-one";
+
+ // Nothing was selected
+ if ( index < 0 ) {
+ return null;
+ }
+
+ // Loop through all the selected options
+ for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+ var option = options[ i ];
+
+ // Don't return options that are disabled or in a disabled optgroup
+ if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+ (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+ // Get the specific value for the option
+ value = jQuery(option).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ }
+
+ // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+ if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ }
+
+
+ // Everything else, we just grab the value
+ return (elem.value || "").replace(rreturn, "");
+
+ }
+
+ return undefined;
+ }
+
+ var isFunction = jQuery.isFunction(value);
+
+ return this.each(function(i) {
+ var self = jQuery(this), val = value;
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( isFunction ) {
+ val = value.call(this, i, self.val());
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+ } else if ( typeof val === "number" ) {
+ val += "";
+ } else if ( jQuery.isArray(val) ) {
+ val = jQuery.map(val, function (value) {
+ return value == null ? "" : value + "";
+ });
+ }
+
+ if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
+ this.checked = jQuery.inArray( self.val(), val ) >= 0;
+
+ } else if ( jQuery.nodeName( this, "select" ) ) {
+ var values = jQuery.makeArray(val);
+
+ jQuery( "option", this ).each(function() {
+ this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+ });
+
+ if ( !values.length ) {
+ this.selectedIndex = -1;
+ }
+
+ } else {
+ this.value = val;
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ attrFn: {
+ val: true,
+ css: true,
+ html: true,
+ text: true,
+ data: true,
+ width: true,
+ height: true,
+ offset: true
+ },
+
+ attr: function( elem, name, value, pass ) {
+ // don't set attributes on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return undefined;
+ }
+
+ if ( pass && name in jQuery.attrFn ) {
+ return jQuery(elem)[name](value);
+ }
+
+ var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
+ // Whether we are setting (or getting)
+ set = value !== undefined;
+
+ // Try to normalize/fix the name
+ name = notxml && jQuery.props[ name ] || name;
+
+ // These attributes require special treatment
+ var special = rspecialurl.test( name );
+
+ // Safari mis-reports the default selected property of an option
+ // Accessing the parent's selectedIndex property fixes it
+ if ( name === "selected" && !jQuery.support.optSelected ) {
+ var parent = elem.parentNode;
+ if ( parent ) {
+ parent.selectedIndex;
+
+ // Make sure that it also works with optgroups, see #5701
+ if ( parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ }
+ }
+
+ // If applicable, access the attribute via the DOM 0 way
+ // 'in' checks fail in Blackberry 4.7 #6931
+ if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) {
+ if ( set ) {
+ // We can't allow the type property to be changed (since it causes problems in IE)
+ if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
+ jQuery.error( "type property can't be changed" );
+ }
+
+ if ( value === null ) {
+ if ( elem.nodeType === 1 ) {
+ elem.removeAttribute( name );
+ }
+
+ } else {
+ elem[ name ] = value;
+ }
+ }
+
+ // browsers index elements by id/name on forms, give priority to attributes.
+ if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
+ return elem.getAttributeNode( name ).nodeValue;
+ }
+
+ // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+ // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+ if ( name === "tabIndex" ) {
+ var attributeNode = elem.getAttributeNode( "tabIndex" );
+
+ return attributeNode && attributeNode.specified ?
+ attributeNode.value :
+ rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+ 0 :
+ undefined;
+ }
+
+ return elem[ name ];
+ }
+
+ if ( !jQuery.support.style && notxml && name === "style" ) {
+ if ( set ) {
+ elem.style.cssText = "" + value;
+ }
+
+ return elem.style.cssText;
+ }
+
+ if ( set ) {
+ // convert the value to a string (all browsers do this but IE) see #1070
+ elem.setAttribute( name, "" + value );
+ }
+
+ // Ensure that missing attributes return undefined
+ // Blackberry 4.7 returns "" from getAttribute #6938
+ if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) {
+ return undefined;
+ }
+
+ var attr = !jQuery.support.hrefNormalized && notxml && special ?
+ // Some attributes require a special call on IE
+ elem.getAttribute( name, 2 ) :
+ elem.getAttribute( name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return attr === null ? undefined : attr;
+ }
+});
+
+
+
+
+var rnamespaces = /\.(.*)$/,
+ rformElems = /^(?:textarea|input|select)$/i,
+ rperiod = /\./g,
+ rspace = / /g,
+ rescape = /[^\w\s.|`]/g,
+ fcleanup = function( nm ) {
+ return nm.replace(rescape, "\\$&");
+ },
+ focusCounts = { focusin: 0, focusout: 0 };
+
+/*
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code originated from
+ * Dean Edwards' addEvent library.
+ */
+jQuery.event = {
+
+ // Bind an event to an element
+ // Original by Dean Edwards
+ add: function( elem, types, handler, data ) {
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // For whatever reason, IE has trouble passing the window object
+ // around, causing it to be cloned in the process
+ if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) {
+ elem = window;
+ }
+
+ if ( handler === false ) {
+ handler = returnFalse;
+ } else if ( !handler ) {
+ // Fixes bug #7229. Fix recommended by jdalton
+ return;
+ }
+
+ var handleObjIn, handleObj;
+
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ }
+
+ // Make sure that the function being executed has a unique ID
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure
+ var elemData = jQuery.data( elem );
+
+ // If no elemData is found then we must be trying to bind to one of the
+ // banned noData elements
+ if ( !elemData ) {
+ return;
+ }
+
+ // Use a key less likely to result in collisions for plain JS objects.
+ // Fixes bug #7150.
+ var eventKey = elem.nodeType ? "events" : "__events__",
+ events = elemData[ eventKey ],
+ eventHandle = elemData.handle;
+
+ if ( typeof events === "function" ) {
+ // On plain objects events is a fn that holds the the data
+ // which prevents this data from being JSON serialized
+ // the function does not need to be called, it just contains the data
+ eventHandle = events.handle;
+ events = events.events;
+
+ } else if ( !events ) {
+ if ( !elem.nodeType ) {
+ // On plain objects, create a fn that acts as the holder
+ // of the values to avoid JSON serialization of event data
+ elemData[ eventKey ] = elemData = function(){};
+ }
+
+ elemData.events = events = {};
+ }
+
+ if ( !eventHandle ) {
+ elemData.handle = eventHandle = function() {
+ // Handle the second event of a trigger and when
+ // an event is called after a page has unloaded
+ return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
+ jQuery.event.handle.apply( eventHandle.elem, arguments ) :
+ undefined;
+ };
+ }
+
+ // Add elem as a property of the handle function
+ // This is to prevent a memory leak with non-native events in IE.
+ eventHandle.elem = elem;
+
+ // Handle multiple events separated by a space
+ // jQuery(...).bind("mouseover mouseout", fn);
+ types = types.split(" ");
+
+ var type, i = 0, namespaces;
+
+ while ( (type = types[ i++ ]) ) {
+ handleObj = handleObjIn ?
+ jQuery.extend({}, handleObjIn) :
+ { handler: handler, data: data };
+
+ // Namespaced event handlers
+ if ( type.indexOf(".") > -1 ) {
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ handleObj.namespace = namespaces.slice(0).sort().join(".");
+
+ } else {
+ namespaces = [];
+ handleObj.namespace = "";
+ }
+
+ handleObj.type = type;
+ if ( !handleObj.guid ) {
+ handleObj.guid = handler.guid;
+ }
+
+ // Get the current list of functions bound to this event
+ var handlers = events[ type ],
+ special = jQuery.event.special[ type ] || {};
+
+ // Init the event handler queue
+ if ( !handlers ) {
+ handlers = events[ type ] = [];
+
+ // Check for a special event handler
+ // Only use addEventListener/attachEvent if the special
+ // events handler returns false
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+ // Bind the global event handler to the element
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle, false );
+
+ } else if ( elem.attachEvent ) {
+ elem.attachEvent( "on" + type, eventHandle );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add the function to the element's handler list
+ handlers.push( handleObj );
+
+ // Keep track of which events have been used, for global triggering
+ jQuery.event.global[ type ] = true;
+ }
+
+ // Nullify elem to prevent memory leaks in IE
+ elem = null;
+ },
+
+ global: {},
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, pos ) {
+ // don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ if ( handler === false ) {
+ handler = returnFalse;
+ }
+
+ var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
+ eventKey = elem.nodeType ? "events" : "__events__",
+ elemData = jQuery.data( elem ),
+ events = elemData && elemData[ eventKey ];
+
+ if ( !elemData || !events ) {
+ return;
+ }
+
+ if ( typeof events === "function" ) {
+ elemData = events;
+ events = events.events;
+ }
+
+ // types is actually an event object here
+ if ( types && types.type ) {
+ handler = types.handler;
+ types = types.type;
+ }
+
+ // Unbind all events for the element
+ if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
+ types = types || "";
+
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types );
+ }
+
+ return;
+ }
+
+ // Handle multiple events separated by a space
+ // jQuery(...).unbind("mouseover mouseout", fn);
+ types = types.split(" ");
+
+ while ( (type = types[ i++ ]) ) {
+ origType = type;
+ handleObj = null;
+ all = type.indexOf(".") < 0;
+ namespaces = [];
+
+ if ( !all ) {
+ // Namespaced event handlers
+ namespaces = type.split(".");
+ type = namespaces.shift();
+
+ namespace = new RegExp("(^|\\.)" +
+ jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
+ }
+
+ eventType = events[ type ];
+
+ if ( !eventType ) {
+ continue;
+ }
+
+ if ( !handler ) {
+ for ( j = 0; j < eventType.length; j++ ) {
+ handleObj = eventType[ j ];
+
+ if ( all || namespace.test( handleObj.namespace ) ) {
+ jQuery.event.remove( elem, origType, handleObj.handler, j );
+ eventType.splice( j--, 1 );
+ }
+ }
+
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+
+ for ( j = pos || 0; j < eventType.length; j++ ) {
+ handleObj = eventType[ j ];
+
+ if ( handler.guid === handleObj.guid ) {
+ // remove the given handler for the given type
+ if ( all || namespace.test( handleObj.namespace ) ) {
+ if ( pos == null ) {
+ eventType.splice( j--, 1 );
+ }
+
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+
+ if ( pos != null ) {
+ break;
+ }
+ }
+ }
+
+ // remove generic event handler if no more handlers exist
+ if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
+ if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ ret = null;
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ var handle = elemData.handle;
+ if ( handle ) {
+ handle.elem = null;
+ }
+
+ delete elemData.events;
+ delete elemData.handle;
+
+ if ( typeof elemData === "function" ) {
+ jQuery.removeData( elem, eventKey );
+
+ } else if ( jQuery.isEmptyObject( elemData ) ) {
+ jQuery.removeData( elem );
+ }
+ }
+ },
+
+ // bubbling is internal
+ trigger: function( event, data, elem /*, bubbling */ ) {
+ // Event object or event type
+ var type = event.type || event,
+ bubbling = arguments[3];
+
+ if ( !bubbling ) {
+ event = typeof event === "object" ?
+ // jQuery.Event object
+ event[ jQuery.expando ] ? event :
+ // Object literal
+ jQuery.extend( jQuery.Event(type), event ) :
+ // Just the event type (string)
+ jQuery.Event(type);
+
+ if ( type.indexOf("!") >= 0 ) {
+ event.type = type = type.slice(0, -1);
+ event.exclusive = true;
+ }
+
+ // Handle a global trigger
+ if ( !elem ) {
+ // Don't bubble custom events when global (to avoid too much overhead)
+ event.stopPropagation();
+
+ // Only trigger if we've ever bound an event for it
+ if ( jQuery.event.global[ type ] ) {
+ jQuery.each( jQuery.cache, function() {
+ if ( this.events && this.events[type] ) {
+ jQuery.event.trigger( event, data, this.handle.elem );
+ }
+ });
+ }
+ }
+
+ // Handle triggering a single element
+
+ // don't do events on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return undefined;
+ }
+
+ // Clean up in case it is reused
+ event.result = undefined;
+ event.target = elem;
+
+ // Clone the incoming data, if any
+ data = jQuery.makeArray( data );
+ data.unshift( event );
+ }
+
+ event.currentTarget = elem;
+
+ // Trigger the event, it is assumed that "handle" is a function
+ var handle = elem.nodeType ?
+ jQuery.data( elem, "handle" ) :
+ (jQuery.data( elem, "__events__" ) || {}).handle;
+
+ if ( handle ) {
+ handle.apply( elem, data );
+ }
+
+ var parent = elem.parentNode || elem.ownerDocument;
+
+ // Trigger an inline bound script
+ try {
+ if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
+ if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
+ event.result = false;
+ event.preventDefault();
+ }
+ }
+
+ // prevent IE from throwing an error for some elements with some event types, see #3533
+ } catch (inlineError) {}
+
+ if ( !event.isPropagationStopped() && parent ) {
+ jQuery.event.trigger( event, data, parent, true );
+
+ } else if ( !event.isDefaultPrevented() ) {
+ var old,
+ target = event.target,
+ targetType = type.replace( rnamespaces, "" ),
+ isClick = jQuery.nodeName( target, "a" ) && targetType === "click",
+ special = jQuery.event.special[ targetType ] || {};
+
+ if ( (!special._default || special._default.call( elem, event ) === false) &&
+ !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
+
+ try {
+ if ( target[ targetType ] ) {
+ // Make sure that we don't accidentally re-trigger the onFOO events
+ old = target[ "on" + targetType ];
+
+ if ( old ) {
+ target[ "on" + targetType ] = null;
+ }
+
+ jQuery.event.triggered = true;
+ target[ targetType ]();
+ }
+
+ // prevent IE from throwing an error for some elements with some event types, see #3533
+ } catch (triggerError) {}
+
+ if ( old ) {
+ target[ "on" + targetType ] = old;
+ }
+
+ jQuery.event.triggered = false;
+ }
+ }
+ },
+
+ handle: function( event ) {
+ var all, handlers, namespaces, namespace_re, events,
+ namespace_sort = [],
+ args = jQuery.makeArray( arguments );
+
+ event = args[0] = jQuery.event.fix( event || window.event );
+ event.currentTarget = this;
+
+ // Namespaced event handlers
+ all = event.type.indexOf(".") < 0 && !event.exclusive;
+
+ if ( !all ) {
+ namespaces = event.type.split(".");
+ event.type = namespaces.shift();
+ namespace_sort = namespaces.slice(0).sort();
+ namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)");
+ }
+
+ event.namespace = event.namespace || namespace_sort.join(".");
+
+ events = jQuery.data(this, this.nodeType ? "events" : "__events__");
+
+ if ( typeof events === "function" ) {
+ events = events.events;
+ }
+
+ handlers = (events || {})[ event.type ];
+
+ if ( events && handlers ) {
+ // Clone the handlers to prevent manipulation
+ handlers = handlers.slice(0);
+
+ for ( var j = 0, l = handlers.length; j < l; j++ ) {
+ var handleObj = handlers[ j ];
+
+ // Filter the functions by class
+ if ( all || namespace_re.test( handleObj.namespace ) ) {
+ // Pass in a reference to the handler function itself
+ // So that we can later remove it
+ event.handler = handleObj.handler;
+ event.data = handleObj.data;
+ event.handleObj = handleObj;
+
+ var ret = handleObj.handler.apply( this, args );
+
+ if ( ret !== undefined ) {
+ event.result = ret;
+ if ( ret === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+
+ if ( event.isImmediatePropagationStopped() ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // store a copy of the original event object
+ // and "clone" to set read-only properties
+ var originalEvent = event;
+ event = jQuery.Event( originalEvent );
+
+ for ( var i = this.props.length, prop; i; ) {
+ prop = this.props[ --i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Fix target property, if necessary
+ if ( !event.target ) {
+ // Fixes #1925 where srcElement might not be defined either
+ event.target = event.srcElement || document;
+ }
+
+ // check if target is a textnode (safari)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ // Add relatedTarget, if necessary
+ if ( !event.relatedTarget && event.fromElement ) {
+ event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
+ }
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && event.clientX != null ) {
+ var doc = document.documentElement,
+ body = document.body;
+
+ event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+ event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
+ }
+
+ // Add which for key events
+ if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
+ event.which = event.charCode != null ? event.charCode : event.keyCode;
+ }
+
+ // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+ if ( !event.metaKey && event.ctrlKey ) {
+ event.metaKey = event.ctrlKey;
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && event.button !== undefined ) {
+ event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+ }
+
+ return event;
+ },
+
+ // Deprecated, use jQuery.guid instead
+ guid: 1E8,
+
+ // Deprecated, use jQuery.proxy instead
+ proxy: jQuery.proxy,
+
+ special: {
+ ready: {
+ // Make sure the ready event is setup
+ setup: jQuery.bindReady,
+ teardown: jQuery.noop
+ },
+
+ live: {
+ add: function( handleObj ) {
+ jQuery.event.add( this,
+ liveConvert( handleObj.origType, handleObj.selector ),
+ jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
+ },
+
+ remove: function( handleObj ) {
+ jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
+ }
+ },
+
+ beforeunload: {
+ setup: function( data, namespaces, eventHandle ) {
+ // We only want to do this special case on windows
+ if ( jQuery.isWindow( this ) ) {
+ this.onbeforeunload = eventHandle;
+ }
+ },
+
+ teardown: function( namespaces, eventHandle ) {
+ if ( this.onbeforeunload === eventHandle ) {
+ this.onbeforeunload = null;
+ }
+ }
+ }
+ }
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+ function( elem, type, handle ) {
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle, false );
+ }
+ } :
+ function( elem, type, handle ) {
+ if ( elem.detachEvent ) {
+ elem.detachEvent( "on" + type, handle );
+ }
+ };
+
+jQuery.Event = function( src ) {
+ // Allow instantiation without the 'new' keyword
+ if ( !this.preventDefault ) {
+ return new jQuery.Event( src );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // timeStamp is buggy for some events on Firefox(#3843)
+ // So we won't rely on the native value
+ this.timeStamp = jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+ return false;
+}
+function returnTrue() {
+ return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ preventDefault: function() {
+ this.isDefaultPrevented = returnTrue;
+
+ var e = this.originalEvent;
+ if ( !e ) {
+ return;
+ }
+
+ // if preventDefault exists run it on the original event
+ if ( e.preventDefault ) {
+ e.preventDefault();
+
+ // otherwise set the returnValue property of the original event to false (IE)
+ } else {
+ e.returnValue = false;
+ }
+ },
+ stopPropagation: function() {
+ this.isPropagationStopped = returnTrue;
+
+ var e = this.originalEvent;
+ if ( !e ) {
+ return;
+ }
+ // if stopPropagation exists run it on the original event
+ if ( e.stopPropagation ) {
+ e.stopPropagation();
+ }
+ // otherwise set the cancelBubble property of the original event to true (IE)
+ e.cancelBubble = true;
+ },
+ stopImmediatePropagation: function() {
+ this.isImmediatePropagationStopped = returnTrue;
+ this.stopPropagation();
+ },
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse
+};
+
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function( event ) {
+ // Check if mouse(over|out) are still within the same parent element
+ var parent = event.relatedTarget;
+
+ // Firefox sometimes assigns relatedTarget a XUL element
+ // which we cannot access the parentNode property of
+ try {
+ // Traverse up the tree
+ while ( parent && parent !== this ) {
+ parent = parent.parentNode;
+ }
+
+ if ( parent !== this ) {
+ // set the correct event type
+ event.type = event.data;
+
+ // handle event if we actually just moused on to a non sub-element
+ jQuery.event.handle.apply( this, arguments );
+ }
+
+ // assuming we've left the element since we most likely mousedover a xul element
+ } catch(e) { }
+},
+
+// In case of event delegation, we only need to rename the event.type,
+// liveHandler will take care of the rest.
+delegate = function( event ) {
+ event.type = event.data;
+ jQuery.event.handle.apply( this, arguments );
+};
+
+// Create mouseenter and mouseleave events
+jQuery.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ setup: function( data ) {
+ jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
+ },
+ teardown: function( data ) {
+ jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
+ }
+ };
+});
+
+// submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+ jQuery.event.special.submit = {
+ setup: function( data, namespaces ) {
+ if ( this.nodeName.toLowerCase() !== "form" ) {
+ jQuery.event.add(this, "click.specialSubmit", function( e ) {
+ var elem = e.target,
+ type = elem.type;
+
+ if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
+ e.liveFired = undefined;
+ return trigger( "submit", this, arguments );
+ }
+ });
+
+ jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
+ var elem = e.target,
+ type = elem.type;
+
+ if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
+ e.liveFired = undefined;
+ return trigger( "submit", this, arguments );
+ }
+ });
+
+ } else {
+ return false;
+ }
+ },
+
+ teardown: function( namespaces ) {
+ jQuery.event.remove( this, ".specialSubmit" );
+ }
+ };
+
+}
+
+// change delegation, happens here so we have bind.
+if ( !jQuery.support.changeBubbles ) {
+
+ var changeFilters,
+
+ getVal = function( elem ) {
+ var type = elem.type, val = elem.value;
+
+ if ( type === "radio" || type === "checkbox" ) {
+ val = elem.checked;
+
+ } else if ( type === "select-multiple" ) {
+ val = elem.selectedIndex > -1 ?
+ jQuery.map( elem.options, function( elem ) {
+ return elem.selected;
+ }).join("-") :
+ "";
+
+ } else if ( elem.nodeName.toLowerCase() === "select" ) {
+ val = elem.selectedIndex;
+ }
+
+ return val;
+ },
+
+ testChange = function testChange( e ) {
+ var elem = e.target, data, val;
+
+ if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
+ return;
+ }
+
+ data = jQuery.data( elem, "_change_data" );
+ val = getVal(elem);
+
+ // the current data will be also retrieved by beforeactivate
+ if ( e.type !== "focusout" || elem.type !== "radio" ) {
+ jQuery.data( elem, "_change_data", val );
+ }
+
+ if ( data === undefined || val === data ) {
+ return;
+ }
+
+ if ( data != null || val ) {
+ e.type = "change";
+ e.liveFired = undefined;
+ return jQuery.event.trigger( e, arguments[1], elem );
+ }
+ };
+
+ jQuery.event.special.change = {
+ filters: {
+ focusout: testChange,
+
+ beforedeactivate: testChange,
+
+ click: function( e ) {
+ var elem = e.target, type = elem.type;
+
+ if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
+ return testChange.call( this, e );
+ }
+ },
+
+ // Change has to be called before submit
+ // Keydown will be called before keypress, which is used in submit-event delegation
+ keydown: function( e ) {
+ var elem = e.target, type = elem.type;
+
+ if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
+ (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
+ type === "select-multiple" ) {
+ return testChange.call( this, e );
+ }
+ },
+
+ // Beforeactivate happens also before the previous element is blurred
+ // with this event you can't trigger a change event, but you can store
+ // information
+ beforeactivate: function( e ) {
+ var elem = e.target;
+ jQuery.data( elem, "_change_data", getVal(elem) );
+ }
+ },
+
+ setup: function( data, namespaces ) {
+ if ( this.type === "file" ) {
+ return false;
+ }
+
+ for ( var type in changeFilters ) {
+ jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
+ }
+
+ return rformElems.test( this.nodeName );
+ },
+
+ teardown: function( namespaces ) {
+ jQuery.event.remove( this, ".specialChange" );
+
+ return rformElems.test( this.nodeName );
+ }
+ };
+
+ changeFilters = jQuery.event.special.change.filters;
+
+ // Handle when the input is .focus()'d
+ changeFilters.focus = changeFilters.beforeactivate;
+}
+
+function trigger( type, elem, args ) {
+ args[0].type = type;
+ return jQuery.event.handle.apply( elem, args );
+}
+
+// Create "bubbling" focus and blur events
+if ( document.addEventListener ) {
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+ if ( focusCounts[fix]++ === 0 ) {
+ document.addEventListener( orig, handler, true );
+ }
+ },
+ teardown: function() {
+ if ( --focusCounts[fix] === 0 ) {
+ document.removeEventListener( orig, handler, true );
+ }
+ }
+ };
+
+ function handler( e ) {
+ e = jQuery.event.fix( e );
+ e.type = fix;
+ return jQuery.event.trigger( e, null, e.target );
+ }
+ });
+}
+
+jQuery.each(["bind", "one"], function( i, name ) {
+ jQuery.fn[ name ] = function( type, data, fn ) {
+ // Handle object literals
+ if ( typeof type === "object" ) {
+ for ( var key in type ) {
+ this[ name ](key, data, type[key], fn);
+ }
+ return this;
+ }
+
+ if ( jQuery.isFunction( data ) || data === false ) {
+ fn = data;
+ data = undefined;
+ }
+
+ var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
+ jQuery( this ).unbind( event, handler );
+ return fn.apply( this, arguments );
+ }) : fn;
+
+ if ( type === "unload" && name !== "one" ) {
+ this.one( type, data, fn );
+
+ } else {
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ jQuery.event.add( this[i], type, handler, data );
+ }
+ }
+
+ return this;
+ };
+});
+
+jQuery.fn.extend({
+ unbind: function( type, fn ) {
+ // Handle object literals
+ if ( typeof type === "object" && !type.preventDefault ) {
+ for ( var key in type ) {
+ this.unbind(key, type[key]);
+ }
+
+ } else {
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ jQuery.event.remove( this[i], type, fn );
+ }
+ }
+
+ return this;
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.live( types, data, fn, selector );
+ },
+
+ undelegate: function( selector, types, fn ) {
+ if ( arguments.length === 0 ) {
+ return this.unbind( "live" );
+
+ } else {
+ return this.die( types, null, fn, selector );
+ }
+ },
+
+ trigger: function( type, data ) {
+ return this.each(function() {
+ jQuery.event.trigger( type, data, this );
+ });
+ },
+
+ triggerHandler: function( type, data ) {
+ if ( this[0] ) {
+ var event = jQuery.Event( type );
+ event.preventDefault();
+ event.stopPropagation();
+ jQuery.event.trigger( event, data, this[0] );
+ return event.result;
+ }
+ },
+
+ toggle: function( fn ) {
+ // Save reference to arguments for access in closure
+ var args = arguments,
+ i = 1;
+
+ // link all the functions, so any of them can unbind this click handler
+ while ( i < args.length ) {
+ jQuery.proxy( fn, args[ i++ ] );
+ }
+
+ return this.click( jQuery.proxy( fn, function( event ) {
+ // Figure out which function to execute
+ var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+ jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+ // Make sure that clicks stop
+ event.preventDefault();
+
+ // and execute the function
+ return args[ lastToggle ].apply( this, arguments ) || false;
+ }));
+ },
+
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ }
+});
+
+var liveMap = {
+ focus: "focusin",
+ blur: "focusout",
+ mouseenter: "mouseover",
+ mouseleave: "mouseout"
+};
+
+jQuery.each(["live", "die"], function( i, name ) {
+ jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
+ var type, i = 0, match, namespaces, preType,
+ selector = origSelector || this.selector,
+ context = origSelector ? this : jQuery( this.context );
+
+ if ( typeof types === "object" && !types.preventDefault ) {
+ for ( var key in types ) {
+ context[ name ]( key, data, types[key], selector );
+ }
+
+ return this;
+ }
+
+ if ( jQuery.isFunction( data ) ) {
+ fn = data;
+ data = undefined;
+ }
+
+ types = (types || "").split(" ");
+
+ while ( (type = types[ i++ ]) != null ) {
+ match = rnamespaces.exec( type );
+ namespaces = "";
+
+ if ( match ) {
+ namespaces = match[0];
+ type = type.replace( rnamespaces, "" );
+ }
+
+ if ( type === "hover" ) {
+ types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
+ continue;
+ }
+
+ preType = type;
+
+ if ( type === "focus" || type === "blur" ) {
+ types.push( liveMap[ type ] + namespaces );
+ type = type + namespaces;
+
+ } else {
+ type = (liveMap[ type ] || type) + namespaces;
+ }
+
+ if ( name === "live" ) {
+ // bind live handler
+ for ( var j = 0, l = context.length; j < l; j++ ) {
+ jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
+ { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
+ }
+
+ } else {
+ // unbind live handler
+ context.unbind( "live." + liveConvert( type, selector ), fn );
+ }
+ }
+
+ return this;
+ };
+});
+
+function liveHandler( event ) {
+ var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
+ elems = [],
+ selectors = [],
+ events = jQuery.data( this, this.nodeType ? "events" : "__events__" );
+
+ if ( typeof events === "function" ) {
+ events = events.events;
+ }
+
+ // Make sure we avoid non-left-click bubbling in Firefox (#3861)
+ if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) {
+ return;
+ }
+
+ if ( event.namespace ) {
+ namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
+ }
+
+ event.liveFired = this;
+
+ var live = events.live.slice(0);
+
+ for ( j = 0; j < live.length; j++ ) {
+ handleObj = live[j];
+
+ if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
+ selectors.push( handleObj.selector );
+
+ } else {
+ live.splice( j--, 1 );
+ }
+ }
+
+ match = jQuery( event.target ).closest( selectors, event.currentTarget );
+
+ for ( i = 0, l = match.length; i < l; i++ ) {
+ close = match[i];
+
+ for ( j = 0; j < live.length; j++ ) {
+ handleObj = live[j];
+
+ if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) ) {
+ elem = close.elem;
+ related = null;
+
+ // Those two events require additional checking
+ if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
+ event.type = handleObj.preType;
+ related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
+ }
+
+ if ( !related || related !== elem ) {
+ elems.push({ elem: elem, handleObj: handleObj, level: close.level });
+ }
+ }
+ }
+ }
+
+ for ( i = 0, l = elems.length; i < l; i++ ) {
+ match = elems[i];
+
+ if ( maxLevel && match.level > maxLevel ) {
+ break;
+ }
+
+ event.currentTarget = match.elem;
+ event.data = match.handleObj.data;
+ event.handleObj = match.handleObj;
+
+ ret = match.handleObj.origHandler.apply( match.elem, arguments );
+
+ if ( ret === false || event.isPropagationStopped() ) {
+ maxLevel = match.level;
+
+ if ( ret === false ) {
+ stop = false;
+ }
+ if ( event.isImmediatePropagationStopped() ) {
+ break;
+ }
+ }
+ }
+
+ return stop;
+}
+
+function liveConvert( type, selector ) {
+ return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&");
+}
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ if ( fn == null ) {
+ fn = data;
+ data = null;
+ }
+
+ return arguments.length > 0 ?
+ this.bind( name, data, fn ) :
+ this.trigger( name );
+ };
+
+ if ( jQuery.attrFn ) {
+ jQuery.attrFn[ name ] = true;
+ }
+});
+
+// Prevent memory leaks in IE
+// Window isn't included so as not to unbind existing unload events
+// More info:
+// - http://isaacschlueter.com/2006/10/msie-memory-leaks/
+if ( window.attachEvent && !window.addEventListener ) {
+ jQuery(window).bind("unload", function() {
+ for ( var id in jQuery.cache ) {
+ if ( jQuery.cache[ id ].handle ) {
+ // Try/Catch is to handle iframes being unloaded, see #4280
+ try {
+ jQuery.event.remove( jQuery.cache[ id ].handle.elem );
+ } catch(e) {}
+ }
+ }
+ });
+}
+
+
+/*!
+ * Sizzle CSS Selector Engine - v1.0
+ * Copyright 2009, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ * More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+ done = 0,
+ toString = Object.prototype.toString,
+ hasDuplicate = false,
+ baseHasDuplicate = true;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+// Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+ baseHasDuplicate = false;
+ return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+ results = results || [];
+ context = context || document;
+
+ var origContext = context;
+
+ if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+ return [];
+ }
+
+ if ( !selector || typeof selector !== "string" ) {
+ return results;
+ }
+
+ var m, set, checkSet, extra, ret, cur, pop, i,
+ prune = true,
+ contextXML = Sizzle.isXML( context ),
+ parts = [],
+ soFar = selector;
+
+ // Reset the position of the chunker regexp (start from head)
+ do {
+ chunker.exec( "" );
+ m = chunker.exec( soFar );
+
+ if ( m ) {
+ soFar = m[3];
+
+ parts.push( m[1] );
+
+ if ( m[2] ) {
+ extra = m[3];
+ break;
+ }
+ }
+ } while ( m );
+
+ if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+ if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+ set = posProcess( parts[0] + parts[1], context );
+
+ } else {
+ set = Expr.relative[ parts[0] ] ?
+ [ context ] :
+ Sizzle( parts.shift(), context );
+
+ while ( parts.length ) {
+ selector = parts.shift();
+
+ if ( Expr.relative[ selector ] ) {
+ selector += parts.shift();
+ }
+
+ set = posProcess( selector, set );
+ }
+ }
+
+ } else {
+ // Take a shortcut and set the context if the root selector is an ID
+ // (but not if it'll be faster if the inner selector is an ID)
+ if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+ Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+ ret = Sizzle.find( parts.shift(), context, contextXML );
+ context = ret.expr ?
+ Sizzle.filter( ret.expr, ret.set )[0] :
+ ret.set[0];
+ }
+
+ if ( context ) {
+ ret = seed ?
+ { expr: parts.pop(), set: makeArray(seed) } :
+ Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+ set = ret.expr ?
+ Sizzle.filter( ret.expr, ret.set ) :
+ ret.set;
+
+ if ( parts.length > 0 ) {
+ checkSet = makeArray( set );
+
+ } else {
+ prune = false;
+ }
+
+ while ( parts.length ) {
+ cur = parts.pop();
+ pop = cur;
+
+ if ( !Expr.relative[ cur ] ) {
+ cur = "";
+ } else {
+ pop = parts.pop();
+ }
+
+ if ( pop == null ) {
+ pop = context;
+ }
+
+ Expr.relative[ cur ]( checkSet, pop, contextXML );
+ }
+
+ } else {
+ checkSet = parts = [];
+ }
+ }
+
+ if ( !checkSet ) {
+ checkSet = set;
+ }
+
+ if ( !checkSet ) {
+ Sizzle.error( cur || selector );
+ }
+
+ if ( toString.call(checkSet) === "[object Array]" ) {
+ if ( !prune ) {
+ results.push.apply( results, checkSet );
+
+ } else if ( context && context.nodeType === 1 ) {
+ for ( i = 0; checkSet[i] != null; i++ ) {
+ if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+ results.push( set[i] );
+ }
+ }
+
+ } else {
+ for ( i = 0; checkSet[i] != null; i++ ) {
+ if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+ results.push( set[i] );
+ }
+ }
+ }
+
+ } else {
+ makeArray( checkSet, results );
+ }
+
+ if ( extra ) {
+ Sizzle( extra, origContext, results, seed );
+ Sizzle.uniqueSort( results );
+ }
+
+ return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+ if ( sortOrder ) {
+ hasDuplicate = baseHasDuplicate;
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ for ( var i = 1; i < results.length; i++ ) {
+ if ( results[i] === results[ i - 1 ] ) {
+ results.splice( i--, 1 );
+ }
+ }
+ }
+ }
+
+ return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+ return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+ return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+ var set;
+
+ if ( !expr ) {
+ return [];
+ }
+
+ for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
+ var match,
+ type = Expr.order[i];
+
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+ var left = match[1];
+ match.splice( 1, 1 );
+
+ if ( left.substr( left.length - 1 ) !== "\\" ) {
+ match[1] = (match[1] || "").replace(/\\/g, "");
+ set = Expr.find[ type ]( match, context, isXML );
+
+ if ( set != null ) {
+ expr = expr.replace( Expr.match[ type ], "" );
+ break;
+ }
+ }
+ }
+ }
+
+ if ( !set ) {
+ set = context.getElementsByTagName( "*" );
+ }
+
+ return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+ var match, anyFound,
+ old = expr,
+ result = [],
+ curLoop = set,
+ isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+ while ( expr && set.length ) {
+ for ( var type in Expr.filter ) {
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+ var found, item,
+ filter = Expr.filter[ type ],
+ left = match[1];
+
+ anyFound = false;
+
+ match.splice(1,1);
+
+ if ( left.substr( left.length - 1 ) === "\\" ) {
+ continue;
+ }
+
+ if ( curLoop === result ) {
+ result = [];
+ }
+
+ if ( Expr.preFilter[ type ] ) {
+ match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+ if ( !match ) {
+ anyFound = found = true;
+
+ } else if ( match === true ) {
+ continue;
+ }
+ }
+
+ if ( match ) {
+ for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
+ if ( item ) {
+ found = filter( item, match, i, curLoop );
+ var pass = not ^ !!found;
+
+ if ( inplace && found != null ) {
+ if ( pass ) {
+ anyFound = true;
+
+ } else {
+ curLoop[i] = false;
+ }
+
+ } else if ( pass ) {
+ result.push( item );
+ anyFound = true;
+ }
+ }
+ }
+ }
+
+ if ( found !== undefined ) {
+ if ( !inplace ) {
+ curLoop = result;
+ }
+
+ expr = expr.replace( Expr.match[ type ], "" );
+
+ if ( !anyFound ) {
+ return [];
+ }
+
+ break;
+ }
+ }
+ }
+
+ // Improper expression
+ if ( expr === old ) {
+ if ( anyFound == null ) {
+ Sizzle.error( expr );
+
+ } else {
+ break;
+ }
+ }
+
+ old = expr;
+ }
+
+ return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+ throw "Syntax error, unrecognized expression: " + msg;
+};
+
+var Expr = Sizzle.selectors = {
+ order: [ "ID", "NAME", "TAG" ],
+
+ match: {
+ ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+ CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+ NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+ ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
+ TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+ CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
+ POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+ PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+ },
+
+ leftMatch: {},
+
+ attrMap: {
+ "class": "className",
+ "for": "htmlFor"
+ },
+
+ attrHandle: {
+ href: function( elem ) {
+ return elem.getAttribute( "href" );
+ }
+ },
+
+ relative: {
+ "+": function(checkSet, part){
+ var isPartStr = typeof part === "string",
+ isTag = isPartStr && !/\W/.test( part ),
+ isPartStrNotTag = isPartStr && !isTag;
+
+ if ( isTag ) {
+ part = part.toLowerCase();
+ }
+
+ for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+ if ( (elem = checkSet[i]) ) {
+ while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+ checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+ elem || false :
+ elem === part;
+ }
+ }
+
+ if ( isPartStrNotTag ) {
+ Sizzle.filter( part, checkSet, true );
+ }
+ },
+
+ ">": function( checkSet, part ) {
+ var elem,
+ isPartStr = typeof part === "string",
+ i = 0,
+ l = checkSet.length;
+
+ if ( isPartStr && !/\W/.test( part ) ) {
+ part = part.toLowerCase();
+
+ for ( ; i < l; i++ ) {
+ elem = checkSet[i];
+
+ if ( elem ) {
+ var parent = elem.parentNode;
+ checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+ }
+ }
+
+ } else {
+ for ( ; i < l; i++ ) {
+ elem = checkSet[i];
+
+ if ( elem ) {
+ checkSet[i] = isPartStr ?
+ elem.parentNode :
+ elem.parentNode === part;
+ }
+ }
+
+ if ( isPartStr ) {
+ Sizzle.filter( part, checkSet, true );
+ }
+ }
+ },
+
+ "": function(checkSet, part, isXML){
+ var nodeCheck,
+ doneName = done++,
+ checkFn = dirCheck;
+
+ if ( typeof part === "string" && !/\W/.test(part) ) {
+ part = part.toLowerCase();
+ nodeCheck = part;
+ checkFn = dirNodeCheck;
+ }
+
+ checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+ },
+
+ "~": function( checkSet, part, isXML ) {
+ var nodeCheck,
+ doneName = done++,
+ checkFn = dirCheck;
+
+ if ( typeof part === "string" && !/\W/.test( part ) ) {
+ part = part.toLowerCase();
+ nodeCheck = part;
+ checkFn = dirNodeCheck;
+ }
+
+ checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+ }
+ },
+
+ find: {
+ ID: function( match, context, isXML ) {
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
+ var m = context.getElementById(match[1]);
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [m] : [];
+ }
+ },
+
+ NAME: function( match, context ) {
+ if ( typeof context.getElementsByName !== "undefined" ) {
+ var ret = [],
+ results = context.getElementsByName( match[1] );
+
+ for ( var i = 0, l = results.length; i < l; i++ ) {
+ if ( results[i].getAttribute("name") === match[1] ) {
+ ret.push( results[i] );
+ }
+ }
+
+ return ret.length === 0 ? null : ret;
+ }
+ },
+
+ TAG: function( match, context ) {
+ return context.getElementsByTagName( match[1] );
+ }
+ },
+ preFilter: {
+ CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+ match = " " + match[1].replace(/\\/g, "") + " ";
+
+ if ( isXML ) {
+ return match;
+ }
+
+ for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+ if ( elem ) {
+ if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) {
+ if ( !inplace ) {
+ result.push( elem );
+ }
+
+ } else if ( inplace ) {
+ curLoop[i] = false;
+ }
+ }
+ }
+
+ return false;
+ },
+
+ ID: function( match ) {
+ return match[1].replace(/\\/g, "");
+ },
+
+ TAG: function( match, curLoop ) {
+ return match[1].toLowerCase();
+ },
+
+ CHILD: function( match ) {
+ if ( match[1] === "nth" ) {
+ // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+ var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
+ match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+ !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+ // calculate the numbers (first)n+(last) including if they are negative
+ match[2] = (test[1] + (test[2] || 1)) - 0;
+ match[3] = test[3] - 0;
+ }
+
+ // TODO: Move to normal caching system
+ match[0] = done++;
+
+ return match;
+ },
+
+ ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+ var name = match[1].replace(/\\/g, "");
+
+ if ( !isXML && Expr.attrMap[name] ) {
+ match[1] = Expr.attrMap[name];
+ }
+
+ if ( match[2] === "~=" ) {
+ match[4] = " " + match[4] + " ";
+ }
+
+ return match;
+ },
+
+ PSEUDO: function( match, curLoop, inplace, result, not ) {
+ if ( match[1] === "not" ) {
+ // If we're dealing with a complex expression, or a simple one
+ if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+ match[3] = Sizzle(match[3], null, null, curLoop);
+
+ } else {
+ var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+ if ( !inplace ) {
+ result.push.apply( result, ret );
+ }
+
+ return false;
+ }
+
+ } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+ return true;
+ }
+
+ return match;
+ },
+
+ POS: function( match ) {
+ match.unshift( true );
+
+ return match;
+ }
+ },
+
+ filters: {
+ enabled: function( elem ) {
+ return elem.disabled === false && elem.type !== "hidden";
+ },
+
+ disabled: function( elem ) {
+ return elem.disabled === true;
+ },
+
+ checked: function( elem ) {
+ return elem.checked === true;
+ },
+
+ selected: function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ elem.parentNode.selectedIndex;
+
+ return elem.selected === true;
+ },
+
+ parent: function( elem ) {
+ return !!elem.firstChild;
+ },
+
+ empty: function( elem ) {
+ return !elem.firstChild;
+ },
+
+ has: function( elem, i, match ) {
+ return !!Sizzle( match[3], elem ).length;
+ },
+
+ header: function( elem ) {
+ return (/h\d/i).test( elem.nodeName );
+ },
+
+ text: function( elem ) {
+ return "text" === elem.type;
+ },
+ radio: function( elem ) {
+ return "radio" === elem.type;
+ },
+
+ checkbox: function( elem ) {
+ return "checkbox" === elem.type;
+ },
+
+ file: function( elem ) {
+ return "file" === elem.type;
+ },
+ password: function( elem ) {
+ return "password" === elem.type;
+ },
+
+ submit: function( elem ) {
+ return "submit" === elem.type;
+ },
+
+ image: function( elem ) {
+ return "image" === elem.type;
+ },
+
+ reset: function( elem ) {
+ return "reset" === elem.type;
+ },
+
+ button: function( elem ) {
+ return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
+ },
+
+ input: function( elem ) {
+ return (/input|select|textarea|button/i).test( elem.nodeName );
+ }
+ },
+ setFilters: {
+ first: function( elem, i ) {
+ return i === 0;
+ },
+
+ last: function( elem, i, match, array ) {
+ return i === array.length - 1;
+ },
+
+ even: function( elem, i ) {
+ return i % 2 === 0;
+ },
+
+ odd: function( elem, i ) {
+ return i % 2 === 1;
+ },
+
+ lt: function( elem, i, match ) {
+ return i < match[3] - 0;
+ },
+
+ gt: function( elem, i, match ) {
+ return i > match[3] - 0;
+ },
+
+ nth: function( elem, i, match ) {
+ return match[3] - 0 === i;
+ },
+
+ eq: function( elem, i, match ) {
+ return match[3] - 0 === i;
+ }
+ },
+ filter: {
+ PSEUDO: function( elem, match, i, array ) {
+ var name = match[1],
+ filter = Expr.filters[ name ];
+
+ if ( filter ) {
+ return filter( elem, i, match, array );
+
+ } else if ( name === "contains" ) {
+ return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+ } else if ( name === "not" ) {
+ var not = match[3];
+
+ for ( var j = 0, l = not.length; j < l; j++ ) {
+ if ( not[j] === elem ) {
+ return false;
+ }
+ }
+
+ return true;
+
+ } else {
+ Sizzle.error( "Syntax error, unrecognized expression: " + name );
+ }
+ },
+
+ CHILD: function( elem, match ) {
+ var type = match[1],
+ node = elem;
+
+ switch ( type ) {
+ case "only":
+ case "first":
+ while ( (node = node.previousSibling) ) {
+ if ( node.nodeType === 1 ) {
+ return false;
+ }
+ }
+
+ if ( type === "first" ) {
+ return true;
+ }
+
+ node = elem;
+
+ case "last":
+ while ( (node = node.nextSibling) ) {
+ if ( node.nodeType === 1 ) {
+ return false;
+ }
+ }
+
+ return true;
+
+ case "nth":
+ var first = match[2],
+ last = match[3];
+
+ if ( first === 1 && last === 0 ) {
+ return true;
+ }
+
+ var doneName = match[0],
+ parent = elem.parentNode;
+
+ if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
+ var count = 0;
+
+ for ( node = parent.firstChild; node; node = node.nextSibling ) {
+ if ( node.nodeType === 1 ) {
+ node.nodeIndex = ++count;
+ }
+ }
+
+ parent.sizcache = doneName;
+ }
+
+ var diff = elem.nodeIndex - last;
+
+ if ( first === 0 ) {
+ return diff === 0;
+
+ } else {
+ return ( diff % first === 0 && diff / first >= 0 );
+ }
+ }
+ },
+
+ ID: function( elem, match ) {
+ return elem.nodeType === 1 && elem.getAttribute("id") === match;
+ },
+
+ TAG: function( elem, match ) {
+ return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
+ },
+
+ CLASS: function( elem, match ) {
+ return (" " + (elem.className || elem.getAttribute("class")) + " ")
+ .indexOf( match ) > -1;
+ },
+
+ ATTR: function( elem, match ) {
+ var name = match[1],
+ result = Expr.attrHandle[ name ] ?
+ Expr.attrHandle[ name ]( elem ) :
+ elem[ name ] != null ?
+ elem[ name ] :
+ elem.getAttribute( name ),
+ value = result + "",
+ type = match[2],
+ check = match[4];
+
+ return result == null ?
+ type === "!=" :
+ type === "=" ?
+ value === check :
+ type === "*=" ?
+ value.indexOf(check) >= 0 :
+ type === "~=" ?
+ (" " + value + " ").indexOf(check) >= 0 :
+ !check ?
+ value && result !== false :
+ type === "!=" ?
+ value !== check :
+ type === "^=" ?
+ value.indexOf(check) === 0 :
+ type === "$=" ?
+ value.substr(value.length - check.length) === check :
+ type === "|=" ?
+ value === check || value.substr(0, check.length + 1) === check + "-" :
+ false;
+ },
+
+ POS: function( elem, match, i, array ) {
+ var name = match[2],
+ filter = Expr.setFilters[ name ];
+
+ if ( filter ) {
+ return filter( elem, i, match, array );
+ }
+ }
+ }
+};
+
+var origPOS = Expr.match.POS,
+ fescape = function(all, num){
+ return "\\" + (num - 0 + 1);
+ };
+
+for ( var type in Expr.match ) {
+ Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+ Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+
+var makeArray = function( array, results ) {
+ array = Array.prototype.slice.call( array, 0 );
+
+ if ( results ) {
+ results.push.apply( results, array );
+ return results;
+ }
+
+ return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+ Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+ makeArray = function( array, results ) {
+ var i = 0,
+ ret = results || [];
+
+ if ( toString.call(array) === "[object Array]" ) {
+ Array.prototype.push.apply( ret, array );
+
+ } else {
+ if ( typeof array.length === "number" ) {
+ for ( var l = array.length; i < l; i++ ) {
+ ret.push( array[i] );
+ }
+
+ } else {
+ for ( ; array[i]; i++ ) {
+ ret.push( array[i] );
+ }
+ }
+ }
+
+ return ret;
+ };
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+ return a.compareDocumentPosition ? -1 : 1;
+ }
+
+ return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+ };
+
+} else {
+ sortOrder = function( a, b ) {
+ var al, bl,
+ ap = [],
+ bp = [],
+ aup = a.parentNode,
+ bup = b.parentNode,
+ cur = aup;
+
+ // The nodes are identical, we can exit early
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+
+ // If the nodes are siblings (or identical) we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+
+ // If no parents were found then the nodes are disconnected
+ } else if ( !aup ) {
+ return -1;
+
+ } else if ( !bup ) {
+ return 1;
+ }
+
+ // Otherwise they're somewhere else in the tree so we need
+ // to build up a full list of the parentNodes for comparison
+ while ( cur ) {
+ ap.unshift( cur );
+ cur = cur.parentNode;
+ }
+
+ cur = bup;
+
+ while ( cur ) {
+ bp.unshift( cur );
+ cur = cur.parentNode;
+ }
+
+ al = ap.length;
+ bl = bp.length;
+
+ // Start walking down the tree looking for a discrepancy
+ for ( var i = 0; i < al && i < bl; i++ ) {
+ if ( ap[i] !== bp[i] ) {
+ return siblingCheck( ap[i], bp[i] );
+ }
+ }
+
+ // We ended someplace up the tree so do a sibling check
+ return i === al ?
+ siblingCheck( a, bp[i], -1 ) :
+ siblingCheck( ap[i], b, 1 );
+ };
+
+ siblingCheck = function( a, b, ret ) {
+ if ( a === b ) {
+ return ret;
+ }
+
+ var cur = a.nextSibling;
+
+ while ( cur ) {
+ if ( cur === b ) {
+ return -1;
+ }
+
+ cur = cur.nextSibling;
+ }
+
+ return 1;
+ };
+}
+
+// Utility function for retreiving the text value of an array of DOM nodes
+Sizzle.getText = function( elems ) {
+ var ret = "", elem;
+
+ for ( var i = 0; elems[i]; i++ ) {
+ elem = elems[i];
+
+ // Get the text from text nodes and CDATA nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
+ ret += elem.nodeValue;
+
+ // Traverse everything else, except comment nodes
+ } else if ( elem.nodeType !== 8 ) {
+ ret += Sizzle.getText( elem.childNodes );
+ }
+ }
+
+ return ret;
+};
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+ // We're going to inject a fake input element with a specified name
+ var form = document.createElement("div"),
+ id = "script" + (new Date()).getTime(),
+ root = document.documentElement;
+
+ form.innerHTML = "<a name='" + id + "'/>";
+
+ // Inject it into the root element, check its status, and remove it quickly
+ root.insertBefore( form, root.firstChild );
+
+ // The workaround has to do additional checks after a getElementById
+ // Which slows things down for other browsers (hence the branching)
+ if ( document.getElementById( id ) ) {
+ Expr.find.ID = function( match, context, isXML ) {
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
+ var m = context.getElementById(match[1]);
+
+ return m ?
+ m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+ [m] :
+ undefined :
+ [];
+ }
+ };
+
+ Expr.filter.ID = function( elem, match ) {
+ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+ return elem.nodeType === 1 && node && node.nodeValue === match;
+ };
+ }
+
+ root.removeChild( form );
+
+ // release memory in IE
+ root = form = null;
+})();
+
+(function(){
+ // Check to see if the browser returns only elements
+ // when doing getElementsByTagName("*")
+
+ // Create a fake element
+ var div = document.createElement("div");
+ div.appendChild( document.createComment("") );
+
+ // Make sure no comments are found
+ if ( div.getElementsByTagName("*").length > 0 ) {
+ Expr.find.TAG = function( match, context ) {
+ var results = context.getElementsByTagName( match[1] );
+
+ // Filter out possible comments
+ if ( match[1] === "*" ) {
+ var tmp = [];
+
+ for ( var i = 0; results[i]; i++ ) {
+ if ( results[i].nodeType === 1 ) {
+ tmp.push( results[i] );
+ }
+ }
+
+ results = tmp;
+ }
+
+ return results;
+ };
+ }
+
+ // Check to see if an attribute returns normalized href attributes
+ div.innerHTML = "<a href='#'></a>";
+
+ if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+ div.firstChild.getAttribute("href") !== "#" ) {
+
+ Expr.attrHandle.href = function( elem ) {
+ return elem.getAttribute( "href", 2 );
+ };
+ }
+
+ // release memory in IE
+ div = null;
+})();
+
+if ( document.querySelectorAll ) {
+ (function(){
+ var oldSizzle = Sizzle,
+ div = document.createElement("div"),
+ id = "__sizzle__";
+
+ div.innerHTML = "<p class='TEST'></p>";
+
+ // Safari can't handle uppercase or unicode characters when
+ // in quirks mode.
+ if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+ return;
+ }
+
+ Sizzle = function( query, context, extra, seed ) {
+ context = context || document;
+
+ // Make sure that attribute selectors are quoted
+ query = query.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+ // Only use querySelectorAll on non-XML documents
+ // (ID selectors don't work in non-HTML documents)
+ if ( !seed && !Sizzle.isXML(context) ) {
+ if ( context.nodeType === 9 ) {
+ try {
+ return makeArray( context.querySelectorAll(query), extra );
+ } catch(qsaError) {}
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+ var old = context.getAttribute( "id" ),
+ nid = old || id;
+
+ if ( !old ) {
+ context.setAttribute( "id", nid );
+ }
+
+ try {
+ return makeArray( context.querySelectorAll( "#" + nid + " " + query ), extra );
+
+ } catch(pseudoError) {
+ } finally {
+ if ( !old ) {
+ context.removeAttribute( "id" );
+ }
+ }
+ }
+ }
+
+ return oldSizzle(query, context, extra, seed);
+ };
+
+ for ( var prop in oldSizzle ) {
+ Sizzle[ prop ] = oldSizzle[ prop ];
+ }
+
+ // release memory in IE
+ div = null;
+ })();
+}
+
+(function(){
+ var html = document.documentElement,
+ matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector,
+ pseudoWorks = false;
+
+ try {
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( document.documentElement, "[test!='']:sizzle" );
+
+ } catch( pseudoError ) {
+ pseudoWorks = true;
+ }
+
+ if ( matches ) {
+ Sizzle.matchesSelector = function( node, expr ) {
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+ if ( !Sizzle.isXML( node ) ) {
+ try {
+ if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+ return matches.call( node, expr );
+ }
+ } catch(e) {}
+ }
+
+ return Sizzle(expr, null, null, [node]).length > 0;
+ };
+ }
+})();
+
+(function(){
+ var div = document.createElement("div");
+
+ div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+ // Opera can't find a second classname (in 9.6)
+ // Also, make sure that getElementsByClassName actually exists
+ if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+ return;
+ }
+
+ // Safari caches class attributes, doesn't catch changes (in 3.2)
+ div.lastChild.className = "e";
+
+ if ( div.getElementsByClassName("e").length === 1 ) {
+ return;
+ }
+
+ Expr.order.splice(1, 0, "CLASS");
+ Expr.find.CLASS = function( match, context, isXML ) {
+ if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+ return context.getElementsByClassName(match[1]);
+ }
+ };
+
+ // release memory in IE
+ div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+
+ if ( elem ) {
+ var match = false;
+
+ elem = elem[dir];
+
+ while ( elem ) {
+ if ( elem.sizcache === doneName ) {
+ match = checkSet[elem.sizset];
+ break;
+ }
+
+ if ( elem.nodeType === 1 && !isXML ){
+ elem.sizcache = doneName;
+ elem.sizset = i;
+ }
+
+ if ( elem.nodeName.toLowerCase() === cur ) {
+ match = elem;
+ break;
+ }
+
+ elem = elem[dir];
+ }
+
+ checkSet[i] = match;
+ }
+ }
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+
+ if ( elem ) {
+ var match = false;
+
+ elem = elem[dir];
+
+ while ( elem ) {
+ if ( elem.sizcache === doneName ) {
+ match = checkSet[elem.sizset];
+ break;
+ }
+
+ if ( elem.nodeType === 1 ) {
+ if ( !isXML ) {
+ elem.sizcache = doneName;
+ elem.sizset = i;
+ }
+
+ if ( typeof cur !== "string" ) {
+ if ( elem === cur ) {
+ match = true;
+ break;
+ }
+
+ } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+ match = elem;
+ break;
+ }
+ }
+
+ elem = elem[dir];
+ }
+
+ checkSet[i] = match;
+ }
+ }
+}
+
+if ( document.documentElement.contains ) {
+ Sizzle.contains = function( a, b ) {
+ return a !== b && (a.contains ? a.contains(b) : true);
+ };
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+ Sizzle.contains = function( a, b ) {
+ return !!(a.compareDocumentPosition(b) & 16);
+ };
+
+} else {
+ Sizzle.contains = function() {
+ return false;
+ };
+}
+
+Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context ) {
+ var match,
+ tmpSet = [],
+ later = "",
+ root = context.nodeType ? [context] : context;
+
+ // Position selectors must be done after the filter
+ // And so must :not(positional) so we move all PSEUDOs to the end
+ while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+ later += match[0];
+ selector = selector.replace( Expr.match.PSEUDO, "" );
+ }
+
+ selector = Expr.relative[selector] ? selector + "*" : selector;
+
+ for ( var i = 0, l = root.length; i < l; i++ ) {
+ Sizzle( selector, root[i], tmpSet );
+ }
+
+ return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+ rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+ // Note: This RegExp should be improved, or likely pulled from Sizzle
+ rmultiselector = /,/,
+ isSimple = /^.[^:#\[\.,]*$/,
+ slice = Array.prototype.slice,
+ POS = jQuery.expr.match.POS;
+
+jQuery.fn.extend({
+ find: function( selector ) {
+ var ret = this.pushStack( "", "find", selector ),
+ length = 0;
+
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ length = ret.length;
+ jQuery.find( selector, this[i], ret );
+
+ if ( i > 0 ) {
+ // Make sure that the results are unique
+ for ( var n = length; n < ret.length; n++ ) {
+ for ( var r = 0; r < length; r++ ) {
+ if ( ret[r] === ret[n] ) {
+ ret.splice(n--, 1);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ return ret;
+ },
+
+ has: function( target ) {
+ var targets = jQuery( target );
+ return this.filter(function() {
+ for ( var i = 0, l = targets.length; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[i] ) ) {
+ return true;
+ }
+ }
+ });
+ },
+
+ not: function( selector ) {
+ return this.pushStack( winnow(this, selector, false), "not", selector);
+ },
+
+ filter: function( selector ) {
+ return this.pushStack( winnow(this, selector, true), "filter", selector );
+ },
+
+ is: function( selector ) {
+ return !!selector && jQuery.filter( selector, this ).length > 0;
+ },
+
+ closest: function( selectors, context ) {
+ var ret = [], i, l, cur = this[0];
+
+ if ( jQuery.isArray( selectors ) ) {
+ var match, selector,
+ matches = {},
+ level = 1;
+
+ if ( cur && selectors.length ) {
+ for ( i = 0, l = selectors.length; i < l; i++ ) {
+ selector = selectors[i];
+
+ if ( !matches[selector] ) {
+ matches[selector] = jQuery.expr.match.POS.test( selector ) ?
+ jQuery( selector, context || this.context ) :
+ selector;
+ }
+ }
+
+ while ( cur && cur.ownerDocument && cur !== context ) {
+ for ( selector in matches ) {
+ match = matches[selector];
+
+ if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
+ ret.push({ selector: selector, elem: cur, level: level });
+ }
+ }
+
+ cur = cur.parentNode;
+ level++;
+ }
+ }
+
+ return ret;
+ }
+
+ var pos = POS.test( selectors ) ?
+ jQuery( selectors, context || this.context ) : null;
+
+ for ( i = 0, l = this.length; i < l; i++ ) {
+ cur = this[i];
+
+ while ( cur ) {
+ if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+ ret.push( cur );
+ break;
+
+ } else {
+ cur = cur.parentNode;
+ if ( !cur || !cur.ownerDocument || cur === context ) {
+ break;
+ }
+ }
+ }
+ }
+
+ ret = ret.length > 1 ? jQuery.unique(ret) : ret;
+
+ return this.pushStack( ret, "closest", selectors );
+ },
+
+ // Determine the position of an element within
+ // the matched set of elements
+ index: function( elem ) {
+ if ( !elem || typeof elem === "string" ) {
+ return jQuery.inArray( this[0],
+ // If it receives a string, the selector is used
+ // If it receives nothing, the siblings are used
+ elem ? jQuery( elem ) : this.parent().children() );
+ }
+ // Locate the position of the desired element
+ return jQuery.inArray(
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[0] : elem, this );
+ },
+
+ add: function( selector, context ) {
+ var set = typeof selector === "string" ?
+ jQuery( selector, context || this.context ) :
+ jQuery.makeArray( selector ),
+ all = jQuery.merge( this.get(), set );
+
+ return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+ all :
+ jQuery.unique( all ) );
+ },
+
+ andSelf: function() {
+ return this.add( this.prevObject );
+ }
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+ return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return jQuery.dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return jQuery.nth( elem, 2, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return jQuery.nth( elem, 2, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return jQuery.dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return jQuery.dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return jQuery.sibling( elem.parentNode.firstChild, elem );
+ },
+ children: function( elem ) {
+ return jQuery.sibling( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return jQuery.nodeName( elem, "iframe" ) ?
+ elem.contentDocument || elem.contentWindow.document :
+ jQuery.makeArray( elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var ret = jQuery.map( this, fn, until );
+
+ if ( !runtil.test( name ) ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ ret = jQuery.filter( selector, ret );
+ }
+
+ ret = this.length > 1 ? jQuery.unique( ret ) : ret;
+
+ if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+ ret = ret.reverse();
+ }
+
+ return this.pushStack( ret, name, slice.call(arguments).join(",") );
+ };
+});
+
+jQuery.extend({
+ filter: function( expr, elems, not ) {
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 ?
+ jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+ jQuery.find.matches(expr, elems);
+ },
+
+ dir: function( elem, dir, until ) {
+ var matched = [],
+ cur = elem[ dir ];
+
+ while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+ if ( cur.nodeType === 1 ) {
+ matched.push( cur );
+ }
+ cur = cur[dir];
+ }
+ return matched;
+ },
+
+ nth: function( cur, result, dir, elem ) {
+ result = result || 1;
+ var num = 0;
+
+ for ( ; cur; cur = cur[dir] ) {
+ if ( cur.nodeType === 1 && ++num === result ) {
+ break;
+ }
+ }
+
+ return cur;
+ },
+
+ sibling: function( n, elem ) {
+ var r = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ r.push( n );
+ }
+ }
+
+ return r;
+ }
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep(elements, function( elem, i ) {
+ var retVal = !!qualifier.call( elem, i, elem );
+ return retVal === keep;
+ });
+
+ } else if ( qualifier.nodeType ) {
+ return jQuery.grep(elements, function( elem, i ) {
+ return (elem === qualifier) === keep;
+ });
+
+ } else if ( typeof qualifier === "string" ) {
+ var filtered = jQuery.grep(elements, function( elem ) {
+ return elem.nodeType === 1;
+ });
+
+ if ( isSimple.test( qualifier ) ) {
+ return jQuery.filter(qualifier, filtered, !keep);
+ } else {
+ qualifier = jQuery.filter( qualifier, filtered );
+ }
+ }
+
+ return jQuery.grep(elements, function( elem, i ) {
+ return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
+ });
+}
+
+
+
+
+var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+ rleadingWhitespace = /^\s+/,
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+ rtagName = /<([\w:]+)/,
+ rtbody = /<tbody/i,
+ rhtml = /<|&#?\w+;/,
+ rnocache = /<(?:script|object|embed|option|style)/i,
+ // checked="checked" or checked (html5)
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ raction = /\=([^="'>\s]+\/)>/g,
+ wrapMap = {
+ option: [ 1, "<select multiple='multiple'>", "</select>" ],
+ legend: [ 1, "<fieldset>", "</fieldset>" ],
+ thead: [ 1, "<table>", "</table>" ],
+ tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+ col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+ area: [ 1, "<map>", "</map>" ],
+ _default: [ 0, "", "" ]
+ };
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+ wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+ text: function( text ) {
+ if ( jQuery.isFunction(text) ) {
+ return this.each(function(i) {
+ var self = jQuery( this );
+
+ self.text( text.call(this, i, self.text()) );
+ });
+ }
+
+ if ( typeof text !== "object" && text !== undefined ) {
+ return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+ }
+
+ return jQuery.text( this );
+ },
+
+ wrapAll: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function(i) {
+ jQuery(this).wrapAll( html.call(this, i) );
+ });
+ }
+
+ if ( this[0] ) {
+ // The elements to wrap the target around
+ var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+ if ( this[0].parentNode ) {
+ wrap.insertBefore( this[0] );
+ }
+
+ wrap.map(function() {
+ var elem = this;
+
+ while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+ elem = elem.firstChild;
+ }
+
+ return elem;
+ }).append(this);
+ }
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function(i) {
+ jQuery(this).wrapInner( html.call(this, i) );
+ });
+ }
+
+ return this.each(function() {
+ var self = jQuery( this ),
+ contents = self.contents();
+
+ if ( contents.length ) {
+ contents.wrapAll( html );
+
+ } else {
+ self.append( html );
+ }
+ });
+ },
+
+ wrap: function( html ) {
+ return this.each(function() {
+ jQuery( this ).wrapAll( html );
+ });
+ },
+
+ unwrap: function() {
+ return this.parent().each(function() {
+ if ( !jQuery.nodeName( this, "body" ) ) {
+ jQuery( this ).replaceWith( this.childNodes );
+ }
+ }).end();
+ },
+
+ append: function() {
+ return this.domManip(arguments, true, function( elem ) {
+ if ( this.nodeType === 1 ) {
+ this.appendChild( elem );
+ }
+ });
+ },
+
+ prepend: function() {
+ return this.domManip(arguments, true, function( elem ) {
+ if ( this.nodeType === 1 ) {
+ this.insertBefore( elem, this.firstChild );
+ }
+ });
+ },
+
+ before: function() {
+ if ( this[0] && this[0].parentNode ) {
+ return this.domManip(arguments, false, function( elem ) {
+ this.parentNode.insertBefore( elem, this );
+ });
+ } else if ( arguments.length ) {
+ var set = jQuery(arguments[0]);
+ set.push.apply( set, this.toArray() );
+ return this.pushStack( set, "before", arguments );
+ }
+ },
+
+ after: function() {
+ if ( this[0] && this[0].parentNode ) {
+ return this.domManip(arguments, false, function( elem ) {
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ });
+ } else if ( arguments.length ) {
+ var set = this.pushStack( this, "after", arguments );
+ set.push.apply( set, jQuery(arguments[0]).toArray() );
+ return set;
+ }
+ },
+
+ // keepData is for internal use only--do not document
+ remove: function( selector, keepData ) {
+ for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+ if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+ if ( !keepData && elem.nodeType === 1 ) {
+ jQuery.cleanData( elem.getElementsByTagName("*") );
+ jQuery.cleanData( [ elem ] );
+ }
+
+ if ( elem.parentNode ) {
+ elem.parentNode.removeChild( elem );
+ }
+ }
+ }
+
+ return this;
+ },
+
+ empty: function() {
+ for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+ // Remove element nodes and prevent memory leaks
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( elem.getElementsByTagName("*") );
+ }
+
+ // Remove any remaining nodes
+ while ( elem.firstChild ) {
+ elem.removeChild( elem.firstChild );
+ }
+ }
+
+ return this;
+ },
+
+ clone: function( events ) {
+ // Do the clone
+ var ret = this.map(function() {
+ if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
+ // IE copies events bound via attachEvent when
+ // using cloneNode. Calling detachEvent on the
+ // clone will also remove the events from the orignal
+ // In order to get around this, we use innerHTML.
+ // Unfortunately, this means some modifications to
+ // attributes in IE that are actually only stored
+ // as properties will not be copied (such as the
+ // the name attribute on an input).
+ var html = this.outerHTML,
+ ownerDocument = this.ownerDocument;
+
+ if ( !html ) {
+ var div = ownerDocument.createElement("div");
+ div.appendChild( this.cloneNode(true) );
+ html = div.innerHTML;
+ }
+
+ return jQuery.clean([html.replace(rinlinejQuery, "")
+ // Handle the case in IE 8 where action=/test/> self-closes a tag
+ .replace(raction, '="$1">')
+ .replace(rleadingWhitespace, "")], ownerDocument)[0];
+ } else {
+ return this.cloneNode(true);
+ }
+ });
+
+ // Copy the events from the original to the clone
+ if ( events === true ) {
+ cloneCopyEvent( this, ret );
+ cloneCopyEvent( this.find("*"), ret.find("*") );
+ }
+
+ // Return the cloned set
+ return ret;
+ },
+
+ html: function( value ) {
+ if ( value === undefined ) {
+ return this[0] && this[0].nodeType === 1 ?
+ this[0].innerHTML.replace(rinlinejQuery, "") :
+ null;
+
+ // See if we can take a shortcut and just use innerHTML
+ } else if ( typeof value === "string" && !rnocache.test( value ) &&
+ (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+ !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+ value = value.replace(rxhtmlTag, "<$1></$2>");
+
+ try {
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ // Remove element nodes and prevent memory leaks
+ if ( this[i].nodeType === 1 ) {
+ jQuery.cleanData( this[i].getElementsByTagName("*") );
+ this[i].innerHTML = value;
+ }
+ }
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch(e) {
+ this.empty().append( value );
+ }
+
+ } else if ( jQuery.isFunction( value ) ) {
+ this.each(function(i){
+ var self = jQuery( this );
+
+ self.html( value.call(this, i, self.html()) );
+ });
+
+ } else {
+ this.empty().append( value );
+ }
+
+ return this;
+ },
+
+ replaceWith: function( value ) {
+ if ( this[0] && this[0].parentNode ) {
+ // Make sure that the elements are removed from the DOM before they are inserted
+ // this can help fix replacing a parent with child elements
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function(i) {
+ var self = jQuery(this), old = self.html();
+ self.replaceWith( value.call( this, i, old ) );
+ });
+ }
+
+ if ( typeof value !== "string" ) {
+ value = jQuery( value ).detach();
+ }
+
+ return this.each(function() {
+ var next = this.nextSibling,
+ parent = this.parentNode;
+
+ jQuery( this ).remove();
+
+ if ( next ) {
+ jQuery(next).before( value );
+ } else {
+ jQuery(parent).append( value );
+ }
+ });
+ } else {
+ return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
+ }
+ },
+
+ detach: function( selector ) {
+ return this.remove( selector, true );
+ },
+
+ domManip: function( args, table, callback ) {
+ var results, first, fragment, parent,
+ value = args[0],
+ scripts = [];
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+ return this.each(function() {
+ jQuery(this).domManip( args, table, callback, true );
+ });
+ }
+
+ if ( jQuery.isFunction(value) ) {
+ return this.each(function(i) {
+ var self = jQuery(this);
+ args[0] = value.call(this, i, table ? self.html() : undefined);
+ self.domManip( args, table, callback );
+ });
+ }
+
+ if ( this[0] ) {
+ parent = value && value.parentNode;
+
+ // If we're in a fragment, just use that instead of building a new one
+ if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+ results = { fragment: parent };
+
+ } else {
+ results = jQuery.buildFragment( args, this, scripts );
+ }
+
+ fragment = results.fragment;
+
+ if ( fragment.childNodes.length === 1 ) {
+ first = fragment = fragment.firstChild;
+ } else {
+ first = fragment.firstChild;
+ }
+
+ if ( first ) {
+ table = table && jQuery.nodeName( first, "tr" );
+
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ callback.call(
+ table ?
+ root(this[i], first) :
+ this[i],
+ i > 0 || results.cacheable || this.length > 1 ?
+ fragment.cloneNode(true) :
+ fragment
+ );
+ }
+ }
+
+ if ( scripts.length ) {
+ jQuery.each( scripts, evalScript );
+ }
+ }
+
+ return this;
+ }
+});
+
+function root( elem, cur ) {
+ return jQuery.nodeName(elem, "table") ?
+ (elem.getElementsByTagName("tbody")[0] ||
+ elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+ elem;
+}
+
+function cloneCopyEvent(orig, ret) {
+ var i = 0;
+
+ ret.each(function() {
+ if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) {
+ return;
+ }
+
+ var oldData = jQuery.data( orig[i++] ),
+ curData = jQuery.data( this, oldData ),
+ events = oldData && oldData.events;
+
+ if ( events ) {
+ delete curData.handle;
+ curData.events = {};
+
+ for ( var type in events ) {
+ for ( var handler in events[ type ] ) {
+ jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
+ }
+ }
+ }
+ });
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+ var fragment, cacheable, cacheresults,
+ doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
+
+ // Only cache "small" (1/2 KB) strings that are associated with the main document
+ // Cloning options loses the selected state, so don't cache them
+ // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+ // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+ if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
+ !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
+
+ cacheable = true;
+ cacheresults = jQuery.fragments[ args[0] ];
+ if ( cacheresults ) {
+ if ( cacheresults !== 1 ) {
+ fragment = cacheresults;
+ }
+ }
+ }
+
+ if ( !fragment ) {
+ fragment = doc.createDocumentFragment();
+ jQuery.clean( args, doc, fragment, scripts );
+ }
+
+ if ( cacheable ) {
+ jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
+ }
+
+ return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function( name, original ) {
+ jQuery.fn[ name ] = function( selector ) {
+ var ret = [],
+ insert = jQuery( selector ),
+ parent = this.length === 1 && this[0].parentNode;
+
+ if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+ insert[ original ]( this[0] );
+ return this;
+
+ } else {
+ for ( var i = 0, l = insert.length; i < l; i++ ) {
+ var elems = (i > 0 ? this.clone(true) : this).get();
+ jQuery( insert[i] )[ original ]( elems );
+ ret = ret.concat( elems );
+ }
+
+ return this.pushStack( ret, name, insert.selector );
+ }
+ };
+});
+
+jQuery.extend({
+ clean: function( elems, context, fragment, scripts ) {
+ context = context || document;
+
+ // !context.createElement fails in IE with an error but returns typeof 'object'
+ if ( typeof context.createElement === "undefined" ) {
+ context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+ }
+
+ var ret = [];
+
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+ if ( typeof elem === "number" ) {
+ elem += "";
+ }
+
+ if ( !elem ) {
+ continue;
+ }
+
+ // Convert html string into DOM nodes
+ if ( typeof elem === "string" && !rhtml.test( elem ) ) {
+ elem = context.createTextNode( elem );
+
+ } else if ( typeof elem === "string" ) {
+ // Fix "XHTML"-style tags in all browsers
+ elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+ // Trim whitespace, otherwise indexOf won't work as expected
+ var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
+ wrap = wrapMap[ tag ] || wrapMap._default,
+ depth = wrap[0],
+ div = context.createElement("div");
+
+ // Go to html and back, then peel off extra wrappers
+ div.innerHTML = wrap[1] + elem + wrap[2];
+
+ // Move to the right depth
+ while ( depth-- ) {
+ div = div.lastChild;
+ }
+
+ // Remove IE's autoinserted <tbody> from table fragments
+ if ( !jQuery.support.tbody ) {
+
+ // String was a <table>, *may* have spurious <tbody>
+ var hasBody = rtbody.test(elem),
+ tbody = tag === "table" && !hasBody ?
+ div.firstChild && div.firstChild.childNodes :
+
+ // String was a bare <thead> or <tfoot>
+ wrap[1] === "<table>" && !hasBody ?
+ div.childNodes :
+ [];
+
+ for ( var j = tbody.length - 1; j >= 0 ; --j ) {
+ if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+ tbody[ j ].parentNode.removeChild( tbody[ j ] );
+ }
+ }
+
+ }
+
+ // IE completely kills leading whitespace when innerHTML is used
+ if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+ div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+ }
+
+ elem = div.childNodes;
+ }
+
+ if ( elem.nodeType ) {
+ ret.push( elem );
+ } else {
+ ret = jQuery.merge( ret, elem );
+ }
+ }
+
+ if ( fragment ) {
+ for ( i = 0; ret[i]; i++ ) {
+ if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+ scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+ } else {
+ if ( ret[i].nodeType === 1 ) {
+ ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
+ }
+ fragment.appendChild( ret[i] );
+ }
+ }
+ }
+
+ return ret;
+ },
+
+ cleanData: function( elems ) {
+ var data, id, cache = jQuery.cache,
+ special = jQuery.event.special,
+ deleteExpando = jQuery.support.deleteExpando;
+
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+ if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+ continue;
+ }
+
+ id = elem[ jQuery.expando ];
+
+ if ( id ) {
+ data = cache[ id ];
+
+ if ( data && data.events ) {
+ for ( var type in data.events ) {
+ if ( special[ type ] ) {
+ jQuery.event.remove( elem, type );
+
+ } else {
+ jQuery.removeEvent( elem, type, data.handle );
+ }
+ }
+ }
+
+ if ( deleteExpando ) {
+ delete elem[ jQuery.expando ];
+
+ } else if ( elem.removeAttribute ) {
+ elem.removeAttribute( jQuery.expando );
+ }
+
+ delete cache[ id ];
+ }
+ }
+ }
+});
+
+function evalScript( i, elem ) {
+ if ( elem.src ) {
+ jQuery.ajax({
+ url: elem.src,
+ async: false,
+ dataType: "script"
+ });
+ } else {
+ jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
+ }
+
+ if ( elem.parentNode ) {
+ elem.parentNode.removeChild( elem );
+ }
+}
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+ ropacity = /opacity=([^)]*)/,
+ rdashAlpha = /-([a-z])/ig,
+ rupper = /([A-Z])/g,
+ rnumpx = /^-?\d+(?:px)?$/i,
+ rnum = /^-?\d/,
+
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+ cssWidth = [ "Left", "Right" ],
+ cssHeight = [ "Top", "Bottom" ],
+ curCSS,
+
+ getComputedStyle,
+ currentStyle,
+
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ };
+
+jQuery.fn.css = function( name, value ) {
+ // Setting 'undefined' is a no-op
+ if ( arguments.length === 2 && value === undefined ) {
+ return this;
+ }
+
+ return jQuery.access( this, name, value, true, function( elem, name, value ) {
+ return value !== undefined ?
+ jQuery.style( elem, name, value ) :
+ jQuery.css( elem, name );
+ });
+};
+
+jQuery.extend({
+ // Add in style property hooks for overriding the default
+ // behavior of getting and setting a style property
+ cssHooks: {
+ opacity: {
+ get: function( elem, computed ) {
+ if ( computed ) {
+ // We should always get a number back from opacity
+ var ret = curCSS( elem, "opacity", "opacity" );
+ return ret === "" ? "1" : ret;
+
+ } else {
+ return elem.style.opacity;
+ }
+ }
+ }
+ },
+
+ // Exclude the following css properties to add px
+ cssNumber: {
+ "zIndex": true,
+ "fontWeight": true,
+ "opacity": true,
+ "zoom": true,
+ "lineHeight": true
+ },
+
+ // Add in properties whose names you wish to fix before
+ // setting or getting the value
+ cssProps: {
+ // normalize float css property
+ "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+ },
+
+ // Get and set the style property on a DOM Node
+ style: function( elem, name, value, extra ) {
+ // Don't set styles on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+ return;
+ }
+
+ // Make sure that we're working with the right name
+ var ret, origName = jQuery.camelCase( name ),
+ style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+ name = jQuery.cssProps[ origName ] || origName;
+
+ // Check if we're setting a value
+ if ( value !== undefined ) {
+ // Make sure that NaN and null values aren't set. See: #7116
+ if ( typeof value === "number" && isNaN( value ) || value == null ) {
+ return;
+ }
+
+ // If a number was passed in, add 'px' to the (except for certain CSS properties)
+ if ( typeof value === "number" && !jQuery.cssNumber[ origName ] ) {
+ value += "px";
+ }
+
+ // If a hook was provided, use that value, otherwise just set the specified value
+ if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+ // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+ // Fixes bug #5509
+ try {
+ style[ name ] = value;
+ } catch(e) {}
+ }
+
+ } else {
+ // If a hook was provided get the non-computed value from there
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+ return ret;
+ }
+
+ // Otherwise just get the value from the style object
+ return style[ name ];
+ }
+ },
+
+ css: function( elem, name, extra ) {
+ // Make sure that we're working with the right name
+ var ret, origName = jQuery.camelCase( name ),
+ hooks = jQuery.cssHooks[ origName ];
+
+ name = jQuery.cssProps[ origName ] || origName;
+
+ // If a hook was provided get the computed value from there
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+ return ret;
+
+ // Otherwise, if a way to get the computed value exists, use that
+ } else if ( curCSS ) {
+ return curCSS( elem, name, origName );
+ }
+ },
+
+ // A method for quickly swapping in/out CSS properties to get correct calculations
+ swap: function( elem, options, callback ) {
+ var old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( var name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ callback.call( elem );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+ },
+
+ camelCase: function( string ) {
+ return string.replace( rdashAlpha, fcamelCase );
+ }
+});
+
+// DEPRECATED, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+jQuery.each(["height", "width"], function( i, name ) {
+ jQuery.cssHooks[ name ] = {
+ get: function( elem, computed, extra ) {
+ var val;
+
+ if ( computed ) {
+ if ( elem.offsetWidth !== 0 ) {
+ val = getWH( elem, name, extra );
+
+ } else {
+ jQuery.swap( elem, cssShow, function() {
+ val = getWH( elem, name, extra );
+ });
+ }
+
+ if ( val <= 0 ) {
+ val = curCSS( elem, name, name );
+
+ if ( val === "0px" && currentStyle ) {
+ val = currentStyle( elem, name, name );
+ }
+
+ if ( val != null ) {
+ // Should return "auto" instead of 0, use 0 for
+ // temporary backwards-compat
+ return val === "" || val === "auto" ? "0px" : val;
+ }
+ }
+
+ if ( val < 0 || val == null ) {
+ val = elem.style[ name ];
+
+ // Should return "auto" instead of 0, use 0 for
+ // temporary backwards-compat
+ return val === "" || val === "auto" ? "0px" : val;
+ }
+
+ return typeof val === "string" ? val : val + "px";
+ }
+ },
+
+ set: function( elem, value ) {
+ if ( rnumpx.test( value ) ) {
+ // ignore negative width and height values #1599
+ value = parseFloat(value);
+
+ if ( value >= 0 ) {
+ return value + "px";
+ }
+
+ } else {
+ return value;
+ }
+ }
+ };
+});
+
+if ( !jQuery.support.opacity ) {
+ jQuery.cssHooks.opacity = {
+ get: function( elem, computed ) {
+ // IE uses filters for opacity
+ return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ?
+ (parseFloat(RegExp.$1) / 100) + "" :
+ computed ? "1" : "";
+ },
+
+ set: function( elem, value ) {
+ var style = elem.style;
+
+ // IE has trouble with opacity if it does not have layout
+ // Force it by setting the zoom level
+ style.zoom = 1;
+
+ // Set the alpha filter to set the opacity
+ var opacity = jQuery.isNaN(value) ?
+ "" :
+ "alpha(opacity=" + value * 100 + ")",
+ filter = style.filter || "";
+
+ style.filter = ralpha.test(filter) ?
+ filter.replace(ralpha, opacity) :
+ style.filter + ' ' + opacity;
+ }
+ };
+}
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+ getComputedStyle = function( elem, newName, name ) {
+ var ret, defaultView, computedStyle;
+
+ name = name.replace( rupper, "-$1" ).toLowerCase();
+
+ if ( !(defaultView = elem.ownerDocument.defaultView) ) {
+ return undefined;
+ }
+
+ if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+ ret = computedStyle.getPropertyValue( name );
+ if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+ ret = jQuery.style( elem, name );
+ }
+ }
+
+ return ret;
+ };
+}
+
+if ( document.documentElement.currentStyle ) {
+ currentStyle = function( elem, name ) {
+ var left, rsLeft,
+ ret = elem.currentStyle && elem.currentStyle[ name ],
+ style = elem.style;
+
+ // From the awesome hack by Dean Edwards
+ // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+ // If we're not dealing with a regular pixel number
+ // but a number that has a weird ending, we need to convert it to pixels
+ if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+ // Remember the original values
+ left = style.left;
+ rsLeft = elem.runtimeStyle.left;
+
+ // Put in the new values to get a computed value out
+ elem.runtimeStyle.left = elem.currentStyle.left;
+ style.left = name === "fontSize" ? "1em" : (ret || 0);
+ ret = style.pixelLeft + "px";
+
+ // Revert the changed values
+ style.left = left;
+ elem.runtimeStyle.left = rsLeft;
+ }
+
+ return ret === "" ? "auto" : ret;
+ };
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWH( elem, name, extra ) {
+ var which = name === "width" ? cssWidth : cssHeight,
+ val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
+
+ if ( extra === "border" ) {
+ return val;
+ }
+
+ jQuery.each( which, function() {
+ if ( !extra ) {
+ val -= parseFloat(jQuery.css( elem, "padding" + this )) || 0;
+ }
+
+ if ( extra === "margin" ) {
+ val += parseFloat(jQuery.css( elem, "margin" + this )) || 0;
+
+ } else {
+ val -= parseFloat(jQuery.css( elem, "border" + this + "Width" )) || 0;
+ }
+ });
+
+ return val;
+}
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+ jQuery.expr.filters.hidden = function( elem ) {
+ var width = elem.offsetWidth,
+ height = elem.offsetHeight;
+
+ return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
+ };
+
+ jQuery.expr.filters.visible = function( elem ) {
+ return !jQuery.expr.filters.hidden( elem );
+ };
+}
+
+
+
+
+var jsc = jQuery.now(),
+ rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+ rselectTextarea = /^(?:select|textarea)/i,
+ rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+ rnoContent = /^(?:GET|HEAD)$/,
+ rbracket = /\[\]$/,
+ jsre = /\=\?(&|$)/,
+ rquery = /\?/,
+ rts = /([?&])_=[^&]*/,
+ rurl = /^(\w+:)?\/\/([^\/?#]+)/,
+ r20 = /%20/g,
+ rhash = /#.*$/,
+
+ // Keep a copy of the old load method
+ _load = jQuery.fn.load;
+
+jQuery.fn.extend({
+ load: function( url, params, callback ) {
+ if ( typeof url !== "string" && _load ) {
+ return _load.apply( this, arguments );
+
+ // Don't do a request if no elements are being requested
+ } else if ( !this.length ) {
+ return this;
+ }
+
+ var off = url.indexOf(" ");
+ if ( off >= 0 ) {
+ var selector = url.slice(off, url.length);
+ url = url.slice(0, off);
+ }
+
+ // Default to a GET request
+ var type = "GET";
+
+ // If the second parameter was provided
+ if ( params ) {
+ // If it's a function
+ if ( jQuery.isFunction( params ) ) {
+ // We assume that it's the callback
+ callback = params;
+ params = null;
+
+ // Otherwise, build a param string
+ } else if ( typeof params === "object" ) {
+ params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+ type = "POST";
+ }
+ }
+
+ var self = this;
+
+ // Request the remote document
+ jQuery.ajax({
+ url: url,
+ type: type,
+ dataType: "html",
+ data: params,
+ complete: function( res, status ) {
+ // If successful, inject the HTML into all the matched elements
+ if ( status === "success" || status === "notmodified" ) {
+ // See if a selector was specified
+ self.html( selector ?
+ // Create a dummy div to hold the results
+ jQuery("<div>")
+ // inject the contents of the document in, removing the scripts
+ // to avoid any 'Permission Denied' errors in IE
+ .append(res.responseText.replace(rscript, ""))
+
+ // Locate the specified elements
+ .find(selector) :
+
+ // If not, just inject the full result
+ res.responseText );
+ }
+
+ if ( callback ) {
+ self.each( callback, [res.responseText, status, res] );
+ }
+ }
+ });
+
+ return this;
+ },
+
+ serialize: function() {
+ return jQuery.param(this.serializeArray());
+ },
+
+ serializeArray: function() {
+ return this.map(function() {
+ return this.elements ? jQuery.makeArray(this.elements) : this;
+ })
+ .filter(function() {
+ return this.name && !this.disabled &&
+ (this.checked || rselectTextarea.test(this.nodeName) ||
+ rinput.test(this.type));
+ })
+ .map(function( i, elem ) {
+ var val = jQuery(this).val();
+
+ return val == null ?
+ null :
+ jQuery.isArray(val) ?
+ jQuery.map( val, function( val, i ) {
+ return { name: elem.name, value: val };
+ }) :
+ { name: elem.name, value: val };
+ }).get();
+ }
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function( i, o ) {
+ jQuery.fn[o] = function( f ) {
+ return this.bind(o, f);
+ };
+});
+
+jQuery.extend({
+ get: function( url, data, callback, type ) {
+ // shift arguments if data argument was omited
+ if ( jQuery.isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = null;
+ }
+
+ return jQuery.ajax({
+ type: "GET",
+ url: url,
+ data: data,
+ success: callback,
+ dataType: type
+ });
+ },
+
+ getScript: function( url, callback ) {
+ return jQuery.get(url, null, callback, "script");
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get(url, data, callback, "json");
+ },
+
+ post: function( url, data, callback, type ) {
+ // shift arguments if data argument was omited
+ if ( jQuery.isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = {};
+ }
+
+ return jQuery.ajax({
+ type: "POST",
+ url: url,
+ data: data,
+ success: callback,
+ dataType: type
+ });
+ },
+
+ ajaxSetup: function( settings ) {
+ jQuery.extend( jQuery.ajaxSettings, settings );
+ },
+
+ ajaxSettings: {
+ url: location.href,
+ global: true,
+ type: "GET",
+ contentType: "application/x-www-form-urlencoded",
+ processData: true,
+ async: true,
+ /*
+ timeout: 0,
+ data: null,
+ username: null,
+ password: null,
+ traditional: false,
+ */
+ // This function can be overriden by calling jQuery.ajaxSetup
+ xhr: function() {
+ return new window.XMLHttpRequest();
+ },
+ accepts: {
+ xml: "application/xml, text/xml",
+ html: "text/html",
+ script: "text/javascript, application/javascript",
+ json: "application/json, text/javascript",
+ text: "text/plain",
+ _default: "*/*"
+ }
+ },
+
+ ajax: function( origSettings ) {
+ var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings),
+ jsonp, status, data, type = s.type.toUpperCase(), noContent = rnoContent.test(type);
+
+ s.url = s.url.replace( rhash, "" );
+
+ // Use original (not extended) context object if it was provided
+ s.context = origSettings && origSettings.context != null ? origSettings.context : s;
+
+ // convert data if not already a string
+ if ( s.data && s.processData && typeof s.data !== "string" ) {
+ s.data = jQuery.param( s.data, s.traditional );
+ }
+
+ // Handle JSONP Parameter Callbacks
+ if ( s.dataType === "jsonp" ) {
+ if ( type === "GET" ) {
+ if ( !jsre.test( s.url ) ) {
+ s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?";
+ }
+ } else if ( !s.data || !jsre.test(s.data) ) {
+ s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
+ }
+ s.dataType = "json";
+ }
+
+ // Build temporary JSONP function
+ if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
+ jsonp = s.jsonpCallback || ("jsonp" + jsc++);
+
+ // Replace the =? sequence both in the query string and the data
+ if ( s.data ) {
+ s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
+ }
+
+ s.url = s.url.replace(jsre, "=" + jsonp + "$1");
+
+ // We need to make sure
+ // that a JSONP style response is executed properly
+ s.dataType = "script";
+
+ // Handle JSONP-style loading
+ var customJsonp = window[ jsonp ];
+
+ window[ jsonp ] = function( tmp ) {
+ if ( jQuery.isFunction( customJsonp ) ) {
+ customJsonp( tmp );
+
+ } else {
+ // Garbage collect
+ window[ jsonp ] = undefined;
+
+ try {
+ delete window[ jsonp ];
+ } catch( jsonpError ) {}
+ }
+
+ data = tmp;
+ jQuery.handleSuccess( s, xhr, status, data );
+ jQuery.handleComplete( s, xhr, status, data );
+
+ if ( head ) {
+ head.removeChild( script );
+ }
+ };
+ }
+
+ if ( s.dataType === "script" && s.cache === null ) {
+ s.cache = false;
+ }
+
+ if ( s.cache === false && noContent ) {
+ var ts = jQuery.now();
+
+ // try replacing _= if it is there
+ var ret = s.url.replace(rts, "$1_=" + ts);
+
+ // if nothing was replaced, add timestamp to the end
+ s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
+ }
+
+ // If data is available, append data to url for GET/HEAD requests
+ if ( s.data && noContent ) {
+ s.url += (rquery.test(s.url) ? "&" : "?") + s.data;
+ }
+
+ // Watch for a new set of requests
+ if ( s.global && jQuery.active++ === 0 ) {
+ jQuery.event.trigger( "ajaxStart" );
+ }
+
+ // Matches an absolute URL, and saves the domain
+ var parts = rurl.exec( s.url ),
+ remote = parts && (parts[1] && parts[1].toLowerCase() !== location.protocol || parts[2].toLowerCase() !== location.host);
+
+ // If we're requesting a remote document
+ // and trying to load JSON or Script with a GET
+ if ( s.dataType === "script" && type === "GET" && remote ) {
+ var head = document.getElementsByTagName("head")[0] || document.documentElement;
+ var script = document.createElement("script");
+ if ( s.scriptCharset ) {
+ script.charset = s.scriptCharset;
+ }
+ script.src = s.url;
+
+ // Handle Script loading
+ if ( !jsonp ) {
+ var done = false;
+
+ // Attach handlers for all browsers
+ script.onload = script.onreadystatechange = function() {
+ if ( !done && (!this.readyState ||
+ this.readyState === "loaded" || this.readyState === "complete") ) {
+ done = true;
+ jQuery.handleSuccess( s, xhr, status, data );
+ jQuery.handleComplete( s, xhr, status, data );
+
+ // Handle memory leak in IE
+ script.onload = script.onreadystatechange = null;
+ if ( head && script.parentNode ) {
+ head.removeChild( script );
+ }
+ }
+ };
+ }
+
+ // Use insertBefore instead of appendChild to circumvent an IE6 bug.
+ // This arises when a base node is used (#2709 and #4378).
+ head.insertBefore( script, head.firstChild );
+
+ // We handle everything using the script element injection
+ return undefined;
+ }
+
+ var requestDone = false;
+
+ // Create the request object
+ var xhr = s.xhr();
+
+ if ( !xhr ) {
+ return;
+ }
+
+ // Open the socket
+ // Passing null username, generates a login popup on Opera (#2865)
+ if ( s.username ) {
+ xhr.open(type, s.url, s.async, s.username, s.password);
+ } else {
+ xhr.open(type, s.url, s.async);
+ }
+
+ // Need an extra try/catch for cross domain requests in Firefox 3
+ try {
+ // Set content-type if data specified and content-body is valid for this type
+ if ( (s.data != null && !noContent) || (origSettings && origSettings.contentType) ) {
+ xhr.setRequestHeader("Content-Type", s.contentType);
+ }
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ if ( jQuery.lastModified[s.url] ) {
+ xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]);
+ }
+
+ if ( jQuery.etag[s.url] ) {
+ xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]);
+ }
+ }
+
+ // Set header so the called script knows that it's an XMLHttpRequest
+ // Only send the header if it's not a remote XHR
+ if ( !remote ) {
+ xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+ }
+
+ // Set the Accepts header for the server, depending on the dataType
+ xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
+ s.accepts[ s.dataType ] + ", */*; q=0.01" :
+ s.accepts._default );
+ } catch( headerError ) {}
+
+ // Allow custom headers/mimetypes and early abort
+ if ( s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false ) {
+ // Handle the global AJAX counter
+ if ( s.global && jQuery.active-- === 1 ) {
+ jQuery.event.trigger( "ajaxStop" );
+ }
+
+ // close opended socket
+ xhr.abort();
+ return false;
+ }
+
+ if ( s.global ) {
+ jQuery.triggerGlobal( s, "ajaxSend", [xhr, s] );
+ }
+
+ // Wait for a response to come back
+ var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) {
+ // The request was aborted
+ if ( !xhr || xhr.readyState === 0 || isTimeout === "abort" ) {
+ // Opera doesn't call onreadystatechange before this point
+ // so we simulate the call
+ if ( !requestDone ) {
+ jQuery.handleComplete( s, xhr, status, data );
+ }
+
+ requestDone = true;
+ if ( xhr ) {
+ xhr.onreadystatechange = jQuery.noop;
+ }
+
+ // The transfer is complete and the data is available, or the request timed out
+ } else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) {
+ requestDone = true;
+ xhr.onreadystatechange = jQuery.noop;
+
+ status = isTimeout === "timeout" ?
+ "timeout" :
+ !jQuery.httpSuccess( xhr ) ?
+ "error" :
+ s.ifModified && jQuery.httpNotModified( xhr, s.url ) ?
+ "notmodified" :
+ "success";
+
+ var errMsg;
+
+ if ( status === "success" ) {
+ // Watch for, and catch, XML document parse errors
+ try {
+ // process the data (runs the xml through httpData regardless of callback)
+ data = jQuery.httpData( xhr, s.dataType, s );
+ } catch( parserError ) {
+ status = "parsererror";
+ errMsg = parserError;
+ }
+ }
+
+ // Make sure that the request was successful or notmodified
+ if ( status === "success" || status === "notmodified" ) {
+ // JSONP handles its own success callback
+ if ( !jsonp ) {
+ jQuery.handleSuccess( s, xhr, status, data );
+ }
+ } else {
+ jQuery.handleError( s, xhr, status, errMsg );
+ }
+
+ // Fire the complete handlers
+ if ( !jsonp ) {
+ jQuery.handleComplete( s, xhr, status, data );
+ }
+
+ if ( isTimeout === "timeout" ) {
+ xhr.abort();
+ }
+
+ // Stop memory leaks
+ if ( s.async ) {
+ xhr = null;
+ }
+ }
+ };
+
+ // Override the abort handler, if we can (IE 6 doesn't allow it, but that's OK)
+ // Opera doesn't fire onreadystatechange at all on abort
+ try {
+ var oldAbort = xhr.abort;
+ xhr.abort = function() {
+ if ( xhr ) {
+ // oldAbort has no call property in IE7 so
+ // just do it this way, which works in all
+ // browsers
+ Function.prototype.call.call( oldAbort, xhr );
+ }
+
+ onreadystatechange( "abort" );
+ };
+ } catch( abortError ) {}
+
+ // Timeout checker
+ if ( s.async && s.timeout > 0 ) {
+ setTimeout(function() {
+ // Check to see if the request is still happening
+ if ( xhr && !requestDone ) {
+ onreadystatechange( "timeout" );
+ }
+ }, s.timeout);
+ }
+
+ // Send the data
+ try {
+ xhr.send( noContent || s.data == null ? null : s.data );
+
+ } catch( sendError ) {
+ jQuery.handleError( s, xhr, null, sendError );
+
+ // Fire the complete handlers
+ jQuery.handleComplete( s, xhr, status, data );
+ }
+
+ // firefox 1.5 doesn't fire statechange for sync requests
+ if ( !s.async ) {
+ onreadystatechange();
+ }
+
+ // return XMLHttpRequest to allow aborting the request etc.
+ return xhr;
+ },
+
+ // Serialize an array of form elements or a set of
+ // key/values into a query string
+ param: function( a, traditional ) {
+ var s = [],
+ add = function( key, value ) {
+ // If value is a function, invoke it and return its value
+ value = jQuery.isFunction(value) ? value() : value;
+ s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
+ };
+
+ // Set traditional to true for jQuery <= 1.3.2 behavior.
+ if ( traditional === undefined ) {
+ traditional = jQuery.ajaxSettings.traditional;
+ }
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if ( jQuery.isArray(a) || a.jquery ) {
+ // Serialize the form elements
+ jQuery.each( a, function() {
+ add( this.name, this.value );
+ });
+
+ } else {
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for ( var prefix in a ) {
+ buildParams( prefix, a[prefix], traditional, add );
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join("&").replace(r20, "+");
+ }
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+ if ( jQuery.isArray(obj) && obj.length ) {
+ // Serialize array item.
+ jQuery.each( obj, function( i, v ) {
+ if ( traditional || rbracket.test( prefix ) ) {
+ // Treat each array item as a scalar.
+ add( prefix, v );
+
+ } else {
+ // If array item is non-scalar (array or object), encode its
+ // numeric index to resolve deserialization ambiguity issues.
+ // Note that rack (as of 1.0.0) can't currently deserialize
+ // nested arrays properly, and attempting to do so may cause
+ // a server error. Possible fixes are to modify rack's
+ // deserialization algorithm or to provide an option or flag
+ // to force array serialization to be shallow.
+ buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
+ }
+ });
+
+ } else if ( !traditional && obj != null && typeof obj === "object" ) {
+ if ( jQuery.isEmptyObject( obj ) ) {
+ add( prefix, "" );
+
+ // Serialize object item.
+ } else {
+ jQuery.each( obj, function( k, v ) {
+ buildParams( prefix + "[" + k + "]", v, traditional, add );
+ });
+ }
+
+ } else {
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+ etag: {},
+
+ handleError: function( s, xhr, status, e ) {
+ // If a local callback was specified, fire it
+ if ( s.error ) {
+ s.error.call( s.context, xhr, status, e );
+ }
+
+ // Fire the global callback
+ if ( s.global ) {
+ jQuery.triggerGlobal( s, "ajaxError", [xhr, s, e] );
+ }
+ },
+
+ handleSuccess: function( s, xhr, status, data ) {
+ // If a local callback was specified, fire it and pass it the data
+ if ( s.success ) {
+ s.success.call( s.context, data, status, xhr );
+ }
+
+ // Fire the global callback
+ if ( s.global ) {
+ jQuery.triggerGlobal( s, "ajaxSuccess", [xhr, s] );
+ }
+ },
+
+ handleComplete: function( s, xhr, status ) {
+ // Process result
+ if ( s.complete ) {
+ s.complete.call( s.context, xhr, status );
+ }
+
+ // The request was completed
+ if ( s.global ) {
+ jQuery.triggerGlobal( s, "ajaxComplete", [xhr, s] );
+ }
+
+ // Handle the global AJAX counter
+ if ( s.global && jQuery.active-- === 1 ) {
+ jQuery.event.trigger( "ajaxStop" );
+ }
+ },
+
+ triggerGlobal: function( s, type, args ) {
+ (s.context && s.context.url == null ? jQuery(s.context) : jQuery.event).trigger(type, args);
+ },
+
+ // Determines if an XMLHttpRequest was successful or not
+ httpSuccess: function( xhr ) {
+ try {
+ // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
+ return !xhr.status && location.protocol === "file:" ||
+ xhr.status >= 200 && xhr.status < 300 ||
+ xhr.status === 304 || xhr.status === 1223;
+ } catch(e) {}
+
+ return false;
+ },
+
+ // Determines if an XMLHttpRequest returns NotModified
+ httpNotModified: function( xhr, url ) {
+ var lastModified = xhr.getResponseHeader("Last-Modified"),
+ etag = xhr.getResponseHeader("Etag");
+
+ if ( lastModified ) {
+ jQuery.lastModified[url] = lastModified;
+ }
+
+ if ( etag ) {
+ jQuery.etag[url] = etag;
+ }
+
+ return xhr.status === 304;
+ },
+
+ httpData: function( xhr, type, s ) {
+ var ct = xhr.getResponseHeader("content-type") || "",
+ xml = type === "xml" || !type && ct.indexOf("xml") >= 0,
+ data = xml ? xhr.responseXML : xhr.responseText;
+
+ if ( xml && data.documentElement.nodeName === "parsererror" ) {
+ jQuery.error( "parsererror" );
+ }
+
+ // Allow a pre-filtering function to sanitize the response
+ // s is checked to keep backwards compatibility
+ if ( s && s.dataFilter ) {
+ data = s.dataFilter( data, type );
+ }
+
+ // The filter can actually parse the response
+ if ( typeof data === "string" ) {
+ // Get the JavaScript object, if JSON is used.
+ if ( type === "json" || !type && ct.indexOf("json") >= 0 ) {
+ data = jQuery.parseJSON( data );
+
+ // If the type is "script", eval it in global context
+ } else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) {
+ jQuery.globalEval( data );
+ }
+ }
+
+ return data;
+ }
+
+});
+
+/*
+ * Create the request object; Microsoft failed to properly
+ * implement the XMLHttpRequest in IE7 (can't request local files),
+ * so we use the ActiveXObject when it is available
+ * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+ * we need a fallback.
+ */
+if ( window.ActiveXObject ) {
+ jQuery.ajaxSettings.xhr = function() {
+ if ( window.location.protocol !== "file:" ) {
+ try {
+ return new window.XMLHttpRequest();
+ } catch(xhrError) {}
+ }
+
+ try {
+ return new window.ActiveXObject("Microsoft.XMLHTTP");
+ } catch(activeError) {}
+ };
+}
+
+// Does this browser support XHR requests?
+jQuery.support.ajax = !!jQuery.ajaxSettings.xhr();
+
+
+
+
+var elemdisplay = {},
+ rfxtypes = /^(?:toggle|show|hide)$/,
+ rfxnum = /^([+\-]=)?([\d+.\-]+)(.*)$/,
+ timerId,
+ fxAttrs = [
+ // height animations
+ [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+ // width animations
+ [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+ // opacity animations
+ [ "opacity" ]
+ ];
+
+jQuery.fn.extend({
+ show: function( speed, easing, callback ) {
+ var elem, display;
+
+ if ( speed || speed === 0 ) {
+ return this.animate( genFx("show", 3), speed, easing, callback);
+
+ } else {
+ for ( var i = 0, j = this.length; i < j; i++ ) {
+ elem = this[i];
+ display = elem.style.display;
+
+ // Reset the inline display of this element to learn if it is
+ // being hidden by cascaded rules or not
+ if ( !jQuery.data(elem, "olddisplay") && display === "none" ) {
+ display = elem.style.display = "";
+ }
+
+ // Set elements which have been overridden with display: none
+ // in a stylesheet to whatever the default browser style is
+ // for such an element
+ if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
+ jQuery.data(elem, "olddisplay", defaultDisplay(elem.nodeName));
+ }
+ }
+
+ // Set the display of most of the elements in a second loop
+ // to avoid the constant reflow
+ for ( i = 0; i < j; i++ ) {
+ elem = this[i];
+ display = elem.style.display;
+
+ if ( display === "" || display === "none" ) {
+ elem.style.display = jQuery.data(elem, "olddisplay") || "";
+ }
+ }
+
+ return this;
+ }
+ },
+
+ hide: function( speed, easing, callback ) {
+ if ( speed || speed === 0 ) {
+ return this.animate( genFx("hide", 3), speed, easing, callback);
+
+ } else {
+ for ( var i = 0, j = this.length; i < j; i++ ) {
+ var display = jQuery.css( this[i], "display" );
+
+ if ( display !== "none" ) {
+ jQuery.data( this[i], "olddisplay", display );
+ }
+ }
+
+ // Set the display of the elements in a second loop
+ // to avoid the constant reflow
+ for ( i = 0; i < j; i++ ) {
+ this[i].style.display = "none";
+ }
+
+ return this;
+ }
+ },
+
+ // Save the old toggle function
+ _toggle: jQuery.fn.toggle,
+
+ toggle: function( fn, fn2, callback ) {
+ var bool = typeof fn === "boolean";
+
+ if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+ this._toggle.apply( this, arguments );
+
+ } else if ( fn == null || bool ) {
+ this.each(function() {
+ var state = bool ? fn : jQuery(this).is(":hidden");
+ jQuery(this)[ state ? "show" : "hide" ]();
+ });
+
+ } else {
+ this.animate(genFx("toggle", 3), fn, fn2, callback);
+ }
+
+ return this;
+ },
+
+ fadeTo: function( speed, to, easing, callback ) {
+ return this.filter(":hidden").css("opacity", 0).show().end()
+ .animate({opacity: to}, speed, easing, callback);
+ },
+
+ animate: function( prop, speed, easing, callback ) {
+ var optall = jQuery.speed(speed, easing, callback);
+
+ if ( jQuery.isEmptyObject( prop ) ) {
+ return this.each( optall.complete );
+ }
+
+ return this[ optall.queue === false ? "each" : "queue" ](function() {
+ // XXX 'this' does not always have a nodeName when running the
+ // test suite
+
+ var opt = jQuery.extend({}, optall), p,
+ isElement = this.nodeType === 1,
+ hidden = isElement && jQuery(this).is(":hidden"),
+ self = this;
+
+ for ( p in prop ) {
+ var name = jQuery.camelCase( p );
+
+ if ( p !== name ) {
+ prop[ name ] = prop[ p ];
+ delete prop[ p ];
+ p = name;
+ }
+
+ if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
+ return opt.complete.call(this);
+ }
+
+ if ( isElement && ( p === "height" || p === "width" ) ) {
+ // Make sure that nothing sneaks out
+ // Record all 3 overflow attributes because IE does not
+ // change the overflow attribute when overflowX and
+ // overflowY are set to the same value
+ opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+ // Set display property to inline-block for height/width
+ // animations on inline elements that are having width/height
+ // animated
+ if ( jQuery.css( this, "display" ) === "inline" &&
+ jQuery.css( this, "float" ) === "none" ) {
+ if ( !jQuery.support.inlineBlockNeedsLayout ) {
+ this.style.display = "inline-block";
+
+ } else {
+ var display = defaultDisplay(this.nodeName);
+
+ // inline-level elements accept inline-block;
+ // block-level elements need to be inline with layout
+ if ( display === "inline" ) {
+ this.style.display = "inline-block";
+
+ } else {
+ this.style.display = "inline";
+ this.style.zoom = 1;
+ }
+ }
+ }
+ }
+
+ if ( jQuery.isArray( prop[p] ) ) {
+ // Create (if needed) and add to specialEasing
+ (opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
+ prop[p] = prop[p][0];
+ }
+ }
+
+ if ( opt.overflow != null ) {
+ this.style.overflow = "hidden";
+ }
+
+ opt.curAnim = jQuery.extend({}, prop);
+
+ jQuery.each( prop, function( name, val ) {
+ var e = new jQuery.fx( self, opt, name );
+
+ if ( rfxtypes.test(val) ) {
+ e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
+
+ } else {
+ var parts = rfxnum.exec(val),
+ start = e.cur() || 0;
+
+ if ( parts ) {
+ var end = parseFloat( parts[2] ),
+ unit = parts[3] || "px";
+
+ // We need to compute starting value
+ if ( unit !== "px" ) {
+ jQuery.style( self, name, (end || 1) + unit);
+ start = ((end || 1) / e.cur()) * start;
+ jQuery.style( self, name, start + unit);
+ }
+
+ // If a +=/-= token was provided, we're doing a relative animation
+ if ( parts[1] ) {
+ end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
+ }
+
+ e.custom( start, end, unit );
+
+ } else {
+ e.custom( start, val, "" );
+ }
+ }
+ });
+
+ // For JS strict compliance
+ return true;
+ });
+ },
+
+ stop: function( clearQueue, gotoEnd ) {
+ var timers = jQuery.timers;
+
+ if ( clearQueue ) {
+ this.queue([]);
+ }
+
+ this.each(function() {
+ // go in reverse order so anything added to the queue during the loop is ignored
+ for ( var i = timers.length - 1; i >= 0; i-- ) {
+ if ( timers[i].elem === this ) {
+ if (gotoEnd) {
+ // force the next step to be the last
+ timers[i](true);
+ }
+
+ timers.splice(i, 1);
+ }
+ }
+ });
+
+ // start the next in the queue if the last step wasn't forced
+ if ( !gotoEnd ) {
+ this.dequeue();
+ }
+
+ return this;
+ }
+
+});
+
+function genFx( type, num ) {
+ var obj = {};
+
+ jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
+ obj[ this ] = type;
+ });
+
+ return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+ slideDown: genFx("show", 1),
+ slideUp: genFx("hide", 1),
+ slideToggle: genFx("toggle", 1),
+ fadeIn: { opacity: "show" },
+ fadeOut: { opacity: "hide" },
+ fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return this.animate( props, speed, easing, callback );
+ };
+});
+
+jQuery.extend({
+ speed: function( speed, easing, fn ) {
+ var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
+ complete: fn || !fn && easing ||
+ jQuery.isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
+ };
+
+ opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+ opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
+
+ // Queueing
+ opt.old = opt.complete;
+ opt.complete = function() {
+ if ( opt.queue !== false ) {
+ jQuery(this).dequeue();
+ }
+ if ( jQuery.isFunction( opt.old ) ) {
+ opt.old.call( this );
+ }
+ };
+
+ return opt;
+ },
+
+ easing: {
+ linear: function( p, n, firstNum, diff ) {
+ return firstNum + diff * p;
+ },
+ swing: function( p, n, firstNum, diff ) {
+ return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+ }
+ },
+
+ timers: [],
+
+ fx: function( elem, options, prop ) {
+ this.options = options;
+ this.elem = elem;
+ this.prop = prop;
+
+ if ( !options.orig ) {
+ options.orig = {};
+ }
+ }
+
+});
+
+jQuery.fx.prototype = {
+ // Simple function for setting a style value
+ update: function() {
+ if ( this.options.step ) {
+ this.options.step.call( this.elem, this.now, this );
+ }
+
+ (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
+ },
+
+ // Get the current size
+ cur: function() {
+ if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
+ return this.elem[ this.prop ];
+ }
+
+ var r = parseFloat( jQuery.css( this.elem, this.prop ) );
+ return r && r > -10000 ? r : 0;
+ },
+
+ // Start an animation from one number to another
+ custom: function( from, to, unit ) {
+ var self = this,
+ fx = jQuery.fx;
+
+ this.startTime = jQuery.now();
+ this.start = from;
+ this.end = to;
+ this.unit = unit || this.unit || "px";
+ this.now = this.start;
+ this.pos = this.state = 0;
+
+ function t( gotoEnd ) {
+ return self.step(gotoEnd);
+ }
+
+ t.elem = this.elem;
+
+ if ( t() && jQuery.timers.push(t) && !timerId ) {
+ timerId = setInterval(fx.tick, fx.interval);
+ }
+ },
+
+ // Simple 'show' function
+ show: function() {
+ // Remember where we started, so that we can go back to it later
+ this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+ this.options.show = true;
+
+ // Begin the animation
+ // Make sure that we start at a small width/height to avoid any
+ // flash of content
+ this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
+
+ // Start by showing the element
+ jQuery( this.elem ).show();
+ },
+
+ // Simple 'hide' function
+ hide: function() {
+ // Remember where we started, so that we can go back to it later
+ this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+ this.options.hide = true;
+
+ // Begin the animation
+ this.custom(this.cur(), 0);
+ },
+
+ // Each step of an animation
+ step: function( gotoEnd ) {
+ var t = jQuery.now(), done = true;
+
+ if ( gotoEnd || t >= this.options.duration + this.startTime ) {
+ this.now = this.end;
+ this.pos = this.state = 1;
+ this.update();
+
+ this.options.curAnim[ this.prop ] = true;
+
+ for ( var i in this.options.curAnim ) {
+ if ( this.options.curAnim[i] !== true ) {
+ done = false;
+ }
+ }
+
+ if ( done ) {
+ // Reset the overflow
+ if ( this.options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+ var elem = this.elem,
+ options = this.options;
+
+ jQuery.each( [ "", "X", "Y" ], function (index, value) {
+ elem.style[ "overflow" + value ] = options.overflow[index];
+ } );
+ }
+
+ // Hide the element if the "hide" operation was done
+ if ( this.options.hide ) {
+ jQuery(this.elem).hide();
+ }
+
+ // Reset the properties, if the item has been hidden or shown
+ if ( this.options.hide || this.options.show ) {
+ for ( var p in this.options.curAnim ) {
+ jQuery.style( this.elem, p, this.options.orig[p] );
+ }
+ }
+
+ // Execute the complete function
+ this.options.complete.call( this.elem );
+ }
+
+ return false;
+
+ } else {
+ var n = t - this.startTime;
+ this.state = n / this.options.duration;
+
+ // Perform the easing function, defaults to swing
+ var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
+ var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
+ this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
+ this.now = this.start + ((this.end - this.start) * this.pos);
+
+ // Perform the next step of the animation
+ this.update();
+ }
+
+ return true;
+ }
+};
+
+jQuery.extend( jQuery.fx, {
+ tick: function() {
+ var timers = jQuery.timers;
+
+ for ( var i = 0; i < timers.length; i++ ) {
+ if ( !timers[i]() ) {
+ timers.splice(i--, 1);
+ }
+ }
+
+ if ( !timers.length ) {
+ jQuery.fx.stop();
+ }
+ },
+
+ interval: 13,
+
+ stop: function() {
+ clearInterval( timerId );
+ timerId = null;
+ },
+
+ speeds: {
+ slow: 600,
+ fast: 200,
+ // Default speed
+ _default: 400
+ },
+
+ step: {
+ opacity: function( fx ) {
+ jQuery.style( fx.elem, "opacity", fx.now );
+ },
+
+ _default: function( fx ) {
+ if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+ fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
+ } else {
+ fx.elem[ fx.prop ] = fx.now;
+ }
+ }
+ }
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+ jQuery.expr.filters.animated = function( elem ) {
+ return jQuery.grep(jQuery.timers, function( fn ) {
+ return elem === fn.elem;
+ }).length;
+ };
+}
+
+function defaultDisplay( nodeName ) {
+ if ( !elemdisplay[ nodeName ] ) {
+ var elem = jQuery("<" + nodeName + ">").appendTo("body"),
+ display = elem.css("display");
+
+ elem.remove();
+
+ if ( display === "none" || display === "" ) {
+ display = "block";
+ }
+
+ elemdisplay[ nodeName ] = display;
+ }
+
+ return elemdisplay[ nodeName ];
+}
+
+
+
+
+var rtable = /^t(?:able|d|h)$/i,
+ rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+ jQuery.fn.offset = function( options ) {
+ var elem = this[0], box;
+
+ if ( options ) {
+ return this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ if ( !elem || !elem.ownerDocument ) {
+ return null;
+ }
+
+ if ( elem === elem.ownerDocument.body ) {
+ return jQuery.offset.bodyOffset( elem );
+ }
+
+ try {
+ box = elem.getBoundingClientRect();
+ } catch(e) {}
+
+ var doc = elem.ownerDocument,
+ docElem = doc.documentElement;
+
+ // Make sure we're not dealing with a disconnected DOM node
+ if ( !box || !jQuery.contains( docElem, elem ) ) {
+ return box || { top: 0, left: 0 };
+ }
+
+ var body = doc.body,
+ win = getWindow(doc),
+ clientTop = docElem.clientTop || body.clientTop || 0,
+ clientLeft = docElem.clientLeft || body.clientLeft || 0,
+ scrollTop = (win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop ),
+ scrollLeft = (win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft),
+ top = box.top + scrollTop - clientTop,
+ left = box.left + scrollLeft - clientLeft;
+
+ return { top: top, left: left };
+ };
+
+} else {
+ jQuery.fn.offset = function( options ) {
+ var elem = this[0];
+
+ if ( options ) {
+ return this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ if ( !elem || !elem.ownerDocument ) {
+ return null;
+ }
+
+ if ( elem === elem.ownerDocument.body ) {
+ return jQuery.offset.bodyOffset( elem );
+ }
+
+ jQuery.offset.initialize();
+
+ var computedStyle,
+ offsetParent = elem.offsetParent,
+ prevOffsetParent = elem,
+ doc = elem.ownerDocument,
+ docElem = doc.documentElement,
+ body = doc.body,
+ defaultView = doc.defaultView,
+ prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+ top = elem.offsetTop,
+ left = elem.offsetLeft;
+
+ while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+ if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+ break;
+ }
+
+ computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+ top -= elem.scrollTop;
+ left -= elem.scrollLeft;
+
+ if ( elem === offsetParent ) {
+ top += elem.offsetTop;
+ left += elem.offsetLeft;
+
+ if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+ top += parseFloat( computedStyle.borderTopWidth ) || 0;
+ left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+ }
+
+ prevOffsetParent = offsetParent;
+ offsetParent = elem.offsetParent;
+ }
+
+ if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+ top += parseFloat( computedStyle.borderTopWidth ) || 0;
+ left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+ }
+
+ prevComputedStyle = computedStyle;
+ }
+
+ if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+ top += body.offsetTop;
+ left += body.offsetLeft;
+ }
+
+ if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+ top += Math.max( docElem.scrollTop, body.scrollTop );
+ left += Math.max( docElem.scrollLeft, body.scrollLeft );
+ }
+
+ return { top: top, left: left };
+ };
+}
+
+jQuery.offset = {
+ initialize: function() {
+ var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
+ html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+
+ jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
+
+ container.innerHTML = html;
+ body.insertBefore( container, body.firstChild );
+ innerDiv = container.firstChild;
+ checkDiv = innerDiv.firstChild;
+ td = innerDiv.nextSibling.firstChild.firstChild;
+
+ this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
+ this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
+
+ checkDiv.style.position = "fixed";
+ checkDiv.style.top = "20px";
+
+ // safari subtracts parent border width here which is 5px
+ this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
+ checkDiv.style.position = checkDiv.style.top = "";
+
+ innerDiv.style.overflow = "hidden";
+ innerDiv.style.position = "relative";
+
+ this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
+
+ this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
+
+ body.removeChild( container );
+ body = container = innerDiv = checkDiv = table = td = null;
+ jQuery.offset.initialize = jQuery.noop;
+ },
+
+ bodyOffset: function( body ) {
+ var top = body.offsetTop,
+ left = body.offsetLeft;
+
+ jQuery.offset.initialize();
+
+ if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
+ top += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+ left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+ }
+
+ return { top: top, left: left };
+ },
+
+ setOffset: function( elem, options, i ) {
+ var position = jQuery.css( elem, "position" );
+
+ // set position first, in-case top/left are set even on static elem
+ if ( position === "static" ) {
+ elem.style.position = "relative";
+ }
+
+ var curElem = jQuery( elem ),
+ curOffset = curElem.offset(),
+ curCSSTop = jQuery.css( elem, "top" ),
+ curCSSLeft = jQuery.css( elem, "left" ),
+ calculatePosition = (position === "absolute" && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1),
+ props = {}, curPosition = {}, curTop, curLeft;
+
+ // need to be able to calculate position if either top or left is auto and position is absolute
+ if ( calculatePosition ) {
+ curPosition = curElem.position();
+ }
+
+ curTop = calculatePosition ? curPosition.top : parseInt( curCSSTop, 10 ) || 0;
+ curLeft = calculatePosition ? curPosition.left : parseInt( curCSSLeft, 10 ) || 0;
+
+ if ( jQuery.isFunction( options ) ) {
+ options = options.call( elem, i, curOffset );
+ }
+
+ if (options.top != null) {
+ props.top = (options.top - curOffset.top) + curTop;
+ }
+ if (options.left != null) {
+ props.left = (options.left - curOffset.left) + curLeft;
+ }
+
+ if ( "using" in options ) {
+ options.using.call( elem, props );
+ } else {
+ curElem.css( props );
+ }
+ }
+};
+
+
+jQuery.fn.extend({
+ position: function() {
+ if ( !this[0] ) {
+ return null;
+ }
+
+ var elem = this[0],
+
+ // Get *real* offsetParent
+ offsetParent = this.offsetParent(),
+
+ // Get correct offsets
+ offset = this.offset(),
+ parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+ // Subtract element margins
+ // note: when an element has margin: auto the offsetLeft and marginLeft
+ // are the same in Safari causing offset.left to incorrectly be 0
+ offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+ offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+ // Add offsetParent borders
+ parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+ parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+ // Subtract the two offsets
+ return {
+ top: offset.top - parentOffset.top,
+ left: offset.left - parentOffset.left
+ };
+ },
+
+ offsetParent: function() {
+ return this.map(function() {
+ var offsetParent = this.offsetParent || document.body;
+ while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+ offsetParent = offsetParent.offsetParent;
+ }
+ return offsetParent;
+ });
+ }
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+ var method = "scroll" + name;
+
+ jQuery.fn[ method ] = function(val) {
+ var elem = this[0], win;
+
+ if ( !elem ) {
+ return null;
+ }
+
+ if ( val !== undefined ) {
+ // Set the scroll offset
+ return this.each(function() {
+ win = getWindow( this );
+
+ if ( win ) {
+ win.scrollTo(
+ !i ? val : jQuery(win).scrollLeft(),
+ i ? val : jQuery(win).scrollTop()
+ );
+
+ } else {
+ this[ method ] = val;
+ }
+ });
+ } else {
+ win = getWindow( elem );
+
+ // Return the scroll offset
+ return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+ jQuery.support.boxModel && win.document.documentElement[ method ] ||
+ win.document.body[ method ] :
+ elem[ method ];
+ }
+ };
+});
+
+function getWindow( elem ) {
+ return jQuery.isWindow( elem ) ?
+ elem :
+ elem.nodeType === 9 ?
+ elem.defaultView || elem.parentWindow :
+ false;
+}
+
+
+
+
+// Create innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+ var type = name.toLowerCase();
+
+ // innerHeight and innerWidth
+ jQuery.fn["inner" + name] = function() {
+ return this[0] ?
+ parseFloat( jQuery.css( this[0], type, "padding" ) ) :
+ null;
+ };
+
+ // outerHeight and outerWidth
+ jQuery.fn["outer" + name] = function( margin ) {
+ return this[0] ?
+ parseFloat( jQuery.css( this[0], type, margin ? "margin" : "border" ) ) :
+ null;
+ };
+
+ jQuery.fn[ type ] = function( size ) {
+ // Get window width or height
+ var elem = this[0];
+ if ( !elem ) {
+ return size == null ? null : this;
+ }
+
+ if ( jQuery.isFunction( size ) ) {
+ return this.each(function( i ) {
+ var self = jQuery( this );
+ self[ type ]( size.call( this, i, self[ type ]() ) );
+ });
+ }
+
+ if ( jQuery.isWindow( elem ) ) {
+ // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+ return elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] ||
+ elem.document.body[ "client" + name ];
+
+ // Get document width or height
+ } else if ( elem.nodeType === 9 ) {
+ // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+ return Math.max(
+ elem.documentElement["client" + name],
+ elem.body["scroll" + name], elem.documentElement["scroll" + name],
+ elem.body["offset" + name], elem.documentElement["offset" + name]
+ );
+
+ // Get or set width or height on the element
+ } else if ( size === undefined ) {
+ var orig = jQuery.css( elem, type ),
+ ret = parseFloat( orig );
+
+ return jQuery.isNaN( ret ) ? orig : ret;
+
+ // Set the width or height on the element (default to pixels if value is unitless)
+ } else {
+ return this.css( type, typeof size === "string" ? size : size + "px" );
+ }
+ };
+
+});
+
+
+})(window);
--- /dev/null
+(function($) {
+ $.extend({
+ placeholder : {
+ settings : {
+ focusClass: 'placeholderFocus',
+ activeClass: 'placeholder',
+ overrideSupport: false,
+ preventRefreshIssues: true
+ },
+ debug : false,
+ log : function(msg){
+ if(!$.placeholder.debug) return;
+ msg = "[Placeholder] " + msg;
+ $.placeholder.hasFirebug ?
+ console.log(msg) :
+ $.placeholder.hasConsoleLog ?
+ window.console.log(msg) :
+ alert(msg);
+ },
+ hasFirebug : "console" in window && "firebug" in window.console,
+ hasConsoleLog: "console" in window && "log" in window.console
+ }
+
+ });
+
+ // check browser support for placeholder
+ $.support.placeholder = 'placeholder' in document.createElement('input');
+
+ // Replace the val function to never return placeholders
+ $.fn.plVal = $.fn.val;
+ $.fn.val = function(value) {
+ $.placeholder.log('in val');
+ if(this[0]) {
+ $.placeholder.log('have found an element');
+ var el = $(this[0]);
+ if(value != undefined)
+ {
+ $.placeholder.log('in setter');
+ var currentValue = el.plVal();
+ var returnValue = $(this).plVal(value);
+ if(el.hasClass($.placeholder.settings.activeClass) && currentValue == el.attr('placeholder')){
+ el.removeClass($.placeholder.settings.activeClass);
+ }
+ return returnValue;
+ }
+
+ if(el.hasClass($.placeholder.settings.activeClass) && el.plVal() == el.attr('placeholder')) {
+ $.placeholder.log('returning empty because its a placeholder');
+ return '';
+ } else {
+ $.placeholder.log('returning original val');
+ return el.plVal();
+ }
+ }
+ $.placeholder.log('returning undefined');
+ return undefined;
+ };
+
+ // Clear placeholder values upon page reload
+ $(window).bind('beforeunload.placeholder', function() {
+ var els = $('input.placeholderActive' );
+ if(els.length > 0)
+ els.val('').attr('autocomplete','off');
+ });
+
+
+ // plugin code
+ $.fn.placeholder = function(opts) {
+ opts = $.extend({},$.placeholder.settings, opts);
+
+ // we don't have to do anything if the browser supports placeholder
+ if(!opts.overrideSupport && $.support.placeholder)
+ return this;
+
+ return this.each(function() {
+ var $el = $(this);
+
+ // skip if we do not have the placeholder attribute
+ if(!$el.is('[placeholder]'))
+ return;
+
+ // we cannot do password fields, but supported browsers can
+ if($el.is(':password'))
+ return;
+
+ // Prevent values from being reapplied on refresh
+ if(opts.preventRefreshIssues)
+ $el.attr('autocomplete','off');
+
+ $el.bind('focus.placeholder', function(){
+ var $el = $(this);
+ if(this.value == $el.attr('placeholder') && $el.hasClass(opts.activeClass))
+ $el.val('')
+ .removeClass(opts.activeClass)
+ .addClass(opts.focusClass);
+ });
+ $el.bind('blur.placeholder', function(){
+ var $el = $(this);
+
+ $el.removeClass(opts.focusClass);
+
+ if(this.value == '')
+ $el.val($el.attr('placeholder'))
+ .addClass(opts.activeClass);
+ });
+
+ $el.triggerHandler('blur');
+
+ // Prevent incorrect form values being posted
+ $el.parents('form').submit(function(){
+ $el.triggerHandler('focus.placeholder');
+ });
+
+ });
+ };
+})(jQuery);
--- /dev/null
+$.fn.selectRange = function(start, end) {
+ return this.each(function() {
+ if (this.setSelectionRange) {
+ this.focus();
+ this.setSelectionRange(start, end);
+ } else if (this.createTextRange) {
+ var range = this.createTextRange();
+ range.collapse(true);
+ range.moveEnd('character', end);
+ range.moveStart('character', start);
+ range.select();
+ }
+ });
+};
--- /dev/null
+ļ»æ/**\r
+ * jQuery.timers - Timer abstractions for jQuery\r
+ * Written by Blair Mitchelmore (blair DOT mitchelmore AT gmail DOT com)\r
+ * Licensed under the WTFPL (http://sam.zoy.org/wtfpl/).\r
+ * Date: 2009/10/16\r
+ *\r
+ * @author Blair Mitchelmore\r
+ * @version 1.2\r
+ *\r
+ **/\r
+\r
+jQuery.fn.extend({\r
+ everyTime: function(interval, label, fn, times) {\r
+ return this.each(function() {\r
+ jQuery.timer.add(this, interval, label, fn, times);\r
+ });\r
+ },\r
+ oneTime: function(interval, label, fn) {\r
+ return this.each(function() {\r
+ jQuery.timer.add(this, interval, label, fn, 1);\r
+ });\r
+ },\r
+ stopTime: function(label, fn) {\r
+ return this.each(function() {\r
+ jQuery.timer.remove(this, label, fn);\r
+ });\r
+ }\r
+});\r
+\r
+jQuery.extend({\r
+ timer: {\r
+ global: [],\r
+ guid: 1,\r
+ dataKey: "jQuery.timer",\r
+ regex: /^([0-9]+(?:\.[0-9]*)?)\s*(.*s)?$/,\r
+ powers: {\r
+ // Yeah this is major overkill...\r
+ 'ms': 1,\r
+ 'cs': 10,\r
+ 'ds': 100,\r
+ 's': 1000,\r
+ 'das': 10000,\r
+ 'hs': 100000,\r
+ 'ks': 1000000\r
+ },\r
+ timeParse: function(value) {\r
+ if (value == undefined || value == null)\r
+ return null;\r
+ var result = this.regex.exec(jQuery.trim(value.toString()));\r
+ if (result[2]) {\r
+ var num = parseFloat(result[1]);\r
+ var mult = this.powers[result[2]] || 1;\r
+ return num * mult;\r
+ } else {\r
+ return value;\r
+ }\r
+ },\r
+ add: function(element, interval, label, fn, times) {\r
+ var counter = 0;\r
+\r
+ if (jQuery.isFunction(label)) {\r
+ if (!times)\r
+ times = fn;\r
+ fn = label;\r
+ label = interval;\r
+ }\r
+\r
+ interval = jQuery.timer.timeParse(interval);\r
+\r
+ if (typeof interval != 'number' || isNaN(interval) || interval < 0)\r
+ return;\r
+\r
+ if (typeof times != 'number' || isNaN(times) || times < 0)\r
+ times = 0;\r
+\r
+ times = times || 0;\r
+\r
+ var timers = jQuery.data(element, this.dataKey) || jQuery.data(element, this.dataKey, {});\r
+\r
+ if (!timers[label])\r
+ timers[label] = {};\r
+\r
+ fn.timerID = fn.timerID || this.guid++;\r
+\r
+ var handler = function() {\r
+ if ((++counter > times && times !== 0) || fn.call(element, counter) === false)\r
+ jQuery.timer.remove(element, label, fn);\r
+ };\r
+\r
+ handler.timerID = fn.timerID;\r
+\r
+ if (!timers[label][fn.timerID])\r
+ timers[label][fn.timerID] = window.setInterval(handler,interval);\r
+\r
+ this.global.push( element );\r
+\r
+ },\r
+ remove: function(element, label, fn) {\r
+ var timers = jQuery.data(element, this.dataKey), ret;\r
+\r
+ if ( timers ) {\r
+\r
+ if (!label) {\r
+ for ( label in timers )\r
+ this.remove(element, label, fn);\r
+ } else if ( timers[label] ) {\r
+ if ( fn ) {\r
+ if ( fn.timerID ) {\r
+ window.clearInterval(timers[label][fn.timerID]);\r
+ delete timers[label][fn.timerID];\r
+ }\r
+ } else {\r
+ for ( var fn in timers[label] ) {\r
+ window.clearInterval(timers[label][fn]);\r
+ delete timers[label][fn];\r
+ }\r
+ }\r
+\r
+ for ( ret in timers[label] ) break;\r
+ if ( !ret ) {\r
+ ret = null;\r
+ delete timers[label];\r
+ }\r
+ }\r
+\r
+ for ( ret in timers ) break;\r
+ if ( !ret )\r
+ jQuery.removeData(element, this.dataKey);\r
+ }\r
+ }\r
+ }\r
+});\r
+\r
+jQuery(window).bind("unload", function() {\r
+ jQuery.each(jQuery.timer.global, function(index, item) {\r
+ jQuery.timer.remove(item);\r
+ });\r
+});\r
--- /dev/null
+/*
+
+Jappix - An open social platform
+This is the JSJaC library for Jappix (from trunk)
+
+-------------------------------------------------
+
+Licenses: Mozilla Public License version 1.1, GNU GPL, AGPL
+Authors: Stefan Strigler, Vanaryon, Zash
+Last revision: 25/08/11
+
+*/
+
+/**
+ * @fileoverview Magic dependency loading. Taken from script.aculo.us
+ * and modified to break it.
+ * @author Stefan Strigler steve@zeank.in-berlin.de
+ * @version $Revision$
+ */
+
+var JSJaC = {
+ Version: '$Rev$',
+ bind: function(fn, obj, optArg) {
+ return function(arg) {
+ return fn.apply(obj, [arg, optArg]);
+ };
+ }
+};
+
+if (typeof JSJaCConnection == 'undefined')
+ JSJaC.load();
+
+
+
+/* Copyright 2006 Erik Arvidsson
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you
+ * may not use this file except in compliance with the License. You
+ * may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+/**
+ * @fileoverview Wrapper to make working with XmlHttpRequest and the
+ * DOM more convenient (cross browser compliance).
+ * this code is taken from
+ * http://webfx.eae.net/dhtml/xmlextras/xmlextras.html
+ * @author Stefan Strigler steve@zeank.in-berlin.de
+ * @version $Revision$
+ */
+
+/**
+ * XmlHttp factory
+ * @private
+ */
+function XmlHttp() {}
+
+/**
+ * creates a cross browser compliant XmlHttpRequest object
+ */
+XmlHttp.create = function () {
+ try {
+ // Are we cross-domain?
+ if(((BOSH_PROXY == 'on') || (HOST_BOSH_MINI)) && (typeof jXHR == "function")) {
+ // Able to use CORS?
+ if (window.XMLHttpRequest) {
+ var req = new XMLHttpRequest();
+
+ if (req.withCredentials !== undefined)
+ return req;
+ }
+
+ return new jXHR();
+ }
+ // Might be local-domain?
+ if (window.XMLHttpRequest) {
+ var req = new XMLHttpRequest();
+
+ // some versions of Moz do not support the readyState property
+ // and the onreadystate event so we patch it!
+ if (req.readyState == null) {
+ req.readyState = 1;
+ req.addEventListener("load", function () {
+ req.readyState = 4;
+ if (typeof req.onreadystatechange == "function")
+ req.onreadystatechange();
+ }, false);
+ }
+
+ return req;
+ }
+ if (window.ActiveXObject) {
+ return new ActiveXObject(XmlHttp.getPrefix() + ".XmlHttp");
+ }
+ }
+ catch (ex) {}
+ // fell through
+ throw new Error("Your browser does not support XmlHttp objects");
+};
+
+/**
+ * used to find the Automation server name
+ * @private
+ */
+XmlHttp.getPrefix = function() {
+ if (XmlHttp.prefix) // I know what you did last summer
+ return XmlHttp.prefix;
+
+ var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
+ var o;
+ for (var i = 0; i < prefixes.length; i++) {
+ try {
+ // try to create the objects
+ o = new ActiveXObject(prefixes[i] + ".XmlHttp");
+ return XmlHttp.prefix = prefixes[i];
+ }
+ catch (ex) {};
+ }
+
+ throw new Error("Could not find an installed XML parser");
+};
+
+
+/**
+ * XmlDocument factory
+ * @private
+ */
+function XmlDocument() {}
+
+XmlDocument.create = function (name,ns) {
+ name = name || 'foo';
+ ns = ns || '';
+
+ try {
+ var doc;
+ // DOM2
+ if (document.implementation && document.implementation.createDocument) {
+ doc = document.implementation.createDocument(ns, name, null);
+ // some versions of Moz do not support the readyState property
+ // and the onreadystate event so we patch it!
+ if (doc.readyState == null) {
+ doc.readyState = 1;
+ doc.addEventListener("load", function () {
+ doc.readyState = 4;
+ if (typeof doc.onreadystatechange == "function")
+ doc.onreadystatechange();
+ }, false);
+ }
+ } else if (window.ActiveXObject) {
+ doc = new ActiveXObject(XmlDocument.getPrefix() + ".DomDocument");
+ }
+
+ if (!doc.documentElement || doc.documentElement.tagName != name ||
+ (doc.documentElement.namespaceURI &&
+ doc.documentElement.namespaceURI != ns)) {
+ try {
+ if (ns != '')
+ doc.appendChild(doc.createElement(name)).
+ setAttribute('xmlns',ns);
+ else
+ doc.appendChild(doc.createElement(name));
+ } catch (dex) {
+ doc = document.implementation.createDocument(ns,name,null);
+
+ if (doc.documentElement == null)
+ doc.appendChild(doc.createElement(name));
+
+ // fix buggy opera 8.5x
+ if (ns != '' &&
+ doc.documentElement.getAttribute('xmlns') != ns) {
+ doc.documentElement.setAttribute('xmlns',ns);
+ }
+ }
+ }
+
+ return doc;
+ }
+ catch (ex) { }
+ throw new Error("Your browser does not support XmlDocument objects");
+};
+
+/**
+ * used to find the Automation server name
+ * @private
+ */
+XmlDocument.getPrefix = function() {
+ if (XmlDocument.prefix)
+ return XmlDocument.prefix;
+
+ var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
+ var o;
+ for (var i = 0; i < prefixes.length; i++) {
+ try {
+ // try to create the objects
+ o = new ActiveXObject(prefixes[i] + ".DomDocument");
+ return XmlDocument.prefix = prefixes[i];
+ }
+ catch (ex) {};
+ }
+
+ throw new Error("Could not find an installed XML parser");
+};
+
+
+// Create the loadXML method
+if (typeof(Document) != 'undefined' && window.DOMParser) {
+
+ /**
+ * XMLDocument did not extend the Document interface in some
+ * versions of Mozilla.
+ * @private
+ */
+ Document.prototype.loadXML = function (s) {
+
+ // parse the string to a new doc
+ var doc2 = (new DOMParser()).parseFromString(s, "text/xml");
+
+ // remove all initial children
+ while (this.hasChildNodes())
+ this.removeChild(this.lastChild);
+
+ // insert and import nodes
+ for (var i = 0; i < doc2.childNodes.length; i++) {
+ this.appendChild(this.importNode(doc2.childNodes[i], true));
+ }
+ };
+ }
+
+// Create xml getter for Mozilla
+if (window.XMLSerializer &&
+ window.Node && Node.prototype && Node.prototype.__defineGetter__) {
+
+ /**
+ * xml getter
+ *
+ * This serializes the DOM tree to an XML String
+ *
+ * Usage: var sXml = oNode.xml
+ * @deprecated
+ * @private
+ */
+ // XMLDocument did not extend the Document interface in some versions
+ // of Mozilla. Extend both!
+ XMLDocument.prototype.__defineGetter__("xml", function () {
+ return (new XMLSerializer()).serializeToString(this);
+ });
+ /**
+ * xml getter
+ *
+ * This serializes the DOM tree to an XML String
+ *
+ * Usage: var sXml = oNode.xml
+ * @deprecated
+ * @private
+ */
+ Document.prototype.__defineGetter__("xml", function () {
+ return (new XMLSerializer()).serializeToString(this);
+ });
+
+ /**
+ * xml getter
+ *
+ * This serializes the DOM tree to an XML String
+ *
+ * Usage: var sXml = oNode.xml
+ * @deprecated
+ * @private
+ */
+ Node.prototype.__defineGetter__("xml", function () {
+ return (new XMLSerializer()).serializeToString(this);
+ });
+ }
+
+
+/**
+ * @fileoverview Collection of functions to make live easier
+ * @author Stefan Strigler
+ * @version $Revision$
+ */
+
+/**
+ * Convert special chars to HTML entities
+ * @addon
+ * @return The string with chars encoded for HTML
+ * @type String
+ */
+String.prototype.htmlEnc = function() {
+ if(!this)
+ return this;
+
+ var str = this.replace(/&/g,"&");
+ str = str.replace(/</g,"<");
+ str = str.replace(/>/g,">");
+ str = str.replace(/\"/g,""");
+ str = str.replace(/\n/g,"<br />");
+ return str;
+};
+
+/**
+ * Convert HTML entities to special chars
+ * @addon
+ * @return The normal string
+ * @type String
+ */
+String.prototype.revertHtmlEnc = function() {
+ if(!this)
+ return this;
+
+ var str = this.replace(/&/gi,'&');
+ str = str.replace(/</gi,'<');
+ str = str.replace(/>/gi,'>');
+ str = str.replace(/"/gi,'\"');
+ str = str.replace(/<br( )?(\/)?>/gi,'\n');
+ return str;
+};
+
+/**
+ * Converts from jabber timestamps to JavaScript Date objects
+ * @addon
+ * @param {String} ts A string representing a jabber datetime timestamp as
+ * defined by {@link http://www.xmpp.org/extensions/xep-0082.html XEP-0082}
+ * @return A javascript Date object corresponding to the jabber DateTime given
+ * @type Date
+ */
+Date.jab2date = function(ts) {
+ // 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)));
+
+ if (ts.substr(ts.length-6,1) != 'Z') { // there's an offset
+ var date_offset = date.getTimezoneOffset() * 60 * 1000;
+ var offset = new Date();
+ offset.setTime(0);
+ offset.setUTCHours(ts.substr(ts.length-5,2));
+ offset.setUTCMinutes(ts.substr(ts.length-2,2));
+ if (ts.substr(ts.length-6,1) == '+')
+ date.setTime(date.getTime() + offset.getTime() + date_offset);
+ else if (ts.substr(ts.length-6,1) == '-')
+ date.setTime(date.getTime() - offset.getTime() + date_offset);
+ }
+ return date;
+};
+
+/**
+ * Takes a timestamp in the form of 2004-08-13T12:07:04+02:00 as argument
+ * and converts it to some sort of humane readable format
+ * @addon
+ */
+Date.hrTime = function(ts) {
+ return Date.jab2date(ts).toLocaleString();
+};
+
+/**
+ * somewhat opposit to {@link #hrTime}
+ * expects a javascript Date object as parameter and returns a jabber
+ * date string conforming to
+ * {@link http://www.xmpp.org/extensions/xep-0082.html XEP-0082}
+ * @see #hrTime
+ * @return The corresponding jabber DateTime string
+ * @type String
+ */
+Date.prototype.jabberDate = function() {
+ var padZero = function(i) {
+ if (i < 10) return "0" + i;
+ return i;
+ };
+
+ var jDate = this.getUTCFullYear() + "-";
+ jDate += padZero(this.getUTCMonth()+1) + "-";
+ jDate += padZero(this.getUTCDate()) + "T";
+ jDate += padZero(this.getUTCHours()) + ":";
+ jDate += padZero(this.getUTCMinutes()) + ":";
+ jDate += padZero(this.getUTCSeconds()) + "Z";
+
+ return jDate;
+};
+
+/**
+ * Determines the maximum of two given numbers
+ * @addon
+ * @param {Number} A a number
+ * @param {Number} B another number
+ * @return the maximum of A and B
+ * @type Number
+ */
+Number.max = function(A, B) {
+ return (A > B)? A : B;
+};
+
+Number.min = function(A, B) {
+ return (A < B)? A : B;
+};
+
+
+/* Copyright (c) 1998 - 2007, Paul Johnston & Contributors
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following
+ * disclaimer. Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * Neither the name of the author nor the names of its contributors
+ * may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+/**
+ * @fileoverview Collection of MD5 and SHA1 hashing and encoding
+ * methods.
+ * @author Stefan Strigler steve@zeank.in-berlin.de
+ * @version $Revision$
+ */
+
+/*
+ * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
+ * in FIPS PUB 180-1
+ * Version 2.1a Copyright Paul Johnston 2000 - 2002.
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for details.
+ */
+
+/*
+ * Configurable variables. You may need to tweak these to be compatible with
+ * the server-side, but the defaults work in most cases.
+ */
+var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
+var b64pad = "="; /* base-64 pad character. "=" for strict RFC compliance */
+var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
+
+/*
+ * These are the functions you'll usually want to call
+ * They take string arguments and return either hex or base-64 encoded strings
+ */
+function hex_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length * chrsz));}
+function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length * chrsz));}
+function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length * chrsz));}
+function hex_hmac_sha1(key, data){ return binb2hex(core_hmac_sha1(key, data));}
+function b64_hmac_sha1(key, data){ return binb2b64(core_hmac_sha1(key, data));}
+function str_hmac_sha1(key, data){ return binb2str(core_hmac_sha1(key, data));}
+
+/*
+ * Perform a simple self-test to see if the VM is working
+ */
+function sha1_vm_test()
+{
+ return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
+}
+
+/*
+ * Calculate the SHA-1 of an array of big-endian words, and a bit length
+ */
+function core_sha1(x, len)
+{
+ /* append padding */
+ x[len >> 5] |= 0x80 << (24 - len % 32);
+ x[((len + 64 >> 9) << 4) + 15] = len;
+
+ var w = Array(80);
+ var a = 1732584193;
+ var b = -271733879;
+ var c = -1732584194;
+ var d = 271733878;
+ var e = -1009589776;
+
+ for(var i = 0; i < x.length; i += 16)
+ {
+ var olda = a;
+ var oldb = b;
+ var oldc = c;
+ var oldd = d;
+ var olde = e;
+
+ for(var j = 0; j < 80; j++)
+ {
+ if(j < 16) w[j] = x[i + j];
+ else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
+ var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)),
+ safe_add(safe_add(e, w[j]), sha1_kt(j)));
+ e = d;
+ d = c;
+ c = rol(b, 30);
+ b = a;
+ a = t;
+ }
+
+ a = safe_add(a, olda);
+ b = safe_add(b, oldb);
+ c = safe_add(c, oldc);
+ d = safe_add(d, oldd);
+ e = safe_add(e, olde);
+ }
+ return Array(a, b, c, d, e);
+
+}
+
+/*
+ * Perform the appropriate triplet combination function for the current
+ * iteration
+ */
+function sha1_ft(t, b, c, d)
+{
+ if(t < 20) return (b & c) | ((~b) & d);
+ if(t < 40) return b ^ c ^ d;
+ if(t < 60) return (b & c) | (b & d) | (c & d);
+ return b ^ c ^ d;
+}
+
+/*
+ * Determine the appropriate additive constant for the current iteration
+ */
+function sha1_kt(t)
+{
+ return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
+ (t < 60) ? -1894007588 : -899497514;
+}
+
+/*
+ * Calculate the HMAC-SHA1 of a key and some data
+ */
+function core_hmac_sha1(key, data)
+{
+ var bkey = str2binb(key);
+ if(bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz);
+
+ var ipad = Array(16), opad = Array(16);
+ for(var i = 0; i < 16; i++)
+ {
+ ipad[i] = bkey[i] ^ 0x36363636;
+ opad[i] = bkey[i] ^ 0x5C5C5C5C;
+ }
+
+ var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz);
+ return core_sha1(opad.concat(hash), 512 + 160);
+}
+
+/*
+ * Bitwise rotate a 32-bit number to the left.
+ */
+function rol(num, cnt)
+{
+ return (num << cnt) | (num >>> (32 - cnt));
+}
+
+/*
+ * Convert an 8-bit or 16-bit string to an array of big-endian words
+ * In 8-bit function, characters >255 have their hi-byte silently ignored.
+ */
+function str2binb(str)
+{
+ var bin = Array();
+ var mask = (1 << chrsz) - 1;
+ for(var i = 0; i < str.length * chrsz; i += chrsz)
+ bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - i%32);
+ return bin;
+}
+
+/*
+ * Convert an array of big-endian words to a string
+ */
+function binb2str(bin)
+{
+ var str = "";
+ var mask = (1 << chrsz) - 1;
+ for(var i = 0; i < bin.length * 32; i += chrsz)
+ str += String.fromCharCode((bin[i>>5] >>> (32 - chrsz - i%32)) & mask);
+ return str;
+}
+
+/*
+ * Convert an array of big-endian words to a hex string.
+ */
+function binb2hex(binarray)
+{
+ var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
+ var str = "";
+ for(var i = 0; i < binarray.length * 4; i++)
+ {
+ str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
+ hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF);
+ }
+ return str;
+}
+
+/*
+ * Convert an array of big-endian words to a base-64 string
+ */
+function binb2b64(binarray)
+{
+ var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+ var str = "";
+ for(var i = 0; i < binarray.length * 4; i += 3)
+ {
+ var triplet = (((binarray[i >> 2] >> 8 * (3 - i %4)) & 0xFF) << 16)
+ | (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 )
+ | ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF);
+ for(var j = 0; j < 4; j++)
+ {
+ if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
+ else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
+ }
+ }
+ return str.replace(/AAA\=(\=*?)$/,'$1'); // cleans garbage chars at end of string
+}
+
+/*
+ * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
+ * Digest Algorithm, as defined in RFC 1321.
+ * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for more info.
+ */
+
+/*
+ * Configurable variables. You may need to tweak these to be compatible with
+ * the server-side, but the defaults work in most cases.
+ */
+// var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
+// var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */
+// var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
+
+/*
+ * These are the functions you'll usually want to call
+ * They take string arguments and return either hex or base-64 encoded strings
+ */
+function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
+function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
+function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
+function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
+function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
+function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }
+
+/*
+ * Perform a simple self-test to see if the VM is working
+ */
+function md5_vm_test()
+{
+ return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
+}
+
+/*
+ * Calculate the MD5 of an array of little-endian words, and a bit length
+ */
+function core_md5(x, len)
+{
+ /* append padding */
+ x[len >> 5] |= 0x80 << ((len) % 32);
+ x[(((len + 64) >>> 9) << 4) + 14] = len;
+
+ var a = 1732584193;
+ var b = -271733879;
+ var c = -1732584194;
+ var d = 271733878;
+
+ for(var i = 0; i < x.length; i += 16)
+ {
+ var olda = a;
+ var oldb = b;
+ var oldc = c;
+ var oldd = d;
+
+ a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
+ d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
+ c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
+ b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
+ a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
+ d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
+ c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
+ b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
+ a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
+ d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
+ c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
+ b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
+ a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
+ d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
+ c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
+ b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);
+
+ a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
+ d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
+ c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);
+ b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
+ a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
+ d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
+ c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
+ b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
+ a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
+ d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
+ c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
+ b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
+ a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
+ d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
+ c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
+ b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
+
+ a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
+ d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
+ c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
+ b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
+ a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
+ d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
+ c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
+ b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
+ a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
+ d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
+ c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
+ b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
+ a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
+ d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
+ c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);
+ b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
+
+ a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
+ d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
+ c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
+ b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
+ a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
+ d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
+ c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
+ b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
+ a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
+ d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
+ c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
+ b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
+ a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
+ d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
+ c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
+ b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
+
+ a = safe_add(a, olda);
+ b = safe_add(b, oldb);
+ c = safe_add(c, oldc);
+ d = safe_add(d, oldd);
+ }
+ return Array(a, b, c, d);
+
+}
+
+/*
+ * These functions implement the four basic operations the algorithm uses.
+ */
+function md5_cmn(q, a, b, x, s, t)
+{
+ return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
+}
+function md5_ff(a, b, c, d, x, s, t)
+{
+ return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
+}
+function md5_gg(a, b, c, d, x, s, t)
+{
+ return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
+}
+function md5_hh(a, b, c, d, x, s, t)
+{
+ return md5_cmn(b ^ c ^ d, a, b, x, s, t);
+}
+function md5_ii(a, b, c, d, x, s, t)
+{
+ return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
+}
+
+/*
+ * Calculate the HMAC-MD5, of a key and some data
+ */
+function core_hmac_md5(key, data)
+{
+ var bkey = str2binl(key);
+ if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);
+
+ var ipad = Array(16), opad = Array(16);
+ for(var i = 0; i < 16; i++)
+ {
+ ipad[i] = bkey[i] ^ 0x36363636;
+ opad[i] = bkey[i] ^ 0x5C5C5C5C;
+ }
+
+ var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
+ return core_md5(opad.concat(hash), 512 + 128);
+}
+
+/*
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
+ * to work around bugs in some JS interpreters.
+ */
+function safe_add(x, y)
+{
+ var lsw = (x & 0xFFFF) + (y & 0xFFFF);
+ var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+ return (msw << 16) | (lsw & 0xFFFF);
+}
+
+/*
+ * Bitwise rotate a 32-bit number to the left.
+ */
+function bit_rol(num, cnt)
+{
+ return (num << cnt) | (num >>> (32 - cnt));
+}
+
+/*
+ * Convert a string to an array of little-endian words
+ * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
+ */
+function str2binl(str)
+{
+ var bin = Array();
+ var mask = (1 << chrsz) - 1;
+ for(var i = 0; i < str.length * chrsz; i += chrsz)
+ bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
+ return bin;
+}
+
+/*
+ * Convert an array of little-endian words to a string
+ */
+function binl2str(bin)
+{
+ var str = "";
+ var mask = (1 << chrsz) - 1;
+ for(var i = 0; i < bin.length * 32; i += chrsz)
+ str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
+ return str;
+}
+
+/*
+ * Convert an array of little-endian words to a hex string.
+ */
+function binl2hex(binarray)
+{
+ var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
+ var str = "";
+ for(var i = 0; i < binarray.length * 4; i++)
+ {
+ str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
+ hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF);
+ }
+ return str;
+}
+
+/*
+ * Convert an array of little-endian words to a base-64 string
+ */
+function binl2b64(binarray)
+{
+ var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+ var str = "";
+ for(var i = 0; i < binarray.length * 4; i += 3)
+ {
+ var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16)
+ | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
+ | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
+ for(var j = 0; j < 4; j++)
+ {
+ if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
+ else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
+ }
+ }
+ return str;
+}
+
+/* #############################################################################
+ UTF-8 Decoder and Encoder
+ base64 Encoder and Decoder
+ written by Tobias Kieslich, justdreams
+ Contact: tobias@justdreams.de http://www.justdreams.de/
+ ############################################################################# */
+
+// returns an array of byterepresenting dezimal numbers which represent the
+// plaintext in an UTF-8 encoded version. Expects a string.
+// This function includes an exception management for those nasty browsers like
+// NN401, which returns negative decimal numbers for chars>128. I hate it!!
+// This handling is unfortunately limited to the user's charset. Anyway, it works
+// in most of the cases! Special signs with an unicode>256 return numbers, which
+// can not be converted to the actual unicode and so not to the valid utf-8
+// representation. Anyway, this function does always return values which can not
+// misinterpretd by RC4 or base64 en- or decoding, because every value is >0 and
+// <255!!
+// Arrays are faster and easier to handle in b64 encoding or encrypting....
+function utf8t2d(t)
+{
+ t = t.replace(/\r\n/g,"\n");
+ var d=new Array; var test=String.fromCharCode(237);
+ if (test.charCodeAt(0) < 0)
+ for(var n=0; n<t.length; n++)
+ {
+ var c=t.charCodeAt(n);
+ if (c>0)
+ d[d.length]= c;
+ else {
+ d[d.length]= (((256+c)>>6)|192);
+ d[d.length]= (((256+c)&63)|128);}
+ }
+ else
+ for(var n=0; n<t.length; n++)
+ {
+ var c=t.charCodeAt(n);
+ // all the signs of asci => 1byte
+ if (c<128)
+ d[d.length]= c;
+ // all the signs between 127 and 2047 => 2byte
+ else if((c>127) && (c<2048)) {
+ d[d.length]= ((c>>6)|192);
+ d[d.length]= ((c&63)|128);}
+ // all the signs between 2048 and 66536 => 3byte
+ else {
+ d[d.length]= ((c>>12)|224);
+ d[d.length]= (((c>>6)&63)|128);
+ d[d.length]= ((c&63)|128);}
+ }
+ return d;
+}
+
+// returns plaintext from an array of bytesrepresenting dezimal numbers, which
+// represent an UTF-8 encoded text; browser which does not understand unicode
+// like NN401 will show "?"-signs instead
+// expects an array of byterepresenting decimals; returns a string
+function utf8d2t(d)
+{
+ var r=new Array; var i=0;
+ while(i<d.length)
+ {
+ if (d[i]<128) {
+ r[r.length]= String.fromCharCode(d[i]); i++;}
+ else if((d[i]>191) && (d[i]<224)) {
+ r[r.length]= String.fromCharCode(((d[i]&31)<<6) | (d[i+1]&63)); i+=2;}
+ else {
+ r[r.length]= String.fromCharCode(((d[i]&15)<<12) | ((d[i+1]&63)<<6) | (d[i+2]&63)); i+=3;}
+ }
+ return r.join("");
+}
+
+// included in <body onload="b64arrays"> it creates two arrays which makes base64
+// en- and decoding faster
+// this speed is noticeable especially when coding larger texts (>5k or so)
+function b64arrays() {
+ var b64s='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+ b64 = new Array();f64 =new Array();
+ for (var i=0; i<b64s.length ;i++) {
+ b64[i] = b64s.charAt(i);
+ f64[b64s.charAt(i)] = i;
+ }
+}
+
+// creates a base64 encoded text out of an array of byerepresenting dezimals
+// it is really base64 :) this makes serversided handling easier
+// expects an array; returns a string
+function b64d2t(d) {
+ var r=new Array; var i=0; var dl=d.length;
+ // this is for the padding
+ if ((dl%3) == 1) {
+ d[d.length] = 0; d[d.length] = 0;}
+ if ((dl%3) == 2)
+ d[d.length] = 0;
+ // from here conversion
+ while (i<d.length)
+ {
+ r[r.length] = b64[d[i]>>2];
+ r[r.length] = b64[((d[i]&3)<<4) | (d[i+1]>>4)];
+ r[r.length] = b64[((d[i+1]&15)<<2) | (d[i+2]>>6)];
+ r[r.length] = b64[d[i+2]&63];
+ i+=3;
+ }
+ // this is again for the padding
+ if ((dl%3) == 1)
+ r[r.length-1] = r[r.length-2] = "=";
+ if ((dl%3) == 2)
+ r[r.length-1] = "=";
+ // we join the array to return a textstring
+ var t=r.join("");
+ return t;
+}
+
+// returns array of byterepresenting numbers created of an base64 encoded text
+// it is still the slowest function in this modul; I hope I can make it faster
+// expects string; returns an array
+function b64t2d(t) {
+ var d=new Array; var i=0;
+ // here we fix this CRLF sequenz created by MS-OS; arrrgh!!!
+ t=t.replace(/\n|\r/g,""); t=t.replace(/=/g,"");
+ while (i<t.length)
+ {
+ d[d.length] = (f64[t.charAt(i)]<<2) | (f64[t.charAt(i+1)]>>4);
+ d[d.length] = (((f64[t.charAt(i+1)]&15)<<4) | (f64[t.charAt(i+2)]>>2));
+ d[d.length] = (((f64[t.charAt(i+2)]&3)<<6) | (f64[t.charAt(i+3)]));
+ i+=4;
+ }
+ if (t.length%4 == 2)
+ d = d.slice(0, d.length-2);
+ if (t.length%4 == 3)
+ d = d.slice(0, d.length-1);
+ return d;
+}
+
+b64arrays();
+
+b64decode = function(s) {
+ return utf8d2t(b64t2d(s));
+}
+
+b64encode = function(s) {
+ return b64d2t(utf8t2d(s));
+}
+
+function cnonce(size) {
+ var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+ var cnonce = '';
+ for (var i=0; i<size; i++) {
+ cnonce += tab.charAt(Math.round(Math.random(new Date().getTime())*(tab.length-1)));
+ }
+ return cnonce;
+}
+
+
+
+JSJAC_HAVEKEYS = true; // whether to use keys
+JSJAC_NKEYS = 16; // number of keys to generate
+JSJAC_INACTIVITY = 300; // qnd hack to make suspend/resume
+ // work more smoothly with polling
+JSJAC_ERR_COUNT = 10; // number of retries in case of connection
+ // errors
+
+JSJAC_ALLOW_PLAIN = true; // whether to allow plaintext logins
+
+JSJAC_CHECKQUEUEINTERVAL = 100; // msecs to poll send queue
+JSJAC_CHECKINQUEUEINTERVAL = 100; // msecs to poll incoming queue
+JSJAC_TIMERVAL = 2000; // default polling interval
+
+// Options specific to HTTP Binding (BOSH)
+JSJACHBC_MAX_HOLD = 1; // default for number of connections held by
+ // connection manager
+JSJACHBC_MAX_WAIT = 20; // default 'wait' param - how long an idle connection
+ // should be held by connection manager
+
+JSJACHBC_BOSH_VERSION = "1.6";
+JSJACHBC_USE_BOSH_VER = true;
+
+JSJACHBC_MAXPAUSE = 20; // how long a suspend/resume cycle may take
+
+/*** END CONFIG ***/
+
+
+/* Copyright (c) 2005-2007 Sam Stephenson
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ json.js
+ taken from prototype.js, made static
+*/
+function JSJaCJSON() {}
+JSJaCJSON.toString = function (obj) {
+ var m = {
+ '\b': '\\b',
+ '\t': '\\t',
+ '\n': '\\n',
+ '\f': '\\f',
+ '\r': '\\r',
+ '"' : '\\"',
+ '\\': '\\\\'
+ },
+ s = {
+ array: function (x) {
+ var a = ['['], b, f, i, l = x.length, v;
+ for (i = 0; i < l; i += 1) {
+ v = x[i];
+ f = s[typeof v];
+ if (f) {
+ try {
+ v = f(v);
+ if (typeof v == 'string') {
+ if (b) {
+ a[a.length] = ',';
+ }
+ a[a.length] = v;
+ b = true;
+ }
+ } catch(e) {
+ }
+ }
+ }
+ a[a.length] = ']';
+ return a.join('');
+ },
+ 'boolean': function (x) {
+ return String(x);
+ },
+ 'null': function (x) {
+ return "null";
+ },
+ number: function (x) {
+ return isFinite(x) ? String(x) : 'null';
+ },
+ object: function (x) {
+ if (x) {
+ if (x instanceof Array) {
+ return s.array(x);
+ }
+ var a = ['{'], b, f, i, v;
+ for (i in x) {
+ if (x.hasOwnProperty(i)) {
+ v = x[i];
+ f = s[typeof v];
+ if (f) {
+ try {
+ v = f(v);
+ if (typeof v == 'string') {
+ if (b) {
+ a[a.length] = ',';
+ }
+ a.push(s.string(i), ':', v);
+ b = true;
+ }
+ } catch(e) {
+ }
+ }
+ }
+ }
+
+ a[a.length] = '}';
+ return a.join('');
+ }
+ return 'null';
+ },
+ string: function (x) {
+ if (/["\\\x00-\x1f]/.test(x)) {
+ x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) {
+ var c = m[b];
+ if (c) {
+ return c;
+ }
+ c = b.charCodeAt();
+ return '\\u00' +
+ Math.floor(c / 16).toString(16) +
+ (c % 16).toString(16);
+ });
+ }
+ return '"' + x + '"';
+}
+ };
+
+switch (typeof(obj)) {
+ case 'object':
+ return s.object(obj);
+ case 'array':
+ return s.array(obj);
+
+ }
+};
+
+JSJaCJSON.parse = function (str) {
+ try {
+ return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
+ str.replace(/"(\\.|[^"\\])*"/g, ''))) &&
+ eval('(' + str + ')');
+ } catch (e) {
+ return false;
+ }
+};
+
+
+/**
+ * @fileoverview This file contains all things that make life easier when
+ * dealing with JIDs
+ * @author Stefan Strigler
+ * @version $Revision$
+ */
+
+/**
+ * list of forbidden chars for nodenames
+ * @private
+ */
+var JSJACJID_FORBIDDEN = ['"',' ','&','\'','/',':','<','>','@'];
+
+/**
+ * Creates a new JSJaCJID object
+ * @class JSJaCJID models xmpp jid objects
+ * @constructor
+ * @param {Object} jid jid may be either of type String or a JID represented
+ * by JSON with fields 'node', 'domain' and 'resource'
+ * @throws JSJaCJIDInvalidException Thrown if jid is not valid
+ * @return a new JSJaCJID object
+ */
+function JSJaCJID(jid) {
+ /**
+ *@private
+ */
+ this._node = '';
+ /**
+ *@private
+ */
+ this._domain = '';
+ /**
+ *@private
+ */
+ this._resource = '';
+
+ if (typeof(jid) == 'string') {
+ if (jid.indexOf('@') != -1) {
+ this.setNode(jid.substring(0,jid.indexOf('@')));
+ jid = jid.substring(jid.indexOf('@')+1);
+ }
+ if (jid.indexOf('/') != -1) {
+ this.setResource(jid.substring(jid.indexOf('/')+1));
+ jid = jid.substring(0,jid.indexOf('/'));
+ }
+ this.setDomain(jid);
+ } else {
+ this.setNode(jid.node);
+ this.setDomain(jid.domain);
+ this.setResource(jid.resource);
+ }
+}
+
+
+/**
+ * Gets the node part of the jid
+ * @return A string representing the node name
+ * @type String
+ */
+JSJaCJID.prototype.getNode = function() { return this._node; };
+
+/**
+ * Gets the domain part of the jid
+ * @return A string representing the domain name
+ * @type String
+ */
+JSJaCJID.prototype.getDomain = function() { return this._domain; };
+
+/**
+ * Gets the resource part of the jid
+ * @return A string representing the resource
+ * @type String
+ */
+JSJaCJID.prototype.getResource = function() { return this._resource; };
+
+
+/**
+ * Sets the node part of the jid
+ * @param {String} node Name of the node
+ * @throws JSJaCJIDInvalidException Thrown if node name contains invalid chars
+ * @return This object
+ * @type JSJaCJID
+ */
+JSJaCJID.prototype.setNode = function(node) {
+ JSJaCJID._checkNodeName(node);
+ this._node = node || '';
+ return this;
+};
+
+/**
+ * Sets the domain part of the jid
+ * @param {String} domain Name of the domain
+ * @throws JSJaCJIDInvalidException Thrown if domain name contains invalid
+ * chars or is empty
+ * @return This object
+ * @type JSJaCJID
+ */
+JSJaCJID.prototype.setDomain = function(domain) {
+ if (!domain || domain == '')
+ throw new JSJaCJIDInvalidException("domain name missing");
+ // chars forbidden for a node are not allowed in domain names
+ // anyway, so let's check
+ JSJaCJID._checkNodeName(domain);
+ this._domain = domain;
+ return this;
+};
+
+/**
+ * Sets the resource part of the jid
+ * @param {String} resource Name of the resource
+ * @return This object
+ * @type JSJaCJID
+ */
+JSJaCJID.prototype.setResource = function(resource) {
+ this._resource = resource || '';
+ return this;
+};
+
+/**
+ * The string representation of the full jid
+ * @return A string representing the jid
+ * @type String
+ */
+JSJaCJID.prototype.toString = function() {
+ var jid = '';
+ if (this.getNode() && this.getNode() != '')
+ jid = this.getNode() + '@';
+ jid += this.getDomain(); // we always have a domain
+ if (this.getResource() && this.getResource() != "")
+ jid += '/' + this.getResource();
+ return jid;
+};
+
+/**
+ * Removes the resource part of the jid
+ * @return This object
+ * @type JSJaCJID
+ */
+JSJaCJID.prototype.removeResource = function() {
+ return this.setResource();
+};
+
+/**
+ * creates a copy of this JSJaCJID object
+ * @return A copy of this
+ * @type JSJaCJID
+ */
+JSJaCJID.prototype.clone = function() {
+ return new JSJaCJID(this.toString());
+};
+
+/**
+ * Compares two jids if they belong to the same entity (i.e. w/o resource)
+ * @param {String} jid a jid as string or JSJaCJID object
+ * @return 'true' if jid is same entity as this
+ * @type Boolean
+ */
+JSJaCJID.prototype.isEntity = function(jid) {
+ if (typeof jid == 'string')
+ jid = (new JSJaCJID(jid));
+ jid.removeResource();
+ return (this.clone().removeResource().toString() === jid.toString());
+};
+
+/**
+ * Check if node name is valid
+ * @private
+ * @param {String} node A name for a node
+ * @throws JSJaCJIDInvalidException Thrown if name for node is not allowed
+ */
+JSJaCJID._checkNodeName = function(nodeprep) {
+ if (!nodeprep || nodeprep == '')
+ return;
+ for (var i=0; i< JSJACJID_FORBIDDEN.length; i++) {
+ if (nodeprep.indexOf(JSJACJID_FORBIDDEN[i]) != -1) {
+ throw new JSJaCJIDInvalidException("forbidden char in nodename: "+JSJACJID_FORBIDDEN[i]);
+ }
+ }
+};
+
+/**
+ * Creates a new Exception of type JSJaCJIDInvalidException
+ * @class Exception to indicate invalid values for a jid
+ * @constructor
+ * @param {String} message The message associated with this Exception
+ */
+function JSJaCJIDInvalidException(message) {
+ /**
+ * The exceptions associated message
+ * @type String
+ */
+ this.message = message;
+ /**
+ * The name of the exception
+ * @type String
+ */
+ this.name = "JSJaCJIDInvalidException";
+}
+
+
+/* Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/**
+ * @private
+ * This code is taken from {@link
+ * http://wiki.script.aculo.us/scriptaculous/show/Builder
+ * script.aculo.us' Dom Builder} and has been modified to suit our
+ * needs.<br/>
+ * The original parts of the code do have the following
+ * copyright and license notice:<br/>
+ * Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us,
+ * http://mir.acu lo.us) <br/>
+ * script.aculo.us is freely distributable under the terms of an
+ * MIT-style license.<br>
+ * For details, see the script.aculo.us web site:
+ * http://script.aculo.us/<br>
+ */
+var JSJaCBuilder = {
+ /**
+ * @private
+ */
+ buildNode: function(doc, elementName) {
+
+ var element, ns = arguments[4];
+
+ // attributes (or text)
+ if(arguments[2])
+ if(JSJaCBuilder._isStringOrNumber(arguments[2]) ||
+ (arguments[2] instanceof Array)) {
+ element = this._createElement(doc, elementName, ns);
+ JSJaCBuilder._children(doc, element, arguments[2]);
+ } else {
+ ns = arguments[2]['xmlns'] || ns;
+ element = this._createElement(doc, elementName, ns);
+ for(attr in arguments[2]) {
+ if (arguments[2].hasOwnProperty(attr) && attr != 'xmlns')
+ element.setAttribute(attr, arguments[2][attr]);
+ }
+ }
+ else
+ element = this._createElement(doc, elementName, ns);
+ // text, or array of children
+ if(arguments[3])
+ JSJaCBuilder._children(doc, element, arguments[3], ns);
+
+ return element;
+ },
+
+ _createElement: function(doc, elementName, ns) {
+ try {
+ if (ns)
+ return doc.createElementNS(ns, elementName);
+ } catch (ex) { }
+
+ var el = doc.createElement(elementName);
+
+ if (ns)
+ el.setAttribute("xmlns", ns);
+
+ return el;
+ },
+
+ /**
+ * @private
+ */
+ _text: function(doc, text) {
+ return doc.createTextNode(text);
+ },
+
+ /**
+ * @private
+ */
+ _children: function(doc, element, children, ns) {
+ if(typeof children=='object') { // array can hold nodes and text
+ for (var i in children) {
+ if (children.hasOwnProperty(i)) {
+ var e = children[i];
+ if (typeof e=='object') {
+ if (e instanceof Array) {
+ var node = JSJaCBuilder.buildNode(doc, e[0], e[1], e[2], ns);
+ element.appendChild(node);
+ } else {
+ element.appendChild(e);
+ }
+ } else {
+ if(JSJaCBuilder._isStringOrNumber(e)) {
+ element.appendChild(JSJaCBuilder._text(doc, e));
+ }
+ }
+ }
+ }
+ } else {
+ if(JSJaCBuilder._isStringOrNumber(children)) {
+ element.appendChild(JSJaCBuilder._text(doc, children));
+ }
+ }
+ },
+
+ _attributes: function(attributes) {
+ var attrs = [];
+ for(attribute in attributes)
+ if (attributes.hasOwnProperty(attribute))
+ attrs.push(attribute +
+ '="' + attributes[attribute].toString().htmlEnc() + '"');
+ return attrs.join(" ");
+ },
+
+ _isStringOrNumber: function(param) {
+ return(typeof param=='string' || typeof param=='number');
+ }
+};
+
+
+/**
+ * @fileoverview Contains all Jabber/XMPP packet related classes.
+ * @author Stefan Strigler steve@zeank.in-berlin.de
+ * @version $Revision$
+ */
+
+var JSJACPACKET_USE_XMLNS = true;
+
+/**
+ * Creates a new packet with given root tag name (for internal use)
+ * @class Somewhat abstract base class for all kinds of specialised packets
+ * @param {String} name The root tag name of the packet
+ * (i.e. one of 'message', 'iq' or 'presence')
+ */
+function JSJaCPacket(name) {
+ /**
+ * @private
+ */
+ this.name = name;
+
+ if (typeof(JSJACPACKET_USE_XMLNS) != 'undefined' && JSJACPACKET_USE_XMLNS)
+ /**
+ * @private
+ */
+ this.doc = XmlDocument.create(name,'jabber:client');
+ else
+ /**
+ * @private
+ */
+ this.doc = XmlDocument.create(name,'');
+}
+
+/**
+ * Gets the type (name of root element) of this packet, i.e. one of
+ * 'presence', 'message' or 'iq'
+ * @return the top level tag name
+ * @type String
+ */
+JSJaCPacket.prototype.pType = function() { return this.name; };
+
+/**
+ * Gets the associated Document for this packet.
+ * @type {@link http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#i-Document Document}
+ */
+JSJaCPacket.prototype.getDoc = function() {
+ return this.doc;
+};
+/**
+ * Gets the root node of this packet
+ * @type {@link http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247 Node}
+ */
+JSJaCPacket.prototype.getNode = function() {
+ if (this.getDoc() && this.getDoc().documentElement)
+ return this.getDoc().documentElement;
+ else
+ return null;
+};
+
+/**
+ * Sets the 'to' attribute of the root node of this packet
+ * @param {String} to
+ * @type JSJaCPacket
+ */
+JSJaCPacket.prototype.setTo = function(to) {
+ if (!to || to == '')
+ this.getNode().removeAttribute('to');
+ else if (typeof(to) == 'string')
+ this.getNode().setAttribute('to',to);
+ else
+ this.getNode().setAttribute('to',to.toString());
+ return this;
+};
+/**
+ * Sets the 'from' attribute of the root node of this
+ * packet. Usually this is not needed as the server will take care
+ * of this automatically.
+ * @type JSJaCPacket
+ */
+JSJaCPacket.prototype.setFrom = function(from) {
+ if (!from || from == '')
+ this.getNode().removeAttribute('from');
+ else if (typeof(from) == 'string')
+ this.getNode().setAttribute('from',from);
+ else
+ this.getNode().setAttribute('from',from.toString());
+ return this;
+};
+/**
+ * Sets 'id' attribute of the root node of this packet.
+ * @param {String} id The id of the packet.
+ * @type JSJaCPacket
+ */
+JSJaCPacket.prototype.setID = function(id) {
+ if (!id || id == '')
+ this.getNode().removeAttribute('id');
+ else
+ this.getNode().setAttribute('id',id);
+ return this;
+};
+/**
+ * Sets the 'type' attribute of the root node of this packet.
+ * @param {String} type The type of the packet.
+ * @type JSJaCPacket
+ */
+JSJaCPacket.prototype.setType = function(type) {
+ if (!type || type == '')
+ this.getNode().removeAttribute('type');
+ else
+ this.getNode().setAttribute('type',type);
+ return this;
+};
+/**
+ * Sets 'xml:lang' for this packet
+ * @param {String} xmllang The xml:lang of the packet.
+ * @type JSJaCPacket
+ */
+JSJaCPacket.prototype.setXMLLang = function(xmllang) {
+ // Fix IE9+ bug with xml:lang attribute
+ if (BrowserDetect && (BrowserDetect.browser == 'Explorer') && (BrowserDetect.version >= 9))
+ return this;
+ if (!xmllang || xmllang == '')
+ this.getNode().removeAttribute('xml:lang');
+ else
+ this.getNode().setAttribute('xml:lang',xmllang);
+ return this;
+};
+
+/**
+ * Gets the 'to' attribute of this packet
+ * @type String
+ */
+JSJaCPacket.prototype.getTo = function() {
+ return this.getNode().getAttribute('to');
+};
+/**
+ * Gets the 'from' attribute of this packet.
+ * @type String
+ */
+JSJaCPacket.prototype.getFrom = function() {
+ return this.getNode().getAttribute('from');
+};
+/**
+ * Gets the 'to' attribute of this packet as a JSJaCJID object
+ * @type JSJaCJID
+ */
+JSJaCPacket.prototype.getToJID = function() {
+ return new JSJaCJID(this.getTo());
+};
+/**
+ * Gets the 'from' attribute of this packet as a JSJaCJID object
+ * @type JSJaCJID
+ */
+JSJaCPacket.prototype.getFromJID = function() {
+ return new JSJaCJID(this.getFrom());
+};
+/**
+ * Gets the 'id' of this packet
+ * @type String
+ */
+JSJaCPacket.prototype.getID = function() {
+ return this.getNode().getAttribute('id');
+};
+/**
+ * Gets the 'type' of this packet
+ * @type String
+ */
+JSJaCPacket.prototype.getType = function() {
+ return this.getNode().getAttribute('type');
+};
+/**
+ * Gets the 'xml:lang' of this packet
+ * @type String
+ */
+JSJaCPacket.prototype.getXMLLang = function() {
+ return this.getNode().getAttribute('xml:lang');
+};
+/**
+ * Gets the 'xmlns' (xml namespace) of the root node of this packet
+ * @type String
+ */
+JSJaCPacket.prototype.getXMLNS = function() {
+ return this.getNode().namespaceURI || this.getNode().getAttribute('xmlns');
+};
+
+/**
+ * Gets a child element of this packet. If no params given returns first child.
+ * @param {String} name Tagname of child to retrieve. Use '*' to match any tag. [optional]
+ * @param {String} ns Namespace of child. Use '*' to match any ns.[optional]
+ * @return The child node, null if none found
+ * @type {@link http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247 Node}
+ */
+JSJaCPacket.prototype.getChild = function(name, ns) {
+ if (!this.getNode()) {
+ return null;
+ }
+
+ name = name || '*';
+ ns = ns || '*';
+
+ if (this.getNode().getElementsByTagNameNS) {
+ return this.getNode().getElementsByTagNameNS(ns, name).item(0);
+ }
+
+ // fallback
+ var nodes = this.getNode().getElementsByTagName(name);
+ if (ns != '*') {
+ for (var i=0; i<nodes.length; i++) {
+ if (nodes.item(i).namespaceURI == ns || nodes.item(i).getAttribute('xmlns') == ns) {
+ return nodes.item(i);
+ }
+ }
+ } else {
+ return nodes.item(0);
+ }
+ return null; // nothing found
+};
+
+/**
+ * Gets the node value of a child element of this packet.
+ * @param {String} name Tagname of child to retrieve.
+ * @param {String} ns Namespace of child
+ * @return The value of the child node, empty string if none found
+ * @type String
+ */
+JSJaCPacket.prototype.getChildVal = function(name, ns) {
+ var node = this.getChild(name, ns);
+ var ret = '';
+ if (node && node.hasChildNodes()) {
+ // concatenate all values from childNodes
+ for (var i=0; i<node.childNodes.length; i++)
+ if (node.childNodes.item(i).nodeValue)
+ ret += node.childNodes.item(i).nodeValue;
+ }
+ return ret;
+};
+
+/**
+ * Returns a copy of this node
+ * @return a copy of this node
+ * @type JSJaCPacket
+ */
+JSJaCPacket.prototype.clone = function() {
+ return JSJaCPacket.wrapNode(this.getNode());
+};
+
+/**
+ * Checks if packet is of type 'error'
+ * @return 'true' if this packet is of type 'error', 'false' otherwise
+ * @type boolean
+ */
+JSJaCPacket.prototype.isError = function() {
+ return (this.getType() == 'error');
+};
+
+/**
+ * Returns an error condition reply according to {@link http://www.xmpp.org/extensions/xep-0086.html XEP-0086}. Creates a clone of the calling packet with senders and recipient exchanged and error stanza appended.
+ * @param {STANZA_ERROR} stanza_error an error stanza containing error cody, type and condition of the error to be indicated
+ * @return an error reply packet
+ * @type JSJaCPacket
+ */
+JSJaCPacket.prototype.errorReply = function(stanza_error) {
+ var rPacket = this.clone();
+ rPacket.setTo(this.getFrom());
+ rPacket.setFrom();
+ rPacket.setType('error');
+
+ rPacket.appendNode('error',
+ {code: stanza_error.code, type: stanza_error.type},
+ [[stanza_error.cond]]);
+
+ return rPacket;
+};
+
+/**
+ * Returns a string representation of the raw xml content of this packet.
+ * @type String
+ */
+JSJaCPacket.prototype.xml = typeof XMLSerializer != 'undefined' ?
+function() {
+ var r = (new XMLSerializer()).serializeToString(this.getNode());
+ if (typeof(r) == 'undefined')
+ r = (new XMLSerializer()).serializeToString(this.doc); // oldschool
+ return r
+} :
+function() {// IE
+ return this.getDoc().xml
+};
+
+
+// PRIVATE METHODS DOWN HERE
+
+/**
+ * Gets an attribute of the root element
+ * @private
+ */
+JSJaCPacket.prototype._getAttribute = function(attr) {
+ return this.getNode().getAttribute(attr);
+};
+
+
+if (document.ELEMENT_NODE == null) {
+ document.ELEMENT_NODE = 1;
+ document.ATTRIBUTE_NODE = 2;
+ document.TEXT_NODE = 3;
+ document.CDATA_SECTION_NODE = 4;
+ document.ENTITY_REFERENCE_NODE = 5;
+ document.ENTITY_NODE = 6;
+ document.PROCESSING_INSTRUCTION_NODE = 7;
+ document.COMMENT_NODE = 8;
+ document.DOCUMENT_NODE = 9;
+ document.DOCUMENT_TYPE_NODE = 10;
+ document.DOCUMENT_FRAGMENT_NODE = 11;
+ document.NOTATION_NODE = 12;
+}
+
+/**
+ * import node into this packets document
+ * @private
+ */
+JSJaCPacket.prototype._importNode = function(node, allChildren) {
+ switch (node.nodeType) {
+ case document.ELEMENT_NODE:
+
+ if (this.getDoc().createElementNS) {
+ var newNode = this.getDoc().createElementNS(node.namespaceURI, node.nodeName);
+ } else {
+ var newNode = this.getDoc().createElement(node.nodeName);
+ }
+
+ /* does the node have any attributes to add? */
+ if (node.attributes && node.attributes.length > 0)
+ for (var i = 0, il = node.attributes.length;i < il; i++) {
+ var attr = node.attributes.item(i);
+ if (attr.nodeName == 'xmlns' && newNode.getAttribute('xmlns') != null ) continue;
+ if (newNode.setAttributeNS && attr.namespaceURI) {
+ newNode.setAttributeNS(attr.namespaceURI,
+ attr.nodeName,
+ attr.nodeValue);
+ } else {
+ newNode.setAttribute(attr.nodeName,
+ attr.nodeValue);
+ }
+ }
+ /* are we going after children too, and does the node have any? */
+ if (allChildren && node.childNodes && node.childNodes.length > 0) {
+ for (var i = 0, il = node.childNodes.length; i < il; i++) {
+ newNode.appendChild(this._importNode(node.childNodes.item(i), allChildren));
+ }
+ }
+ return newNode;
+ break;
+ case document.TEXT_NODE:
+ case document.CDATA_SECTION_NODE:
+ case document.COMMENT_NODE:
+ return this.getDoc().createTextNode(node.nodeValue);
+ break;
+ }
+};
+
+/**
+ * Set node value of a child node
+ * @private
+ */
+JSJaCPacket.prototype._setChildNode = function(nodeName, nodeValue) {
+ var aNode = this.getChild(nodeName);
+ var tNode = this.getDoc().createTextNode(nodeValue);
+ if (aNode)
+ try {
+ aNode.replaceChild(tNode,aNode.firstChild);
+ } catch (e) { }
+ else {
+ try {
+ aNode = this.getDoc().createElementNS(this.getNode().namespaceURI,
+ nodeName);
+ } catch (ex) {
+ aNode = this.getDoc().createElement(nodeName)
+ }
+ this.getNode().appendChild(aNode);
+ aNode.appendChild(tNode);
+ }
+ return aNode;
+};
+
+/**
+ * Builds a node using {@link
+ * http://wiki.script.aculo.us/scriptaculous/show/Builder
+ * script.aculo.us' Dom Builder} notation.
+ * This code is taken from {@link
+ * http://wiki.script.aculo.us/scriptaculous/show/Builder
+ * script.aculo.us' Dom Builder} and has been modified to suit our
+ * needs.<br/>
+ * The original parts of the code do have the following copyright
+ * and license notice:<br/>
+ * Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us,
+ * http://mir.acu lo.us) <br/>
+ * script.aculo.us is freely distributable under the terms of an
+ * MIT-style licen se. // For details, see the script.aculo.us web
+ * site: http://script.aculo.us/<br>
+ * @author Thomas Fuchs
+ * @author Stefan Strigler
+ * @return The newly created node
+ * @type {@link http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247 Node}
+ */
+JSJaCPacket.prototype.buildNode = function(elementName) {
+ return JSJaCBuilder.buildNode(this.getDoc(),
+ elementName,
+ arguments[1],
+ arguments[2]);
+};
+
+/**
+ * Appends node created by buildNode to this packets parent node.
+ * @param {@link http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247 Node} element The node to append or
+ * @param {String} element A name plus an object hash with attributes (optional) plus an array of childnodes (optional)
+ * @see #buildNode
+ * @return This packet
+ * @type JSJaCPacket
+ */
+JSJaCPacket.prototype.appendNode = function(element) {
+ if (typeof element=='object') { // seems to be a prebuilt node
+ return this.getNode().appendChild(element)
+ } else { // build node
+ return this.getNode().appendChild(this.buildNode(element,
+ arguments[1],
+ arguments[2],
+ null,
+ this.getNode().namespaceURI));
+ }
+};
+
+
+/**
+ * A jabber/XMPP presence packet
+ * @class Models the XMPP notion of a 'presence' packet
+ * @extends JSJaCPacket
+ */
+function JSJaCPresence() {
+ /**
+ * @ignore
+ */
+ this.base = JSJaCPacket;
+ this.base('presence');
+}
+JSJaCPresence.prototype = new JSJaCPacket;
+
+/**
+ * Sets the status message for current status. Usually this is set
+ * to some human readable string indicating what the user is
+ * doing/feel like currently.
+ * @param {String} status A status message
+ * @return this
+ * @type JSJaCPacket
+ */
+JSJaCPresence.prototype.setStatus = function(status) {
+ this._setChildNode("status", status);
+ return this;
+};
+/**
+ * Sets the online status for this presence packet.
+ * @param {String} show An XMPP complient status indicator. Must
+ * be one of 'chat', 'away', 'xa', 'dnd'
+ * @return this
+ * @type JSJaCPacket
+ */
+JSJaCPresence.prototype.setShow = function(show) {
+ if (show == 'chat' || show == 'away' || show == 'xa' || show == 'dnd')
+ this._setChildNode("show",show);
+ return this;
+};
+/**
+ * Sets the priority of the resource bind to with this connection
+ * @param {int} prio The priority to set this resource to
+ * @return this
+ * @type JSJaCPacket
+ */
+JSJaCPresence.prototype.setPriority = function(prio) {
+ this._setChildNode("priority", prio);
+ return this;
+};
+/**
+ * Some combined method that allowes for setting show, status and
+ * priority at once
+ * @param {String} show A status message
+ * @param {String} status A status indicator as defined by XMPP
+ * @param {int} prio A priority for this resource
+ * @return this
+ * @type JSJaCPacket
+ */
+JSJaCPresence.prototype.setPresence = function(show,status,prio) {
+ if (show)
+ this.setShow(show);
+ if (status)
+ this.setStatus(status);
+ if (prio)
+ this.setPriority(prio);
+ return this;
+};
+
+/**
+ * Gets the status message of this presence
+ * @return The (human readable) status message
+ * @type String
+ */
+JSJaCPresence.prototype.getStatus = function() {
+ return this.getChildVal('status');
+};
+/**
+ * Gets the status of this presence.
+ * Either one of 'chat', 'away', 'xa' or 'dnd' or null.
+ * @return The status indicator as defined by XMPP
+ * @type String
+ */
+JSJaCPresence.prototype.getShow = function() {
+ return this.getChildVal('show');
+};
+/**
+ * Gets the priority of this status message
+ * @return A resource priority
+ * @type int
+ */
+JSJaCPresence.prototype.getPriority = function() {
+ return this.getChildVal('priority');
+};
+
+
+/**
+ * A jabber/XMPP iq packet
+ * @class Models the XMPP notion of an 'iq' packet
+ * @extends JSJaCPacket
+ */
+function JSJaCIQ() {
+ /**
+ * @ignore
+ */
+ this.base = JSJaCPacket;
+ this.base('iq');
+}
+JSJaCIQ.prototype = new JSJaCPacket;
+
+/**
+ * Some combined method to set 'to', 'type' and 'id' at once
+ * @param {String} to the recepients JID
+ * @param {String} type A XMPP compliant iq type (one of 'set', 'get', 'result' and 'error'
+ * @param {String} id A packet ID
+ * @return this
+ * @type JSJaCIQ
+ */
+JSJaCIQ.prototype.setIQ = function(to,type,id) {
+ if (to)
+ this.setTo(to);
+ if (type)
+ this.setType(type);
+ if (id)
+ this.setID(id);
+ return this;
+};
+/**
+ * Creates a 'query' child node with given XMLNS
+ * @param {String} xmlns The namespace for the 'query' node
+ * @return The query node
+ * @type {@link http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247 Node}
+ */
+JSJaCIQ.prototype.setQuery = function(xmlns) {
+ var query;
+ try {
+ query = this.getDoc().createElementNS(xmlns,'query');
+ } catch (e) {
+ query = this.getDoc().createElement('query');
+ query.setAttribute('xmlns',xmlns);
+ }
+ this.getNode().appendChild(query);
+ return query;
+};
+
+/**
+ * Gets the 'query' node of this packet
+ * @return The query node
+ * @type {@link http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247 Node}
+ */
+JSJaCIQ.prototype.getQuery = function() {
+ return this.getNode().getElementsByTagName('query').item(0);
+};
+/**
+ * Gets the XMLNS of the query node contained within this packet
+ * @return The namespace of the query node
+ * @type String
+ */
+JSJaCIQ.prototype.getQueryXMLNS = function() {
+ if (this.getQuery()) {
+ return this.getQuery().namespaceURI || this.getQuery().getAttribute('xmlns');
+ } else {
+ return null;
+ }
+};
+
+/**
+ * Creates an IQ reply with type set to 'result'. If given appends payload to first child if IQ. Payload maybe XML as string or a DOM element (or an array of such elements as well).
+ * @param {Element} payload A payload to be appended [optional]
+ * @return An IQ reply packet
+ * @type JSJaCIQ
+ */
+JSJaCIQ.prototype.reply = function(payload) {
+ var rIQ = this.clone();
+ rIQ.setTo(this.getFrom());
+ rIQ.setFrom();
+ rIQ.setType('result');
+ if (payload) {
+ if (typeof payload == 'string')
+ rIQ.getChild().appendChild(rIQ.getDoc().loadXML(payload));
+ else if (payload.constructor == Array) {
+ var node = rIQ.getChild();
+ for (var i=0; i<payload.length; i++)
+ if(typeof payload[i] == 'string')
+ node.appendChild(rIQ.getDoc().loadXML(payload[i]));
+ else if (typeof payload[i] == 'object')
+ node.appendChild(payload[i]);
+ }
+ else if (typeof payload == 'object')
+ rIQ.getChild().appendChild(payload);
+ }
+ return rIQ;
+};
+
+/**
+ * A jabber/XMPP message packet
+ * @class Models the XMPP notion of an 'message' packet
+ * @extends JSJaCPacket
+ */
+function JSJaCMessage() {
+ /**
+ * @ignore
+ */
+ this.base = JSJaCPacket;
+ this.base('message');
+}
+JSJaCMessage.prototype = new JSJaCPacket;
+
+/**
+ * Sets the body of the message
+ * @param {String} body Your message to be sent along
+ * @return this message
+ * @type JSJaCMessage
+ */
+JSJaCMessage.prototype.setBody = function(body) {
+ this._setChildNode("body",body);
+ return this;
+};
+/**
+ * Sets the subject of the message
+ * @param {String} subject Your subject to be sent along
+ * @return this message
+ * @type JSJaCMessage
+ */
+JSJaCMessage.prototype.setSubject = function(subject) {
+ this._setChildNode("subject",subject);
+ return this;
+};
+/**
+ * Sets the 'tread' attribute for this message. This is used to identify
+ * threads in chat conversations
+ * @param {String} thread Usually a somewhat random hash.
+ * @return this message
+ * @type JSJaCMessage
+ */
+JSJaCMessage.prototype.setThread = function(thread) {
+ this._setChildNode("thread", thread);
+ return this;
+};
+/**
+ * Gets the 'thread' identifier for this message
+ * @return A thread identifier
+ * @type String
+ */
+JSJaCMessage.prototype.getThread = function() {
+ return this.getChildVal('thread');
+};
+/**
+ * Gets the body of this message
+ * @return The body of this message
+ * @type String
+ */
+JSJaCMessage.prototype.getBody = function() {
+ return this.getChildVal('body');
+};
+/**
+ * Gets the subject of this message
+ * @return The subject of this message
+ * @type String
+ */
+JSJaCMessage.prototype.getSubject = function() {
+ return this.getChildVal('subject')
+};
+
+
+/**
+ * Tries to transform a w3c DOM node to JSJaC's internal representation
+ * (JSJaCPacket type, one of JSJaCPresence, JSJaCMessage, JSJaCIQ)
+ * @param: {Node
+ * http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247}
+ * node The node to be transformed
+ * @return A JSJaCPacket representing the given node. If node's root
+ * elemenent is not one of 'message', 'presence' or 'iq',
+ * <code>null</code> is being returned.
+ * @type JSJaCPacket
+ */
+JSJaCPacket.wrapNode = function(node) {
+ var oPacket = null;
+
+ switch (node.nodeName.toLowerCase()) {
+ case 'presence':
+ oPacket = new JSJaCPresence();
+ break;
+ case 'message':
+ oPacket = new JSJaCMessage();
+ break;
+ case 'iq':
+ oPacket = new JSJaCIQ();
+ break;
+ }
+
+ if (oPacket) {
+ oPacket.getDoc().replaceChild(oPacket._importNode(node, true),
+ oPacket.getNode());
+ }
+
+ return oPacket;
+};
+
+
+
+/**
+ * an error packet for internal use
+ * @private
+ * @constructor
+ */
+function JSJaCError(code,type,condition) {
+ var xmldoc = XmlDocument.create("error","jsjac");
+
+ xmldoc.documentElement.setAttribute('code',code);
+ xmldoc.documentElement.setAttribute('type',type);
+ if (condition)
+ xmldoc.documentElement.appendChild(xmldoc.createElement(condition)).
+ setAttribute('xmlns','urn:ietf:params:xml:ns:xmpp-stanzas');
+ return xmldoc.documentElement;
+}
+
+
+
+/**
+ * Creates a new set of hash keys
+ * @class Reflects a set of sha1/md5 hash keys for securing sessions
+ * @constructor
+ * @param {Function} func The hash function to be used for creating the keys
+ * @param {Debugger} oDbg Reference to debugger implementation [optional]
+ */
+function JSJaCKeys(func,oDbg) {
+ var seed = Math.random();
+
+ /**
+ * @private
+ */
+ this._k = new Array();
+ this._k[0] = seed.toString();
+ if (oDbg)
+ /**
+ * Reference to Debugger
+ * @type Debugger
+ */
+ this.oDbg = oDbg;
+ else {
+ this.oDbg = {};
+ this.oDbg.log = function() {};
+ }
+
+ if (func) {
+ for (var i=1; i<JSJAC_NKEYS; i++) {
+ this._k[i] = func(this._k[i-1]);
+ oDbg.log(i+": "+this._k[i],4);
+ }
+ }
+
+ /**
+ * @private
+ */
+ this._indexAt = JSJAC_NKEYS-1;
+ /**
+ * Gets next key from stack
+ * @return New hash key
+ * @type String
+ */
+ this.getKey = function() {
+ return this._k[this._indexAt--];
+ };
+ /**
+ * Indicates whether there's only one key left
+ * @return <code>true</code> if there's only one key left, false otherwise
+ * @type boolean
+ */
+ this.lastKey = function() { return (this._indexAt == 0); };
+ /**
+ * Returns number of overall/initial stack size
+ * @return Number of keys created
+ * @type int
+ */
+ this.size = function() { return this._k.length; };
+
+ /**
+ * @private
+ */
+ this._getSuspendVars = function() {
+ return ('_k,_indexAt').split(',');
+ }
+}
+
+
+/**
+ * @fileoverview Contains all things in common for all subtypes of connections
+ * supported.
+ * @author Stefan Strigler steve@zeank.in-berlin.de
+ * @version $Revision$
+ */
+
+/**
+ * Creates a new Jabber connection (a connection to a jabber server)
+ * @class Somewhat abstract base class for jabber connections. Contains all
+ * of the code in common for all jabber connections
+ * @constructor
+ * @param {JSON http://www.json.org/index} oArg JSON with properties: <br>
+ * * <code>httpbase</code> the http base address of the service to be used for
+ * connecting to jabber<br>
+ * * <code>oDbg</code> (optional) a reference to a debugger interface
+ */
+function JSJaCConnection(oArg) {
+
+ if (oArg && oArg.oDbg && oArg.oDbg.log) {
+ /**
+ * Reference to debugger interface
+ * (needs to implement method <code>log</code>)
+ * @type Debugger
+ */
+ this.oDbg = oArg.oDbg;
+ } else {
+ this.oDbg = new Object(); // always initialise a debugger
+ this.oDbg.log = function() { };
+ }
+
+ if (oArg && oArg.timerval)
+ this.setPollInterval(oArg.timerval);
+ else
+ this.setPollInterval(JSJAC_TIMERVAL);
+
+ if (oArg && oArg.httpbase)
+ /**
+ * @private
+ */
+ this._httpbase = oArg.httpbase;
+
+ if (oArg &&oArg.allow_plain)
+ /**
+ * @private
+ */
+ this.allow_plain = oArg.allow_plain;
+ else
+ this.allow_plain = JSJAC_ALLOW_PLAIN;
+
+ if (oArg && oArg.cookie_prefix)
+ /**
+ * @private
+ */
+ this._cookie_prefix = oArg.cookie_prefix;
+ else
+ this._cookie_prefix = "";
+
+ /**
+ * @private
+ */
+ this._connected = false;
+ /**
+ * @private
+ */
+ this._events = new Array();
+ /**
+ * @private
+ */
+ this._keys = null;
+ /**
+ * @private
+ */
+ this._ID = 0;
+ /**
+ * @private
+ */
+ this._inQ = new Array();
+ /**
+ * @private
+ */
+ this._pQueue = new Array();
+ /**
+ * @private
+ */
+ this._regIDs = new Array();
+ /**
+ * @private
+ */
+ this._req = new Array();
+ /**
+ * @private
+ */
+ this._status = 'intialized';
+ /**
+ * @private
+ */
+ this._errcnt = 0;
+ /**
+ * @private
+ */
+ this._inactivity = JSJAC_INACTIVITY;
+ /**
+ * @private
+ */
+ this._sendRawCallbacks = new Array();
+}
+
+// Generates an ID
+var STANZA_ID = 1;
+
+function genID() {
+ return STANZA_ID++;
+}
+
+JSJaCConnection.prototype.connect = function(oArg) {
+ this._setStatus('connecting');
+
+ this.domain = oArg.domain || 'localhost';
+ this.username = oArg.username;
+ this.resource = oArg.resource;
+ this.pass = oArg.pass;
+ this.register = oArg.register;
+
+ this.authhost = oArg.authhost || this.domain;
+ this.authtype = oArg.authtype || 'sasl';
+
+ if (oArg.xmllang && oArg.xmllang != '')
+ this._xmllang = oArg.xmllang;
+ else
+ this._xmllang = 'en';
+
+ this.host = oArg.host || this.domain;
+ this.port = oArg.port || 5222;
+ if (oArg.secure)
+ this.secure = 'true';
+ else
+ this.secure = 'false';
+
+ if (oArg.wait)
+ this._wait = oArg.wait;
+
+ this.jid = this.username + '@' + this.domain;
+ this.fulljid = this.jid + '/' + this.resource;
+
+ this._rid = Math.round( 100000.5 + ( ( (900000.49999) - (100000.5) ) * Math.random() ) );
+
+ // setupRequest must be done after rid is created but before first use in reqstr
+ var slot = this._getFreeSlot();
+ this._req[slot] = this._setupRequest(true);
+
+ var reqstr = this._getInitialRequestString();
+
+ this.oDbg.log(reqstr,4);
+
+ this._req[slot].r.onreadystatechange =
+ JSJaC.bind(function() {
+ var r = this._req[slot].r;
+ if (r.readyState == 4) {
+ this.oDbg.log("async recv: "+r.responseText,4);
+ this._handleInitialResponse(r); // handle response
+ }
+ }, this);
+
+ if (typeof(this._req[slot].r.onerror) != 'undefined') {
+ this._req[slot].r.onerror =
+ JSJaC.bind(function(e) {
+ this.oDbg.log('XmlHttpRequest error',1);
+ return false;
+ }, this);
+ }
+
+ this._req[slot].r.send(reqstr);
+};
+
+/**
+ * Tells whether this connection is connected
+ * @return <code>true</code> if this connections is connected,
+ * <code>false</code> otherwise
+ * @type boolean
+ */
+JSJaCConnection.prototype.connected = function() { return this._connected; };
+
+/**
+ * Disconnects from jabber server and terminates session (if applicable)
+ */
+JSJaCConnection.prototype.disconnect = function() {
+ this._setStatus('disconnecting');
+
+ if (!this.connected())
+ return;
+ this._connected = false;
+
+ clearInterval(this._interval);
+ clearInterval(this._inQto);
+
+ if (this._timeout)
+ clearTimeout(this._timeout); // remove timer
+
+ var slot = this._getFreeSlot();
+ // Intentionally synchronous
+ this._req[slot] = this._setupRequest(false);
+
+ request = this._getRequestString(false, true);
+
+ this.oDbg.log("Disconnecting: " + request,4);
+ this._req[slot].r.send(request);
+
+ try {
+ removeDB('jsjac', 'state');
+ } catch (e) {}
+
+ this.oDbg.log("Disconnected: "+this._req[slot].r.responseText,2);
+ this._handleEvent('ondisconnect');
+};
+
+/**
+ * Gets current value of polling interval
+ * @return Polling interval in milliseconds
+ * @type int
+ */
+JSJaCConnection.prototype.getPollInterval = function() {
+ return this._timerval;
+};
+
+/**
+ * Registers an event handler (callback) for this connection.
+
+ * <p>Note: All of the packet handlers for specific packets (like
+ * message_in, presence_in and iq_in) fire only if there's no
+ * callback associated with the id.<br>
+
+ * <p>Example:<br/>
+ * <code>con.registerHandler('iq', 'query', 'jabber:iq:version', handleIqVersion);</code>
+
+
+ * @param {String} event One of
+
+ * <ul>
+ * <li>onConnect - connection has been established and authenticated</li>
+ * <li>onDisconnect - connection has been disconnected</li>
+ * <li>onResume - connection has been resumed</li>
+
+ * <li>onStatusChanged - connection status has changed, current
+ * status as being passed argument to handler. See {@link #status}.</li>
+
+ * <li>onError - an error has occured, error node is supplied as
+ * argument, like this:<br><code><error code='404' type='cancel'><br>
+ * <item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/><br>
+ * </error></code></li>
+
+ * <li>packet_in - a packet has been received (argument: the
+ * packet)</li>
+
+ * <li>packet_out - a packet is to be sent(argument: the
+ * packet)</li>
+
+ * <li>message_in | message - a message has been received (argument:
+ * the packet)</li>
+
+ * <li>message_out - a message packet is to be sent (argument: the
+ * packet)</li>
+
+ * <li>presence_in | presence - a presence has been received
+ * (argument: the packet)</li>
+
+ * <li>presence_out - a presence packet is to be sent (argument: the
+ * packet)</li>
+
+ * <li>iq_in | iq - an iq has been received (argument: the packet)</li>
+ * <li>iq_out - an iq is to be sent (argument: the packet)</li>
+ * </ul>
+
+ * @param {String} childName A childnode's name that must occur within a
+ * retrieved packet [optional]
+
+ * @param {String} childNS A childnode's namespace that must occure within
+ * a retrieved packet (works only if childName is given) [optional]
+
+ * @param {String} type The type of the packet to handle (works only if childName and chidNS are given (both may be set to '*' in order to get skipped) [optional]
+
+ * @param {Function} handler The handler to be called when event occurs. If your handler returns 'true' it cancels bubbling of the event. No other registered handlers for this event will be fired.
+ */
+JSJaCConnection.prototype.registerHandler = function(event) {
+ event = event.toLowerCase(); // don't be case-sensitive here
+ var eArg = {handler: arguments[arguments.length-1],
+ childName: '*',
+ childNS: '*',
+ type: '*'};
+ if (arguments.length > 2)
+ eArg.childName = arguments[1];
+ if (arguments.length > 3)
+ eArg.childNS = arguments[2];
+ if (arguments.length > 4)
+ eArg.type = arguments[3];
+ if (!this._events[event])
+ this._events[event] = new Array(eArg);
+ else
+ this._events[event] = this._events[event].concat(eArg);
+
+ // sort events in order how specific they match criterias thus using
+ // wildcard patterns puts them back in queue when it comes to
+ // bubbling the event
+ this._events[event] =
+ this._events[event].sort(function(a,b) {
+ var aRank = 0;
+ var bRank = 0;
+ with (a) {
+ if (type == '*')
+ aRank++;
+ if (childNS == '*')
+ aRank++;
+ if (childName == '*')
+ aRank++;
+ }
+ with (b) {
+ if (type == '*')
+ bRank++;
+ if (childNS == '*')
+ bRank++;
+ if (childName == '*')
+ bRank++;
+ }
+ if (aRank > bRank)
+ return 1;
+ if (aRank < bRank)
+ return -1;
+ return 0;
+ });
+ this.oDbg.log("registered handler for event '"+event+"'",2);
+};
+
+JSJaCConnection.prototype.unregisterHandler = function(event,handler) {
+ event = event.toLowerCase(); // don't be case-sensitive here
+
+ if (!this._events[event])
+ return;
+
+ var arr = this._events[event], res = new Array();
+ for (var i=0; i<arr.length; i++)
+ if (arr[i].handler != handler)
+ res.push(arr[i]);
+
+ if (arr.length != res.length) {
+ this._events[event] = res;
+ this.oDbg.log("unregistered handler for event '"+event+"'",2);
+ }
+};
+
+/**
+ * Register for iq packets of type 'get'.
+ * @param {String} childName A childnode's name that must occur within a
+ * retrieved packet
+
+ * @param {String} childNS A childnode's namespace that must occure within
+ * a retrieved packet (works only if childName is given)
+
+ * @param {Function} handler The handler to be called when event occurs. If your handler returns 'true' it cancels bubbling of the event. No other registered handlers for this event will be fired.
+ */
+JSJaCConnection.prototype.registerIQGet = function(childName, childNS, handler) {
+ this.registerHandler('iq', childName, childNS, 'get', handler);
+};
+
+/**
+ * Register for iq packets of type 'set'.
+ * @param {String} childName A childnode's name that must occur within a
+ * retrieved packet
+
+ * @param {String} childNS A childnode's namespace that must occure within
+ * a retrieved packet (works only if childName is given)
+
+ * @param {Function} handler The handler to be called when event occurs. If your handler returns 'true' it cancels bubbling of the event. No other registered handlers for this event will be fired.
+ */
+JSJaCConnection.prototype.registerIQSet = function(childName, childNS, handler) {
+ this.registerHandler('iq', childName, childNS, 'set', handler);
+};
+
+/**
+ * Resumes this connection from saved state (cookie)
+ * @return Whether resume was successful
+ * @type boolean
+ */
+JSJaCConnection.prototype.resume = function() {
+ try {
+ var json = getDB('jsjac', 'state');
+ this.oDbg.log('read cookie: '+json,2);
+ removeDB('jsjac', 'state');
+
+ return this.resumeFromData(JSJaCJSON.parse(json));
+ } catch (e) {}
+ return false; // sth went wrong
+};
+
+/**
+ * Resumes BOSH connection from data
+ * @param {Object} serialized jsjac state information
+ * @return Whether resume was successful
+ * @type boolean
+ */
+JSJaCConnection.prototype.resumeFromData = function(data) {
+ try {
+ this._setStatus('resuming');
+
+ for (var i in data)
+ if (data.hasOwnProperty(i))
+ this[i] = data[i];
+
+ // copy keys - not being very generic here :-/
+ if (this._keys) {
+ this._keys2 = new JSJaCKeys();
+ var u = this._keys2._getSuspendVars();
+ for (var i=0; i<u.length; i++)
+ this._keys2[u[i]] = this._keys[u[i]];
+ this._keys = this._keys2;
+ }
+
+ if (this._connected) {
+ // don't poll too fast!
+ this._handleEvent('onresume');
+ setTimeout(JSJaC.bind(this._resume, this),this.getPollInterval());
+ this._interval = setInterval(JSJaC.bind(this._checkQueue, this),
+ JSJAC_CHECKQUEUEINTERVAL);
+ this._inQto = setInterval(JSJaC.bind(this._checkInQ, this),
+ JSJAC_CHECKINQUEUEINTERVAL);
+ }
+
+ return (this._connected === true);
+ } catch (e) {
+ if (e.message)
+ this.oDbg.log("Resume failed: "+e.message, 1);
+ else
+ this.oDbg.log("Resume failed: "+e, 1);
+ return false;
+ }
+};
+
+/**
+ * Sends a JSJaCPacket
+ * @param {JSJaCPacket} packet The packet to send
+ * @param {Function} cb The callback to be called if there's a reply
+ * to this packet (identified by id) [optional]
+ * @param {Object} arg Arguments passed to the callback
+ * (additionally to the packet received) [optional]
+ * @return 'true' if sending was successfull, 'false' otherwise
+ * @type boolean
+ */
+JSJaCConnection.prototype.send = function(packet,cb,arg) {
+ if (!packet || !packet.pType) {
+ this.oDbg.log("no packet: "+packet, 1);
+ return false;
+ }
+
+ if (!this.connected())
+ return false;
+
+ // generate an ID for the packet
+ if (!packet.getID())
+ packet.setID(genID());
+
+ // packet xml:lang
+ if (!packet.getXMLLang())
+ packet.setXMLLang(XML_LANG);
+
+ // remember id for response if callback present
+ if (cb)
+ this._registerPID(packet.getID(),cb,arg);
+
+ try {
+ this._handleEvent(packet.pType()+'_out', packet);
+ this._handleEvent("packet_out", packet);
+ this._pQueue = this._pQueue.concat(packet.xml());
+ } catch (e) {
+ this.oDbg.log(e.toString(),1);
+ return false;
+ }
+
+ return true;
+};
+
+/**
+ * Sends an IQ packet. Has default handlers for each reply type.
+ * Those maybe overriden by passing an appropriate handler.
+ * @param {JSJaCIQPacket} iq - the iq packet to send
+ * @param {Object} handlers - object with properties 'error_handler',
+ * 'result_handler' and 'default_handler'
+ * with appropriate functions
+ * @param {Object} arg - argument to handlers
+ * @return 'true' if sending was successfull, 'false' otherwise
+ * @type boolean
+ */
+JSJaCConnection.prototype.sendIQ = function(iq, handlers, arg) {
+ if (!iq || iq.pType() != 'iq') {
+ return false;
+ }
+
+ handlers = handlers || {};
+ var error_handler = handlers.error_handler || JSJaC.bind(function(aIq) {
+ this.oDbg.log(aIq.xml(), 1);
+ }, this);
+
+ var result_handler = handlers.result_handler || JSJaC.bind(function(aIq) {
+ this.oDbg.log(aIq.xml(), 2);
+ }, this);
+
+ var iqHandler = function(aIq, arg) {
+ switch (aIq.getType()) {
+ case 'error':
+ error_handler(aIq);
+ break;
+ case 'result':
+ result_handler(aIq, arg);
+ break;
+ }
+ };
+ return this.send(iq, iqHandler, arg);
+};
+
+/**
+ * Sets polling interval for this connection
+ * @param {int} millisecs Milliseconds to set timer to
+ * @return effective interval this connection has been set to
+ * @type int
+ */
+JSJaCConnection.prototype.setPollInterval = function(timerval) {
+ if (timerval && !isNaN(timerval))
+ this._timerval = timerval;
+ return this._timerval;
+};
+
+/**
+ * Returns current status of this connection
+ * @return String to denote current state. One of
+ * <ul>
+ * <li>'initializing' ... well
+ * <li>'connecting' if connect() was called
+ * <li>'resuming' if resume() was called
+ * <li>'processing' if it's about to operate as normal
+ * <li>'onerror_fallback' if there was an error with the request object
+ * <li>'protoerror_fallback' if there was an error at the http binding protocol flow (most likely that's where you interested in)
+ * <li>'internal_server_error' in case of an internal server error
+ * <li>'suspending' if suspend() is being called
+ * <li>'aborted' if abort() was called
+ * <li>'disconnecting' if disconnect() has been called
+ * </ul>
+ * @type String
+ */
+JSJaCConnection.prototype.status = function() { return this._status; };
+
+/**
+ * Suspends this connection (saving state for later resume)
+ * Saves state to cookie
+ * @return Whether suspend (saving to cookie) was successful
+ * @type boolean
+ */
+JSJaCConnection.prototype.suspend = function(has_pause) {
+ var data = this.suspendToData(has_pause);
+
+ try {
+ var c = setDB('jsjac', 'state', JSJaCJSON.toString(data));
+ return c;
+ } catch (e) {
+ this.oDbg.log("Failed creating cookie '"+this._cookie_prefix+
+ "JSJaC_State': "+e.message,1);
+ }
+ return false;
+};
+
+/**
+ * Suspend connection and return serialized JSJaC connection state
+ * @return JSJaC connection state object
+ * @type Object
+ */
+JSJaCConnection.prototype.suspendToData = function(has_pause) {
+
+ // remove timers
+ if(has_pause) {
+ clearTimeout(this._timeout);
+ clearInterval(this._interval);
+ clearInterval(this._inQto);
+
+ this._suspend();
+ }
+
+ var u = ('_connected,_keys,_ID,_inQ,_pQueue,_regIDs,_errcnt,_inactivity,domain,username,resource,jid,fulljid,_sid,_httpbase,_timerval,_is_polling').split(',');
+ u = u.concat(this._getSuspendVars());
+ var s = new Object();
+
+ for (var i=0; i<u.length; i++) {
+ if (!this[u[i]]) continue; // hu? skip these!
+ if (this[u[i]]._getSuspendVars) {
+ var uo = this[u[i]]._getSuspendVars();
+ var o = new Object();
+ for (var j=0; j<uo.length; j++)
+ o[uo[j]] = this[u[i]][uo[j]];
+ } else
+ var o = this[u[i]];
+
+ s[u[i]] = o;
+ }
+
+ if(has_pause) {
+ this._connected = false;
+ this._setStatus('suspending');
+ }
+
+ return s;
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._abort = function() {
+ clearTimeout(this._timeout); // remove timer
+
+ clearInterval(this._inQto);
+ clearInterval(this._interval);
+
+ this._connected = false;
+
+ this._setStatus('aborted');
+
+ this.oDbg.log("Disconnected.",1);
+ this._handleEvent('ondisconnect');
+ this._handleEvent('onerror',
+ JSJaCError('500','cancel','service-unavailable'));
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._checkInQ = function() {
+ for (var i=0; i<this._inQ.length && i<10; i++) {
+ var item = this._inQ[0];
+ this._inQ = this._inQ.slice(1,this._inQ.length);
+ var packet = JSJaCPacket.wrapNode(item);
+
+ if (!packet)
+ return;
+
+ this._handleEvent("packet_in", packet);
+
+ if (packet.pType && !this._handlePID(packet)) {
+ this._handleEvent(packet.pType()+'_in',packet);
+ this._handleEvent(packet.pType(),packet);
+ }
+ }
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._checkQueue = function() {
+ if (this._pQueue.length != 0)
+ this._process();
+ return true;
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._doAuth = function() {
+ if (this.has_sasl && this.authtype == 'nonsasl')
+ this.oDbg.log("Warning: SASL present but not used", 1);
+
+ if (!this._doSASLAuth() &&
+ !this._doLegacyAuth()) {
+ this.oDbg.log("Auth failed for authtype "+this.authtype,1);
+ this.disconnect();
+ return false;
+ }
+ return true;
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._doInBandReg = function() {
+ if (this.authtype == 'saslanon' || this.authtype == 'anonymous')
+ return; // bullshit - no need to register if anonymous
+
+ /* ***
+ * In-Band Registration see JEP-0077
+ */
+
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+ iq.setID('reg1');
+ iq.appendNode("query", {xmlns: "jabber:iq:register"},
+ [["username", this.username],
+ ["password", this.pass]]);
+
+ this.send(iq,this._doInBandRegDone);
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._doInBandRegDone = function(iq) {
+ if (iq && iq.getType() == 'error') { // we failed to register
+ this.oDbg.log("registration failed for "+this.username,0);
+ this._handleEvent('onerror',iq.getChild('error'));
+ return;
+ }
+
+ this.oDbg.log(this.username + " registered succesfully",0);
+
+ this._doAuth();
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._doLegacyAuth = function() {
+ if (this.authtype != 'nonsasl' && this.authtype != 'anonymous')
+ return false;
+
+ /* ***
+ * Non-SASL Authentication as described in JEP-0078
+ */
+ var iq = new JSJaCIQ();
+ iq.setIQ(null,'get','auth1');
+ iq.appendNode('query', {xmlns: 'jabber:iq:auth'},
+ [['username', this.username]]);
+
+ this.send(iq,this._doLegacyAuth2);
+ return true;
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._doLegacyAuth2 = function(iq) {
+ if (!iq || iq.getType() != 'result') {
+ if (iq && iq.getType() == 'error')
+ this._handleEvent('onerror',iq.getChild('error'));
+ this.disconnect();
+ return;
+ }
+
+ var use_digest = (iq.getChild('digest') != null);
+
+ /* ***
+ * Send authentication
+ */
+ var iq = new JSJaCIQ();
+ iq.setIQ(null,'set','auth2');
+
+ query = iq.appendNode('query', {xmlns: 'jabber:iq:auth'},
+ [['username', this.username],
+ ['resource', this.resource]]);
+
+ if (use_digest) { // digest login
+ query.appendChild(iq.buildNode('digest', {xmlns: 'jabber:iq:auth'},
+ hex_sha1(this.streamid + this.pass)));
+ } else if (this.allow_plain) { // use plaintext auth
+ query.appendChild(iq.buildNode('password', {xmlns: 'jabber:iq:auth'},
+ this.pass));
+ } else {
+ this.oDbg.log("no valid login mechanism found",1);
+ this.disconnect();
+ return false;
+ }
+
+ this.send(iq,this._doLegacyAuthDone);
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._doLegacyAuthDone = function(iq) {
+ if (iq.getType() != 'result') { // auth' failed
+ if (iq.getType() == 'error')
+ this._handleEvent('onerror',iq.getChild('error'));
+ this.disconnect();
+ } else
+ this._handleEvent('onconnect');
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._doSASLAuth = function() {
+ if (this.authtype == 'nonsasl' || this.authtype == 'anonymous')
+ return false;
+
+ if (this.authtype == 'saslanon') {
+ if (this.mechs['ANONYMOUS']) {
+ this.oDbg.log("SASL using mechanism 'ANONYMOUS'",2);
+ return this._sendRaw("<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='ANONYMOUS'/>",
+ this._doSASLAuthDone);
+ }
+ this.oDbg.log("SASL ANONYMOUS requested but not supported",1);
+ } else {
+ if (this.mechs['DIGEST-MD5']) {
+ this.oDbg.log("SASL using mechanism 'DIGEST-MD5'",2);
+ return this._sendRaw("<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='DIGEST-MD5'/>",
+ this._doSASLAuthDigestMd5S1);
+ } else if (this.allow_plain && this.mechs['PLAIN']) {
+ this.oDbg.log("SASL using mechanism 'PLAIN'",2);
+ var authStr = this.username+'@'+
+ this.domain+String.fromCharCode(0)+
+ this.username+String.fromCharCode(0)+
+ this.pass;
+ this.oDbg.log("authenticating with '"+authStr+"'",2);
+ authStr = b64encode(authStr);
+ return this._sendRaw("<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>"+authStr+"</auth>",
+ this._doSASLAuthDone);
+ }
+ this.oDbg.log("No SASL mechanism applied",1);
+ this.authtype = 'nonsasl'; // fallback
+ }
+ return false;
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._doSASLAuthDigestMd5S1 = function(el) {
+ if (el.nodeName != "challenge") {
+ this.oDbg.log("challenge missing",1);
+ this._handleEvent('onerror',JSJaCError('401','auth','not-authorized'));
+ this.disconnect();
+ } else {
+ var challenge = b64decode(el.firstChild.nodeValue);
+ this.oDbg.log("got challenge: "+challenge,2);
+ this._nonce = challenge.substring(challenge.indexOf("nonce=")+7);
+ this._nonce = this._nonce.substring(0,this._nonce.indexOf("\""));
+ this.oDbg.log("nonce: "+this._nonce,2);
+ if (this._nonce == '' || this._nonce.indexOf('\"') != -1) {
+ this.oDbg.log("nonce not valid, aborting",1);
+ this.disconnect();
+ return;
+ }
+
+ this._digest_uri = "xmpp/";
+ // if (typeof(this.host) != 'undefined' && this.host != '') {
+ // this._digest-uri += this.host;
+ // if (typeof(this.port) != 'undefined' && this.port)
+ // this._digest-uri += ":" + this.port;
+ // this._digest-uri += '/';
+ // }
+ this._digest_uri += this.domain;
+
+ this._cnonce = cnonce(14);
+
+ this._nc = '00000001';
+
+ var A1 = str_md5(this.username+':'+this.domain+':'+this.pass)+
+ ':'+this._nonce+':'+this._cnonce;
+
+ var A2 = 'AUTHENTICATE:'+this._digest_uri;
+
+ var response = hex_md5(hex_md5(A1)+':'+this._nonce+':'+this._nc+':'+
+ this._cnonce+':auth:'+hex_md5(A2));
+
+ var rPlain = 'username="'+this.username+'",realm="'+this.domain+
+ '",nonce="'+this._nonce+'",cnonce="'+this._cnonce+'",nc="'+this._nc+
+ '",qop=auth,digest-uri="'+this._digest_uri+'",response="'+response+
+ '",charset="utf-8"';
+
+ this.oDbg.log("response: "+rPlain,2);
+
+ this._sendRaw("<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>"+
+ b64encode(rPlain)+"</response>",
+ this._doSASLAuthDigestMd5S2);
+ }
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._doSASLAuthDigestMd5S2 = function(el) {
+ if (el.nodeName == 'failure') {
+ if (el.xml)
+ this.oDbg.log("auth error: "+el.xml,1);
+ else
+ this.oDbg.log("auth error",1);
+ this._handleEvent('onerror',JSJaCError('401','auth','not-authorized'));
+ this.disconnect();
+ return;
+ }
+
+ var response = b64decode(el.firstChild.nodeValue);
+ this.oDbg.log("response: "+response,2);
+
+ var rspauth = response.substring(response.indexOf("rspauth=")+8);
+ this.oDbg.log("rspauth: "+rspauth,2);
+
+ var A1 = str_md5(this.username+':'+this.domain+':'+this.pass)+
+ ':'+this._nonce+':'+this._cnonce;
+
+ var A2 = ':'+this._digest_uri;
+
+ var rsptest = hex_md5(hex_md5(A1)+':'+this._nonce+':'+this._nc+':'+
+ this._cnonce+':auth:'+hex_md5(A2));
+ this.oDbg.log("rsptest: "+rsptest,2);
+
+ if (rsptest != rspauth) {
+ this.oDbg.log("SASL Digest-MD5: server repsonse with wrong rspauth",1);
+ this.disconnect();
+ return;
+ }
+
+ if (el.nodeName == 'success') {
+ this._reInitStream(JSJaC.bind(this._doStreamBind, this));
+ } else { // some extra turn
+ this._sendRaw("<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>",
+ this._doSASLAuthDone);
+ }
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._doSASLAuthDone = function (el) {
+ if (el.nodeName != 'success') {
+ this.oDbg.log("auth failed",1);
+ this._handleEvent('onerror',JSJaCError('401','auth','not-authorized'));
+ this.disconnect();
+ } else {
+ this._reInitStream(JSJaC.bind(this._doStreamBind, this));
+ }
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._doStreamBind = function() {
+ var iq = new JSJaCIQ();
+ iq.setIQ(null,'set','bind_1');
+ iq.appendNode("bind", {xmlns: "urn:ietf:params:xml:ns:xmpp-bind"},
+ [["resource", this.resource]]);
+ this.oDbg.log(iq.xml());
+ this.send(iq,this._doXMPPSess);
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._doXMPPSess = function(iq) {
+ if (iq.getType() != 'result' || iq.getType() == 'error') { // failed
+ this.disconnect();
+ if (iq.getType() == 'error')
+ this._handleEvent('onerror',iq.getChild('error'));
+ return;
+ }
+
+ this.fulljid = iq.getChildVal("jid");
+ this.jid = this.fulljid.substring(0,this.fulljid.lastIndexOf('/'));
+
+ iq = new JSJaCIQ();
+ iq.setIQ(null,'set','sess_1');
+ iq.appendNode("session", {xmlns: "urn:ietf:params:xml:ns:xmpp-session"},
+ []);
+ this.oDbg.log(iq.xml());
+ this.send(iq,this._doXMPPSessDone);
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._doXMPPSessDone = function(iq) {
+ if (iq.getType() != 'result' || iq.getType() == 'error') { // failed
+ this.disconnect();
+ if (iq.getType() == 'error')
+ this._handleEvent('onerror',iq.getChild('error'));
+ return;
+ } else
+ this._handleEvent('onconnect');
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._handleEvent = function(event,arg) {
+ event = event.toLowerCase(); // don't be case-sensitive here
+ this.oDbg.log("incoming event '"+event+"'",3);
+ if (!this._events[event])
+ return;
+ this.oDbg.log("handling event '"+event+"'",2);
+ for (var i=0;i<this._events[event].length; i++) {
+ var aEvent = this._events[event][i];
+ if (typeof aEvent.handler == 'function') {
+ try {
+ if (arg) {
+ if (arg.pType) { // it's a packet
+ if ((!arg.getNode().hasChildNodes() && aEvent.childName != '*') ||
+ (arg.getNode().hasChildNodes() &&
+ !arg.getChild(aEvent.childName, aEvent.childNS)))
+ continue;
+ if (aEvent.type != '*' &&
+ arg.getType() != aEvent.type)
+ continue;
+ this.oDbg.log(aEvent.childName+"/"+aEvent.childNS+"/"+aEvent.type+" => match for handler "+aEvent.handler,3);
+ }
+ if (aEvent.handler(arg)) {
+ // handled!
+ break;
+ }
+ }
+ else
+ if (aEvent.handler()) {
+ // handled!
+ break;
+ }
+ } catch (e) {
+
+ if (e.fileName&&e.lineNumber) {
+ this.oDbg.log(aEvent.handler+"\n>>>"+e.name+": "+ e.message+' in '+e.fileName+' line '+e.lineNumber,1);
+ } else {
+ this.oDbg.log(aEvent.handler+"\n>>>"+e.name+": "+ e.message,1);
+ }
+
+ }
+ }
+ }
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._handlePID = function(aJSJaCPacket) {
+ if (!aJSJaCPacket.getID())
+ return false;
+ for (var i in this._regIDs) {
+ if (this._regIDs.hasOwnProperty(i) &&
+ this._regIDs[i] && i == aJSJaCPacket.getID()) {
+ var pID = aJSJaCPacket.getID();
+ this.oDbg.log("handling "+pID,3);
+ try {
+ if (this._regIDs[i].cb.call(this, aJSJaCPacket, this._regIDs[i].arg) === false) {
+ // don't unregister
+ return false;
+ } else {
+ this._unregisterPID(pID);
+ return true;
+ }
+ } catch (e) {
+ // broken handler?
+ this.oDbg.log(e.name+": "+ e.message, 1);
+ this._unregisterPID(pID);
+ return true;
+ }
+ }
+ }
+ return false;
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._handleResponse = function(req) {
+ var rootEl = this._parseResponse(req);
+
+ if (!rootEl)
+ return;
+
+ for (var i=0; i<rootEl.childNodes.length; i++) {
+ if (this._sendRawCallbacks.length) {
+ var cb = this._sendRawCallbacks[0];
+ this._sendRawCallbacks = this._sendRawCallbacks.slice(1, this._sendRawCallbacks.length);
+ cb.fn.call(this, rootEl.childNodes.item(i), cb.arg);
+ continue;
+ }
+ this._inQ = this._inQ.concat(rootEl.childNodes.item(i));
+ }
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._parseStreamFeatures = function(doc) {
+ if (!doc) {
+ this.oDbg.log("nothing to parse ... aborting",1);
+ return false;
+ }
+
+ var errorTag;
+ if (doc.getElementsByTagNameNS) {
+ errorTag = doc.getElementsByTagNameNS("http://etherx.jabber.org/streams", "error").item(0);
+ } else {
+ var errors = doc.getElementsByTagName("error");
+ for (var i=0; i<errors.length; i++)
+ if (errors.item(i).namespaceURI == "http://etherx.jabber.org/streams" ||
+ errors.item(i).getAttribute('xmlns') == "http://etherx.jabber.org/streams") {
+ errorTag = errors.item(i);
+ break;
+ }
+ }
+
+ if (errorTag) {
+ this._setStatus("internal_server_error");
+ clearTimeout(this._timeout); // remove timer
+ clearInterval(this._interval);
+ clearInterval(this._inQto);
+ this._handleEvent('onerror',JSJaCError('503','cancel','session-terminate'));
+ this._connected = false;
+ this.oDbg.log("Disconnected.",1);
+ this._handleEvent('ondisconnect');
+ return false;
+ }
+
+ this.mechs = new Object();
+ var lMec1 = doc.getElementsByTagName("mechanisms");
+ this.has_sasl = false;
+ for (var i=0; i<lMec1.length; i++)
+ if (lMec1.item(i).getAttribute("xmlns") ==
+ "urn:ietf:params:xml:ns:xmpp-sasl") {
+ this.has_sasl=true;
+ var lMec2 = lMec1.item(i).getElementsByTagName("mechanism");
+ for (var j=0; j<lMec2.length; j++)
+ this.mechs[lMec2.item(j).firstChild.nodeValue] = true;
+ break;
+ }
+ if (this.has_sasl)
+ this.oDbg.log("SASL detected",2);
+ else {
+ this.oDbg.log("No support for SASL detected",2);
+ return false;
+ }
+
+ // Get the server CAPS (if available)
+ this.server_caps=null;
+ var sCaps = doc.getElementsByTagName("c");
+ for (var i=0; i<sCaps.length; i++) {
+ var c_sCaps=sCaps.item(i);
+ var x_sCaps=c_sCaps.getAttribute("xmlns");
+ var v_sCaps=c_sCaps.getAttribute("ver");
+
+ if ((x_sCaps == NS_CAPS) && v_sCaps) {
+ this.server_caps=v_sCaps;
+ break;
+ }
+ }
+
+ return true;
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._process = function(timerval) {
+ if (!this.connected()) {
+ this.oDbg.log("Connection lost ...",1);
+ if (this._interval)
+ clearInterval(this._interval);
+ return;
+ }
+
+ this.setPollInterval(timerval);
+
+ if (this._timeout)
+ clearTimeout(this._timeout);
+
+ var slot = this._getFreeSlot();
+
+ if (slot < 0)
+ return;
+
+ if (typeof(this._req[slot]) != 'undefined' &&
+ typeof(this._req[slot].r) != 'undefined' &&
+ this._req[slot].r.readyState != 4) {
+ this.oDbg.log("Slot "+slot+" is not ready");
+ return;
+ }
+
+ if (!this.isPolling() && this._pQueue.length == 0 &&
+ this._req[(slot+1)%2] && this._req[(slot+1)%2].r.readyState != 4) {
+ this.oDbg.log("all slots busy, standby ...", 2);
+ return;
+ }
+
+ if (!this.isPolling())
+ this.oDbg.log("Found working slot at "+slot,2);
+
+ this._req[slot] = this._setupRequest(true);
+
+ /* setup onload handler for async send */
+ this._req[slot].r.onreadystatechange =
+ JSJaC.bind(function() {
+ if (this._req[slot].r.readyState == 4) {
+ this._setStatus('processing');
+ this.oDbg.log("async recv: "+this._req[slot].r.responseText,4);
+ this._handleResponse(this._req[slot]);
+
+ if (!this.connected())
+ return;
+
+ // schedule next tick
+ if (this._pQueue.length) {
+ this._timeout = setTimeout(JSJaC.bind(this._process, this),100);
+ } else {
+ this.oDbg.log("scheduling next poll in "+this.getPollInterval()+
+ " msec", 4);
+ this._timeout = setTimeout(JSJaC.bind(this._process, this),this.getPollInterval());
+ }
+ }
+ }, this);
+
+ try {
+ this._req[slot].r.onerror =
+ JSJaC.bind(function() {
+ if (!this.connected())
+ return;
+ this._errcnt++;
+ this.oDbg.log('XmlHttpRequest error ('+this._errcnt+')',1);
+ if (this._errcnt > JSJAC_ERR_COUNT) {
+ // abort
+ this._abort();
+ return false;
+ }
+
+ this._setStatus('onerror_fallback');
+
+ // schedule next tick
+ setTimeout(JSJaC.bind(this._resume, this),this.getPollInterval());
+ return false;
+ }, this);
+ } catch(e) { } // well ... no onerror property available, maybe we
+ // can catch the error somewhere else ...
+
+ var reqstr = this._getRequestString();
+
+ if (typeof(this._rid) != 'undefined') // remember request id if any
+ this._req[slot].rid = this._rid;
+
+ this.oDbg.log("sending: " + reqstr,4);
+ this._req[slot].r.send(reqstr);
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._registerPID = function(pID,cb,arg) {
+ if (!pID || !cb)
+ return false;
+ this._regIDs[pID] = new Object();
+ this._regIDs[pID].cb = cb;
+ if (arg)
+ this._regIDs[pID].arg = arg;
+ this.oDbg.log("registered "+pID,3);
+ return true;
+};
+
+/**
+ * partial function binding sendEmpty to callback
+ * @private
+ */
+JSJaCConnection.prototype._prepSendEmpty = function(cb, ctx) {
+ return function() {
+ ctx._sendEmpty(JSJaC.bind(cb, ctx));
+ };
+};
+
+/**
+ * send empty request
+ * waiting for stream id to be able to proceed with authentication
+ * @private
+ */
+JSJaCConnection.prototype._sendEmpty = function(cb) {
+ var slot = this._getFreeSlot();
+ this._req[slot] = this._setupRequest(true);
+
+ this._req[slot].r.onreadystatechange =
+ JSJaC.bind(function() {
+ if (this._req[slot].r.readyState == 4) {
+ this.oDbg.log("async recv: "+this._req[slot].r.responseText,4);
+ cb(this._req[slot].r); // handle response
+ }
+ },this);
+
+ if (typeof(this._req[slot].r.onerror) != 'undefined') {
+ this._req[slot].r.onerror =
+ JSJaC.bind(function(e) {
+ this.oDbg.log('XmlHttpRequest error',1);
+ return false;
+ }, this);
+ }
+
+ var reqstr = this._getRequestString();
+ this.oDbg.log("sending: " + reqstr,4);
+ this._req[slot].r.send(reqstr);
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._sendRaw = function(xml,cb,arg) {
+ if (cb)
+ this._sendRawCallbacks.push({fn: cb, arg: arg});
+
+ this._pQueue.push(xml);
+ this._process();
+
+ return true;
+};
+
+/**
+ * @private
+ */
+JSJaCConnection.prototype._setStatus = function(status) {
+ if (!status || status == '')
+ return;
+ if (status != this._status) { // status changed!
+ this._status = status;
+ this._handleEvent('onstatuschanged', status);
+ this._handleEvent('status_changed', 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
+ * @author Stefan Strigler steve@zeank.in-berlin.de
+ * @version $Revision$
+ */
+
+/**
+ * Instantiates an HTTP Binding session
+ * @class Implementation of {@link
+ * http://www.xmpp.org/extensions/xep-0206.html XMPP Over BOSH}
+ * formerly known as HTTP Binding.
+ * @extends JSJaCConnection
+ * @constructor
+ */
+function JSJaCHttpBindingConnection(oArg) {
+ /**
+ * @ignore
+ */
+ this.base = JSJaCConnection;
+ this.base(oArg);
+
+ // member vars
+ /**
+ * @private
+ */
+ this._hold = JSJACHBC_MAX_HOLD;
+ /**
+ * @private
+ */
+ this._inactivity = 0;
+ /**
+ * @private
+ */
+ this._last_requests = new Object(); // 'hash' storing hold+1 last requests
+ /**
+ * @private
+ */
+ this._last_rid = 0; // I know what you did last summer
+ /**
+ * @private
+ */
+ this._min_polling = 0;
+
+ /**
+ * @private
+ */
+ this._pause = 0;
+ /**
+ * @private
+ */
+ this._wait = JSJACHBC_MAX_WAIT;
+}
+JSJaCHttpBindingConnection.prototype = new JSJaCConnection();
+
+/**
+ * Inherit an instantiated HTTP Binding session
+ */
+JSJaCHttpBindingConnection.prototype.inherit = function(oArg) {
+ if (oArg.jid) {
+ var oJid = new JSJaCJID(oArg.jid);
+ this.domain = oJid.getDomain();
+ this.username = oJid.getNode();
+ this.resource = oJid.getResource();
+ } else {
+ this.domain = oArg.domain || 'localhost';
+ this.username = oArg.username;
+ this.resource = oArg.resource;
+ }
+ this._sid = oArg.sid;
+ this._rid = oArg.rid;
+ this._min_polling = oArg.polling;
+ this._inactivity = oArg.inactivity;
+ this._setHold(oArg.requests-1);
+ this.setPollInterval(this._timerval);
+ if (oArg.wait)
+ this._wait = oArg.wait; // for whatever reason
+
+ this._connected = true;
+
+ this._handleEvent('onconnect');
+
+ this._interval= setInterval(JSJaC.bind(this._checkQueue, this),
+ JSJAC_CHECKQUEUEINTERVAL);
+ this._inQto = setInterval(JSJaC.bind(this._checkInQ, this),
+ JSJAC_CHECKINQUEUEINTERVAL);
+ this._timeout = setTimeout(JSJaC.bind(this._process, this),
+ this.getPollInterval());
+};
+
+/**
+ * Sets poll interval
+ * @param {int} timerval the interval in seconds
+ */
+JSJaCHttpBindingConnection.prototype.setPollInterval = function(timerval) {
+ if (timerval && !isNaN(timerval)) {
+ if (!this.isPolling())
+ this._timerval = 100;
+ else if (this._min_polling && timerval < this._min_polling*1000)
+ this._timerval = this._min_polling*1000;
+ else if (this._inactivity && timerval > this._inactivity*1000)
+ this._timerval = this._inactivity*1000;
+ else
+ this._timerval = timerval;
+ }
+ return this._timerval;
+};
+
+/**
+ * whether this session is in polling mode
+ * @type boolean
+ */
+JSJaCHttpBindingConnection.prototype.isPolling = function() { return (this._hold == 0) };
+
+/**
+ * @private
+ */
+JSJaCHttpBindingConnection.prototype._getFreeSlot = function() {
+ for (var i=0; i<this._hold+1; i++)
+ if (typeof(this._req[i]) == 'undefined' || typeof(this._req[i].r) == 'undefined' || this._req[i].r.readyState == 4)
+ return i;
+ return -1; // nothing found
+};
+
+/**
+ * @private
+ */
+JSJaCHttpBindingConnection.prototype._getHold = function() { return this._hold; };
+
+/**
+ * @private
+ */
+JSJaCHttpBindingConnection.prototype._getRequestString = function(raw, last) {
+ raw = raw || '';
+ var reqstr = '';
+
+ // check if we're repeating a request
+
+ if (this._rid <= this._last_rid && typeof(this._last_requests[this._rid]) != 'undefined') // repeat!
+ reqstr = this._last_requests[this._rid].xml;
+ else { // grab from queue
+ var xml = '';
+ while (this._pQueue.length) {
+ var curNode = this._pQueue[0];
+ xml += curNode;
+ this._pQueue = this._pQueue.slice(1,this._pQueue.length);
+ }
+
+ reqstr = "<body xml:lang='"+XML_LANG+"' rid='"+this._rid+"' sid='"+this._sid+"' xmlns='http://jabber.org/protocol/httpbind' ";
+ if (JSJAC_HAVEKEYS) {
+ reqstr += "key='"+this._keys.getKey()+"' ";
+ if (this._keys.lastKey()) {
+ this._keys = new JSJaCKeys(hex_sha1,this.oDbg);
+ reqstr += "newkey='"+this._keys.getKey()+"' ";
+ }
+ }
+ if (last)
+ reqstr += "type='terminate'";
+ else if (this._reinit) {
+ if (JSJACHBC_USE_BOSH_VER)
+ reqstr += "xmpp:restart='true' xmlns:xmpp='urn:xmpp:xbosh' to='"+this.domain+"'";
+ this._reinit = false;
+ }
+
+ if (xml != '' || raw != '') {
+ reqstr += ">" + raw + xml + "</body>";
+ } else {
+ reqstr += "/>";
+ }
+
+ this._last_requests[this._rid] = new Object();
+ this._last_requests[this._rid].xml = reqstr;
+ this._last_rid = this._rid;
+
+ for (var i in this._last_requests)
+ if (this._last_requests.hasOwnProperty(i) &&
+ i < this._rid-this._hold)
+ delete(this._last_requests[i]); // truncate
+ }
+
+ return reqstr;
+};
+
+/**
+ * @private
+ */
+JSJaCHttpBindingConnection.prototype._getInitialRequestString = function() {
+ var reqstr = "<body xml:lang='"+XML_LANG+"' content='text/xml; charset=utf-8' hold='"+this._hold+"' xmlns='http://jabber.org/protocol/httpbind' to='"+this.authhost+"' wait='"+this._wait+"' rid='"+this._rid+"'";
+ if (this.secure)
+ reqstr += " secure='"+this.secure+"'";
+ if (JSJAC_HAVEKEYS) {
+ this._keys = new JSJaCKeys(hex_sha1,this.oDbg); // generate first set of keys
+ key = this._keys.getKey();
+ reqstr += " newkey='"+key+"'";
+ }
+
+ if (JSJACHBC_USE_BOSH_VER) {
+ reqstr += " ver='" + JSJACHBC_BOSH_VERSION + "'";
+ reqstr += " xmlns:xmpp='urn:xmpp:xbosh'";
+ if (this.authtype == 'sasl' || this.authtype == 'saslanon')
+ reqstr += " xmpp:version='1.0'";
+ }
+ reqstr += "/>";
+ return reqstr;
+};
+
+/**
+ * @private
+ */
+JSJaCHttpBindingConnection.prototype._getStreamID = function(req) {
+
+ this.oDbg.log(req.responseText,4);
+
+ if (!req.responseXML || !req.responseXML.documentElement) {
+ this._handleEvent('onerror',JSJaCError('503','cancel','service-unavailable'));
+ return;
+ }
+ var body = req.responseXML.documentElement;
+
+ // any session error?
+ if(body.getAttribute('type') == 'terminate') {
+ this._handleEvent('onerror',JSJaCError('503','cancel','service-unavailable'));
+ return;
+ }
+
+ // extract stream id used for non-SASL authentication
+ if (body.getAttribute('authid')) {
+ this.streamid = body.getAttribute('authid');
+ this.oDbg.log("got streamid: "+this.streamid,2);
+ }
+
+ if (!this._parseStreamFeatures(body)) {
+ this._sendEmpty(JSJaC.bind(this._getStreamID, this));
+ return;
+ }
+
+ this._timeout = setTimeout(JSJaC.bind(this._process, this),
+ this.getPollInterval());
+
+ if (this.register)
+ this._doInBandReg();
+ else
+ this._doAuth();
+};
+
+/**
+ * @private
+ */
+JSJaCHttpBindingConnection.prototype._getSuspendVars = function() {
+ return ('host,port,secure,_rid,_last_rid,_wait,_min_polling,_inactivity,_hold,_last_requests,_pause').split(',');
+};
+
+/**
+ * @private
+ */
+JSJaCHttpBindingConnection.prototype._handleInitialResponse = function(req) {
+ try {
+ // This will throw an error on Mozilla when the connection was refused
+ this.oDbg.log(req.getAllResponseHeaders(),4);
+ this.oDbg.log(req.responseText,4);
+ } catch(ex) {
+ this.oDbg.log("No response",4);
+ }
+
+ if (req.status != 200 || !req.responseXML) {
+ this.oDbg.log("initial response broken (status: "+req.status+")",1);
+ this._handleEvent('onerror',JSJaCError('503','cancel','service-unavailable'));
+ return;
+ }
+ var body = req.responseXML.documentElement;
+
+ if (!body || body.tagName != 'body' || body.namespaceURI != 'http://jabber.org/protocol/httpbind') {
+ this.oDbg.log("no body element or incorrect body in initial response",1);
+ this._handleEvent("onerror",JSJaCError("500","wait","internal-service-error"));
+ return;
+ }
+
+ // Check for errors from the server
+ if (body.getAttribute("type") == "terminate") {
+ this.oDbg.log("invalid response:\n" + req.responseText,1);
+ clearTimeout(this._timeout); // remove timer
+ this._connected = false;
+ this.oDbg.log("Disconnected.",1);
+ this._handleEvent('ondisconnect');
+ this._handleEvent('onerror',JSJaCError('503','cancel','service-unavailable'));
+ return;
+ }
+
+ // get session ID
+ this._sid = body.getAttribute('sid');
+ this.oDbg.log("got sid: "+this._sid,2);
+
+ // get attributes from response body
+ if (body.getAttribute('polling'))
+ this._min_polling = body.getAttribute('polling');
+
+ if (body.getAttribute('inactivity'))
+ this._inactivity = body.getAttribute('inactivity');
+
+ if (body.getAttribute('requests'))
+ this._setHold(body.getAttribute('requests')-1);
+ this.oDbg.log("set hold to " + this._getHold(),2);
+
+ if (body.getAttribute('ver'))
+ this._bosh_version = body.getAttribute('ver');
+
+ if (body.getAttribute('maxpause'))
+ this._pause = Number.min(body.getAttribute('maxpause'), JSJACHBC_MAXPAUSE);
+
+ // must be done after response attributes have been collected
+ this.setPollInterval(this._timerval);
+
+ /* start sending from queue for not polling connections */
+ this._connected = true;
+
+ this._inQto = setInterval(JSJaC.bind(this._checkInQ, this),
+ JSJAC_CHECKINQUEUEINTERVAL);
+ this._interval= setInterval(JSJaC.bind(this._checkQueue, this),
+ JSJAC_CHECKQUEUEINTERVAL);
+
+ /* wait for initial stream response to extract streamid needed
+ * for digest auth
+ */
+ this._getStreamID(req);
+};
+
+/**
+ * @private
+ */
+JSJaCHttpBindingConnection.prototype._parseResponse = function(req) {
+ if (!this.connected() || !req)
+ return null;
+
+ var r = req.r; // the XmlHttpRequest
+
+ try {
+ if (r.status == 404 || r.status == 403) {
+ // connection manager killed session
+ this._abort();
+ return null;
+ }
+
+ if (r.status != 200 || !r.responseXML) {
+ this._errcnt++;
+ var errmsg = "invalid response ("+r.status+"):\n" + r.getAllResponseHeaders()+"\n"+r.responseText;
+ if (!r.responseXML)
+ errmsg += "\nResponse failed to parse!";
+ this.oDbg.log(errmsg,1);
+ if (this._errcnt > JSJAC_ERR_COUNT) {
+ // abort
+ this._abort();
+ return null;
+ }
+
+ if (this.connected()) {
+ this.oDbg.log("repeating ("+this._errcnt+")",1);
+ this._setStatus('proto_error_fallback');
+
+ // schedule next tick
+ setTimeout(JSJaC.bind(this._resume, this),
+ this.getPollInterval());
+ }
+
+ return null;
+ }
+ } catch (e) {
+ this.oDbg.log("XMLHttpRequest error: status not available", 1);
+ this._errcnt++;
+ if (this._errcnt > JSJAC_ERR_COUNT) {
+ // abort
+ this._abort();
+ } else {
+ if (this.connected()) {
+ this.oDbg.log("repeating ("+this._errcnt+")",1);
+
+ this._setStatus('proto_error_fallback');
+
+ // schedule next tick
+ setTimeout(JSJaC.bind(this._resume, this),
+ this.getPollInterval());
+ }
+ }
+ return null;
+ }
+
+ var body = r.responseXML.documentElement;
+ if (!body || body.tagName != 'body' ||
+ body.namespaceURI != 'http://jabber.org/protocol/httpbind') {
+ this.oDbg.log("invalid response:\n" + r.responseText,1);
+
+ clearTimeout(this._timeout); // remove timer
+ clearInterval(this._interval);
+ clearInterval(this._inQto);
+
+ this._connected = false;
+ this.oDbg.log("Disconnected.",1);
+ this._handleEvent('ondisconnect');
+
+ this._setStatus('internal_server_error');
+ this._handleEvent('onerror',
+ JSJaCError('500','wait','internal-server-error'));
+
+ return null;
+ }
+
+ if (typeof(req.rid) != 'undefined' && this._last_requests[req.rid]) {
+ if (this._last_requests[req.rid].handled) {
+ this.oDbg.log("already handled "+req.rid,2);
+ return null;
+ } else
+ this._last_requests[req.rid].handled = true;
+ }
+
+
+ // Check for errors from the server
+ if (body.getAttribute("type") == "terminate") {
+ // read condition
+ var condition = body.getAttribute('condition');
+
+ if (condition != "item-not-found") {
+ this.oDbg.log("session terminated:\n" + r.responseText,1);
+
+ clearTimeout(this._timeout); // remove timer
+ clearInterval(this._interval);
+ clearInterval(this._inQto);
+
+ try {
+ removeDB('jsjac', 'state');
+ } catch (e) {}
+
+ this._connected = false;
+
+ if (condition == "remote-stream-error")
+ if (body.getElementsByTagName("conflict").length > 0)
+ this._setStatus("session-terminate-conflict");
+ if (condition == null)
+ condition = 'session-terminate';
+ this._handleEvent('onerror',JSJaCError('503','cancel',condition));
+
+ this.oDbg.log("Aborting remaining connections",4);
+
+ for (var i=0; i<this._hold+1; i++) {
+ try {
+ this._req[i].r.abort();
+ } catch(e) { this.oDbg.log(e, 1); }
+ }
+
+ this.oDbg.log("parseResponse done with terminating", 3);
+
+ this.oDbg.log("Disconnected.",1);
+ this._handleEvent('ondisconnect');
+ } else {
+ this._errcnt++;
+ if (this._errcnt > JSJAC_ERR_COUNT)
+ this._abort();
+ }
+ return null;
+ }
+
+ // no error
+ this._errcnt = 0;
+ return r.responseXML.documentElement;
+};
+
+/**
+ * @private
+ */
+JSJaCHttpBindingConnection.prototype._reInitStream = function(cb) {
+ // tell http binding to reinit stream with/before next request
+ this._reinit = true;
+
+ this._sendEmpty(this._prepReInitStreamWait(cb));
+};
+
+
+JSJaCHttpBindingConnection.prototype._prepReInitStreamWait = function(cb) {
+ return JSJaC.bind(function(req) {
+ this._reInitStreamWait(req, cb);
+ }, this);
+};
+
+/**
+ * @private
+ */
+JSJaCHttpBindingConnection.prototype._reInitStreamWait = function(req, cb) {
+ this.oDbg.log("checking for stream features");
+ var doc = req.responseXML.documentElement;
+ this.oDbg.log(doc);
+ if (doc.getElementsByTagNameNS) {
+ this.oDbg.log("checking with namespace");
+ var features = doc.getElementsByTagNameNS('http://etherx.jabber.org/streams',
+ 'features').item(0);
+ if (features) {
+ var bind = features.getElementsByTagNameNS('urn:ietf:params:xml:ns:xmpp-bind',
+ 'bind').item(0);
+ }
+ } else {
+ var featuresNL = doc.getElementsByTagName('stream:features');
+ for (var i=0, l=featuresNL.length; i<l; i++) {
+ if (featuresNL.item(i).namespaceURI == 'http://etherx.jabber.org/streams' ||
+ featuresNL.item(i).getAttribute('xmlns') ==
+ 'http://etherx.jabber.org/streams') {
+ var features = featuresNL.item(i);
+ break;
+ }
+ }
+ if (features) {
+ var bind = features.getElementsByTagName('bind');
+ for (var i=0, l=bind.length; i<l; i++) {
+ if (bind.item(i).namespaceURI == 'urn:ietf:params:xml:ns:xmpp-bind' ||
+ bind.item(i).getAttribute('xmlns') ==
+ 'urn:ietf:params:xml:ns:xmpp-bind') {
+ bind = bind.item(i);
+ break;
+ }
+ }
+ }
+ }
+ this.oDbg.log(features);
+ this.oDbg.log(bind);
+
+ if (features) {
+ if (bind) {
+ cb();
+ } else {
+ this.oDbg.log("no bind feature - giving up",1);
+ this._handleEvent('onerror',JSJaCError('503','cancel',"service-unavailable"));
+ this._connected = false;
+ this.oDbg.log("Disconnected.",1);
+ this._handleEvent('ondisconnect');
+ }
+ } else {
+ // wait
+ this._sendEmpty(this._prepReInitStreamWait(cb));
+ }
+};
+
+/**
+ * @private
+ */
+JSJaCHttpBindingConnection.prototype._resume = function() {
+ /* make sure to repeat last request as we can be sure that
+ * it had failed (only if we're not using the 'pause' attribute
+ */
+ if (this._pause == 0 && this._rid >= this._last_rid)
+ this._rid = this._last_rid-1;
+
+ this._process();
+};
+
+/**
+ * @private
+ */
+JSJaCHttpBindingConnection.prototype._setHold = function(hold) {
+ if (!hold || isNaN(hold) || hold < 0)
+ hold = 0;
+ else if (hold > JSJACHBC_MAX_HOLD)
+ hold = JSJACHBC_MAX_HOLD;
+ this._hold = hold;
+ return this._hold;
+};
+
+/**
+ * @private
+ */
+JSJaCHttpBindingConnection.prototype._setupRequest = function(async) {
+ var req = new Object();
+ var r = XmlHttp.create();
+ try {
+ r.open("POST",this._httpbase,async);
+ r.setRequestHeader('Content-Type','text/xml; charset=utf-8');
+ } catch(e) { this.oDbg.log(e,1); }
+ req.r = r;
+ this._rid++;
+ req.rid = this._rid;
+ return req;
+};
+
+/**
+ * @private
+ */
+JSJaCHttpBindingConnection.prototype._suspend = function() {
+ if (this._pause == 0)
+ return; // got nothing to do
+
+ var slot = this._getFreeSlot();
+ // Intentionally synchronous
+ this._req[slot] = this._setupRequest(false);
+
+ var reqstr = "<body xml:lang='"+XML_LANG+"' pause='"+this._pause+"' xmlns='http://jabber.org/protocol/httpbind' sid='"+this._sid+"' rid='"+this._rid+"'";
+ if (JSJAC_HAVEKEYS) {
+ reqstr += " key='"+this._keys.getKey()+"'";
+ if (this._keys.lastKey()) {
+ this._keys = new JSJaCKeys(hex_sha1,this.oDbg);
+ reqstr += " newkey='"+this._keys.getKey()+"'";
+ }
+
+ }
+ reqstr += ">";
+
+ while (this._pQueue.length) {
+ var curNode = this._pQueue[0];
+ reqstr += curNode;
+ this._pQueue = this._pQueue.slice(1,this._pQueue.length);
+ }
+
+ //reqstr += "<presence type='unavailable' xmlns='jabber:client'/>";
+ reqstr += "</body>";
+
+ this.oDbg.log("Disconnecting: " + reqstr,4);
+ this._req[slot].r.send(reqstr);
+};
--- /dev/null
+// jXHR.js (JSON-P XHR)\r
+// v0.1 (c) Kyle Simpson\r
+// MIT License\r
+// modified by gueron Jonathan to work with strophe lib\r
+// for http://www.iadvize.com\r
+\r
+(function(global){\r
+ var SETTIMEOUT = global.setTimeout, // for better compression\r
+ doc = global.document,\r
+ callback_counter = 0;\r
+ \r
+ global.jXHR = function() {\r
+ var script_url,\r
+ script_loaded,\r
+ jsonp_callback,\r
+ scriptElem,\r
+ publicAPI = null;\r
+ \r
+ function removeScript() { try { scriptElem.parentNode.removeChild(scriptElem); } catch (err) { } }\r
+ \r
+ function reset() {\r
+ script_loaded = false;\r
+ script_url = "";\r
+ removeScript();\r
+ scriptElem = null;\r
+ fireReadyStateChange(0);\r
+ }\r
+ \r
+ function ThrowError(msg) {\r
+ try { \r
+ publicAPI.onerror.call(publicAPI,msg,script_url); \r
+ } catch (err) { \r
+ //throw new Error(msg); \r
+ }\r
+ }\r
+\r
+ function handleScriptLoad() {\r
+ if ((this.readyState && this.readyState!=="complete" && this.readyState!=="loaded") || script_loaded) { return; }\r
+ this.onload = this.onreadystatechange = null; // prevent memory leak\r
+ script_loaded = true;\r
+ if (publicAPI.readyState !== 4) ThrowError("handleScriptLoad: Script failed to load ["+script_url+"].");\r
+ removeScript();\r
+ }\r
+ \r
+ function parseXMLString(xmlStr) {\r
+ var xmlDoc = null;\r
+ if(window.DOMParser) {\r
+ var parser = new DOMParser();\r
+ xmlDoc = parser.parseFromString(xmlStr,"text/xml");\r
+ }\r
+ else {\r
+ xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); \r
+ xmlDoc.async="false";\r
+ xmlDoc.loadXML(xmlStr);\r
+ }\r
+ return xmlDoc;\r
+ }\r
+ \r
+ function fireReadyStateChange(rs,args) {\r
+ \r
+ args = args || [];\r
+ publicAPI.readyState = rs;\r
+ if (rs == 4) {\r
+ publicAPI.responseText = args[0].reply;\r
+ publicAPI.responseXML = parseXMLString(args[0].reply);\r
+ }\r
+ if (typeof publicAPI.onreadystatechange === "function") publicAPI.onreadystatechange.apply(publicAPI,args);\r
+ }\r
+ \r
+ publicAPI = {\r
+ onerror:null,\r
+ onreadystatechange:null,\r
+ readyState:0,\r
+ status:200,\r
+ responseBody: null,\r
+ responseText: null,\r
+ responseXML: null,\r
+ open:function(method,url){\r
+ reset();\r
+ var internal_callback = "cb"+(callback_counter++);\r
+ (function(icb){\r
+ global.jXHR[icb] = function() {\r
+ try { fireReadyStateChange.call(publicAPI,4,arguments); } \r
+ catch(err) { \r
+ publicAPI.readyState = -1;\r
+ ThrowError("Script failed to run ["+script_url+"]."); \r
+ }\r
+ global.jXHR[icb] = null;\r
+ };\r
+ })(internal_callback);\r
+ script_url = url + '?callback=?jXHR&data=';\r
+ script_url = script_url.replace(/=\?jXHR/,"=jXHR."+internal_callback);\r
+ fireReadyStateChange(1);\r
+ },\r
+ send:function(data){\r
+ script_url = script_url + encodeURIComponent(data);\r
+ SETTIMEOUT(function(){\r
+ scriptElem = doc.createElement("script");\r
+ scriptElem.setAttribute("type","text/javascript");\r
+ scriptElem.onload = scriptElem.onreadystatechange = function(){handleScriptLoad.call(scriptElem);};\r
+ scriptElem.setAttribute("src",script_url);\r
+ doc.getElementsByTagName("head")[0].appendChild(scriptElem);\r
+ },0);\r
+ fireReadyStateChange(2);\r
+ },\r
+ abort:function(){},\r
+ setRequestHeader:function(){}, // noop\r
+ getResponseHeader:function(){return "";}, // basically noop\r
+ getAllResponseHeaders:function(){return [];} // ditto\r
+ };\r
+\r
+ reset();\r
+ \r
+ return publicAPI;\r
+ };\r
+})(window);\r
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the links JS script for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Authors: Vanaryon, Maranda
+Last revision: 26/08/11
+
+*/
+
+// Apply links in a string
+function applyLinks(string, mode, style) {
+ // Special stuffs
+ var style, target;
+
+ // Links style
+ if(!style)
+ style = '';
+ else
+ style = ' style="' + style + '"';
+
+ // Open in new tabs
+ if(mode != 'xhtml-im')
+ target = ' target="_blank"';
+ else
+ target = '';
+
+ // XMPP address
+ string = string.replace(/(\s|<br \/>|^)(([a-zA-Z0-9\._-]+)@([a-zA-Z0-9\.\/_-]+))(,|\s|$)/gi, '$1<a href="xmpp:$2" target="_blank"' + style + '>$2</a>$5');
+
+ // Simple link
+ string = string.replace(/(\s|<br \/>|^|\()((https?|ftp|file|xmpp|irc|mailto|vnc|webcal|ssh|ldap|smb|magnet|spotify)(:)([^<>'"\s\)]+))/gim, '$1<a href="$2"' + target + style + '>$2</a>');
+
+ return string;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the Jappix Me tool functions for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 16/01/12
+
+*/
+
+// Opens the Me tools
+function openMe() {
+ // Popup HTML content
+ var html =
+ '<div class="top">' + _e("Public profile") + '</div>' +
+
+ '<div class="content">' +
+ '<a class="me-images logo" href="https://me.jappix.com/" target="_blank"></a>' +
+
+ '<div class="infos">' +
+ '<p class="infos-title">' + _e("Your profile anywhere on the Web.") + '</p>' +
+ '<p>' + printf(_e("%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."), '<a href="https://me.jappix.com/" target="_blank">Jappix Me</a>') + '</p>' +
+ '<p>' + _e("Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year.") + '</p>' +
+ '<p>' + _e("You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!") + '</p>' +
+ '</div>' +
+
+ '<a class="go one-button" href="https://me.jappix.com/new" target="_blank">' + _e("Yay, let's create my public profile!") + '</a>' +
+ '</div>' +
+
+ '<div class="bottom">' +
+ '<a href="#" class="finish">' + _e("Close") + '</a>' +
+ '</div>';
+
+ // Create the popup
+ createPopup('me', html);
+
+ // Associate the events
+ launchMe();
+
+ logThis('Public profile tool opened.');
+}
+
+// Closes the Me tools
+function closeMe() {
+ // Destroy the popup
+ destroyPopup('me');
+
+ return false;
+}
+
+// Plugin launcher
+function launchMe() {
+ // Click events
+ $('#me .content a.go').click(function() {
+ closeMe();
+ });
+
+ $('#me .bottom .finish').click(closeMe);
+}
\ No newline at end of file
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the messages JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Authors: Vanaryon, Maranda
+Last revision: 01/09/11
+
+*/
+
+// Handles the incoming message packets
+function handleMessage(message) {
+ // Error packet? Stop!
+ if(handleErrorReply(message))
+ return;
+
+ // We get the message items
+ var from = fullXID(getStanzaFrom(message));
+ var id = message.getID();
+ var type = message.getType();
+ var body = trim(message.getBody());
+ var node = message.getNode();
+ var subject = trim(message.getSubject());
+
+ // We generate some values
+ var xid = bareXID(from);
+ var resource = thisResource(from);
+ var hash = hex_md5(xid);
+ var xHTML = $(node).find('html body').size();
+ var GCUser = false;
+
+ // This message comes from a groupchat user
+ if(isPrivate(xid) && ((type == 'chat') || !type) && resource) {
+ GCUser = true;
+ xid = from;
+ hash = hex_md5(xid);
+ }
+
+ // Get message date
+ var time, stamp, d_stamp;
+
+ // Read the delay
+ var delay = readMessageDelay(node);
+
+ // Any delay?
+ if(delay) {
+ time = relativeDate(delay);
+ d_stamp = Date.jab2date(delay);
+ }
+
+ // No delay: get actual time
+ else {
+ time = getCompleteTime();
+ d_stamp = new Date();
+ }
+
+ // Get the date stamp
+ stamp = extractStamp(d_stamp);
+
+ // Received message
+ if(hasReceived(message))
+ return messageReceived(hash, id);
+
+ // Chatstate message
+ if(node && !delay && ((((type == 'chat') || !type) && !exists('#page-switch .' + hash + ' .unavailable')) || (type == 'groupchat'))) {
+ /* REF: http://xmpp.org/extensions/xep-0085.html */
+
+ // Re-process the hash
+ var chatstate_hash = hash;
+
+ if(type == 'groupchat')
+ chatstate_hash = hex_md5(from);
+
+ // Do something depending of the received state
+ if($(node).find('active').size()) {
+ displayChatState('active', chatstate_hash, type);
+
+ // Tell Jappix the entity supports chatstates
+ $('#' + chatstate_hash + ' .message-area').attr('data-chatstates', 'true');
+
+ logThis('Active chatstate received from: ' + from);
+ }
+
+ else if($(node).find('composing').size())
+ displayChatState('composing', chatstate_hash, type);
+
+ else if($(node).find('paused').size())
+ displayChatState('paused', chatstate_hash, type);
+
+ else if($(node).find('inactive').size())
+ displayChatState('inactive', chatstate_hash, type);
+
+ else if($(node).find('gone').size())
+ displayChatState('gone', chatstate_hash, type);
+ }
+
+ // Invite message
+ if($(node).find('x[xmlns=' + NS_MUC_USER + '] invite').size()) {
+ // We get the needed values
+ var iFrom = $(node).find('x[xmlns=' + NS_MUC_USER + '] invite').attr('from');
+ var iRoom = $(node).find('x[xmlns=' + NS_XCONFERENCE + ']').attr('jid');
+
+ // Old invite method?
+ if(!iRoom)
+ iRoom = from;
+
+ // We display the notification
+ newNotification('invite_room', iFrom, [iRoom], body);
+
+ logThis('Invite Request from: ' + iFrom + ' to join: ' + iRoom);
+
+ return false;
+ }
+
+ // Request message
+ if(message.getChild('confirm', NS_HTTP_AUTH)) {
+ // Open a new notification
+ newNotification('request', xid, [message], body);
+
+ logThis('HTTP Request from: ' + xid);
+
+ return false;
+ }
+
+ // OOB message
+ if(message.getChild('x', NS_XOOB)) {
+ handleOOB(from, id, 'x', node);
+
+ logThis('Message OOB request from: ' + xid);
+
+ return false;
+ }
+
+ // Roster Item Exchange message
+ if(message.getChild('x', NS_ROSTERX)) {
+ // Open a new notification
+ newNotification('rosterx', xid, [message], body);
+
+ logThis('Roster Item Exchange from: ' + xid);
+
+ return false;
+ }
+
+ // Normal message
+ if((type == 'normal') && body) {
+ // Message date
+ var messageDate = delay;
+
+ // No message date?
+ if(!messageDate)
+ messageDate = getXMPPTime('utc');
+
+ // Message ID
+ var messageID = hex_md5(xid + subject + messageDate);
+
+ // We store the received message
+ storeInboxMessage(xid, subject, body, 'unread', messageID, messageDate);
+
+ // Display the inbox message
+ if(exists('#inbox'))
+ displayInboxMessage(xid, subject, body, 'unread', messageID, messageDate);
+
+ // Check we have new messages (play a sound if any unread messages)
+ if(checkInboxMessages())
+ soundPlay(2);
+
+ // Send it to the server
+ storeInbox();
+
+ return false;
+ }
+
+ // PubSub event
+ if($(node).find('event').attr('xmlns') == NS_PUBSUB_EVENT) {
+ // We get the needed values
+ var iParse = $(node).find('event items');
+ var iNode = iParse.attr('node');
+
+ // Turn around the different result cases
+ if(iNode) {
+ switch(iNode) {
+ // Mood
+ case NS_MOOD:
+ // Retrieve the values
+ var iMood = iParse.find('mood');
+ var fValue = '';
+ var tText = '';
+
+ // There's something
+ if(iMood.children().size()) {
+ // Read the value
+ fValue = node.getElementsByTagName('mood').item(0).childNodes.item(0).nodeName;
+
+ // Read the text
+ tText = iMood.find('text').text();
+
+ // Avoid errors
+ if(!fValue)
+ fValue = '';
+ }
+
+ // Store the PEP event (and display it)
+ storePEP(xid, 'mood', fValue, tText);
+
+ break;
+
+ // Activity
+ case NS_ACTIVITY:
+ // Retrieve the values
+ var iActivity = iParse.find('activity');
+ var sValue = '';
+ var tText = '';
+
+ // There's something
+ if(iActivity.children().size()) {
+ // Read the value
+ fValue = node.getElementsByTagName('activity').item(0).childNodes.item(0).nodeName;
+
+ // Read the text
+ tText = iActivity.find('text').text();
+
+ // Avoid errors
+ if(!fValue)
+ fValue = '';
+ }
+
+ // Store the PEP event (and display it)
+ storePEP(xid, 'activity', fValue, tText);
+
+ break;
+
+ // Tune
+ case NS_TUNE:
+ // Retrieve the values
+ var iTune = iParse.find('tune');
+ var tArtist = iTune.find('artist').text();
+ var tSource = iTune.find('source').text();
+ var tTitle = iTune.find('title').text();
+ var tURI = iTune.find('uri').text();
+
+ // Store the PEP event (and display it)
+ storePEP(xid, 'tune', tArtist, tTitle, tSource, tURI);
+
+ break;
+
+ // Geolocation
+ case NS_GEOLOC:
+ // Retrieve the values
+ var iGeoloc = iParse.find('geoloc');
+ var tLat = iGeoloc.find('lat').text();
+ var tLon = iGeoloc.find('lon').text();
+
+ // Any extra-values?
+ var tLocality = iGeoloc.find('locality').text();
+ var tRegion = iGeoloc.find('region').text();
+ var tCountry = iGeoloc.find('country').text();
+ var tHuman = humanPosition(tLocality, tRegion, tCountry);
+
+ // Store the PEP event (and display it)
+ storePEP(xid, 'geoloc', tLat, tLon, tHuman);
+
+ break;
+
+ // Microblog
+ case NS_URN_MBLOG:
+ displayMicroblog(message, xid, hash, 'mixed', 'push');
+
+ break;
+
+ // Inbox
+ case NS_URN_INBOX:
+ // Do not handle friend's notifications
+ if(xid == getXID())
+ handleNotifications(message);
+
+ break;
+ }
+ }
+
+ return false;
+ }
+
+ // If this is a room topic message
+ if(subject && (type == 'groupchat')) {
+ // Filter the vars
+ var filter_subject = subject.replace(/\n+/g, ' ');
+ var filteredSubject = filterThisMessage(filter_subject, resource, true);
+ var filteredName = resource.htmlEnc();
+
+ // Display the new subject at the top
+ $('#' + hash + ' .top .name .bc-infos .muc-topic').replaceWith('<span class="muc-topic" title="' + filter_subject + '">' + filteredSubject + '</span>');
+
+ // Display the new subject as a system message
+ if(resource) {
+ var topic_body = filteredName + ' ' + _e("changed the subject to:") + ' ' + filterThisMessage(subject, resource, true);
+ displayMessage(type, from, hash, filteredName, topic_body, time, stamp, 'system-message', false);
+ }
+ }
+
+ // If the message has a content
+ if(xHTML || body) {
+ var filteredMessage;
+ var notXHTML = true;
+
+ // IE bug fix
+ if((BrowserDetect.browser == 'Explorer') && (BrowserDetect.version < 9))
+ xHTML = 0;
+
+ //If this is a xHTML message
+ if(xHTML) {
+ notXHTML = false;
+
+ // Filter the xHTML message
+ body = filterThisXHTML(node);
+ }
+
+ // Groupchat message
+ if(type == 'groupchat') {
+ /* REF: http://xmpp.org/extensions/xep-0045.html */
+
+ // We generate the message type and time
+ var message_type = 'user-message';
+
+ // This is an old message
+ if(delay && resource)
+ message_type = 'old-message';
+
+ // This is a system message
+ else if(!resource)
+ message_type = 'system-message';
+
+ var nickQuote = '';
+
+ // If this is not an old message
+ if(message_type == 'user-message') {
+ var myNick = getMUCNick(hash);
+
+ // If an user quoted our nick (with some checks)
+ var regex = new RegExp('((^)|( )|(@))' + escapeRegex(myNick) + '(($)|(:)|(,)|( ))', 'gi');
+
+ if(body.match(regex) && (myNick != resource) && (message_type == 'user-message'))
+ nickQuote = ' my-nick';
+
+ // We notify the user if there's a new personnal message
+ if(nickQuote) {
+ messageNotify(hash, 'personnal');
+ soundPlay(1);
+ }
+
+ // We notify the user there's a new unread muc message
+ else
+ messageNotify(hash, 'unread');
+ }
+
+ // Display the received message
+ displayMessage(type, from, hash, resource.htmlEnc(), body, time, stamp, message_type, notXHTML, nickQuote);
+ }
+
+ // Chat message
+ else if((type == 'chat') || !type) {
+ // Gets the nickname of the user
+ var fromName = resource;
+ var chatType = 'chat';
+
+ // Must send a receipt notification?
+ if(hasReceipt(message) && (id != null))
+ sendReceived(type, from, id);
+
+ // It does not come from a groupchat user, get the full name
+ if(!GCUser)
+ fromName = getBuddyName(xid);
+ else
+ chatType = 'private';
+
+ // If the chat isn't yet opened, open it !
+ if(!exists('#' + hash)) {
+ // We create a new chat
+ chatCreate(hash, xid, fromName, chatType);
+
+ // We tell the user that a new chat has started
+ soundPlay(0);
+ }
+
+ else
+ soundPlay(1);
+
+ // Display the received message
+ displayMessage(type, xid, hash, fromName.htmlEnc(), body, time, stamp, 'user-message', notXHTML, '', 'him');
+
+ // We notify the user
+ messageNotify(hash, 'personnal');
+ }
+
+ return false;
+ }
+
+ return false;
+}
+
+// Sends a given message
+function sendMessage(hash, type) {
+ // Get the values
+ var message_area = $('#' + hash + ' .message-area');
+ var body = trim(message_area.val());
+ var xid = unescape(message_area.attr('data-to'));
+
+ // If the user didn't entered any message, stop
+ if(!body || !xid)
+ return false;
+
+ try {
+ // We send the message through the XMPP network
+ var aMsg = new JSJaCMessage();
+ aMsg.setTo(xid);
+
+ // Set an ID
+ var id = genID();
+ aMsg.setID(id);
+
+ // /help shortcut
+ if(body.match(/^\/help\s*(.*)/)) {
+ // Help text
+ var help_text = '<p class="help" xmlns="http://www.w3.org/1999/xhtml">';
+ help_text += '<b>' + _e("Available shortcuts:") + '</b>';
+
+ // Shortcuts array
+ var shortcuts = [];
+
+ // Common shortcuts
+ shortcuts.push(printf(_e("%s removes the chat logs"), '<em>/clear</em>'));
+ shortcuts.push(printf(_e("%s joins a groupchat"), '<em>/join jid</em>'));
+ shortcuts.push(printf(_e("%s closes the chat"), '<em>/part</em>'));
+ shortcuts.push(printf(_e("%s shows the user profile"), '<em>/whois jid</em>'));
+
+ // Groupchat shortcuts
+ if(type == 'groupchat') {
+ shortcuts.push(printf(_e("%s sends a message to the room"), '<em>/say message</em>'));
+ shortcuts.push(printf(_e("%s changes your nickname"), '<em>/nick nickname</em>'));
+ shortcuts.push(printf(_e("%s sends a message to someone in the room"), '<em>/msg nickname message</em>'));
+ shortcuts.push(printf(_e("%s changes the room topic"), '<em>/topic subject</em>'));
+ shortcuts.push(printf(_e("%s kicks an user of the room"), '<em>/kick nickname reason</em>'));
+ shortcuts.push(printf(_e("%s bans an user of the room"), '<em>/ban nickname reason</em>'));
+ shortcuts.push(printf(_e("%s invites someone to join the room"), '<em>/invite jid message</em>'));
+ }
+
+ // Generate the code from the array
+ shortcuts = shortcuts.sort();
+
+ for(s in shortcuts)
+ help_text += shortcuts[s] + '<br />';
+
+ help_text += '</p>';
+
+ // Display the message
+ displayMessage(type, xid, hash, 'help', help_text, getCompleteTime(), getTimeStamp(), 'system-message', false);
+
+ // Reset chatstate
+ chatStateSend('active', xid, hash);
+ }
+
+ // /clear shortcut
+ else if(body.match(/^\/clear/)) {
+ cleanChat(hex_md5(xid));
+
+ // Reset chatstate
+ chatStateSend('active', xid, hash);
+ }
+
+ // /join shortcut
+ else if(body.match(/^\/join (\S+)\s*(.*)/)) {
+ // Join
+ var room = generateXID(RegExp.$1, 'groupchat');
+ var pass = RegExp.$2;
+
+ checkChatCreate(room, 'groupchat');
+
+ // Reset chatstate
+ chatStateSend('active', xid, hash);
+ }
+
+ // /part shortcut
+ else if(body.match(/^\/part\s*(.*)/) && (!isAnonymous() || (isAnonymous() && (xid != generateXID(ANONYMOUS_ROOM, 'groupchat')))))
+ quitThisChat(xid, hex_md5(xid), type);
+
+ // /whois shortcut
+ else if(body.match(/^\/whois(( (\S+))|($))/)) {
+ var whois_xid = RegExp.$3;
+
+ // Groupchat WHOIS
+ if(type == 'groupchat') {
+ var nXID = getMUCUserXID(xid, whois_xid);
+
+ if(!nXID)
+ openThisInfo(6);
+ else
+ openUserInfos(nXID);
+ }
+
+ // Chat or private WHOIS
+ else {
+ if(!whois_xid)
+ openUserInfos(xid);
+ else
+ openUserInfos(whois_xid);
+ }
+
+ // Reset chatstate
+ chatStateSend('active', xid, hash);
+ }
+
+ // Chat message type
+ else if(type == 'chat') {
+ aMsg.setType('chat');
+
+ // Generates the correct message depending of the choosen style
+ var notXHTML = true;
+ var genMsg = generateMessage(aMsg, body, hash);
+
+ if(genMsg == 'XHTML')
+ notXHTML = false;
+
+ // Receipt request
+ var receipt_request = receiptRequest(hash);
+
+ if(receipt_request)
+ aMsg.appendNode('request', {'xmlns': NS_URN_RECEIPTS});
+
+ // Chatstate
+ aMsg.appendNode('active', {'xmlns': NS_CHATSTATES});
+
+ // Send it!
+ con.send(aMsg, handleErrorReply);
+
+ // Filter the xHTML message (for us!)
+ if(!notXHTML)
+ body = filterThisXHTML(aMsg.getNode());
+
+ // Finally we display the message we just sent
+ var my_xid = getXID();
+
+ displayMessage('chat', my_xid, hash, getBuddyName(my_xid).htmlEnc(), body, getCompleteTime(), getTimeStamp(), 'user-message', notXHTML, '', 'me', id);
+
+ // Receipt timer
+ if(receipt_request)
+ checkReceived(hash, id);
+ }
+
+ // Groupchat message type
+ else if(type == 'groupchat') {
+ // /say shortcut
+ if(body.match(/^\/say (.+)/)) {
+ body = body.replace(/^\/say (.+)/, '$1');
+
+ aMsg.setType('groupchat');
+ generateMessage(aMsg, body, hash);
+
+ con.send(aMsg, handleErrorReply);
+ }
+
+ // /nick shortcut
+ else if(body.match(/^\/nick (.+)/)) {
+ var nick = body.replace(/^\/nick (.+)/, '$1');
+
+ // Does not exist yet?
+ if(!getMUCUserXID(xid, nick)) {
+ // Send a new presence
+ sendPresence(xid + '/' + nick, '', getUserShow(), getUserStatus(), '', false, false, handleErrorReply);
+
+ // Change the stored nickname
+ $('#' + hex_md5(xid)).attr('data-nick', escape(nick));
+
+ // Reset chatstate
+ chatStateSend('active', xid, hash);
+ }
+ }
+
+ // /msg shortcut
+ else if(body.match(/^\/msg (\S+)\s+(.+)/)) {
+ var nick = RegExp.$1;
+ var body = RegExp.$2;
+ var nXID = getMUCUserXID(xid, nick);
+
+ // We check if the user exists
+ if(!nXID)
+ openThisInfo(6);
+
+ // If the private message is not empty
+ else if(body) {
+ aMsg.setType('chat');
+ aMsg.setTo(nXID);
+ generateMessage(aMsg, body, hash);
+
+ con.send(aMsg, handleErrorReply);
+ }
+ }
+
+ // /topic shortcut
+ else if(body.match(/^\/topic (.+)/)) {
+ var topic = body.replace(/^\/topic (.+)/, '$1');
+
+ aMsg.setType('groupchat');
+ aMsg.setSubject(topic);
+
+ con.send(aMsg, handleMessageError);
+
+ // Reset chatstate
+ chatStateSend('active', xid, hash);
+ }
+
+ // /ban shortcut
+ else if(body.match(/^\/ban (\S+)\s*(.*)/)) {
+ var nick = RegExp.$1;
+ var reason = RegExp.$2;
+ var nXID = getMUCUserRealXID(xid, nick);
+
+ // We check if the user exists
+ if(!nXID)
+ openThisInfo(6);
+
+ else {
+ // We generate the ban IQ
+ var iq = new JSJaCIQ();
+ iq.setTo(xid);
+ iq.setType('set');
+
+ var iqQuery = iq.setQuery(NS_MUC_ADMIN);
+ var item = iqQuery.appendChild(iq.buildNode('item', {'affiliation': 'outcast', 'jid': nXID, 'xmlns': NS_MUC_ADMIN}));
+
+ if(reason)
+ item.appendChild(iq.buildNode('reason', {'xmlns': NS_MUC_ADMIN}, reason));
+
+ con.send(iq, handleErrorReply);
+ }
+
+ // Reset chatstate
+ chatStateSend('active', xid, hash);
+ }
+
+ // /kick shortcut
+ else if(body.match(/^\/kick (\S+)\s*(.*)/)) {
+ var nick = RegExp.$1;
+ var reason = RegExp.$2;
+ var nXID = getMUCUserXID(xid, nick);
+
+ // We check if the user exists
+ if(!nXID)
+ openThisInfo(6);
+
+ else {
+ // We generate the kick IQ
+ var iq = new JSJaCIQ();
+ iq.setTo(xid);
+ iq.setType('set');
+
+ var iqQuery = iq.setQuery(NS_MUC_ADMIN);
+ var item = iqQuery.appendChild(iq.buildNode('item', {'nick': nick, 'role': 'none', 'xmlns': NS_MUC_ADMIN}));
+
+ if(reason)
+ item.appendChild(iq.buildNode('reason', {'xmlns': NS_MUC_ADMIN}, reason));
+
+ con.send(iq, handleErrorReply);
+ }
+
+ // Reset chatstate
+ chatStateSend('active', xid, hash);
+ }
+
+ // /invite shortcut
+ else if(body.match(/^\/invite (\S+)\s*(.*)/)) {
+ var i_xid = RegExp.$1;
+ var reason = RegExp.$2;
+
+ var x = aMsg.appendNode('x', {'xmlns': NS_MUC_USER});
+ var aNode = x.appendChild(aMsg.buildNode('invite', {'to': i_xid, 'xmlns': NS_MUC_USER}));
+
+ if(reason)
+ aNode.appendChild(aMsg.buildNode('reason', {'xmlns': NS_MUC_USER}, reason));
+
+ con.send(aMsg, handleErrorReply);
+
+ // Reset chatstate
+ chatStateSend('active', xid, hash);
+ }
+
+ // No shortcut, this is a message
+ else {
+ aMsg.setType('groupchat');
+
+ // Chatstate
+ aMsg.appendNode('active', {'xmlns': NS_CHATSTATES});
+
+ generateMessage(aMsg, body, hash);
+
+ con.send(aMsg, handleMessageError);
+
+ logThis('Message sent to: ' + xid + ' / ' + type, 3);
+ }
+ }
+
+ // We reset the message input
+ $('#' + hash + ' .message-area').val('');
+ }
+
+ finally {
+ return false;
+ }
+}
+
+// Generates the correct message area style
+function generateStyle(hash) {
+ // Initialize the vars
+ var styles = '#' + hash + ' div.bubble-style';
+ var checkbox = styles + ' input[type=checkbox]';
+ var color = styles + ' a.color.selected';
+ var style = '';
+
+ // Loop the input values
+ $(checkbox).filter(':checked').each(function() {
+ // If there is a previous element
+ if(style)
+ style += ' ';
+
+ // Get the current style
+ switch($(this).attr('class')) {
+ case 'bold':
+ style += 'font-weight: bold;';
+ break;
+
+ case 'italic':
+ style += 'font-style: italic;';
+ break;
+
+ case 'underline':
+ style += 'text-decoration: underline;';
+ break;
+ }
+ });
+
+ // Get the color value
+ $(color).each(function() {
+ style += 'color: #' + $(this).attr('data-color');
+ });
+
+ return style;
+}
+
+// Generates the correct message code
+function generateMessage(aMsg, body, hash) {
+ // Create the classical body
+ aMsg.setBody(body);
+
+ // Get the style
+ var style = $('#' + hash + ' .message-area').attr('style');
+
+ // A message style is choosen
+ if(style) {
+ // Explode the message body new lines (to create one <p /> element by line)
+ var new_lines = new Array(body);
+
+ if(body.match(/\n/))
+ new_lines = body.split('\n');
+
+ // Create the XML elements
+ var aHtml = aMsg.appendNode('html', {'xmlns': NS_XHTML_IM});
+ var aBody = aHtml.appendChild(aMsg.buildNode('body', {'xmlns': NS_XHTML}));
+
+ // Use the exploded body array to create one element per entry
+ for(i in new_lines) {
+ // Current line
+ var cLine = new_lines[i];
+
+ // Blank line, we put a <br />
+ if(cLine.match(/(^)(\s+)($)/) || !cLine)
+ aBody.appendChild(aMsg.buildNode('br', {'xmlns': NS_XHTML}));
+
+ // Line with content, we put a <p />
+ else {
+ // HTML encode the line
+ cLine = cLine.htmlEnc();
+
+ // Filter the links
+ cLine = applyLinks(cLine, 'xhtml-im', style);
+
+ // Append the filtered line
+ $(aBody).append($('<p style="' + style + '">' + cLine + '</p>'));
+ }
+ }
+
+ return 'XHTML';
+ }
+
+ return 'PLAIN';
+}
+
+// Displays a given message in a chat tab
+function displayMessage(type, xid, hash, name, body, time, stamp, message_type, is_xhtml, nick_quote, mode, id) {
+ // Generate some stuffs
+ var has_avatar = false;
+ var xid_hash = '';
+
+ if(!nick_quote)
+ nick_quote = '';
+
+ if(message_type != 'system-message') {
+ has_avatar = true;
+ xid_hash = hex_md5(xid);
+ }
+
+ // Can scroll?
+ var cont_scroll = document.getElementById('chat-content-' + hash);
+ var can_scroll = false;
+
+ if(!cont_scroll.scrollTop || ((cont_scroll.clientHeight + cont_scroll.scrollTop) == cont_scroll.scrollHeight))
+ can_scroll = true;
+
+ // Any ID?
+ var data_id = '';
+
+ if(id)
+ data_id = ' data-id="' + id + '"';
+
+ // Filter the message
+ var filteredMessage = filterThisMessage(body, name, is_xhtml);
+
+ // Display the received message in the room
+ var messageCode = '<div class="one-line ' + message_type + nick_quote + '"' + data_id + '>';
+
+ // Name color attribute
+ if(type == 'groupchat')
+ attribute = ' style="color: ' + generateColor(name) + ';" class="name';
+ else {
+ attribute = ' class="name';
+
+ if(mode)
+ attribute += ' ' + mode;
+ }
+
+ // Close the class attribute
+ if(message_type == 'system-message')
+ attribute += ' hidden"';
+ else
+ attribute += '"';
+
+ // Filter the previous displayed message
+ var last = $('#' + hash + ' .one-group:last');
+ var last_name = last.find('b.name').attr('data-xid');
+ var last_type = last.attr('data-type');
+ var last_stamp = parseInt(last.attr('data-stamp'));
+ var grouped = false;
+
+ // We can group it with another previous message
+ if((last_name == xid) && (message_type == last_type) && ((stamp - last_stamp) <= 1800))
+ grouped = true;
+
+ // Is it a /me command?
+ if(body.match(/(^|>)(\/me )([^<]+)/))
+ filteredMessage = '<i>' + filteredMessage + '</i>';
+
+ messageCode += filteredMessage + '</div>';
+
+ // Must group it?
+ var group_path = ' .one-group:last';
+
+ if(!grouped) {
+ // Generate message headers
+ var message_head = '';
+
+ // Any avatar to add?
+ if(has_avatar)
+ message_head += '<div class="avatar-container"><img class="avatar" src="' + './img/others/default-avatar.png' + '" alt="" /></div>';
+
+ // Add the date & the name
+ message_head += '<span class="date">' + time + '</span><b data-xid="' + encodeQuotes(xid) + '" ' + attribute + '>' + name + '</b>';
+
+ // Generate message code
+ group_path = '';
+ messageCode = '<div class="one-group ' + xid_hash + '" data-type="' + message_type + '" data-stamp="' + stamp + '">' + message_head + messageCode + '</div>';
+ }
+
+ // Archive message
+ if(hash == 'archives')
+ $('#archives .logs' + group_path).append(messageCode);
+
+ // Instant message
+ else {
+ // Write the code in the DOM
+ $('#' + hash + ' .content' + group_path).append(messageCode);
+
+ // Must get the avatar?
+ if(has_avatar && xid)
+ getAvatar(xid, 'cache', 'true', 'forget');
+ }
+
+ // Scroll to this message
+ if(can_scroll)
+ autoScroll(hash);
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the microblog JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 03/12/11
+
+*/
+
+// Completes arrays of an entry's attached files
+function attachedMicroblog(selector, tFName, tFURL, tFThumb, tFSource, tFType, tFLength, tFEComments, tFNComments) {
+ if($(selector).attr('title'))
+ tFName.push($(selector).attr('title'));
+ else
+ tFName.push('');
+
+ if($(selector).attr('href'))
+ tFURL.push($(selector).attr('href'));
+ else
+ tFURL.push('');
+
+ if($(selector).find('link[rel=self][title=thumb]:first').attr('href'))
+ tFThumb.push($(selector).find('link[rel=self][title=thumb]:first').attr('href'));
+ else
+ tFThumb.push('');
+
+ if($(selector).attr('source'))
+ tFSource.push($(selector).attr('source'));
+ else
+ tFSource.push('');
+
+ if($(selector).attr('type'))
+ tFType.push($(selector).attr('type'));
+ else
+ tFType.push('');
+
+ if($(selector).attr('length'))
+ tFLength.push($(selector).attr('length'));
+ else
+ tFLength.push('');
+
+ // Comments?
+ var comments_href_c = $(selector).find('link[rel=replies][title=comments_file]:first').attr('href');
+
+ if(comments_href_c && comments_href_c.match(/^xmpp:(.+)\?;node=(.+)/)) {
+ tFEComments.push(RegExp.$1);
+ tFNComments.push(decodeURIComponent(RegExp.$2));
+ }
+
+ else {
+ tFEComments.push('');
+ tFNComments.push('');
+ }
+}
+
+// Displays a given microblog item
+function displayMicroblog(packet, from, hash, mode, way) {
+ // Get some values
+ var iParse = $(packet.getNode()).find('items item');
+
+ iParse.each(function() {
+ // Initialize
+ var tTitle, tFiltered, tTime, tDate, tStamp, tBody, tName, tID, tHash, tIndividual, tFEClick;
+
+ // Arrays
+ var tFName = [];
+ var tFURL = [];
+ var tFThumb = [];
+ var tFSource = [];
+ var tFType = [];
+ var tFLength = [];
+ var tFEComments = [];
+ var tFNComments = [];
+ var aFURL = [];
+ var aFCat = [];
+
+ // Get the values
+ tDate = $(this).find('published').text();
+ tBody = $(this).find('body').text();
+ tID = $(this).attr('id');
+ tName = getBuddyName(from);
+ tHash = 'update-' + hex_md5(tName + tDate + tID);
+
+ // Read attached files with a thumb (place them at first)
+ $(this).find('link[rel=enclosure]:has(link[rel=self][title=thumb])').each(function() {
+ attachedMicroblog(this, tFName, tFURL, tFThumb, tFSource, tFType, tFLength, tFEComments, tFNComments);
+ });
+
+ // Read attached files without any thumb
+ $(this).find('link[rel=enclosure]:not(:has(link[rel=self][title=thumb]))').each(function() {
+ attachedMicroblog(this, tFName, tFURL, tFThumb, tFSource, tFType, tFLength, tFEComments, tFNComments);
+ });
+
+ // Get the repeat value
+ var uRepeat = [$(this).find('source author name').text(), explodeThis(':', $(this).find('source author uri').text(), 1)];
+ var uRepeated = false;
+
+ if(!uRepeat[0])
+ uRepeat = [getBuddyName(from), uRepeat[1]];
+ if(!uRepeat[1])
+ uRepeat = [uRepeat[0], from];
+
+ // Repeated?
+ if(uRepeat[1] != from)
+ uRepeated = true;
+
+ // Get the comments node
+ var entityComments, nodeComments;
+
+ // Get the comments
+ var comments_href = $(this).find('link[title=comments]:first').attr('href');
+
+ if(comments_href && comments_href.match(/^xmpp:(.+)\?;node=(.+)/)) {
+ entityComments = RegExp.$1;
+ nodeComments = decodeURIComponent(RegExp.$2);
+ }
+
+ // No comments node?
+ if(!entityComments || !nodeComments) {
+ entityComments = '';
+ nodeComments = '';
+ }
+
+ // Get the stamp & time
+ if(tDate) {
+ tStamp = extractStamp(Date.jab2date(tDate));
+ tTime = relativeDate(tDate);
+ }
+
+ else {
+ tStamp = getTimeStamp();
+ tTime = '';
+ }
+
+ // Get the item geoloc
+ var tGeoloc = '';
+ var sGeoloc = $(this).find('geoloc[xmlns=' + NS_GEOLOC + ']:first');
+ var gLat = sGeoloc.find('lat').text();
+ var gLon = sGeoloc.find('lon').text();
+
+ if(gLat && gLon) {
+ tGeoloc += '<a class="geoloc talk-images" href="http://maps.google.com/?q=' + encodeQuotes(gLat) + ',' + encodeQuotes(gLon) + '" target="_blank">';
+
+ // Human-readable name?
+ var gHuman = humanPosition(
+ sGeoloc.find('locality').text(),
+ sGeoloc.find('region').text(),
+ sGeoloc.find('country').text()
+ );
+
+ if(gHuman)
+ tGeoloc += gHuman.htmlEnc();
+ else
+ tGeoloc += gLat.htmlEnc() + '; ' + gLon.htmlEnc();
+
+ tGeoloc += '</a>';
+ }
+
+ // Retrieve the message body
+ tTitle = $(this).find('content[type=text]').text();
+
+ if(!tTitle) {
+ // Legacy?
+ tTitle = $(this).find('title:not(source > title)').text();
+
+ // Last chance?
+ if(!tTitle)
+ tTitle = tBody;
+ }
+
+ // Trim the content
+ tTitle = trim(tTitle);
+
+ // Any content?
+ if(tTitle) {
+ // Apply links to message body
+ tFiltered = filterThisMessage(tTitle, tName.htmlEnc(), true);
+
+ // Display the received message
+ var html = '<div class="one-update update_' + hash + ' ' + tHash + '" data-stamp="' + encodeQuotes(tStamp) + '" data-id="' + encodeQuotes(tID) + '" data-xid="' + encodeQuotes(from) + '">' +
+ '<div class="' + hash + '">' +
+ '<div class="avatar-container">' +
+ '<img class="avatar" src="' + './img/others/default-avatar.png' + '" alt="" />' +
+ '</div>' +
+ '</div>' +
+
+ '<div class="body">' +
+ '<p>';
+
+ // Is it a repeat?
+ if(uRepeated)
+ html += '<a href="#" class="repeat talk-images" title="' + encodeQuotes(printf(_e("This is a repeat from %s"), uRepeat[0] + ' (' + uRepeat[1] + ')')) + '" onclick="return checkChatCreate(\'' + encodeOnclick(uRepeat[1]) + '\', \'chat\');" data-xid="' + encodeQuotes(uRepeat[1]) + '"></a>';
+
+ html += '<b title="' + from + '" class="name">' + tName.htmlEnc() + '</b> <span>' + tFiltered + '</span></p>' +
+ '<p class="infos">' + tTime + tGeoloc + '</p>';
+
+ // Any file to display?
+ if(tFURL.length)
+ html += '<p class="file">';
+
+ // Generate an array of the files URL
+ for(var a = 0; a < tFURL.length; a++) {
+ // Not enough data?
+ if(!tFURL[a])
+ continue;
+
+ // Push the current URL! (YouTube or file)
+ if(tFURL[a].match(/(\w{3,5})(:)(\S+)((\.youtube\.com\/watch(\?v|\?\S+v|\#\!v|\#\!\S+v)\=)|(youtu\.be\/))([^& ]+)((&\S)|(&\S)|\s|$)/gim)) {
+ aFURL.push(trim(RegExp.$8));
+ aFCat.push('youtube');
+ }
+
+ else if(canIntegrateBox(explodeThis('/', tFType[a], 1))) {
+ aFURL.push(tFURL[a]);
+ aFCat.push(fileCategory(explodeThis('/', tFType[a], 1)));
+ }
+ }
+
+ // Add each file code
+ for(var f = 0; f < tFURL.length; f++) {
+ // Not enough data?
+ if(!tFURL[f])
+ continue;
+
+ // Get the file type
+ var tFExt = explodeThis('/', tFType[f], 1);
+ var tFCat = fileCategory(tFExt);
+ var tFLink = tFURL[f];
+
+ // Youtube video?
+ if(tFLink.match(/(\w{3,5})(:)(\S+)((\.youtube\.com\/watch(\?v|\?\S+v|\#\!v|\#\!\S+v)\=)|(youtu\.be\/))([^& ]+)((&\S)|(&\S)|\s|$)/gim)) {
+ tFLink = trim(RegExp.$8);
+ tFCat = 'youtube';
+ }
+
+ // Supported image/video/sound
+ if(canIntegrateBox(tFExt) || (tFCat == 'youtube'))
+ tFEClick = 'onclick="return applyIntegrateBox(\'' + encodeOnclick(tFLink) + '\', \'' + encodeOnclick(tFCat) + '\', \'' + encodeOnclick(aFURL) + '\', \'' + encodeOnclick(aFCat) + '\', \'' + encodeOnclick(tFEComments) + '\', \'' + encodeOnclick(tFNComments) + '\', \'large\');" ';
+ else
+ tFEClick = '';
+
+ // Any thumbnail?
+ if(tFThumb[f])
+ html += '<a class="thumb" ' + tFEClick + 'href="' + encodeQuotes(tFURL[f]) + '" target="_blank" title="' + encodeQuotes(tFName[f]) + '" data-node="' + encodeQuotes(tFNComments) + '"><img src="' + encodeQuotes(tFThumb[f]) + '" alt="" /></a>';
+ else
+ html += '<a class="' + encodeQuotes(tFCat) + ' link talk-images" ' + tFEClick + 'href="' + encodeQuotes(tFURL[f]) + '" target="_blank" data-node="' + encodeQuotes(tFNComments) + '">' + tFName[f].htmlEnc() + '</a>';
+ }
+
+ if(tFURL.length)
+ html += '</p>';
+
+ // It's my own notice, we can remove it!
+ if(from == getXID())
+ html += '<a href="#" onclick="return removeMicroblog(\'' + encodeOnclick(tID) + '\', \'' + encodeOnclick(tHash) + '\');" title="' + _e("Remove this notice") + '" class="mbtool remove talk-images"></a>';
+
+ // Notice from another user
+ else {
+ // User profile
+ html += '<a href="#" title="' + _e("View profile") + '" class="mbtool profile talk-images" onclick="return openUserInfos(\'' + encodeOnclick(from) + '\');"></a>';
+
+ // If PEP is enabled
+ if(enabledPEP())
+ html += '<a href="#" title="' + _e("Repeat this notice") + '" class="mbtool repost talk-images"></a>';
+ }
+
+ html += '</div><div class="comments-container" data-node="' + encodeQuotes(nodeComments) + '"></div></div>';
+
+ // Mixed mode
+ if((mode == 'mixed') && !exists('.mixed .' + tHash)) {
+ // Remove the old element
+ if(way == 'push')
+ $('#channel .content.mixed .one-update.update_' + hash).remove();
+
+ // Get the nearest element
+ var nearest = sortElementByStamp(tStamp, '#channel .mixed .one-update');
+
+ // Append the content at the right position (date relative)
+ if(nearest == 0)
+ $('#channel .content.mixed').append(html);
+ else
+ $('#channel .one-update[data-stamp=' + nearest + ']:first').before(html);
+
+ // Show the new item
+ if(way == 'push')
+ $('#channel .content.mixed .one-update.' + tHash).fadeIn('fast');
+ else
+ $('#channel .content.mixed .one-update.' + tHash).show();
+
+ // Remove the old notices to make the DOM lighter
+ var oneUpdate = '#channel .content.mixed .one-update';
+
+ if($(oneUpdate).size() > 80)
+ $(oneUpdate + ':last').remove();
+
+ // Click event on avatar/name
+ $('.mixed .' + tHash + ' .avatar-container, .mixed .' + tHash + ' .body b').click(function() {
+ getMicroblog(from, hash);
+ });
+ }
+
+ // Individual mode
+ tIndividual = '#channel .content.individual.microblog-' + hash;
+
+ // Can append individual content?
+ var can_individual = true;
+
+ if($('#channel .top.individual input[name=comments]').val() && exists(tIndividual + ' .one-update'))
+ can_individual = false;
+
+ if(can_individual && exists(tIndividual) && !exists('.individual .' + tHash)) {
+ if(mode == 'mixed')
+ $(tIndividual).prepend(html);
+ else
+ $(tIndividual + ' a.more').before(html);
+
+ // Show the new item
+ if(way == 'push')
+ $('#channel .content.individual .one-update.' + tHash).fadeIn('fast');
+ else
+ $('#channel .content.individual .one-update.' + tHash).show();
+
+ // Make 'more' link visible
+ $(tIndividual + ' a.more').css('visibility', 'visible');
+
+ // Click event on name (if not me!)
+ if(from != getXID())
+ $('.individual .' + tHash + ' .avatar-container, .individual .' + tHash + ' .body b').click(function() {
+ checkChatCreate(from, 'chat');
+ });
+ }
+
+ // Apply the click event
+ $('.' + tHash + ' a.repost:not([data-event=true])').click(function() {
+ return publishMicroblog(tTitle, tFName, tFURL, tFType, tFLength, tFThumb, uRepeat, entityComments, nodeComments, tFEComments, tFNComments);
+ })
+
+ .attr('data-event', 'true');
+
+ // Apply the hover event
+ if(nodeComments)
+ $('.' + mode + ' .' + tHash).hover(function() {
+ showCommentsMicroblog($(this), entityComments, nodeComments, tHash);
+ }, function() {
+ if($(this).find('div.comments a.one-comment.loading').size())
+ $(this).find('div.comments').remove();
+ });
+ }
+ });
+
+ // Display the avatar of this buddy
+ getAvatar(from, 'cache', 'true', 'forget');
+}
+
+// Removes a given microblog item
+function removeMicroblog(id, hash) {
+ /* REF: http://xmpp.org/extensions/xep-0060.html#publisher-delete */
+
+ // Initialize
+ var selector = $('.' + hash);
+ var get_last = false;
+
+ // Get the latest item for the mixed mode
+ if(exists('#channel .content.mixed .' + hash))
+ get_last = true;
+
+ // Remove the item from our DOM
+ selector.fadeOut('fast', function() {
+ $(this).remove();
+ });
+
+ // Send the IQ to remove the item (and get eventual error callback)
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB});
+ var retract = pubsub.appendChild(iq.buildNode('retract', {'node': NS_URN_MBLOG, 'xmlns': NS_PUBSUB}));
+ retract.appendChild(iq.buildNode('item', {'id': id, 'xmlns': NS_PUBSUB}));
+
+ if(get_last)
+ con.send(iq, handleRemoveMicroblog);
+ else
+ con.send(iq, handleErrorReply);
+
+ return false;
+}
+
+// Handles the microblog item removal
+function handleRemoveMicroblog(iq) {
+ // Handle the error reply
+ handleErrorReply(iq);
+
+ // Get the latest item
+ requestMicroblog(getXID(), '1', false, handleUpdateRemoveMicroblog);
+}
+
+// Handles the microblog update
+function handleUpdateRemoveMicroblog(iq) {
+ // Error?
+ if(iq.getType() == 'error')
+ return;
+
+ // Initialize
+ var xid = bareXID(getStanzaFrom(iq));
+ var hash = hex_md5(xid);
+
+ // Display the item!
+ displayMicroblog(iq, xid, hash, 'mixed', 'push');
+}
+
+// Gets a given microblog comments node
+function getCommentsMicroblog(server, node, id) {
+ /* REF: http://xmpp.org/extensions/xep-0060.html#subscriber-retrieve-requestall */
+
+ var iq = new JSJaCIQ();
+ iq.setType('get');
+ iq.setID('get_' + genID() + '-' + id);
+ iq.setTo(server);
+
+ var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB});
+ pubsub.appendChild(iq.buildNode('items', {'node': node, 'xmlns': NS_PUBSUB}));
+
+ con.send(iq, handleCommentsMicroblog);
+
+ return false;
+}
+
+// Handles a microblog comments node items
+function handleCommentsMicroblog(iq) {
+ // Path
+ var id = explodeThis('-', iq.getID(), 1);
+ var path = 'div.comments[data-id=' + id + '] div.comments-content';
+
+ // Does not exist?
+ if(!exists(path))
+ return false;
+
+ // Any error?
+ if(handleErrorReply(iq)) {
+ $(path).html('<div class="one-comment loading">' + _e("Could not get the comments!") + '</div>');
+
+ return false;
+ }
+
+ // Initialize
+ var data = iq.getNode();
+ var server = bareXID(getStanzaFrom(iq));
+ var node = $(data).find('items:first').attr('node');
+ var users_xid = [];
+ var code = '';
+
+ // No node?
+ if(!node)
+ node = $(data).find('publish:first').attr('node');
+
+ // Get the parent microblog item
+ var parent_select = $('#channel .one-update:has(*[data-node=' + node + '])');
+ var parent_data = [parent_select.attr('data-xid'), NS_URN_MBLOG, parent_select.attr('data-id')];
+
+ // Get the owner XID
+ var owner_xid = parent_select.attr('data-xid');
+ var repeat_xid = parent_select.find('a.repeat').attr('data-xid');
+
+ // Must we create the complete DOM?
+ var complete = true;
+
+ if($(path).find('.one-comment.compose').size())
+ complete = false;
+
+ // Add the comment tool
+ if(complete)
+ code += '<div class="one-comment compose">' +
+ '<span class="icon talk-images"></span><input type="text" placeholder="' + _e("Type your comment here...") + '" />' +
+ '</div>';
+
+ // Append the comments
+ $(data).find('item').each(function() {
+ // Get comment
+ var current_id = $(this).attr('id');
+ var current_xid = explodeThis(':', $(this).find('source author uri').text(), 1);
+ var current_name = $(this).find('source author name').text();
+ var current_date = $(this).find('published').text();
+ var current_body = $(this).find('content[type=text]').text();
+ var current_bname = getBuddyName(current_xid);
+
+ // Legacy?
+ if(!current_body)
+ current_body = $(this).find('title:not(source > title)').text();
+
+ // Yet displayed? (continue the loop)
+ if($(path).find('.one-comment[data-id=' + current_id + ']').size())
+ return;
+
+ // No XID?
+ if(!current_xid) {
+ current_xid = '';
+
+ if(!current_name)
+ current_name = _e("unknown");
+ }
+
+ else if(!current_name || (current_bname != getXIDNick(current_xid)))
+ current_name = current_bname;
+
+ // Any date?
+ if(current_date)
+ current_date = relativeDate(current_date);
+ else
+ current_date = getCompleteTime();
+
+ // Click event
+ var onclick = 'false';
+
+ if(current_xid != getXID())
+ onclick = 'checkChatCreate(\'' + encodeOnclick(current_xid) + '\', \'chat\')';
+
+ // If this is my comment, add a marker
+ var type = 'him';
+ var marker = '';
+ var remove = '';
+
+ if(current_xid == getXID()) {
+ type = 'me';
+ marker = '<div class="marker"></div>';
+ remove = '<a href="#" class="remove" onclick="return removeCommentMicroblog(\'' + encodeOnclick(server) + '\', \'' + encodeOnclick(node) + '\', \'' + encodeOnclick(current_id) + '\');">' + _e("Remove") + '</a>';
+ }
+
+ // New comment?
+ var new_class = '';
+
+ if(!complete)
+ new_class = ' new';
+
+ // Add the comment
+ if(current_body) {
+ // Add the XID
+ if(!existArrayValue(users_xid, current_xid))
+ users_xid.push(current_xid);
+
+ // Add the HTML code
+ code += '<div class="one-comment ' + hex_md5(current_xid) + ' ' + type + new_class + '" data-id="' + encodeQuotes(current_id) + '">' +
+ marker +
+
+ '<div class="avatar-container" onclick="return ' + onclick + ';">' +
+ '<img class="avatar" src="' + './img/others/default-avatar.png' + '" alt="" />' +
+ '</div>' +
+
+ '<div class="comment-container">' +
+ '<a href="#" onclick="return ' + onclick + ';" title="' + encodeQuotes(current_xid) + '" class="name">' + current_name.htmlEnc() + '</a>' +
+ '<span class="date">' + current_date.htmlEnc() + '</span>' +
+ remove +
+
+ '<p class="body">' + filterThisMessage(current_body, current_name, true) + '</p>' +
+ '</div>' +
+
+ '<div class="clear"></div>' +
+ '</div>';
+ }
+ });
+
+ // Add the HTML
+ if(complete) {
+ $(path).html(code);
+
+ // Focus on the compose input
+ $(document).oneTime(10, function() {
+ $(path).find('.one-comment.compose input').focus();
+ });
+ }
+
+ else {
+ $(path).find('.one-comment.compose').after(code);
+
+ // Beautiful effect
+ $(path).find('.one-comment.new').slideDown('fast', function() {
+ adaptCommentMicroblog(id);
+ }).removeClass('new');
+ }
+
+ // Set the good widths
+ adaptCommentMicroblog(id);
+
+ // Get the avatars
+ for(a in users_xid)
+ getAvatar(users_xid[a], 'cache', 'true', 'forget');
+
+ // Add the owner XID
+ if(owner_xid && owner_xid.match('@') && !existArrayValue(users_xid, owner_xid))
+ users_xid.push(owner_xid);
+
+ // Add the repeated from XID
+ if(repeat_xid && repeat_xid.match('@') && !existArrayValue(users_xid, repeat_xid))
+ users_xid.push(repeat_xid);
+
+ // Remove my own XID
+ removeArrayValue(users_xid, getXID());
+
+ // DOM events
+ if(complete) {
+ // Update timer
+ $(path).everyTime('60s', function() {
+ getCommentsMicroblog(server, node, id);
+
+ logThis('Updating comments node: ' + node + ' on ' + server + '...');
+ });
+
+ // Input key event
+ $(path).find('.one-comment.compose input').placeholder()
+ .keyup(function(e) {
+ if((e.keyCode == 13) && $(this).val()) {
+ // Send the comment!
+ sendCommentMicroblog($(this).val(), server, node, id, users_xid, parent_data);
+
+ // Reset the input value
+ $(this).val('');
+
+ return false;
+ }
+ });
+ }
+}
+
+// Shows the microblog comments box
+function showCommentsMicroblog(path, entityComments, nodeComments, tHash) {
+ // Do not display it twice!
+ if(path.find('div.comments').size())
+ return;
+
+ // Generate an unique ID
+ var idComments = genID();
+
+ // Create comments container
+ path.find('div.comments-container').append(
+ '<div class="comments" data-id="' + encodeQuotes(idComments) + '">' +
+ '<div class="arrow talk-images"></div>' +
+ '<div class="comments-content">' +
+ '<a href="#" class="one-comment loading"><span class="icon talk-images"></span>' + _e("Show comments") + '</a>' +
+ '</div>' +
+ '</div>'
+ );
+
+ // Click event
+ path.find('div.comments a.one-comment').click(function() {
+ // Set loading info
+ $(this).parent().html('<div class="one-comment loading"><span class="icon talk-images"></span>' + _e("Loading comments...") + '</div>');
+
+ // Request comments
+ getCommentsMicroblog(entityComments, nodeComments, idComments);
+
+ // Remove the comments from the DOM if click away
+ if(tHash) {
+ $('#channel').die('click');
+
+ $('#channel').live('click', function(evt) {
+ if(!$(evt.target).parents('.' + tHash).size()) {
+ $('#channel').die('click');
+ $('#channel .one-update div.comments-content').stopTime();
+ $('#channel .one-update div.comments').remove();
+ }
+ });
+ }
+
+ return false;
+ });
+}
+
+// Sends a comment on a given microblog comments node
+function sendCommentMicroblog(value, server, node, id, notifiy_arr, parent_data) {
+ /* REF: http://xmpp.org/extensions/xep-0060.html#publisher-publish */
+
+ // Not enough data?
+ if(!value || !server || !node)
+ return false;
+
+ // Get some values
+ var date = getXMPPTime('utc');
+ var hash = hex_md5(value + date);
+
+ // New IQ
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+ iq.setTo(server);
+ iq.setID('set_' + genID() + '-' + id);
+
+ // PubSub main elements
+ var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB});
+ var publish = pubsub.appendChild(iq.buildNode('publish', {'node': node, 'xmlns': NS_PUBSUB}));
+ var item = publish.appendChild(iq.buildNode('item', {'id': hash, 'xmlns': NS_PUBSUB}));
+ var entry = item.appendChild(iq.buildNode('entry', {'xmlns': NS_ATOM}));
+
+ // Author infos
+ var Source = entry.appendChild(iq.buildNode('source', {'xmlns': NS_ATOM}));
+ var author = Source.appendChild(iq.buildNode('author', {'xmlns': NS_ATOM}));
+ author.appendChild(iq.buildNode('name', {'xmlns': NS_ATOM}, getName()));
+ author.appendChild(iq.buildNode('uri', {'xmlns': NS_ATOM}, 'xmpp:' + getXID()));
+
+ // Create the comment
+ entry.appendChild(iq.buildNode('content', {'type': 'text', 'xmlns': NS_ATOM}, value));
+ entry.appendChild(iq.buildNode('published', {'xmlns': NS_ATOM}, date));
+
+ con.send(iq);
+
+ // Handle this comment!
+ iq.setFrom(server);
+ handleCommentsMicroblog(iq);
+
+ // Notify users
+ if(notifiy_arr && notifiy_arr.length) {
+ // XMPP link to the item
+ var href = 'xmpp:' + server + '?;node=' + encodeURIComponent(node) + ';item=' + encodeURIComponent(hash);
+
+ // Loop!
+ for(n in notifiy_arr)
+ sendNotification(notifiy_arr[n], 'comment', href, value, parent_data);
+ }
+
+ return false;
+}
+
+// Removes a given microblog comment item
+function removeCommentMicroblog(server, node, id) {
+ /* REF: http://xmpp.org/extensions/xep-0060.html#publisher-delete */
+
+ // Remove the item from our DOM
+ $('.one-comment[data-id=' + id + ']').slideUp('fast', function() {
+ // Get the parent ID
+ var parent_id = $(this).parents('div.comments').attr('data-id');
+
+ // Remove it!
+ $(this).remove();
+
+ // Adapt the width
+ adaptCommentMicroblog(parent_id);
+ });
+
+ // Send the IQ to remove the item (and get eventual error callback)
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+ iq.setTo(server);
+
+ var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB});
+ var retract = pubsub.appendChild(iq.buildNode('retract', {'node': node, 'xmlns': NS_PUBSUB}));
+ retract.appendChild(iq.buildNode('item', {'id': id, 'xmlns': NS_PUBSUB}));
+
+ con.send(iq);
+
+ return false;
+}
+
+// Adapts the comment elements width
+function adaptCommentMicroblog(id) {
+ var selector = $('div.comments[data-id=' + id + '] div.comments-content');
+ var selector_width = selector.width();
+
+ // Change widths
+ selector.find('.one-comment.compose input').css('width', selector_width - 60);
+ selector.find('.one-comment .comment-container').css('width', selector_width - 55);
+}
+
+// Handles the microblog of an user
+function handleMicroblog(iq) {
+ // Get the from attribute of this IQ
+ var from = bareXID(getStanzaFrom(iq));
+
+ // Define the selector path
+ var selector = '#channel .top.individual input[name=';
+
+ // Is this request still alive?
+ if(from == $(selector + 'jid]').val()) {
+ var hash = hex_md5(from);
+
+ // Update the items counter
+ var old_count = parseInt($(selector + 'counter]').val());
+ $(selector + 'counter]').val(old_count + 20);
+
+ // Display the microblog
+ displayMicroblog(iq, from, hash, 'individual', 'request');
+
+ // Hide the waiting icon
+ if(enabledPEP())
+ waitMicroblog('sync');
+ else
+ waitMicroblog('unsync');
+
+ // Hide the 'more items' link?
+ if($(iq.getNode()).find('item').size() < old_count)
+ $('#channel .individual a.more').remove();
+
+ // Get the comments?
+ var comments_node = $('#channel .top.individual input[name=comments]').val();
+
+ if(comments_node && comments_node.match(/^xmpp:(.+)\?;node=(.+);item=(.+)/)) {
+ // Get the values
+ var comments_entity = RegExp.$1;
+ comments_node = decodeURIComponent(RegExp.$2);
+
+ // Selectors
+ var file_link = $('#channel .individual .one-update p.file a[data-node=' + comments_node + ']');
+ var entry_link = $('#channel .individual .one-update:has(*[data-node=' + comments_node + '])');
+
+ // Is it a file?
+ if(file_link.size())
+ file_link.click();
+
+ // Is it a microblog entry?
+ else if(entry_link.size()) {
+ showCommentsMicroblog(entry_link, comments_entity, comments_node);
+ entry_link.find('a.one-comment').click();
+ }
+ }
+ }
+
+ logThis('Microblog got: ' + from, 3);
+}
+
+// Resets the microblog elements
+function resetMicroblog() {
+ // Reset everything
+ $('#channel .individual .one-update div.comments-content').stopTime();
+ $('#channel .individual').remove();
+ $('#channel .mixed').show();
+
+ // Hide the waiting icon
+ if(enabledPEP())
+ waitMicroblog('sync');
+ else
+ waitMicroblog('unsync');
+
+ return false;
+}
+
+// Gets the user's microblog to check it exists
+function getInitMicroblog() {
+ getMicroblog(getXID(), hex_md5(getXID()), true);
+}
+
+// Handles the user's microblog to create it in case of error
+function handleInitMicroblog(iq) {
+ // Any error?
+ if((iq.getType() == 'error') && $(iq.getNode()).find('item-not-found').size()) {
+ // The node may not exist, create it!
+ setupMicroblog('', NS_URN_MBLOG, '1', '1000000', '', '', true);
+
+ logThis('Error while getting microblog, trying to reconfigure the Pubsub node!', 2);
+ }
+}
+
+// Requests an user's microblog
+function requestMicroblog(xid, items, get_item, handler) {
+ // Ask the server the user's microblog
+ var iq = new JSJaCIQ();
+ iq.setType('get');
+ iq.setTo(xid);
+
+ var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB});
+ var ps_items = pubsub.appendChild(iq.buildNode('items', {'node': NS_URN_MBLOG, 'xmlns': NS_PUBSUB}));
+
+ // Request a particular item?
+ if(get_item)
+ ps_items.appendChild(iq.buildNode('item', {'id': get_item, 'xmlns': NS_PUBSUB}));
+ else
+ ps_items.setAttribute('max_items', items);
+
+ if(handler)
+ con.send(iq, handler);
+ else
+ con.send(iq, handleMicroblog);
+
+ return false;
+}
+
+// Gets the microblog of an user
+function getMicroblog(xid, hash, check) {
+ /* REF: http://xmpp.org/extensions/xep-0060.html#subscriber-retrieve */
+
+ logThis('Get the microblog: ' + xid, 3);
+
+ // Fire the wait event
+ waitMicroblog('fetch');
+
+ // XMPP URI?
+ var get_item = '';
+
+ if(xid.match(/^xmpp:(.+)\?;node=(.+);item=(.+)/)) {
+ xid = RegExp.$1;
+ get_item = decodeURIComponent(RegExp.$3);
+ }
+
+ // No hash?
+ if(!hash)
+ hash = hex_md5(xid);
+
+ // Can display the individual channel?
+ if(!check && !exists('#channel .individual')) {
+ // Hide the mixed channel
+ $('#channel .mixed').hide();
+
+ // Get the channel title depending on the XID
+ var cTitle;
+ var cShortcuts = '';
+
+ if(xid == getXID())
+ cTitle = _e("Your channel");
+ else {
+ cTitle = _e("Channel of") + ' ' + getBuddyName(xid).htmlEnc();
+ cShortcuts = '<div class="shortcuts">' +
+ '<a href="#" class="message talk-images" title="' + _e("Send him/her a message") + '" onclick="return composeInboxMessage(\'' + encodeOnclick(xid) + '\');"></a>' +
+ '<a href="#" class="chat talk-images" title="' + _e("Start a chat with him/her") + '" onclick="return checkChatCreate(\'' + encodeOnclick(xid) + '\', \'chat\');"></a>' +
+ '<a href="#" class="command talk-images" title="' + _e("Command") + '" onclick="return retrieveAdHoc(\'' + encodeOnclick(xid) + '\');"></a>' +
+ '<a href="#" class="profile talk-images" title="' + _e("Show user profile") + '" onclick="return openUserInfos(\'' + encodeOnclick(xid) + '\');"></a>' +
+ '</div>';
+ }
+
+ // Create a new individual channel
+ $('#channel .content.mixed').after(
+ '<div class="content individual microblog-' + hash + '">' +
+ '<a href="#" class="more home-images" onclick="return getMicroblog(\'' + encodeOnclick(xid) + '\', \'' + encodeOnclick(hash) + '\');">' + _e("More notices...") + '</a>' +
+ '</div>'
+ )
+
+ .before(
+ '<div class="top individual ' + hash + '">' +
+ '<div class="avatar-container">' +
+ '<img class="avatar" src="' + './img/others/default-avatar.png' + '" alt="" />' +
+ '</div>' +
+
+ '<div class="update">' +
+ '<h2>' + cTitle + '</h2>' +
+ '<a href="#" onclick="return resetMicroblog();">Ā« ' + _e("Previous") + '</a>' +
+ '</div>' +
+
+ cShortcuts +
+
+ '<input type="hidden" name="jid" value="' + encodeQuotes(xid) + '" />' +
+ '<input type="hidden" name="counter" value="20" />' +
+ '</div>'
+ );
+
+ // Display the user avatar
+ getAvatar(xid, 'cache', 'true', 'forget');
+ }
+
+ // Get the number of items to retrieve
+ var items = '0';
+
+ if(!check)
+ items = $('#channel .top.individual input[name=counter]').val();
+
+ // Request
+ if(check)
+ requestMicroblog(xid, items, get_item, handleInitMicroblog);
+ else
+ requestMicroblog(xid, items, get_item, handleMicroblog);
+
+ return false;
+}
+
+// Show a given microblog waiting status
+function waitMicroblog(type) {
+ // First hide all the infos elements
+ $('#channel .footer div').hide();
+
+ // Display the good one
+ $('#channel .footer div.' + type).show();
+
+ // Depending on the type, disable/enable certain tools
+ var selector = $('#channel .top input[name=microblog_body]');
+
+ if(type == 'unsync')
+ selector.attr('disabled', true);
+ else if(type == 'sync')
+ $(document).oneTime(10, function() {
+ selector.removeAttr('disabled').focus();
+ });
+}
+
+// Setups a new microblog
+function setupMicroblog(entity, node, persist, maximum, access, publish, create) {
+ /* REF: http://xmpp.org/extensions/xep-0060.html#owner-create-and-configure */
+
+ // Create the PubSub node
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ // Any external entity?
+ if(entity)
+ iq.setTo(entity);
+
+ // Create it?
+ if(create) {
+ var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB});
+ pubsub.appendChild(iq.buildNode('create', {'xmlns': NS_PUBSUB, 'node': node}));
+ }
+
+ else
+ var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB_OWNER});
+
+ // Configure it!
+ var configure = pubsub.appendChild(iq.buildNode('configure', {'node': node, 'xmlns': NS_PUBSUB}));
+ var x = configure.appendChild(iq.buildNode('x', {'xmlns': NS_XDATA, 'type': 'submit'}));
+
+ var field1 = x.appendChild(iq.buildNode('field', {'var': 'FORM_TYPE', 'type': 'hidden', 'xmlns': NS_XDATA}));
+ field1.appendChild(iq.buildNode('value', {'xmlns': NS_XDATA}, NS_PUBSUB_NC));
+
+ // Persist items?
+ if(persist) {
+ var field2 = x.appendChild(iq.buildNode('field', {'var': 'pubsub#persist_items', 'xmlns': NS_XDATA}));
+ field2.appendChild(iq.buildNode('value', {'xmlns': NS_XDATA}, persist));
+ }
+
+ // Maximum items?
+ if(maximum) {
+ var field3 = x.appendChild(iq.buildNode('field', {'var': 'pubsub#max_items', 'xmlns': NS_XDATA}));
+ field3.appendChild(iq.buildNode('value', {'xmlns': NS_XDATA}, maximum));
+ }
+
+ // Access rights?
+ if(access) {
+ var field4 = x.appendChild(iq.buildNode('field', {'var': 'pubsub#access_model', 'xmlns': NS_XDATA}));
+ field4.appendChild(iq.buildNode('value', {'xmlns': NS_XDATA}, access));
+ }
+
+ // Publish rights?
+ if(publish) {
+ var field5 = x.appendChild(iq.buildNode('field', {'var': 'pubsub#publish_model', 'xmlns': NS_XDATA}));
+ field5.appendChild(iq.buildNode('value', {'xmlns': NS_XDATA}, publish));
+ }
+
+ con.send(iq);
+}
+
+// Gets the microblog configuration
+function getConfigMicroblog() {
+ // Lock the microblog options
+ $('#persistent, #maxnotices').attr('disabled', true);
+
+ // Get the microblog configuration
+ var iq = new JSJaCIQ();
+ iq.setType('get');
+
+ var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB_OWNER});
+ pubsub.appendChild(iq.buildNode('configure', {'node': NS_URN_MBLOG, 'xmlns': NS_PUBSUB_OWNER}));
+
+ con.send(iq, handleGetConfigMicroblog);
+}
+
+// Handles the microblog configuration
+function handleGetConfigMicroblog(iq) {
+ // Reset the options stuffs
+ waitOptions('microblog');
+
+ // Unlock the microblog options
+ $('#persistent, #maxnotices').removeAttr('disabled');
+
+ // End if not a result
+ if(!iq || (iq.getType() != 'result'))
+ return;
+
+ // Initialize the values
+ var selector = $(iq.getNode());
+ var persistent = '0';
+ var maxnotices = '1000000';
+
+ // Get the values
+ var xPersistent = selector.find('field[var=pubsub#persist_items] value:first').text();
+ var xMaxnotices = selector.find('field[var=pubsub#max_items] value:first').text();
+
+ // Any value?
+ if(xPersistent)
+ persistent = xPersistent;
+
+ if(xMaxnotices)
+ maxnotices = xMaxnotices;
+
+ // Change the maxnotices value
+ switch(maxnotices) {
+ case '1':
+ case '100':
+ case '1000':
+ case '10000':
+ case '100000':
+ case '1000000':
+ break;
+
+ default:
+ maxnotices = '1000000';
+ break;
+ }
+
+ // Apply persistent value
+ if(persistent == '0')
+ $('#persistent').attr('checked', false);
+ else
+ $('#persistent').attr('checked', true);
+
+ // Apply maxnotices value
+ $('#maxnotices').val(maxnotices);
+}
+
+// Handles the user's microblog
+function handleMyMicroblog(packet) {
+ // Reset the entire form
+ $('#channel .top input[name=microblog_body]').removeAttr('disabled').val('');
+ $('#channel .top input[name=microblog_body]').placeholder();
+ unattachMicroblog();
+
+ // Check for errors
+ handleErrorReply(packet);
+}
+
+// Performs the microblog sender checks
+function sendMicroblog() {
+ logThis('Send a new microblog item', 3);
+
+ // Avoid nasty errors
+ try {
+ // Get the values
+ var selector = $('#channel .top input[name=microblog_body]');
+ var body = trim(selector.val());
+
+ // Sufficient parameters
+ if(body) {
+ // Disable & blur our input
+ selector.attr('disabled', true).blur();
+
+ // Files array
+ var fName = [];
+ var fType = [];
+ var fLength = [];
+ var fURL = [];
+ var fThumb = [];
+
+ // Read the files
+ $('#attach .one-file').each(function() {
+ // Push the values!
+ fName.push($(this).find('a.link').text());
+ fType.push($(this).attr('data-type'));
+ fLength.push($(this).attr('data-length'));
+ fURL.push($(this).find('a.link').attr('href'));
+ fThumb.push($(this).attr('data-thumb'));
+ });
+
+ // Containing YouTube videos?
+ var yt_matches = body.match(/(\w{3,5})(:)(\S+)((\.youtube\.com\/watch(\?v|\?\S+v|\#\!v|\#\!\S+v)\=)|(youtu\.be\/))([^& ]+)((&\S)|(&\S)|\s|$)/gim);
+
+ for(y in yt_matches) {
+ fName.push('');
+ fType.push('text/html');
+ fLength.push('');
+ fURL.push(trim(yt_matches[y]));
+ fThumb.push('https://img.youtube.com/vi/' + trim(yt_matches[y].replace(/(\w{3,5})(:)(\S+)((\.youtube\.com\/watch(\?v|\?\S+v|\#\!v|\#\!\S+v)\=)|(youtu\.be\/))([^& ]+)((&\S)|(&\S)|\s|$)/gim, '$8')) + '/0.jpg');
+ }
+
+ // Send the message on the XMPP network
+ publishMicroblog(body, fName, fURL, fType, fLength, fThumb);
+ }
+ }
+
+ // Return false (security)
+ finally {
+ return false;
+ }
+}
+
+// Publishes a given microblog item
+function publishMicroblog(body, attachedname, attachedurl, attachedtype, attachedlength, attachedthumb, repeat, comments_entity, comments_node, comments_entity_file, comments_node_file) {
+ /* REF: http://xmpp.org/extensions/xep-0277.html */
+
+ // Generate some values
+ var time = getXMPPTime('utc');
+ var id = hex_md5(body + time);
+ var nick = getName();
+ var xid = getXID();
+
+ // Define repeat options
+ var author_nick = nick;
+ var author_xid = xid;
+
+ if(repeat && repeat.length) {
+ author_nick = repeat[0];
+ author_xid = repeat[1];
+ }
+
+ // Define comments options
+ var node_create = false;
+
+ if(!comments_entity || !comments_node) {
+ node_create = true;
+ comments_entity = HOST_PUBSUB;
+ comments_node = NS_URN_MBLOG + ':comments/' + id;
+ }
+
+ if(!comments_entity_file)
+ comments_entity_file = [];
+ if(!comments_node_file)
+ comments_node_file = [];
+
+ // Don't create another comments node if only 1 file is attached
+ if(attachedurl && (attachedurl.length == 1) && (!comments_entity_file[0] || !comments_node_file[0])) {
+ comments_entity_file = [comments_entity];
+ comments_node_file = [comments_node];
+ }
+
+ // New IQ
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+ iq.setTo(xid);
+
+ // Create the main XML nodes/childs
+ var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB});
+ var publish = pubsub.appendChild(iq.buildNode('publish', {'node': NS_URN_MBLOG, 'xmlns': NS_PUBSUB}));
+ var item = publish.appendChild(iq.buildNode('item', {'id': id, 'xmlns': NS_PUBSUB}));
+ var entry = item.appendChild(iq.buildNode('entry', {'xmlns': NS_ATOM}));
+
+ // Create the XML source childs
+ var Source = entry.appendChild(iq.buildNode('source', {'xmlns': NS_ATOM}));
+ var author = Source.appendChild(iq.buildNode('author', {'xmlns': NS_ATOM}));
+ author.appendChild(iq.buildNode('name', {'xmlns': NS_ATOM}, author_nick));
+ author.appendChild(iq.buildNode('uri', {'xmlns': NS_ATOM}, 'xmpp:' + author_xid));
+
+ // Create the XML entry childs
+ entry.appendChild(iq.buildNode('content', {'type': 'text', 'xmlns': NS_ATOM}, body));
+ entry.appendChild(iq.buildNode('published', {'xmlns': NS_ATOM}, time));
+ entry.appendChild(iq.buildNode('updated', {'xmlns': NS_ATOM}, time));
+ entry.appendChild(iq.buildNode('link', {
+ 'rel': 'alternate',
+ 'href': 'xmpp:' + xid + '?;node=' + encodeURIComponent(NS_URN_MBLOG) + ';item=' + encodeURIComponent(id),
+ 'xmlns': NS_ATOM
+ }));
+
+ // Create the attached files nodes
+ for(var i = 0; i < attachedurl.length; i++) {
+ // Not enough data?
+ if(!attachedurl[i])
+ continue;
+
+ // Append a new file element
+ var file = entry.appendChild(iq.buildNode('link', {'xmlns': NS_ATOM, 'rel': 'enclosure', 'href': attachedurl[i]}));
+
+ // Add attributes
+ if(attachedname[i])
+ file.setAttribute('title', attachedname[i]);
+ if(attachedtype[i])
+ file.setAttribute('type', attachedtype[i]);
+ if(attachedlength[i])
+ file.setAttribute('length', attachedlength[i]);
+
+ // Any thumbnail?
+ if(attachedthumb[i])
+ file.appendChild(iq.buildNode('link', {'xmlns': NS_URN_MBLOG, 'rel': 'self', 'title': 'thumb', 'type': attachedtype[i], 'href': attachedthumb[i]}));
+
+ // Any comments node?
+ if(!comments_entity_file[i] || !comments_node_file[i]) {
+ // Generate values
+ comments_entity_file[i] = HOST_PUBSUB;
+ comments_node_file[i] = NS_URN_MBLOG + ':comments/' + hex_md5(attachedurl[i] + attachedname[i] + attachedtype[i] + attachedlength[i] + time);
+
+ // Create the node
+ setupMicroblog(comments_entity_file[i], comments_node_file[i], '1', '1000000', 'open', 'open', true);
+ }
+
+ file.appendChild(iq.buildNode('link', {'xmlns': NS_URN_MBLOG, 'rel': 'replies', 'title': 'comments_file', 'href': 'xmpp:' + comments_entity_file[i] + '?;node=' + encodeURIComponent(comments_node_file[i])}));
+ }
+
+ // Create the comments child
+ entry.appendChild(iq.buildNode('link', {'xmlns': NS_ATOM, 'rel': 'replies', 'title': 'comments', 'href': 'xmpp:' + comments_entity + '?;node=' + encodeURIComponent(comments_node)}));
+
+ // Create the geoloc child
+ var geoloc_xml = getDB('geolocation', 'now');
+
+ if(geoloc_xml) {
+ // Create two position arrays
+ var geo_names = ['lat', 'lon', 'country', 'countrycode', 'region', 'postalcode', 'locality', 'street', 'building', 'text', 'uri', 'timestamp'];
+ var geo_values = parsePosition(XMLFromString(geoloc_xml));
+
+ // New geoloc child
+ var geoloc = entry.appendChild(iq.buildNode('geoloc', {'xmlns': NS_GEOLOC}));
+
+ // Append the geoloc content
+ for(var g = 0; g < geo_names.length; g++) {
+ if(geo_names[g] && geo_values[g])
+ geoloc.appendChild(iq.buildNode(geo_names[g], {'xmlns': NS_GEOLOC}, geo_values[g]));
+ }
+ }
+
+ // Send the IQ
+ con.send(iq, handleMyMicroblog);
+
+ // Create the XML comments PubSub nodes
+ if(node_create)
+ setupMicroblog(comments_entity, comments_node, '1', '1000000', 'open', 'open', true);
+
+ return false;
+}
+
+// Attaches a file to a microblog post
+function attachMicroblog() {
+ // File upload vars
+ var attach_options = {
+ dataType: 'xml',
+ beforeSubmit: waitMicroblogAttach,
+ success: handleMicroblogAttach
+ };
+
+ // Upload form submit event
+ $('#attach').submit(function() {
+ if(!exists('#attach .wait') && $('#attach input[type=file]').val())
+ $(this).ajaxSubmit(attach_options);
+
+ return false;
+ });
+
+ // Upload input change event
+ $('#attach input[type=file]').change(function() {
+ if(!exists('#attach .wait') && $(this).val())
+ $('#attach').ajaxSubmit(attach_options);
+
+ return false;
+ });
+}
+
+// Unattaches a microblog file
+function unattachMicroblog(id) {
+ // Individual removal?
+ if(id)
+ $('#attach .one-file[data-id=' + id + ']').remove();
+ else
+ $('#attach .one-file').remove();
+
+ // Must enable the popup again?
+ if(!exists('#attach .one-file')) {
+ // Restore the bubble class
+ $('#attach').addClass('bubble');
+
+ // Enable the bubble click events
+ if(id) {
+ $('#attach').hide();
+ showBubble('#attach');
+ }
+
+ else
+ closeBubbles();
+ }
+
+ return false;
+}
+
+// Wait event for file attaching
+function waitMicroblogAttach() {
+ // Append the wait icon
+ $('#attach input[type=submit]').after('<div class="wait wait-medium"></div>');
+
+ // Lock the bubble
+ $('#attach').removeClass('bubble');
+}
+
+// Success event for file attaching
+function handleMicroblogAttach(responseXML) {
+ // Data selector
+ var dData = $(responseXML).find('jappix');
+
+ // Process the returned data
+ if(!dData.find('error').size()) {
+ // Do not allow this bubble to be hidden
+ $('#attach').removeClass('bubble');
+
+ // Get the file values
+ var fName = dData.find('title').text();
+ var fType = dData.find('type').text();
+ var fLength = dData.find('length').text();
+ var fURL = dData.find('href').text();
+ var fThumb = dData.find('thumb').text();
+
+ // Generate a file ID
+ var fID = hex_md5(fURL);
+
+ // Add this file
+ $('#attach .attach-subitem').append(
+ '<div class="one-file" data-type="' + encodeQuotes(fType) + '" data-length="' + encodeQuotes(fLength) + '" data-thumb="' + encodeQuotes(fThumb) + '" data-id="' + fID + '">' +
+ '<a class="remove talk-images" href="#" title="' + encodeQuotes(_e("Unattach the file")) + '"></a>' +
+ '<a class="link" href="' + encodeQuotes(fURL) + '" target="_blank">' + fName.htmlEnc() + '</a>' +
+ '</div>'
+ );
+
+ // Click event
+ $('#attach .one-file[data-id=' + fID + '] a.remove').click(function() {
+ return unattachMicroblog(fID);
+ });
+
+ logThis('File attached.', 3);
+ }
+
+ // Any error?
+ else {
+ openThisError(4);
+
+ // Unlock the bubble?
+ if(!exists('#attach .one-file')) {
+ $('#attach').addClass('bubble').hide();
+
+ // Show the bubble again!
+ showBubble('#attach');
+ }
+
+ logThis('Error while attaching the file: ' + dData.find('error').text(), 1);
+ }
+
+ // Reset the attach bubble
+ $('#attach input[type=file]').val('');
+ $('#attach .wait').remove();
+
+ // Focus on the text input
+ $(document).oneTime(10, function() {
+ $('#channel .top input[name=microblog_body]').focus();
+ });
+}
+
+// Shows the microblog of an user from his infos
+function fromInfosMicroblog(xid, hash) {
+ // Renitialize the channel
+ resetMicroblog();
+
+ // Switch to the channel
+ switchChan('channel');
+
+ // Get the microblog
+ getMicroblog(xid, hash);
+}
+
+// Plugin launcher
+function launchMicroblog() {
+ // Keyboard event
+ $('#channel .top input[name=microblog_body]').keyup(function(e) {
+ // Enter pressed: send the microblog notice
+ if((e.keyCode == 13) && !exists('#attach .wait'))
+ return sendMicroblog();
+ })
+
+ // Placeholder
+ .placeholder();
+
+ // Microblog file attacher
+ attachMicroblog();
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the Jappix Mini JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 04/08/11
+
+*/
+
+// Jappix Mini vars
+var MINI_DISCONNECT = false;
+var MINI_AUTOCONNECT = false;
+var MINI_SHOWPANE = false;
+var MINI_INITIALIZED = false;
+var MINI_ANONYMOUS = false;
+var MINI_ANIMATE = false;
+var MINI_NICKNAME = null;
+var MINI_TITLE = null;
+var MINI_DOMAIN = null;
+var MINI_USER = null;
+var MINI_PASSWORD = null;
+var MINI_RECONNECT = 0;
+var MINI_GROUPCHATS = [];
+var MINI_PASSWORDS = [];
+var MINI_RESOURCE = JAPPIX_RESOURCE + ' Mini';
+
+// Setups connection handlers
+function setupConMini(con) {
+ con.registerHandler('message', handleMessageMini);
+ con.registerHandler('presence', handlePresenceMini);
+ con.registerHandler('iq', handleIQMini);
+ con.registerHandler('onerror', handleErrorMini);
+ con.registerHandler('onconnect', connectedMini);
+}
+
+// Connects the user with the given logins
+function connectMini(domain, user, password) {
+ try {
+ // We define the http binding parameters
+ oArgs = new Object();
+
+ if(HOST_BOSH_MINI)
+ oArgs.httpbase = HOST_BOSH_MINI;
+ else
+ oArgs.httpbase = HOST_BOSH;
+
+ // We create the new http-binding connection
+ con = new JSJaCHttpBindingConnection(oArgs);
+
+ // And we handle everything that happen
+ setupConMini(con);
+
+ // Generate a resource
+ var random_resource = getDB('jappix-mini', 'resource');
+
+ if(!random_resource)
+ random_resource = MINI_RESOURCE + ' (' + (new Date()).getTime() + ')';
+
+ // We retrieve what the user typed in the login inputs
+ oArgs = new Object();
+ oArgs.secure = true;
+ oArgs.xmllang = XML_LANG;
+ oArgs.resource = random_resource;
+ oArgs.domain = domain;
+
+ // Store the resource (for reconnection)
+ setDB('jappix-mini', 'resource', random_resource);
+
+ // Anonymous login?
+ if(MINI_ANONYMOUS) {
+ // Anonymous mode disabled?
+ if(!allowedAnonymous()) {
+ logThis('Not allowed to use anonymous mode.', 2);
+
+ // Notify this error
+ notifyErrorMini();
+
+ return false;
+ }
+
+ // Bad domain?
+ else if(lockHost() && (domain != HOST_ANONYMOUS)) {
+ logThis('Not allowed to connect to this anonymous domain: ' + domain, 2);
+
+ // Notify this error
+ notifyErrorMini();
+
+ return false;
+ }
+
+ oArgs.authtype = 'saslanon';
+ }
+
+ // Normal login
+ else {
+ // Bad domain?
+ if(lockHost() && (domain != HOST_MAIN)) {
+ logThis('Not allowed to connect to this main domain: ' + domain, 2);
+
+ // Notify this error
+ notifyErrorMini();
+
+ return false;
+ }
+
+ // No nickname?
+ if(!MINI_NICKNAME)
+ MINI_NICKNAME = user;
+
+ oArgs.username = user;
+ oArgs.pass = password;
+ }
+
+ // We connect !
+ con.connect(oArgs);
+
+ logThis('Jappix Mini is connecting...', 3);
+ }
+
+ catch(e) {
+ // Logs errors
+ logThis('Error while logging in: ' + e, 1);
+
+ // Reset Jappix Mini
+ disconnectedMini();
+ }
+
+ finally {
+ return false;
+ }
+}
+
+// When the user is connected
+function connectedMini() {
+ // Update the roster
+ jQuery('#jappix_mini a.jm_pane.jm_button span.jm_counter').text('0');
+
+ // Do not get the roster if anonymous
+ if(MINI_ANONYMOUS)
+ initializeMini();
+ else
+ getRosterMini();
+
+ // For logger
+ if(MINI_RECONNECT)
+ logThis('Jappix Mini is now reconnected.', 3);
+ else
+ logThis('Jappix Mini is now connected.', 3);
+
+ // Reset reconnect var
+ MINI_RECONNECT = 0;
+}
+
+// When the user disconnects
+function saveSessionMini() {
+ // Not connected?
+ if(!isConnected())
+ return;
+
+ // Save the actual Jappix Mini DOM
+ setDB('jappix-mini', 'dom', jQuery('#jappix_mini').html());
+ setDB('jappix-mini', 'nickname', MINI_NICKNAME);
+
+ // Save the scrollbar position
+ var scroll_position = '';
+ var scroll_hash = jQuery('#jappix_mini div.jm_conversation:has(a.jm_pane.jm_clicked)').attr('data-hash');
+
+ if(scroll_hash)
+ scroll_position = document.getElementById('received-' + scroll_hash).scrollTop + '';
+
+ setDB('jappix-mini', 'scroll', scroll_position);
+
+ // Save the session stamp
+ setDB('jappix-mini', 'stamp', getTimeStamp());
+
+ // Suspend connection
+ con.suspend(false);
+
+ logThis('Jappix Mini session save tool launched.', 3);
+}
+
+// Disconnects the connected user
+function disconnectMini() {
+ // No connection?
+ if(!isConnected())
+ return false;
+
+ // Change markers
+ MINI_DISCONNECT = true;
+ MINI_INITIALIZED = false;
+
+ // Add disconnection handler
+ con.registerHandler('ondisconnect', disconnectedMini);
+
+ // Disconnect the user
+ con.disconnect();
+
+ logThis('Jappix Mini is disconnecting...', 3);
+
+ return false;
+}
+
+// When the user is disconnected
+function disconnectedMini() {
+ // Remove the stored items
+ removeDB('jappix-mini', 'dom');
+ removeDB('jappix-mini', 'nickname');
+ removeDB('jappix-mini', 'scroll');
+ removeDB('jappix-mini', 'stamp');
+
+ // Connection error?
+ if(!MINI_DISCONNECT || MINI_INITIALIZED) {
+ // Browser error?
+ notifyErrorMini();
+
+ // Reset reconnect timer
+ jQuery('#jappix_mini').stopTime();
+
+ // Try to reconnect after a while
+ if(MINI_INITIALIZED && (MINI_RECONNECT < 5)) {
+ // Reconnect interval
+ var reconnect_interval = 10;
+
+ if(MINI_RECONNECT)
+ reconnect_interval = (5 + (5 * MINI_RECONNECT)) * 1000;
+
+ MINI_RECONNECT++;
+
+ // Set timer
+ jQuery('#jappix_mini').oneTime(reconnect_interval, function() {
+ launchMini(true, MINI_SHOWPANE, MINI_DOMAIN, MINI_USER, MINI_PASSWORD);
+ });
+ }
+ }
+
+ // Normal disconnection?
+ else
+ launchMini(false, MINI_SHOWPANE, MINI_DOMAIN, MINI_USER, MINI_PASSWORD);
+
+ // Reset markers
+ MINI_DISCONNECT = false;
+ MINI_INITIALIZED = false;
+
+ logThis('Jappix Mini is now disconnected.', 3);
+}
+
+// Handles the incoming messages
+function handleMessageMini(msg) {
+ var type = msg.getType();
+
+ // This is a message Jappix can handle
+ if((type == 'chat') || (type == 'normal') || (type == 'groupchat') || !type) {
+ // Get the body
+ var body = trim(msg.getBody());
+
+ // Any subject?
+ var subject = trim(msg.getSubject());
+
+ if(subject)
+ body = subject;
+
+ if(body) {
+ // Get the values
+ var from = fullXID(getStanzaFrom(msg));
+ var xid = bareXID(from);
+ var use_xid = xid;
+ var hash = hex_md5(xid);
+ var nick = thisResource(from);
+
+ // Read the delay
+ var delay = readMessageDelay(msg.getNode());
+ var d_stamp;
+
+ // Manage this delay
+ if(delay) {
+ time = relativeDate(delay);
+ d_stamp = Date.jab2date(delay);
+ }
+
+ else {
+ time = getCompleteTime();
+ d_stamp = new Date();
+ }
+
+ // Get the stamp
+ var stamp = extractStamp(d_stamp);
+
+ // Is this a groupchat private message?
+ if(exists('#jappix_mini #chat-' + hash + '[data-type=groupchat]')) {
+ // Regenerate some stuffs
+ if((type == 'chat') || !type) {
+ xid = from;
+ hash = hex_md5(xid);
+ }
+
+ // XID to use for a groupchat
+ else
+ use_xid = from;
+ }
+
+ // Message type
+ var message_type = 'user-message';
+
+ // Grouphat values
+ if(type == 'groupchat') {
+ // Old message
+ if(msg.getChild('delay', NS_URN_DELAY) || msg.getChild('x', NS_DELAY))
+ message_type = 'old-message';
+
+ // System message?
+ if(!nick || subject) {
+ nick = '';
+ message_type = 'system-message';
+ }
+ }
+
+ // Chat values
+ else {
+ nick = jQuery('#jappix_mini a#friend-' + hash).text().revertHtmlEnc();
+
+ // No nickname?
+ if(!nick)
+ nick = getXIDNick(xid);
+ }
+
+ // Define the target div
+ var target = '#jappix_mini #chat-' + hash;
+
+ // Create the chat if it does not exist
+ if(!exists(target) && (type != 'groupchat'))
+ chatMini(type, xid, nick, hash);
+
+ // Display the message
+ displayMessageMini(type, body, use_xid, nick, hash, time, stamp, message_type);
+
+ // Notify the user if not focused & the message is not a groupchat old one
+ if((!jQuery(target + ' a.jm_chat-tab').hasClass('jm_clicked') || !isFocused()) && (message_type == 'user-message'))
+ notifyMessageMini(hash);
+
+ logThis('Message received from: ' + from);
+ }
+ }
+}
+
+// Handles the incoming IQs
+function handleIQMini(iq) {
+ // Define some variables
+ var iqFrom = fullXID(getStanzaFrom(iq));
+ var iqID = iq.getID();
+ var iqQueryXMLNS = iq.getQueryXMLNS();
+ var iqType = iq.getType();
+ var iqNode = iq.getNode();
+
+ // Build the response
+ var iqResponse = new JSJaCIQ();
+
+ iqResponse.setID(iqID);
+ iqResponse.setTo(iqFrom);
+ iqResponse.setType('result');
+
+ // Software version query
+ if((iqQueryXMLNS == NS_VERSION) && (iqType == 'get')) {
+ /* REF: http://xmpp.org/extensions/xep-0092.html */
+
+ var iqQuery = iqResponse.setQuery(NS_VERSION);
+
+ iqQuery.appendChild(iq.buildNode('name', {'xmlns': NS_VERSION}, 'Jappix Mini'));
+ iqQuery.appendChild(iq.buildNode('version', {'xmlns': NS_VERSION}, JAPPIX_VERSION));
+ iqQuery.appendChild(iq.buildNode('os', {'xmlns': NS_VERSION}, BrowserDetect.OS));
+
+ con.send(iqResponse);
+
+ logThis('Received software version query: ' + iqFrom);
+ }
+
+ // Roster push
+ else if((iqQueryXMLNS == NS_ROSTER) && (iqType == 'set')) {
+ // Display the friend
+ handleRosterMini(iq);
+
+ con.send(iqResponse);
+
+ logThis('Received a roster push.');
+ }
+
+ // Disco info query
+ else if((iqQueryXMLNS == NS_DISCO_INFO) && (iqType == 'get')) {
+ /* REF: http://xmpp.org/extensions/xep-0030.html */
+
+ var iqQuery = iqResponse.setQuery(NS_DISCO_INFO);
+
+ // We set the name of the client
+ iqQuery.appendChild(iq.appendNode('identity', {
+ 'category': 'client',
+ 'type': 'web',
+ 'name': 'Jappix Mini',
+ 'xmlns': NS_DISCO_INFO
+ }));
+
+ // We set all the supported features
+ var fArray = new Array(
+ NS_DISCO_INFO,
+ NS_VERSION,
+ NS_ROSTER,
+ NS_MUC,
+ NS_VERSION,
+ NS_URN_TIME
+ );
+
+ for(i in fArray)
+ iqQuery.appendChild(iq.buildNode('feature', {'var': fArray[i], 'xmlns': NS_DISCO_INFO}));
+
+ con.send(iqResponse);
+
+ logThis('Received a disco#infos query.');
+ }
+
+ // User time query
+ else if(jQuery(iqNode).find('time').size() && (iqType == 'get')) {
+ /* REF: http://xmpp.org/extensions/xep-0202.html */
+
+ var iqTime = iqResponse.appendNode('time', {'xmlns': NS_URN_TIME});
+ iqTime.appendChild(iq.buildNode('tzo', {'xmlns': NS_URN_TIME}, getDateTZO()));
+ iqTime.appendChild(iq.buildNode('utc', {'xmlns': NS_URN_TIME}, getXMPPTime('utc')));
+
+ con.send(iqResponse);
+
+ logThis('Received local time query: ' + iqFrom);
+ }
+}
+
+// Handles the incoming errors
+function handleErrorMini(err) {
+ // First level error (connection error)
+ if(jQuery(err).is('error')) {
+ // Notify this error
+ disconnectedMini();
+
+ logThis('First level error received.', 1);
+ }
+}
+
+// Handles the incoming presences
+function handlePresenceMini(pr) {
+ // Get the values
+ var from = fullXID(getStanzaFrom(pr));
+ var xid = bareXID(from);
+ var resource = thisResource(from);
+ var hash = hex_md5(xid);
+ var type = pr.getType();
+ var show = pr.getShow();
+
+ // Manage the received presence values
+ if((type == 'error') || (type == 'unavailable'))
+ show = 'unavailable';
+
+ else {
+ switch(show) {
+ case 'chat':
+ case 'away':
+ case 'xa':
+ case 'dnd':
+ break;
+
+ default:
+ show = 'available';
+
+ break;
+ }
+ }
+
+ // Is this a groupchat presence?
+ var groupchat_path = '#jappix_mini #chat-' + hash + '[data-type=groupchat]';
+
+ if(exists(groupchat_path)) {
+ // Groupchat buddy presence (not me)
+ if(resource != unescape(jQuery(groupchat_path).attr('data-nick'))) {
+ // Regenerate some stuffs
+ var groupchat = xid;
+ xid = from;
+ hash = hex_md5(xid);
+
+ // Remove this from the roster
+ if(show == 'unavailable')
+ removeBuddyMini(hash, groupchat);
+
+ // Add this to the roster
+ else
+ addBuddyMini(xid, hash, resource, groupchat);
+ }
+ }
+
+ // Friend path
+ var chat = '#jappix_mini #chat-' + hash;
+ var friend = '#jappix_mini a#friend-' + hash;
+ var send_input = chat + ' input.jm_send-messages';
+
+ // Is this friend online?
+ if(show == 'unavailable') {
+ // Offline marker
+ jQuery(friend).addClass('jm_offline').removeClass('jm_online');
+
+ // Disable the chat tools
+ jQuery(chat).addClass('jm_disabled');
+ jQuery(send_input).attr('disabled', true).attr('data-value', _e("Unavailable")).val(_e("Unavailable"));
+ }
+
+ else {
+ // Online marker
+ jQuery(friend).removeClass('jm_offline').addClass('jm_online');
+
+ // Enable the chat input
+ jQuery(chat).removeClass('jm_disabled');
+ jQuery(send_input).removeAttr('disabled').val('');
+ }
+
+ // Change the show presence of this buddy
+ jQuery(friend + ' span.jm_presence, ' + chat + ' span.jm_presence').attr('class', 'jm_presence jm_images jm_' + show);
+
+ // Update the presence counter
+ updateRosterMini();
+
+ logThis('Presence received from: ' + from);
+}
+
+// Handles the MUC main elements
+function handleMUCMini(pr) {
+ // We get the xml content
+ var xml = pr.getNode();
+ var from = fullXID(getStanzaFrom(pr));
+ var room = bareXID(from);
+ var hash = hex_md5(room);
+ var resource = thisResource(from);
+
+ // Is it a valid server presence?
+ var valid = false;
+
+ if(!resource || (resource == unescape(jQuery('#jappix_mini #chat-' + hash + '[data-type=groupchat]').attr('data-nick'))))
+ valid = true;
+
+ // Password required?
+ if(valid && jQuery(xml).find('error[type=auth] not-authorized').size()) {
+ // Create a new prompt
+ openPromptMini(printf(_e("This room (%s) is protected with a password."), room));
+
+ // When prompt submitted
+ jQuery('#jappix_popup div.jm_prompt form').submit(function() {
+ try {
+ // Read the value
+ var password = closePromptMini();
+
+ // Any submitted chat to join?
+ if(password) {
+ // Send the password
+ presenceMini('', '', '', '', from, password, true, handleMUCMini);
+
+ // Focus on the pane again
+ switchPaneMini('chat-' + hash, hash);
+ }
+ }
+
+ catch(e) {}
+
+ finally {
+ return false;
+ }
+ });
+
+ return;
+ }
+
+ // Nickname conflict?
+ else if(valid && jQuery(xml).find('error[type=cancel] conflict').size()) {
+ // New nickname
+ var nickname = resource + '_';
+
+ // Send the new presence
+ presenceMini('', '', '', '', room + '/' + nickname, '', true, handleMUCMini);
+
+ // Update the nickname marker
+ jQuery('#jappix_mini #chat-' + hash).attr('data-nick', escape(nickname));
+ }
+
+ // Handle normal presence
+ else
+ handlePresenceMini(pr);
+}
+
+// Updates the user presence
+function presenceMini(type, show, priority, status, to, password, limit_history, handler) {
+ var pr = new JSJaCPresence();
+
+ // Add the attributes
+ if(to)
+ pr.setTo(to);
+ if(type)
+ pr.setType(type);
+ if(show)
+ pr.setShow(show);
+ if(priority)
+ pr.setPriority(priority);
+ if(status)
+ pr.setStatus(status);
+
+ // Special presence elements
+ if(password || limit_history) {
+ var x = pr.appendNode('x', {'xmlns': NS_MUC});
+
+ // Any password?
+ if(password)
+ x.appendChild(pr.buildNode('password', {'xmlns': NS_MUC}, password));
+
+ // Any history limit?
+ if(limit_history)
+ x.appendChild(pr.buildNode('history', {'maxstanzas': 10, 'seconds': 86400, 'xmlns': NS_MUC}));
+ }
+
+ // Send the packet
+ if(handler)
+ con.send(pr, handler);
+ else
+ con.send(pr);
+
+ // No type?
+ if(!type)
+ type = 'available';
+
+ logThis('Presence sent: ' + type, 3);
+}
+
+// Sends a given message
+function sendMessageMini(aForm) {
+ try {
+ var body = trim(aForm.body.value);
+ var xid = aForm.xid.value;
+ var type = aForm.type.value;
+ var hash = hex_md5(xid);
+
+ if(body && xid) {
+ // Send the message
+ var aMsg = new JSJaCMessage();
+
+ aMsg.setTo(xid);
+ aMsg.setType(type);
+ aMsg.setBody(body);
+
+ con.send(aMsg);
+
+ // Clear the input
+ aForm.body.value = '';
+
+ // Display the message we sent
+ if(type != 'groupchat')
+ displayMessageMini(type, body, getXID(), 'me', hash, getCompleteTime(), getTimeStamp(), 'user-message');
+
+ logThis('Message (' + type + ') sent to: ' + xid);
+ }
+ }
+
+ catch(e) {}
+
+ finally {
+ return false;
+ }
+}
+
+// Generates the asked smiley image
+function smileyMini(image, text) {
+ return ' <img class="jm_smiley jm_smiley-' + image + ' jm_images" alt="' + encodeQuotes(text) + '" src="' + JAPPIX_STATIC + 'php/get.php?t=img&f=others/blank.gif" /> ';
+}
+
+// Notifies incoming chat messages
+function notifyMessageMini(hash) {
+ // Define the paths
+ var tab = '#jappix_mini #chat-' + hash + ' a.jm_chat-tab';
+ var notify = tab + ' span.jm_notify';
+ var notify_middle = notify + ' span.jm_notify_middle';
+
+ // Notification box not yet added
+ if(!exists(notify))
+ jQuery(tab).append(
+ '<span class="jm_notify">' +
+ '<span class="jm_notify_left jm_images"></span>' +
+ '<span class="jm_notify_middle">0</span>' +
+ '<span class="jm_notify_right jm_images"></span>' +
+ '</span>'
+ );
+
+ // Increment the notification number
+ var number = parseInt(jQuery(notify_middle).text());
+ jQuery(notify_middle).text(number + 1);
+
+ // Change the page title
+ notifyTitleMini();
+}
+
+// Notifies the user from a session error
+function notifyErrorMini() {
+ // Replace the Jappix Mini DOM content
+ jQuery('#jappix_mini').html(
+ '<div class="jm_starter">' +
+ '<a class="jm_pane jm_button jm_images" href="https://mini.jappix.com/issues" target="_blank" title="' + _e("Click here to solve the error") + '">' +
+ '<span class="jm_counter jm_error jm_images">' + _e("Error") + '</span>' +
+ '</a>' +
+ '</div>'
+ );
+}
+
+// Updates the page title with the new notifications
+function notifyTitleMini() {
+ // No saved title? Abort!
+ if(MINI_TITLE == null)
+ return false;
+
+ // Page title code
+ var title = MINI_TITLE;
+
+ // Count the number of notifications
+ var number = 0;
+
+ jQuery('#jappix_mini span.jm_notify span.jm_notify_middle').each(function() {
+ number = number + parseInt(jQuery(this).text());
+ });
+
+ // No new stuffs? Reset the title!
+ if(number)
+ title = '[' + number + '] ' + title;
+
+ // Apply the title
+ document.title = title;
+
+ return true;
+}
+
+// Clears the notifications
+function clearNotificationsMini(hash) {
+ // Not focused?
+ if(!isFocused())
+ return false;
+
+ // Remove the notifications counter
+ jQuery('#jappix_mini #chat-' + hash + ' span.jm_notify').remove();
+
+ // Update the page title
+ notifyTitleMini();
+
+ return true;
+}
+
+// Updates the roster counter
+function updateRosterMini() {
+ jQuery('#jappix_mini a.jm_button span.jm_counter').text(jQuery('#jappix_mini a.jm_online').size());
+}
+
+// Creates the Jappix Mini DOM content
+function createMini(domain, user, password) {
+ // Try to restore the DOM
+ var dom = getDB('jappix-mini', 'dom');
+ var stamp = parseInt(getDB('jappix-mini', 'stamp'));
+ var suspended = false;
+
+ // Invalid stored DOM?
+ if(dom && isNaN(jQuery(dom).find('a.jm_pane.jm_button span.jm_counter').text()))
+ dom = null;
+
+ // Can resume a session?
+ con = new JSJaCHttpBindingConnection();
+ setupConMini(con);
+
+ // Old DOM?
+ if(dom && ((getTimeStamp() - stamp) < JSJACHBC_MAX_WAIT) && con.resume()) {
+ // Read the old nickname
+ MINI_NICKNAME = getDB('jappix-mini', 'nickname');
+
+ // Marker
+ suspended = true;
+ }
+
+ // New DOM?
+ else {
+ dom = '<div class="jm_position">' +
+ '<div class="jm_conversations"></div>' +
+
+ '<div class="jm_starter">' +
+ '<div class="jm_roster">' +
+ '<div class="jm_actions">' +
+ '<a class="jm_logo jm_images" href="https://mini.jappix.com/" target="_blank"></a>' +
+ '<a class="jm_one-action jm_join jm_images" title="' + _e("Join a chat") + '" href="#"></a>' +
+ '</div>' +
+
+ '<div class="jm_buddies"></div>' +
+ '</div>' +
+
+ '<a class="jm_pane jm_button jm_images" href="#">' +
+ '<span class="jm_counter jm_images">' + _e("Please wait...") + '</span>' +
+ '</a>' +
+ '</div>' +
+ '</div>';
+ }
+
+ // Create the DOM
+ jQuery('body').append('<div id="jappix_mini">' + dom + '</div>');
+
+ // Adapt roster height
+ adaptRosterMini();
+
+ // The click events
+ jQuery('#jappix_mini a.jm_button').click(function() {
+ // Using a try/catch override IE issues
+ try {
+ // Presence counter
+ var counter = '#jappix_mini a.jm_pane.jm_button span.jm_counter';
+
+ // Cannot open the roster?
+ if(jQuery(counter).text() == _e("Please wait..."))
+ return false;
+
+ // Not yet connected?
+ if(jQuery(counter).text() == _e("Chat")) {
+ // Remove the animated bubble
+ jQuery('#jappix_mini div.jm_starter span.jm_animate').stopTime().remove();
+
+ // Add a waiting marker
+ jQuery(counter).text(_e("Please wait..."));
+
+ // Launch the connection!
+ connectMini(domain, user, password);
+
+ return false;
+ }
+
+ // Normal actions
+ if(!jQuery(this).hasClass('jm_clicked'))
+ showRosterMini();
+ else
+ hideRosterMini();
+ }
+
+ catch(e) {}
+
+ finally {
+ return false;
+ }
+ });
+
+ jQuery('#jappix_mini div.jm_actions a.jm_join').click(function() {
+ // Using a try/catch override IE issues
+ try {
+ // Create a new prompt
+ openPromptMini(_e("Please enter the group chat address to join."));
+
+ // When prompt submitted
+ jQuery('#jappix_popup div.jm_prompt form').submit(function() {
+ try {
+ // Read the value
+ var join_this = closePromptMini();
+
+ // Any submitted chat to join?
+ if(join_this) {
+ // Get the chat room to join
+ chat_room = bareXID(generateXID(join_this, 'groupchat'));
+
+ // Create a new groupchat
+ chatMini('groupchat', chat_room, getXIDNick(chat_room), hex_md5(chat_room));
+ }
+ }
+
+ catch(e) {}
+
+ finally {
+ return false;
+ }
+ });
+ }
+
+ catch(e) {}
+
+ finally {
+ return false;
+ }
+ });
+
+ // Hides the roster when clicking away of Jappix Mini
+ jQuery(document).click(function(evt) {
+ if(!jQuery(evt.target).parents('#jappix_mini').size() && !exists('#jappix_popup'))
+ hideRosterMini();
+ });
+
+ // Hides all panes double clicking away of Jappix Mini
+ jQuery(document).dblclick(function(evt) {
+ if(!jQuery(evt.target).parents('#jappix_mini').size() && !exists('#jappix_popup'))
+ switchPaneMini();
+ });
+
+ // Suspended session resumed?
+ if(suspended) {
+ // Initialized marker
+ MINI_INITIALIZED = true;
+
+ // Restore chat input values
+ jQuery('#jappix_mini div.jm_conversation input.jm_send-messages').each(function() {
+ var chat_value = jQuery(this).attr('data-value');
+
+ if(chat_value)
+ jQuery(this).val(chat_value);
+ });
+
+ // Restore buddy click events
+ jQuery('#jappix_mini a.jm_friend').click(function() {
+ // Using a try/catch override IE issues
+ try {
+ chatMini('chat', unescape(jQuery(this).attr('data-xid')), unescape(jQuery(this).attr('data-nick')), jQuery(this).attr('data-hash'));
+ }
+
+ catch(e) {}
+
+ finally {
+ return false;
+ }
+ });
+
+ // Restore chat click events
+ jQuery('#jappix_mini div.jm_conversation').each(function() {
+ chatEventsMini(jQuery(this).attr('data-type'), unescape(jQuery(this).attr('data-xid')), jQuery(this).attr('data-hash'));
+ });
+
+ // Scroll down to the last message
+ var scroll_hash = jQuery('#jappix_mini div.jm_conversation:has(a.jm_pane.jm_clicked)').attr('data-hash');
+ var scroll_position = getDB('jappix-mini', 'scroll');
+
+ // Any scroll position?
+ if(scroll_position)
+ scroll_position = parseInt(scroll_position);
+
+ if(scroll_hash) {
+ // Use a timer to override the DOM lag issue
+ jQuery(document).oneTime(200, function() {
+ messageScrollMini(scroll_hash, scroll_position);
+ });
+ }
+
+ // Update title notifications
+ notifyTitleMini();
+ }
+
+ // Can auto-connect?
+ else if(MINI_AUTOCONNECT)
+ connectMini(domain, user, password);
+
+ // Cannot auto-connect?
+ else {
+ // Chat text
+ jQuery('#jappix_mini a.jm_pane.jm_button span.jm_counter').text(_e("Chat"));
+
+ // Must animate?
+ if(MINI_ANIMATE) {
+ // Add content
+ jQuery('#jappix_mini div.jm_starter').prepend(
+ '<span class="jm_animate jm_images_animate"></span>'
+ );
+
+ // IE6 makes the image blink when animated...
+ if((BrowserDetect.browser == 'Explorer') && (BrowserDetect.version < 7))
+ return;
+
+ // Add timers
+ var anim_i = 0;
+
+ jQuery('#jappix_mini div.jm_starter span.jm_animate').everyTime(10, function() {
+ // Next
+ anim_i++;
+
+ // Margins
+ var m_top = Math.cos(anim_i * 0.02) * 3;
+ var m_left = Math.sin(anim_i * 0.02) * 3;
+
+ // Apply new position!
+ jQuery(this).css('margin-top', m_top + 'px')
+ .css('margin-left', m_left + 'px');
+ });
+ }
+ }
+}
+
+// Displays a given message
+function displayMessageMini(type, body, xid, nick, hash, time, stamp, message_type) {
+ // Generate path
+ var path = '#chat-' + hash;
+
+ // Can scroll?
+ var cont_scroll = document.getElementById('received-' + hash);
+ var can_scroll = false;
+
+ if(!cont_scroll.scrollTop || ((cont_scroll.clientHeight + cont_scroll.scrollTop) == cont_scroll.scrollHeight))
+ can_scroll = true;
+
+ // Remove the previous message border if needed
+ var last = jQuery(path + ' div.jm_group:last');
+ var last_stamp = parseInt(last.attr('data-stamp'));
+ var last_b = jQuery(path + ' b:last');
+ var last_xid = last_b.attr('data-xid');
+ var last_type = last.attr('data-type');
+ var grouped = false;
+ var header = '';
+
+ if((last_xid == xid) && (message_type == last_type) && ((stamp - last_stamp) <= 1800))
+ grouped = true;
+
+ else {
+ // Write the message date
+ if(nick)
+ header += '<span class="jm_date">' + time + '</span>';
+
+ // Write the buddy name at the top of the message group
+ if(type == 'groupchat')
+ header += '<b style="color: ' + generateColor(nick) + ';" data-xid="' + encodeQuotes(xid) + '">' + nick.htmlEnc() + '</b>';
+ else if(nick == 'me')
+ header += '<b class="jm_me" data-xid="' + encodeQuotes(xid) + '">' + _e("You") + '</b>';
+ else
+ header += '<b class="jm_him" data-xid="' + encodeQuotes(xid) + '">' + nick.htmlEnc() + '</b>';
+ }
+
+ // Apply the /me command
+ var me_command = false;
+
+ if(body.match(/^\/me /i)) {
+ body = body.replace(/^\/me /i, nick + ' ');
+
+ // Marker
+ me_command = true;
+ }
+
+ // HTML-encode the message
+ body = body.htmlEnc();
+
+ // Apply the smileys
+ body = body.replace(/(;-?\))(\s|$)/gi, smileyMini('wink', '$1'))
+ .replace(/(:-?3)(\s|$)/gi, smileyMini('waii', '$1'))
+ .replace(/(:-?\()(\s|$)/gi, smileyMini('unhappy', '$1'))
+ .replace(/(:-?P)(\s|$)/gi, smileyMini('tongue', '$1'))
+ .replace(/(:-?O)(\s|$)/gi, smileyMini('surprised', '$1'))
+ .replace(/(:-?\))(\s|$)/gi, smileyMini('smile', '$1'))
+ .replace(/(\^_?\^)(\s|$)/gi, smileyMini('happy', '$1'))
+ .replace(/(:-?D)(\s|$)/gi, smileyMini('grin', '$1'));
+
+ // Filter the links
+ body = applyLinks(body, 'mini');
+
+ // Generate the message code
+ if(me_command)
+ body = '<em>' + body + '</em>';
+
+ body = '<p>' + body + '</p>';
+
+ // Create the message
+ if(grouped)
+ jQuery('#jappix_mini #chat-' + hash + ' div.jm_received-messages div.jm_group:last').append(body);
+ else
+ jQuery('#jappix_mini #chat-' + hash + ' div.jm_received-messages').append('<div class="jm_group jm_' + message_type + '" data-type="' + message_type + '" data-stamp="' + stamp + '">' + header + body + '</div>');
+
+ // Scroll to this message
+ if(can_scroll)
+ messageScrollMini(hash);
+}
+
+// Switches to a given point
+function switchPaneMini(element, hash) {
+ // Hide every item
+ jQuery('#jappix_mini a.jm_pane').removeClass('jm_clicked');
+ jQuery('#jappix_mini div.jm_roster, #jappix_mini div.jm_chat-content').hide();
+
+ // Show the asked element
+ if(element && (element != 'roster')) {
+ var current = '#jappix_mini #' + element;
+
+ jQuery(current + ' a.jm_pane').addClass('jm_clicked');
+ jQuery(current + ' div.jm_chat-content').show();
+
+ // Use a timer to override the DOM lag issue
+ jQuery(document).oneTime(10, function() {
+ jQuery(current + ' input.jm_send-messages').focus();
+ });
+
+ // Scroll to the last message
+ if(hash)
+ messageScrollMini(hash);
+ }
+}
+
+// Scrolls to the last chat message
+function messageScrollMini(hash, position) {
+ var id = document.getElementById('received-' + hash);
+
+ // No defined position?
+ if(!position)
+ position = id.scrollHeight;
+
+ id.scrollTop = position;
+}
+
+// Prompts the user with a given text
+function openPromptMini(text, value) {
+ // Initialize
+ var prompt = '#jappix_popup div.jm_prompt';
+ var input = prompt + ' form input';
+ var value_input = input + '[type=text]';
+
+ // Remove the existing prompt
+ closePromptMini();
+
+ // Add the prompt
+ jQuery('body').append(
+ '<div id="jappix_popup">' +
+ '<div class="jm_prompt">' +
+ '<form>' +
+ text +
+ '<input class="jm_text" type="text" value="" />' +
+ '<input class="jm_submit" type="submit" value="' + _e("Submit") + '" />' +
+ '<input class="jm_submit" type="reset" value="' + _e("Cancel") + '" />' +
+ '<div class="jm_clear"></div>' +
+ '</form>' +
+ '</div>' +
+ '</div>'
+ );
+
+ // Vertical center
+ var vert_pos = '-' + ((jQuery(prompt).height() / 2) + 10) + 'px';
+ jQuery(prompt).css('margin-top', vert_pos);
+
+ // Apply the value?
+ if(value)
+ jQuery(value_input).val(value);
+
+ // Focus on the input
+ jQuery(document).oneTime(10, function() {
+ jQuery(value_input).focus();
+ });
+
+ // Cancel event
+ jQuery(input + '[type=reset]').click(function() {
+ try {
+ closePromptMini();
+ }
+
+ catch(e) {}
+
+ finally {
+ return false;
+ }
+ });
+}
+
+// Returns the prompt value
+function closePromptMini() {
+ // Read the value
+ var value = jQuery('#jappix_popup div.jm_prompt form input').val();
+
+ // Remove the popup
+ jQuery('#jappix_popup').remove();
+
+ return value;
+}
+
+// Manages and creates a chat
+function chatMini(type, xid, nick, hash, pwd, show_pane) {
+ var current = '#jappix_mini #chat-' + hash;
+
+ // Not yet added?
+ if(!exists(current)) {
+ // Groupchat nickname
+ if(type == 'groupchat') {
+ var nickname = MINI_NICKNAME;
+
+ // No nickname?
+ if(!nickname) {
+ // Create a new prompt
+ openPromptMini(printf(_e("Please enter your nickname to join %s."), xid));
+
+ // When prompt submitted
+ jQuery('#jappix_popup div.jm_prompt form').submit(function() {
+ try {
+ // Read the value
+ var nickname = closePromptMini();
+
+ // Update the stored one
+ if(nickname)
+ MINI_NICKNAME = nickname;
+
+ // Launch it again!
+ chatMini(type, xid, nick, hash, pwd);
+ }
+
+ catch(e) {}
+
+ finally {
+ return false;
+ }
+ });
+
+ return;
+ }
+ }
+
+ // Create the HTML markup
+ var html = '<div class="jm_conversation jm_type_' + type + '" id="chat-' + hash + '" data-xid="' + escape(xid) + '" data-type="' + type + '" data-nick="' + escape(nick) + '" data-hash="' + hash + '" data-origin="' + escape(cutResource(xid)) + '">' +
+ '<div class="jm_chat-content">' +
+ '<div class="jm_actions">' +
+ '<span class="jm_nick">' + nick + '</span>';
+
+ // Check if the groupchat exists
+ var groupchat_exists = false;
+
+ if(MINI_GROUPCHATS && MINI_GROUPCHATS.length) {
+ for(g in MINI_GROUPCHATS) {
+ if(xid == bareXID(generateXID(MINI_GROUPCHATS[g], 'groupchat'))) {
+ groupchat_exists = true;
+
+ break;
+ }
+ }
+ }
+
+ // Any close button to display?
+ if(((type == 'groupchat') && !groupchat_exists) || (type != 'groupchat'))
+ html += '<a class="jm_one-action jm_close jm_images" title="' + _e("Close") + '" href="#"></a>';
+
+ html += '</div>' +
+
+ '<div class="jm_received-messages" id="received-' + hash + '"></div>' +
+ '<form action="#" method="post">' +
+ '<input type="text" class="jm_send-messages" name="body" autocomplete="off" />' +
+ '<input type="hidden" name="xid" value="' + xid + '" />' +
+ '<input type="hidden" name="type" value="' + type + '" />' +
+ '</form>' +
+ '</div>' +
+
+ '<a class="jm_pane jm_chat-tab jm_images" href="#">' +
+ '<span class="jm_name">' + nick.htmlEnc() + '</span>' +
+ '</a>' +
+ '</div>';
+
+ jQuery('#jappix_mini div.jm_conversations').prepend(html);
+
+ // Get the presence of this friend
+ if(type != 'groupchat') {
+ var selector = jQuery('#jappix_mini a#friend-' + hash + ' span.jm_presence');
+
+ // Default presence
+ var show = 'available';
+
+ // Read the presence
+ if(selector.hasClass('jm_unavailable'))
+ show = 'unavailable';
+ else if(selector.hasClass('jm_chat'))
+ show = 'chat';
+ else if(selector.hasClass('jm_away'))
+ show = 'away';
+ else if(selector.hasClass('jm_xa'))
+ show = 'xa';
+ else if(selector.hasClass('jm_dnd'))
+ show = 'dnd';
+
+ // Create the presence marker
+ jQuery(current + ' a.jm_chat-tab').prepend('<span class="jm_presence jm_images jm_' + show + '"></span>');
+ }
+
+ // The click events
+ chatEventsMini(type, xid, hash);
+
+ // Join the groupchat
+ if(type == 'groupchat') {
+ // Add the nickname value
+ jQuery(current).attr('data-nick', escape(nickname));
+
+ // Send the first groupchat presence
+ presenceMini('', '', '', '', xid + '/' + nickname, pwd, true, handleMUCMini);
+ }
+ }
+
+ // Focus on our pane
+ if(show_pane != false)
+ jQuery(document).oneTime(10, function() {
+ switchPaneMini('chat-' + hash, hash);
+ });
+
+ return false;
+}
+
+// Events on the chat tool
+function chatEventsMini(type, xid, hash) {
+ var current = '#jappix_mini #chat-' + hash;
+
+ // Submit the form
+ jQuery(current + ' form').submit(function() {
+ return sendMessageMini(this);
+ });
+
+ // Click on the tab
+ jQuery(current + ' a.jm_chat-tab').click(function() {
+ // Using a try/catch override IE issues
+ try {
+ // Not yet opened: open it!
+ if(!jQuery(this).hasClass('jm_clicked')) {
+ // Show it!
+ switchPaneMini('chat-' + hash, hash);
+
+ // Clear the eventual notifications
+ clearNotificationsMini(hash);
+ }
+
+ // Yet opened: close it!
+ else
+ switchPaneMini();
+ }
+
+ catch(e) {}
+
+ finally {
+ return false;
+ }
+ });
+
+ // Click on the close button
+ jQuery(current + ' a.jm_close').click(function() {
+ // Using a try/catch override IE issues
+ try {
+ jQuery(current).remove();
+
+ // Quit the groupchat?
+ if(type == 'groupchat') {
+ // Send an unavailable presence
+ presenceMini('unavailable', '', '', '', xid + '/' + unescape(jQuery(current).attr('data-nick')));
+
+ // Remove this groupchat!
+ removeGroupchatMini(xid);
+ }
+ }
+
+ catch(e) {}
+
+ finally {
+ return false;
+ }
+ });
+
+ // Click on the chat content
+ jQuery(current + ' div.jm_received-messages').click(function() {
+ try {
+ jQuery(document).oneTime(10, function() {
+ jQuery(current + ' input.jm_send-messages').focus();
+ });
+ }
+
+ catch(e) {}
+ });
+
+ // Focus on the chat input
+ jQuery(current + ' input.jm_send-messages').focus(function() {
+ clearNotificationsMini(hash);
+ })
+
+ // Change on the chat input
+ .keyup(function() {
+ jQuery(this).attr('data-value', jQuery(this).val());
+ });
+}
+
+// Shows the roster
+function showRosterMini() {
+ switchPaneMini('roster');
+ jQuery('#jappix_mini div.jm_roster').show();
+ jQuery('#jappix_mini a.jm_button').addClass('jm_clicked');
+}
+
+// Hides the roster
+function hideRosterMini() {
+ jQuery('#jappix_mini div.jm_roster').hide();
+ jQuery('#jappix_mini a.jm_button').removeClass('jm_clicked');
+}
+
+// Removes a groupchat from DOM
+function removeGroupchatMini(xid) {
+ // Remove the groupchat private chats & the groupchat buddies from the roster
+ jQuery('#jappix_mini div.jm_conversation[data-origin=' + escape(cutResource(xid)) + '], #jappix_mini div.jm_roster div.jm_grouped[data-xid=' + escape(xid) + ']').remove();
+
+ // Update the presence counter
+ updateRosterMini();
+}
+
+// Initializes Jappix Mini
+function initializeMini() {
+ // Update the marker
+ MINI_INITIALIZED = true;
+
+ // Send the initial presence
+ if(!MINI_ANONYMOUS)
+ presenceMini();
+
+ // Join the groupchats
+ for(var i = 0; i < MINI_GROUPCHATS.length; i++) {
+ // Empty value?
+ if(!MINI_GROUPCHATS[i])
+ continue;
+
+ // Using a try/catch override IE issues
+ try {
+ // Current chat room
+ var chat_room = bareXID(generateXID(MINI_GROUPCHATS[i], 'groupchat'));
+
+ // Open the current chat
+ chatMini('groupchat', chat_room, getXIDNick(chat_room), hex_md5(chat_room), MINI_PASSWORDS[i], MINI_SHOWPANE);
+ }
+
+ catch(e) {}
+ }
+
+ // Must show the roster?
+ if(!MINI_AUTOCONNECT && !MINI_GROUPCHATS.length)
+ jQuery(document).oneTime(10, function() {
+ showRosterMini();
+ });
+}
+
+// Displays a roster buddy
+function addBuddyMini(xid, hash, nick, groupchat) {
+ // Element
+ var element = '#jappix_mini a.jm_friend#friend-' + hash;
+
+ // Yet added?
+ if(exists(element))
+ return false;
+
+ // Generate the path
+ var path = '#jappix_mini div.jm_roster div.jm_buddies';
+
+ // Groupchat buddy
+ if(groupchat) {
+ // Generate the groupchat group path
+ path = '#jappix_mini div.jm_roster div.jm_grouped[data-xid=' + escape(groupchat) + ']';
+
+ // Must add a groupchat group?
+ if(!exists(path)) {
+ jQuery('#jappix_mini div.jm_roster div.jm_buddies').append(
+ '<div class="jm_grouped" data-xid="' + escape(groupchat) + '">' +
+ '<div class="jm_name">' + getXIDNick(groupchat).htmlEnc() + '</div>' +
+ '</div>'
+ );
+ }
+ }
+
+ // Append this buddy content
+ var code = '<a class="jm_friend jm_offline" id="friend-' + hash + '" data-xid="' + escape(xid) + '" data-nick="' + escape(nick) + '" data-hash="' + hash + '" href="#"><span class="jm_presence jm_images jm_unavailable"></span>' + nick.htmlEnc() + '</a>';
+
+ if(groupchat)
+ jQuery(path).append(code);
+ else
+ jQuery(path).prepend(code);
+
+ // Click event on this buddy
+ jQuery(element).click(function() {
+ // Using a try/catch override IE issues
+ try {
+ chatMini('chat', xid, nick, hash);
+ }
+
+ catch(e) {}
+
+ finally {
+ return false;
+ }
+ });
+
+ return true;
+}
+
+// Removes a roster buddy
+function removeBuddyMini(hash, groupchat) {
+ // Remove the buddy from the roster
+ jQuery('#jappix_mini a.jm_friend#friend-' + hash).remove();
+
+ // Empty group?
+ var group = '#jappix_mini div.jm_roster div.jm_grouped[data-xid=' + escape(groupchat) + ']';
+
+ if(groupchat && !jQuery(group + ' a.jm_friend').size())
+ jQuery(group).remove();
+
+ return true;
+}
+
+// Gets the user's roster
+function getRosterMini() {
+ var iq = new JSJaCIQ();
+ iq.setType('get');
+ iq.setQuery(NS_ROSTER);
+ con.send(iq, handleRosterMini);
+
+ logThis('Getting roster...', 3);
+}
+
+// Handles the user's roster
+function handleRosterMini(iq) {
+ // Parse the roster
+ jQuery(iq.getQuery()).find('item').each(function() {
+ // Get the values
+ var current = jQuery(this);
+ var xid = current.attr('jid');
+ var subscription = current.attr('subscription');
+
+ // Not a gateway
+ if(!isGateway(xid)) {
+ var nick = current.attr('name');
+ var hash = hex_md5(xid);
+
+ // No name is defined?
+ if(!nick)
+ nick = getXIDNick(xid);
+
+ // Action on the current buddy
+ if(subscription == 'remove')
+ removeBuddyMini(hash);
+ else
+ addBuddyMini(xid, hash, nick);
+ }
+ });
+
+ // Not yet initialized
+ if(!MINI_INITIALIZED)
+ initializeMini();
+
+ logThis('Roster got.', 3);
+}
+
+// Adapts the roster height to the window
+function adaptRosterMini() {
+ // Process the new height
+ var height = jQuery(window).height() - 70;
+
+ // Apply the new height
+ jQuery('#jappix_mini div.jm_roster div.jm_buddies').css('max-height', height);
+}
+
+// Plugin launcher
+function launchMini(autoconnect, show_pane, domain, user, password) {
+ // Save infos to reconnect
+ MINI_DOMAIN = domain;
+ MINI_USER = user;
+ MINI_PASSWORD = password;
+
+ // Anonymous mode?
+ if(!user || !password)
+ MINI_ANONYMOUS = true;
+ else
+ MINI_ANONYMOUS = false;
+
+ // Autoconnect (only if storage available to avoid floods)?
+ if(autoconnect && hasDB())
+ MINI_AUTOCONNECT = true;
+ else
+ MINI_AUTOCONNECT = false;
+
+ // Show pane?
+ if(show_pane)
+ MINI_SHOWPANE = true;
+ else
+ MINI_SHOWPANE = false;
+
+ // Remove Jappix Mini
+ jQuery('#jappix_mini').remove();
+
+ // Reconnect?
+ if(MINI_RECONNECT) {
+ logThis('Trying to reconnect (try: ' + MINI_RECONNECT + ')!');
+
+ return createMini(domain, user, password);
+ }
+
+ // Append the Mini stylesheet
+ jQuery('head').append('<link rel="stylesheet" href="' + JAPPIX_STATIC + 'php/get.php?t=css&g=mini.xml" type="text/css" media="all" />');
+
+ // Legacy IE stylesheet
+ if((BrowserDetect.browser == 'Explorer') && (BrowserDetect.version < 7))
+ jQuery('head').append('<link rel="stylesheet" href="' + JAPPIX_STATIC + 'php/get.php?t=css&f=mini-ie.css" type="text/css" media="all" />');
+
+ // Disables the browser HTTP-requests stopper
+ jQuery(document).keydown(function(e) {
+ if((e.keyCode == 27) && !isDeveloper())
+ return false;
+ });
+
+ // Save the page title
+ MINI_TITLE = document.title;
+
+ // Sets the good roster max-height
+ jQuery(window).resize(adaptRosterMini);
+
+ // Logouts when Jappix is closed
+ if(BrowserDetect.browser == 'Opera') {
+ // Emulates onbeforeunload on Opera (link clicked)
+ jQuery('a[href]:not([onclick])').click(function() {
+ // Link attributes
+ var href = jQuery(this).attr('href') || '';
+ var target = jQuery(this).attr('target') || '';
+
+ // Not new window or JS link
+ if(href && !href.match(/^#/i) && !target.match(/_blank|_new/i))
+ saveSessionMini();
+ });
+
+ // Emulates onbeforeunload on Opera (form submitted)
+ jQuery('form:not([onsubmit])').submit(saveSessionMini);
+ }
+
+ jQuery(window).bind('beforeunload', saveSessionMini);
+
+ // Create the Jappix Mini DOM content
+ createMini(domain, user, password);
+
+ logThis('Welcome to Jappix Mini! Happy coding in developer mode!');
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the Jappix Mobile lightweight JS script
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 10/07/11
+
+*/
+
+/* BEGIN CONNECTION FUNCTIONS */
+
+function doLogin(aForm) {
+ try {
+ // Reset the panels
+ resetPanel();
+
+ // Get the values
+ var xid = aForm.xid.value;
+ var username, domain;
+
+ // A domain is specified
+ if(xid.indexOf('@') != -1) {
+ username = getXIDNick(xid);
+ domain = getXIDHost(xid);
+
+ // Domain is locked and not the same
+ if((LOCK_HOST == 'on') && (domain != HOST_MAIN)) {
+ showThis('error');
+
+ return false;
+ }
+ }
+
+ // No "@" in the XID, we should add the default domain
+ else {
+ username = xid;
+ domain = HOST_MAIN;
+ }
+
+ var pwd = aForm.pwd.value;
+ var reg = false;
+
+ if(aForm.reg)
+ reg = aForm.reg.checked;
+
+ // Enough parameters
+ if(username && domain && pwd) {
+ // Show the info notification
+ showThis('info');
+
+ // We define the http binding parameters
+ oArgs = new Object();
+
+ if(HOST_BOSH_MAIN)
+ oArgs.httpbase = HOST_BOSH_MAIN;
+ else
+ oArgs.httpbase = HOST_BOSH;
+
+ // We create the new http-binding connection
+ con = new JSJaCHttpBindingConnection(oArgs);
+
+ // And we handle everything that happen
+ con.registerHandler('message', handleMessage);
+ con.registerHandler('presence', handlePresence);
+ con.registerHandler('iq', handleIQ);
+ con.registerHandler('onconnect', handleConnected);
+ con.registerHandler('onerror', handleError);
+ con.registerHandler('ondisconnect', handleDisconnected);
+
+ // We retrieve what the user typed in the login inputs
+ oArgs = new Object();
+ oArgs.username = username;
+ oArgs.domain = domain;
+ oArgs.resource = JAPPIX_RESOURCE + ' Mobile (' + (new Date()).getTime() + ')';
+ oArgs.pass = pwd;
+ oArgs.secure = true;
+ oArgs.xmllang = XML_LANG;
+
+ // Register?
+ if(reg)
+ oArgs.register = true;
+
+ // We connect !
+ con.connect(oArgs);
+ }
+
+ // Not enough parameters
+ else
+ showThis('error');
+ }
+
+ catch(e) {
+ // An error happened
+ resetPanel('error');
+ }
+
+ finally {
+ return false;
+ }
+}
+
+function doLogout() {
+ con.disconnect();
+}
+
+/* END CONNECTION FUNCTIONS */
+
+/* BEGIN SHOW/HIDE FUNCTIONS */
+
+function showThis(id) {
+ document.getElementById(id).style.display = 'block';
+}
+
+function hideThis(id) {
+ document.getElementById(id).style.display = 'none';
+}
+
+function resetPanel(id) {
+ // Hide the opened panels
+ hideThis('info');
+ hideThis('error');
+
+ //Show the target panel
+ if(id)
+ showThis(id);
+}
+
+function resetDOM() {
+ // Reset the "secret" input values
+ document.getElementById('pwd').value = '';
+
+ // Remove the useless DOM elements
+ var body = document.getElementsByTagName('body')[0];
+ body.removeChild(document.getElementById('talk'));
+ body.removeChild(document.getElementById('chat'));
+}
+
+/* END SHOW/HIDE FUNCTIONS */
+
+/* BEGIN SYSTEM FUNCTIONS */
+
+function exists(id) {
+ if(!document.getElementById(id))
+ return false;
+ else
+ return true;
+}
+
+function _e(string) {
+ return string;
+}
+
+function encodeOnclick(str) {
+ return str.replace(/'/g, '\\$&').replace(/"/g, '"');
+}
+
+function getJappixLocation() {
+ var url = window.location.href;
+
+ // If the URL has variables, remove them
+ if(url.indexOf('?') != -1)
+ url = url.split('?')[0];
+ if(url.indexOf('#') != -1)
+ url = url.split('#')[0];
+
+ // No "/" at the end
+ if(!url.match(/(.+)\/$/))
+ url += '/';
+
+ return url;
+}
+
+/* END SYSTEM FUNCTIONS */
+
+/* BEGIN HANDLING FUNCTIONS */
+
+function handleMessage(msg) {
+ var type = msg.getType();
+
+ if(type == 'chat' || type == 'normal') {
+ // Get the body
+ var body = msg.getBody();
+
+ if(body) {
+ // Get the values
+ var xid = cutResource(msg.getFrom());
+ var hash = hex_md5(xid);
+ var nick = getNick(xid, hash);
+
+ // No nickname?
+ if(!nick)
+ nick = xid;
+
+ // Create the chat if it does not exist
+ chat(xid, nick);
+
+ // Display the message
+ displayMessage(xid, body, nick, hash);
+ }
+ }
+}
+
+function handlePresence(pre) {
+ // Define the variables
+ var xid = cutResource(pre.getFrom());
+ var hash = hex_md5(xid);
+ var type = pre.getType();
+ var show = pre.getShow();
+
+ // Online buddy: show it!
+ if(!type) {
+ showThis('buddy-' + hash);
+
+ // Display the correct presence
+ switch(show) {
+ case 'chat':
+ displayPresence(hash, show);
+ break;
+
+ case 'away':
+ displayPresence(hash, show);
+ break;
+
+ case 'xa':
+ displayPresence(hash, show);
+ break;
+
+ case 'dnd':
+ displayPresence(hash, show);
+ break;
+
+ default:
+ displayPresence(hash, 'available');
+ break;
+ }
+ }
+
+ else
+ hideThis('buddy-' + hash);
+}
+
+function handleIQ(iq) {
+ // Get the content
+ var iqFrom = iq.getFrom();
+ var iqID = iq.getID();
+ var iqQueryXMLNS = iq.getQueryXMLNS();
+ var iqType = iq.getType();
+
+ // Create the response
+ if((iqType == 'get') && ((iqQueryXMLNS == NS_DISCO_INFO) || (iqQueryXMLNS == NS_VERSION))) {
+ var iqResponse = new JSJaCIQ();
+ iqResponse.setID(iqID);
+ iqResponse.setTo(iqFrom);
+ iqResponse.setType('result');
+ }
+
+ // Disco#infos query
+ if((iqQueryXMLNS == NS_DISCO_INFO) && (iqType == 'get')) {
+ /* REF: http://xmpp.org/extensions/xep-0030.html */
+
+ var iqQuery = iqResponse.setQuery(NS_DISCO_INFO);
+
+ // We set the name of the client
+ iqQuery.appendChild(iq.appendNode('identity', {
+ 'category': 'client',
+ 'type': 'mobile',
+ 'name': 'Jappix Mobile'
+ }));
+
+ // We set all the supported features
+ var fArray = new Array(
+ NS_DISCO_INFO,
+ NS_VERSION
+ );
+
+ for(i in fArray)
+ iqQuery.appendChild(iq.buildNode('feature', {'var': fArray[i]}));
+
+ con.send(iqResponse);
+ }
+
+ // Software version query
+ else if((iqQueryXMLNS == NS_VERSION) && (iqType == 'get')) {
+ /* REF: http://xmpp.org/extensions/xep-0092.html */
+
+ var iqQuery = iqResponse.setQuery(NS_VERSION);
+
+ iqQuery.appendChild(iq.buildNode('name', 'Jappix Mobile'));
+ iqQuery.appendChild(iq.buildNode('version', JAPPIX_VERSION));
+ iqQuery.appendChild(iq.buildNode('os', BrowserDetect.OS));
+
+ con.send(iqResponse);
+ }
+}
+
+function handleConnected() {
+ // Reset the elements
+ hideThis('home');
+ resetPanel();
+
+ // Create the talk page
+ document.getElementsByTagName('body')[0].innerHTML +=
+ '<div id="talk">' +
+ '<div class="header">' +
+ '<div class="mobile-images"></div>' +
+ '<button onclick="doLogout();">' + _e("Disconnect") + '</button>' +
+ '</div>' +
+
+ '<div id="roster"></div>' +
+ '</div>' +
+
+ '<div id="chat">' +
+ '<div class="header">' +
+ '<div class="mobile-images"></div>' +
+ '<button onclick="returnToRoster();">' + _e("Previous") + '</button>' +
+ '</div>' +
+
+ '<div id="chans"></div>' +
+ '</div>';
+
+ // Get the roster items
+ getRoster();
+}
+
+function handleError(error) {
+ resetPanel('error');
+}
+
+function handleDisconnected() {
+ // Reset the elements
+ resetDOM();
+
+ // Show the home page
+ showThis('home');
+}
+
+function handleRoster(iq) {
+ // Error: send presence anyway
+ if(!iq || (iq.getType() != 'result'))
+ return sendPresence('', 'available', 1);
+
+ // Define some pre-vars
+ var current, xid, nick, oneBuddy, oneID, hash;
+ var roster = document.getElementById('roster');
+
+ // Get roster items
+ var iqNode = iq.getNode();
+ var bItems = iqNode.getElementsByTagName('item');
+
+ // Display each elements from the roster
+ for(var i = 0; i < bItems.length; i++) {
+ // Get the values
+ current = iqNode.getElementsByTagName('item').item(i);
+ xid = current.getAttribute('jid').htmlEnc();
+ nick = current.getAttribute('name');
+ hash = hex_md5(xid);
+
+ // No defined nick?
+ if(!nick)
+ nick = getDirectNick(xid);
+
+ // Display the values
+ oneBuddy = document.createElement('a');
+ oneID = 'buddy-' + hash;
+ oneBuddy.setAttribute('href', '#');
+ oneBuddy.setAttribute('id', oneID);
+ oneBuddy.setAttribute('class', 'one-buddy');
+ oneBuddy.setAttribute('onclick', 'return chat(\'' + encodeOnclick(xid) + '\', \'' + encodeOnclick(nick) + '\');');
+ oneBuddy.innerHTML = nick.htmlEnc();
+ roster.appendChild(oneBuddy);
+ }
+
+ // Start handling buddies presence
+ sendPresence('', 'available', 1);
+}
+
+/* END HANDLING FUNCTIONS */
+
+/* BEGIN SENDING FUNCTIONS */
+
+function sendMessage(aForm) {
+ try {
+ var body = aForm.body.value;
+ var xid = aForm.xid.value;
+ var hash = hex_md5(xid);
+
+ if(body && xid) {
+ // Send the message
+ var aMsg = new JSJaCMessage();
+ aMsg.setTo(xid);
+ aMsg.setType('chat');
+ aMsg.setBody(body);
+ con.send(aMsg);
+
+ // Clear our input
+ aForm.body.value = '';
+
+ // Display the message we sent
+ displayMessage(xid, body, 'me', hash);
+ }
+ }
+
+ finally {
+ return false;
+ }
+}
+
+function sendPresence(type, show, priority, status) {
+ var presence = new JSJaCPresence();
+
+ if(type)
+ presence.setType(type);
+ if(show)
+ presence.setShow(show);
+ if(priority)
+ presence.setPriority(priority);
+ if(status)
+ presence.setStatus(status);
+
+ con.send(presence);
+}
+
+/* END SENDING FUNCTIONS */
+
+/* BEGIN GETTING FUNCTIONS */
+
+function getRoster() {
+ iq = new JSJaCIQ();
+ iq.setType('get');
+ iq.setQuery(NS_ROSTER);
+
+ con.send(iq, handleRoster);
+}
+
+function getDirectNick(xid) {
+ return explodeThis('@', xid, 0);
+}
+
+function getNick(xid, hash) {
+ var path = 'buddy-' + hash;
+
+ if(exists(path))
+ return document.getElementById(path).innerHTML;
+
+ else
+ getDirectNick(xid);
+}
+
+/* END GETTING FUNCTIONS */
+
+/* BEGIN RESOURCES FUNCTIONS */
+function explodeThis(toEx, toStr, i) {
+ // Get the index of our char to explode
+ var index = toStr.indexOf(toEx);
+
+ // We split if necessary the string
+ if(index != -1) {
+ if(i == 0)
+ toStr = toStr.substr(0, index);
+ else
+ toStr = toStr.substr(index + 1);
+ }
+
+ // We return the value
+ return toStr;
+}
+
+function cutResource(aXID) {
+ return explodeThis('/', aXID, 0);
+}
+
+function getXIDNick(aXID) {
+ return explodeThis('@', aXID, 0);
+}
+
+function getXIDHost(aXID) {
+ return explodeThis('@', aXID, 1);
+}
+/* END RESOURCES FUNCTIONS */
+
+/* BEGIN CHAT FUNCTIONS */
+
+function filter(msg) {
+ var msg = msg
+
+ // Encode in HTML
+ .htmlEnc()
+
+ // Highlighted text
+ .replace(/(\s|^)\*(.+)\*(\s|$)/gi,'$1<em>$2</em>$3');
+
+ // Links
+ msg = applyLinks(msg, 'mini');
+
+ return msg;
+}
+
+function displayMessage(xid, body, nick, hash) {
+ // Get the path
+ var path = 'content-' + hash;
+
+ // Display the message
+ html = '<span><b';
+
+ if(nick == 'me')
+ html += ' class="me">' + _e("You");
+ else
+ html += ' class="him">' + nick;
+
+ html += '</b> ' + filter(body) + '</span>';
+
+ document.getElementById(path).innerHTML += html;
+
+ // Scroll to the last element
+ document.getElementById(path).lastChild.scrollIntoView();
+}
+
+function returnToRoster() {
+ // Hide the chats
+ hideThis('chat');
+
+ // Show the roster
+ showThis('talk');
+}
+
+function chatSwitch(hash) {
+ // Hide the roster page
+ hideThis('talk');
+
+ // Hide the other chats
+ var divs = document.getElementsByTagName('div');
+
+ for(var i = 0; i < divs.length; i++) {
+ if(divs.item(i).getAttribute('class') == 'one-chat')
+ divs.item(i).style.display = 'none';
+ }
+
+ // Show the chat
+ showThis('chat');
+ showThis(hash);
+}
+
+function createChat(xid, nick, hash) {
+ // Define the variables
+ var chat = document.getElementById('chans');
+ var oneChat = document.createElement('div');
+
+ // Apply the DOM modification
+ oneChat.setAttribute('id', 'chat-' + hash);
+ oneChat.setAttribute('class', 'one-chat');
+ oneChat.innerHTML = '<p>' + nick + '</p><div id="content-' + hash + '"></div><form action="#" method="post" onsubmit="return sendMessage(this);"><input type="text" name="body" /><input type="hidden" name="xid" value="' + xid + '" /><input type="submit" class="submit" value="OK" /></form>';
+ chat.appendChild(oneChat);
+}
+
+function chat(xid, nick) {
+ var hash = hex_md5(xid);
+
+ // If the chat was not yet opened
+ if(!exists('chat-' + hash)) {
+ // No nick?
+ if(!nick)
+ nick = getNick(xid, hash);
+
+ // Create the chat
+ createChat(xid, nick, hash);
+ }
+
+ // Switch to the chat
+ chatSwitch('chat-' + hash);
+
+ return false;
+}
+
+/* END CHAT FUNCTIONS */
+
+/* BEGIN PRESENCE FUNCTIONS */
+
+function displayPresence(hash, show) {
+ document.getElementById('buddy-' + hash).setAttribute('class', 'one-buddy ' + show);
+}
+
+/* END PRESENCE FUNCTIONS */
+
+/* BEGIN DOCUMENT EVENTS FUNCTIONS */
+
+onbeforeunload = doLogout;
+
+/* END DOCUMENT EVENTS FUNCTIONS */
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the mucadmin JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Authors: Vanaryon, Maranda
+Last revision: 03/03/11
+
+*/
+
+// Opens the MUC admin popup
+function openMucAdmin(xid, aff) {
+ // Popup HTML content
+ var html_full =
+ '<div class="top">' + _e("MUC administration") + '</div>' +
+
+ '<div class="content">' +
+ '<div class="head mucadmin-head">' +
+ '<div class="head-text mucadmin-head-text">' + _e("You administrate this room") + '</div>' +
+
+ '<div class="mucadmin-head-jid">' + xid + '</div>' +
+ '</div>' +
+
+ '<div class="mucadmin-forms">' +
+ '<div class="mucadmin-topic">' +
+ '<fieldset>' +
+ '<legend>' + _e("Subject") + '</legend>' +
+
+ '<label for="topic-text">' + _e("Enter new subject") + '</label>' +
+ '<textarea id="topic-text" name="room-topic" rows="8" cols="60" ></textarea>' +
+ '</fieldset>' +
+ '</div>' +
+
+ '<div class="mucadmin-conf">' +
+ '<fieldset>' +
+ '<legend>' + _e("Configuration") + '</legend>' +
+
+ '<div class="results mucadmin-results"></div>' +
+ '</fieldset>' +
+ '</div>' +
+
+ '<div class="mucadmin-aut">' +
+ '<fieldset>' +
+ '<legend>' + _e("Authorizations") + '</legend>' +
+
+ '<label>' + _e("Member list") + '</label>' +
+ '<div class="aut-member aut-group">' +
+ '<a href="#" class="aut-add" onclick="return addInputMucAdmin(\'\', \'member\');">' + _e("Add an input") + '</a>' +
+ '</div>' +
+
+ '<label>' + _e("Owner list") + '</label>' +
+ '<div class="aut-owner aut-group">' +
+ '<a href="#" class="aut-add" onclick="return addInputMucAdmin(\'\', \'owner\');">' + _e("Add an input") + '</a>' +
+ '</div>' +
+
+ '<label>' + _e("Administrator list") + '</label>' +
+ '<div class="aut-admin aut-group">' +
+ '<a href="#" class="aut-add" onclick="return addInputMucAdmin(\'\', \'admin\');">' + _e("Add an input") + '</a>' +
+ '</div>' +
+
+ '<label>' + _e("Outcast list") + '</label>' +
+ '<div class="aut-outcast aut-group">' +
+ '<a href="#" class="aut-add" onclick="return addInputMucAdmin(\'\', \'outcast\');">' + _e("Add an input") + '</a>' +
+ '</div>' +
+ '</fieldset>' +
+ '</div>' +
+
+ '<div class="mucadmin-others">' +
+ '<fieldset>' +
+ '<legend>' + _e("Others") + '</legend>' +
+
+ '<label>' + _e("Destroy this MUC") + '</label>' +
+ '<a href="#" onclick="return destroyMucAdmin();">' + _e("Yes, let's do it!") + '</a>' +
+ '</fieldset>' +
+ '</div>' +
+ '</div>' +
+ '</div>' +
+
+ '<div class="bottom">' +
+ '<div class="wait wait-medium"></div>' +
+
+ '<a href="#" class="finish save">' + _e("Save") + '</a>' +
+ '<a href="#" class="finish cancel">' + _e("Cancel") + '</a>' +
+ '</div>';
+
+ var html_partial =
+ '<div class="top">' + _e("MUC administration") + '</div>' +
+
+ '<div class="content">' +
+ '<div class="head mucadmin-head">' +
+ '<div class="head-text mucadmin-head-text">' + _e("You administrate this room") + '</div>' +
+
+ '<div class="mucadmin-head-jid">' + xid + '</div>' +
+ '</div>' +
+
+ '<div class="mucadmin-forms">' +
+ '<div class="mucadmin-aut">' +
+ '<fieldset>' +
+ '<legend>' + _e("Authorizations") + '</legend>' +
+
+ '<label>' + _e("Member list") + '</label>' +
+ '<div class="aut-member aut-group">' +
+ '<a href="#" class="aut-add" onclick="return addInputMucAdmin(\'\', \'member\');">' + _e("Add an input") + '</a>' +
+ '</div>' +
+
+ '<label>' + _e("Outcast list") + '</label>' +
+ '<div class="aut-outcast aut-group">' +
+ '<a href="#" class="aut-add" onclick="return addInputMucAdmin(\'\', \'outcast\');">' + _e("Add an input") + '</a>' +
+ '</div>' +
+ '</fieldset>' +
+ '</div>' +
+ '</div>' +
+ '</div>' +
+
+ '<div class="bottom">' +
+ '<div class="wait wait-medium"></div>' +
+
+ '<a href="#" class="finish save">' + _e("Save") + '</a>' +
+ '<a href="#" class="finish cancel">' + _e("Cancel") + '</a>' +
+ '</div>';
+
+ // Create the popup
+ if(aff == 'owner')
+ createPopup('mucadmin', html_full);
+ if(aff == 'admin')
+ createPopup('mucadmin', html_partial);
+
+ // Associate the events
+ launchMucAdmin();
+
+ // We get the affiliated user's privileges
+ if(aff == 'owner') {
+ queryMucAdmin(xid, 'member');
+ queryMucAdmin(xid, 'owner');
+ queryMucAdmin(xid, 'admin');
+ queryMucAdmin(xid, 'outcast');
+ // We query the room to edit
+ dataForm(xid, 'muc', '', '', 'mucadmin');
+ } else if(aff == 'admin') {
+ queryMucAdmin(xid, 'member');
+ queryMucAdmin(xid, 'outcast');
+ }
+}
+
+// Closes the MUC admin popup
+function closeMucAdmin() {
+ // Destroy the popup
+ destroyPopup('mucadmin');
+
+ return false;
+}
+
+// Removes a MUC admin input
+function removeInputMucAdmin(element) {
+ var path = $(element).parent();
+
+ // We first hide the container of the input
+ path.hide();
+
+ // Then, we add a special class to the input
+ path.find('input').addClass('aut-dustbin');
+
+ return false;
+}
+
+// Adds a MUC admin input
+function addInputMucAdmin(xid, affiliation) {
+ var hash = hex_md5(xid + affiliation);
+
+ // Add the HTML code
+ $('#mucadmin .aut-' + affiliation + ' .aut-add').after(
+ '<div class="one-aut ' + hash + '">' +
+ '<input id="aut-' + affiliation + '" name="' + affiliation + '" type="text" class="mucadmin-i" value="' + xid + '" />' +
+ '<a href="#" class="aut-remove">[-]</a>' +
+ '</div>'
+ );
+
+ // Click event
+ $('#mucadmin .' + hash + ' .aut-remove').click(function() {
+ return removeInputMucAdmin(this);
+ });
+
+ // Focus on the input we added
+ if(!xid)
+ $(document).oneTime(10, function() {
+ $('#mucadmin .' + hash + ' input').focus();
+ });
+
+ return false;
+}
+
+// Handles the MUC admin form
+function handleMucAdminAuth(iq) {
+ // We got the authorizations results
+ $(iq.getQuery()).find('item').each(function() {
+ // We parse the received xml
+ var xid = $(this).attr('jid');
+ var affiliation = $(this).attr('affiliation');
+
+ // We create one input for one XID
+ addInputMucAdmin(xid, affiliation);
+ });
+
+ // Hide the wait icon
+ $('#mucadmin .wait').hide();
+
+ logThis('MUC admin items received: ' + fullXID(getStanzaFrom(iq)));
+}
+
+// Queries the MUC admin form
+function queryMucAdmin(xid, type) {
+ // Show the wait icon
+ $('#mucadmin .wait').show();
+
+ // New IQ
+ var iq = new JSJaCIQ();
+
+ iq.setTo(xid);
+ iq.setType('get');
+
+ var iqQuery = iq.setQuery(NS_MUC_ADMIN);
+ iqQuery.appendChild(iq.buildNode('item', {'affiliation': type, 'xmlns': NS_MUC_ADMIN}));
+
+ con.send(iq, handleMucAdminAuth);
+}
+
+// Sends the new chat-room topic
+function sendMucAdminTopic(xid) {
+ // We get the new topic
+ var topic = $('.mucadmin-topic textarea').val();
+
+ // We send the new topic if not blank
+ if(topic) {
+ var m = new JSJaCMessage();
+ m.setTo(xid);
+ m.setType('groupchat');
+ m.setSubject(topic);
+ con.send(m);
+
+ logThis('MUC admin topic sent: ' + topic, 3);
+ }
+}
+
+// Sends the MUC admin auth form
+function sendMucAdminAuth(xid) {
+ // We define the values array
+ var types = new Array('member', 'owner', 'admin', 'outcast');
+
+ for(i in types) {
+ // We get the current type
+ var tType = types[i];
+
+ // We loop for all the elements
+ $('.mucadmin-aut .aut-' + tType + ' input').each(function() {
+ // We set the iq headers
+ var iq = new JSJaCIQ();
+ iq.setTo(xid);
+ iq.setType('set');
+
+ var iqQuery = iq.setQuery(NS_MUC_ADMIN);
+
+ // We get the needed values
+ var value = $(this).val();
+
+ // If there's a value
+ if(value)
+ var item = iqQuery.appendChild(iq.buildNode('item', {'jid': value, 'xmlns': NS_MUC_ADMIN}));
+
+ // It the user had removed the XID
+ if($(this).hasClass('aut-dustbin') && value)
+ item.setAttribute('affiliation', 'none');
+
+ // If the value is not blank and okay
+ else if(value)
+ item.setAttribute('affiliation', tType);
+
+ // We send the iq !
+ con.send(iq, handleErrorReply);
+ });
+ }
+
+ logThis('MUC admin authorizations form sent: ' + xid, 3);
+}
+
+// Checks if the MUC room was destroyed
+function handleDestroyMucAdminIQ(iq) {
+ if(!handleErrorReply(iq)) {
+ // We close the groupchat
+ var room = fullXID(getStanzaFrom(iq));
+ var hash = hex_md5(room);
+ quitThisChat(room, hash, 'groupchat');
+
+ // We close the muc admin popup
+ closeMucAdmin();
+
+ // We tell the user that all is okay
+ openThisInfo(5);
+
+ // We remove the user's favorite
+ if(existDB('favorites', room))
+ removeThisFavorite(room, explodeThis('@', room, 0));
+
+ logThis('MUC admin destroyed: ' + room, 3);
+ }
+
+ // We hide the wait icon
+ $('#mucadmin .wait').hide();
+}
+
+// Destroys a MUC room
+function destroyMucAdminIQ(xid) {
+ // We ask the server to delete the room
+ var iq = new JSJaCIQ();
+
+ iq.setTo(xid);
+ iq.setType('set');
+ var iqQuery = iq.setQuery(NS_MUC_OWNER);
+ iqQuery.appendChild(iq.buildNode('destroy', {'xmlns': NS_MUC_OWNER}));
+
+ con.send(iq, handleDestroyMucAdminIQ);
+
+ logThis('MUC admin destroy sent: ' + xid, 3);
+
+ return false;
+}
+
+// Performs the MUC room destroy functions
+function destroyMucAdmin() {
+ // We get the XID of the current room
+ var xid = $('#mucadmin .mucadmin-head-jid').text();
+
+ // We show the wait icon
+ $('#mucadmin .wait').show();
+
+ // We send the iq
+ destroyMucAdminIQ(xid);
+}
+
+// Sends all the MUC admin stuffs
+function sendMucAdmin() {
+ // We get the XID of the current room
+ var xid = $('#mucadmin .mucadmin-head-jid').text();
+
+ // We change the room topic
+ sendMucAdminTopic(xid);
+
+ // We send the needed queries
+ sendDataForm('x', 'submit', 'submit', $('#mucadmin .mucadmin-results').attr('data-session'), xid, '', '', 'mucadmin');
+ sendMucAdminAuth(xid);
+}
+
+// Saves the MUC admin elements
+function saveMucAdmin() {
+ // We send the new options
+ sendMucAdmin();
+
+ // And we quit the popup
+ return closeMucAdmin();
+}
+
+// Plugin launcher
+function launchMucAdmin() {
+ // Click events
+ $('#mucadmin .bottom .finish').click(function() {
+ if($(this).is('.cancel'))
+ return closeMucAdmin();
+ if($(this).is('.save'))
+ return saveMucAdmin();
+ });
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the music JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 25/04/11
+
+*/
+
+// Opens the music bubble
+function openMusic() {
+ var path = '.music-content';
+
+ // Show the music bubble
+ showBubble(path);
+
+ $(document).oneTime(10, function() {
+ $(path + ' input').focus();
+ });
+
+ return false;
+}
+
+// Parses the music search XML
+function parseMusic(xml, type) {
+ var path = '.music-content ';
+ var content = path + '.list';
+ var path_type = content + ' .' + type;
+
+ // Create the result container
+ if(!exists(path_type)) {
+ var code = '<div class="' + type + '"></div>';
+
+ if(type == 'local')
+ $(content).prepend(code);
+ else
+ $(content).append(code);
+ }
+
+ // Fill the results
+ $(xml).find('track').each(function() {
+ // Parse the XML
+ var id = $(this).find('id').text();
+ var title = $(this).find('name').text();
+ var artist = $(this).find('artist').text();
+ var source = $(this).find('source').text();
+ var duration = $(this).find('duration').text();
+ var uri = $(this).find('url').text();
+ var mime = $(this).find('type').text();
+
+ // No ID?
+ if(!id)
+ id = hex_md5(uri);
+
+ // No MIME?
+ if(!mime)
+ mime = 'audio/ogg';
+
+ // Local URL?
+ if(type == 'local')
+ uri = generateURL(uri);
+
+ // Append the HTML code
+ $(path_type).append('<a href="#" class="song" data-id="' + id + '">' + title + '</a>');
+
+ // Current playing song?
+ var current_song = $(path_type + ' a[data-id=' + id + ']');
+
+ if(exists('.music-audio[data-id=' + id + ']'))
+ current_song.addClass('playing');
+
+ // Click event
+ current_song.click(function() {
+ return addMusic(id, title, artist, source, duration, uri, mime, type);
+ });
+ });
+
+ // The search is finished
+ if(exists(content + ' .jamendo') && exists(content + ' .local')) {
+ // Get the result values
+ var jamendo = $(content + ' .jamendo').text();
+ var local = $(content + ' .local').text();
+
+ // Enable the input
+ $(path + 'input').val('').removeAttr('disabled');
+
+ // No result
+ if(!jamendo && !local)
+ $(path + '.no-results').show();
+
+ // We must put a separator between the categories
+ if(jamendo && local)
+ $(content + ' .local').addClass('special');
+ }
+}
+
+// Sends the music search requests
+function searchMusic() {
+ var path = '.music-content ';
+
+ // We get the input string
+ var string = $(path + 'input').val();
+
+ // We lock the search input
+ $(path + 'input').attr('disabled', true);
+
+ // We reset the results
+ $(path + '.list div').remove();
+ $(path + '.no-results').hide();
+
+ // Get the Jamendo results
+ $.get('./php/music-search.php', {searchquery: string, location: 'jamendo'}, function(data) {
+ parseMusic(data, 'jamendo');
+ });
+
+ // Get the local results
+ $.get('./php/music-search.php', {searchquery: string, location: JAPPIX_LOCATION}, function(data) {
+ parseMusic(data, 'local');
+ });
+}
+
+// Performs an action on the music player
+function actionMusic(action) {
+ try {
+ // Initialize
+ var playThis = document.getElementById('top-content').getElementsByTagName('audio')[0];
+
+ // Nothing to play, exit
+ if(!playThis)
+ return false;
+
+ var stopButton = $('#top-content a.stop');
+
+ // User play a song
+ if(action == 'play') {
+ stopButton.show();
+ playThis.load();
+ playThis.play();
+ playThis.addEventListener('ended', function() {
+ actionMusic('stop');
+ }, true);
+
+ logThis('Music is now playing.');
+ }
+
+ // User stop the song or the song came to its end
+ else if(action == 'stop') {
+ stopButton.hide();
+ playThis.pause();
+ $('#top-content .music').removeClass('actived');
+ $('.music-content .list a').removeClass('playing');
+ $('.music-audio').remove();
+ publishMusic();
+
+ logThis('Music is now stopped.');
+ }
+ }
+
+ catch(e) {}
+
+ finally {
+ return false;
+ }
+}
+
+// Publishes the current title over PEP
+function publishMusic(title, artist, source, duration, uri) {
+ // We share the tune on PEP if enabled
+ if(enabledPEP()) {
+ /* REF: http://xmpp.org/extensions/xep-0118.html */
+
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ // Create the main PubSub nodes
+ var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB});
+ var publish = pubsub.appendChild(iq.buildNode('publish', {'node': NS_TUNE, 'xmlns': NS_PUBSUB}));
+ var item = publish.appendChild(iq.buildNode('item', {'xmlns': NS_PUBSUB}));
+ var tune = item.appendChild(iq.buildNode('tune', {'xmlns': NS_TUNE}));
+
+ // Enough data?
+ if(title || artist || source || uri) {
+ // Data array
+ var nodes = new Array(
+ 'title',
+ 'artist',
+ 'source',
+ 'length',
+ 'uri'
+ );
+
+ var values = new Array(
+ title,
+ artist,
+ source,
+ length,
+ uri
+ );
+
+ // Create the children nodes
+ for(i in nodes) {
+ if(values[i])
+ tune.appendChild(iq.buildNode(nodes[i], {'xmlns': NS_TUNE}, values[i]));
+ }
+ }
+
+ con.send(iq);
+
+ logThis('New tune sent: ' + title, 3);
+ }
+}
+
+// Adds a music title to the results
+function addMusic(id, title, artist, source, duration, uri, mime, type) {
+ var path = '.music-content ';
+
+ // We remove & create a new audio tag
+ $('.music-audio').remove();
+ $(path + '.player').prepend('<audio class="music-audio" type="' + mime + '" data-id="' + id + '" />');
+
+ // We apply the new source to the player
+ if(type == 'jamendo')
+ $('.music-audio').attr('src', 'http://api.jamendo.com/get2/stream/track/redirect/?id=' + id + '&streamencoding=ogg2');
+ else
+ $('.music-audio').attr('src', uri);
+
+ // We play the target sound
+ actionMusic('play');
+
+ // We set the actived class
+ $('#top-content .music').addClass('actived');
+
+ // We set a current played track indicator
+ $(path + '.list a').removeClass('playing');
+ $(path + 'a[data-id=' + id + ']').addClass('playing');
+
+ // We publish what we listen
+ publishMusic(title, artist, source, duration, uri);
+
+ return false;
+}
+
+// Plugin launcher
+function launchMusic() {
+ // When music search string submitted
+ $('.music-content input').keyup(function(e) {
+ // Enter : send
+ if(e.keyCode == 13 && $(this).val())
+ searchMusic();
+
+ // Escape : quit
+ if(e.keyCode == 27)
+ closeBubbles();
+ });
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the buddy name related JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 29/04/11
+
+*/
+
+// Gets an user name for buddy add tool
+function getAddUserName(xid) {
+ var iq = new JSJaCIQ();
+ iq.setType('get');
+ iq.setTo(xid);
+
+ iq.appendNode('vCard', {'xmlns': NS_VCARD});
+
+ con.send(iq, handleAddUserName);
+}
+
+// Handles an user name for buddy add tool
+function handleAddUserName(iq) {
+ // Was it an obsolete request?
+ if(!exists('.add-contact-name-get[data-for=' + escape(bareXID(getStanzaFrom(iq))) + ']'))
+ return false;
+
+ // Reset the waiting item
+ $('.add-contact-name-get').hide().removeAttr('data-for');
+
+ // Get the names
+ if(iq.getType() == 'result') {
+ var full_name = generateBuddyName(iq)[0];
+
+ if(full_name)
+ $('.add-contact-name').val(full_name);
+ }
+
+ return false;
+}
+
+// Generates the good buddy name from a vCard IQ reply
+function generateBuddyName(iq) {
+ // Get the IQ content
+ var xml = $(iq.getNode()).find('vCard');
+
+ // Get the full name & the nickname
+ var pFull = xml.find('FN:first').text();
+ var pNick = xml.find('NICKNAME:first').text();
+
+ // No full name?
+ if(!pFull) {
+ // Get the given name
+ var pN = xml.find('N:first');
+ var pGiven = pN.find('GIVEN:first').text();
+
+ if(pGiven) {
+ pFull = pGiven;
+
+ // Get the family name (optional)
+ var pFamily = pN.find('FAMILY:first').text();
+
+ if(pFamily)
+ pFull += ' ' + pFamily;
+ }
+ }
+
+ return [pFull, pNick];
+}
+
+// Returns the given XID buddy name
+function getBuddyName(xid) {
+ // Initialize
+ var cname, bname;
+
+ // Cut the XID resource
+ xid = bareXID(xid);
+
+ // This is me?
+ if(isAnonymous() && !xid)
+ bname = _e("You");
+ else if(xid == getXID())
+ bname = getName();
+
+ // Not me!
+ else {
+ cname = $('#buddy-list .buddy[data-xid=' + escape(xid) + ']:first .buddy-name').html();
+
+ // If the complete name exists
+ if(cname)
+ bname = cname.revertHtmlEnc();
+
+ // Else, we just get the nickname of the buddy
+ else
+ bname = getXIDNick(xid);
+ }
+
+ return bname;
+}
+
+// Gets the nickname of the user
+function getNick() {
+ // Try to read the user nickname
+ var nick = getDB('profile', 'nick');
+
+ // No nick?
+ if(!nick)
+ nick = con.username;
+
+ return nick;
+}
+
+// Gets the full name of the user
+function getName() {
+ // Try to read the user name
+ var name = getDB('profile', 'name');
+
+ // No name? Use the nickname instead!
+ if(!name)
+ name = getNick();
+
+ return name;
+}
+
+// Gets the MUC nickname of the user
+function getMUCNick(id) {
+ return unescape($('#' + id).attr('data-nick'));
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the notification JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 27/08/11
+
+*/
+
+// Resets the notifications alert if no one remaining
+function closeEmptyNotifications() {
+ if(!$('.one-notification').size())
+ closeBubbles();
+}
+
+// Checks if there are pending notifications
+function checkNotifications() {
+ // Define the selectors
+ var notif = '#top-content .notifications';
+ var nothing = '.notifications-content .nothing';
+ var empty = '.notifications-content .empty';
+
+ // Get the notifications number
+ var number = $('.one-notification').size();
+
+ // Remove the red notify bubble
+ $(notif + ' .notify').remove();
+
+ // Any notification?
+ if(number) {
+ $(notif).prepend('<div class="notify one-counter" data-counter="' + number + '">' + number + '</div>');
+ $(nothing).hide();
+ $(empty).show();
+ }
+
+ // No notification!
+ else {
+ $(empty).hide();
+ $(nothing).show();
+
+ // Purge the social inbox node
+ purgeNotifications();
+ }
+
+ // Update the page title
+ updateTitle();
+}
+
+// Creates a new notification
+function newNotification(type, from, data, body, id, inverse) {
+ if(!type || !from)
+ return;
+
+ // Generate an ID hash
+ if(!id)
+ var id = hex_md5(type + from);
+
+ // Generate the text to be displayed
+ var text, action, code;
+ var yes_path = 'href="#"';
+
+ // User things
+ from = bareXID(from);
+ var hash = hex_md5(from);
+
+ switch(type) {
+ case 'subscribe':
+ // Get the name to display
+ var display_name = data[1];
+
+ if(!display_name)
+ display_name = data[0];
+
+ text = '<b>' + display_name.htmlEnc() + '</b> ' + _e("would like to add you as a friend.") + ' ' + _e("Do you accept?");
+
+ break;
+
+ case 'invite_room':
+ text = '<b>' + getBuddyName(from).htmlEnc() + '</b> ' + _e("would like you to join this chatroom:") + ' <em>' + data[0].htmlEnc() + '</em> ' + _e("Do you accept?");
+
+ break;
+
+ case 'request':
+ text = '<b>' + from.htmlEnc() + '</b> ' + _e("would like to get authorization.") + ' ' + _e("Do you accept?");
+
+ break;
+
+ case 'send':
+ yes_path = 'href="' + encodeQuotes(data[1]) + '" target="_blank"';
+
+ text = '<b>' + getBuddyName(from).htmlEnc() + '</b> ' + printf(_e("would like to send you a file: ā%sā.").htmlEnc(), '<em>' + truncate(body, 25).htmlEnc() + '</em>') + ' ' + _e("Do you accept?");
+
+ break;
+
+ case 'send_pending':
+ text = '<b>' + getBuddyName(from).htmlEnc() + '</b> ' + printf(_e("has received a file exchange request: ā%sā.").htmlEnc(), '<em>' + truncate(body, 25).htmlEnc() + '</em>');
+
+ break;
+
+ case 'send_accept':
+ text = '<b>' + getBuddyName(from).htmlEnc() + '</b> ' + printf(_e("has accepted to received your file: ā%sā.").htmlEnc(), '<em>' + truncate(body, 25).htmlEnc() + '</em>');
+
+ break;
+
+ case 'send_reject':
+ text = '<b>' + getBuddyName(from).htmlEnc() + '</b> ' + printf(_e("has rejected to receive your file: ā%sā.").htmlEnc(), '<em>' + truncate(body, 25).htmlEnc() + '</em>');
+
+ break;
+
+ case 'send_fail':
+ text = '<b>' + getBuddyName(from).htmlEnc() + '</b> ' + printf(_e("could not receive your file: ā%sā.").htmlEnc(), '<em>' + truncate(body, 25).htmlEnc() + '</em>');
+
+ break;
+
+ case 'rosterx':
+ text = printf(_e("Do you want to see the friends %s suggests you?").htmlEnc(), '<b>' + getBuddyName(from).htmlEnc() + '</b>');
+
+ break;
+
+ case 'comment':
+ text = '<b>' + data[0].htmlEnc() + '</b> ' + printf(_e("commented an item you follow: ā%sā.").htmlEnc(), '<em>' + truncate(body, 25).htmlEnc() + '</em>');
+
+ break;
+
+ case 'like':
+ text = '<b>' + data[0].htmlEnc() + '</b> ' + printf(_e("liked your post: ā%sā.").htmlEnc(), '<em>' + truncate(body, 25).htmlEnc() + '</em>');
+
+ break;
+
+ case 'quote':
+ text = '<b>' + data[0].htmlEnc() + '</b> ' + printf(_e("quoted you somewhere: ā%sā.").htmlEnc(), '<em>' + truncate(body, 25).htmlEnc() + '</em>');
+
+ break;
+
+ case 'wall':
+ text = '<b>' + data[0].htmlEnc() + '</b> ' + printf(_e("published on your wall: ā%sā.").htmlEnc(), '<em>' + truncate(body, 25).htmlEnc() + '</em>');
+
+ break;
+
+ case 'photo':
+ text = '<b>' + data[0].htmlEnc() + '</b> ' + printf(_e("tagged you in a photo (%s).").htmlEnc(), '<em>' + truncate(body, 25).htmlEnc() + '</em>');
+
+ break;
+
+ case 'video':
+ text = '<b>' + data[0].htmlEnc() + '</b> ' + printf(_e("tagged you in a video (%s).").htmlEnc(), '<em>' + truncate(body, 25).htmlEnc() + '</em>');
+
+ break;
+
+ default:
+ break;
+ }
+
+ // No text?
+ if(!text)
+ return;
+
+ // Action links?
+ if((type == 'send_pending') || (type == 'send_accept') || (type == 'send_reject') || (type == 'send_fail') || (type == 'comment') || (type == 'like') || (type == 'quote') || (type == 'wall') || (type == 'photo') || (type == 'video')) {
+ action = '<a href="#" class="no">' + _e("Hide") + '</a>';
+
+ // Any parent link?
+ if((type == 'comment') && data[2])
+ action = '<a href="#" class="yes">' + _e("Show") + '</a>' + action;
+ }
+
+ else
+ action = '<a ' + yes_path + ' class="yes">' + _e("Yes") + '</a><a href="#" class="no">' + _e("No") + '</a>';
+
+ if(text) {
+ // We display the notification
+ if(!exists('.notifications-content .' + id)) {
+ // We create the html markup depending of the notification type
+ code = '<div class="one-notification ' + id + ' ' + hash + '" title="' + encodeQuotes(body) + '" data-type="' + encodeQuotes(type) + '">' +
+ '<div class="avatar-container">' +
+ '<img class="avatar" src="' + './img/others/default-avatar.png' + '" alt="" />' +
+ '</div>' +
+
+ '<p class="notification-text">' + text + '</p>' +
+ '<p class="notification-actions">' +
+ '<span class="talk-images" />' +
+ action +
+ '</p>' +
+ '</div>';
+
+ // Add the HTML code
+ if(inverse)
+ $('.notifications-content .nothing').before(code);
+ else
+ $('.notifications-content .empty').after(code);
+
+ // Play a sound to alert the user
+ soundPlay(2);
+
+ // The yes click function
+ $('.' + id + ' a.yes').click(function() {
+ actionNotification(type, data, 'yes', id);
+
+ if(($(this).attr('href') == '#') && ($(this).attr('target') != '_blank'))
+ return false;
+ });
+
+ // The no click function
+ $('.' + id + ' a.no').click(function() {
+ return actionNotification(type, data, 'no', id);
+ });
+
+ // Get the user avatar
+ getAvatar(from, 'cache', 'true', 'forget');
+ }
+ }
+
+ // We tell the user he has a new pending notification
+ checkNotifications();
+
+ logThis('New notification: ' + from, 3);
+}
+
+// Performs an action on a given notification
+function actionNotification(type, data, value, id) {
+ // We launch a function depending of the type
+ if((type == 'subscribe') && (value == 'yes'))
+ acceptSubscribe(data[0], data[1]);
+
+ else if((type == 'subscribe') && (value == 'no'))
+ sendSubscribe(data[0], 'unsubscribed');
+
+ else if((type == 'invite_room') && (value == 'yes'))
+ checkChatCreate(data[0], 'groupchat');
+
+ else if(type == 'request')
+ requestReply(value, data[0]);
+
+ if((type == 'send') && (value == 'yes'))
+ replyOOB(data[0], data[3], 'accept', data[2], data[4]);
+
+ else if((type == 'send') && (value == 'no'))
+ replyOOB(data[0], data[3], 'reject', data[2], data[4]);
+
+ else if((type == 'rosterx') && (value == 'yes'))
+ openRosterX(data[0]);
+
+ else if((type == 'comment') || (type == 'like') || (type == 'quote') || (type == 'wall') || (type == 'photo') || (type == 'video')) {
+ if(value == 'yes') {
+ // Get the microblog item
+ fromInfosMicroblog(data[2]);
+
+ // Append the marker
+ $('#channel .top.individual').append('<input type="hidden" name="comments" value="' + encodeQuotes(data[1]) + '" />');
+ }
+
+ removeNotification(data[3]);
+ }
+
+ // We remove the notification
+ $('.notifications-content .' + id).remove();
+
+ // We check if there's any other pending notification
+ closeEmptyNotifications();
+ checkNotifications();
+
+ return false;
+}
+
+// Clear the social notifications
+function clearNotifications() {
+ // Remove notifications
+ $('.one-notification').remove();
+
+ // Refresh
+ closeEmptyNotifications();
+ checkNotifications();
+
+ return false;
+}
+
+// Gets the pending social notifications
+function getNotifications() {
+ var iq = new JSJaCIQ();
+ iq.setType('get');
+
+ var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB});
+ pubsub.appendChild(iq.buildNode('items', {'node': NS_URN_INBOX, 'xmlns': NS_PUBSUB}));
+
+ con.send(iq, handleNotifications);
+
+ logThis('Getting social notifications...');
+}
+
+// Handles the social notifications
+function handleNotifications(iq) {
+ // Any error?
+ if((iq.getType() == 'error') && $(iq.getNode()).find('item-not-found').size()) {
+ // The node may not exist, create it!
+ setupMicroblog('', NS_URN_INBOX, '1', '1000000', 'whitelist', 'open', true);
+
+ logThis('Error while getting social notifications, trying to reconfigure the Pubsub node!', 2);
+ }
+
+ // Selector
+ var items = $(iq.getNode()).find('item');
+
+ // Should we inverse?
+ var inverse = true;
+
+ if(items.size() == 1)
+ inverse = false;
+
+ // Parse notifications
+ items.each(function() {
+ // Parse the current item
+ var current_item = $(this).attr('id');
+ var current_type = $(this).find('link[rel=via]:first').attr('title');
+ var current_href = $(this).find('link[rel=via]:first').attr('href');
+ var current_parent_href = $(this).find('link[rel=related]:first').attr('href');
+ var current_xid = explodeThis(':', $(this).find('source author uri').text(), 1);
+ var current_name = $(this).find('source author name').text();
+ var current_text = $(this).find('content[type=text]:first').text();
+ var current_bname = getBuddyName(current_xid);
+ var current_id = hex_md5(current_type + current_xid + current_href + current_text);
+
+ // Choose the good name!
+ if(!current_name || (current_bname != getXIDNick(current_xid)))
+ current_name = current_bname;
+
+ // Create it!
+ newNotification(current_type, current_xid, [current_name, current_href, current_parent_href, current_item], current_text, current_id, inverse);
+ });
+
+ logThis(items.size() + ' social notification(s) got!', 3);
+}
+
+// Sends a social notification
+function sendNotification(xid, type, href, text, parent) {
+ // Notification ID
+ var id = hex_md5(xid + text + getTimeStamp());
+
+ // IQ
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+ iq.setTo(xid);
+
+ // ATOM content
+ var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB});
+ var publish = pubsub.appendChild(iq.buildNode('publish', {'node': NS_URN_INBOX, 'xmlns': NS_PUBSUB}));
+ var item = publish.appendChild(iq.buildNode('item', {'id': id, 'xmlns': NS_PUBSUB}));
+ var entry = item.appendChild(iq.buildNode('entry', {'xmlns': NS_ATOM}));
+
+ // Notification author (us)
+ var Source = entry.appendChild(iq.buildNode('source', {'xmlns': NS_ATOM}));
+ var author = Source.appendChild(iq.buildNode('author', {'xmlns': NS_ATOM}));
+ author.appendChild(iq.buildNode('name', {'xmlns': NS_ATOM}, getName()));
+ author.appendChild(iq.buildNode('uri', {'xmlns': NS_ATOM}, 'xmpp:' + getXID()));
+
+ // Notification content
+ entry.appendChild(iq.buildNode('published', {'xmlns': NS_ATOM}, getXMPPTime('utc')));
+ entry.appendChild(iq.buildNode('content', {'type': 'text', 'xmlns': NS_ATOM}, text));
+ entry.appendChild(iq.buildNode('link', {'rel': 'via', 'title': type, 'href': href, 'xmlns': NS_ATOM}));
+
+ // Any parent item?
+ if(parent && parent[0] && parent[1] && parent[2]) {
+ // Generate the parent XMPP URI
+ var parent_href = 'xmpp:' + parent[0] + '?;node=' + encodeURIComponent(parent[1]) + ';item=' + encodeURIComponent(parent[2]);
+
+ entry.appendChild(iq.buildNode('link', {'rel': 'related', 'href': parent_href, 'xmlns': NS_ATOM}));
+ }
+
+ con.send(iq);
+
+ logThis('Sending a social notification to ' + xid + ' (type: ' + type + ')...');
+}
+
+// Removes a social notification
+function removeNotification(id) {
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB});
+ var retract = pubsub.appendChild(iq.buildNode('retract', {'node': NS_URN_INBOX, 'xmlns': NS_PUBSUB}));
+ retract.appendChild(iq.buildNode('item', {'id': id, 'xmlns': NS_PUBSUB}));
+
+ con.send(iq);
+}
+
+// Purge the social notifications
+function purgeNotifications() {
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB_OWNER});
+ pubsub.appendChild(iq.buildNode('purge', {'node': NS_URN_INBOX, 'xmlns': NS_PUBSUB_OWNER}));
+
+ con.send(iq);
+
+ return false;
+}
+
+// Adapt the notifications bubble max-height
+function adaptNotifications() {
+ // Process the new height
+ var max_height = $('#right-content').height() - 22;
+
+ // New height too small
+ if(max_height < 250)
+ max_height = 250;
+
+ // Apply the new height
+ $('.notifications-content .tools-content-subitem').css('max-height', max_height);
+}
+
+// Plugin launcher
+function launchNotifications() {
+ // Adapt the notifications height
+ adaptNotifications();
+}
+
+// Window resize event handler
+$(window).resize(adaptNotifications);
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the Out of Band Data JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 27/08/11
+
+*/
+
+// Sends an OOB request to someone
+function sendOOB(to, type, url, desc) {
+ // IQ stanza?
+ if(type == 'iq') {
+ // Get some values
+ var id = hex_md5(genID() + to + url + desc);
+ to = getHighestResource(to);
+
+ // IQs cannot be sent to offline users
+ if(!to)
+ return;
+
+ // Register the ID
+ setDB('send/url', id, url);
+ setDB('send/desc', id, desc);
+
+ var aIQ = new JSJaCIQ();
+ aIQ.setTo(fullXID(to));
+ aIQ.setType('set');
+ aIQ.setID(id);
+
+ // Append the query content
+ var aQuery = aIQ.setQuery(NS_IQOOB);
+ aQuery.appendChild(aIQ.buildNode('url', {'xmlns': NS_IQOOB}, url));
+ aQuery.appendChild(aIQ.buildNode('desc', {'xmlns': NS_IQOOB}, desc));
+
+ con.send(aIQ);
+ }
+
+ // Message stanza?
+ else {
+ var aMsg = new JSJaCMessage();
+ aMsg.setTo(bareXID(to));
+
+ // Append the content
+ aMsg.setBody(desc);
+ var aX = aMsg.appendNode('x', {'xmlns': NS_XOOB});
+ aX.appendChild(aMsg.buildNode('url', {'xmlns': NS_XOOB}, url));
+
+ con.send(aMsg);
+ }
+
+ logThis('Sent OOB request to: ' + to + ' (' + desc + ')');
+}
+
+// Handles an OOB request
+function handleOOB(from, id, type, node) {
+ var xid = url = desc = '';
+
+ // IQ stanza?
+ if(type == 'iq') {
+ xid = fullXID(from);
+ url = $(node).find('url').text();
+ desc = $(node).find('desc').text();
+ }
+
+ // Message stanza?
+ else {
+ xid = bareXID(from);
+ url = $(node).find('url').text();
+ desc = $(node).find('body').text();
+ }
+
+ // No desc?
+ if(!desc)
+ desc = url;
+
+ // Open a new notification
+ if(type && xid && url && desc)
+ newNotification('send', xid, [xid, url, type, id, node], desc, hex_md5(xid + url + desc + id));
+}
+
+// Replies to an OOB request
+function replyOOB(to, id, choice, type, node) {
+ // Not IQ type?
+ if(type != 'iq')
+ return;
+
+ // New IQ
+ var aIQ = new JSJaCIQ();
+ aIQ.setTo(to);
+ aIQ.setID(id);
+
+ // OOB request accepted
+ if(choice == 'accept') {
+ aIQ.setType('result');
+
+ logThis('Accepted file request from: ' + to, 3);
+ }
+
+ // OOB request rejected
+ else {
+ aIQ.setType('error');
+
+ // Append stanza content
+ for(var i = 0; i < node.childNodes.length; i++)
+ aIQ.getNode().appendChild(node.childNodes.item(i).cloneNode(true));
+
+ // Append error content
+ var aError = aIQ.appendNode('error', {'xmlns': NS_CLIENT, 'code': '406', 'type': 'modify'});
+ aError.appendChild(aIQ.buildNode('not-acceptable', {'xmlns': NS_STANZAS}));
+
+ logThis('Rejected file request from: ' + to, 3);
+ }
+
+ con.send(aIQ);
+}
+
+// Wait event for OOB upload
+function waitUploadOOB() {
+ // Append the wait icon
+ $('#page-engine .chat-tools-file:not(.mini) .tooltip-subitem *').hide();
+ $('#page-engine .chat-tools-file:not(.mini) .tooltip-subitem').append('<div class="wait wait-medium"></div>');
+
+ // Lock the bubble
+ $('#page-engine .chat-tools-file:not(.mini)').addClass('mini');
+}
+
+// Success event for OOB upload
+function handleUploadOOB(responseXML) {
+ // Data selector
+ var dData = $(responseXML).find('jappix');
+
+ // Get the values
+ var fID = dData.find('id').text();
+ var fURL = dData.find('url').text();
+ var fDesc = dData.find('desc').text();
+
+ // Get the OOB values
+ var oob_has;
+
+ // No ID provided?
+ if(!fID)
+ oob_has = ':has(.wait)';
+ else
+ oob_has = ':has(#oob-upload input[value=' + fID + '])';
+
+ var xid = $('#page-engine .page-engine-chan' + oob_has).attr('data-xid');
+ var oob_type = $('#page-engine .chat-tools-file' + oob_has).attr('data-oob');
+
+ // Reset the file send tool
+ $('#page-engine .chat-tools-file' + oob_has).removeClass('mini');
+ $('#page-engine .bubble-file' + oob_has).remove();
+
+ // Not available?
+ if($('#page-engine .chat-tools-file' + oob_has).is(':hidden') && (oob_type == 'iq')) {
+ openThisError(4);
+
+ // Remove the file we sent
+ if(fURL)
+ $.get(fURL + '&action=remove');
+ }
+
+ // Everything okay?
+ else if(fURL && fDesc && !dData.find('error').size()) {
+ // Send the OOB request
+ sendOOB(xid, oob_type, fURL, fDesc);
+
+ // Notify the sender
+ newNotification('send_pending', xid, [xid, fURL, oob_type, '', ''], fDesc, hex_md5(fURL + fDesc + fID));
+
+ logThis('File request sent.', 3);
+ }
+
+ // Upload error?
+ else {
+ openThisError(4);
+
+ logThis('Error while sending the file: ' + dData.find('error').text(), 1);
+ }
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the options JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 17/07/11
+
+*/
+
+// Opens the options popup
+function optionsOpen() {
+ // Popup HTML content
+ var html =
+ '<div class="top">' + _e("Edit options") + '</div>' +
+
+ '<div class="tab">' +
+ '<a href="#" class="tab-active" data-key="1">' + _e("General") + '</a>' +
+ '<a href="#" class="pubsub-hidable" data-key="2">' + _e("Channel") + '</a>' +
+ '<a href="#" data-key="3">' + _e("Account") + '</a>' +
+ '</div>' +
+
+ '<div class="content">' +
+ '<div id="conf1" class="lap-active one-lap forms">' +
+ '<fieldset class="privacy">' +
+ '<legend>' + _e("Privacy") + '</legend>' +
+
+ '<label for="geolocation" class="pep-hidable">' + _e("Geolocation") + '</label>' +
+ '<input id="geolocation" type="checkbox" class="pep-hidable" />' +
+
+ '<label for="archiving" class="archives-hidable pref">' + _e("Message archiving") + '</label>' +
+ '<input id="archiving" type="checkbox" class="archives-hidable pref" />' +
+ '</fieldset>' +
+
+ '<fieldset>' +
+ '<legend>' + _e("Application") + '</legend>' +
+
+ '<label for="sounds">' + _e("Sounds") + '</label>' +
+ '<input id="sounds" type="checkbox" />' +
+
+ '<label for="showall">' + _e("Show all friends") + '</label>' +
+ '<input id="showall" type="checkbox" />' +
+
+ '<label for="integratemedias">' + _e("Media integration") + '</label>' +
+ '<input id="integratemedias" type="checkbox" />' +
+
+ '<label class="xmpplinks-hidable">' + _e("XMPP links") + '</label>' +
+ '<a href="#" class="linked xmpp-links xmpplinks-hidable">' + _e("Open XMPP links with Jappix") + '</a>' +
+ '</fieldset>' +
+ '</div>' +
+
+ '<div id="conf2" class="one-lap forms">' +
+ '<fieldset>' +
+ '<legend>' + _e("Channel") + '</legend>' +
+
+ '<label>' + _e("Empty") + '</label>' +
+ '<a href="#" class="linked empty-channel">' + _e("Empty channel") + '</a>' +
+
+ '<label>' + _e("Persistent") + '</label>' +
+ '<input id="persistent" type="checkbox" />' +
+
+ '<label>' + _e("Maximum notices") + '</label>' +
+ '<select id="maxnotices">' +
+ '<option value="1">1</option>' +
+ '<option value="100">100</option>' +
+ '<option value="1000">1000</option>' +
+ '<option value="10000">10000</option>' +
+ '<option value="100000">100000</option>' +
+ '<option value="1000000">1000000</option>' +
+ '</select>' +
+ '</fieldset>' +
+
+ '<div class="sub-ask sub-ask-empty sub-ask-element">' +
+ '<div class="sub-ask-top">' +
+ '<div class="sub-ask-title">' + _e("Empty channel") + '</div>' +
+ '<a href="#" class="sub-ask-close">X</a>' +
+ '</div>' +
+
+ '<div class="sub-ask-content">' +
+ '<label>' + _e("Password") + '</label>' +
+ '<input type="password" class="purge-microblog check-empty" required="" />' +
+ '</div>' +
+
+ '<a href="#" class="sub-ask-bottom">' + _e("Empty") + ' »</a>' +
+ '</div>' +
+ '</div>' +
+
+ '<div id="conf3" class="one-lap forms">' +
+ '<fieldset>' +
+ '<legend>' + _e("Account") + '</legend>' +
+
+ '<label>' + _e("Password") + '</label>' +
+ '<a href="#" class="linked change-password">' + _e("Change password") + '</a>' +
+
+ '<label>' + _e("Delete") + '</label>' +
+ '<a href="#" class="linked delete-account">' + _e("Delete account") + '</a>' +
+ '</fieldset>' +
+
+ '<div class="sub-ask sub-ask-pass sub-ask-element">' +
+ '<div class="sub-ask-top">' +
+ '<div class="sub-ask-title">' + _e("Change password") + '</div>' +
+ '<a href="#" class="sub-ask-close">X</a>' +
+ '</div>' +
+
+ '<div class="sub-ask-content">' +
+ '<label>' + _e("Old") + '</label>' +
+ '<input type="password" class="password-change old" required="" />' +
+
+ '<label>' + _e("New (2 times)") + '</label>' +
+ '<input type="password" class="password-change new1" required="" />' +
+ '<input type="password" class="password-change new2" required="" />' +
+ '</div>' +
+
+ '<a href="#" class="sub-ask-bottom">' + _e("Continue") + ' »</a>' +
+ '</div>' +
+
+ '<div class="sub-ask sub-ask-delete sub-ask-element">' +
+ '<div class="sub-ask-top">' +
+ '<div class="sub-ask-title">' + _e("Delete account") + '</div>' +
+ '<a href="#" class="sub-ask-close">X</a>' +
+ '</div>' +
+
+ '<div class="sub-ask-content">' +
+ '<label>' + _e("Password") + '</label>' +
+ '<input type="password" class="delete-account check-password" required="" />' +
+ '</div>' +
+
+ '<a href="#" class="sub-ask-bottom">' + _e("Delete") + ' »</a>' +
+ '</div>' +
+ '</div>' +
+ '</div>' +
+
+ '<div class="bottom">' +
+ '<div class="wait wait-medium"></div>' +
+
+ '<a href="#" class="finish save">' + _e("Save") + '</a>' +
+ '<a href="#" class="finish cancel">' + _e("Cancel") + '</a>' +
+ '</div>';
+
+ // Create the popup
+ createPopup('options', html);
+
+ // Apply the features
+ applyFeatures('options');
+
+ // Associate the events
+ launchOptions();
+
+ return false;
+}
+
+// Closes the options popup
+function closeOptions() {
+ // Destroy the popup
+ destroyPopup('options');
+
+ return false;
+}
+
+// Checks whether the options are loaded or not
+function loadedOptions() {
+ if($('.options-hidable').is(':visible'))
+ return true;
+
+ return false;
+}
+
+// Switches between the options tabs
+function switchOptions(id) {
+ $('#options .one-lap').hide();
+ $('#options #conf' + id).show();
+ $('#options .tab a').removeClass('tab-active');
+ $('#options .tab a[data-key=' + id + ']').addClass('tab-active');
+
+ return false;
+}
+
+// Manages the options wait item
+function waitOptions(id) {
+ var sOptions = $('#options .content');
+
+ // Remove the current item class
+ sOptions.removeClass(id);
+
+ // Hide the waiting items if all was received
+ if(!sOptions.hasClass('microblog') && !sOptions.hasClass('archives')) {
+ $('#options .wait').hide();
+ $('#options .finish:first').removeClass('disabled');
+ }
+}
+
+// Sends the options to the XMPP server
+function storeOptions() {
+ // Get the values
+ var sounds = getDB('options', 'sounds');
+ var geolocation = getDB('options', 'geolocation');
+ var showall = getDB('options', 'roster-showall');
+ var integratemedias = getDB('options', 'integratemedias');
+ var status = getDB('options', 'presence-status');
+
+ // Create an array to be looped
+ var oType = new Array('sounds', 'geolocation', 'roster-showall', 'integratemedias', 'presence-status');
+ var oContent = new Array(sounds, geolocation, showall, integratemedias, status);
+
+ // New IQ
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ var query = iq.setQuery(NS_PRIVATE);
+ var storage = query.appendChild(iq.buildNode('storage', {'xmlns': NS_OPTIONS}));
+
+ // Loop the array
+ for(i in oType)
+ storage.appendChild(iq.buildNode('option', {'type': oType[i], 'xmlns': NS_OPTIONS}, oContent[i]));
+
+ con.send(iq, handleStoreOptions);
+
+ logThis('Storing options...', 3);
+}
+
+// Handles the option storing
+function handleStoreOptions(iq) {
+ if(!iq || (iq.getType() != 'result'))
+ logThis('Options not stored.', 2);
+ else
+ logThis('Options stored.', 3);
+}
+
+// Saves the user options
+function saveOptions() {
+ // We apply the sounds
+ var sounds = '0';
+
+ if($('#sounds').filter(':checked').size())
+ sounds = '1';
+
+ setDB('options', 'sounds', sounds);
+
+ // We apply the geolocation
+ if($('#geolocation').filter(':checked').size()) {
+ setDB('options', 'geolocation', '1');
+
+ // We geolocate the user on the go
+ geolocate();
+ }
+
+ else {
+ setDB('options', 'geolocation', '0');
+
+ // We delete the geolocation informations
+ sendPosition();
+ removeDB('geolocation', 'now');
+ }
+
+ // We apply the roster show all
+ if($('#showall').filter(':checked').size()) {
+ setDB('options', 'roster-showall', '1');
+ showAllBuddies('options');
+ }
+
+ else {
+ setDB('options', 'roster-showall', '0');
+ showOnlineBuddies('options');
+ }
+
+ // We apply the media integration
+ var integratemedias = '0';
+
+ if($('#integratemedias').filter(':checked').size())
+ integratemedias = '1';
+
+ setDB('options', 'integratemedias', integratemedias);
+
+ // We apply the message archiving
+ if(enabledArchives('pref')) {
+ var aEnabled = false;
+
+ if($('#archiving').filter(':checked').size())
+ aEnabled = true;
+
+ configArchives(aEnabled);
+ }
+
+ // We apply the microblog configuration
+ var persist = '0';
+ var maximum = $('#maxnotices').val();
+
+ if($('#persistent').filter(':checked').size())
+ persist = '1';
+
+ if(enabledPEP() && enabledPubSub())
+ setupMicroblog('', NS_URN_MBLOG, persist, maximum, '', '', false);
+
+ // We send the options to the database
+ storeOptions();
+
+ // Close the options
+ closeOptions();
+
+ return false;
+}
+
+// Handles the password changing
+function handlePwdChange(iq) {
+ // Remove the general wait item
+ removeGeneralWait();
+
+ // If no errors
+ if(!handleErrorReply(iq)) {
+ clearLastSession();
+ quit();
+ openThisInfo(1);
+
+ logThis('Password changed.', 3);
+ }
+
+ else
+ logThis('Password not changed.', 2);
+}
+
+// Sends the new account password
+function sendNewPassword() {
+ /* REF: http://xmpp.org/extensions/xep-0077.html#usecases-changepw */
+
+ var password0 = $('#options .old').val();
+ var password1 = $('#options .new1').val();
+ var password2 = $('#options .new2').val();
+
+ if ((password1 == password2) && (password0 == getPassword())) {
+ // We show the waiting image
+ showGeneralWait();
+
+ // We send the IQ
+ var iq = new JSJaCIQ();
+
+ iq.setTo(getServer());
+ iq.setType('set');
+
+ var iqQuery = iq.setQuery(NS_REGISTER);
+
+ iqQuery.appendChild(iq.buildNode('username', {'xmlns': NS_REGISTER}, con.username));
+ iqQuery.appendChild(iq.buildNode('password', {'xmlns': NS_REGISTER}, password1));
+
+ con.send(iq, handlePwdChange);
+
+ logThis('Password change sent.', 3);
+ }
+
+ else {
+ $('.sub-ask-pass input').each(function() {
+ var select = $(this);
+
+ if(!select.val())
+ $(document).oneTime(10, function() {
+ select.addClass('please-complete').focus();
+ });
+ else
+ select.removeClass('please-complete');
+ });
+
+ if(password0 != getPassword())
+ $(document).oneTime(10, function() {
+ $('#options .old').addClass('please-complete').focus();
+ });
+ if(password1 != password2)
+ $(document).oneTime(10, function() {
+ $('#options .new1, #options .new2').addClass('please-complete').focus();
+ });
+ }
+
+ return false;
+}
+
+// Handles the account deletion request
+function handleAccDeletion(iq) {
+ // Remove the general wait item
+ removeGeneralWait();
+
+ // If no errors
+ if(!handleErrorReply(iq)) {
+ clearLastSession();
+ destroyTalkPage();
+ openThisInfo(2);
+ logout();
+
+ logThis('Account deleted.', 3);
+ }
+
+ else
+ logThis('Account not deleted.', 2);
+}
+
+// Purge the user's microblog items
+function purgeMyMicroblog() {
+ /* REF: http://xmpp.org/extensions/xep-0060.html#owner-purge */
+
+ var password = $('#options .check-empty').val();
+
+ if(password == getPassword()) {
+ // Send the IQ to remove the item (and get eventual error callback)
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB_OWNER});
+ pubsub.appendChild(iq.buildNode('purge', {'node': NS_URN_MBLOG, 'xmlns': NS_PUBSUB_OWNER}));
+
+ con.send(iq, handleMicroblogPurge);
+
+ // Hide the tool
+ $('#options .sub-ask').hide();
+
+ logThis('Microblog purge sent.', 3);
+ }
+
+ else {
+ var selector = $('#options .check-empty');
+
+ if(password != getPassword())
+ $(document).oneTime(10, function() {
+ selector.addClass('please-complete').focus();
+ });
+ else
+ selector.removeClass('please-complete');
+ }
+
+ return false;
+}
+
+// Handles the microblog purge
+function handleMicroblogPurge(iq) {
+ // If no errors
+ if(!handleErrorReply(iq)) {
+ // Remove the microblog items
+ $('.one-update.update_' + hex_md5(getXID())).remove();
+
+ logThis('Microblog purged.', 3);
+ }
+
+ else
+ logThis('Microblog not purged.', 2);
+}
+
+// Deletes the user's account
+function deleteMyAccount() {
+ /* REF: http://xmpp.org/extensions/xep-0077.html#usecases-cancel */
+
+ var password = $('#options .check-password').val();
+
+ if(password == getPassword()) {
+ // We show the waiting image
+ showGeneralWait();
+
+ // We send the IQ
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ var iqQuery = iq.setQuery(NS_REGISTER);
+ iqQuery.appendChild(iq.buildNode('remove', {'xmlns': NS_REGISTER}));
+
+ con.send(iq, handleAccDeletion);
+
+ logThis('Delete account sent.', 3);
+ }
+
+ else {
+ var selector = $('#options .check-password');
+
+ if(password != getPassword())
+ $(document).oneTime(10, function() {
+ selector.addClass('please-complete').focus();
+ });
+ else
+ selector.removeClass('please-complete');
+ }
+
+ return false;
+}
+
+// Loads the user options
+function loadOptions() {
+ // Process the good stuffs, depending of the server features
+ var enabled_archives_pref = enabledArchives('pref');
+ var enabled_pubsub = enabledPubSub();
+ var enabled_pep = enabledPEP();
+ var sWait = $('#options .content');
+
+ // Show the waiting items if necessary
+ if(enabled_archives_pref || (enabled_pep && enabled_pubsub)) {
+ $('#options .wait').show();
+ $('#options .finish:first').addClass('disabled');
+ }
+
+ // We get the archiving configuration
+ if(enabled_archives_pref) {
+ sWait.addClass('archives');
+ getConfigArchives();
+ }
+
+ // We get the microblog configuration
+ if(enabled_pubsub && enabled_pep) {
+ sWait.addClass('microblog');
+ getConfigMicroblog();
+ }
+
+ // We show the "privacy" form if something is visible into it
+ if(enabled_archives_pref || enabled_pep)
+ $('#options fieldset.privacy').show();
+
+ // We get the values of the forms for the sounds
+ if(getDB('options', 'sounds') == '0')
+ $('#sounds').attr('checked', false);
+ else
+ $('#sounds').attr('checked', true);
+
+ // We get the values of the forms for the geolocation
+ if(getDB('options', 'geolocation') == '1')
+ $('#geolocation').attr('checked', true);
+ else
+ $('#geolocation').attr('checked', false);
+
+ // We get the values of the forms for the roster show all
+ if(getDB('options', 'roster-showall') == '1')
+ $('#showall').attr('checked', true);
+ else
+ $('#showall').attr('checked', false);
+
+ // We get the values of the forms for the integratemedias
+ if(getDB('options', 'integratemedias') == '0')
+ $('#integratemedias').attr('checked', false);
+ else
+ $('#integratemedias').attr('checked', true);
+}
+
+// Plugin launcher
+function launchOptions() {
+ // Click events
+ $('#options .tab a').click(function() {
+ // Yet active?
+ if($(this).hasClass('tab-active'))
+ return false;
+
+ // Switch to the good tab
+ var key = parseInt($(this).attr('data-key'));
+
+ return switchOptions(key);
+ });
+
+ $('#options .linked').click(function() {
+ $('#options .sub-ask').hide();
+ });
+
+ $('#options .xmpp-links').click(function() {
+ xmppLinksHandler();
+
+ return false;
+ });
+
+ $('#options .empty-channel').click(function() {
+ var selector = '#options .sub-ask-empty';
+
+ $(selector).show();
+
+ $(document).oneTime(10, function() {
+ $(selector + ' input').focus();
+ });
+
+ return false;
+ });
+
+ $('#options .change-password').click(function() {
+ var selector = '#options .sub-ask-pass';
+
+ $(selector).show();
+
+ $(document).oneTime(10, function() {
+ $(selector + ' input:first').focus();
+ });
+
+ return false;
+ });
+
+ $('#options .delete-account').click(function() {
+ var selector = '#options .sub-ask-delete';
+
+ $(selector).show();
+
+ $(document).oneTime(10, function() {
+ $(selector + ' input').focus();
+ });
+
+ return false;
+ });
+
+ $('#options .sub-ask-pass .sub-ask-bottom').click(function() {
+ return sendNewPassword();
+ });
+
+ $('#options .sub-ask-empty .sub-ask-bottom').click(function() {
+ return purgeMyMicroblog();
+ });
+
+ $('#options .sub-ask-delete .sub-ask-bottom').click(function() {
+ return deleteMyAccount();
+ });
+
+ $('#options .sub-ask-close').click(function() {
+ $('#options .sub-ask').hide();
+
+ return false;
+ });
+
+ $('#options .bottom .finish').click(function() {
+ if($(this).is('.save') && !$(this).hasClass('disabled'))
+ return saveOptions();
+ if($(this).is('.cancel'))
+ return closeOptions();
+
+ return false;
+ });
+
+ // The keyup events
+ $('#options .sub-ask input').keyup(function(e) {
+ if(e.keyCode == 13) {
+ // Microblog purge
+ if($(this).is('.purge-microblog'))
+ return purgeMyMicroblog();
+
+ // Password change
+ else if($(this).is('.password-change'))
+ return sendNewPassword();
+
+ // Account deletion
+ else if($(this).is('.delete-account'))
+ return deleteMyAccount();
+ }
+ });
+
+ // Load the options
+ loadOptions();
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the PEP JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 26/08/11
+
+*/
+
+// Stores the PEP items
+function storePEP(xid, type, value1, value2, value3, value4) {
+ // Handle the correct values
+ if(!value1)
+ value1 = '';
+ if(!value2)
+ value2 = '';
+ if(!value3)
+ value3 = '';
+ if(!value4)
+ value4 = '';
+
+ // If one value
+ if(value1 || value2 || value3 || value4) {
+ // Define the XML variable
+ var xml = '<pep type="' + type + '">';
+
+ // Generate the correct XML
+ if(type == 'tune')
+ xml += '<artist>' + value1.htmlEnc() + '</artist><title>' + value2.htmlEnc() + '</title><album>' + value3.htmlEnc() + '</album><uri>' + value4.htmlEnc() + '</uri>';
+ else if(type == 'geoloc')
+ xml += '<lat>' + value1.htmlEnc() + '</lat><lon>' + value2.htmlEnc() + '</lon><human>' + value3.htmlEnc() + '</human>';
+ else
+ xml += '<value>' + value1.htmlEnc() + '</value><text>' + value2.htmlEnc() + '</text>';
+
+ // End the XML node
+ xml += '</pep>';
+
+ // Update the input with the new value
+ setDB('pep-' + type, xid, xml);
+ }
+
+ else
+ removeDB('pep-' + type, xid);
+
+ // Display the PEP event
+ displayPEP(xid, type);
+}
+
+// Displays a PEP item
+function displayPEP(xid, type) {
+ // Read the target input for values
+ var value = $(XMLFromString(getDB('pep-' + type, xid)));
+ var dText;
+ var aLink = ''
+
+ // If the PEP element exists
+ if(type) {
+ // Get the user hash
+ var hash = hex_md5(xid);
+
+ // Initialize
+ var fText, fValue;
+ var dText = '';
+
+ // Parse the XML for mood and activity
+ if((type == 'mood') || (type == 'activity')) {
+ if(value) {
+ var pepValue = value.find('value').text();
+ var pepText = value.find('text').text();
+
+ // No value?
+ if(!pepValue)
+ pepValue = 'none';
+
+ // Apply the good values
+ if(type == 'mood')
+ fValue = moodIcon(pepValue);
+ else if(type == 'activity')
+ fValue = activityIcon(pepValue);
+ if(!pepText)
+ fText = _e("unknown");
+ else
+ fText = pepText;
+ }
+
+ else {
+ if(type == 'mood')
+ fValue = moodIcon('undefined');
+ else if(type == 'activity')
+ fValue = activityIcon('exercising');
+
+ fText = _e("unknown");
+ }
+
+ dText = fText;
+ fText = fText.htmlEnc();
+ }
+
+ else if(type == 'tune') {
+ fValue = 'tune-note';
+
+ if(value) {
+ // Parse the tune XML
+ var tArtist = value.find('artist').text();
+ var tTitle = value.find('title').text();
+ var tAlbum = value.find('album').text();
+ var tURI = value.find('uri').text();
+ var fArtist, fTitle, fAlbum, fURI;
+
+ // Apply the good values
+ if(!tArtist && !tAlbum && !tTitle) {
+ fText = _e("unknown");
+ dText = fText;
+ }
+
+ else {
+ // URI element
+ if(!tURI)
+ fURI = 'http://grooveshark.com/search?q=' + encodeURIComponent(tArtist + ' ' + tTitle + ' ' + tAlbum);
+ else
+ fURI = tURI;
+
+ // Artist element
+ if(!tArtist)
+ fArtist = _e("unknown");
+ else
+ fArtist = tArtist;
+
+ // Title element
+ if(!tTitle)
+ fTitle = _e("unknown");
+ else
+ fTitle = tTitle;
+
+ // Album element
+ if(!tAlbum)
+ fAlbum = _e("unknown");
+ else
+ fAlbum = tAlbum;
+
+ // Generate the link to the title
+ aLink = ' href="' + fURI + '" target="_blank"';
+
+ // Generate the text to be displayed
+ dText = fArtist + ' - ' + fTitle + ' (' + fAlbum + ')';
+ fText = '<a' + aLink + '>' + dText + '</a>';
+ }
+ }
+
+ else {
+ fText = _e("unknown");
+ dText = fText;
+ }
+ }
+
+ else if(type == 'geoloc') {
+ fValue = 'location-world';
+
+ if(value) {
+ // Parse the geoloc XML
+ var tLat = value.find('lat').text();
+ var tLon = value.find('lon').text();
+ var tHuman = value.find('human').text();
+ var tReal = tHuman;
+
+ // No human location?
+ if(!tHuman)
+ tHuman = _e("See his/her position on the globe");
+
+ // Generate the text to be displayed
+ if(tLat && tLon) {
+ aLink = ' href="http://maps.google.com/?q=' + encodeQuotes(tLat) + ',' + encodeQuotes(tLon) + '" target="_blank"';
+ fText = '<a' + aLink + '>' + tHuman.htmlEnc() + '</a>';
+
+ if(tReal)
+ dText = tReal;
+ else
+ dText = tLat + '; ' + tLon;
+ }
+
+ else {
+ fText = _e("unknown");
+ dText = fText;
+ }
+ }
+
+ else {
+ fText = _e("unknown");
+ dText = fText;
+ }
+ }
+
+ // Apply the text to the buddy infos
+ var this_buddy = '#buddy-list .buddy[data-xid=' + escape(xid) + ']';
+
+ if(exists(this_buddy))
+ $(this_buddy + ' .bi-' + type).replaceWith('<p class="bi-' + type + ' talk-images ' + fValue + '" title="' + encodeQuotes(dText) + '">' + fText + '</p>');
+
+ // Apply the text to the buddy chat
+ if(exists('#' + hash)) {
+ // Selector
+ var bc_pep = $('#' + hash + ' .bc-pep');
+
+ // We remove the old PEP item
+ bc_pep.find('a.bi-' + type).remove();
+
+ // If the new PEP item is not null, create a new one
+ if(fText != _e("unknown"))
+ bc_pep.prepend(
+ '<a' + aLink + ' class="bi-' + type + ' talk-images ' + fValue + '" title="' + encodeQuotes(dText) + '"></a>'
+ );
+
+ // Process the new status position
+ adaptChatPresence(hash);
+ }
+
+ // If this is the PEP values of the logged in user
+ if(xid == getXID()) {
+ // Change the icon/value of the target element
+ if((type == 'mood') || (type == 'activity')) {
+ // Change the input value
+ var dVal = '';
+ var dAttr = pepValue;
+
+ // Must apply default values?
+ if(pepValue == 'none') {
+ if(type == 'mood')
+ dAttr = 'happy';
+ else
+ dAttr = 'exercising';
+ }
+
+ // No text?
+ if(dText != _e("unknown"))
+ dVal = dText;
+
+ // Store this user event in our database
+ setDB(type + '-value', 1, dAttr);
+ setDB(type + '-text', 1, dVal);
+
+ // Apply this PEP event
+ $('#my-infos .f-' + type + ' a.picker').attr('data-value', dAttr);
+ $('#my-infos .f-' + type + ' input').val(dVal);
+ $('#my-infos .f-' + type + ' input').placeholder();
+ }
+
+ else if((type == 'tune') || (type == 'geoloc')) {
+ // Reset the values
+ $('#my-infos .f-others a.' + type).remove();
+
+ // Not empty?
+ if(dText != _e("unknown")) {
+ // Specific stuffs
+ var href, title, icon_class;
+
+ if(type == 'tune') {
+ href = fURI;
+ title = dText;
+ icon_class = 'tune-note';
+ }
+
+ else {
+ href = 'http://maps.google.com/?q=' + encodeQuotes(tLat) + ',' + encodeQuotes(tLon);
+ title = _e("Where are you?") + ' (' + dText + ')';
+ icon_class = 'location-world';
+ }
+
+ // Must create the container?
+ if(!exists('#my-infos .f-others'))
+ $('#my-infos .content').append('<div class="element f-others"></div>');
+
+ // Create the element
+ $('#my-infos .f-others').prepend(
+ '<a class="icon ' + type + '" href="' + encodeQuotes(href) + '" target="_blank" title="' + encodeQuotes(title) + '">' +
+ '<span class="talk-images ' + icon_class + '"></span>' +
+ '</a>'
+ );
+ }
+
+ // Empty?
+ else if(!exists('#my-infos .f-others a.icon'))
+ $('#my-infos .f-others').remove();
+
+ // Process the buddy-list height again
+ adaptRoster();
+ }
+ }
+ }
+}
+
+// Changes the mood icon
+function moodIcon(value) {
+ // The main var
+ var icon;
+
+ // Switch the values
+ switch(value) {
+ case 'angry':
+ case 'cranky':
+ case 'hot':
+ case 'invincible':
+ case 'mean':
+ case 'restless':
+ case 'serious':
+ case 'strong':
+ icon = 'mood-one';
+ break;
+
+ case 'contemplative':
+ case 'happy':
+ case 'playful':
+ icon = 'mood-two';
+ break;
+
+ case 'aroused':
+ case 'envious':
+ case 'excited':
+ case 'interested':
+ case 'lucky':
+ case 'proud':
+ case 'relieved':
+ case 'satisfied':
+ case 'shy':
+ icon = 'mood-three';
+ break;
+
+ case 'calm':
+ case 'cautious':
+ case 'contented':
+ case 'creative':
+ case 'humbled':
+ case 'lonely':
+ case 'undefined':
+ case 'none':
+ icon = 'mood-four';
+ break;
+
+ case 'afraid':
+ case 'amazed':
+ case 'confused':
+ case 'dismayed':
+ case 'hungry':
+ case 'in_awe':
+ case 'indignant':
+ case 'jealous':
+ case 'lost':
+ case 'offended':
+ case 'outraged':
+ case 'shocked':
+ case 'surprised':
+ case 'embarrassed':
+ case 'impressed':
+ icon = 'mood-five';
+ break;
+
+ case 'crazy':
+ case 'distracted':
+ case 'neutral':
+ case 'relaxed':
+ case 'thirsty':
+ icon = 'mood-six';
+ break;
+
+ case 'amorous':
+ case 'curious':
+ case 'in_love':
+ case 'nervous':
+ case 'sarcastic':
+ icon = 'mood-eight';
+ break;
+
+ case 'brave':
+ case 'confident':
+ case 'hopeful':
+ case 'grateful':
+ case 'spontaneous':
+ case 'thankful':
+ icon = 'mood-nine';
+ break;
+
+ default:
+ icon = 'mood-seven';
+ break;
+ }
+
+ // Return the good icon name
+ return icon;
+}
+
+// Changes the activity icon
+function activityIcon(value) {
+ // The main var
+ var icon;
+
+ // Switch the values
+ switch(value) {
+ case 'doing_chores':
+ icon = 'activity-doing_chores';
+ break;
+
+ case 'drinking':
+ icon = 'activity-drinking';
+ break;
+
+ case 'eating':
+ icon = 'activity-eating';
+ break;
+
+ case 'grooming':
+ icon = 'activity-grooming';
+ break;
+
+ case 'having_appointment':
+ icon = 'activity-having_appointment';
+ break;
+
+ case 'inactive':
+ icon = 'activity-inactive';
+ break;
+
+ case 'relaxing':
+ icon = 'activity-relaxing';
+ break;
+
+ case 'talking':
+ icon = 'activity-talking';
+ break;
+
+ case 'traveling':
+ icon = 'activity-traveling';
+ break;
+
+ case 'working':
+ icon = 'activity-working';
+ break;
+ default:
+ icon = 'activity-exercising';
+ break;
+ }
+
+ // Return the good icon name
+ return icon;
+}
+
+// Sends the user's mood
+function sendMood(value, text) {
+ /* REF: http://xmpp.org/extensions/xep-0107.html */
+
+ // We propagate the mood on the xmpp network
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ // We create the XML document
+ var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB});
+ var publish = pubsub.appendChild(iq.buildNode('publish', {'node': NS_MOOD, 'xmlns': NS_PUBSUB}));
+ var item = publish.appendChild(iq.buildNode('item', {'xmlns': NS_PUBSUB}));
+ var mood = item.appendChild(iq.buildNode('mood', {'xmlns': NS_MOOD}));
+
+ if(value != 'none') {
+ mood.appendChild(iq.buildNode(value, {'xmlns': NS_MOOD}));
+ mood.appendChild(iq.buildNode('text', {'xmlns': NS_MOOD}, text));
+ }
+
+ // And finally we send the mood that is set
+ con.send(iq);
+
+ logThis('New mood sent: ' + value + ' (' + text + ')', 3);
+}
+
+// Sends the user's activity
+function sendActivity(main, sub, text) {
+ // We propagate the mood on the xmpp network
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ // We create the XML document
+ var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB});
+ var publish = pubsub.appendChild(iq.buildNode('publish', {'node': NS_ACTIVITY, 'xmlns': NS_PUBSUB}));
+ var item = publish.appendChild(iq.buildNode('item', {'xmlns': NS_PUBSUB}));
+ var activity = item.appendChild(iq.buildNode('activity', {'xmlns': NS_ACTIVITY}));
+
+ if(main != 'none') {
+ var mainType = activity.appendChild(iq.buildNode(main, {'xmlns': NS_ACTIVITY}));
+
+ // Child nodes
+ if(sub)
+ mainType.appendChild(iq.buildNode(sub, {'xmlns': NS_ACTIVITY}));
+ if(text)
+ activity.appendChild(iq.buildNode('text', {'xmlns': NS_ACTIVITY}, text));
+ }
+
+ // And finally we send the mood that is set
+ con.send(iq);
+
+ logThis('New activity sent: ' + main + ' (' + text + ')', 3);
+}
+
+// Sends the user's geographic position
+function sendPosition(vLat, vLon, vAlt, vCountry, vCountrycode, vRegion, vPostalcode, vLocality, vStreet, vBuilding, vText, vURI) {
+ /* REF: http://xmpp.org/extensions/xep-0080.html */
+
+ // We propagate the position on pubsub
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ // We create the XML document
+ var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB});
+ var publish = pubsub.appendChild(iq.buildNode('publish', {'node': NS_GEOLOC, 'xmlns': NS_PUBSUB}));
+ var item = publish.appendChild(iq.buildNode('item', {'xmlns': NS_PUBSUB}));
+ var geoloc = item.appendChild(iq.buildNode('geoloc', {'xmlns': NS_GEOLOC}));
+
+ // Create two position arrays
+ var pos_names = ['lat', 'lon', 'alt', 'country', 'countrycode', 'region', 'postalcode', 'locality', 'street', 'building', 'text', 'uri', 'timestamp'];
+ var pos_values = [ vLat, vLon, vAlt, vCountry, vCountrycode, vRegion, vPostalcode, vLocality, vStreet, vBuilding, vText, vURI, getXMPPTime('utc')];
+
+ for(var i = 0; i < pos_names.length; i++) {
+ if(pos_names[i] && pos_values[i])
+ geoloc.appendChild(iq.buildNode(pos_names[i], {'xmlns': NS_GEOLOC}, pos_values[i]));
+ }
+
+ // And finally we send the XML
+ con.send(iq);
+
+ // For logger
+ if(vLat && vLon)
+ logThis('Geolocated.', 3);
+ else
+ logThis('Not geolocated.', 2);
+}
+
+// Parses the user's geographic position
+function parsePosition(data) {
+ var result = $(data).find('result:first');
+
+ // Get latitude and longitude
+ var lat = result.find('geometry:first location:first lat').text();
+ var lng = result.find('geometry:first location:first lng').text();
+
+ var array = [
+ lat,
+ lng,
+ result.find('address_component:has(type:contains("country")):first long_name').text(),
+ result.find('address_component:has(type:contains("country")):first short_name').text(),
+ result.find('address_component:has(type:contains("administrative_area_level_1")):first long_name').text(),
+ result.find('address_component:has(type:contains("postal_code")):first long_name').text(),
+ result.find('address_component:has(type:contains("locality")):first long_name').text(),
+ result.find('address_component:has(type:contains("route")):first long_name').text(),
+ result.find('address_component:has(type:contains("street_number")):first long_name').text(),
+ result.find('formatted_address:first').text(),
+ 'http://maps.google.com/?q=' + encodeQuotes(lat) + ',' + encodeQuotes(lng)
+ ];
+
+ return array;
+}
+
+// Converts a position into an human-readable one
+function humanPosition(tLocality, tRegion, tCountry) {
+ var tHuman = '';
+
+ // Any locality?
+ if(tLocality) {
+ tHuman += tLocality;
+
+ if(tRegion)
+ tHuman += ', ' + tRegion;
+ if(tCountry)
+ tHuman += ', ' + tCountry;
+ }
+
+ // Any region?
+ else if(tRegion) {
+ tHuman += tRegion;
+
+ if(tCountry)
+ tHuman += ', ' + tCountry;
+ }
+
+ // Any country?
+ else if(tCountry)
+ tHuman += tCountry;
+
+ return tHuman;
+}
+
+// Gets the user's geographic position
+function getPosition(position) {
+ // Convert integers to strings
+ var vLat = '' + position.coords.latitude;
+ var vLon = '' + position.coords.longitude;
+ var vAlt = '' + position.coords.altitude;
+
+ // Get full position (from Google Maps API)
+ $.get('./php/geolocation.php', {latitude: vLat, longitude: vLon, language: XML_LANG}, function(data) {
+ // Parse data!
+ var results = parsePosition(data);
+
+ // Handled!
+ sendPosition(
+ vLat,
+ vLon,
+ vAlt,
+ results[2],
+ results[3],
+ results[4],
+ results[5],
+ results[6],
+ results[7],
+ results[8],
+ results[9],
+ results[10]
+ );
+
+ // Store data
+ setDB('geolocation', 'now', xmlToString(data));
+
+ logThis('Position details got from Google Maps API.');
+ });
+
+ logThis('Position got: latitude > ' + vLat + ' / longitude > ' + vLon + ' / altitude > ' + vAlt);
+}
+
+// Geolocates the user
+function geolocate() {
+ // Don't fire it until options & features are not retrieved!
+ if(!getDB('options', 'geolocation') || (getDB('options', 'geolocation') == '0') || !enabledPEP())
+ return;
+
+ // We publish the user location if allowed
+ if(navigator.geolocation) {
+ // Wait a bit... (to fix a bug)
+ $('#my-infos').stopTime().oneTime('1s', function() {
+ navigator.geolocation.getCurrentPosition(getPosition);
+ });
+
+ logThis('Geolocating...', 3);
+ }
+
+ // Any error?
+ else
+ logThis('Not geolocated: browser does not support it.', 1);
+}
+
+// Displays all the supported PEP events for a given XID
+function displayAllPEP(xid) {
+ displayPEP(xid, 'mood');
+ displayPEP(xid, 'activity');
+ displayPEP(xid, 'tune');
+ displayPEP(xid, 'geoloc');
+}
+
+// Plugin launcher
+function launchPEP() {
+ // Apply empty values to the PEP database
+ setDB('mood-value', 1, '');
+ setDB('mood-text', 1, '');
+ setDB('activity-value', 1, '');
+ setDB('activity-text', 1, '');
+
+ // Click event for user mood
+ $('#my-infos .f-mood a.picker').click(function() {
+ // Initialize some vars
+ var path = '#my-infos .f-mood div.bubble';
+ var mood_id = ['crazy', 'excited', 'playful', 'happy', 'shocked', 'hot', 'sad', 'amorous', 'confident'];
+ var mood_lang = [_e("Crazy"), _e("Excited"), _e("Playful"), _e("Happy"), _e("Shocked"), _e("Hot"), _e("Sad"), _e("Amorous"), _e("Confident")];
+ var mood_val = $('#my-infos .f-mood a.picker').attr('data-value');
+
+ // Yet displayed?
+ var can_append = true;
+
+ if(exists(path))
+ can_append = false;
+
+ // Add this bubble!
+ showBubble(path);
+
+ if(!can_append)
+ return false;
+
+ // Generate the HTML code
+ var html = '<div class="bubble removable">';
+
+ for(i in mood_id) {
+ // Yet in use: no need to display it!
+ if(mood_id[i] == mood_val)
+ continue;
+
+ html += '<a href="#" class="talk-images" data-value="' + mood_id[i] + '" title="' + mood_lang[i] + '"></a>';
+ }
+
+ html += '</div>';
+
+ // Append the HTML code
+ $('#my-infos .f-mood').append(html);
+
+ // Click event
+ $(path + ' a').click(function() {
+ // Update the mood marker
+ $('#my-infos .f-mood a.picker').attr('data-value', $(this).attr('data-value'));
+
+ // Close the bubble
+ closeBubbles();
+
+ // Focus on the status input
+ $(document).oneTime(10, function() {
+ $('#mood-text').focus();
+ });
+
+ return false;
+ });
+
+ return false;
+ });
+
+ // Click event for user activity
+ $('#my-infos .f-activity a.picker').click(function() {
+ // Initialize some vars
+ var path = '#my-infos .f-activity div.bubble';
+ var activity_id = ['doing_chores', 'drinking', 'eating', 'exercising', 'grooming', 'having_appointment', 'inactive', 'relaxing', 'talking', 'traveling', 'working'];
+ var activity_lang = [_e("Chores"), _e("Drinking"), _e("Eating"), _e("Exercising"), _e("Grooming"), _e("Appointment"), _e("Inactive"), _e("Relaxing"), _e("Talking"), _e("Traveling"), _e("Working")];
+ var activity_val = $('#my-infos .f-activity a.picker').attr('data-value');
+
+ // Yet displayed?
+ var can_append = true;
+
+ if(exists(path))
+ can_append = false;
+
+ // Add this bubble!
+ showBubble(path);
+
+ if(!can_append)
+ return false;
+
+ // Generate the HTML code
+ var html = '<div class="bubble removable">';
+
+ for(i in activity_id) {
+ // Yet in use: no need to display it!
+ if(activity_id[i] == activity_val)
+ continue;
+
+ html += '<a href="#" class="talk-images" data-value="' + activity_id[i] + '" title="' + activity_lang[i] + '"></a>';
+ }
+
+ html += '</div>';
+
+ // Append the HTML code
+ $('#my-infos .f-activity').append(html);
+
+ // Click event
+ $(path + ' a').click(function() {
+ // Update the activity marker
+ $('#my-infos .f-activity a.picker').attr('data-value', $(this).attr('data-value'));
+
+ // Close the bubble
+ closeBubbles();
+
+ // Focus on the status input
+ $(document).oneTime(10, function() {
+ $('#activity-text').focus();
+ });
+
+ return false;
+ });
+
+ return false;
+ });
+
+ // Submit events for PEP inputs
+ $('#mood-text, #activity-text').placeholder()
+
+ .keyup(function(e) {
+ if(e.keyCode == 13) {
+ $(this).blur();
+
+ return false;
+ }
+ });
+
+ // Input blur handler
+ $('#mood-text').blur(function() {
+ // Read the parameters
+ var value = $('#my-infos .f-mood a.picker').attr('data-value');
+ var text = $(this).val();
+
+ // Must send the mood?
+ if((value != getDB('mood-value', 1)) || (text != getDB('mood-text', 1))) {
+ // Update the local stored values
+ setDB('mood-value', 1, value);
+ setDB('mood-text', 1, text);
+
+ // Send it!
+ sendMood(value, text);
+ }
+ })
+
+ // Input focus handler
+ .focus(function() {
+ closeBubbles();
+ });
+
+ // Input blur handler
+ $('#activity-text').blur(function() {
+ // Read the parameters
+ var value = $('#my-infos .f-activity a.picker').attr('data-value');
+ var text = $(this).val();
+
+ // Must send the activity?
+ if((value != getDB('activity-value', 1)) || (text != getDB('activity-text', 1))) {
+ // Update the local stored values
+ setDB('activity-value', 1, value);
+ setDB('activity-text', 1, text);
+
+ // Send it!
+ sendActivity(value, '', text);
+ }
+ })
+
+ // Input focus handler
+ .focus(function() {
+ closeBubbles();
+ });
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the popup JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 26/04/11
+
+*/
+
+// Creates a popup code
+function createPopup(id, content) {
+ // Popup exists?
+ if(exists('#' + id))
+ return false;
+
+ // Append the popup code
+ $('body').append(
+ '<div id="' + id + '" class="lock removable">' +
+ '<div class="popup">' +
+ content +
+ '</div>' +
+ '</div>'
+ );
+
+ return true;
+}
+
+// Destroys a popup code
+function destroyPopup(id) {
+ // Stop the popup timers
+ $('#' + id + ' *').stopTime();
+
+ // Remove the popup
+ $('#' + id).remove();
+
+ // Manage input focus
+ inputFocus();
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the presence JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 23/09/11
+
+*/
+
+// Sends the user first presence
+var FIRST_PRESENCE_SENT = false;
+
+function firstPresence(checksum) {
+ logThis('First presence sent.', 3);
+
+ // Jappix is now ready: change the title
+ pageTitle('talk');
+
+ // Anonymous check
+ var is_anonymous = isAnonymous();
+
+ // Update our marker
+ FIRST_PRESENCE_SENT = true;
+
+ // Try to use the last status message
+ var status = getDB('options', 'presence-status');
+
+ if(!status)
+ status = '';
+
+ // We tell the world that we are online
+ if(!is_anonymous)
+ sendPresence('', '', '', status, checksum);
+
+ // Any status to apply?
+ if(status)
+ $('#presence-status').val(status);
+
+ // Enable the presence picker
+ $('#presence-status').removeAttr('disabled');
+ $('#my-infos .f-presence a.picker').removeClass('disabled');
+
+ // We set the last activity stamp
+ PRESENCE_LAST_ACTIVITY = getTimeStamp();
+
+ // We store our presence
+ setDB('presence-show', 1, 'available');
+
+ // Not anonymous
+ if(!is_anonymous) {
+ // We get the stored bookmarks (because of the photo hash and some other stuffs, we must get it later)
+ getStorage(NS_BOOKMARKS);
+
+ // We open a new chat if a XMPP link was submitted
+ if((parent.location.hash != '#OK') && LINK_VARS['x']) {
+ // A link is submitted in the URL
+ xmppLink(LINK_VARS['x']);
+
+ // Set a OK status
+ parent.location.hash = 'OK';
+ }
+ }
+}
+
+// Handles incoming presence packets
+function handlePresence(presence) {
+ // We define everything needed here
+ var from = fullXID(getStanzaFrom(presence));
+ var hash = hex_md5(from);
+ var node = presence.getNode();
+ var xid = bareXID(from);
+ var xidHash = hex_md5(xid);
+
+ // We get the type content
+ var type = presence.getType();
+ if(!type)
+ type = '';
+
+ // We get the priority content
+ var priority = presence.getPriority() + '';
+ if(!priority || (type == 'error'))
+ priority = '0';
+
+ // We get the show content
+ var show = presence.getShow();
+ if(!show || (type == 'error'))
+ show = '';
+
+ // We get the status content
+ var status = presence.getStatus();
+ if(!status || (type == 'error'))
+ status = '';
+
+ // We get the photo content
+ var photo = $(node).find('x[xmlns=' + NS_VCARD_P + ']:first photo');
+ var checksum = photo.text();
+ var hasPhoto = photo.size();
+
+ if(hasPhoto && (type != 'error'))
+ hasPhoto = 'true';
+ else
+ hasPhoto = 'false';
+
+ // We get the CAPS content
+ var caps = $(node).find('c[xmlns=' + NS_CAPS + ']:first').attr('ver');
+ if(!caps || (type == 'error'))
+ caps = '';
+
+ // This presence comes from another resource of my account with a difference avatar checksum
+ if((xid == getXID()) && (hasPhoto == 'true') && (checksum != getDB('checksum', 1)))
+ getAvatar(getXID(), 'force', 'true', 'forget');
+
+ // This presence comes from a groupchat
+ if(isPrivate(xid)) {
+ var x_muc = $(node).find('x[xmlns=' + NS_MUC_USER + ']:first');
+ var item = x_muc.find('item');
+ var affiliation = item.attr('affiliation');
+ var role = item.attr('role');
+ var reason = item.find('reason').text();
+ var iXID = item.attr('jid');
+ var iNick = item.attr('nick');
+ var nick = thisResource(from);
+ var messageTime = getCompleteTime();
+ var notInitial = true;
+
+ // Read the status code
+ var status_code = new Array();
+
+ x_muc.find('status').each(function() {
+ status_code.push(parseInt($(this).attr('code')));
+ });
+
+ // If this is an initial presence (when user join the room)
+ if(exists('#' + xidHash + '[data-initial=true]'))
+ notInitial = false;
+
+ // If one user is quitting
+ if(type && (type == 'unavailable')) {
+ displayMucPresence(from, xidHash, hash, type, show, status, affiliation, role, reason, status_code, iXID, iNick, messageTime, nick, notInitial);
+
+ removeDB('presence', from);
+ }
+
+ // If one user is joining
+ else {
+ // Fixes M-Link first presence bug (missing ID!)
+ if((nick == getMUCNick(xidHash)) && (presence.getID() == null) && !exists('#page-engine #' + xidHash + ' .list .' + hash)) {
+ handleMUC(presence);
+
+ logThis('Passed M-Link MUC first presence handling.', 2);
+ }
+
+ else {
+ displayMucPresence(from, xidHash, hash, type, show, status, affiliation, role, reason, status_code, iXID, iNick, messageTime, nick, notInitial);
+
+ var xml = '<presence from="' + encodeQuotes(from) + '"><priority>' + priority.htmlEnc() + '</priority><show>' + show.htmlEnc() + '</show><type>' + type.htmlEnc() + '</type><status>' + status.htmlEnc() + '</status><avatar>' + hasPhoto.htmlEnc() + '</avatar><checksum>' + checksum.htmlEnc() + '</checksum><caps>' + caps.htmlEnc() + '</caps></presence>';
+
+ setDB('presence', from, xml);
+ }
+ }
+
+ // Manage the presence
+ presenceFunnel(from, hash);
+ }
+
+ // This presence comes from an user or a gateway
+ else {
+ // Subscribed & unsubscribed stanzas
+ if((type == 'subscribed') || (type == 'unsubscribed'))
+ return;
+
+ // Subscribe stanza
+ else if(type == 'subscribe') {
+ // This is a buddy we can safely authorize, because we added him to our roster
+ if(exists('#buddy-list .buddy[data-xid=' + escape(xid) + ']'))
+ acceptSubscribe(xid);
+
+ // We do not know this entity, we'd be better ask the user
+ else {
+ // Get the nickname
+ var nickname = $(node).find('nick[xmlns=' + NS_NICK + ']:first').text();
+
+ // New notification
+ newNotification('subscribe', xid, [xid, nickname], status);
+ }
+ }
+
+ // Unsubscribe stanza
+ else if(type == 'unsubscribe')
+ sendRoster(xid, 'remove');
+
+ // Other stanzas
+ else {
+ // Unavailable/error presence
+ if(type == 'unavailable')
+ removeDB('presence', from);
+
+ // Other presence (available, subscribe...)
+ else {
+ var xml = '<presence from="' + encodeQuotes(from) + '"><priority>' + priority.htmlEnc() + '</priority><show>' + show.htmlEnc() + '</show><type>' + type.htmlEnc() + '</type><status>' + status.htmlEnc() + '</status><avatar>' + hasPhoto.htmlEnc() + '</avatar><checksum>' + checksum.htmlEnc() + '</checksum><caps>' + caps.htmlEnc() + '</caps></presence>';
+
+ setDB('presence', from, xml);
+ }
+
+ // We manage the presence
+ presenceFunnel(xid, xidHash);
+
+ // We display the presence in the current chat
+ if(exists('#' + xidHash)) {
+ var dStatus = filterStatus(xid, status, false);
+
+ if(dStatus)
+ dStatus = ' (' + dStatus + ')';
+
+ // Generate the presence-in-chat code
+ var dName = getBuddyName(from).htmlEnc();
+ var dBody = dName + ' (' + from + ') ' + _e("is now") + ' ' + humanShow(show, type) + dStatus;
+
+ // Check whether it has been previously displayed
+ var can_display = true;
+
+ if($('#' + xidHash + ' .one-line.system-message:last').html() == dBody)
+ can_display = false;
+
+ if(can_display)
+ displayMessage('chat', xid, xidHash, dName, dBody, getCompleteTime(), getTimeStamp(), 'system-message', false);
+ }
+ }
+ }
+
+ // For logger
+ if(!show) {
+ if(!type)
+ show = 'available';
+ else
+ show = 'unavailable';
+ }
+
+ logThis('Presence received: ' + show + ', from ' + from);
+}
+
+// Displays a MUC presence
+function displayMucPresence(from, roomHash, hash, type, show, status, affiliation, role, reason, status_code, iXID, iNick, messageTime, nick, initial) {
+ // Generate the values
+ var thisUser = '#page-engine #' + roomHash + ' .list .' + hash;
+ var thisPrivate = $('#' + hash + ' .message-area');
+ var nick_html = nick.htmlEnc();
+ var real_xid = '';
+ var write = nick_html + ' ';
+ var notify = false;
+
+ // Reset data?
+ if(!role)
+ role = 'participant';
+ if(!affiliation)
+ affiliation = 'none';
+
+ // Must update the role?
+ if(exists(thisUser) && (($(thisUser).attr('data-role') != role) || ($(thisUser).attr('data-affiliation') != affiliation)))
+ $(thisUser).remove();
+
+ // Any XID submitted?
+ if(iXID) {
+ real_xid = ' data-realxid="' + iXID + '"';
+ iXID = bareXID(iXID);
+ write += ' (<a onclick="return checkChatCreate(\'' + encodeOnclick(iXID) + '\', \'chat\');" href="xmpp:' + encodeOnclick(iXID) + '">' + iXID + '</a>) ';
+ }
+
+ // User does not exists yet
+ if(!exists(thisUser) && (!type || (type == 'available'))) {
+ var myself = '';
+
+ // Is it me?
+ if(nick == getMUCNick(roomHash)) {
+ // Enable the room
+ $('#' + roomHash + ' .message-area').removeAttr('disabled');
+
+ // Marker
+ myself = ' myself';
+ }
+
+ // Set the user in the MUC list
+ $('#' + roomHash + ' .list .' + role + ' .title').after(
+ '<div class="user ' + hash + myself + '" data-xid="' + encodeQuotes(from) + '" data-nick="' + escape(nick) + '"' + real_xid + ' data-role="' + encodeQuotes(role) + '" data-affiliation="' + encodeQuotes(affiliation) + '">' +
+ '<div class="name talk-images available">' + nick_html + '</div>' +
+
+ '<div class="avatar-container">' +
+ '<img class="avatar" src="' + './img/others/default-avatar.png' + '" alt="" />' +
+ '</div>' +
+ '</div>'
+ );
+
+ // Click event
+ if(nick != getMUCNick(roomHash))
+ $(thisUser).live('click', function() {
+ checkChatCreate(from, 'private');
+ });
+
+ // We tell the user that someone entered the room
+ if(!initial) {
+ notify = true;
+ write += _e("joined the chat room");
+
+ // Any status?
+ if(status)
+ write += ' (' + filterThisMessage(status, nick_html, true) + ')';
+ else
+ write += ' (' + _e("no status") + ')';
+ }
+
+ // Enable the private chat input
+ thisPrivate.removeAttr('disabled');
+ }
+
+ else if((type == 'unavailable') || (type == 'error')) {
+ // Is it me?
+ if(nick == getMUCNick(roomHash)) {
+ $(thisUser).remove();
+
+ // Disable the groupchat input
+ $('#' + roomHash + ' .message-area').attr('disabled', true);
+
+ // Remove all the groupchat users
+ $('#' + roomHash + ' .list .user').remove();
+ }
+
+ // Someone has been kicked or banned?
+ if(existArrayValue(status_code, 301) || existArrayValue(status_code, 307)) {
+ $(thisUser).remove();
+ notify = true;
+
+ // Kicked?
+ if(existArrayValue(status_code, 307))
+ write += _e("has been kicked");
+
+ // Banned?
+ if(existArrayValue(status_code, 301))
+ write += _e("has been banned");
+
+ // Any reason?
+ if(reason)
+ write += ' (' + filterThisMessage(reason, nick_html, true) + ')';
+ else
+ write += ' (' + _e("no reason") + ')';
+ }
+
+ // Nickname change?
+ else if(existArrayValue(status_code, 303) && iNick) {
+ notify = true;
+ write += printf(_e("changed his/her nickname to %s"), iNick.htmlEnc());
+
+ // New values
+ var new_xid = cutResource(from) + '/' + iNick;
+ var new_hash = hex_md5(new_xid);
+ var new_class = 'user ' + new_hash;
+
+ if($(thisUser).hasClass('myself'))
+ new_class += ' myself';
+
+ // Die the click event
+ $(thisUser).die('click');
+
+ // Change to the new nickname
+ $(thisUser).attr('data-nick', iNick)
+ .attr('data-xid', new_xid)
+ .find('.name').text(iNick);
+
+ // Change the user class
+ $(thisUser).attr('class', new_class);
+
+ // New click event
+ $('#page-engine #' + roomHash + ' .list .' + new_hash).live('click', function() {
+ checkChatCreate(new_xid, 'private');
+ });
+ }
+
+ // We tell the user that someone left the room
+ else if(!initial) {
+ $(thisUser).remove();
+ notify = true;
+ write += _e("left the chat room");
+
+ // Any status?
+ if(status)
+ write += ' (' + filterThisMessage(status, nick_html, true) + ')';
+ else
+ write += ' (' + _e("no status") + ')';
+ }
+
+ // Disable the private chat input
+ thisPrivate.attr('disabled', true);
+ }
+
+ // Must notify something
+ if(notify)
+ displayMessage('groupchat', from, roomHash, nick_html, write, messageTime, getTimeStamp(), 'system-message', false);
+
+ // Set the good status show icon
+ switch(show) {
+ case 'chat':
+ case 'away':
+ case 'xa':
+ case 'dnd':
+ break;
+
+ default:
+ show = 'available';
+ break;
+ }
+
+ $(thisUser + ' .name').attr('class', 'name talk-images ' + show);
+
+ // Set the good status text
+ var uTitle = nick;
+
+ // Any XID to add?
+ if(iXID)
+ uTitle += ' (' + iXID + ')';
+
+ // Any status to add?
+ if(status)
+ uTitle += ' - ' + status;
+
+ $(thisUser).attr('title', uTitle);
+
+ // Show or hide the role category, depending of its content
+ $('#' + roomHash + ' .list .role').each(function() {
+ if($(this).find('.user').size())
+ $(this).show();
+ else
+ $(this).hide();
+ });
+}
+
+// Filters a given status
+function filterStatus(xid, status, cut) {
+ var dStatus = '';
+
+ if(!status)
+ status = '';
+
+ else {
+ if(cut)
+ dStatus = truncate(status, 50);
+ else
+ dStatus = status;
+
+ dStatus = filterThisMessage(dStatus, getBuddyName(xid).htmlEnc(), true);
+ }
+
+ return dStatus;
+}
+
+// Displays a user's presence
+function displayPresence(value, type, show, status, hash, xid, avatar, checksum, caps) {
+ // Display the presence in the roster
+ var path = '#buddy-list .' + hash;
+ var buddy = $('#buddy-list .content .' + hash);
+ var dStatus = filterStatus(xid, status, false);
+ var tStatus = encodeQuotes(status);
+ var biStatus;
+
+ // The buddy presence behind his name
+ $(path + ' .name .buddy-presence').replaceWith('<p class="buddy-presence talk-images ' + type + '">' + value + '</p>');
+
+ // The buddy presence in the buddy infos
+ if(dStatus)
+ biStatus = dStatus;
+ else
+ biStatus = value;
+
+ $(path + ' .bi-status').replaceWith('<p class="bi-status talk-images ' + type + '" title="' + tStatus + '">' + biStatus + '</p>');
+
+ // When the buddy disconnect himself, we hide him
+ if((type == 'unavailable') || (type == 'error')) {
+ // Set a special class to the buddy
+ buddy.addClass('hidden-buddy');
+
+ // No filtering is launched?
+ if(!SEARCH_FILTERED)
+ buddy.hide();
+
+ // All the buddies are shown?
+ if(BLIST_ALL)
+ buddy.show();
+
+ // Chat stuffs
+ if(exists('#' + hash)) {
+ // Remove the chatstate stuffs
+ resetChatState(hash);
+ $('#' + hash + ' .chatstate').remove();
+ $('#' + hash + ' .message-area').removeAttr('data-chatstates');
+
+ // Get the buddy avatar (only if a chat is opened)
+ getAvatar(xid, 'cache', 'true', 'forget');
+ }
+ }
+
+ // If the buddy is online
+ else {
+ // When the buddy is online, we show it
+ buddy.removeClass('hidden-buddy');
+
+ // No filtering is launched?
+ if(!SEARCH_FILTERED)
+ buddy.show();
+
+ // Get the online buddy avatar if not a gateway
+ getAvatar(xid, 'cache', avatar, checksum);
+ }
+
+ // Display the presence in the chat
+ if(exists('#' + hash)) {
+ // We generate a well formed status message
+ if(dStatus) {
+ // No need to write the same status two times
+ if(dStatus == value)
+ dStatus = '';
+ else
+ dStatus = ' (' + dStatus + ')';
+ }
+
+ // We show the presence value
+ $('#' + hash + ' .bc-infos').replaceWith('<p class="bc-infos" title="' + tStatus + '"><span class="' + type + ' show talk-images">' + value + '</span>' + dStatus + '</p>');
+
+ // Process the new status position
+ adaptChatPresence(hash);
+
+ // Get the disco#infos for this user
+ var highest = getHighestResource(xid);
+
+ if(highest)
+ getDiscoInfos(highest, caps);
+ else
+ displayDiscoInfos(xid, '');
+ }
+
+ // Display the presence in the switcher
+ if(exists('#page-switch .' + hash))
+ $('#page-switch .' + hash + ' .icon').removeClass('available unavailable error away busy').addClass(type);
+
+ // Update roster groups
+ if(!SEARCH_FILTERED)
+ updateGroups();
+ else
+ funnelFilterBuddySearch();
+}
+
+// Process the chat presence position
+function adaptChatPresence(hash) {
+ // Get values
+ var pep_numb = $('#' + hash + ' .bc-pep').find('a').size();
+
+ // Process the right position
+ var presence_right = 12;
+
+ if(pep_numb)
+ presence_right = (pep_numb * 20) + 18;
+
+ // Apply the right position
+ $('#' + hash + ' p.bc-infos').css('right', presence_right);
+}
+
+// Convert the presence "show" element into a human-readable output
+function humanShow(show, type) {
+ if(type == 'unavailable')
+ show = _e("Unavailable");
+
+ else if(type == 'error')
+ show = _e("Error");
+
+ else {
+ switch(show) {
+ case 'chat':
+ show = _e("Talkative");
+ break;
+
+ case 'away':
+ show = _e("Away");
+ break;
+
+ case 'xa':
+ show = _e("Not available");
+ break;
+
+ case 'dnd':
+ show = _e("Busy");
+ break;
+
+ default:
+ show = _e("Available");
+ break;
+ }
+ }
+
+ return show;
+}
+
+// Makes the presence data go in the right way
+function presenceIA(type, show, status, hash, xid, avatar, checksum, caps) {
+ // Is there a status defined?
+ if(!status)
+ status = humanShow(show, type);
+
+ // Then we can handle the events
+ if(type == 'error')
+ displayPresence(_e("Error"), 'error', show, status, hash, xid, avatar, checksum, caps);
+
+ else if(type == 'unavailable')
+ displayPresence(_e("Unavailable"), 'unavailable', show, status, hash, xid, avatar, checksum, caps);
+
+ else {
+ switch(show) {
+ case 'chat':
+ displayPresence(_e("Talkative"), 'available', show, status, hash, xid, avatar, checksum, caps);
+ break;
+
+ case 'away':
+ displayPresence(_e("Away"), 'away', show, status, hash, xid, avatar, checksum, caps);
+ break;
+
+ case 'xa':
+ displayPresence(_e("Not available"), 'busy', show, status, hash, xid, avatar, checksum, caps);
+ break;
+
+ case 'dnd':
+ displayPresence(_e("Busy"), 'busy', show, status, hash, xid, avatar, checksum, caps);
+ break;
+
+ default:
+ displayPresence(_e("Available"), 'available', show, status, hash, xid, avatar, checksum, caps);
+ break;
+ }
+ }
+}
+
+// Gets the highest resource priority for an user
+function highestPriority(xid) {
+ var maximum = null;
+ var selector, priority, type, highest;
+
+ // This is a groupchat presence
+ if(xid.indexOf('/') != -1)
+ highest = XMLFromString(getDB('presence', xid));
+
+ // This is a "normal" presence: get the highest priority resource
+ else {
+ for(var i = 0; i < sessionStorage.length; i++) {
+ // Get the pointer values
+ var current = sessionStorage.key(i);
+
+ // If the pointer is on a stored presence
+ if(explodeThis('_', current, 0) == 'presence') {
+ // Get the current XID
+ var now = bareXID(explodeThis('_', current, 1));
+
+ // If the current XID equals the asked XID
+ if(now == xid) {
+ var xml = XMLFromString(sessionStorage.getItem(current));
+ var priority = parseInt($(xml).find('priority').text());
+
+ // Higher priority
+ if((priority >= maximum) || (maximum == null)) {
+ maximum = priority;
+ highest = xml;
+ }
+ }
+ }
+ }
+ }
+
+ // The user might be offline if no highest
+ if(!highest)
+ highest = XMLFromString('<presence><type>unavailable</type></presence>');
+
+ return highest;
+}
+
+// Gets the resource from a XID which has the highest priority
+function getHighestResource(xid) {
+ var xml = $(highestPriority(xid));
+ var highest = xml.find('presence').attr('from');
+ var type = xml.find('type').text();
+
+ // If the use is online, we can return its highest resource
+ if(!type || (type == 'available') || (type == 'null'))
+ return highest;
+ else
+ return false;
+}
+
+// Makes something easy to process for the presence IA
+function presenceFunnel(xid, hash) {
+ // Get the highest priority presence value
+ var xml = $(highestPriority(xid));
+ var type = xml.find('type').text();
+ var show = xml.find('show').text();
+ var status = xml.find('status').text();
+ var avatar = xml.find('avatar').text();
+ var checksum = xml.find('checksum').text();
+ var caps = xml.find('caps').text();
+
+ // Display the presence with that stored value
+ if(!type && !show)
+ presenceIA('', 'available', status, hash, xid, avatar, checksum, caps);
+ else
+ presenceIA(type, show, status, hash, xid, avatar, checksum, caps);
+}
+
+// Sends a defined presence packet
+function sendPresence(to, type, show, status, checksum, limit_history, password, handle) {
+ // Get some stuffs
+ var priority = getDB('priority', 1);
+
+ if(!priority)
+ priority = '1';
+ if(!checksum)
+ checksum = getDB('checksum', 1);
+ if(show == 'available')
+ show = '';
+ if(type == 'available')
+ type = '';
+
+ // New presence
+ var presence = new JSJaCPresence();
+
+ // Avoid "null" or "none" if nothing stored
+ if(!checksum || (checksum == 'none'))
+ checksum = '';
+
+ // Presence headers
+ if(to)
+ presence.setTo(to);
+ if(type)
+ presence.setType(type);
+ if(show)
+ presence.setShow(show);
+ if(status)
+ presence.setStatus(status);
+
+ presence.setPriority(priority);
+
+ // CAPS (entity capabilities)
+ presence.appendNode('c', {'xmlns': NS_CAPS, 'hash': 'sha-1', 'node': 'https://www.jappix.com/', 'ver': myCaps()});
+
+ // Nickname
+ var nickname = getName();
+
+ if(nickname)
+ presence.appendNode('nick', {'xmlns': NS_NICK}, nickname);
+
+ // vcard-temp:x:update node
+ var x = presence.appendNode('x', {'xmlns': NS_VCARD_P});
+ x.appendChild(presence.buildNode('photo', {'xmlns': NS_VCARD_P}, checksum));
+
+ // MUC X data
+ if(limit_history || password) {
+ var xMUC = presence.appendNode('x', {'xmlns': NS_MUC});
+
+ // Max messages age (for MUC)
+ if(limit_history)
+ xMUC.appendChild(presence.buildNode('history', {'maxstanzas': 20, 'seconds': 86400, 'xmlns': NS_MUC}));
+
+ // Room password
+ if(password)
+ xMUC.appendChild(presence.buildNode('password', {'xmlns': NS_MUC}, password));
+ }
+
+ // If away, send a last activity time
+ if((show == 'away') || (show == 'xa')) {
+ /* REF: http://xmpp.org/extensions/xep-0256.html */
+
+ presence.appendNode(presence.buildNode('query', {
+ 'xmlns': NS_LAST,
+ 'seconds': getPresenceLast()
+ }));
+ }
+
+ // Else, set a new last activity stamp
+ else
+ PRESENCE_LAST_ACTIVITY = getTimeStamp();
+
+ // Send the presence packet
+ if(handle)
+ con.send(presence, handle);
+ else
+ con.send(presence);
+
+ if(!type)
+ type = 'available';
+
+ logThis('Presence sent: ' + type, 3);
+}
+
+// Performs all the actions to get the presence data
+function presenceSend(checksum, autoidle) {
+ // We get the values of the inputs
+ var show = getUserShow();
+ var status = getUserStatus();
+
+ // Send the presence
+ if(!isAnonymous())
+ sendPresence('', '', show, status, checksum);
+
+ // We set the good icon
+ presenceIcon(show);
+
+ // We store our presence
+ if(!autoidle)
+ setDB('presence-show', 1, show);
+
+ // We send the presence to our active MUC
+ $('.page-engine-chan[data-type=groupchat]').each(function() {
+ var tmp_nick = $(this).attr('data-nick');
+
+ if(!tmp_nick)
+ return;
+
+ var room = unescape($(this).attr('data-xid'));
+ var nick = unescape(tmp_nick);
+
+ // Must re-initialize?
+ if(RESUME)
+ getMUC(room, nick);
+
+ // Not disabled?
+ else if(!$(this).find('.message-area').attr('disabled'))
+ sendPresence(room + '/' + nick, '', show, status, '', true);
+ });
+}
+
+// Changes the presence icon
+function presenceIcon(value) {
+ $('#my-infos .f-presence a.picker').attr('data-value', value);
+}
+
+// Sends a subscribe stanza
+function sendSubscribe(to, type) {
+ var status = '';
+
+ // Subscribe request?
+ if(type == 'subscribe')
+ status = printf(_e("Hi, I am %s, I would like to add you as my friend."), getName());
+
+ sendPresence(to, type, '', status);
+}
+
+// Accepts the subscription from another entity
+function acceptSubscribe(xid, name) {
+ // We update our chat
+ $('#' + hex_md5(xid) + ' .tools-add').hide();
+
+ // We send a subsribed presence (to confirm)
+ sendSubscribe(xid, 'subscribed');
+
+ // We send a subscription request (subscribe both sides)
+ sendSubscribe(xid, 'subscribe');
+
+ // Specify the buddy name (if any)
+ if(name)
+ sendRoster(xid, '', name)
+}
+
+// Sends automatic away presence
+var AUTO_IDLE = false;
+
+function autoIdle() {
+ // Not connected?
+ if(!isConnected())
+ return;
+
+ // Stop if an xa presence was set manually
+ var last_presence = getUserShow();
+
+ if(!AUTO_IDLE && ((last_presence == 'away') || (last_presence == 'xa')))
+ return;
+
+ var idle_presence;
+ var activity_limit;
+
+ // Can we extend to auto extended away mode (20 minutes)?
+ if(AUTO_IDLE && (last_presence == 'away')) {
+ idle_presence = 'xa';
+ activity_limit = 1200;
+ }
+
+ // We must set the user to auto-away (10 minutes)
+ else {
+ idle_presence = 'away';
+ activity_limit = 600;
+ }
+
+ // The user is really inactive and has set another presence than extended away
+ if(((!AUTO_IDLE && (last_presence != 'away')) || (AUTO_IDLE && (last_presence == 'away'))) && (getLastActivity() >= activity_limit)) {
+ // Then tell we use an auto presence
+ AUTO_IDLE = true;
+
+ // Get the old status message
+ var status = getDB('options', 'presence-status');
+
+ if(!status)
+ status = '';
+
+ // Change the presence input
+ $('#my-infos .f-presence a.picker').attr('data-value', idle_presence);
+ $('#presence-status').val(status);
+
+ // Then send the xa presence
+ presenceSend('', true);
+
+ logThis('Auto-idle presence sent: ' + idle_presence, 3);
+ }
+}
+
+// Restores the old presence on a document bind
+function eventIdle() {
+ // If we were idle, restore our old presence
+ if(AUTO_IDLE) {
+ // Get the values
+ var show = getDB('presence-show', 1);
+ var status = getDB('options', 'presence-status');
+
+ // Change the presence input
+ $('#my-infos .f-presence a.picker').attr('data-value', show);
+ $('#presence-status').val(status);
+ $('#presence-status').placeholder();
+
+ // Then restore the old presence
+ presenceSend('', true);
+
+ if(!show)
+ show = 'available';
+
+ logThis('Presence restored: ' + show, 3);
+ }
+
+ // Apply some values
+ AUTO_IDLE = false;
+ LAST_ACTIVITY = getTimeStamp();
+}
+
+// Lives the auto idle functions
+function liveIdle() {
+ // Apply the autoIdle function every minute
+ AUTO_IDLE = false;
+ $('#my-infos .f-presence').everyTime('30s', autoIdle);
+
+ // On body bind (click & key event)
+ $('body').live('mousedown', eventIdle)
+ .live('mousemove', eventIdle)
+ .live('keydown', eventIdle);
+}
+
+// Kills the auto idle functions
+function dieIdle() {
+ // Remove the event detector
+ $('body').die('mousedown', eventIdle)
+ .die('mousemove', eventIdle)
+ .die('keydown', eventIdle);
+}
+
+// Gets the user presence show
+function getUserShow() {
+ return $('#my-infos .f-presence a.picker').attr('data-value');
+}
+
+// Gets the user presence status
+function getUserStatus() {
+ return $('#presence-status').val();
+}
+
+// Plugin launcher
+function launchPresence() {
+ // Click event for user presence show
+ $('#my-infos .f-presence a.picker').click(function() {
+ // Disabled?
+ if($(this).hasClass('disabled'))
+ return false;
+
+ // Initialize some vars
+ var path = '#my-infos .f-presence div.bubble';
+ var show_id = ['xa', 'away', 'available'];
+ var show_lang = [_e("Not available"), _e("Away"), _e("Available")];
+ var show_val = getUserShow();
+
+ // Yet displayed?
+ var can_append = true;
+
+ if(exists(path))
+ can_append = false;
+
+ // Add this bubble!
+ showBubble(path);
+
+ if(!can_append)
+ return false;
+
+ // Generate the HTML code
+ var html = '<div class="bubble removable">';
+
+ for(i in show_id) {
+ // Yet in use: no need to display it!
+ if(show_id[i] == show_val)
+ continue;
+
+ html += '<a href="#" class="talk-images" data-value="' + show_id[i] + '" title="' + show_lang[i] + '"></a>';
+ }
+
+ html += '</div>';
+
+ // Append the HTML code
+ $('#my-infos .f-presence').append(html);
+
+ // Click event
+ $(path + ' a').click(function() {
+ // Update the presence show marker
+ $('#my-infos .f-presence a.picker').attr('data-value', $(this).attr('data-value'));
+
+ // Close the bubble
+ closeBubbles();
+
+ // Focus on the status input
+ $(document).oneTime(10, function() {
+ $('#presence-status').focus();
+ });
+
+ return false;
+ });
+
+ return false;
+ });
+
+ // Submit events for user presence status
+ $('#presence-status').placeholder()
+
+ .keyup(function(e) {
+ if(e.keyCode == 13) {
+ $(this).blur();
+
+ return false;
+ }
+ })
+
+ .blur(function() {
+ // Read the parameters
+ var show = getUserShow();
+ var status = getUserStatus();
+
+ // Read the old parameters
+ var old_show = getDB('presence-show', 1);
+ var old_status = getDB('options', 'presence-status');
+
+ // Must send the presence?
+ if((show != old_show) || (status != old_status)) {
+ // Update the local stored status
+ setDB('options', 'presence-status', status);
+
+ // Update the server stored status
+ if(status != old_status)
+ storeOptions();
+
+ // Send the presence
+ presenceSend();
+ }
+ })
+
+ // Input focus handler
+ .focus(function() {
+ closeBubbles();
+ });
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the privacy JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 23/06/11
+
+*/
+
+// Opens the privacy popup
+function openPrivacy() {
+ // Popup HTML content
+ var html =
+ '<div class="top">' + _e("Privacy") + '</div>' +
+
+ '<div class="content">' +
+ '<div class="privacy-head">' +
+ '<div class="list-left">' +
+ '<span>' + _e("Choose") + '</span>' +
+ '<select disabled=""></select>' +
+ '<a href="#" class="list-remove one-button talk-images" title="' + _e("Remove") + '"></a>' +
+ '</div>' +
+
+ '<div class="list-center"></div>' +
+
+ '<div class="list-right">' +
+ '<span>' + _e("Add") + '</span>' +
+ '<input type="text" placeholder="' + _e("List name") + '" />' +
+ '</div>' +
+ '</div>' +
+
+ '<div class="privacy-item">' +
+ '<span>' + _e("Item") + '</span>' +
+ '<select disabled=""></select>' +
+ '<a href="#" class="item-add one-button talk-images" title="' + _e("Add") + '"></a>' +
+ '<a href="#" class="item-remove one-button talk-images" title="' + _e("Remove") + '"></a>' +
+ '<a href="#" class="item-save one-button talk-images">' + _e("Save") + '</a>' +
+
+ '<div class="clear"></div>' +
+ '</div>' +
+
+ '<div class="privacy-form">' +
+ '<div class="privacy-first">' +
+ '<label><input type="radio" name="action" value="allow" disabled="" />' + _e("Allow") + '</label>' +
+ '<label><input type="radio" name="action" value="deny" disabled="" />' + _e("Deny") + '</label>' +
+ '</div>' +
+
+ '<div class="privacy-second">' +
+ '<label><input type="radio" name="type" value="jid" disabled="" />' + _e("Address") + '</label>' +
+ '<input type="text" name="jid" disabled="" />' +
+
+ '<label><input type="radio" name="type" value="group" disabled="" />' + _e("Group") + '</label>' +
+ '<select name="group" disabled="">' + groupsToHtmlPrivacy() + '</select>' +
+
+ '<label><input type="radio" name="type" value="subscription" disabled="" />' + _e("Subscription") + '</label>' +
+ '<select name="subscription" disabled="">' +
+ '<option value="none">' + _e("None") + '</option>' +
+ '<option value="both">' + _e("Both") + '</option>' +
+ '<option value="from">' + _e("From") + '</option>' +
+ '<option value="to">' + _e("To") + '</option>' +
+ '</select>' +
+
+ '<label><input type="radio" name="type" value="everybody" disabled="" />' + _e("Everybody") + '</label>' +
+ '</div>' +
+
+ '<div class="privacy-third">' +
+ '<label><input type="checkbox" name="send-messages" disabled="" />' + _e("Send messages") + '</label>' +
+ '<label><input type="checkbox" name="send-queries" disabled="" />' + _e("Send queries") + '</label>' +
+ '<label><input type="checkbox" name="see-status" disabled="" />' + _e("See my status") + '</label>' +
+ '<label><input type="checkbox" name="send-status" disabled="" />' + _e("Send his/her status") + '</label>' +
+ '<label><input type="checkbox" name="everything" disabled="" />' + _e("Everything") + '</label>' +
+ '</div>' +
+
+ '<div class="clear"></div>' +
+ '</div>' +
+
+ '<div class="privacy-active">' +
+ '<label>' + _e("Order") + '<input type="text" name="order" value="1" disabled="" /></label>' +
+
+ '<div class="privacy-active-elements">' +
+ '<label><input type="checkbox" name="active" disabled="" />' + _e("Active for this session") + '</label>' +
+ '<label><input type="checkbox" name="default" disabled="" />' + _e("Always active") + '</label>' +
+ '</div>' +
+ '</div>' +
+ '</div>' +
+
+ '<div class="bottom">' +
+ '<div class="wait wait-medium"></div>' +
+
+ '<a href="#" class="finish">' + _e("Close") + '</a>' +
+ '</div>';
+
+ // Create the popup
+ createPopup('privacy', html);
+
+ // Associate the events
+ launchPrivacy();
+
+ // Display the available privacy lists
+ displayListsPrivacy();
+
+ // Get the first list items
+ displayItemsPrivacy();
+
+ return false;
+}
+
+// Quits the privacy popup
+function closePrivacy() {
+ // Destroy the popup
+ destroyPopup('privacy');
+
+ return false;
+}
+
+// Sets the received state for privacy block list
+function receivedPrivacy() {
+ // Store marker
+ setDB('privacy-marker', 'available', 'true');
+
+ // Show privacy elements
+ $('.privacy-hidable').show();
+}
+
+// Gets available privacy lists
+function listPrivacy() {
+ // Build query
+ var iq = new JSJaCIQ();
+ iq.setType('get');
+
+ iq.setQuery(NS_PRIVACY);
+
+ con.send(iq, handleListPrivacy);
+
+ logThis('Getting available privacy list(s)...');
+}
+
+// Handles available privacy lists
+function handleListPrivacy(iq) {
+ // Error?
+ if(iq.getType() == 'error')
+ return logThis('Privacy lists not supported!', 2);
+
+ // Get IQ query content
+ var iqQuery = iq.getQuery();
+
+ // Save the content
+ setDB('privacy-lists', 'available', xmlToString(iqQuery));
+
+ // Any block list?
+ if($(iqQuery).find('list[name=block]').size()) {
+ // Not the default one?
+ if(!$(iqQuery).find('default[name=block]').size())
+ changePrivacy('block', 'default');
+ else
+ setDB('privacy-marker', 'default', 'block');
+
+ // Not the active one?
+ if(!$(iqQuery).find('active[name=block]').size())
+ changePrivacy('block', 'active');
+ else
+ setDB('privacy-marker', 'active', 'block');
+
+ // Get the block list rules
+ getPrivacy('block');
+ }
+
+ // Apply the received marker here
+ else
+ receivedPrivacy();
+
+ logThis('Got available privacy list(s).', 3);
+}
+
+// Gets privacy lists
+function getPrivacy(list) {
+ // Build query
+ var iq = new JSJaCIQ();
+ iq.setType('get');
+
+ // Privacy query
+ var iqQuery = iq.setQuery(NS_PRIVACY);
+ iqQuery.appendChild(iq.buildNode('list', {'xmlns': NS_PRIVACY, 'name': list}));
+
+ con.send(iq, handleGetPrivacy);
+
+ // Must show the wait item?
+ if(exists('#privacy'))
+ $('#privacy .wait').show();
+
+ logThis('Getting privacy list(s): ' + list);
+}
+
+// Handles privacy lists
+function handleGetPrivacy(iq) {
+ // Apply a "received" marker
+ receivedPrivacy();
+
+ // Store the data for each list
+ $(iq.getQuery()).find('list').each(function() {
+ // Read list name
+ var list_name = $(this).attr('name');
+
+ // Store list content
+ setDB('privacy', list_name, xmlToString(this));
+
+ // Is this a block list?
+ if(list_name == 'block') {
+ // Reset buddies
+ $('#buddy-list .buddy').removeClass('blocked');
+
+ // XID types
+ $(this).find('item[action=deny][type=jid]').each(function() {
+ $('#buddy-list .buddy[data-xid=' + escape($(this).attr('value')) + ']').addClass('blocked');
+ });
+
+ // Group types
+ $(this).find('item[action=deny][type=group]').each(function() {
+ $('#buddy-list .group' + hex_md5($(this).attr('value')) + ' .buddy').addClass('blocked');
+ });
+ }
+ });
+
+ // Must display it to the popup?
+ if(exists('#privacy')) {
+ displayItemsPrivacy();
+
+ $('#privacy .wait').hide();
+ }
+
+ logThis('Got privacy list(s).', 3);
+}
+
+// Sets a privacy list
+function setPrivacy(list, types, values, actions, orders, presence_in, presence_out, msg, iq_p) {
+ // Build query
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ // Privacy query
+ var iqQuery = iq.setQuery(NS_PRIVACY);
+ var iqList = iqQuery.appendChild(iq.buildNode('list', {'xmlns': NS_PRIVACY, 'name': list}));
+
+ // Build the item elements
+ if(types && types.length) {
+ for(var i = 0; i < types.length; i++) {
+ // Item element
+ var iqItem = iqList.appendChild(iq.buildNode('item', {'xmlns': NS_PRIVACY}));
+
+ // Item attributes
+ if(types[i])
+ iqItem.setAttribute('type', types[i]);
+ if(values[i])
+ iqItem.setAttribute('value', values[i]);
+ if(actions[i])
+ iqItem.setAttribute('action', actions[i]);
+ if(orders[i])
+ iqItem.setAttribute('order', orders[i]);
+
+ // Child elements
+ if(presence_in[i])
+ iqItem.appendChild(iq.buildNode('presence-in', {'xmlns': NS_PRIVACY}));
+ if(presence_out[i])
+ iqItem.appendChild(iq.buildNode('presence-out', {'xmlns': NS_PRIVACY}));
+ if(msg[i])
+ iqItem.appendChild(iq.buildNode('message', {'xmlns': NS_PRIVACY}));
+ if(iq_p[i])
+ iqItem.appendChild(iq.buildNode('iq', {'xmlns': NS_PRIVACY}));
+ }
+ }
+
+ con.send(iq);
+
+ logThis('Sending privacy list: ' + list);
+}
+
+// Push a privacy list item to a list
+function pushPrivacy(list, type, value, action, order, presence_in, presence_out, msg, iq_p, hash, special_action) {
+ // Read the stored elements (to add them)
+ var stored = XMLFromString(getDB('privacy', list));
+
+ // Read the first value
+ var first_val = value[0];
+
+ // Must remove the given value?
+ if(special_action == 'remove') {
+ type = [];
+ value = [];
+ action = [];
+ order = [];
+ presence_in = [];
+ presence_out = [];
+ iq_p = [];
+ }
+
+ // Serialize them to an array
+ $(stored).find('item').each(function() {
+ // Attributes
+ var c_type = $(this).attr('type');
+ var c_value = $(this).attr('value');
+ var c_action = $(this).attr('action');
+ var c_order = $(this).attr('order');
+
+ // Generate hash
+ var c_hash = hex_md5(c_type + c_value + c_action + c_order);
+
+ // Do not push it twice!
+ if(((c_hash != hash) && (special_action != 'roster')) || ((first_val != c_value) && (special_action == 'roster'))) {
+ if(!c_type)
+ c_type = '';
+ if(!c_value)
+ c_value = '';
+ if(!c_action)
+ c_action = '';
+ if(!c_order)
+ c_order = '';
+
+ type.push(c_type);
+ value.push(c_value);
+ action.push(c_action);
+ order.push(c_order);
+
+ // Child elements
+ if($(this).find('presence-in').size())
+ presence_in.push(true);
+ else
+ presence_in.push(false);
+
+ if($(this).find('presence-out').size())
+ presence_out.push(true);
+ else
+ presence_out.push(false);
+
+ if($(this).find('message').size())
+ msg.push(true);
+ else
+ msg.push(false);
+
+ if($(this).find('iq').size())
+ iq_p.push(true);
+ else
+ iq_p.push(false);
+ }
+ });
+
+ // Send it!
+ setPrivacy(list, type, value, action, order, presence_in, presence_out, msg, iq_p);
+}
+
+// Change a privacy list status
+function changePrivacy(list, status) {
+ // Yet sent?
+ if(getDB('privacy-marker', status) == list)
+ return;
+
+ // Write a marker
+ setDB('privacy-marker', status, list);
+
+ // Build query
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ // Privacy query
+ var iqQuery = iq.setQuery(NS_PRIVACY);
+ var iqStatus = iqQuery.appendChild(iq.buildNode(status, {'xmlns': NS_PRIVACY}));
+
+ // Can add a "name" attribute?
+ if(list)
+ iqStatus.setAttribute('name', list);
+
+ con.send(iq);
+
+ logThis('Changing privacy list status: ' + list + ' to: ' + status);
+}
+
+// Checks the privacy status (action) of a value
+function statusPrivacy(list, value) {
+ return $(XMLFromString(getDB('privacy', list))).find('item[value=' + value + ']').attr('action');
+}
+
+// Converts the groups array into a <option /> string
+function groupsToHtmlPrivacy() {
+ var groups = getAllGroups();
+ var html = '';
+
+ // Generate HTML
+ for(i in groups) {
+ html += '<option value="' + encodeQuotes(groups[i]) +'">' + groups[i].htmlEnc() + '</option>';
+ }
+
+ return html;
+}
+
+// Displays the privacy lists
+function displayListsPrivacy() {
+ // Initialize
+ var code = '';
+ var select = $('#privacy .privacy-head .list-left select');
+ var data = XMLFromString(getDB('privacy-lists', 'available'));
+
+ // Parse the XML data!
+ $(data).find('list').each(function() {
+ var list_name = $(this).attr('name');
+
+ if(list_name)
+ code += '<option value="' + encodeQuotes(list_name) + '">' + list_name.htmlEnc() + '</option>';
+ });
+
+ // Apply HTML code
+ select.html(code);
+
+ // Not empty?
+ if(code)
+ select.removeAttr('disabled');
+ else
+ select.attr('disabled', true);
+
+ return true;
+}
+
+// Displays the privacy items for a list
+function displayItemsPrivacy() {
+ // Reset the form
+ clearFormPrivacy();
+ disableFormPrivacy();
+
+ // Initialize
+ var code = '';
+ var select = $('#privacy .privacy-item select');
+ var list = $('#privacy .privacy-head .list-left select').val();
+
+ // Reset the item select
+ select.html('');
+
+ // No list?
+ if(!list)
+ return false;
+
+ // Reset the list status
+ $('#privacy .privacy-active input[type=checkbox]').removeAttr('checked');
+
+ // Display the list status
+ var status = ['active', 'default'];
+
+ for(s in status) {
+ if(getDB('privacy-marker', status[s]) == list)
+ $('#privacy .privacy-active input[name=' + status[s] + ']').attr('checked', true);
+ }
+
+ // Try to read the stored items
+ var items = XMLFromString(getDB('privacy', list));
+
+ // Must retrieve the data?
+ if(!items) {
+ select.attr('disabled', true);
+
+ return getPrivacy(list);
+ }
+
+ else
+ select.removeAttr('disabled');
+
+ // Parse the XML data!
+ $(items).find('item').each(function() {
+ // Read attributes
+ var item_type = $(this).attr('type');
+ var item_value = $(this).attr('value');
+ var item_action = $(this).attr('action');
+ var item_order = $(this).attr('order');
+
+ // Generate hash
+ var item_hash = hex_md5(item_type + item_value + item_action + item_order);
+
+ // Read sub-elements
+ var item_presencein = $(this).find('presence-in').size();
+ var item_presenceout = $(this).find('presence-out').size();
+ var item_message = $(this).find('message').size();
+ var item_iq = $(this).find('iq').size();
+
+ // Apply default values (if missing)
+ if(!item_type)
+ item_type = '';
+ if(!item_value)
+ item_value = '';
+ if(!item_action)
+ item_action = 'allow';
+ if(!item_order)
+ item_order = '1';
+
+ // Apply sub-elements values
+ if(item_presencein)
+ item_presencein = 'true';
+ else
+ item_presencein = 'false';
+
+ if(item_presenceout)
+ item_presenceout = 'true';
+ else
+ item_presenceout = 'false';
+
+ if(item_message)
+ item_message = 'true';
+ else
+ item_message = 'false';
+
+ if(item_iq)
+ item_iq = 'true';
+ else
+ item_iq = 'false';
+
+ // Generate item description
+ var desc = '';
+ var desc_arr = [item_type, item_value, item_action, item_order];
+
+ for(d in desc_arr) {
+ // Nothing to display?
+ if(!desc_arr[d])
+ continue;
+
+ if(desc)
+ desc += ' - ';
+
+ desc += desc_arr[d];
+ }
+
+ // Add the select option
+ code += '<option data-type="' + encodeQuotes(item_type) + '" data-value="' + encodeQuotes(item_value) + '" data-action="' + encodeQuotes(item_action) + '" data-order="' + encodeQuotes(item_order) + '" data-presence_in="' + encodeQuotes(item_presencein) + '" data-presence_out="' + encodeQuotes(item_presenceout) + '" data-message="' + encodeQuotes(item_message) + '" data-iq="' + encodeQuotes(item_iq) + '" data-hash="' + encodeQuotes(item_hash) + '">' +
+ desc +
+ '</option>';
+ });
+
+ // Append the code
+ select.append(code);
+
+ // Display the first item form
+ var first_item = select.find('option:first');
+ displayFormPrivacy(
+ first_item.attr('data-type'),
+ first_item.attr('data-value'),
+ first_item.attr('data-action'),
+ first_item.attr('data-order'),
+ first_item.attr('data-presence_in'),
+ first_item.attr('data-presence_out'),
+ first_item.attr('data-message'),
+ first_item.attr('data-iq')
+ );
+
+ return true;
+}
+
+// Displays the privacy form for an item
+function displayFormPrivacy(type, value, action, order, presence_in, presence_out, message, iq) {
+ // Reset the form
+ clearFormPrivacy();
+
+ // Apply the action
+ $('#privacy .privacy-first input[name=action][value=' + action + ']').attr('checked', true);
+
+ // Apply the type & value
+ var privacy_second = '#privacy .privacy-second';
+ var privacy_type = privacy_second + ' input[name=type]';
+ var type_check, value_input;
+
+ switch(type) {
+ case 'jid':
+ type_check = privacy_type + '[value=jid]';
+ value_input = privacy_second + ' input[type=text][name=jid]';
+
+ break;
+
+ case 'group':
+ type_check = privacy_type + '[value=group]';
+ value_input = privacy_second + ' select[name=group]';
+
+ break;
+
+ case 'subscription':
+ type_check = privacy_type + '[value=subscription]';
+ value_input = privacy_second + ' select[name=subscription]';
+
+ break;
+
+ default:
+ type_check = privacy_type + '[value=everybody]';
+
+ break;
+ }
+
+ // Check the target
+ $(type_check).attr('checked', true);
+
+ // Can apply a value?
+ if(value_input)
+ $(value_input).val(value);
+
+ // Apply the things to do
+ var privacy_do = '#privacy .privacy-third input[type=checkbox]';
+
+ if(presence_in == 'true')
+ $(privacy_do + '[name=send-status]').attr('checked', true);
+ if(presence_out == 'true')
+ $(privacy_do + '[name=see-status]').attr('checked', true);
+ if(message == 'true')
+ $(privacy_do + '[name=send-messages]').attr('checked', true);
+ if(iq == 'true')
+ $(privacy_do + '[name=send-queries]').attr('checked', true);
+
+ if(!$(privacy_do).filter(':checked').size())
+ $(privacy_do + '[name=everything]').attr('checked', true);
+
+ // Apply the order
+ $('#privacy .privacy-active input[name=order]').val(order);
+
+ // Enable the forms
+ $('#privacy .privacy-form input, #privacy .privacy-form select, #privacy .privacy-active input').removeAttr('disabled');
+}
+
+// Clears the privacy list form
+function clearFormPrivacy() {
+ // Uncheck checkboxes & radio inputs
+ $('#privacy .privacy-form input[type=checkbox], #privacy .privacy-form input[type=radio]').removeAttr('checked');
+
+ // Reset select
+ $('#privacy .privacy-form select option').removeAttr('selected');
+ $('#privacy .privacy-form select option:first').attr('selected', true);
+
+ // Reset text input
+ $('#privacy .privacy-form input[type=text]').val('');
+
+ // Reset order input
+ $('#privacy .privacy-active input[name=order]').val('1');
+}
+
+// Disables the privacy list form
+function disableFormPrivacy() {
+ $('#privacy .privacy-form input, #privacy .privacy-form select, #privacy .privacy-active input').attr('disabled', true);
+}
+
+// Enables the privacy list form
+function enableFormPrivacy(rank) {
+ $('#privacy .privacy-' + rank + ' input, #privacy .privacy-' + rank + ' select').removeAttr('disabled');
+}
+
+// Plugin launcher
+function launchPrivacy() {
+ // Click events
+ $('#privacy .bottom .finish').click(closePrivacy);
+
+ // Placeholder events
+ $('#privacy input[placeholder]').placeholder();
+
+ // Form events
+ $('#privacy .privacy-head a.list-remove').click(function() {
+ // Get list name
+ var list = $('#privacy .privacy-head .list-left select').val();
+
+ // No value?
+ if(!list)
+ return false;
+
+ // Remove it from popup
+ $('#privacy .privacy-head .list-left select option[value=' + list + ']').remove();
+
+ // Nothing remaining?
+ if(!exists('#privacy .privacy-head .list-left select option'))
+ $('#privacy .privacy-head .list-left select option').attr('disabled', true);
+
+ // Empty the item select
+ $('#privacy .privacy-item select').attr('disabled', true).html('');
+
+ // Disable this list before removing it
+ var status = ['active', 'default'];
+
+ for(s in status) {
+ if(getDB('privacy-marker', status[s]) == list)
+ changePrivacy('', status[s]);
+ }
+
+ // Remove from server
+ setPrivacy(list);
+
+ // Reset the form
+ clearFormPrivacy();
+ disableFormPrivacy();
+
+ return false;
+ });
+
+ $('#privacy .privacy-head .list-right input').keyup(function(e) {
+ // Not enter?
+ if(e.keyCode != 13)
+ return;
+
+ // Get list name
+ var list = $('#privacy .privacy-head .list-right input').val();
+ var select = '#privacy .privacy-head .list-left select';
+ var existed = true;
+
+ // Create the new element
+ if(!exists(select + ' option[value=' + list + ']')) {
+ // Marker
+ existed = false;
+
+ // Create a new option
+ $(select).append('<option value="' + encodeQuotes(list) + '">' + list.htmlEnc() + '</option>');
+
+ // Reset the item select
+ $('#privacy .privacy-item select').attr('disabled', true).html('');
+ }
+
+ // Change the select value & enable it
+ $(select).val(list).removeAttr('disabled');
+
+ // Reset its value
+ $(this).val('');
+
+ // Reset the form
+ clearFormPrivacy();
+ disableFormPrivacy();
+
+ // Must reload the list items?
+ if(existed) {
+ displayItemsPrivacy();
+ $('#privacy .privacy-item select').removeAttr('disabled');
+ }
+ });
+
+ $('#privacy .privacy-head .list-left select').change(displayItemsPrivacy);
+
+ $('#privacy .privacy-item select').change(function() {
+ // Get the selected item
+ var item = $(this).find('option:selected');
+
+ // Display the data!
+ displayFormPrivacy(
+ item.attr('data-type'),
+ item.attr('data-value'),
+ item.attr('data-action'),
+ item.attr('data-order'),
+ item.attr('data-presence_in'),
+ item.attr('data-presence_out'),
+ item.attr('data-message'),
+ item.attr('data-iq')
+ );
+ });
+
+ $('#privacy .privacy-item a.item-add').click(function() {
+ // Cannot add anything?
+ if(!exists('#privacy .privacy-head .list-left select option:selected'))
+ return false;
+
+ // Disable item select
+ $('#privacy .privacy-item select').attr('disabled', true);
+
+ // Reset the form
+ clearFormPrivacy();
+ disableFormPrivacy();
+
+ // Enable first form item
+ enableFormPrivacy('first');
+ enableFormPrivacy('active');
+
+ return false;
+ });
+
+ $('#privacy .privacy-item a.item-remove').click(function() {
+ // Cannot add anything?
+ if(!exists('#privacy .privacy-head .list-left select option:selected'))
+ return false;
+
+ // Get values
+ var list = $('#privacy .privacy-head .list-left select').val();
+ var selected = $('#privacy .privacy-item select option:selected');
+ var item = selected.attr('data-value');
+ var hash = selected.attr('data-hash');
+
+ // Remove it from popup
+ $('#privacy .privacy-item select option:selected').remove();
+
+ // No more items in this list?
+ if(!exists('#privacy .privacy-item select option')) {
+ // Disable this select
+ $('#privacy .privacy-item select').attr('disabled', true);
+
+ // Remove the privacy list select item
+ $('#privacy .privacy-head .list-left select option[value=' + list + ']').remove();
+
+ // No more privacy lists?
+ if(!exists('#privacy .privacy-head .list-left select option'))
+ $('#privacy .privacy-head .list-left select').attr('disabled', true);
+
+ // Disable this list before removing it
+ var status = ['active', 'default'];
+
+ for(s in status) {
+ if(getDB('privacy-marker', status[s]) == list)
+ changePrivacy('', status[s]);
+ }
+ }
+
+ // Synchronize it with server
+ pushPrivacy(list, [], [item], [], [], [], [], [], [], hash, 'remove');
+
+ // Reset the form
+ clearFormPrivacy();
+ disableFormPrivacy();
+
+ return false;
+ });
+
+ $('#privacy .privacy-item a.item-save').click(function() {
+ // Canot push item?
+ if(exists('#privacy .privacy-form input:disabled'))
+ return false;
+
+ // Get the hash
+ var item_hash = '';
+
+ if(!$('#privacy .privacy-item select').is(':disabled'))
+ item_hash = $('#privacy .privacy-item select option:selected').attr('data-hash');
+
+ // Read the form
+ var privacy_second = '#privacy .privacy-second';
+ var item_list = $('#privacy .privacy-head .list-left select').val();
+ var item_action = $('#privacy .privacy-first input[name=action]').filter(':checked').val();
+ var item_type = $(privacy_second + ' input[name=type]').filter(':checked').val();
+ var item_order = $('#privacy .privacy-active input[name=order]').val();
+ var item_value = '';
+
+ // Switch the type to get the value
+ switch(item_type) {
+ case 'jid':
+ item_value = $(privacy_second + ' input[type=text][name=jid]').val();
+
+ break;
+
+ case 'group':
+ item_value = $(privacy_second + ' select[name=group]').val();
+
+ break;
+
+ case 'subscription':
+ item_value = $(privacy_second + ' select[name=subscription]').val();
+
+ break;
+
+ default:
+ item_type = '';
+
+ break;
+ }
+
+ // Get the selected things to do
+ var privacy_third_cb = '#privacy .privacy-third input[type=checkbox]';
+ var item_prin = false;
+ var item_prout = false;
+ var item_msg = false;
+ var item_iq = false;
+
+ // Individual select?
+ if(!$(privacy_third_cb + '[name=everything]').filter(':checked').size()) {
+ if($(privacy_third_cb + '[name=send-messages]').filter(':checked').size())
+ item_msg = true;
+ if($(privacy_third_cb + '[name=send-queries]').filter(':checked').size())
+ item_iq = true;
+ if($(privacy_third_cb + '[name=send-queries]').filter(':checked').size())
+ item_iq = true;
+ if($(privacy_third_cb + '[name=see-status]').filter(':checked').size())
+ item_prout = true;
+ if($(privacy_third_cb + '[name=send-status]').filter(':checked').size())
+ item_prin = true;
+ }
+
+ // Push item to the server!
+ pushPrivacy(
+ item_list,
+ [item_type],
+ [item_value],
+ [item_action],
+ [item_order],
+ [item_prin],
+ [item_prout],
+ [item_msg],
+ [item_iq],
+ item_hash
+ );
+
+ return false;
+ });
+
+ $('#privacy .privacy-first input').change(function() {
+ enableFormPrivacy('second');
+ });
+
+ $('#privacy .privacy-second input').change(function() {
+ enableFormPrivacy('third');
+ });
+
+ $('#privacy .privacy-third input[type=checkbox]').change(function() {
+ // Target
+ var target = '#privacy .privacy-third input[type=checkbox]';
+
+ // Must tick "everything" checkbox?
+ if(!$(target).filter(':checked').size())
+ $(target + '[name=everything]').attr('checked', true);
+
+ // Must untick the other checkboxes?
+ else if($(this).is('[name=everything]'))
+ $(target + ':not([name=everything])').removeAttr('checked');
+
+ // Must untick "everything" checkbox?
+ else
+ $(target + '[name=everything]').removeAttr('checked');
+ });
+
+ $('#privacy .privacy-active input[name=order]').keyup(function() {
+ // Get the value
+ var value = $(this).val();
+
+ // No value?
+ if(!value)
+ return;
+
+ // Not a number?
+ if(isNaN(value))
+ value = 1;
+ else
+ value = parseInt(value);
+
+ // Negative?
+ if(value < 0)
+ value = value * -1;
+
+ // Apply the filtered value
+ $(this).val(value);
+ })
+
+ .blur(function() {
+ // No value?
+ if(!$(this).val())
+ $(this).val('1');
+ });
+
+ $('#privacy .privacy-active .privacy-active-elements input').change(function() {
+ // Get the values
+ var list_name = $('#privacy .privacy-head .list-left select').val();
+ var state_name = $(this).attr('name');
+
+ // Cannot continue?
+ if(!list_name || !state_name)
+ return;
+
+ // Change the current list status
+ if($(this).filter(':checked').size())
+ changePrivacy(list_name, state_name);
+ else
+ changePrivacy('', state_name);
+ });
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the receipts JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 26/12/10
+
+*/
+
+// Checks if we can send a receipt request
+function receiptRequest(hash) {
+ // Entity have support for receipt?
+ if($('#' + hash + ' .message-area').attr('data-receipts') == 'true')
+ return true;
+
+ return false;
+}
+
+// Checks if there is a receipt request
+function hasReceipt(packet) {
+ // Any receipt request?
+ if(packet.getChild('request', NS_URN_RECEIPTS))
+ return true;
+
+ return false;
+}
+
+// Checks if there is a received reply
+function hasReceived(packet) {
+ // Any received reply?
+ if(packet.getChild('received', NS_URN_RECEIPTS))
+ return true;
+
+ return false;
+}
+
+// Sends a received notification
+function sendReceived(type, to, id) {
+ var aMsg = new JSJaCMessage();
+ aMsg.setTo(to);
+ aMsg.setID(id);
+
+ // Any type?
+ if(type)
+ aMsg.setType(type);
+
+ // Append the received node
+ aMsg.appendNode('received', {'xmlns': NS_URN_RECEIPTS, 'id': id});
+
+ con.send(aMsg);
+
+ logThis('Sent received to: ' + to);
+}
+
+// Tells the message has been received
+function messageReceived(hash, id) {
+ // Line selector
+ var path = $('#' + hash + ' .one-line[data-id=' + id + ']');
+
+ // Add a received marker
+ path.attr('data-received', 'true')
+ .removeAttr('data-lost');
+
+ // Group selector
+ var group = path.parent();
+
+ // Remove the group marker
+ if(!group.find('.one-line[data-lost]').size()) {
+ group.find('b.name').removeClass('talk-images')
+ .removeAttr('title');
+ }
+
+ return false;
+}
+
+// Checks if the message has been received
+function checkReceived(hash, id) {
+ // Fire a check 10 seconds later
+ $('#' + hash + ' .one-line[data-id=' + id + ']').oneTime('10s', function() {
+ // Not received?
+ if($(this).attr('data-received') != 'true') {
+ // Add a "lost" marker
+ $(this).attr('data-lost', 'true');
+
+ // Add a warn on the buddy-name
+ $(this).parent().find('b.name').addClass('talk-images')
+ .attr('title', _e("Your friend seems not to have received your message(s)!"));
+ }
+ });
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the roster JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 19/05/11
+
+*/
+
+// Gets the roster items
+function getRoster() {
+ var iq = new JSJaCIQ();
+
+ iq.setType('get');
+ iq.setQuery(NS_ROSTER);
+
+ con.send(iq, handleRoster);
+}
+
+// Handles the roster items
+function handleRoster(iq) {
+ // Define some variables
+ var handleXML = iq.getQuery();
+ var current, xid, dName, subscription, group, xidHash, getNick, nick;
+
+ // Parse the vcard xml
+ $(handleXML).find('item').each(function() {
+ parseRoster($(this), 'load');
+ });
+
+ // Update our avatar (if changed), and send our presence
+ getAvatar(getXID(), 'force', 'true', 'forget');
+
+ logThis('Roster received.');
+}
+
+// Parses the group XML and display the roster
+function parseRoster(current, mode) {
+ // Get the values
+ xid = current.attr('jid');
+ dName = current.attr('name');
+ subscription = current.attr('subscription');
+ xidHash = hex_md5(xid);
+
+ // Create an array containing the groups
+ var groups = new Array();
+
+ current.find('group').each(function() {
+ var group_text = $(this).text();
+
+ if(group_text)
+ groups.push(group_text);
+ });
+
+ // No group?
+ if(!groups.length)
+ groups.push(_e("Unclassified"));
+
+ // If no name is defined, we get the default nick of the buddy
+ if(!dName)
+ dName = getXIDNick(xid);
+
+ displayRoster(xid, xidHash, dName, subscription, groups, mode);
+}
+
+// Updates the roster groups
+function updateGroups() {
+ $('#buddy-list .one-group').each(function() {
+ // Current values
+ var check = $(this).find('.buddy').size();
+ var hidden = $(this).find('.buddy:not(.hidden-buddy:hidden)').size();
+
+ // Special case: the filtering tool
+ if(SEARCH_FILTERED)
+ hidden = $(this).find('.buddy:visible').size();
+
+ // If the group is empty
+ if(!check)
+ $(this).remove();
+
+ // If the group contains no online buddy (and is not just hidden)
+ if(!hidden && $(this).find('a.group').hasClass('minus'))
+ $(this).hide();
+ else
+ $(this).show();
+ });
+}
+
+// Displays a defined roster item
+function displayRoster(dXID, dXIDHash, dName, dSubscription, dGroup, dMode) {
+ // First remove the buddy
+ $('#buddy-list .' + dXIDHash).remove();
+
+ // Define some things around the groups
+ var is_gateway = isGateway(dXID);
+ var gateway = '';
+
+ if(is_gateway) {
+ gateway = ' gateway';
+ dGroup = new Array(_e("Gateways"));
+ }
+
+ // Remove request (empty his social channel)
+ if(dSubscription == 'remove')
+ $('#channel .mixed .one-update.update_' + dXIDHash).remove();
+
+ // Other request
+ else {
+ // Is this buddy blocked?
+ var privacy_class = '';
+ var privacy_state = statusPrivacy('block', dXID);
+
+ if(privacy_state == 'deny')
+ privacy_class = ' blocked';
+
+ // For each group this buddy has
+ for(i in dGroup) {
+ var cGroup = dGroup[i];
+
+ if(cGroup) {
+ // Process some vars
+ var groupHash = 'group' + hex_md5(cGroup);
+ var groupContent = '#buddy-list .' + groupHash;
+ var groupBuddies = groupContent + ' .group-buddies';
+
+ // Is this group blocked?
+ if((statusPrivacy('block', cGroup) == 'deny') && (privacy_state != 'allow'))
+ privacy_class = ' blocked';
+
+ // Group not yet displayed
+ if(!exists(groupContent)) {
+ // Define some things
+ var groupCont = '#buddy-list .content';
+ var groupToggle = groupCont + ' .' + groupHash + ' a.group';
+
+ // Create the HTML markup of the group
+ $(groupCont).prepend(
+ '<div class="' + groupHash + ' one-group" data-group="' + escape(cGroup) + '">' +
+ '<a href="#" class="group talk-images minus">' + cGroup.htmlEnc() + '</a>' +
+ '<div class="group-buddies"></div>' +
+ '</div>'
+ );
+
+ // Create the click event which will hide and show the content
+ $(groupToggle).click(function() {
+ var group = $(groupBuddies);
+ var group_toggle = $(groupContent + ' a.group');
+
+ // We must hide the buddies
+ if(group_toggle.hasClass('minus')) {
+ group.hide();
+ group_toggle.removeClass('minus').addClass('plus');
+
+ // Remove the group opened buddy-info
+ closeBubbles();
+ }
+
+ // We must show the buddies
+ else {
+ group_toggle.removeClass('plus').addClass('minus');
+ group.show();
+ }
+
+ return false;
+ });
+ }
+
+ // Initialize the HTML code
+ var name_code = '<p class="buddy-name">' + dName.htmlEnc() + '</p>';
+ var presence_code = '<p class="buddy-presence talk-images unavailable">' + _e("Unavailable") + '</p>';
+
+ var html = '<div class="hidden-buddy buddy ibubble ' + dXIDHash + gateway + privacy_class + '" data-xid="' + escape(dXID) + '">' +
+ '<div class="buddy-click">';
+
+ // Display avatar if not gateway
+ if(!is_gateway)
+ html += '<div class="avatar-container">' +
+ '<img class="avatar" src="' + './img/others/default-avatar.png' + '" alt="" />' +
+ '</div>';
+
+ html += '<div class="name">';
+
+ // Special gateway code
+ if(is_gateway)
+ html += presence_code +
+ name_code;
+
+ else
+ html += name_code +
+ presence_code;
+
+ html += '</div></div></div>';
+
+ // Create the DOM element for this buddy
+ $(groupBuddies).append(html);
+
+ // Apply the hover event
+ applyBuddyHover(dXID, dXIDHash, dName, dSubscription, dGroup, groupHash);
+ }
+ }
+
+ // Click event on this buddy
+ $('#buddy-list .' + dXIDHash + ' .buddy-click').click(function() {
+ return checkChatCreate(dXID, 'chat');
+ });
+
+ // We get the user presence if necessary
+ if(dMode == 'presence')
+ presenceFunnel(dXID, dXIDHash);
+
+ // If the buddy must be shown
+ if(BLIST_ALL)
+ $('#buddy-list .' + dXIDHash).show();
+ }
+
+ // We update our groups
+ if(!SEARCH_FILTERED)
+ updateGroups();
+ else
+ funnelFilterBuddySearch();
+}
+
+// Applies the buddy editing input events
+function applyBuddyInput(xid) {
+ // Initialize
+ var path = '#buddy-list .buddy[data-xid=' + escape(xid) + ']';
+ var rename = path + ' .bm-rename input';
+ var group = path + ' .bm-group input';
+ var manage_infos = path + ' .manage-infos';
+ var bm_choose = manage_infos + ' div.bm-choose';
+
+ // Keyup events
+ $(rename).keyup(function(e) {
+ if(e.keyCode == 13) {
+ // Send the item
+ sendRoster(xid, '', trim($(rename).val()), thisBuddyGroups(xid));
+
+ // Remove the buddy editor
+ closeBubbles();
+
+ return false;
+ }
+ });
+
+ $(group).keyup(function(e) {
+ if(e.keyCode == 13) {
+ // Empty input?
+ if(!trim($(this).val())) {
+ // Send the item
+ sendRoster(xid, '', trim($(rename).val()), thisBuddyGroups(xid));
+
+ // Remove the buddy editor
+ closeBubbles();
+
+ return false;
+ }
+
+ // Get the values
+ var this_value = trim($(this).val());
+ var escaped_value = escape(this_value);
+
+ // Check if the group yet exists
+ var group_exists = false;
+
+ $(bm_choose + ' label span').each(function() {
+ if($(this).text() == this_value)
+ group_exists = true;
+ });
+
+ // Create a new checked checkbox
+ if(!group_exists)
+ $(bm_choose).prepend('<label><input type="checkbox" data-group="' + escaped_value + '" /><span>' + this_value.htmlEnc() + '</span></label>');
+
+ // Check the checkbox
+ $(bm_choose + ' input[data-group=' + escaped_value + ']').attr('checked', true);
+
+ // Reset the value of this input
+ $(this).val('');
+
+ return false;
+ }
+ });
+
+ // Click events
+ $(manage_infos + ' p.bm-authorize a.to').click(function() {
+ closeBubbles();
+ sendSubscribe(xid, 'subscribed');
+
+ return false;
+ });
+
+ $(manage_infos + ' p.bm-authorize a.from').click(function() {
+ closeBubbles();
+ sendSubscribe(xid, 'subscribe');
+
+ return false;
+ });
+
+ $(manage_infos + ' p.bm-authorize a.unblock').click(function() {
+ closeBubbles();
+
+ // Update privacy settings
+ pushPrivacy('block', ['jid'], [xid], ['allow'], ['1'], [false], [true], [true], [true], '', 'roster');
+ $(path).removeClass('blocked');
+
+ // Enable the "block" list
+ changePrivacy('block', 'active');
+ changePrivacy('block', 'default');
+
+ // Send an available presence
+ sendPresence(xid, 'available', getUserShow(), getUserStatus());
+
+ return false;
+ });
+
+ $(manage_infos + ' p.bm-remove a.remove').click(function() {
+ closeBubbles();
+ sendRoster(xid, 'remove');
+
+ return false;
+ });
+
+ $(manage_infos + ' p.bm-remove a.prohibit').click(function() {
+ closeBubbles();
+ sendSubscribe(xid, 'unsubscribed');
+
+ return false;
+ });
+
+ $(manage_infos + ' p.bm-remove a.block').click(function() {
+ closeBubbles();
+
+ // Update privacy settings
+ pushPrivacy('block', ['jid'], [xid], ['deny'], ['1'], [false], [true], [true], [true], '', 'roster');
+ $(path).addClass('blocked');
+
+ // Enable the "block" list
+ changePrivacy('block', 'active');
+ changePrivacy('block', 'default');
+
+ // Send an unavailable presence
+ sendPresence(xid, 'unavailable');
+
+ // Remove the user presence
+ for(var i = 0; i < sessionStorage.length; i++) {
+ // Get the pointer values
+ var current = sessionStorage.key(i);
+
+ // If the pointer is on a stored presence
+ if((explodeThis('_', current, 0) == 'presence') && (bareXID(explodeThis('_', current, 1)) == xid))
+ sessionStorage.removeItem(current);
+ }
+
+ // Manage his new presence
+ presenceFunnel(xid, hex_md5(xid));
+
+ return false;
+ });
+
+ $(manage_infos + ' a.save').click(function() {
+ // Send the item
+ sendRoster(xid, '', trim($(rename).val()), thisBuddyGroups(xid));
+
+ // Remove the buddy editor
+ closeBubbles();
+
+ return false;
+ });
+}
+
+// Applies the buddy editing hover events
+function applyBuddyHover(xid, hash, nick, subscription, groups, group_hash) {
+ // Generate the values
+ var bPath = '#buddy-list .' + group_hash + ' .buddy[data-xid=' + escape(xid) + ']';
+ var iPath = bPath + ' .buddy-infos';
+
+ // Apply the hover event
+ $(bPath).hover(function() {
+ // Another bubble exist
+ if(exists('#buddy-list .buddy-infos'))
+ return false;
+
+ $(bPath).oneTime(200, function() {
+ // Another bubble exist
+ if(exists('#buddy-list .buddy-infos'))
+ return false;
+
+ // Add this bubble!
+ showBubble(iPath);
+
+ // Create the buddy infos DOM element
+ $(bPath).append(
+ '<div class="buddy-infos bubble removable">' +
+ '<div class="buddy-infos-subarrow talk-images"></div>' +
+ '<div class="buddy-infos-subitem">' +
+ '<div class="pep-infos">' +
+ '<p class="bi-status talk-images unavailable">' + _e("unknown") + '</p>' +
+ '<p class="bi-mood talk-images mood-four">' + _e("unknown") + '</p>' +
+ '<p class="bi-activity talk-images activity-exercising">' + _e("unknown") + '</p>' +
+ '<p class="bi-tune talk-images tune-note">' + _e("unknown") + '</p>' +
+ '<p class="bi-geoloc talk-images location-world">' + _e("unknown") + '</p>' +
+ '<p class="bi-view talk-images view-individual"><a href="#" class="profile">' + _e("Profile") + '</a> / <a href="#" class="channel">' + _e("Channel") + '</a> / <a href="#" class="commands">' + _e("Commands") + '</a></p>' +
+ '<p class="bi-edit talk-images edit-buddy"><a href="#">' + _e("Edit") + '</a></p>' +
+ '</div>' +
+ '</div>' +
+ '</div>'
+ );
+
+ // Sets the good position
+ buddyInfosPosition(xid, group_hash);
+
+ // Get the presence
+ presenceFunnel(xid, hash);
+
+ // Get the PEP infos
+ displayAllPEP(xid);
+
+ // Click events
+ $(bPath + ' .bi-view a').click(function() {
+ // Renitialize the buddy infos
+ closeBubbles();
+
+ // Profile
+ if($(this).is('.profile'))
+ openUserInfos(xid);
+
+ // Channel
+ else if($(this).is('.channel'))
+ fromInfosMicroblog(xid, hash);
+
+ // Command
+ else if($(this).is('.commands'))
+ retrieveAdHoc(xid);
+
+ return false;
+ });
+
+ $(bPath + ' .bi-edit a').click(function() {
+ buddyEdit(xid, nick, subscription, groups);
+
+ return false;
+ });
+ });
+ }, function() {
+ if(!exists(iPath + ' .manage-infos'))
+ closeBubbles();
+
+ $(bPath).stopTime();
+ });
+}
+
+// Sets the good buddy-infos position
+function buddyInfosPosition(xid, group_hash) {
+ // Paths
+ var group = '#buddy-list .' + group_hash;
+ var buddy = group + ' .buddy[data-xid=' + escape(xid) + ']';
+ var buddy_infos = buddy + ' .buddy-infos';
+
+ // Get the offset to define
+ var offset = 3;
+
+ if(isGateway(xid))
+ offset = -8;
+
+ // Process the position
+ var top = $(buddy).position().top + offset;
+ var left = $(buddy).width() - 10;
+
+ // Apply the top position
+ $(buddy_infos).css('top', top)
+ .css('left', left);
+}
+
+// Generates an array of the current groups of a buddy
+function thisBuddyGroups(xid) {
+ var path = '#buddy-list .buddy[data-xid=' + escape(xid) + '] ';
+ var array = new Array();
+
+ // Each checked checkboxes
+ $(path + 'div.bm-choose input[type=checkbox]').filter(':checked').each(function() {
+ array.push(unescape($(this).attr('data-group')));
+ });
+
+ // Entered input value (and not yet in the array)
+ var value = trim($(path + 'p.bm-group input').val());
+
+ if(value && !existArrayValue(array, value))
+ array.push(value);
+
+ return array;
+}
+
+// Adds a given contact to our roster
+function addThisContact(xid, name) {
+ logThis('Add this contact: ' + xid + ', as ' + name, 3);
+
+ // Cut the resource of this XID
+ xid = bareXID(xid);
+
+ // If the form is complete
+ if(xid) {
+ // We send the subscription
+ sendSubscribe(xid, 'subscribe');
+ sendRoster(xid, '', name);
+
+ // We hide the bubble
+ closeBubbles();
+ }
+}
+
+// Gets an array of all the groups in the roster
+function getAllGroups() {
+ var groups = new Array();
+
+ $('#buddy-list .one-group').each(function() {
+ var current = unescape($(this).attr('data-group'));
+
+ if((current != _e("Unclassified")) && (current != _e("Gateways")))
+ groups.push(current);
+ });
+
+ return groups.sort();
+}
+
+// Edits buddy informations
+function buddyEdit(xid, nick, subscription, groups) {
+ logThis('Buddy edit: ' + xid, 3);
+
+ // Initialize
+ var path = '#buddy-list .buddy[data-xid=' + escape(xid) + '] .';
+ var html = '<div class="manage-infos">';
+
+ // Get the privacy state
+ var privacy_state = statusPrivacy('block', xid);
+ var privacy_active = getDB('privacy-marker', 'available');
+
+ // Get the group privacy state
+ for(g in groups) {
+ if((statusPrivacy('block', groups[g]) == 'deny') && (privacy_state != 'allow'))
+ privacy_state = 'deny';
+ }
+
+ // The subscription with this buddy is not full
+ if((subscription != 'both') || ((privacy_state == 'deny') && privacy_active)) {
+ var authorize_links = '';
+ html += '<p class="bm-authorize talk-images">';
+
+ // Link to allow to see our status
+ if((subscription == 'to') || (subscription == 'none'))
+ authorize_links += '<a href="#" class="to">' + _e("Authorize") + '</a>';
+
+ // Link to ask to see his/her status
+ if((subscription == 'from') || (subscription == 'none')) {
+ if(authorize_links)
+ authorize_links += ' / ';
+
+ authorize_links += '<a href="#" class="from">' + _e("Ask for authorization") + '</a>';
+ }
+
+ // Link to unblock this buddy
+ if((privacy_state == 'deny') && privacy_active) {
+ if(authorize_links)
+ authorize_links += ' / ';
+
+ html += '<a href="#" class="unblock">' + _e("Unblock") + '</a>';
+ }
+
+ html += authorize_links + '</p>';
+ }
+
+ // Complete the HTML code
+ var remove_links = '';
+ html += '<p class="bm-remove talk-images">';
+ remove_links = '<a href="#" class="remove">' + _e("Remove") + '</a>';
+
+ // This buddy is allowed to see our presence, we can show a "prohibit" link
+ if((subscription == 'both') || (subscription == 'from'))
+ remove_links += ' / <a href="#" class="prohibit">' + _e("Prohibit") + '</a>';
+
+ // Complete the HTML code
+ if((privacy_state != 'deny') && privacy_active) {
+ if(remove_links)
+ remove_links += ' / ';
+
+ remove_links += '<a href="#" class="block">' + _e("Block") + '</a>';
+ }
+
+ // Complete the HTML code
+ html += remove_links +
+ '</p>' +
+ '<p class="bm-rename talk-images"><label>' + _e("Rename") + '</label> <input type="text" value="' + encodeQuotes(nick) + '" /></p>';
+
+ // Only show group tool if not a gateway
+ if(!isGateway(xid))
+ html += '<p class="bm-group talk-images"><label>' + _e("Groups") + '</label> <input type="text" /></p>' +
+ '<div class="bm-choose">' +
+ '<div></div>' +
+ '</div>';
+
+ // Close the DOM element
+ html += '<a href="#" class="save">' + _e("Save") + '</a>' +
+ '</div>';
+
+ // We update the DOM elements
+ $(path + 'pep-infos').replaceWith(html);
+
+ // Gets all the existing groups
+ var all_groups = getAllGroups();
+ var all_groups_dom = '';
+
+ for(a in all_groups) {
+ // Current group
+ var all_groups_current = all_groups[a];
+
+ // Is the current group checked?
+ var checked = '';
+
+ if(existArrayValue(groups, all_groups_current))
+ checked = ' checked="true"';
+
+ // Add the current group HTML
+ all_groups_dom += '<label><input type="checkbox" data-group="' + escape(all_groups_current) + '"' + checked + ' /><span>' + all_groups_current.htmlEnc() + '</span></label>';
+ }
+
+ // Prepend this in the DOM
+ var bm_choose = path + 'manage-infos div.bm-choose';
+
+ $(bm_choose).prepend(all_groups_dom);
+
+ // Apply the editing input events
+ applyBuddyInput(xid);
+}
+
+// Updates the roster items
+function sendRoster(xid, subscription, name, group) {
+ // We send the new buddy name
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ var iqQuery = iq.setQuery(NS_ROSTER);
+ var item = iqQuery.appendChild(iq.buildNode('item', {'xmlns': NS_ROSTER, 'jid': xid}));
+
+ // Any subscription?
+ if(subscription)
+ item.setAttribute('subscription', subscription);
+
+ // Any name?
+ if(name)
+ item.setAttribute('name', name);
+
+ // Any group?
+ if(group && group.length) {
+ for(i in group)
+ item.appendChild(iq.buildNode('group', {'xmlns': NS_ROSTER}, group[i]));
+ }
+
+ con.send(iq);
+
+ logThis('Roster item sent: ' + xid, 3);
+}
+
+// Adapts the roster height, depending of the window size
+function adaptRoster() {
+ // Process the new height
+ var new_height = $('#left-content').height() - $('#my-infos').height() - 97;
+
+ // New height too small
+ if(new_height < 211)
+ new_height = 211;
+
+ // Apply the new height
+ $('#buddy-list .content').css('height', new_height);
+}
+
+// Gets all the buddies in our roster
+function getAllBuddies() {
+ var buddies = new Array();
+
+ $('#buddy-list .buddy').each(function() {
+ var xid = unescape($(this).attr('data-xid'));
+
+ if(xid)
+ buddies.push(xid);
+ });
+
+ return buddies;
+}
+
+// Gets the user gateways
+function getGateways() {
+ // New array
+ var gateways = new Array();
+ var buddies = getAllBuddies();
+
+ // Get the gateways
+ for(c in buddies) {
+ if(isGateway(buddies[c]))
+ gateways.push(buddies[c]);
+ }
+
+ return gateways;
+}
+
+// Define a global var for buddy list all buddies displayed
+var BLIST_ALL = false;
+
+// Plugin launcher
+function launchRoster() {
+ // Filtering tool
+ var iFilter = $('#buddy-list .filter input');
+ var aFilter = $('#buddy-list .filter a');
+
+ iFilter.placeholder()
+
+ .blur(function() {
+ // Nothing is entered, put the placeholder instead
+ if(!trim($(this).val()))
+ aFilter.hide();
+ else
+ aFilter.show();
+ })
+
+ .keyup(function(e) {
+ funnelFilterBuddySearch(e.keyCode);
+ });
+
+ aFilter.click(function() {
+ // Reset the input
+ $(this).hide();
+ iFilter.val('');
+ iFilter.placeholder();
+
+ // Security: show all the groups, empty or not
+ $('#buddy-list .one-group').show();
+
+ // Reset the filtering tool
+ resetFilterBuddySearch();
+
+ return false;
+ });
+
+ // When the user click on the add button, show the contact adding tool
+ $('#buddy-list .foot .add').click(function() {
+ // Yet displayed?
+ if(exists('#buddy-conf-add'))
+ return closeBubbles();
+
+ // Add the bubble
+ showBubble('#buddy-conf-add');
+
+ // Append the content
+ $('#buddy-list .buddy-list-add').append(
+ '<div id="buddy-conf-add" class="buddy-conf-item bubble removable">' +
+ '<div class="buddy-conf-subarrow talk-images"></div>' +
+
+ '<div class="buddy-conf-subitem">' +
+ '<p class="buddy-conf-p">' + _e("Add a friend") + '</p>' +
+
+ '<label><span>' + _e("Address") + '</span><input type="text" class="buddy-conf-input add-contact-jid" required="" /></label>' +
+ '<label><span>' + _e("Name") + '</span><input type="text" class="buddy-conf-input add-contact-name" /></label>' +
+ '<label>' +
+ '<span>' + _e("Gateway") + '</span>' +
+ '<select class="buddy-conf-select add-contact-gateway">' +
+ '<option value="none" selected="">' + _e("None") + '</option>' +
+ '</select>' +
+ '</label>' +
+ '<span class="add-contact-name-get">' + _e("Getting the name...") + '</span>' +
+
+ '<p class="buddy-conf-text">' +
+ '<a href="#" class="buddy-conf-add-search">' + _e("Search a friend") + '</a>' +
+ '</p>' +
+ '</div>' +
+ '</div>'
+ );
+
+ // Add the gateways
+ var gateways = getGateways();
+
+ // Any gateway?
+ if(gateways.length) {
+ // Append the gateways
+ for(i in gateways)
+ $('.add-contact-gateway').append('<option value="' + escape(gateways[i]) + '">' + gateways[i].htmlEnc() + '</option>');
+
+ // Show the gateway selector
+ $('.add-contact-gateway').parent().show();
+ }
+
+ // No gateway?
+ else
+ $('.add-contact-gateway').parent().hide();
+
+ // Blur event on the add contact input
+ $('.add-contact-jid').blur(function() {
+ // Read the value
+ var value = trim($(this).val());
+
+ // Try to catch the buddy name
+ if(value && !trim($('.add-contact-name').val()) && ($('.add-contact-gateway').val() == 'none')) {
+ // User XID
+ var xid = generateXID(value, 'chat');
+
+ // Notice for the user
+ $('.add-contact-name-get').attr('data-for', escape(xid)).show();
+
+ // Request the user vCard
+ getAddUserName(xid);
+ }
+ });
+
+ // When a key is pressed...
+ $('#buddy-conf-add input, #buddy-conf-add select').keyup(function(e) {
+ // Enter : continue
+ if(e.keyCode == 13) {
+ // Get the values
+ var xid = trim($('.add-contact-jid').val());
+ var name = trim($('.add-contact-name').val());
+ var gateway = unescape($('.add-contact-gateway').val());
+
+ // Generate the XID to add
+ if((gateway != 'none') && xid)
+ xid = xid.replace(/@/g, '%') + '@' + gateway;
+ else
+ xid = generateXID(xid, 'chat');
+
+ // Submit the form
+ if(xid && (xid != getXID()))
+ addThisContact(xid, name);
+ else
+ $(document).oneTime(10, function() {
+ $('.add-contact-jid').addClass('please-complete').focus();
+ });
+
+ return false;
+ }
+
+ // Escape : quit
+ if(e.keyCode == 27)
+ closeBubbles();
+ });
+
+ // Click event on search link
+ $('.buddy-conf-add-search').click(function() {
+ closeBubbles();
+ return openDirectory();
+ });
+
+ // Focus on the input
+ $(document).oneTime(10, function() {
+ $('.add-contact-jid').focus();
+ });
+
+ return false;
+ });
+
+ // When the user click on the join button, show the chat joining tool
+ $('#buddy-list .foot .join').click(function() {
+ // Yet displayed?
+ if(exists('#buddy-conf-join'))
+ return closeBubbles();
+
+ // Add the bubble
+ showBubble('#buddy-conf-join');
+
+ // Append the content
+ $('#buddy-list .buddy-list-join').append(
+ '<div id="buddy-conf-join" class="buddy-conf-item bubble removable">' +
+ '<div class="buddy-conf-subarrow talk-images"></div>' +
+
+ '<div class="buddy-conf-subitem search">' +
+ '<p class="buddy-conf-p" style="margin-bottom: 0;">' + _e("Join a chat") + '</p>' +
+
+ '<input type="text" class="buddy-conf-input join-jid" required="" />' +
+ '<select class="buddy-conf-select buddy-conf-join-select join-type">' +
+ '<option value="chat" selected="">' + _e("Chat") + '</option>' +
+ '<option value="groupchat">' + _e("Groupchat") + '</option>' +
+ '</select>' +
+ '</div>' +
+ '</div>'
+ );
+
+ // Input vars
+ var destination = '#buddy-conf-join .search';
+ var dHovered = destination + ' ul li.hovered:first';
+
+ // When a key is pressed...
+ $('#buddy-conf-join input, #buddy-conf-join select').keyup(function(e) {
+ // Enter: continue
+ if(e.keyCode == 13) {
+ // Select something from the search
+ if(exists(dHovered))
+ addBuddySearch(destination, $(dHovered).attr('data-xid'));
+
+ // Join something
+ else {
+ var xid = trim($('.join-jid').val());
+ var type = $('.buddy-conf-join-select').val();
+
+ if(xid && type) {
+ // Generate a correct XID
+ xid = generateXID(xid, type);
+
+ // Not me
+ if(xid != getXID()) {
+ // Update some things
+ $('.join-jid').removeClass('please-complete');
+ closeBubbles();
+
+ // Create a new chat
+ checkChatCreate(xid, type);
+ }
+
+ else
+ $('.join-jid').addClass('please-complete');
+ }
+
+ else
+ $('.join-jid').addClass('please-complete');
+ }
+
+ return false;
+ }
+
+ // Escape: quit
+ else if(e.keyCode == 27)
+ closeBubbles();
+
+ // Buddy search?
+ else if($('.buddy-conf-join-select').val() == 'chat') {
+ // New buddy search
+ if((e.keyCode != 40) && (e.keyCode != 38))
+ createBuddySearch(destination);
+
+ // Navigating with keyboard in the results
+ arrowsBuddySearch(e, destination);
+ }
+ });
+
+ // Buddy search lost focus
+ $('#buddy-conf-join input').blur(function() {
+ if(!$(destination + ' ul').attr('mouse-hover'))
+ resetBuddySearch(destination);
+ });
+
+ // Re-focus on the text input
+ $('#buddy-conf-join select').change(function() {
+ $(document).oneTime(10, function() {
+ $('#buddy-conf-join input').focus();
+ });
+ });
+
+ // We focus on the input
+ $(document).oneTime(10, function() {
+ $('#buddy-conf-join .join-jid').focus();
+ });
+
+ return false;
+ });
+
+ // When the user click on the groupchat button, show the groupchat menu
+ $('#buddy-list .foot .groupchat').click(function() {
+ // Yet displayed?
+ if(exists('#buddy-conf-groupchat'))
+ return closeBubbles();
+
+ // Add the bubble
+ showBubble('#buddy-conf-groupchat');
+
+ // Append the content
+ $('#buddy-list .buddy-list-groupchat').append(
+ '<div id="buddy-conf-groupchat" class="buddy-conf-item bubble removable">' +
+ '<div class="buddy-conf-subarrow talk-images"></div>' +
+
+ '<div class="buddy-conf-subitem">' +
+ '<p class="buddy-conf-p">' + _e("Your groupchats") + '</p>' +
+
+ '<select name="groupchat-join" class="buddy-conf-select buddy-conf-groupchat-select"></select>' +
+
+ '<p class="buddy-conf-text">' +
+ '- <a href="#" class="buddy-conf-groupchat-edit">' + _e("Manage your favorite groupchats") + '</a>' +
+ '</p>' +
+ '</div>' +
+ '</div>'
+ );
+
+ // When the user wants to edit his groupchat favorites
+ $('.buddy-conf-groupchat-edit').click(function() {
+ openFavorites();
+ closeBubbles();
+
+ return false;
+ });
+
+ // Change event
+ $('.buddy-conf-groupchat-select').change(function() {
+ var groupchat = trim($(this).val());
+
+ if(groupchat != 'none') {
+ // We hide the bubble
+ closeBubbles();
+
+ // Create the chat
+ checkChatCreate(groupchat, 'groupchat');
+
+ // We reset the select value
+ $(this).val('none');
+ }
+ });
+
+ // Load the favorites
+ loadFavorites();
+
+ return false;
+ });
+
+ // When the user click on the more button, show the more menu
+ $('#buddy-list .foot .more').click(function() {
+ // Yet displayed?
+ if(exists('#buddy-conf-more'))
+ return closeBubbles();
+
+ // Add the bubble
+ showBubble('#buddy-conf-more');
+
+ // Append the content
+ $('#buddy-list .buddy-list-more').append(
+ '<div id="buddy-conf-more" class="buddy-conf-item bubble removable">' +
+ '<div class="buddy-conf-subarrow talk-images"></div>' +
+
+ '<div class="buddy-conf-subitem">' +
+ '<p class="buddy-conf-p">' + _e("More stuff") + '</p>' +
+
+ '<p class="buddy-conf-text">' +
+ '- <a href="#" class="buddy-conf-more-display-unavailable">' + _e("Show all friends") + '</a>' +
+ '<a href="#" class="buddy-conf-more-display-available">' + _e("Only show connected friends") + '</a>' +
+ '</p>' +
+
+ '<p class="buddy-conf-text archives-hidable">' +
+ '- <a href="#" class="buddy-conf-more-archives">' + _e("Message archives") + '</a>' +
+ '</p>' +
+
+ '<p class="buddy-conf-text privacy-hidable">' +
+ '- <a href="#" class="buddy-conf-more-privacy">' + _e("Privacy") + '</a>' +
+ '</p>' +
+
+ '<p class="buddy-conf-text">' +
+ '- <a href="#" class="buddy-conf-more-service-disco">' + _e("Service discovery") + '</a>' +
+ '</p>' +
+
+ '<p class="buddy-conf-text commands-hidable"">' +
+ '- <a href="#" class="buddy-conf-more-commands">' + _e("Commands") + '</a>' +
+ '</p>' +
+ '</div>' +
+ '</div>'
+ );
+
+ // Close bubble when link clicked
+ $('#buddy-conf-more a').click(function() {
+ closeBubbles();
+ });
+
+ // When the user wants to display all his buddies
+ $('.buddy-conf-more-display-unavailable').click(function() {
+ showAllBuddies('roster');
+
+ return false;
+ });
+
+ // When the user wants to display only online buddies
+ $('.buddy-conf-more-display-available').click(function() {
+ showOnlineBuddies('roster');
+
+ return false;
+ });
+
+ // When the user click on the archives link
+ $('.buddy-conf-more-archives').click(openArchives);
+
+ // When the user click on the privacy link
+ $('.buddy-conf-more-privacy').click(openPrivacy);
+
+ // When the user click on the service discovery link
+ $('.buddy-conf-more-service-disco').click(openDiscovery);
+
+ // When the user click on the command link
+ $('.buddy-conf-more-commands').click(function() {
+ serverAdHoc(con.domain);
+
+ return false;
+ });
+
+ // Manage the displayed links
+ if(BLIST_ALL) {
+ $('.buddy-conf-more-display-unavailable').hide();
+ $('.buddy-conf-more-display-available').show();
+ }
+
+ if(enabledArchives() || enabledArchives('auto') || enabledArchives('manual') || enabledArchives('manage'))
+ $('.buddy-conf-more-archives').parent().show();
+
+ if(enabledCommands())
+ $('.buddy-conf-more-commands').parent().show();
+
+ if(getDB('privacy-marker', 'available'))
+ $('.buddy-conf-more-privacy').parent().show();
+
+ return false;
+ });
+
+ // When the user scrolls the buddy list
+ $('#buddy-list .content').scroll(function() {
+ // Close the opened buddy infos bubble
+ closeBubbles();
+ });
+}
+
+// Window resize event handler
+$(window).resize(adaptRoster);
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the Roster Item Exchange JS script for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 23/06/11
+
+*/
+
+// Opens the welcome tools
+function openRosterX(data) {
+ // Popup HTML content
+ var html =
+ '<div class="top">' + _e("Suggested friends") + '</div>' +
+
+ '<div class="content">' +
+ '<div class="rosterx-head">' +
+ '<a href="#" class="uncheck">' + _e("Uncheck all") + '</a>' +
+ '<a href="#" class="check">' + _e("Check all") + '</a>' +
+ '</div>' +
+
+ '<div class="results"></div>' +
+ '</div>' +
+
+ '<div class="bottom">' +
+ '<a href="#" class="finish save">' + _e("Save") + '</a>' +
+ '<a href="#" class="finish cancel">' + _e("Cancel") + '</a>' +
+ '</div>';
+
+ // Create the popup
+ createPopup('rosterx', html);
+
+ // Associate the events
+ launchRosterX();
+
+ // Parse the data
+ parseRosterX(data);
+
+ logThis('Roster Item Exchange popup opened.');
+}
+
+// Closes the welcome tools
+function closeRosterX() {
+ // Destroy the popup
+ destroyPopup('rosterx');
+
+ return false;
+}
+
+// Parses a rosterx query
+function parseRosterX(data) {
+ // Main selector
+ var x = $(data).find('x[xmlns=' + NS_ROSTERX + ']:first');
+
+ // Parse data
+ x.find('item').each(function() {
+ // Generate group XML
+ var group = '';
+
+ $(this).find('group').each(function() {
+ group += '<group>' + $(this).text().htmlEnc() + '</group>';
+ });
+
+ if(group)
+ group = '<groups>' + group + '</groups>';
+
+ // Display it!
+ displayRosterX($(this).attr('jid'), $(this).attr('name'), group, $(this).attr('action'));
+ });
+
+ // Click to check/uncheck
+ $('#rosterx .oneresult').click(function(evt) {
+ // No need to apply when click on input
+ if($(evt.target).is('input[type=checkbox]'))
+ return;
+
+ // Input selector
+ var checkbox = $(this).find('input[type=checkbox]');
+
+ // Check or uncheck?
+ if(checkbox.filter(':checked').size())
+ checkbox.removeAttr('checked');
+ else
+ checkbox.attr('checked', true);
+ });
+}
+
+// Displays a rosterx item
+function displayRosterX(xid, nick, group, action) {
+ // End if no XID
+ if(!xid)
+ return false;
+
+ // Set up a default action if no one
+ if(!action || (action != 'modify') || (action != 'delete'))
+ action = 'add';
+
+ // Override "undefined" for nickname
+ if(!nick)
+ nick = '';
+
+ // Display it
+ $('#rosterx .results').append(
+ '<div class="oneresult">' +
+ '<input type="checkbox" checked="" data-name="' + encodeQuotes(nick) + '" data-xid="' + encodeQuotes(xid) + '" data-action="' + encodeQuotes(action) + '" data-group="' + encodeQuotes(group) + '" />' +
+ '<span class="name">' + nick.htmlEnc() + '</span>' +
+ '<span class="xid">' + xid.htmlEnc() + '</span>' +
+ '<span class="action ' + action + ' talk-images"></span>' +
+ '</div>'
+ );
+}
+
+// Saves the rosterx settings
+function saveRosterX() {
+ // Send the requests
+ $('#rosterx .results input[type=checkbox]').filter(':checked').each(function() {
+ // Read the attributes
+ var nick = $(this).attr('data-name');
+ var xid = $(this).attr('data-xid');
+ var action = $(this).attr('data-action');
+ var group = $(this).attr('data-group');
+
+ // Parse groups XML
+ if(group) {
+ var group_arr = []
+
+ $(group).find('group').each(function() {
+ group_arr.push($(this).text().revertHtmlEnc());
+ });
+ }
+
+ // Process the asked action
+ var roster_item = $('#buddy-list .' + hex_md5(xid));
+
+ switch(action) {
+ // Buddy add
+ case 'add':
+ if(!exists(roster_item)) {
+ sendSubscribe(xid, 'subscribe');
+ sendRoster(xid, '', nick, group_arr);
+ }
+
+ break;
+
+ // Buddy edit
+ case 'modify':
+ if(exists(roster_item))
+ sendRoster(xid, '', nick, group_arr);
+
+ break;
+
+ // Buddy delete
+ case 'delete':
+ if(exists(roster_item))
+ sendRoster(xid, 'remove');
+
+ break;
+ }
+ });
+
+ // Close the popup
+ closeRosterX();
+}
+
+// Plugin launcher
+function launchRosterX() {
+ // Click events
+ $('#rosterx .bottom .finish').click(function() {
+ if($(this).is('.save'))
+ return saveRosterX();
+ if($(this).is('.cancel'))
+ return closeRosterX();
+ });
+
+ $('#rosterx .rosterx-head a').click(function() {
+ if($(this).is('.check'))
+ $('#rosterx .results input[type=checkbox]').attr('checked', true);
+ else if($(this).is('.uncheck'))
+ $('#rosterx .results input[type=checkbox]').removeAttr('checked');
+
+ return false;
+ });
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the seach tools JS script for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 19/03/11
+
+*/
+
+// Searches in the user's buddy list
+function processBuddySearch(query) {
+ // No query submitted?
+ if(!query)
+ return;
+
+ // Wildcard (*) submitted
+ if(query == '*')
+ query = '';
+
+ // Replace forbidden characters in regex
+ query = escapeRegex(query);
+
+ // Create an empty array
+ var results = new Array();
+
+ // Search regex
+ var regex = new RegExp('((^)|( ))' + query, 'gi');
+
+ // Search in the roster
+ var buddies = getAllBuddies();
+
+ for(i in buddies) {
+ var xid = buddies[i];
+ var nick = getBuddyName(xid);
+
+ // Buddy match our search, and not yet in the array
+ if(nick.match(regex) && !existArrayValue(results, xid))
+ results.push(xid);
+ }
+
+ // Return the results array
+ return results;
+}
+
+// Resets the buddy search tool
+function resetBuddySearch(destination) {
+ $(destination + ' ul').remove();
+ $(destination + ' input').removeClass('suggested');
+}
+
+// Add the clicked XID to the input
+function addBuddySearch(destination, xid) {
+ // Remove the search tool
+ resetBuddySearch(destination);
+
+ // Define a selector
+ var input = $(destination + ' input');
+ var value = input.val();
+
+ // Get the old value (if there's another value)
+ var old = '';
+
+ if(value.match(/(^(.+)(,)(\s)?)(\w+)$/))
+ old = RegExp.$1;
+
+ // Add the XID to the "to" input and focus on it
+ $(document).oneTime(10, function() {
+ input.val(old + xid).focus();
+ });
+
+ return false;
+}
+
+// Creates the appropriate markup for the search results
+function createBuddySearch(destination) {
+ // Reset the search engine
+ resetBuddySearch(destination);
+
+ // Get the entered value
+ var value = $(destination + ' input').val();
+
+ // Separation with a comma?
+ if(value.match(/^(.+)((,)(\s)?)(\w+)$/))
+ value = RegExp.$5;
+
+ // Get the result array
+ var entered = processBuddySearch(value);
+
+ // Display each result (if any)
+ if(entered && entered.length) {
+ // Set a special class to the search input
+ $(destination + ' input').addClass('suggested');
+
+ // Append each found buddy in the container
+ var regex = new RegExp('((^)|( ))' + value, 'gi');
+
+ // Initialize the code generation
+ var code = '<ul>';
+
+ for(b in entered) {
+ // Get some values from the XID
+ var current = getBuddyName(entered[b]).htmlEnc();
+ current = current.replace(regex, '<b>$&</b>');
+
+ // Add the current element to the global code
+ code += '<li onclick="return addBuddySearch(\'' + encodeOnclick(destination) + '\', \'' + encodeOnclick(entered[b]) + '\');" data-xid="' + encodeQuotes(entered[b]) + '">' + current + '</li>';
+ }
+
+ // Finish the code generation
+ code += '</ul>';
+
+ // Creates the code in the DOM
+ $(destination).append(code);
+
+ // Put the hover on the first element
+ $(destination + ' ul li:first').addClass('hovered');
+
+ // Hover event, to not to remove this onblur and loose the click event
+ $(destination + ' ul li').hover(function() {
+ $(destination + ' ul li').removeClass('hovered');
+ $(this).addClass('hovered');
+
+ // Add a marker for the blur event
+ $(destination + ' ul').attr('mouse-hover', 'true');
+ }, function() {
+ $(this).removeClass('hovered');
+
+ // Remove the mouse over marker
+ $(destination + ' ul').removeAttr('mouse-hover');
+ });
+ }
+}
+
+// Handles the keyboard arrows press when searching
+function arrowsBuddySearch(e, destination) {
+ // Down arrow: 40
+ // Up arrown: 38
+
+ // Initialize
+ var code = e.keyCode;
+
+ // Not the key we want here
+ if((code != 40) && (code != 38))
+ return;
+
+ // Remove the eventual mouse hover marker
+ $(destination + ' ul').removeAttr('mouse-hover');
+
+ // Create the path & get its size
+ var path = destination + ' ul li';
+ var pSize = $(path).size();
+
+ // Define the i value
+ var i = 0;
+
+ // Switching yet launched
+ if(exists(path + '.hovered')) {
+ var index = $(path).attr('data-hovered');
+
+ if(index)
+ i = parseInt(index);
+
+ if(code == 40)
+ i++;
+ else
+ i--;
+ }
+
+ else if(code == 38)
+ i = pSize - 1;
+
+ // We must not override the maximum i limit
+ if(i >= pSize)
+ i = 0;
+
+ // We must not have negative i
+ else if(i < 0)
+ i = pSize - 1;
+
+ // Modify the list
+ $(path + '.hovered').removeClass('hovered');
+ $(path).eq(i).addClass('hovered');
+
+ // Store the i index
+ $(path).attr('data-hovered', i);
+
+ return false;
+}
+
+// Filters the buddies in the roster
+var SEARCH_FILTERED = false;
+
+function goFilterBuddySearch(vFilter) {
+ // Put a marker
+ SEARCH_FILTERED = true;
+
+ // Show the buddies that match the search string
+ var rFilter = processBuddySearch(vFilter);
+
+ // Hide all the buddies
+ $('#buddy-list .buddy').hide();
+
+ // Only show the buddies which match the search
+ for(i in rFilter) {
+ // Choose the correct selector for this search
+ if(!BLIST_ALL)
+ $('#buddy-list .buddy[data-xid=' + escape(rFilter[i]) + ']:not(.hidden-buddy)').show();
+ else
+ $('#buddy-list .buddy[data-xid=' + escape(rFilter[i]) + ']').show();
+ }
+}
+
+// Resets the buddy filtering in the roster
+function resetFilterBuddySearch() {
+ // Remove the marker
+ SEARCH_FILTERED = false;
+
+ // Show all the buddies
+ $('#buddy-list .buddy').show();
+
+ // Only show available buddies
+ if(!BLIST_ALL)
+ $('#buddy-list .buddy.hidden-buddy').hide();
+
+ // Update the groups
+ updateGroups();
+}
+
+// Funnels the buddy filtering
+function funnelFilterBuddySearch(keycode) {
+ // Get the input value
+ var input = $('#buddy-list .filter input');
+ var cancel = $('#buddy-list .filter a');
+ var value = input.val();
+
+ // Security: reset all the groups, empty or not, deployed or not
+ $('#buddy-list .one-group, #buddy-list .group-buddies').show();
+ $('#buddy-list .group span').text('-');
+
+ // Nothing is entered, or escape pressed
+ if(!value || (keycode == 27)) {
+ if(keycode == 27)
+ input.val('');
+
+ resetFilterBuddySearch();
+ cancel.hide();
+ }
+
+ // Process the filtering
+ else {
+ cancel.show();
+ goFilterBuddySearch(value);
+ }
+
+ // Update the groups
+ updateGroups();
+}
+
+// Searches for the nearest element (with a lower stamp than the current one)
+function sortElementByStamp(stamp, element) {
+ var array = new Array();
+ var i = 0;
+ var nearest = 0;
+
+ // Add the stamp values to the array
+ $(element).each(function() {
+ var current_stamp = parseInt($(this).attr('data-stamp'));
+
+ // Push it!
+ array.push(current_stamp);
+ });
+
+ // Sort the array
+ array.sort();
+
+ // Get the nearest stamp value
+ while(stamp > array[i]) {
+ nearest = array[i];
+
+ i++;
+ }
+
+ return nearest;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the smileys JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 21/03/11
+
+*/
+
+// Generates the correct HTML code for an emoticon insertion tool
+function emoteLink(smiley, image, hash) {
+ return '<a href="#" class="emoticon emoticon-' + image + ' smileys-images" data-smiley="' + smiley + '"></a>';
+}
+
+// Emoticon links arrays
+function smileyLinks(hash) {
+ var links = '';
+
+ var sArray = new Array(
+ ':-D',
+ ']:->',
+ '8-)',
+ ':-P',
+ ':-)',
+ ';-)',
+ ':-$',
+ ':-|',
+ ':-/',
+ '=-O',
+ ':-(',
+ ':\'-(',
+ ':-@',
+ ':-!',
+ '({)',
+ '(})',
+ ':3',
+ '(@)',
+ ':-[',
+ ':-{}',
+ '<3',
+ '</3',
+ '@}->--',
+ '(W)',
+ '(Y)',
+ '(N)',
+ '(I)',
+ '(C)',
+ '(D)',
+ '(B)',
+ '(Z)',
+ '(X)',
+ '(P)',
+ '(T)',
+ '(8)',
+ '(%)',
+ '(E)',
+ '(R)',
+ '(*)',
+ '(S)'
+ );
+
+ var cArray = new Array(
+ 'biggrin',
+ 'devil',
+ 'coolglasses',
+ 'tongue',
+ 'smile',
+ 'wink',
+ 'blush',
+ 'stare',
+ 'frowning',
+ 'oh',
+ 'unhappy',
+ 'cry',
+ 'angry',
+ 'puke',
+ 'hugright',
+ 'hugleft',
+ 'lion',
+ 'pussy',
+ 'bat',
+ 'kiss',
+ 'heart',
+ 'brheart',
+ 'flower',
+ 'brflower',
+ 'thumbup',
+ 'thumbdown',
+ 'lamp',
+ 'coffee',
+ 'drink',
+ 'beer',
+ 'boy',
+ 'girl',
+ 'photo',
+ 'phone',
+ 'music',
+ 'cuffs',
+ 'mail',
+ 'rainbow',
+ 'star',
+ 'moon'
+ );
+
+ for(i in sArray)
+ links += emoteLink(sArray[i], cArray[i], hash);
+
+ return links;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the storage JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 26/08/11
+
+*/
+
+// Gets the storage items of the user
+function getStorage(type) {
+ /* REF: http://xmpp.org/extensions/xep-0049.html */
+
+ var iq = new JSJaCIQ();
+ iq.setType('get');
+
+ var iqQuery = iq.setQuery(NS_PRIVATE);
+ iqQuery.appendChild(iq.buildNode('storage', {'xmlns': type}));
+
+ con.send(iq, handleStorage);
+}
+
+// Handles the storage items
+function handleStorage(iq) {
+ var handleXML = iq.getQuery();
+ var handleFrom = fullXID(getStanzaFrom(iq));
+
+ // Define some vars
+ var options = $(handleXML).find('storage[xmlns=' + NS_OPTIONS + ']');
+ var inbox = $(handleXML).find('storage[xmlns=' + NS_INBOX + ']');
+ var bookmarks = $(handleXML).find('storage[xmlns=' + NS_BOOKMARKS + ']');
+ var rosternotes = $(handleXML).find('storage[xmlns=' + NS_ROSTERNOTES + ']');
+
+ // No options and node not yet configured
+ if(options.size() && !options.find('option').size() && (iq.getType() != 'error'))
+ openWelcome();
+
+ // Parse the options xml
+ options.find('option').each(function() {
+ // We retrieve the informations
+ var type = $(this).attr('type');
+ var value = $(this).text();
+
+ // We display the storage
+ setDB('options', type, value);
+
+ // If this is the buddy list show status
+ if((type == 'roster-showall') && (value == '1'))
+ showAllBuddies('storage');
+ });
+
+ // Parse the inbox xml
+ inbox.find('message').each(function() {
+ storeInboxMessage(
+ $(this).attr('from'),
+ $(this).attr('subject'),
+ $(this).text(),
+ $(this).attr('status'),
+ $(this).attr('id'),
+ $(this).attr('date'),
+ [
+ $(this).attr('file_title'),
+ $(this).attr('file_href'),
+ $(this).attr('file_type'),
+ $(this).attr('file_length')
+ ]
+ );
+ });
+
+ // Parse the bookmarks xml
+ bookmarks.find('conference').each(function() {
+ // We retrieve the informations
+ var xid = $(this).attr('jid');
+ var name = $(this).attr('name');
+ var autojoin = $(this).attr('autojoin');
+ var password = $(this).find('password').text();
+ var nick = $(this).find('nick').text();
+
+ // We display the storage
+ displayFavorites(xid, name, nick, autojoin, password);
+
+ // Join the chat if autojoin is enabled
+ if(autojoin == '1')
+ checkChatCreate(xid, 'groupchat', nick, password, name);
+ });
+
+ // Parse the roster notes xml
+ rosternotes.find('note').each(function() {
+ setDB('rosternotes', $(this).attr('jid'), $(this).text());
+ });
+
+ // Options received
+ if(options.size()) {
+ logThis('Options received.');
+
+ // Now, get the inbox
+ getStorage(NS_INBOX);
+
+ // Geolocate the user
+ geolocate();
+
+ $('.options-hidable').show();
+ }
+
+ // Inbox received
+ else if(inbox.size()) {
+ logThis('Inbox received.');
+
+ // Send the first presence!
+ firstPresence(getDB('checksum', 1));
+
+ // Check we have new messages (play a sound if any unread messages)
+ if(checkInboxMessages())
+ soundPlay(2);
+
+ $('.inbox-hidable').show();
+ }
+
+ // Bookmarks received
+ else if(bookmarks.size()) {
+ // Join the groupchats the admin defined (if any)
+ joinConfGroupchats();
+
+ logThis('Bookmarks received.');
+ }
+
+ // Roster notes received (for logger)
+ else if(rosternotes.size())
+ logThis('Roster notes received.');
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the talkpage JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 06/05/11
+
+*/
+
+// Creates the talkpage events
+function eventsTalkPage() {
+ // Launch all associated plugins
+ launchMicroblog();
+ launchRoster();
+ launchPresence();
+ launchPEP();
+ launchNotifications();
+ launchMusic();
+}
+
+// Creates the talkpage code
+function createTalkPage() {
+ // Talkpage exists?
+ if(exists('#talk'))
+ return false;
+
+ // Anonymous detector
+ var anonymous = isAnonymous();
+
+ // Generate the HTML code
+ var html =
+ '<div id="talk" class="removable">' +
+ '<div id="top-content">' +
+ '<div class="tools tools-logo talk-images"></div>' +
+
+ '<div class="tools tools-all">';
+
+ if(!anonymous) html +=
+ '<a href="#" onclick="return openInbox();" class="inbox-hidable">' + _e("Messages") + '</a>' +
+ '<a href="#" onclick="return openVCard();">' + _e("Profile") + '</a>' +
+ '<a href="#" onclick="return optionsOpen();" class="options-hidable">' + _e("Options") + '</a>' +
+ '<a href="#" onclick="return normalQuit();">' + _e("Disconnect") + '</a>';
+
+ else html +=
+ '<a href="./">' + _e("Disconnect") + '</a>';
+
+ html +=
+ '</div>';
+
+ if(!anonymous && document.createElement('audio').canPlayType) html +=
+ '<div class="tools-all ibubble">' +
+ '<div class="tools music talk-images" onclick="return openMusic();"></div>' +
+
+ '<div class="music-content tools-content bubble hidable">' +
+ '<div class="tools-content-subarrow talk-images"></div>' +
+
+ '<div class="tools-content-subitem">' +
+ '<div class="player">' +
+ '<a href="#" class="stop talk-images" onclick="return actionMusic(\'stop\');"></a>' +
+ '</div>' +
+
+ '<div class="list">' +
+ '<p class="no-results">' + _e("No result!") + '</p>' +
+ '</div>' +
+
+ '<div class="search">' +
+ '<input type="text" />' +
+ '</div>' +
+ '</div>' +
+ '</div>' +
+ '</div>';
+
+ if(!anonymous) html +=
+ '<div class="tools-all ibubble">' +
+ '<div class="tools notifications talk-images" onclick="return showBubble(\'.notifications-content\');"></div>' +
+
+ '<div class="notifications-content tools-content bubble hidable">' +
+ '<div class="tools-content-subarrow talk-images"></div>' +
+
+ '<div class="tools-content-subitem">' +
+ '<a class="empty" href="#" onclick="return clearNotifications();">' + _e("Empty") + '</a>' +
+ '<p class="nothing">' + _e("No notifications.") + '</p>' +
+ '</div>' +
+ '</div>' +
+ '</div>';
+
+ html +=
+ '</div>' +
+
+ '<div id="main-content">' +
+ '<div id="left-content">';
+ if(!anonymous) html +=
+ '<div id="buddy-list">' +
+ '<div class="content"></div>' +
+
+ '<div class="filter">' +
+ '<input type="text" placeholder="' + _e("Filter") + '" />' +
+ '<a href="#">x</a>' +
+ '</div>' +
+
+ '<div class="foot ibubble">' +
+ '<div class="buddy-list-add buddy-list-icon">' +
+ '<a href="#" class="add talk-images" title="' + _e("Add a friend") + '"></a>' +
+ '</div>' +
+
+ '<div class="buddy-list-join buddy-list-icon">' +
+ '<a href="#" class="join talk-images" title="' + _e("Join a chat") + '"></a>' +
+ '</div>' +
+
+ '<div class="buddy-list-groupchat buddy-list-icon">' +
+ '<a href="#" class="groupchat talk-images" title="' + _e("Your groupchats") + '"></a>' +
+ '</div>' +
+
+ '<div class="buddy-list-more buddy-list-icon">' +
+ '<a href="#" class="more talk-images" title="' + _e("More stuff") + '"></a>' +
+ '</div>' +
+
+ '<div style="clear: both;"></div>' +
+ '</div>' +
+ '</div>';
+
+ html +=
+ '<div id="my-infos">' +
+ '<div class="content">' +
+ '<div class="element f-presence ibubble">' +
+ '<a href="#" class="icon picker disabled" data-value="available">' +
+ '<span class="talk-images"></span>' +
+ '</a>' +
+
+ '<input id="presence-status" type="text" placeholder="' + _e("Status") + '" disabled="" />' +
+ '</div>';
+
+ if(!anonymous) html +=
+ '<div class="element f-mood pep-hidable ibubble">' +
+ '<a href="#" class="icon picker" data-value="happy">' +
+ '<span class="talk-images"></span>' +
+ '</a>' +
+
+ '<input id="mood-text" type="text" placeholder="' + _e("Mood") + '" />' +
+ '</div>' +
+
+ '<div class="element f-activity pep-hidable ibubble">' +
+ '<a href="#" class="icon picker" data-value="exercising">' +
+ '<span class="talk-images activity-exercising"></span>' +
+ '</a>' +
+
+ '<input id="activity-text" type="text" placeholder="' + _e("Activity") + '" />' +
+ '</div>';
+
+ html +=
+ '</div>' +
+ '</div>' +
+ '</div>' +
+
+ '<div id="right-content">' +
+ '<div id="page-switch">' +
+ '<div class="chans">';
+ if(!anonymous) html +=
+ '<div class="channel switcher activechan" onclick="return switchChan(\'channel\');">' +
+ '<div class="icon talk-images"></div>' +
+
+ '<div class="name">' + _e("Channel") + '</div>' +
+ '</div>';
+
+ html +=
+ '</div>' +
+
+ '<div class="more ibubble">' +
+ '<div class="more-button talk-images" onclick="return loadChatSwitch();" title="' + _e("All tabs") + '"></div>' +
+ '</div>' +
+ '</div>' +
+
+ '<div id="page-engine">';
+ if(!anonymous) html +=
+ '<div id="channel" class="page-engine-chan" style="display: block;">' +
+ '<div class="top mixed ' + hex_md5(getXID()) + '">' +
+ '<div class="avatar-container">' +
+ '<img class="avatar" src="' + './img/others/default-avatar.png' + '" alt="" />' +
+ '</div>' +
+
+ '<div class="update">' +
+ '<p>' + _e("What\'s up with you?") + '</p>' +
+
+ '<div class="microblog-body">' +
+ '<input class="focusable" type="text" name="microblog_body" placeholder="' + _e("Type something you want to share with your friends...") + '" disabled="" />' +
+ '</div>' +
+
+ '<div class="one-microblog-icon ibubble">' +
+ '<a href="#" onclick="return showBubble(\'#attach\');" title="' + _e("Attach a file") + '" class="postit attach talk-images"></a>' +
+
+ '<form id="attach" class="bubble hidable" action="./php/file-share.php" method="post" enctype="multipart/form-data">' +
+ '<div class="attach-subarrow talk-images"></div>' +
+
+ '<div class="attach-subitem">' +
+ '<p class="attach-p">' + _e("Attach a file") + '</p>' +
+ generateFileShare() +
+ '</div>' +
+ '</form>' +
+ '</div>' +
+ '</div>' +
+ '</div>' +
+
+ '<div class="content mixed"></div>' +
+
+ '<div class="footer">' +
+ '<div class="sync talk-images">' + _e("You are synchronized with your network.") + '</div>' +
+
+ '<div class="unsync talk-images">' + _e("Cannot send anything: you can only receive notices!") + '</div>' +
+
+ '<div class="fetch wait-small">' + _e("Fetching the social channel...") + '</div>' +
+ '</div>' +
+ '</div>';
+
+ html +=
+ '</div>' +
+ '</div>' +
+ '</div>' +
+ '</div>';
+
+ // Create the HTML code
+ $('body').prepend(html);
+
+ // Adapt the buddy-list size
+ adaptRoster();
+
+ // Create JS events
+ eventsTalkPage();
+
+ // Start the auto idle functions
+ liveIdle();
+
+ return true;
+}
+
+// Destroys the talkpage code
+function destroyTalkPage() {
+ // Reset our database
+ resetDB();
+
+ // Reset some vars
+ STANZA_ID = 1;
+ BLIST_ALL = false;
+ FIRST_PRESENCE_SENT = false;
+ SEARCH_FILTERED = false;
+ AVATAR_PENDING = [];
+
+ // Kill all timers, exept the board ones
+ $('*:not(#board .one-board)').stopTime();
+
+ // Kill the auto idle functions
+ dieIdle();
+
+ // We renitalise the html markup as its initiale look
+ $('.removable').remove();
+ pageTitle('home');
+
+ // Finally we show the homepage
+ $('#home').show();
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the tooltip JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 27/08/11
+
+*/
+
+// Creates a tooltip code
+function createTooltip(xid, hash, type) {
+ // Path to the element
+ var path = '#' + hash;
+ var path_tooltip = path + ' .chat-tools-' + type;
+ var path_bubble = path_tooltip + ' .bubble-' + type;
+
+ // Yet exists?
+ if(exists(path_bubble))
+ return false;
+
+ // Generates special tooltip HTML code
+ var title = '';
+ var content = '';
+
+ switch(type) {
+ // Smileys
+ case 'smileys':
+ title = _e("Smiley insertion");
+ content = smileyLinks(hash);
+
+ break;
+
+ // Style
+ case 'style':
+ title = _e("Change style");
+ content =
+ '<label class="bold"><input type="checkbox" class="bold" />' + _e("Text in bold") + '</label>' +
+ '<label class="italic"><input type="checkbox" class="italic" />' + _e("Text in italic") + '</label>' +
+ '<label class="underline"><input type="checkbox" class="underline" />' + _e("Underlined text") + '</label>' +
+ '<a href="#" class="color" style="background-color: #b10808; clear: both;" data-color="b10808"></a>' +
+ '<a href="#" class="color" style="background-color: #e5860c;" data-color="e5860c"></a>' +
+ '<a href="#" class="color" style="background-color: #f0f30e;" data-color="f0f30e"></a>' +
+ '<a href="#" class="color" style="background-color: #009a04;" data-color="009a04"></a>' +
+ '<a href="#" class="color" style="background-color: #0ba9a0;" data-color="0ba9a0"></a>' +
+ '<a href="#" class="color" style="background-color: #04228f;" data-color="04228f"></a>' +
+ '<a href="#" class="color" style="background-color: #9d0ab7;" data-color="9d0ab7"></a>' +
+ '<a href="#" class="color" style="background-color: #8a8a8a;" data-color="8a8a8a"></a>';
+
+ break;
+
+ // File send
+ case 'file':
+ title = _e("Send a file");
+ content = '<p style="margin-bottom: 8px;">' + _e("Once uploaded, your friend will be prompted to download the file you sent.") + '</p>';
+ content += '<form id="oob-upload" action="./php/send.php" method="post" enctype="multipart/form-data">' + generateFileShare() + '</form>';
+
+ break;
+
+ // Chat log
+ case 'save':
+ title = _e("Save chat");
+ content = '<p style="margin-bottom: 8px;">' + _e("Click on the following link to get the chat log, and wait. Then click again to get the file.") + '</p>';
+
+ // Possible to generate any log?
+ if($(path + ' .one-line').size())
+ content += '<a href="#" class="tooltip-actionlog">' + _e("Generate file!") + '</a>';
+ else
+ content += '<span class="tooltip-nolog">' + _e("This chat is empty!") + '</span>';
+
+ break;
+ }
+
+ // Generates general tooltip HTML code
+ var html =
+ '<div class="tooltip bubble-' + type + '">' +
+ '<div class="tooltip-subitem">' +
+ '<p class="tooltip-top">' + title + '</p>' +
+ content +
+ '</div>' +
+
+ '<div class="tooltip-subarrow talk-images"></div>' +
+ '</div>';
+
+ // Append the HTML code
+ $(path_tooltip).append(html);
+
+ // Special events
+ switch(type) {
+ // Smileys
+ case 'smileys':
+ // Apply click event on smiley links
+ $(path_tooltip + ' a.emoticon').click(function() {
+ return insertSmiley($(this).attr('data-smiley'), hash);
+ });
+
+ break;
+
+ // Style
+ case 'style':
+ // Paths to items
+ var message_area = path + ' .message-area';
+ var bubble_style = path_tooltip + ' .bubble-style ';
+ var style = bubble_style + 'input:checkbox';
+ var colors = bubble_style + 'a.color';
+
+ // Click event on color picker
+ $(colors).click(function() {
+ // The clicked color is yet selected
+ if($(this).hasClass('selected')) {
+ $(message_area).removeAttr('data-color');
+ $(this).removeClass('selected');
+ }
+
+ else {
+ $(message_area).attr('data-color', $(this).attr('data-color'));
+ $(colors).removeClass('selected');
+ $(this).addClass('selected');
+ }
+
+ return false;
+ });
+
+ // Change event on text style checkboxes
+ $(style).change(function() {
+ // Get current type
+ var style_data = 'data-' + $(this).attr('class');
+
+ // Checked checkbox?
+ if($(this).filter(':checked').size())
+ $(message_area).attr(style_data, true);
+ else
+ $(message_area).removeAttr(style_data);
+ });
+
+ // Update the textarea style when it is changed
+ $(style + ', ' + colors).click(function() {
+ var style = generateStyle(hash);
+
+ // Any style to apply?
+ if(style)
+ $(message_area).attr('style', style);
+ else
+ $(message_area).removeAttr('style');
+
+ // Focus again on the message textarea
+ $(document).oneTime(10, function() {
+ $(message_area).focus();
+ });
+ });
+
+ // Load current style
+ loadStyleSelector(hash);
+
+ break;
+
+ // File send
+ case 'file':
+ // File upload vars
+ var oob_upload_options = {
+ dataType: 'xml',
+ beforeSubmit: waitUploadOOB,
+ success: handleUploadOOB
+ };
+
+ // Upload form submit event
+ $(path_tooltip + ' #oob-upload').submit(function() {
+ if($(path_tooltip + ' #oob-upload input[type=file]').val())
+ $(this).ajaxSubmit(oob_upload_options);
+
+ return false;
+ });
+
+ // Upload input change event
+ $(path_tooltip + ' #oob-upload input[type=file]').change(function() {
+ if($(this).val())
+ $(path_tooltip + ' #oob-upload').ajaxSubmit(oob_upload_options);
+
+ return false;
+ });
+
+ // Input click event
+ $(path_tooltip + ' #oob-upload input[type=file], ' + path_tooltip + ' #oob-upload input[type=submit]').click(function() {
+ if(exists(path_tooltip + ' #oob-upload input[type=reset]'))
+ return;
+
+ // Lock the bubble
+ $(path_bubble).addClass('locked');
+
+ // Add a cancel button
+ $(this).after('<input type="reset" value="' + _e("Cancel") + '" />');
+
+ // Cancel button click event
+ $(path_tooltip + ' #oob-upload input[type=reset]').click(function() {
+ // Remove the bubble
+ $(path_bubble).removeClass('locked');
+ destroyTooltip(hash, 'file');
+ });
+ });
+
+ break;
+
+ // Chat log
+ case 'save':
+ // Chat log generation click event
+ $(path_tooltip + ' .tooltip-actionlog').click(function() {
+ // Replace it with a waiting notice
+ $(this).replaceWith('<span class="tooltip-waitlog">' + _e("Please wait...") + '</span>');
+
+ generateChatLog(xid, hash);
+
+ return false;
+ });
+
+ break;
+ }
+
+ return true;
+}
+
+// Destroys a tooltip code
+function destroyTooltip(hash, type) {
+ $('#' + hash + ' .chat-tools-content:not(.mini) .bubble-' + type + ':not(.locked)').remove();
+}
+
+// Applies the page-engine tooltips hover event
+function hoverTooltip(xid, hash, type) {
+ $('#' + hash + ' .chat-tools-' + type).hover(function() {
+ createTooltip(xid, hash, type);
+ }, function() {
+ destroyTooltip(hash, type)
+ });
+}
+
+// Applies the hoverTooltip function to the needed things
+function tooltipIcons(xid, hash) {
+ // Hover events
+ hoverTooltip(xid, hash, 'smileys');
+ hoverTooltip(xid, hash, 'style');
+ hoverTooltip(xid, hash, 'file');
+ hoverTooltip(xid, hash, 'save');
+
+ // Click events
+ $('#' + hash + ' a.chat-tools-content, #' + hash + ' .chat-tools-content a').click(function() {
+ return false;
+ });
+}
+
+// Loads the style selector options
+function loadStyleSelector(hash) {
+ // Define the vars
+ var path = '#' + hash;
+ var message_area = $(path + ' .message-area');
+ var bubble_style = path + ' .bubble-style';
+
+ // Apply the options to the style selector
+ $(bubble_style + ' input[type=checkbox]').each(function() {
+ // Current input enabled?
+ if(message_area.attr('data-' + $(this).attr('class')))
+ $(this).attr('checked', true);
+ });
+
+ // Apply message color
+ $(bubble_style + ' a.color[data-color=' + message_area.attr('data-color') + ']').addClass('selected');
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the user-infos JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 27/03/11
+
+*/
+
+// Opens the user-infos popup
+function openUserInfos(xid) {
+ // Can show shortcuts?
+ var shortcuts = '';
+
+ if(xid != getXID()) {
+ shortcuts = '<div class="shortcuts">' +
+ '<a href="#" class="message talk-images" title="' + _e("Send him/her a message") + '" onclick="closeUserInfos(); return composeInboxMessage(\'' + encodeOnclick(xid) + '\');"></a>' +
+ '<a href="#" class="chat talk-images" title="' + _e("Start a chat with him/her") + '" onclick="closeUserInfos(); return checkChatCreate(\'' + encodeOnclick(xid) + '\', \'chat\');"></a>' +
+ '<a href="#" class="command talk-images" title="' + _e("Command") + '" onclick="closeUserInfos(); return retrieveAdHoc(\'' + encodeOnclick(xid) + '\');"></a>' +
+ '</div>';
+ }
+
+ // Popup HTML content
+ var html =
+ '<div class="top">' + _e("User profile") + '</div>' +
+
+ '<div class="tab">' +
+ '<a href="#" class="tab-active" data-key="1">' + _e("General") + '</a>' +
+ '<a href="#" data-key="2">' + _e("Advanced") + '</a>' +
+ '<a href="#" data-key="3">' + _e("Comments") + '</a>' +
+ '</div>' +
+
+ '<div class="content">' +
+ '<div class="lap-active one-lap info1">' +
+ '<div class="main-infos">' +
+ '<div class="avatar-container">' +
+ '<img class="avatar" src="' + './img/others/default-avatar.png' + '" alt="" />' +
+ '</div>' +
+
+ '<h1 id="BUDDY-FN" class="reset-info">' + _e("unknown") + '</h1>' +
+ '<h2 class="buddy-xid" class="reset-info">' + _e("unknown") + '</h2>' +
+ '<h3 class="buddy-last" class="reset-info">' + _e("unknown") + '</h3>' +
+
+ shortcuts +
+ '</div>' +
+
+ '<div class="block-infos">' +
+ '<div class="one-line"><b>' + _e("Date of birth") + '</b><span id="BUDDY-BDAY" class="reset-info">' + _e("unknown") + '</span></div>' +
+
+ '<div class="one-line"><b>' + _e("E-mail") + '</b><span id="BUDDY-EMAIL-USERID" class="reset-info">' + _e("unknown") + '</span></div>' +
+
+ '<div class="one-line"><b>' + _e("Phone") + '</b><span id="BUDDY-TEL-NUMBER" class="reset-info">' + _e("unknown") + '</span></div>' +
+
+ '<div class="one-line"><b>' + _e("Website") + '</b><span id="BUDDY-URL" class="reset-info">' + _e("unknown") + '</span></div>' +
+ '</div>' +
+
+ '<div class="block-infos">' +
+ '<div class="one-line"><b>' + _e("Client") + '</b><span id="BUDDY-CLIENT" class="reset-info">' + _e("unknown") + '</span></div>' +
+
+ '<div class="one-line"><b>' + _e("System") + '</b><span id="BUDDY-SYSTEM" class="reset-info">' + _e("unknown") + '</span></div>' +
+
+ '<div class="one-line"><b>' + _e("Local time") + '</b><span id="BUDDY-TIME" class="reset-info">' + _e("unknown") + '</span></div>' +
+ '</div>' +
+ '</div>' +
+
+ '<div class="one-lap info2">' +
+ '<div class="block-infos">' +
+ '<div class="one-line"><b>' + _e("Street") + '</b><span id="BUDDY-ADR-STREET" class="reset-info">' + _e("unknown") + '</span></div>' +
+
+ '<div class="one-line"><b>' + _e("City") + '</b><span id="BUDDY-ADR-LOCALITY" class="reset-info">' + _e("unknown") + '</span></div>' +
+
+ '<div class="one-line"><b>' + _e("Postal code") + '</b><span id="BUDDY-ADR-PCODE" class="reset-info">' + _e("unknown") + '</span></div>' +
+
+ '<div class="one-line"><b>' + _e("Country") + '</b><span id="BUDDY-ADR-CTRY" class="reset-info">' + _e("unknown") + '</span></div>' +
+ '</div>' +
+
+ '<div class="block-infos">' +
+ '<div class="one-line"><b>' + _e("Biography") + '</b><span id="BUDDY-DESC" class="reset-info">' + _e("unknown") + '</span></div>' +
+ '</div>' +
+ '</div>' +
+
+ '<div class="one-lap info3">' +
+ '<textarea class="rosternotes" rows="8" cols="60"></textarea>' +
+ '</div>' +
+ '</div>' +
+
+ '<div class="bottom">' +
+ '<div class="wait wait-medium"></div>' +
+
+ '<a href="#" class="finish">' + _e("Close") + '</a>' +
+ '</div>';
+
+ // Create the popup
+ createPopup('userinfos', html);
+
+ // Associate the events
+ launchUserInfos();
+
+ // We retrieve the user's vcard
+ retrieveUserInfos(xid);
+
+ return false;
+}
+
+// Closes the user-infos popup
+function closeUserInfos() {
+ // Send the buddy comments
+ sendBuddyComments();
+
+ // Destroy the popup
+ destroyPopup('userinfos');
+
+ return false;
+}
+
+// Gets the user-infos
+function retrieveUserInfos(xid) {
+ // We setup the waiting indicator
+ markers = 'vcard last';
+
+ // We put the user's XID
+ $('#userinfos .buddy-xid').text(xid);
+
+ // We get the vCard
+ getVCard(xid, 'buddy');
+
+ // Get the highest resource for this XID
+ var cXID = getHighestResource(xid);
+ var pXID = xid;
+
+ // If the user is logged in
+ if(cXID) {
+ // Change the XID
+ pXID = cXID;
+
+ // We request the user's system infos
+ queryUserInfos(cXID, 'version')
+
+ // We request the user's local time
+ queryUserInfos(cXID, 'time')
+
+ // Add these to the markers
+ markers += ' version time';
+ }
+
+ // We request the user's last activity
+ queryUserInfos(pXID, 'last');
+
+ // Add the markers
+ $('#userinfos .content').addClass(markers);
+
+ // We request all the user's comments
+ displayBuddyComments(xid);
+}
+
+// Builds the asked user-infos query
+function queryUserInfos(xid, mode) {
+ // Generate a session ID
+ var id = genID();
+ $('#userinfos').attr('data-' + mode, id);
+
+ // New IQ
+ var iq = new JSJaCIQ();
+
+ iq.setID(id);
+ iq.setType('get');
+ iq.setTo(xid);
+
+ // Last activity query
+ if(mode == 'last') {
+ iq.setQuery(NS_LAST);
+ con.send(iq, lastActivityUserInfos);
+ }
+
+ // Time query
+ else if(mode == 'time') {
+ iq.appendNode('time', {'xmlns': NS_URN_TIME});
+ con.send(iq, localTimeUserInfos);
+ }
+
+ // Version query
+ else if(mode == 'version') {
+ iq.setQuery(NS_VERSION);
+ con.send(iq, versionUserInfos);
+ }
+}
+
+// Checks if the waiting item can be hidden
+function vCardBuddyInfos() {
+ $('#userinfos .content').removeClass('vcard');
+ wUserInfos();
+}
+
+// Displays the buddy comments
+function displayBuddyComments(xid) {
+ // We get the value in the database
+ var value = getDB('rosternotes', xid);
+
+ // Display the value
+ if(value)
+ $('#userinfos .rosternotes').val(value);
+}
+
+// Displays the user's last activity result
+function lastActivityUserInfos(iq) {
+ // Extract the request ID
+ var id = iq.getID();
+ var path = '#userinfos[data-last=' + id + ']';
+
+ // End if session does not exist
+ if(!exists(path))
+ return;
+
+ if(iq && (iq.getType() == 'result')) {
+ // Get the values
+ var from = fullXID(getStanzaFrom(iq));
+ var seconds = $(iq.getNode()).find('query').attr('seconds');
+
+ // Any seconds?
+ if(seconds != undefined) {
+ // Initialize the parsing
+ var last;
+ seconds = parseInt(seconds);
+
+ // Active user
+ if(seconds <= 60)
+ last = _e("User currently active");
+
+ // Inactive user
+ else {
+ // Parse the date
+ var date_now = new Date();
+ var time_now = date_now.getTime();
+ var date_last = new Date(date_now - (seconds * 1000));
+ var date = date_last.toLocaleString();
+
+ // Offline user
+ if(from.indexOf('/') == -1)
+ last = printf(_e("Last seen: %s"), date);
+
+ // Online user
+ else
+ last = printf(_e("Inactive since: %s"), date);
+ }
+
+ // Append this text
+ $('#userinfos .buddy-last').text(last);
+ }
+
+ logThis('Last activity received: ' + from);
+ }
+
+ $('#userinfos .content').removeClass('last');
+ wUserInfos();
+}
+
+// Displays the user's software version result
+function versionUserInfos(iq) {
+ // Extract the request ID
+ var id = iq.getID();
+ var path = '#userinfos[data-version=' + id + ']';
+
+ // End if session does not exist
+ if(!exists(path))
+ return;
+
+ // Extract the reply data
+ if(iq && (iq.getType() == 'result')) {
+ // Get the values
+ var xml = iq.getQuery();
+ var name = $(xml).find('name').text();
+ var version = $(xml).find('version').text();
+ var os = $(xml).find('os').text();
+
+ // Put the values together
+ if(name && version)
+ name = name + ' ' + version;
+
+ // Display the values
+ if(name)
+ $(path + ' #BUDDY-CLIENT').text(name);
+ if(os)
+ $(path + ' #BUDDY-SYSTEM').text(os);
+
+ logThis('Software version received: ' + fullXID(getStanzaFrom(iq)));
+ }
+
+ $('#userinfos .content').removeClass('version');
+ wUserInfos();
+}
+
+// Displays the user's local time result
+function localTimeUserInfos(iq) {
+ // Extract the request ID
+ var id = iq.getID();
+ var path = '#userinfos[data-time=' + id + ']';
+
+ // End if session does not exist
+ if(!exists(path))
+ return;
+
+ if(iq && (iq.getType() == 'result')) {
+ // Get the values
+ var xml = iq.getNode();
+ var tzo = $(xml).find('tzo').text();
+ var utc = $(xml).find('utc').text();
+
+ // Any UTC?
+ if(utc) {
+ // Add the TZO if there's no one
+ if(tzo && utc.match(/^(.+)Z$/))
+ utc = RegExp.$1 + tzo;
+
+ // Get the local date string
+ var local_string = Date.hrTime(utc);
+
+ // Then display it
+ $(path + ' #BUDDY-TIME').text(local_string);
+ }
+
+ logThis('Local time received: ' + fullXID(getStanzaFrom(iq)));
+ }
+
+ $('#userinfos .content').removeClass('time');
+ wUserInfos();
+}
+
+// Hides the waiting image if needed
+function wUserInfos() {
+ var selector = $('#userinfos .content');
+
+ if(!selector.hasClass('vcard') && !selector.hasClass('last') && !selector.hasClass('version') && !selector.hasClass('time'))
+ $('#userinfos .wait').hide();
+}
+
+// Sends the buddy comments
+function sendBuddyComments() {
+ // Update the current value
+ var value = $('#userinfos .rosternotes').val();
+ var xid = $('#userinfos .buddy-xid').text();
+
+ // Necessary to update?
+ var old_value = getDB('rosternotes', xid);
+
+ if((old_value == value) || (!old_value && !value))
+ return false;
+
+ // Update the database
+ setDB('rosternotes', xid, value);
+
+ // Send the new buddy storage values
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+ var query = iq.setQuery(NS_PRIVATE);
+ var storage = query.appendChild(iq.buildNode('storage', {'xmlns': NS_ROSTERNOTES}));
+
+ // We regenerate the XML
+ for(var i = 0; i < sessionStorage.length; i++) {
+ // Get the pointer values
+ var current = sessionStorage.key(i);
+
+ // If the pointer is on a stored rosternote
+ if(explodeThis('_', current, 0) == 'rosternotes') {
+ var xid = explodeThis('_', current, 1);
+ var value = sessionStorage.getItem(current);
+
+ if(xid && value)
+ storage.appendChild(iq.buildNode('note', {'jid': xid, 'xmlns': NS_ROSTERNOTES}, value));
+ }
+ }
+
+ con.send(iq);
+
+ return false;
+}
+
+// Switches the user-infos tabs
+function switchUInfos(id) {
+ $('#userinfos .content .one-lap').hide();
+ $('#userinfos .content .info' + id).show();
+ $('#userinfos .tab a').removeClass('tab-active');
+ $('#userinfos .tab a[data-key=' + id + ']').addClass('tab-active');
+
+ return false;
+}
+
+// Gets the user's informations when creating a new chat
+function getUserInfos(hash, xid, nick, type) {
+ // This is a normal chat
+ if(type != 'private') {
+ // Display the buddy name
+ if(nick) {
+ $('#' + hash + ' .top .name .bc-name').text(nick);
+ $('#page-switch .' + hash + ' .name').text(nick);
+ }
+
+ // Get the buddy PEP informations
+ displayAllPEP(xid);
+ }
+
+ // Display the buddy presence
+ presenceFunnel(xid, hash);
+}
+
+// Plugin launcher
+function launchUserInfos() {
+ // Click events
+ $('#userinfos .tab a').click(function() {
+ // Yet active?
+ if($(this).hasClass('tab-active'))
+ return false;
+
+ // Switch to the good tab
+ var key = parseInt($(this).attr('data-key'));
+
+ return switchUInfos(key);
+ });
+
+ $('#userinfos .bottom .finish').click(function() {
+ return closeUserInfos();
+ });
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the utilities JS script for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Authors: Vanaryon, olivierm
+Last revision: 24/06/11
+
+*/
+
+// Checks if a function exists
+function functionExists(func) {
+ if(typeof func == 'function')
+ return true;
+
+ return false;
+}
+
+// Returns whether using HTTPS or not
+function isHTTPS() {
+ if(window.location.href && (window.location.href).match(/^https/i))
+ return true;
+
+ return false;
+}
+
+// Generates the good storage URL
+function generateURL(url) {
+ // HTTPS not allowed
+ if((HTTPS_STORAGE != 'on') && url.match(/^https(.+)/))
+ url = 'http' + RegExp.$1;
+
+ return url;
+}
+
+// Disables an input if needed
+function disableInput(value, condition) {
+ if(value == condition)
+ return ' disabled=""';
+
+ return '';
+}
+
+// Cuts a string
+function cut(string, limit) {
+ return string.substr(0, limit);
+}
+
+// Truncates a string
+function truncate(string, limit) {
+ // Must truncate the string
+ if(string.length > limit)
+ string = string.substr(0, limit) + '...';
+
+ return string;
+}
+
+// Removes the new lines
+function noLines(string) {
+ return string.replace(/\n/g, ' ');
+}
+
+// Encodes a string for onclick attribute
+function encodeOnclick(str) {
+ return (encodeQuotes(str)).replace(/'/g, '\\$&');
+}
+
+// Checks if we are in the anonymous mode
+function isAnonymous() {
+ if(allowedAnonymous() && LINK_VARS['r'])
+ return true;
+
+ return false;
+}
+
+// Checks if this is a private chat user
+function isPrivate(xid) {
+ if(exists('[data-xid=' + escape(xid) + '][data-type=groupchat]'))
+ return true;
+
+ return false;
+}
+
+// Checks if the user browser is obsolete
+function isObsolete() {
+ // Get browser name & version
+ var browser_name = BrowserDetect.browser;
+ var browser_version = BrowserDetect.version;
+
+ // No DOM storage
+ if(!hasDB() || !hasPersistent())
+ return true;
+
+ // Obsolete IE
+ if((browser_name == 'Explorer') && (browser_version < 8))
+ return true;
+
+ // Obsolete Chrome
+ if((browser_name == 'Chrome') && (browser_version < 7))
+ return true;
+
+ // Obsolete Safari
+ if((browser_name == 'Safari') && (browser_version < 4))
+ return true;
+
+ // Obsolete Firefox
+ if((browser_name == 'Firefox') && (browser_version < 3.5))
+ return true;
+
+ // Obsolete Opera
+ if((browser_name == 'Opera') && (browser_version < 9))
+ return true;
+
+ return false;
+}
+
+// Gets a MUC user XID
+function getMUCUserXID(room, nick) {
+ return $('div.chat[data-xid=' + escape(room) + '] div[data-nick=' + escape(nick) + ']').attr('data-xid');
+}
+
+// Gets a MUC user read XID
+function getMUCUserRealXID(room, nick) {
+ return $('div.chat[data-xid=' + escape(room) + '] div[data-nick=' + escape(nick) + ']').attr('data-realxid');
+}
+
+// Gets the server of the user
+function getServer() {
+ // Return the domain of the user
+ return con.domain;
+}
+
+// Gets the password of the user
+function getPassword() {
+ // Return the password of the user
+ return con.pass;
+}
+
+// Quotes the nick of an user
+function quoteMyNick(hash, nick) {
+ $(document).oneTime(10, function() {
+ $('#page-engine #' + hash + ' .message-area').val(nick + ', ').focus();
+ });
+}
+
+// Escapes a string for a regex usage
+function escapeRegex(query) {
+ return query.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
+}
+
+// Converts a XML document to a string
+function xmlToString(xmlData) {
+ try {
+ // For Mozilla, Firefox, Opera, etc.
+ if(window.XMLSerializer)
+ return (new XMLSerializer()).serializeToString(xmlData);
+
+ // For Internet Explorer
+ if(window.ActiveXObject)
+ return xmlData.xml;
+
+ return null;
+ }
+
+ catch(e) {
+ return null;
+ }
+}
+
+// Converts a string to a XML document
+function XMLFromString(sXML) {
+ try {
+ // No data?
+ if(!sXML)
+ return '';
+
+ // Add the XML tag
+ if(!sXML.match(/^<\?xml/i))
+ sXML = '<?xml version="1.0"?>' + sXML;
+
+ // Parse it!
+ if(window.DOMParser)
+ return (new DOMParser()).parseFromString(sXML, 'text/xml');
+
+ if(window.ActiveXObject) {
+ var oXML = new ActiveXObject('Microsoft.XMLDOM');
+ oXML.loadXML(sXML);
+
+ return oXML;
+ }
+ }
+
+ catch(e) {
+ return '';
+ }
+}
+
+// Return the file category
+function fileCategory(ext) {
+ var cat;
+
+ switch(ext) {
+ // Images
+ case 'jpg':
+ case 'jpeg':
+ case 'png':
+ case 'bmp':
+ case 'gif':
+ case 'tif':
+ case 'svg':
+ case 'psp':
+ case 'xcf':
+ cat = 'image';
+
+ break;
+
+ // Videos
+ case 'ogv':
+ case 'ogg':
+ case 'mkv':
+ case 'avi':
+ case 'mov':
+ case 'mp4':
+ case 'm4v':
+ case 'wmv':
+ case 'asf':
+ case 'mpg':
+ case 'mpeg':
+ case 'ogm':
+ case 'rmvb':
+ case 'rmv':
+ case 'qt':
+ case 'flv':
+ case 'ram':
+ case '3gp':
+ case 'avc':
+ cat = 'video';
+
+ break;
+
+ // Sounds
+ case 'oga':
+ case 'mka':
+ case 'flac':
+ case 'mp3':
+ case 'wav':
+ case 'm4a':
+ case 'wma':
+ case 'rmab':
+ case 'rma':
+ case 'bwf':
+ case 'aiff':
+ case 'caf':
+ case 'cda':
+ case 'atrac':
+ case 'vqf':
+ case 'au':
+ case 'aac':
+ case 'm3u':
+ case 'mid':
+ case 'mp2':
+ case 'snd':
+ case 'voc':
+ cat = 'audio';
+
+ break;
+
+ // Documents
+ case 'pdf':
+ case 'odt':
+ case 'ott':
+ case 'sxw':
+ case 'stw':
+ case 'ots':
+ case 'sxc':
+ case 'stc':
+ case 'sxi':
+ case 'sti':
+ case 'pot':
+ case 'odp':
+ case 'ods':
+ case 'doc':
+ case 'docx':
+ case 'docm':
+ case 'xls':
+ case 'xlsx':
+ case 'xlsm':
+ case 'xlt':
+ case 'ppt':
+ case 'pptx':
+ case 'pptm':
+ case 'pps':
+ case 'odg':
+ case 'otp':
+ case 'sxd':
+ case 'std':
+ case 'std':
+ case 'rtf':
+ case 'txt':
+ case 'htm':
+ case 'html':
+ case 'shtml':
+ case 'dhtml':
+ case 'mshtml':
+ cat = 'document';
+
+ break;
+
+ // Packages
+ case 'tgz':
+ case 'gz':
+ case 'tar':
+ case 'ar':
+ case 'cbz':
+ case 'jar':
+ case 'tar.7z':
+ case 'tar.bz2':
+ case 'tar.gz':
+ case 'tar.lzma':
+ case 'tar.xz':
+ case 'zip':
+ case 'xz':
+ case 'rar':
+ case 'bz':
+ case 'deb':
+ case 'rpm':
+ case '7z':
+ case 'ace':
+ case 'cab':
+ case 'arj':
+ case 'msi':
+ cat = 'package';
+
+ break;
+
+ // Others
+ default:
+ cat = 'other';
+
+ break;
+ }
+
+ return cat;
+}
+
+// Registers Jappix as the default XMPP links handler
+function xmppLinksHandler() {
+ try {
+ navigator.registerProtocolHandler('xmpp', JAPPIX_LOCATION + '?x=%s', SERVICE_NAME);
+
+ return true;
+ }
+
+ catch(e) {
+ return false;
+ }
+}
+
+// Checks if a value exists in an array
+function existArrayValue(array, value) {
+ try {
+ // Loop in the array
+ for(i in array) {
+ if(array[i] == value)
+ return true;
+ }
+
+ return false;
+ }
+
+ catch(e) {
+ return false;
+ }
+}
+
+// Removes a value from an array
+function removeArrayValue(array, value) {
+ for(i in array) {
+ // It matches, remove it!
+ if(array[i] == value) {
+ array.splice(i, 1);
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// Converts a string to an array
+function stringToArray(string) {
+ var array = [];
+
+ // Any string to convert?
+ if(string) {
+ // More than one item
+ if(string.match(/,/gi)) {
+ var string_split = string.split(',');
+
+ for(i in string_split) {
+ if(string_split[i])
+ array.push(string_split[i]);
+ else
+ array.push('');
+ }
+ }
+
+ // Only one item
+ else
+ array.push(string);
+ }
+
+ return array;
+}
+
+// Get the index of an array value
+function indexArrayValue(array, value) {
+ // Nothing?
+ if(!array || !array.length)
+ return 0;
+
+ // Read the index of the value
+ var index = 0;
+
+ for(var i = 0; i < array.length; i++) {
+ if(array[i] == value) {
+ index = i;
+
+ break;
+ }
+ }
+
+ return index;
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the vCard JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 16/01/12
+
+*/
+
+// Opens the vCard popup
+function openVCard() {
+ // Popup HTML content
+ var html =
+ '<div class="top">' + _e("Your profile") + '</div>' +
+
+ '<div class="tab">' +
+ '<a href="#" class="tab-active" data-key="1">' + _e("Identity") + '</a>' +
+ '<a href="#" data-key="2">' + _e("Profile image") + '</a>' +
+ '<a href="#" data-key="3">' + _e("Others") + '</a>' +
+ '</div>' +
+
+ '<div class="content">' +
+ '<div id="lap1" class="lap-active one-lap forms">' +
+ '<fieldset>' +
+ '<legend>' + _e("Personal") + '</legend>' +
+
+ '<label for="USER-FN">' + _e("Complete name") + '</label>' +
+ '<input type="text" id="USER-FN" class="vcard-item" />' +
+
+ '<label for="USER-NICKNAME">' + _e("Nickname") + '</label>' +
+ '<input type="text" id="USER-NICKNAME" class="vcard-item" />' +
+
+ '<label for="USER-N-GIVEN">' + _e("First name") + '</label>' +
+ '<input type="text" id="USER-N-GIVEN" class="vcard-item" />' +
+
+ '<label for="USER-N-FAMILY">' + _e("Last name") + '</label>' +
+ '<input type="text" id="USER-N-FAMILY" class="vcard-item" />' +
+
+ '<label for="USER-BDAY">' + _e("Date of birth") + '</label>' +
+ '<input type="text" id="USER-BDAY" class="vcard-item" />' +
+ '</fieldset>' +
+
+ '<fieldset>' +
+ '<legend>' + _e("Contact") + '</legend>' +
+
+ '<label for="USER-EMAIL-USERID">' + _e("E-mail") + '</label>' +
+ '<input type="text" id="USER-EMAIL-USERID" class="vcard-item" />' +
+
+ '<label for="USER-TEL-NUMBER">' + _e("Phone") + '</label>' +
+ '<input type="text" id="USER-TEL-NUMBER" class="vcard-item" />' +
+
+ '<label for="USER-URL">' + _e("Website") + '</label>' +
+ '<input type="text" id="USER-URL" class="vcard-item" />' +
+ '</fieldset>' +
+ '</div>' +
+
+ '<div id="lap2" class="one-lap forms">' +
+ '<fieldset>' +
+ '<legend>' + _e("New") + '</legend>' +
+
+ '<input type="hidden" id="USER-PHOTO-TYPE" class="vcard-item" />' +
+ '<input type="hidden" id="USER-PHOTO-BINVAL" class="vcard-item" />' +
+
+ '<form id="vcard-avatar" action="./php/avatar-upload.php" method="post" enctype="multipart/form-data">' +
+ generateFileShare() +
+ '</form>' +
+ '</fieldset>' +
+
+ '<fieldset>' +
+ '<legend>' + _e("Current") + '</legend>' +
+
+ '<div class="avatar-container"></div>' +
+
+ '<a href="#" class="one-button avatar-delete talk-images">' + _e("Delete") + '</a>' +
+ '<div class="no-avatar">' + _e("What a pity! You have no profile image defined in your identity card!") + '</div>' +
+ '</fieldset>' +
+
+ '<div class="avatar-wait avatar-info">' + _e("Please wait while your avatar is uploaded...") + '</div>' +
+ '<div class="avatar-ok avatar-info">' + _e("Here it is! A new beautiful profile image!") + '</div>' +
+ '<div class="avatar-error avatar-info">' + _e("The image file is not supported or has a bad size.") + '</div>' +
+ '</div>' +
+
+ '<div id="lap3" class="one-lap forms">' +
+ '<fieldset>' +
+ '<legend>' + _e("Address") + '</legend>' +
+
+ '<label for="USER-ADR-STREET">' + _e("Street") + '</label>' +
+ '<input type="text" id="USER-ADR-STREET" class="vcard-item" />' +
+
+ '<label for="USER-ADR-LOCALITY">' + _e("City") + '</label>' +
+ '<input type="text" id="USER-ADR-LOCALITY" class="vcard-item" />' +
+
+ '<label for="USER-ADR-PCODE">' + _e("Postal code") + '</label>' +
+ '<input type="text" id="USER-ADR-PCODE" class="vcard-item" />' +
+
+ '<label for="USER-ADR-CTRY">' + _e("Country") + '</label>' +
+ '<input type="text" id="USER-ADR-CTRY" class="vcard-item" />' +
+ '</fieldset>' +
+
+ '<fieldset>' +
+ '<legend>' + _e("Biography") + '</legend>' +
+
+ '<textarea id="USER-DESC" rows="8" cols="60" class="vcard-item"></textarea>' +
+ '</fieldset>' +
+ '</div>' +
+
+ '<div class="infos">' +
+ '<p class="infos-title">' + _e("Important notice") + '</p>' +
+
+ '<p>' + _e("Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to).") + '</p>' +
+ '<p>' + _e("Not everything is private on XMPP; this is one of those things, your public profile (vCard).") + '</p>' +
+ '<p>' + printf(_e("It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."), JAPPIX_MAX_UPLOAD) + '</p>' +
+ '<p><a href="https://me.jappix.com/new" target="_blank">' + _e("Enable my public profile") + ' Ā»</a></p>' +
+ '</div>' +
+ '</div>' +
+
+ '<div class="bottom">' +
+ '<div class="wait wait-medium"></div>' +
+
+ '<a href="#" class="finish save disabled">' + _e("Save") + '</a>' +
+ '<a href="#" class="finish cancel">' + _e("Cancel") + '</a>' +
+ '</div>';
+
+ // Create the popup
+ createPopup('vcard', html);
+
+ // Associate the events
+ launchVCard();
+
+ // We get the VCard informations
+ getVCard(getXID(), 'user');
+
+ return false;
+}
+
+// Closes the vCard popup
+function closeVCard() {
+ // Destroy the popup
+ destroyPopup('vcard');
+
+ // Create the welcome end popup?
+ if(END_WELCOME)
+ openMe();
+
+ return false;
+}
+
+// Switches the vCard popup tabs
+function switchVCard(id) {
+ $('#vcard .one-lap').removeClass('lap-active');
+ $('#vcard #lap' + id).addClass('lap-active');
+ $('#vcard .tab a').removeClass('tab-active');
+ $('#vcard .tab a[data-key=' + id + ']').addClass('tab-active');
+
+ return false;
+}
+
+// Waits for the avatar upload reply
+function waitAvatarUpload() {
+ // Reset the avatar info
+ $('#vcard .avatar-info').hide().stopTime();
+
+ // Show the wait info
+ $('#vcard .avatar-wait').show();
+}
+
+// Handles the avatar upload reply
+function handleAvatarUpload(responseXML) {
+ // Data selector
+ var dData = $(responseXML).find('jappix');
+
+ // Not current upload session?
+ if(parseInt(dData.attr('id')) != parseInt($('#vcard-avatar input[name=id]').val()))
+ return;
+
+ // Reset the avatar info
+ $('#vcard .avatar-info').hide().stopTime();
+
+ // Process the returned data
+ if(!dData.find('error').size()) {
+ // Read the values
+ var aType = dData.find('type').text();
+ var aBinval = dData.find('binval').text();
+
+ // We remove everything that isn't useful right here
+ $('#vcard .no-avatar').hide();
+ $('#vcard .avatar').remove();
+
+ // We display the delete button
+ $('#vcard .avatar-delete').show();
+
+ // We tell the user it's okay
+ $('#vcard .avatar-ok').show();
+
+ // Timer
+ $('#vcard .avatar-info').oneTime('10s', function() {
+ $(this).hide();
+ });
+
+ // We put the base64 values in a hidden input to be sent
+ $('#USER-PHOTO-TYPE').val(aType);
+ $('#USER-PHOTO-BINVAL').val(aBinval);
+
+ // We display the avatar !
+ $('#vcard .avatar-container').replaceWith('<div class="avatar-container"><img class="avatar" src="data:' + aType + ';base64,' + aBinval + '" alt="" /></div>');
+ }
+
+ // Any error?
+ else {
+ $('#vcard .avatar-error').show();
+
+ // Timer
+ $('#vcard .avatar-info').oneTime('10s', function() {
+ $(this).hide();
+ });
+
+ logThis('Error while uploading the avatar: ' + dData.find('error').text(), 1);
+ }
+}
+
+// Deletes the encoded avatar of an user
+function deleteAvatar() {
+ // We remove the avatar displayed elements
+ $('#vcard .avatar-info').stopTime();
+ $('#vcard .avatar-info, #vcard .avatar-wait, #vcard .avatar-error, #vcard .avatar-ok, #vcard .avatar-delete').hide();
+ $('#vcard .avatar').remove();
+
+ // We reset the input value
+ $('#USER-PHOTO-TYPE, #USER-PHOTO-BINVAL').val('');
+
+ // We show the avatar-uploading request
+ $('#vcard .no-avatar').show();
+
+ return false;
+}
+
+// Creates a special vCard input
+function createInputVCard(id, type) {
+ // Generate the new ID
+ id = 'USER-' + id;
+
+ // Can append the content
+ if((type == 'user') && !exists('#vcard #' + id))
+ $('#vcard .content').append('<input id="' + id + '" class="vcard-item" type="hidden" />');
+}
+
+// Gets the vCard of a XID
+function getVCard(to, type) {
+ // Generate a special ID
+ var id = genID();
+
+ // New IQ
+ var iq = new JSJaCIQ();
+ iq.setID(id);
+ iq.setType('get');
+ iq.appendNode('vCard', {'xmlns': NS_VCARD});
+
+ // Send the IQ to the good user
+ if(type == 'user') {
+ // Show the wait icon
+ $('#vcard .wait').show();
+
+ // Apply the session ID
+ $('#vcard').attr('data-vcard', id);
+
+ // Send the IQ
+ con.send(iq, handeUVCard);
+ }
+
+ else {
+ // Show the wait icon
+ $('#userinfos .wait').show();
+
+ // Apply the session ID
+ $('#userinfos').attr('data-vcard', id);
+
+ // Send the IQ
+ iq.setTo(to);
+ con.send(iq, handeBVCard);
+ }
+}
+
+// Handles the current connected user's vCard
+function handeUVCard(iq) {
+ handleVCard(iq, 'user');
+}
+
+// Handles an external buddy vCard
+function handeBVCard(iq) {
+ handleVCard(iq, 'buddy');
+}
+
+// Handles a vCard stanza
+function handleVCard(iq, type) {
+ // Extract the data
+ var iqID = iq.getID();
+ var iqFrom = fullXID(getStanzaFrom(iq));
+ var iqNode = iq.getNode();
+
+ // Define some paths
+ var path_vCard = '#vcard[data-vcard=' + iqID + ']';
+ var path_userInfos = '#userinfos[data-vcard=' + iqID + ']';
+
+ // End if the session does not exist
+ if(((type == 'user') && !exists(path_vCard)) || ((type == 'buddy') && !exists(path_userInfos)))
+ return;
+
+ // We retrieve main values
+ var values_yet = [];
+
+ $(iqNode).find('vCard').children().each(function() {
+ // Read the current parent node name
+ var tokenname = (this).nodeName.toUpperCase();
+
+ // Node with a parent
+ if($(this).children().size()) {
+ $(this).children().each(function() {
+ // Get the node values
+ var currentID = tokenname + '-' + (this).nodeName.toUpperCase();
+ var currentText = $(this).text();
+
+ // Not yet added?
+ if(!existArrayValue(values_yet, currentID)) {
+ // Create an input if it does not exist
+ createInputVCard(values_yet, type);
+
+ // Userinfos viewer popup
+ if((type == 'buddy') && currentText) {
+ if(currentID == 'EMAIL-USERID')
+ $(path_userInfos + ' #BUDDY-' + currentID).html('<a href="mailto:' + currentText.htmlEnc() + '" target="_blank">' + currentText.htmlEnc() + '</a>');
+ else
+ $(path_userInfos + ' #BUDDY-' + currentID).text(currentText.htmlEnc());
+ }
+
+ // Profile editor popup
+ else if(type == 'user')
+ $(path_vCard + ' #USER-' + currentID).val(currentText);
+
+ // Avoid duplicating the value
+ values_yet.push(currentID);
+ }
+ });
+ }
+
+ // Node without any parent
+ else {
+ // Get the node values
+ var currentText = $(this).text();
+
+ // Not yet added?
+ if(!existArrayValue(values_yet, tokenname)) {
+ // Create an input if it does not exist
+ createInputVCard(tokenname, type);
+
+ // Userinfos viewer popup
+ if((type == 'buddy') && currentText) {
+ // URL modification
+ if(tokenname == 'URL') {
+ // No http:// or https:// prefix, we should add it
+ if(!currentText.match(/^https?:\/\/(.+)/))
+ currentText = 'http://' + currentText;
+
+ currentText = '<a href="' + currentText + '" target="_blank">' + currentText.htmlEnc() + '</a>';
+ }
+
+ // Description modification
+ else if(tokenname == 'DESC')
+ currentText = filterThisMessage(currentText, getBuddyName(iqFrom).htmlEnc(), true);
+
+ // Other stuffs
+ else
+ currentText = currentText.htmlEnc();
+
+ $(path_userInfos + ' #BUDDY-' + tokenname).html(currentText);
+ }
+
+ // Profile editor popup
+ else if(type == 'user')
+ $(path_vCard + ' #USER-' + tokenname).val(currentText);
+
+ // Avoid duplicating the value
+ values_yet.push(tokenname);
+ }
+ }
+ });
+
+ // Update the stored avatar
+ if(type == 'buddy') {
+ // Get the avatar XML
+ var xml = getPersistent('avatar', iqFrom);
+
+ // If there were no stored avatar previously
+ if($(XMLFromString(xml)).find('type').text() == 'none') {
+ xml = xml.replace(/<forced>false<\/forced>/gi, '<forced>true</forced>');
+ setPersistent('avatar', iqFrom, xml);
+ }
+
+ // Handle the user avatar
+ handleAvatar(iq);
+ }
+
+ // The avatar values targets
+ var aBinval, aType, aContainer;
+
+ if(type == 'user') {
+ aBinval = $('#USER-PHOTO-BINVAL').val();
+ aType = $('#USER-PHOTO-TYPE').val();
+ aContainer = path_vCard + ' .avatar-container';
+ }
+
+ else {
+ aBinval = $(iqNode).find('BINVAL:first').text();
+ aType = $(iqNode).find('TYPE:first').text();
+ aContainer = path_userInfos + ' .avatar-container';
+ }
+
+ // We display the avatar if retrieved
+ if(aBinval) {
+ // No type?
+ if(!aType)
+ aType = 'image/png';
+
+ if(type == 'user') {
+ // We move all the things that we don't need in that case
+ $(path_vCard + ' .no-avatar').hide();
+ $(path_vCard + ' .avatar-delete').show();
+ $(path_vCard + ' .avatar').remove();
+ }
+
+ // We display the avatar we have just received
+ $(aContainer).replaceWith('<div class="avatar-container"><img class="avatar" src="data:' + aType + ';base64,' + aBinval + '" alt="" /></div>');
+ }
+
+ else if(type == 'buddy')
+ $(aContainer).replaceWith('<div class="avatar-container"><img class="avatar" src="' + './img/others/default-avatar.png' + '" alt="" /></div>');
+
+ // Do someting depending of the type
+ if(type == 'user') {
+ $(path_vCard + ' .wait').hide();
+ $(path_vCard + ' .finish:first').removeClass('disabled');
+ }
+
+ else
+ vCardBuddyInfos();
+
+ logThis('vCard received: ' + iqFrom);
+}
+
+// Sends the vCard of the user
+function sendVCard() {
+ // Initialize the IQ
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ var vCard = iq.appendNode('vCard', {'xmlns': NS_VCARD});
+
+ // We send the identity part of the form
+ $('#vcard .vcard-item').each(function() {
+ var itemID = $(this).attr('id').replace(/^USER-(.+)/, '$1');
+ var itemVal = $(this).val();
+
+ if(itemVal && itemID) {
+ if(itemID.indexOf('-') != -1) {
+ var tagname = explodeThis('-', itemID, 0);
+ var aNode;
+
+ if(vCard.getElementsByTagName(tagname).length > 0)
+ aNode = vCard.getElementsByTagName(tagname).item(0);
+ else
+ aNode = vCard.appendChild(iq.buildNode(tagname, {'xmlns': NS_VCARD}));
+
+ aNode.appendChild(iq.buildNode(explodeThis('-', itemID, 1), {'xmlns': NS_VCARD}, itemVal));
+ }
+
+ else
+ vCard.appendChild(iq.buildNode(itemID, {'xmlns': NS_VCARD}, itemVal));
+ }
+ });
+
+ // Send the IQ
+ con.send(iq);
+
+ // Send the user nickname & avatar over PEP
+ if(enabledPEP()) {
+ // Read values
+ var user_nick = $('#USER-NICKNAME').val();
+ var photo_bin = $('#USER-PHOTO-BINVAL').val();
+ var photo_type = $('#USER-PHOTO-TYPE').val();
+ var photo_data = Base64.decode(photo_bin) || '';
+ var photo_bytes = photo_data.length || '';
+ var photo_id = hex_sha1(photo_data) || '';
+
+ // Values array
+ var read = [
+ user_nick,
+ photo_bin,
+ [photo_type, photo_id, photo_bytes]
+ ];
+
+ // Nodes array
+ var node = [
+ NS_NICK,
+ NS_URN_ADATA,
+ NS_URN_AMETA
+ ];
+
+ // Generate the XML
+ for(i in read) {
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ var pubsub = iq.appendNode('pubsub', {'xmlns': NS_PUBSUB});
+ var publish = pubsub.appendChild(iq.buildNode('publish', {'node': node[i], 'xmlns': NS_PUBSUB}));
+
+ if((i == 0) && read[0]) {
+ var item = publish.appendChild(iq.buildNode('item', {'xmlns': NS_PUBSUB}));
+
+ // Nickname element
+ item.appendChild(iq.buildNode('nick', {'xmlns': NS_NICK}, read[i]));
+ }
+
+ else if(((i == 1) || (i == 2)) && read[1]) {
+ var item = publish.appendChild(iq.buildNode('item', {'xmlns': NS_PUBSUB}));
+
+ // Apply the SHA-1 hash
+ if(photo_id)
+ item.setAttribute('id', photo_id);
+
+ // Avatar data node
+ if(i == 1)
+ item.appendChild(iq.buildNode('data', {'xmlns': NS_URN_ADATA}, read[i]));
+
+ // Avatar metadata node
+ else {
+ var metadata = item.appendChild(iq.buildNode('metadata', {'xmlns': NS_URN_AMETA}));
+
+ if(read[i]) {
+ var meta_info = metadata.appendChild(iq.buildNode('info', {'xmlns': NS_URN_AMETA}));
+
+ if(read[i][0])
+ meta_info.setAttribute('type', read[i][0]);
+ if(read[i][1])
+ meta_info.setAttribute('id', read[i][1]);
+ if(read[i][2])
+ meta_info.setAttribute('bytes', read[i][2]);
+ }
+ }
+ }
+
+ con.send(iq);
+ }
+ }
+
+ // Close the vCard stuffs
+ closeVCard();
+
+ // Get our new avatar
+ getAvatar(getXID(), 'force', 'true', 'forget');
+
+ logThis('vCard sent.');
+
+ return false;
+}
+
+// Plugin launcher
+function launchVCard() {
+ // Focus on the first input
+ $(document).oneTime(10, function() {
+ $('#vcard input:first').focus();
+ });
+
+ // Keyboard events
+ $('#vcard input[type=text]').keyup(function(e) {
+ // Enter pressed: send the vCard
+ if((e.keyCode == 13) && !$('#vcard .finish.save').hasClass('disabled'))
+ return sendVCard();
+ });
+
+ // Click events
+ $('#vcard .tab a').click(function() {
+ // Yet active?
+ if($(this).hasClass('tab-active'))
+ return false;
+
+ // Switch to the good tab
+ var key = parseInt($(this).attr('data-key'));
+
+ return switchVCard(key);
+ });
+
+ $('#vcard .avatar-delete').click(function() {
+ return deleteAvatar();
+ });
+
+ $('#vcard .bottom .finish').click(function() {
+ if($(this).is('.cancel'))
+ return closeVCard();
+ if($(this).is('.save') && !$(this).hasClass('disabled'))
+ return sendVCard();
+
+ return false;
+ });
+
+ // Avatar upload vars
+ var avatar_options = {
+ dataType: 'xml',
+ beforeSubmit: waitAvatarUpload,
+ success: handleAvatarUpload
+ };
+
+ // Avatar upload form submit event
+ $('#vcard-avatar').submit(function() {
+ if($('#vcard .wait').is(':hidden') && $('#vcard .avatar-info.avatar-wait').is(':hidden') && $('#vcard-avatar input[type=file]').val())
+ $(this).ajaxSubmit(avatar_options);
+
+ return false;
+ });
+
+ // Avatar upload input change event
+ $('#vcard-avatar input[type=file]').change(function() {
+ if($('#vcard .wait').is(':hidden') && $('#vcard .avatar-info.avatar-wait').is(':hidden') && $(this).val())
+ $('#vcard-avatar').ajaxSubmit(avatar_options);
+
+ return false;
+ });
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the welcome tool functions for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 16/01/12
+
+*/
+
+// Opens the welcome tools
+function openWelcome() {
+ // Share message
+ var share_msg = printf(_e("Using Jappix, an open social platform. I am %s!"), getXID());
+
+ // Popup HTML content
+ var html =
+ '<div class="top">' + _e("Welcome!") + '</div>' +
+
+ '<div class="tab">' +
+ '<a href="#" class="tab-active" data-step="1">' + _e("Options") + '</a>' +
+ '<a href="#" class="tab-missing" data-step="2">' + _e("Friends") + '</a>' +
+ '<a href="#" class="tab-missing" data-step="3">' + _e("Share") + '</a>' +
+ '</div>' +
+
+ '<div class="content">' +
+ '<div class="lap-active one-lap welcome1">' +
+ '<div class="infos">' +
+ '<p class="infos-title">' + _e("Welcome on Jappix, your own social cloud!") + '</p>' +
+ '<p>' + _e("Before you start using it, you will have to change some settings, search for friends and complete your profile.") + '</p>' +
+ '</div>' +
+
+ '<a href="#" class="box enabled" title="' + _e("Click to disable") + '">' +
+ '<span class="option">' + _e("Sounds") + '</span>' +
+ '<span class="description">' + _e("Enable notification sounds") + '</span>' +
+ '<span class="image sound talk-images"></span>' +
+ '<span class="tick talk-images"></span>' +
+ '</a>' +
+
+ '<a href="#" class="box enabled pep-hidable" title="' + _e("Click to disable") + '">' +
+ '<span class="option">' + _e("Geolocation") + '</span>' +
+ '<span class="description">' + _e("Share your position on the globe") + '</span>' +
+ '<span class="image geolocation talk-images"></span>' +
+ '<span class="tick talk-images"></span>' +
+ '</a>' +
+
+ '<a href="#" class="box xmpplinks-hidable" title="' + _e("Click to enable") + '">' +
+ '<span class="option">' + _e("XMPP links") + '</span>' +
+ '<span class="description">' + _e("Open XMPP links with Jappix") + '</span>' +
+ '<span class="image xmpp talk-images"></span>' +
+ '<span class="tick talk-images"></span>' +
+ '</a>' +
+
+ '<a href="#" class="box enabled archives-hidable pref" title="' + _e("Click to enable") + '">' +
+ '<span class="option">' + _e("Message archiving") + '</span>' +
+ '<span class="description">' + _e("Store a history of your chats") + '</span>' +
+ '<span class="image archives talk-images"></span>' +
+ '<span class="tick talk-images"></span>' +
+ '</a>' +
+
+ '<a href="#" class="box" title="' + _e("Click to enable") + '">' +
+ '<span class="option">' + _e("Offline friends") + '</span>' +
+ '<span class="description">' + _e("Don\'t hide offline friends") + '</span>' +
+ '<span class="image offline talk-images"></span>' +
+ '<span class="tick talk-images"></span>' +
+ '</a>' +
+ '</div>' +
+
+ '<div class="one-lap welcome2">' +
+ '<div class="infos">' +
+ '<p class="infos-title">' + _e("Friends") + '</p>' +
+ '<p>' + _e("Use this tool to find your friends on the server you are using right now, or add them later.") + '</p>' +
+ '</div>' +
+
+ '<div class="results welcome-results"></div>' +
+ '</div>' +
+
+ '<div class="one-lap welcome3">' +
+ '<div class="infos">' +
+ '<p class="infos-title">' + _e("Share") + '</p>' +
+ '<p>' + _e("Great work! Now, you can share Jappix with your friends!") + '</p>' +
+ '<p>' + _e("When you will press the save button, the profile editor will be opened. Happy socializing!") + '</p>' +
+ '</div>' +
+
+ '<a class="box share first" href="http://www.facebook.com/sharer/sharer.php?u=' + encodeQuotes(generateURL(JAPPIX_LOCATION)) + '" target="_blank">' +
+ '<span class="logo facebook welcome-images"></span>' +
+ '<span class="name">Facebook</span>' +
+ '<span class="description">' + printf(_e("Share Jappix on %s"), 'Facebook') + '</span>' +
+ '<span class="go talk-images"></span>' +
+ '</a>' +
+
+ '<a class="box share" href="http://twitter.com/intent/tweet?text=' + encodeQuotes(share_msg) + '&url=' + encodeQuotes(generateURL(JAPPIX_LOCATION)) + '" target="_blank">' +
+ '<span class="logo twitter welcome-images"></span>' +
+ '<span class="name">Twitter</span>' +
+ '<span class="description">' + printf(_e("Share Jappix on %s"), 'Twitter') + '</span>' +
+ '<span class="go talk-images"></span>' +
+ '</a>' +
+
+ '<a class="box share" href="http://www.google.com/buzz/post?message=' + encodeQuotes(share_msg) + '&url=' + encodeQuotes(generateURL(JAPPIX_LOCATION)) + '" target="_blank">' +
+ '<span class="logo buzz welcome-images"></span>' +
+ '<span class="name">Google Buzz</span>' +
+ '<span class="description">' + printf(_e("Share Jappix on %s"), 'Google Buzz') + '</span>' +
+ '<span class="go talk-images"></span>' +
+ '</a>' +
+
+ '<a class="box share" href="http://identi.ca/index.php?action=newnotice&status_textarea=' + encodeQuotes(share_msg) + ' ' + encodeQuotes(generateURL(JAPPIX_LOCATION)) + '" target="_blank">' +
+ '<span class="logo identica welcome-images"></span>' +
+ '<span class="name">Identi.ca</span>' +
+ '<span class="description">' + printf(_e("Share Jappix on %s"), 'Identi.ca') + '</span>' +
+ '<span class="go talk-images"></span>' +
+ '</a>' +
+ '</div>' +
+ '</div>' +
+
+ '<div class="bottom">' +
+ '<div class="wait wait-medium"></div>' +
+
+ '<a href="#" class="finish next">' + _e("Next") + ' Ā»</a>' +
+ '<a href="#" class="finish save">' + _e("Save") + '</a>' +
+ '</div>';
+
+ // Create the popup
+ createPopup('welcome', html);
+
+ // Apply the features
+ applyFeatures('welcome');
+
+ // Associate the events
+ launchWelcome();
+
+ logThis('Welcome assistant opened.');
+}
+
+// Closes the welcome tools
+function closeWelcome() {
+ // Destroy the popup
+ destroyPopup('welcome');
+
+ return false;
+}
+
+// Switches the welcome tabs
+function switchWelcome(id) {
+ // Path to
+ var welcome = '#welcome ';
+ var content = welcome + '.content .';
+ var tab = welcome + '.tab ';
+ var wait = $(welcome + '.wait');
+
+ $(content + 'one-lap').hide();
+ $(content + 'welcome' + id).show();
+ $(tab + 'a').removeClass('tab-active');
+ $(tab + 'a[data-step=' + id + ']').addClass('tab-active').removeClass('tab-missing');
+
+ // Update the "save" button if all is okay
+ if(!exists(tab + '.tab-missing')) {
+ var finish = welcome + '.finish.';
+ $(finish + 'save').show();
+ $(finish + 'next').hide();
+ }
+
+ // If this is ID 2: vJUD search
+ if(id == 2) {
+ wait.show();
+ dataForm(HOST_VJUD, 'search', '', '', 'welcome');
+ }
+
+ else
+ wait.hide();
+
+ return false;
+}
+
+// Sends the welcome options
+function sendWelcome(array) {
+ // Sends the options
+ var iq = new JSJaCIQ();
+ iq.setType('set');
+
+ var query = iq.setQuery(NS_PRIVATE);
+ var storage = query.appendChild(iq.buildNode('storage', {'xmlns': NS_OPTIONS}));
+
+ // Value array
+ var tags = new Array('sounds', 'geolocation', '', '', 'roster-showall');
+
+ // Build the XML with the array
+ for(i in array) {
+ var value = array[i];
+ var tag = tags[i];
+
+ if((i != 2) && (i != 3) && tag && value) {
+ storage.appendChild(iq.buildNode('option', {'type': tag, 'xmlns': NS_OPTIONS}, value));
+ setDB('options', tag, value);
+ }
+ }
+
+ con.send(iq);
+
+ // If geolocation is enabled
+ if(array[1] == '1')
+ geolocate();
+}
+
+// Saves the welcome options
+var END_WELCOME = false;
+
+function saveWelcome() {
+ // Get the new options
+ var array = new Array();
+
+ $('#welcome a.box').each(function() {
+ var current = '0';
+
+ if($(this).hasClass('enabled'))
+ current = '1';
+
+ array.push(current);
+ });
+
+ // If XMPP links is enabled
+ if(array[2] == '1')
+ xmppLinksHandler();
+
+ // If offline buddies showing is enabled
+ if(array[4] == '1')
+ showAllBuddies('welcome');
+
+ // If archiving is supported by the server
+ if(enabledArchives('pref')) {
+ var aEnabled = false;
+
+ // If archiving is enabled
+ if(array[3] == '1')
+ aEnabled = true;
+
+ // Send the archives configuration
+ configArchives(aEnabled);
+ }
+
+ // Send the new options
+ sendWelcome(array);
+
+ // Close the welcome tool
+ closeWelcome();
+
+ // Open the profile editor
+ openVCard();
+
+ END_WELCOME = true;
+
+ return false;
+}
+
+// Goes to the next welcome step
+function nextWelcome() {
+ // Check the next step to go to
+ var next = 1;
+ var missing = '#welcome .tab a.tab-missing';
+
+ if(exists(missing))
+ next = parseInt($(missing + ':first').attr('data-step'));
+
+ // Switch to the next step
+ switchWelcome(next);
+
+ return false;
+}
+
+// Plugin launcher
+function launchWelcome() {
+ // Click events
+ $('#welcome .tab a').click(function() {
+ // Switch to the good tab
+ var key = parseInt($(this).attr('data-step'));
+
+ return switchWelcome(key);
+ });
+
+ $('#welcome a.box:not(.share)').click(function() {
+ if($(this).hasClass('enabled'))
+ $(this).removeClass('enabled').attr('title', _e("Click to enable"));
+ else
+ $(this).addClass('enabled').attr('title', _e("Click to disable"));
+
+ return false;
+ });
+
+ $('#welcome .bottom .finish').click(function() {
+ if($(this).is('.next'))
+ return nextWelcome();
+ if($(this).is('.save'))
+ return saveWelcome();
+
+ return false;
+ });
+}
--- /dev/null
+/*
+
+Jappix - An open social platform
+These are the XMPP links handling JS scripts for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 08/05/11
+
+*/
+
+// Does an action with the provided XMPP link
+function xmppLink(link) {
+ /* REF: http://xmpp.org/registrar/querytypes.html */
+
+ // Remove the "xmpp:" string
+ link = explodeThis(':', link, 1);
+
+ // The XMPP URI has no "?"
+ if(link.indexOf('?') == -1)
+ checkChatCreate(link, 'chat');
+
+ // Parse the URI
+ else {
+ var xid = explodeThis('?', link, 0);
+ var action = explodeThis('?', link, 1);
+
+ switch(action) {
+ // Groupchat
+ case 'join':
+ checkChatCreate(xid, 'groupchat');
+
+ break;
+
+ // Profile
+ case 'vcard':
+ openUserInfos(xid);
+
+ break;
+
+ // Subscription
+ case 'subscribe':
+ addThisContact(xid);
+
+ break;
+
+ // Unsubscription
+ case 'unsubscribe':
+ sendRoster(xid, 'remove');
+
+ break;
+
+ // Private chat
+ default:
+ checkChatCreate(xid, 'chat');
+
+ break;
+ }
+ }
+
+ return false;
+}
+
+// Gets the links vars (get parameters in URL)
+var LINK_VARS = (function() {
+ var vars = [], hash;
+ var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
+
+ for(var i = 0; i < hashes.length; i++) {
+ var hash = hashes[i].split('=');
+ vars.push(hash[0]);
+ vars[hash[0]] = decodeURIComponent(hash[1]);
+ }
+
+ return vars;
+})();
--- /dev/null
+# Arabic translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:25+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "Ų§ŁŲ¬Ų§ŁŲ§ Ų³ŁŲ±ŁŲØŲŖ ŁŁ Ł
ŲŖŲµŁŲŁ Ł
ŁŁŁŲÆŲ ŁŁ ŲŖŲŖŁ
ŁŁ Ł
Ł ŲØŲÆŲ£ Jappix! ŁŲ±Ų¬Ł Ų„ŲµŁŲ§ŲŁ."
+
+msgid "An open social network"
+msgstr "Ų“ŲØŁŲ© Ų„Ų¬ŲŖŁ
Ų§Ų¹ŁŲ© Ł
ŁŲŖŁŲŲ©."
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "Jappix ŁŲÆ Ų„ŲŖŁŲ·Ų¹ ŲØŲ³ŲØŲØ Ł
Ų“ŁŁŲ© ŁŁ Ų§ŁŲ“ŲØŁŲ©Ų Ł
Ų“ŁŁŲ© Ų£Ł ŲÆŲ®ŁŁ Ų³ŁŲ” (ŲŖŲ£ŁŲÆ Ų£ŁŁ Ų£ŲÆŲ®ŁŲŖ Ų§ŁŁ
Ų¹ŁŁŁ
Ų§ŲŖ ŲØŲ“ŁŁ ŲµŲŁŲ)Ų ŁŲ£Ų³Ł Ų¹ŁŁ Ų§ŁŲ„Ų²Ų¹Ų§Ų¬."
+
+msgid "The element list on this server could not be obtained!"
+msgstr "ŁŲ°Ų§ Ų§ŁŲ¹ŁŲµŲ± Ł
Ł Ų§ŁŁŲ§Ų¦Ł
Ų© Ų¹ŁŁ ŁŲ°Ų§ Ų§ŁŲ®Ų§ŲÆŁ
ŁŲ§ ŁŁ
ŁŁ Ų§ŁŁŲµŁŁ Ų„ŁŁŁ."
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "ŁŁŲÆ ŲŖŁ
ŲŖŲŗŁŁŲ± Ų±ŁŁ
Ł Ų§ŁŲ³Ų±ŁŲ ŲØŲ„Ł
ŁŲ§ŁŁ Ų§ŁŲ¢Ł Ų„Ų³ŲŖŲ®ŲÆŲ§Ł
ŲŲ³Ų§ŲØŁ Ł
Ų¹ Ų§ŁŁ
Ų¹ŁŁŁ
Ų§ŲŖ Ų§ŁŲ¬ŲÆŁŲÆŲ©."
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "ŁŁŲÆ ŲŖŁ
ŲŲ°Ł ŲŲ³Ų§ŲØŁ XMPP, ŁŲÆŲ§Ų¹ŁŲ§!"
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "ŁŁŲÆ ŲŖŁ
ŲŖŲ³Ų¬ŁŁ Ų®Ų±ŁŲ¬Ł Ł
Ł ŲŲ³Ų§ŲØŁ XMPP, ŁŁŁ
ŁŲ§ Ų·ŁŲØŁŲ§ ŁŁ!"
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "Ų§ŁŲŗŲ±ŁŲ© Ų§ŁŲŖŁ ŲŖŲŲ§ŁŁ Ų§ŁŲÆŲ®ŁŁ Ų¹ŁŁŁŲ§ ŲŗŁŲ± Ł
ŲŖŁŁŲ±Ų©. ŁŁ
ŲØŲ„ŁŲ“Ų§Ų¤ŁŲ§!"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "ŁŁŲÆ ŲŖŁ
ŲŲ°Ł ŲŗŲ±ŁŲ© Ų§ŁŲÆŲ±ŲÆŲ“Ų©Ų Ų§ŁŲ¢Ł ŲØŲ„Ł
ŁŲ§Ł Ų“Ų®Ųµ Ų¢Ų®Ų± Ų„ŁŲ“Ų§Ų¤ŁŲ§."
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "Ų§ŁŁ
Ų³ŲŖŲ®ŲÆŁ
Ų§ŁŲ°Ł ŲŖŲŲ§ŁŁ Ų§ŁŁŲµŁŁ Ų„ŁŁŁ ŲŗŁŲ± Ł
ŲŖŁŲ§Ų¬ŲÆ ŁŁ Ų§ŁŲŗŲ±ŁŲ©."
+
+msgid "Please enter the group chat address to join."
+msgstr "ŁŲ±Ų¬Ł Ų„ŲÆŲ®Ų§Ł Ų¹ŁŁŲ§Ł Ł
Ų¬Ł
ŁŲ¹Ų© Ų§ŁŲÆŲ±ŲÆŲ“Ų© ŁŁŲÆŲ®ŁŁ."
+
+msgid "Please enter your nickname to join %s."
+msgstr "ŁŲ±Ų¬Ł Ų„ŲÆŲ®Ų§Ł Ų„Ų³Ł
Ł Ų§ŁŁ
Ų³ŲŖŲ¹Ų§Ų± ŁŁŲÆŲ®ŁŁ %s."
+
+msgid "This room (%s) is protected with a password."
+msgstr "ŁŲ°Ł Ų§ŁŲŗŲ±ŁŲ© (%s) .Ł
ŲŁ
ŁŁŲ© ŲØŁŁŁ
Ų© Ł
Ų±ŁŲ±"
+
+msgid "Your browser is out of date!"
+msgstr "Ł
ŲŖŲµŁŲŁ ŁŲÆŁŁ
Ł Ų¹ŲÆŁŁ
Ų§ŁŲµŁŲ§ŲŁŲ©"
+
+msgid "Last %s version is better!"
+msgstr ""
+
+msgid "Login"
+msgstr "ŲÆŲ®ŁŁ"
+
+msgid "Register"
+msgstr "ŲŖŲ³Ų¬ŁŁ"
+
+msgid "Here we go!"
+msgstr "ŁŁŲ§ ŁŁŲ·ŁŁ!"
+
+msgid "Server"
+msgstr "Ų®Ų§ŲÆŁ
"
+
+msgid "Password"
+msgstr "ŁŁŁ
Ų© Ų³Ų±"
+
+msgid "Remember me"
+msgstr "ŲŖŲ°ŁŲ±ŁŁ"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "ŁŲ°Ł Ų§ŁŲ®Ų§ŲµŁŁŲ© Ł
Ų¹Ų·ŁŁŲ©Ų ŁŁ ŲŖŲŖŁ
ŁŁ Ł
Ł Ų„Ų³ŲŖŲ®ŲÆŲ§Ł
ŁŲ§!"
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "ŲØŲ³ŲØŲØ Ł
Ų“ŁŁŲ© ŁŁ Ų§ŁŲ“ŲØŁŲ©Ų Ų£ŲµŲØŲŲŖ ŲŗŁŲ± Ł
ŲŖŲµŁ. Ł
Ų§Ų°Ų§ ŲŖŲ±ŁŲÆ Ų£Ł ŲŖŁŲ¹Ł Ų§ŁŲ¢ŁŲ"
+
+msgid "Reconnect"
+msgstr "Ų„Ų¹Ų§ŲÆŲ© Ų„ŲŖŲµŲ§Ł"
+
+msgid "Messages"
+msgstr "Ų±Ų³Ų§Ų¦Ł"
+
+msgid "Profile"
+msgstr "Ł
ŁŁ Ų“Ų®ŲµŁ"
+
+msgid "Options"
+msgstr "Ų®ŁŁŲ§Ų±Ų§ŲŖ"
+
+msgid "Disconnect"
+msgstr "ŲŗŁŲ± Ł
ŲŖŲµŁ"
+
+msgid "Filter"
+msgstr "Ł
Ų±Ų“Ų"
+
+msgid "Add a friend"
+msgstr "Ų£Ų¶Ł ŲµŲÆŁŁ."
+
+msgid "Your groupchats"
+msgstr "ŲŗŲ±ŁŲ© Ų§ŁŲÆŲ±ŲÆŲ“Ų© Ų§ŁŲ®Ų§ŲµŲ© ŲØŁ"
+
+msgid "Manage your favorite groupchats"
+msgstr "ŲŖŲŁŁ
ŲØŲŗŲ±Ł Ų§ŁŲÆŲ±ŲÆŲ“Ų© Ų§ŁŁ
ŁŲ¶ŁŲ© ŁŲÆŁŁ"
+
+msgid "More stuff"
+msgstr "Ų®ŁŲ§Ų±Ų§ŲŖ Ų£ŁŲ«Ų±"
+
+msgid "Show all friends"
+msgstr "Ų£Ų¹Ų±Ų¶ Ų¬Ł
ŁŲ¹ Ų§ŁŲ£ŲµŲÆŁŲ§Ų”"
+
+msgid "Only show connected friends"
+msgstr "Ų£Ų¹Ų±Ų¶ ŁŁŲ· Ų§ŁŲ£ŲµŲÆŁŲ§Ų” Ų§ŁŁ
ŲŖŲµŁŁŁ"
+
+msgid "Message archives"
+msgstr "Ų£Ų±Ų“ŁŲ© Ų§ŁŲ±Ų³Ų§Ų¦Ł"
+
+msgid "Date"
+msgstr "Ų§ŁŲŖŲ§Ų±ŁŲ®"
+
+msgid "Please select a friend to view the chat history."
+msgstr ""
+
+msgid "Nothing found for: %s"
+msgstr ""
+
+msgid "A short message?"
+msgstr "Ų±Ų³Ų§ŁŲ© ŁŲµŁŲ±Ų©Ų"
+
+msgid "How are you?"
+msgstr "ŁŁŁ ŲŲ§ŁŁŲ"
+
+msgid "What are you doing?"
+msgstr "Ł
Ų§Ų°Ų§ ŲŖŁŲ¹ŁŲ"
+
+msgid "Join a chat"
+msgstr "ŲÆŲ®ŁŁ Ų§ŁŲÆŲ±ŲÆŲ“Ų©"
+
+msgid "Status"
+msgstr "ŲŲ§ŁŲ©"
+
+msgid "Available"
+msgstr "Ł
ŲŖŲ§Ų"
+
+msgid "Talkative"
+msgstr "Ų«Ų±Ų«Ų±Ų©"
+
+msgid "Away"
+msgstr "ŲØŲ§ŁŲ®Ų§Ų±Ų¬"
+
+msgid "Not available"
+msgstr "ŲŗŁŲ± Ł
ŲŖŲµŁ"
+
+msgid "Busy"
+msgstr "Ł
Ų“ŲŗŁŁ"
+
+msgid "Mood"
+msgstr "Ł
Ų²Ų§Ų¬Ł"
+
+msgid "None"
+msgstr "ŁŲ§ Ų“ŁŲ”"
+
+msgid "Crazy"
+msgstr "Ł
Ų¬ŁŁŁ"
+
+msgid "Excited"
+msgstr "Ł
ŲŖŲŁ
Ų³"
+
+msgid "Playful"
+msgstr "ŁŲ¹ŁŲØ"
+
+msgid "Happy"
+msgstr "Ų³Ų¹ŁŲÆ"
+
+msgid "Shocked"
+msgstr "Ł
ŲµŲÆŁŁ
"
+
+msgid "Hot"
+msgstr "ŲŲ±!"
+
+msgid "Sad"
+msgstr "ŲŲ²ŁŁ"
+
+msgid "Amorous"
+msgstr "Ł
ŲŗŲ±Ł
"
+
+msgid "Confident"
+msgstr "ŁŲ§Ų«Ł"
+
+msgid "Activity"
+msgstr "ŁŲ“ŁŲ·"
+
+msgid "Chores"
+msgstr "Ų£Ų¹Ł
Ų§Ł Ł
ŁŲ²ŁŁŲ©"
+
+msgid "Drinking"
+msgstr "ŁŲ“Ų±ŲØ"
+
+msgid "Eating"
+msgstr "ŁŲ£ŁŁ"
+
+msgid "Exercising"
+msgstr "ŁŁ
Ų§Ų±Ų³ Ų§ŁŲŖŁ
Ų§Ų±ŁŁ"
+
+msgid "Grooming"
+msgstr "ŲŖŲØŲ±Ų¬"
+
+msgid "Appointment"
+msgstr "ŲŖŲ¬ŁŁŲ²"
+
+msgid "Inactive"
+msgstr "ŲŗŁŲ± ŁŲ“Ų·"
+
+msgid "Relaxing"
+msgstr "Ł
Ų³ŲŖŲ±Ų®Ł"
+
+msgid "Talking"
+msgstr "ŁŲŖŲŲÆŲ«"
+
+msgid "Traveling"
+msgstr "Ł
Ų³Ų§ŁŲ±"
+
+msgid "Working"
+msgstr "ŁŲ¹Ł
Ł"
+
+msgid "View profile"
+msgstr "Ł
Ų“Ų§ŁŲÆŲ© Ų§ŁŁ
ŁŁ Ų§ŁŲ“Ų®ŲµŁ"
+
+msgid "Repeat this notice"
+msgstr "ŁŲ±ŁŲ± ŁŲ°Ł Ų§ŁŁ
ŁŲ§ŲŲøŲ©"
+
+msgid "Remove this notice"
+msgstr "Ų£ŲŲ°Ł ŁŲ°Ł Ų§ŁŁ
ŁŲ§ŲŲøŲ©"
+
+msgid "Your profile"
+msgstr "Ł
ŁŁŁ Ų§ŁŲ“Ų®ŲµŁ"
+
+msgid "Identity"
+msgstr "Ų§ŁŁŁŁŲ©"
+
+msgid "Profile image"
+msgstr "ŲµŁŲ±Ų© Ų§ŁŁ
ŁŁ Ų§ŁŲ“Ų®ŲµŁ"
+
+msgid "Others"
+msgstr "Ų¢Ų®Ų±ŁŁ"
+
+msgid "Personal"
+msgstr "Ų“Ų®ŲµŁ"
+
+msgid "Complete name"
+msgstr "Ų§ŁŲ„Ų³Ł
ŁŲ§Ł
Ł"
+
+msgid "Nickname"
+msgstr "Ų§ŁŲ„Ų³Ł
Ų§ŁŁ
Ų³ŲŖŲ¹Ų§Ų±"
+
+msgid "First name"
+msgstr "Ų§ŁŲ„Ų³Ł
Ų§ŁŲ£ŁŁ"
+
+msgid "Last name"
+msgstr "Ų§ŁŲ„Ų³Ł
Ų§ŁŲ£Ų®ŁŲ±"
+
+msgid "Date of birth"
+msgstr "ŲŖŲ§Ų±ŁŲ® Ų¹ŁŲÆ Ų§ŁŁ
ŁŁŲ§ŲÆ"
+
+msgid "Contact"
+msgstr "Ų„ŲŖŲµŁ"
+
+msgid "E-mail"
+msgstr "Ų§ŁŲØŲ±ŁŲÆ Ų§ŁŲ„ŁŁŲŖŲ±ŁŁŁ"
+
+msgid "Phone"
+msgstr "Ų§ŁŁŲ§ŲŖŁ"
+
+msgid "Website"
+msgstr "Ų§ŁŁ
ŁŁŲ¹ Ų§ŁŲ“Ų®ŲµŁ"
+
+msgid "Current"
+msgstr "Ų§ŁŲŲ§ŁŁ"
+
+msgid "Delete"
+msgstr "ŲŲ°Ł"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "ŁŁ
Ł
Ų«ŁŲ± ŁŁŲ“ŁŁŲ©! ŁŲ§ ŲŖŁŲ¬ŲÆ ŲµŁŲ±Ų© ŁŁŁ
ŁŁ Ų§ŁŲ“Ų®ŲµŁ ŁŁ ŁŁŁŲŖŁ!"
+
+msgid "Address"
+msgstr "Ų§ŁŲ¹ŁŁŲ§Ł"
+
+msgid "Street"
+msgstr "Ų§ŁŲ“Ų§Ų±Ų¹"
+
+msgid "City"
+msgstr "Ų§ŁŁ
ŲÆŁŁŲ©"
+
+msgid "Postal code"
+msgstr "Ų§ŁŲ±Ł
Ų² Ų§ŁŲØŲ±ŁŲÆŁ"
+
+msgid "Country"
+msgstr "Ų§ŁŲÆŁŁŲ©"
+
+msgid "Biography"
+msgstr "ŁŲØŲ°Ų© Ų“Ų®ŲµŁŲ©"
+
+msgid "Important notice"
+msgstr "Ł
ŁŲ§ŲŲøŲ© ŁŲ§Ł
Ų©"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr "ŁŁ ŲŲ°Ų±ŁŲ§ Ų¹ŁŲÆ ŁŲ¶Ų¹ Ł
Ų¹ŁŁŁ
Ų§ŲŖŁ ŁŁ Ł
ŁŁŁ Ų§ŁŲ“Ų®ŲµŁŲ ŲØŲ„Ł
ŁŲ§Ł Ų§ŁŲ¬Ł
ŁŲ¹ Ų§ŁŁŲµŁŁ Ų„ŁŁŁŲ§ (ŲŲŖŁ Ų§ŁŲ£Ų“Ų®Ų§Ųµ Ų§ŁŲ°ŁŁ ŁŲ§ ŲŖŁŲÆ Ų£Ł ŁŲµŁŁŁ Ų„ŁŁŁŲ§)."
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr "ŁŲ§ ŁŁŲ¬ŲÆ Ų“Ł Ų®Ų§Ųµ Ų¹ŁŁ XMPP; ŁŲ°Ł ŁŲ§ŲŲÆŲ© Ł
Ł Ų§ŁŲ£Ł
ŁŲ±Ų Ł
ŁŁŁ Ų§ŁŲ“Ų®ŲµŁ Ų¹Ų§Ł
(vCard)."
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr ""
+
+msgid "Save"
+msgstr "Ų„ŲŁŲø"
+
+msgid "Cancel"
+msgstr "Ų„ŁŲŗŲ§Ų”"
+
+msgid "Edit options"
+msgstr "ŲŖŲŲ±ŁŲ± Ų§ŁŲ®ŁŲ§Ų±Ų§ŲŖ"
+
+msgid "Channel"
+msgstr "Ų§ŁŁŁŲ§Ų©"
+
+msgid "Commands"
+msgstr ""
+
+msgid "Sounds"
+msgstr "Ų§ŁŲ£ŲµŁŲ§ŲŖ"
+
+msgid "Privacy"
+msgstr "Ų§ŁŲ®ŲµŁŲµŁŲ©"
+
+msgid "Message archiving"
+msgstr "Ų£Ų±Ų“ŁŲ© Ų§ŁŲ±Ų³Ų§ŁŲ©"
+
+msgid "Store a history of your chats"
+msgstr "Ų®Ų²Ł Ų±Ų³Ų§Ų¦Ł Ų§ŁŲÆŲ±ŲÆŲ“Ų©"
+
+msgid "Geolocation"
+msgstr "ŲŖŲŲÆŁŲÆ Ų§ŁŁ
ŁŁŲ¹ Ų§ŁŲ¬ŲŗŲ±Ų§ŁŁ"
+
+msgid "Empty"
+msgstr "Ų®Ų§ŁŁ"
+
+msgid "Empty channel"
+msgstr "ŁŁŲ§Ų© Ų®Ų§ŁŁŲ©"
+
+msgid "Persistent"
+msgstr "Ł
Ų³ŲŖŁ
Ų±"
+
+msgid "Maximum notices"
+msgstr "Ų§ŁŲŲÆ Ų§ŁŲ£ŁŲµŁ ŁŁŁ
ŁŲ§ŲŲøŲ§ŲŖ"
+
+msgid "Account"
+msgstr "Ų§ŁŲŲ³Ų§ŲØ"
+
+msgid "Change password"
+msgstr "ŲŖŲŗŁŁŲ± ŁŁŁ
Ų© Ų§ŁŲ³Ų±"
+
+msgid "Delete account"
+msgstr "ŲŲ°Ł Ų§ŁŲŲ³Ų§ŲØ"
+
+msgid "Old"
+msgstr "Ų§ŁŲ¹Ł
Ų±"
+
+msgid "New (2 times)"
+msgstr "Ų¬ŲÆŁŲÆ (Ų¹ŁŲµŲ±ŁŁ)"
+
+msgid "Continue"
+msgstr "Ų„Ų³ŲŖŁ
Ų±Ų§Ų±"
+
+msgid "To"
+msgstr "Ų„ŁŁ"
+
+msgid "Close"
+msgstr "Ų£ŲŗŁŁ"
+
+msgid "unknown"
+msgstr "ŲŗŁŲ± Ł
Ų¹Ų±ŁŁ"
+
+msgid "Unavailable"
+msgstr "ŲŗŁŲ± Ł
ŲŖŲ§Ų"
+
+msgid "is now"
+msgstr "Ų§ŁŲ¢Ł"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr "Ų§ŁŁ
Ų±Ų¬Ł Ų§ŁŲ§ŁŲŖŲ¶Ų§Ų± Ų ŁŲŖŁ
Ų±ŁŲ¹ ŲµŁŲ±ŲŖŁ"
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "Ų„ŁŁŲ§ ŁŁŲ§! ŲµŁŲ±Ų© Ł
ŁŁ Ų“Ų®ŲµŁ Ų¬ŲÆŁŲÆŲ©."
+
+msgid "The image file is not supported or has a bad size."
+msgstr "Ł
ŁŁ Ų§ŁŲµŁŲ±Ų© ŁŲ§ ŁŲÆŲ¹Ł
Ų£Ł Ų§ŁŲŲ¬Ł
ŁŲ§ ŁŲŖŁŲ§Ų³ŲØ."
+
+msgid "Reply"
+msgstr "Ų§ŁŲ±ŲÆ"
+
+msgid "Error"
+msgstr "Ų®Ų·Ų£"
+
+msgid "Click here to solve the error"
+msgstr "Ų§ŁŁŲ± ŁŁŲ§ ŁŲŁ Ų§ŁŁ
Ų“ŁŁ"
+
+msgid "You"
+msgstr "Ų£ŁŲŖ"
+
+msgid "Remove"
+msgstr "ŲŲ°Ł"
+
+msgid "Rename"
+msgstr "Ų„Ų¹Ų§ŲÆŲ© Ų§ŁŲ„Ų³Ł
"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "Ł
Ų±ŲŲØŲ§Ų Ų£ŁŲ§ %sŲ Ų£Ų±ŲŗŲØ ŲØŲ„Ų¶Ų§ŁŲŖŁ ŁŲµŲÆŁŁ ŁŲÆŁ."
+
+msgid "Smiley insertion"
+msgstr "Ų„Ų¶Ų§ŁŲ© Ų±Ł
Ų²"
+
+msgid "Change style"
+msgstr "Ų§ŁŲŖŁŲ³ŁŁ"
+
+msgid "Text in bold"
+msgstr "ŁŲµ Ų¹Ų±ŁŲ¶"
+
+msgid "Text in italic"
+msgstr "ŁŲµ Ł
Ų§Ų¦Ł"
+
+msgid "Underlined text"
+msgstr "ŁŲµ Ų£Ų³ŁŁŁ Ų®Ų·"
+
+msgid "Save chat"
+msgstr "ŲŁŲø Ų§ŁŲÆŲ±ŲÆŲ“Ų©"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr "Ų„Ų¶ŲŗŲ· Ų¹ŁŁ Ų§ŁŁŲµŁŲ© Ų§ŁŲŖŲ§ŁŁŲ© ŁŁŲŲµŁŁ Ų¹ŁŁ Ų³Ų¬Ł Ų§ŁŲÆŲ±ŲÆŲ“Ų© ŁŲ„ŁŲŖŲøŲ±. ŁŁ
Ł Ų«Ł
Ų„Ų¶ŲŗŲ· Ł
Ų¬ŲÆŲÆŁŲ§ ŁŁŲŲµŁŁ Ų¹ŁŁ Ų§ŁŁ
ŁŁ."
+
+msgid "This chat is empty!"
+msgstr "ŁŲ°Ł ŲÆŲ±ŲÆŲ“Ų© Ų®Ų§ŁŁŲ©!"
+
+msgid "Generate file!"
+msgstr "Ų„ŁŲ“Ų§Ų” Ł
ŁŁ!"
+
+msgid "Download file!"
+msgstr "ŲŖŲŁ
ŁŁ Ų§ŁŁ
ŁŁ"
+
+msgid "Clean current chat"
+msgstr "Ł
Ų³Ų Ų§ŁŲÆŲ±ŲÆŲ“Ų© Ų§ŁŲŲ§ŁŁŲ©"
+
+msgid "View chat history"
+msgstr ""
+
+msgid "Show user profile"
+msgstr "Ų„ŲøŁŲ§Ų± Ł
ŁŁ Ų§ŁŲ¹Ų¶Ł Ų§ŁŲ“Ų®ŲµŁ"
+
+msgid "Add this contact to your friends"
+msgstr "ŁŁ
ŲØŲ„Ų¶Ų§ŁŲ© ŁŲ°Ų§ Ų§ŁŲŲ³Ų§ŲØ Ų„ŁŁ Ų£ŲµŲÆŁŲ§Ų¦Ł"
+
+msgid "Add this groupchat to your favorites"
+msgstr "ŁŁ
ŲØŲ„Ų¶Ų§ŁŲ© Ł
Ų¬Ł
ŁŲ¹Ų© Ų§ŁŲÆŲ±ŲÆŲ“Ų© ŁŲ°Ł Ų„ŁŁ Ų§ŁŁ
ŁŲ¶ŁŲ©"
+
+msgid "All tabs"
+msgstr "Ų¬Ł
ŁŲ¹ Ų§ŁŲŖŲØŁŁŲØ"
+
+msgid "Close this tab"
+msgstr "Ų£ŲŗŁŁ ŁŲ°Ų§ Ų§ŁŲŖŲØŁŁŲØ"
+
+msgid "no subject defined for this room."
+msgstr "ŁŲ§ ŁŁŲ¬ŲÆ Ų¹ŁŁŲ§Ł Ų„ŁŁ ŁŲ°Ł Ų§ŁŲŗŲ±ŁŲ©"
+
+msgid "Administration panel for this room"
+msgstr "ŁŁŲŲ© Ų§ŁŲŖŲŁŁ
Ų„ŁŁ ŁŲ°Ł Ų§ŁŲŗŲ±ŁŲ©"
+
+msgid "Moderators"
+msgstr "Ų§ŁŁ
ŲÆŲ±Ų§Ų”"
+
+msgid "Participants"
+msgstr "Ų§ŁŁ
Ų“Ų§Ų±ŁŁŁ"
+
+msgid "Visitors"
+msgstr "Ų§ŁŲ²ŁŲ§Ų±"
+
+msgid "Manage favorite rooms"
+msgstr "Ų§ŁŲŖŲŁŁ
ŲØŲ§ŁŲŗŲ±Ł Ų§ŁŁ
ŁŲ¶ŁŲ©"
+
+msgid "Change favorites"
+msgstr "ŲŖŲŗŁŁŲ± Ų§ŁŁ
ŁŲ¶ŁŲ©"
+
+msgid "Search a room"
+msgstr "Ų„Ų®ŲŖŲ± ŲŗŲ±ŁŲ©"
+
+msgid "Select a favorite"
+msgstr "Ų„Ų®ŲŖŲ± Ł
ŁŲ¶ŁŲ©"
+
+msgid "Getting the name..."
+msgstr "Ų§ŁŲŲµŁŁ Ų¹ŁŁ Ų„Ų³Ł
"
+
+msgid "Gateway"
+msgstr "ŲØŁŲ§ŲØŲ©"
+
+msgid "Name"
+msgstr "Ų§ŁŲ„Ų³Ł
"
+
+msgid "Room"
+msgstr "ŲŗŲ±ŁŲ©"
+
+msgid "Add"
+msgstr "Ų„Ų¶Ų§ŁŲ©"
+
+msgid "Edit"
+msgstr "ŲŖŲŲ±ŁŲ±"
+
+msgid "Search a room on"
+msgstr "ŁŲØŲŲ« Ų¹Ł ŲŗŲ±ŁŲ©"
+
+msgid "No room found on this server."
+msgstr "ŁŲ§ ŲŖŁŲ¬ŲÆ ŲŗŲ±ŁŲ© Ų¹ŁŁ ŁŲ°Ų§ Ų§ŁŲ®Ų§ŲÆŁ
."
+
+msgid "Service discovery"
+msgstr "Ų§Ų³ŲŖŁŲ“Ų§Ł Ų§ŁŲ®ŲÆŁ
Ų©"
+
+msgid "Server to query"
+msgstr "Ų®Ų§ŲÆŁ
ŁŁŲ„Ų³ŲŖŲ¹ŁŲ§Ł
"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr ""
+
+msgid "Accounts"
+msgstr "ŲŲ³Ų§ŲØŲ§ŲŖ"
+
+msgid "Authentications"
+msgstr "Ł
ŲµŲ§ŲÆŁŲ©"
+
+msgid "Automation"
+msgstr "ŲŖŲ“ŲŗŁŁ Ų¢ŁŁ"
+
+msgid "Clients"
+msgstr "Ų¹Ł
ŁŲ§Ų”"
+
+msgid "Collaboration"
+msgstr "Ų„Ų“ŲŖŲ±Ų§Ł"
+
+msgid "Components"
+msgstr "Ł
ŲŲŖŁŁŲ§ŲŖ"
+
+msgid "Rooms"
+msgstr "ŲŗŲ±Ł"
+
+msgid "Directories"
+msgstr ""
+
+msgid "Gateways"
+msgstr ""
+
+msgid "News"
+msgstr ""
+
+msgid "Hierarchy"
+msgstr ""
+
+msgid "Proxies"
+msgstr ""
+
+msgid "Publication/Subscription"
+msgstr ""
+
+msgid "Storage"
+msgstr ""
+
+msgid "Service offline or broken"
+msgstr ""
+
+msgid "Your inbox"
+msgstr "ŲØŲ±ŁŲÆŁ Ų§ŁŁŲ§Ų±ŲÆ"
+
+msgid "Available actions"
+msgstr ""
+
+msgid "Clean"
+msgstr ""
+
+msgid "New"
+msgstr "Ų¬ŲÆŁŲÆ"
+
+msgid "Received"
+msgstr ""
+
+msgid "Subject"
+msgstr "Ł
ŁŲ¶ŁŲ¹"
+
+msgid "Content"
+msgstr "Ł
ŲŲŖŁŁ"
+
+msgid "Send message"
+msgstr "Ų£Ų±Ų³Ł Ų±Ų³Ų§ŁŲ©"
+
+msgid "Your inbox is empty."
+msgstr "ŲØŲ±ŁŲÆŁ Ų§ŁŁŲ§Ų±ŲÆ ŁŲ§Ų±Ųŗ"
+
+msgid "MUC administration"
+msgstr ""
+
+msgid "You administrate this room"
+msgstr "Ų£ŁŲŖ ŲŖŲÆŁŲ± ŁŲ°Ł Ų§ŁŲŗŲ±ŁŲ©"
+
+msgid "Enter new subject"
+msgstr "ŁŁ
ŲØŲ§ŲÆŲ®Ų§Ł Ł
ŁŲ¶ŁŲ¹ Ų¬ŲÆŁŲÆ"
+
+msgid "Configuration"
+msgstr ""
+
+msgid "Authorizations"
+msgstr ""
+
+msgid "Member list"
+msgstr ""
+
+msgid "Owner list"
+msgstr ""
+
+msgid "Administrator list"
+msgstr ""
+
+msgid "Outcast list"
+msgstr ""
+
+msgid "Add an input"
+msgstr ""
+
+msgid "Destroy this MUC"
+msgstr ""
+
+msgid "Yes, let's do it!"
+msgstr ""
+
+msgid "Your friend is paying attention to the conversation."
+msgstr "ŲµŲÆŁŁŁ ŁŲ¹ŁŲ± Ų§ŁŲŖŁ
Ų§Ł
Ų§ ŁŁŁ
ŲŲ§ŲÆŲ«Ų©"
+
+msgid "Your friend is writing a message..."
+msgstr ""
+
+msgid "Your friend stopped writing a message."
+msgstr ""
+
+msgid "Your friend is doing something else."
+msgstr ""
+
+msgid "Your friend closed the chat."
+msgstr ""
+
+msgid "Requesting this service..."
+msgstr ""
+
+msgid "Loading"
+msgstr ""
+
+msgid "joined the chat room"
+msgstr ""
+
+msgid "left the chat room"
+msgstr ""
+
+msgid "no status"
+msgstr ""
+
+msgid "has been kicked"
+msgstr ""
+
+msgid "has been banned"
+msgstr ""
+
+msgid "no reason"
+msgstr ""
+
+msgid "Communicate with the entire world!"
+msgstr ""
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr ""
+
+msgid "Hi there!"
+msgstr ""
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr ""
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr ""
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr ""
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr ""
+
+msgid "Previous"
+msgstr ""
+
+msgid "General"
+msgstr ""
+
+msgid "Advanced"
+msgstr ""
+
+msgid "Resource"
+msgstr ""
+
+msgid "Priority"
+msgstr ""
+
+msgid "Low"
+msgstr ""
+
+msgid "Medium"
+msgstr ""
+
+msgid "High"
+msgstr ""
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr ""
+
+msgid "login page"
+msgstr ""
+
+msgid "Share this link with your friends:"
+msgstr ""
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr ""
+
+msgid "Required"
+msgstr ""
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr ""
+
+msgid "Manager"
+msgstr ""
+
+msgid "Project"
+msgstr ""
+
+msgid "Encrypted"
+msgstr ""
+
+msgid "Unencrypted"
+msgstr ""
+
+msgid "Where are you?"
+msgstr ""
+
+msgid "What's up with you?"
+msgstr ""
+
+msgid "Fetching the social channel..."
+msgstr ""
+
+msgid "You are synchronized with your network."
+msgstr ""
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr ""
+
+msgid "Media viewer"
+msgstr ""
+
+msgid "Browse"
+msgstr ""
+
+msgid "Command"
+msgstr ""
+
+msgid "Subscribe"
+msgstr ""
+
+msgid "Join"
+msgstr ""
+
+msgid "Automatic"
+msgstr ""
+
+msgid "Search"
+msgstr ""
+
+msgid "No result!"
+msgstr ""
+
+msgid "No notifications."
+msgstr ""
+
+msgid "would like to add you as a friend."
+msgstr ""
+
+msgid "would like you to join this chatroom:"
+msgstr ""
+
+msgid "Do you accept?"
+msgstr ""
+
+msgid "Yes"
+msgstr ""
+
+msgid "No"
+msgstr ""
+
+msgid "would like to get authorization."
+msgstr ""
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
+msgid "Client"
+msgstr ""
+
+msgid "System"
+msgstr ""
+
+msgid "Local time"
+msgstr ""
+
+msgid "Comments"
+msgstr ""
+
+msgid "User profile"
+msgstr ""
+
+msgid "See his/her position on the globe"
+msgstr ""
+
+msgid "Confirm"
+msgstr ""
+
+msgid "anonymous mode"
+msgstr ""
+
+msgid "Groups"
+msgstr ""
+
+msgid "Unclassified"
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Ask for authorization"
+msgstr ""
+
+msgid "Unblock"
+msgstr ""
+
+msgid "Prohibit"
+msgstr ""
+
+msgid "Block"
+msgstr ""
+
+msgid "Chat"
+msgstr ""
+
+msgid "Groupchat"
+msgstr ""
+
+msgid "Jappix Mobile"
+msgstr ""
+
+msgid "Desktop"
+msgstr ""
+
+msgid "Mobile"
+msgstr ""
+
+msgid "Please wait..."
+msgstr ""
+
+msgid "Please enable JavaScript"
+msgstr ""
+
+msgid "Your channel"
+msgstr ""
+
+msgid "Channel of"
+msgstr ""
+
+msgid "More notices..."
+msgstr ""
+
+msgid "Attach a file"
+msgstr ""
+
+msgid "Send"
+msgstr ""
+
+msgid "Unattach the file"
+msgstr ""
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr ""
+
+msgid "Authorization failed"
+msgstr ""
+
+msgid "Registration failed, please choose a different username"
+msgstr ""
+
+msgid "Service unavailable"
+msgstr ""
+
+msgid "Internal server error, try later"
+msgstr ""
+
+msgid "Your form has been sent."
+msgstr ""
+
+msgid "Application"
+msgstr ""
+
+msgid "XMPP links"
+msgstr ""
+
+msgid "Open XMPP links with Jappix"
+msgstr ""
+
+msgid "changed the subject to:"
+msgstr ""
+
+msgid "Welcome!"
+msgstr ""
+
+msgid "Friends"
+msgstr ""
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr ""
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr ""
+
+msgid "Enable notification sounds"
+msgstr ""
+
+msgid "Share your position on the globe"
+msgstr ""
+
+msgid "Offline friends"
+msgstr ""
+
+msgid "Don't hide offline friends"
+msgstr ""
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr ""
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr ""
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr ""
+
+msgid "Share Jappix on %s"
+msgstr ""
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr ""
+
+msgid "Unknown name"
+msgstr ""
+
+msgid "Unknown country"
+msgstr ""
+
+msgid "Click to enable"
+msgstr ""
+
+msgid "Click to disable"
+msgstr ""
+
+msgid "Installation"
+msgstr ""
+
+msgid "Jappix installation"
+msgstr ""
+
+msgid "Welcome to the Jappix installation!"
+msgstr ""
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr ""
+
+msgid "Let's have a look at the installation steps:"
+msgstr ""
+
+msgid "Welcome"
+msgstr "Ł
Ų±ŲŲØŲ§Ł"
+
+msgid "Storage configuration"
+msgstr ""
+
+msgid "Administrator account"
+msgstr "ŲŲ³Ų§ŲØ Ų§ŁŁ
ŲÆŁŲ±"
+
+msgid "Main configuration"
+msgstr ""
+
+msgid "Hosts configuration"
+msgstr ""
+
+msgid "Services installation"
+msgstr ""
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr ""
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr ""
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr ""
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr ""
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr ""
+
+msgid "The folder is writable, you can continue!"
+msgstr ""
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr ""
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr ""
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr ""
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr ""
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr ""
+
+msgid "User"
+msgstr ""
+
+msgid "Service"
+msgstr ""
+
+msgid "Service name"
+msgstr ""
+
+msgid "Service description"
+msgstr ""
+
+msgid "Connection"
+msgstr ""
+
+msgid "Lock the host"
+msgstr ""
+
+msgid "Anonymous mode"
+msgstr ""
+
+msgid "Registration allowed"
+msgstr ""
+
+msgid "Use a proxy"
+msgstr ""
+
+msgid "Encryption"
+msgstr ""
+
+msgid "HTTPS storage"
+msgstr ""
+
+msgid "Force HTTPS"
+msgstr ""
+
+msgid "Compression"
+msgstr ""
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr ""
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr ""
+
+msgid "Main host"
+msgstr ""
+
+msgid "Groupchat host"
+msgstr ""
+
+msgid "Anonymous host"
+msgstr ""
+
+msgid "Directory host"
+msgstr ""
+
+msgid "BOSH host"
+msgstr ""
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr ""
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr ""
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr ""
+
+msgid "Thanks for using Jappix!"
+msgstr ""
+
+msgid "Next"
+msgstr ""
+
+msgid "Finish"
+msgstr ""
+
+msgid "Check again"
+msgstr ""
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr ""
+
+msgid "%s is installed on your system."
+msgstr ""
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr ""
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr ""
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr ""
+
+msgid "Jappix manager"
+msgstr ""
+
+msgid "Manager access"
+msgstr ""
+
+msgid "Statistics"
+msgstr ""
+
+msgid "Hosts"
+msgstr ""
+
+msgid "Design"
+msgstr ""
+
+msgid "Repeat"
+msgstr ""
+
+msgid "All"
+msgstr ""
+
+msgid "Horizontal"
+msgstr ""
+
+msgid "Vertical"
+msgstr ""
+
+msgid "Center"
+msgstr ""
+
+msgid "Left"
+msgstr ""
+
+msgid "Right"
+msgstr ""
+
+msgid "Top"
+msgstr ""
+
+msgid "Bottom"
+msgstr ""
+
+msgid "Adapt"
+msgstr ""
+
+msgid "Color"
+msgstr ""
+
+msgid "Users"
+msgstr ""
+
+msgid "Updates"
+msgstr ""
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr ""
+
+msgid "Please use the form below to login to the administration panel."
+msgstr ""
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr ""
+
+msgid "Credentials"
+msgstr ""
+
+msgid "You have been logged out. Goodbye!"
+msgstr ""
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr ""
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr ""
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr ""
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr ""
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr ""
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr ""
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr ""
+
+msgid "The image could not be received, would you mind retry?"
+msgstr ""
+
+msgid "Your image was added to the list!"
+msgstr ""
+
+msgid "Changes saved!"
+msgstr ""
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr ""
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr ""
+
+msgid "Access statistics"
+msgstr ""
+
+msgid "Share statistics"
+msgstr ""
+
+msgid "Other statistics"
+msgstr ""
+
+msgid "January"
+msgstr ""
+
+msgid "February"
+msgstr ""
+
+msgid "March"
+msgstr ""
+
+msgid "April"
+msgstr ""
+
+msgid "May"
+msgstr ""
+
+msgid "June"
+msgstr ""
+
+msgid "July"
+msgstr ""
+
+msgid "August"
+msgstr ""
+
+msgid "September"
+msgstr ""
+
+msgid "October"
+msgstr ""
+
+msgid "November"
+msgstr ""
+
+msgid "December"
+msgstr ""
+
+msgid "Monday"
+msgstr ""
+
+msgid "Tuesday"
+msgstr ""
+
+msgid "Wednesday"
+msgstr ""
+
+msgid "Thursday"
+msgstr ""
+
+msgid "Friday"
+msgstr ""
+
+msgid "Saturday"
+msgstr ""
+
+msgid "Sunday"
+msgstr ""
+
+msgid "Total"
+msgstr ""
+
+msgid "Cache"
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Music"
+msgstr ""
+
+msgid "Backgrounds"
+msgstr ""
+
+msgid "Share"
+msgstr ""
+
+msgid "Background"
+msgstr ""
+
+msgid "Notice"
+msgstr ""
+
+msgid "Your design preferences have been saved!"
+msgstr ""
+
+msgid "Please check your inputs: something is missing!"
+msgstr ""
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr ""
+
+msgid "Use default background"
+msgstr ""
+
+msgid "Use your own image"
+msgstr ""
+
+msgid "Select a background to use and change the display options."
+msgstr ""
+
+msgid "Use your own color"
+msgstr ""
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr ""
+
+msgid "Manage backgrounds"
+msgstr ""
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr ""
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr ""
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr ""
+
+msgid "Simple notice"
+msgstr ""
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr ""
+
+msgid "Advanced notice"
+msgstr ""
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr ""
+
+msgid "Available updates"
+msgstr ""
+
+msgid "What's new?"
+msgstr ""
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr ""
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr ""
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr ""
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr ""
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr ""
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr ""
+
+msgid "Check for updates"
+msgstr ""
+
+msgid "Update in progress"
+msgstr ""
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr ""
+
+msgid "The update has failed! Please try again later."
+msgstr ""
+
+msgid "Downloading package..."
+msgstr ""
+
+msgid "Removing current Jappix system files..."
+msgstr ""
+
+msgid "Extracting package..."
+msgstr ""
+
+msgid "Regenerating storage folder tree..."
+msgstr ""
+
+msgid "Jappix is now up to date!"
+msgstr ""
+
+msgid "Aborted: socket error!"
+msgstr ""
+
+msgid "Aborted: buffer error!"
+msgstr ""
+
+msgid "Aborted: everything is not writable!"
+msgstr ""
+
+msgid "Aborted: could not extract the package!"
+msgstr ""
+
+msgid "Visits"
+msgstr ""
+
+msgid "Daily"
+msgstr ""
+
+msgid "Weekly"
+msgstr ""
+
+msgid "Monthly"
+msgstr ""
+
+msgid "Yearly"
+msgstr ""
+
+msgid "Size"
+msgstr ""
+
+msgid "Clean everything"
+msgstr ""
+
+msgid "Purge cache"
+msgstr ""
+
+msgid "Purge logs"
+msgstr ""
+
+msgid "Purge updates"
+msgstr ""
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr ""
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr ""
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr ""
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr ""
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr ""
+
+msgid "Title"
+msgstr ""
+
+msgid "Artist"
+msgstr ""
+
+msgid "Album"
+msgstr ""
+
+msgid "File"
+msgstr ""
+
+msgid "Upload"
+msgstr ""
+
+msgid "The folder is empty."
+msgstr ""
+
+msgid "The music could not be received, please retry!"
+msgstr ""
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr ""
+
+msgid "Your music has been added!"
+msgstr ""
+
+msgid "The selected elements have been removed."
+msgstr ""
+
+msgid "You must select elements to remove!"
+msgstr ""
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr ""
+
+msgid "Manage"
+msgstr ""
+
+msgid "List"
+msgstr ""
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr ""
+
+msgid "The user has been added!"
+msgstr ""
+
+msgid "The chosen users have been removed."
+msgstr ""
+
+msgid "You must select one or more users to be removed!"
+msgstr ""
+
+msgid "Yesterday"
+msgstr ""
+
+msgid "%s days ago"
+msgstr ""
+
+msgid "User currently active"
+msgstr ""
+
+msgid "Last seen: %s"
+msgstr ""
+
+msgid "Inactive since: %s"
+msgstr ""
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr ""
+
+msgid "Static content server"
+msgstr ""
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Suggested friends"
+msgstr ""
+
+msgid "Check all"
+msgstr ""
+
+msgid "Uncheck all"
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "List name"
+msgstr ""
+
+msgid "Allow"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
+msgid "Group"
+msgstr ""
+
+msgid "Subscription"
+msgstr ""
+
+msgid "Both"
+msgstr ""
+
+msgid "From"
+msgstr ""
+
+msgid "Everybody"
+msgstr ""
+
+msgid "Send messages"
+msgstr ""
+
+msgid "Send queries"
+msgstr ""
+
+msgid "See my status"
+msgstr ""
+
+msgid "Send his/her status"
+msgstr ""
+
+msgid "Everything"
+msgstr ""
+
+msgid "Item"
+msgstr ""
+
+msgid "Order"
+msgstr ""
+
+msgid "Active for this session"
+msgstr ""
+
+msgid "Always active"
+msgstr ""
+
+msgid "User directory"
+msgstr ""
+
+msgid "Search a friend"
+msgstr ""
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr ""
+
+msgid "This is a repeat from %s"
+msgstr ""
+
+msgid "Loading comments..."
+msgstr ""
+
+msgid "Type your comment here..."
+msgstr ""
+
+msgid "Could not get the comments!"
+msgstr ""
+
+msgid "Show comments"
+msgstr ""
+
+msgid "Send him/her a message"
+msgstr ""
+
+msgid "Start a chat with him/her"
+msgstr ""
+
+msgid "Media integration"
+msgstr ""
+
+msgid "Comments locked!"
+msgstr ""
+
+msgid "Type something you want to share with your friends..."
+msgstr ""
+
+msgid "changed his/her nickname to %s"
+msgstr ""
+
+msgid "commented an item you follow: ā%sā."
+msgstr ""
+
+msgid "Hide"
+msgstr ""
+
+msgid "liked your post: ā%sā."
+msgstr ""
+
+msgid "quoted you somewhere: ā%sā."
+msgstr ""
+
+msgid "published on your wall: ā%sā."
+msgstr ""
+
+msgid "tagged you in a photo (%s)."
+msgstr ""
+
+msgid "tagged you in a video (%s)."
+msgstr ""
+
+msgid "Show"
+msgstr ""
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr ""
+
+msgid "Pubsub host"
+msgstr ""
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr ""
+
+msgid "Manager link"
+msgstr ""
+
+msgid "User uploads server"
+msgstr ""
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Logo"
+msgstr ""
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr ""
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr ""
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr ""
+
+msgid "Your service logo has been successfully changed!"
+msgstr ""
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr ""
+
+msgid "Remove this logo"
+msgstr ""
+
+msgid "View this logo"
+msgstr ""
+
+msgid "Send a file"
+msgstr ""
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr ""
+
+msgid "Groupchats to join"
+msgstr ""
+
+msgid "Purge sent files"
+msgstr ""
+
+msgid "would like to send you a file: ā%sā."
+msgstr ""
+
+msgid "has accepted to received your file: ā%sā."
+msgstr ""
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr ""
+
+msgid "could not receive your file: ā%sā."
+msgstr ""
+
+msgid "has received a file exchange request: ā%sā."
+msgstr ""
+
+msgid "Available shortcuts:"
+msgstr ""
+
+msgid "%s removes the chat logs"
+msgstr ""
+
+msgid "%s joins a groupchat"
+msgstr ""
+
+msgid "%s closes the chat"
+msgstr ""
+
+msgid "%s shows the user profile"
+msgstr ""
+
+msgid "%s sends a message to the room"
+msgstr ""
+
+msgid "%s changes your nickname"
+msgstr ""
+
+msgid "%s sends a message to someone in the room"
+msgstr ""
+
+msgid "%s changes the room topic"
+msgstr ""
+
+msgid "%s kicks an user of the room"
+msgstr ""
+
+msgid "%s bans an user of the room"
+msgstr ""
+
+msgid "%s invites someone to join the room"
+msgstr ""
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr ""
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# Bulgarian translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:25+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "JavaScript Š½Š° Š²Š°ŃŠøŃ Š±ŃŠ°ŃŠ·ŃŃ Š»ŠøŠæŃŠ²Š° ŠøŠ»Šø Š½Šµ Šµ Š²ŠŗŠ»ŃŃŠµŠ½, ŠæŠ¾ŃŠ°Š“Šø ŠŗŠ¾ŠµŃŠ¾ Š½ŃŠ¼Š° Š“Š° Š¼Š¾Š¶ŠµŃŠµ Š“Š° Š·Š°ŃŠµŠ“ŠøŃŠµ Šø ŃŃŠ°ŃŃŠøŃŠ°ŃŠµ Jappix! ŠŠ¾Š»Ń, ŠæŠ¾ŠæŃŠ°Š²ŠµŃŠµ/ŠæŃŠ¾Š¼ŠµŠ½ŠµŃŠµ ŃŠ¾Š²Š°."
+
+msgid "An open social network"
+msgstr "Š¾ŃŠ²Š¾ŃŠµŠ½Š° ŃŠ¾ŃŠøŠ°Š»Š½Š° Š¼ŃŠµŠ¶Š°"
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "Jappix Š±ŠµŃŠµ ŠæŃŠµŠŗŃŃŠ½Š°Ń Š¾Ń Š¼ŃŠµŠ¶Š¾Š²Šø ŠæŃŠ¾Š±Š»ŠµŠ¼, Š±ŃŠ³/Š±ŃŠ±Š¾Š»ŠµŃŠŗŠ° (Š³ŃŠµŃŠŗŠ° Š² ŠŗŠ¾Š“Š° Š½Š° ŠæŃŠ¾Š³ŃŠ°Š¼Š°ŃŠ°) ŠøŠ»Šø Š»Š¾ŃŠ¾ Š²ŃŠ²ŠµŠ“ŠµŠ½Šø Š“Š°Š½Š½Šø Š·Š° Š²Ń
Š¾Š“ (login) (ŠæŃŠ¾Š²ŠµŃŠµŃŠµ Š“Š°Š»Šø ŃŃŠµ Š²ŃŠ²ŠµŠ»Šø ŠæŃŠ°Š²ŠøŠ»Š½Š¾ ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠøŃŠµ ŃŠø Š“Š°Š½Š½Šø Š·Š° Š²Ń
Š¾Š“), ŠøŠ·Š²ŠøŠ½ŠµŃŠµ Š·Š° Š½ŠµŃŠ“Š¾Š±ŃŃŠ²Š¾ŃŠ¾."
+
+msgid "The element list on this server could not be obtained!"
+msgstr "Š”ŠæŠøŃŃŠŗŃŃ Ń ŠµŠ»ŠµŠ¼ŠµŠ½ŃŠø Š½Š°/Š¾Ń ŃŠ¾Š·Šø ŃŃŃŠ²ŃŃ Š½Šµ Š¼Š¾Š¶Š° Š“Š° Š±ŃŠ“Šµ ŠæŠ¾Š»ŃŃŠµŠ½!"
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "ŠŠ°ŃŠ¾Š»Š°ŃŠ° Š²Šø Šµ ŠæŃŠ¾Š¼ŠµŠ½ŠµŠ½Š°, ŃŠµŠ³Š° Š¼Š¾Š¶ŠµŃŠµ Š“Š° ŃŠµ ŃŠ²ŃŃŠ¶ŠµŃŠµ ŃŃŃ ŃŠ²Š¾ŃŃŠ° ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠ° ŃŠ¼ŠµŃŠŗŠ° (Š°ŠŗŠ°ŃŠ½Ń) Ń Š½Š¾Š²ŠøŃŠµ ŃŠø ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠø Š“Š°Š½Š½Šø Š·Š° Š²Ń
Š¾Š“."
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "ŠŠ°ŃŠ°ŃŠ° ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠ° ŃŠ¼ŠµŃŠŗŠ° (Š°ŠŗŠ°ŃŠ½Ń) Š² XMPP Šµ ŠæŃŠµŠ¼Š°Ń
Š½Š°ŃŠ°/ŠøŠ·ŃŃŠøŃŠ°, Š“Š¾Š²ŠøŠ¶Š“Š°Š½Šµ!"
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "ŠŠ·Š»ŃŠ·Š¾Ń
ŃŠµ Š¾Ń ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠ°ŃŠ° ŃŠø ŃŠ¼ŠµŃŠŗŠ° (Š°ŠŗŠ°ŃŠ½Ń) Š² XMPP, ŠæŃŠøŃŃŠµŠ½ Š“ŠµŠ½!"
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "Š”ŃŠ°ŃŃŠ°, Š² ŠŗŠ¾ŃŃŠ¾ Š²Š»ŃŠ·Š¾Ń
ŃŠµ, ŠøŠ·Š³Š»ŠµŠ¶Š“Š° Š½Šµ ŃŃŃŠµŃŃŠ²ŃŠ²Š°. ŠŠø ŃŃŃŠ±Š²Š°Š»Š¾ Š“Š° Ń ŃŃŠ·Š“Š°Š“ŠµŃŠµ ŃŠ°Š¼Šø!"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "ŠŃŃŠæŠ¾Š²ŠøŃŃ ŃŠ°Ń Š±ŠµŃŠµ ŠæŃŠµŠ¼Š°Ń
Š½Š°Ń, ŃŠµŠ³Š° Š½ŃŠŗŠ¾Š¹ Š“ŃŃŠ³ ŃŠµ Š¼Š¾Š¶Šµ Š“Š° Š³Š¾ Š²ŃŠ·ŃŃŠ°Š½Š¾Š²Šø (ŠæŃŠµŃŃŠ·Š“Š°Š“Šµ)."
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "ŠŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŃ, Ń ŠŗŠ¾Š³Š¾ŃŠ¾ ŃŠµ Š¾ŠæŠøŃŠ²Š°ŃŠµ Š“Š° ŃŠµ ŃŠ²ŃŃŠ¶ŠµŃŠµ, Š½Šµ Šµ Š½Š°Š»ŠøŃŠµŠ½ Š² ŃŠ°Ń ŃŃŠ°ŃŃŠ°."
+
+msgid "Please enter the group chat address to join."
+msgstr "ŠŠ¾Š»Ń, Š²ŃŠ²ŠµŠ“ŠµŃŠµ Š°Š“ŃŠµŃŠ° Š½Š° Š³ŃŃŠæŠ¾Š²ŠøŃ ŃŠ°Ń, Š·Š° Š“Š° ŃŠµ ŠæŃŠøŃŃŠµŠ“ŠøŠ½ŠøŃŠµ ŠŗŃŠ¼ Š½ŠµŠ³Š¾."
+
+msgid "Please enter your nickname to join %s."
+msgstr "ŠŠ¾Š»Ń, Š²ŃŠ²ŠµŠ“ŠµŃŠµ Š²Š°ŃŠøŃ ŠæŃŠµŠ²Š“Š¾Š½ŠøŠ¼ (nickname, ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠ¾ ŠøŠ¼Šµ), Š·Š° Š“Š° ŃŠµ ŠæŃŠøŃŃŠµŠ“ŠøŠ½ŠøŃŠµ ŠŗŃŠ¼ %s."
+
+msgid "This room (%s) is protected with a password."
+msgstr "Š¢Š°Š·Šø ŃŃŠ°ŠøŃ (%s) Šµ Š·Š°ŃŠøŃŠµŠ½Š° Ń ŠæŠ°ŃŠ¾Š»Š°."
+
+msgid "Your browser is out of date!"
+msgstr "ŠŠ·ŠæŠ¾Š»Š·Š²Š°ŃŠµ ŃŃŠ°Ń Š±ŃŠ°ŃŠ·ŃŃ. ŠŠ¾Š»Ń, Š¾Š±Š½Š¾Š²ŠµŃŠµ Š³Š¾ Š“Š¾ ŠæŠ¾-Š½Š¾Š²Š° ŃŃŠ°Š±ŠøŠ»Š½Š° Š²ŠµŃŃŠøŃ ŃŃŠµŠ· ŠŠ½ŃŠµŃŠ½ŠµŃ, ŠøŠ»Šø Š³Š¾ ŃŠ¼ŠµŠ½ŠµŃŠµ Ń Š“ŃŃŠ³."
+
+msgid "Last %s version is better!"
+msgstr "ŠŠ¾ŃŠ»ŠµŠ“Š½Š°ŃŠ° %s Š²ŠµŃŃŠøŃ Šµ ŠæŠ¾-Š“Š¾Š±ŃŠ°!"
+
+msgid "Login"
+msgstr "ŠŃ
Š¾Š“"
+
+msgid "Register"
+msgstr "Š ŠµŠ³ŠøŃŃŃŠ°ŃŠøŃ"
+
+msgid "Here we go!"
+msgstr "Š„Š°Š¹Š“Šµ!"
+
+msgid "Server"
+msgstr "Š”ŃŃŠ²ŃŃ"
+
+msgid "Password"
+msgstr "ŠŠ°ŃŠ¾Š»Š°"
+
+msgid "Remember me"
+msgstr "ŠŠ°ŠæŠ¾Š¼Š½ŃŠ½Šµ"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "Š¢Š¾Š·Šø ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½Ń (ŃŠ°Š·Šø Š²ŃŠ·Š¼Š¾Š¶Š½Š¾ŃŃ) Šµ ŠøŠ·ŠŗŠ»ŃŃŠµŠ½Š°, Š½Šµ Š¼Š¾Š¶ŠµŃŠµ Š“Š° Ń ŠæŠ¾Š»Š·Š²Š°ŃŠµ!"
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "ŠŠ¾ŃŠ°Š“Šø Š¼ŃŠµŠ¶Š¾Š²Š° Š³ŃŠµŃŠŗŠ° Š²ŃŃŠ·ŠŗŠ°ŃŠ° Š±ŠµŃŠµ ŠæŃŠµŠŗŃŃŠ½Š°ŃŠ°. ŠŠ°ŠŗŠ²Š¾ ŠøŃŠŗŠ°ŃŠµ Š“Š° Š½Š°ŠæŃŠ°Š²ŠøŃŠµ ŃŠµŠ³Š°?"
+
+msgid "Reconnect"
+msgstr "ŠŃŠ·Š²ŃŃŃŠ°Š½Šµ Š½Š° Š²ŃŃŠ·ŠŗŠ°ŃŠ°"
+
+msgid "Messages"
+msgstr "Š”ŃŠ¾Š±ŃŠµŠ½ŠøŃ"
+
+msgid "Profile"
+msgstr "ŠŃŠ¾ŃŠøŠ»"
+
+msgid "Options"
+msgstr "ŠŠ°ŃŃŃŠ¾Š¹ŠŗŠø"
+
+msgid "Disconnect"
+msgstr "ŠŠ·ŠŗŠ»ŃŃŠ²Š°Š½Šµ/ŠæŃŠµŠŗŃŃŠ²Š°Š½Šµ Š½Š° Š²ŃŃŠ·ŠŗŠ°ŃŠ°"
+
+msgid "Filter"
+msgstr "Š¤ŠøŠ»ŃŃŃ"
+
+msgid "Add a friend"
+msgstr "ŠŠ¾Š±ŃŠ²Š°Š½Šµ Š½Š° ŠæŃŠøŃŃŠµŠ»"
+
+msgid "Your groupchats"
+msgstr "ŠŠ°ŃŠøŃŠµ Š³ŃŃŠæŠ¾Š²Šø ŃŠ°ŃŠ¾Š²Šµ"
+
+msgid "Manage your favorite groupchats"
+msgstr "Š£ŠæŃŠ°Š²Š»ŠµŠ½ŠøŠµ Š½Š° Š»ŃŠ±ŠøŠ¼ŠøŃŠµ Š²Šø Š³ŃŃŠæŠ¾Š²Šø ŃŠ°ŃŠ¾Š²Šµ"
+
+msgid "More stuff"
+msgstr "ŠŃŠµ Š½ŠµŃŠ°"
+
+msgid "Show all friends"
+msgstr "ŠŠ¾ŠŗŠ°Š·Š²Š°Š½Šµ Š½Š° Š²ŃŠøŃŠŗŠø ŠæŃŠøŃŃŠµŠ»Šø"
+
+msgid "Only show connected friends"
+msgstr "ŠŠ¾ŠŗŠ°Š·Š²Š°Š½Šµ ŃŠ°Š¼Š¾ Š½Š° ŃŠ²ŃŃŠ·Š°Š½ŠøŃŠµ ŠæŃŠøŃŃŠµŠ»Šø"
+
+msgid "Message archives"
+msgstr "ŠŃŃ
ŠøŠ² Š½Š° ŃŃŠ¾Š±ŃŠµŠ½ŠøŃŃŠ°"
+
+msgid "Date"
+msgstr "ŠŠ°ŃŠ°"
+
+msgid "Please select a friend to view the chat history."
+msgstr "ŠŠ¾Š»Ń, ŠøŠ·Š±ŠµŃŠµŃŠµ ŠæŃŠøŃŃŠµŠ», Š·Š° Š“Š° Š²ŠøŠ“ŠøŃŠµ ŠøŃŃŠ¾ŃŠøŃŃŠ° Š½Š° ŃŠ°ŃŠ° (Š°ŃŃ
ŠøŠ²Š° Š½Š° ŃŃŠ¾Š±ŃŠµŠ½ŠøŃŃŠ°)."
+
+msgid "Nothing found for: %s"
+msgstr "ŠŠµ Šµ Š½Š°Š¼ŠµŃŠµŠ½Š¾ Š½ŠøŃŠ¾ Š·Š°/Š¾ŃŠ½Š¾ŃŠ½Š¾: %s"
+
+msgid "A short message?"
+msgstr "ŠŃŠ°ŃŠŗŠ¾ ŃŃŠ¾Š±ŃŠµŠ½ŠøŠµ?"
+
+msgid "How are you?"
+msgstr "ŠŠ°Šŗ ŃŃŠµ?"
+
+msgid "What are you doing?"
+msgstr "ŠŠ°ŠŗŠ²Š¾ ŠæŃŠ°Š²ŠøŃŠµ? ŠŠ°Šŗ ŃŃŠµ?"
+
+msgid "Join a chat"
+msgstr "ŠŃŠøŃŃŠµŠ“ŠøŠ½ŃŠ²Š°Š½Šµ ŠŗŃŠ¼ ŃŠ°Ń"
+
+msgid "Status"
+msgstr "Š”ŃŠ°ŃŃŃ"
+
+msgid "Available"
+msgstr "ŠŠ° ŃŠ°Š·ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµ (Š¾Š½Š»Š°Š¹Š½)"
+
+msgid "Talkative"
+msgstr "ŠŠ¾ŃŠ¾Š² Š·Š° ŃŠ°Š·Š³Š¾Š²Š¾ŃŠø"
+
+msgid "Away"
+msgstr "Š¾ŃŃŃŃŃŠ²Š°Ń"
+
+msgid "Not available"
+msgstr "Š½Šµ Šµ Š½Š° ŃŠ°Š·ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµ"
+
+msgid "Busy"
+msgstr "Š·Š°ŠµŃ"
+
+msgid "Mood"
+msgstr "ŠŠ°ŃŃŃŠ¾ŠµŠ½ŠøŠµ"
+
+msgid "None"
+msgstr "(Š±ŠµŠ·)"
+
+msgid "Crazy"
+msgstr "Š»ŃŠ“"
+
+msgid "Excited"
+msgstr "ŃŠ°Š·Š²ŃŠ»Š½ŃŠ²Š°Š½"
+
+msgid "Playful"
+msgstr "ŠøŠ³ŃŠøŠ²"
+
+msgid "Happy"
+msgstr "ŃŠ°ŃŃŠ»ŠøŠ²/Š“Š¾Š²Š¾Š»ŠµŠ½"
+
+msgid "Shocked"
+msgstr "ŃŠ¾ŠŗŠøŃŠ°Š½"
+
+msgid "Hot"
+msgstr "ŃŠ°Š·Š³Š¾ŃŠµŃŠµŠ½"
+
+msgid "Sad"
+msgstr "ŃŃŠ¶ŠµŠ½"
+
+msgid "Amorous"
+msgstr "ŃŃŠ²ŃŃŠ²ŠµŠ½/ŃŃŃŠ°ŃŃŠµŠ½/Š²Š»ŃŠ±ŃŠøŠ²"
+
+msgid "Confident"
+msgstr "ŃŠ²ŠµŃŠµŠ½"
+
+msgid "Activity"
+msgstr "Š“ŠµŠ¹Š½Š¾ŃŃ"
+
+msgid "Chores"
+msgstr "Š·Š°Š“ŃŠ»Š¶ŠµŠ½ŠøŃ"
+
+msgid "Drinking"
+msgstr "ŠæŠøŠµŠ½Šµ"
+
+msgid "Eating"
+msgstr "ŃŠ“ŠµŠ½Šµ"
+
+msgid "Exercising"
+msgstr "ŃŠæŃŠ°Š¶Š½ŠµŠ½ŠøŃ"
+
+msgid "Grooming"
+msgstr "Š² Š¼Š¾Š¼ŠµŠ½ŃŠ° ŃŠµ ŠæŠ¾Š“ŠŗŃŠµŠæŃŠ¼/ŠæŠ¾Š“Š“ŃŃŠ¶Š°Š¼"
+
+msgid "Appointment"
+msgstr "Š½Š° ŃŃŠµŃŠ°/ŃŠ»ŃŠ¶Š±Š°"
+
+msgid "Inactive"
+msgstr "Š½ŠµŠ°ŠŗŃŠøŠ²ŠµŠ½"
+
+msgid "Relaxing"
+msgstr "ŃŠµŠ»Š°ŠŗŃŠøŃŠ°"
+
+msgid "Talking"
+msgstr "Š³Š¾Š²Š¾ŃŠø (Š² Š“ŠøŃŠŗŃŃŠøŃ)"
+
+msgid "Traveling"
+msgstr "ŠæŃŃŃŠ²Š° (Š½Š° ŠæŃŃ)"
+
+msgid "Working"
+msgstr "ŃŠ°Š±Š¾ŃŠø (Š½Š° ŃŠ°Š±Š¾ŃŠ°)"
+
+msgid "View profile"
+msgstr "ŠŃŠµŠ³Š»ŠµŠ“ Š½Š° ŠæŃŠ¾ŃŠøŠ»Š°"
+
+msgid "Repeat this notice"
+msgstr "ŠŠ¾Š²ŃŠ¾ŃŠµŠ½ŠøŠµ Š½Š° ŃŃŠ¾Š±ŃŠµŠ½ŠøŠµŃŠ¾"
+
+msgid "Remove this notice"
+msgstr "ŠŃŠµŠ¼Š°Ń
Š²Š°Š½Šµ Š½Š° ŃŃŠ¾Š±ŃŠµŠ½ŠøŠµŃŠ¾"
+
+msgid "Your profile"
+msgstr "ŠŠ°ŃŠøŃŃ ŠæŃŠ¾ŃŠøŠ»"
+
+msgid "Identity"
+msgstr "ŠŠ“ŠµŠ½ŃŠøŃŠ½Š¾ŃŃ"
+
+msgid "Profile image"
+msgstr "ŠŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµ Š·Š° ŠæŃŠ¾ŃŠøŠ»Š°"
+
+msgid "Others"
+msgstr "ŠŃŃŠ³Šø"
+
+msgid "Personal"
+msgstr "ŠŠøŃŠ½Šø"
+
+msgid "Complete name"
+msgstr "ŠŃŠ»Š½Š¾ ŠøŠ¼Šµ"
+
+msgid "Nickname"
+msgstr "ŠŃŠµŠ²Š“Š¾Š½ŠøŠ¼ (nickname)"
+
+msgid "First name"
+msgstr "ŠŃŃŠ²Š¾ ŠøŠ¼Šµ (Š»ŠøŃŠ½Š¾ ŠøŠ¼Šµ)"
+
+msgid "Last name"
+msgstr "ŠŠ¾ŃŠ»ŠµŠ“Š½Š¾ ŠøŠ¼Šµ (ŃŠ°Š¼ŠøŠ»ŠøŃ)"
+
+msgid "Date of birth"
+msgstr "ŠŠ°ŃŠ° Š½Š° ŃŠ°Š¶Š“Š°Š½Šµ"
+
+msgid "Contact"
+msgstr "ŠŠ¾Š½ŃŠ°ŠŗŃ"
+
+msgid "E-mail"
+msgstr "ŠŠ¼ŠµŠ¹Š» (Šµ-ŠæŠ¾ŃŠ°)"
+
+msgid "Phone"
+msgstr "Š¢ŠµŠ»ŠµŃŠ¾Š½"
+
+msgid "Website"
+msgstr "Š£ŠµŠ±ŃŠ°Š¹Ń"
+
+msgid "Current"
+msgstr "ŠŠ°ŃŃŠ¾ŃŃ"
+
+msgid "Delete"
+msgstr "ŠŠ·ŃŃŠøŠ²Š°Š½Šµ"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "ŠŠ¾Š»ŠŗŠ¾ Š¶Š°Š»ŠŗŠ¾! ŠŠøŠµ Š½ŃŠ¼Š°ŃŠµ Š·Š°Š“Š°Š“ŠµŠ½Š¾ ŠøŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµ Š·Š° ŠæŃŠ¾ŃŠøŠ»Š° ŃŠø Š² ŠŗŠ°ŃŃŠ°ŃŠ° ŃŠø Š·Š° ŃŠ°Š¼Š¾Š»ŠøŃŠ½Š¾ŃŃ!"
+
+msgid "Address"
+msgstr "ŠŠ“ŃŠµŃ"
+
+msgid "Street"
+msgstr "Š£Š»ŠøŃŠ°"
+
+msgid "City"
+msgstr "ŠŃŠ°Š“"
+
+msgid "Postal code"
+msgstr "ŠŠ¾ŃŠµŠ½ŃŠŗŠø ŠŗŠ¾Š“"
+
+msgid "Country"
+msgstr "Š”ŃŃŠ°Š½Š°/Š“ŃŃŠ¶Š°Š²Š°"
+
+msgid "Biography"
+msgstr "ŠŠøŠ¾Š³ŃŠ°ŃŠøŃ"
+
+msgid "Important notice"
+msgstr "ŠŠ°Š¶Š½Š¾ ŃŃŠ¾Š±ŃŠµŠ½ŠøŠµ"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr "ŠŠ½ŠøŠ¼Š°Š²Š°Š¹ŃŠµ ŠŗŠ°ŠŗŠ²Š° Šø ŠŗŠ¾Š»ŠŗŠ¾ ŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŃ Š²ŠæŠøŃŠ²Š°ŃŠµ Š² ŠæŃŠ¾ŃŠøŠ»Š° ŃŠø, Š·Š°ŃŠ¾ŃŠ¾ Šµ Š“Š¾ŃŃŃŠæŠ½Š° Š·Š° Š²ŃŠøŃŠŗŠø (Š“Š¾ŃŠø Š·Š° Ń
Š¾ŃŠ°, ŠŗŠ¾ŠøŃŠ¾ Š½Šµ ŠøŃŠŗŠ°ŃŠµ)."
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr "ŠŠµ Š²ŃŠøŃŠŗŠ¾ Šµ ŠŗŠ¾Š½ŃŠøŠ“ŠµŠ½ŃŠøŠ°Š»Š½Š¾/ŠæŠ¾Š²ŠµŃŠøŃŠµŠ»Š½Š¾ Š² XMPP; Š²Š°ŃŠøŃŃ ŠæŃŠ±Š»ŠøŃŠµŠ½ ŠæŃŠ¾ŃŠøŠ» (vCard) Šµ ŠµŠ“Š½Š¾ Š¾Ń ŃŠµŠ·Šø Š½ŠµŃŠ°."
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr ""
+
+msgid "Save"
+msgstr "ŠŠ°ŠæŠ°Š·Š²Š°Š½Šµ"
+
+msgid "Cancel"
+msgstr "ŠŃŠŗŠ°Š·"
+
+msgid "Edit options"
+msgstr "Š ŠµŠ“Š°ŠŗŃŠøŃ Š½Š° Š½Š°ŃŃŃŠ¾Š¹ŠŗŠøŃŠµ"
+
+msgid "Channel"
+msgstr "ŠŠ°Š½Š°Š»"
+
+msgid "Commands"
+msgstr "ŠŠ¾Š¼Š°Š½Š“Šø"
+
+msgid "Sounds"
+msgstr "ŠŠ²ŃŃŠø"
+
+msgid "Privacy"
+msgstr "ŠŠ¾Š²ŠµŃŠøŃŠµŠ»Š½Š¾ŃŃ"
+
+msgid "Message archiving"
+msgstr "ŠŃŃ
ŠøŠ²ŠøŃŠ°Š½Šµ Š½Š° ŃŃŠ¾Š±ŃŠµŠ½ŠøŃŃŠ°"
+
+msgid "Store a history of your chats"
+msgstr "ŠŠ°ŠæŠ°Š·Š²Š°Š½Šµ Š½Š° ŠøŃŃŠ¾ŃŠøŃ (Š²Š¾Š“ŠµŠ½Šµ Š½Š° Š°ŃŃ
ŠøŠ²) Š½Š° Š²Š°ŃŠøŃŠµ ŃŠ°ŃŠ¾Š²Šµ"
+
+msgid "Geolocation"
+msgstr "ŠŠµŠ¾Š»Š¾ŠŗŠ°ŃŠøŃ"
+
+msgid "Empty"
+msgstr "ŠŃŠ°Š·Š½Š¾"
+
+msgid "Empty channel"
+msgstr "ŠŃŠ°Š·ŠµŠ½ ŠŗŠ°Š½Š°Š»"
+
+msgid "Persistent"
+msgstr "ŠŠ°ŃŃŠ°ŠæŃŠøŠ²Š¾ŃŃ/ŠæŠ¾ŃŃŠ¾ŃŠ½ŃŃŠ²Š¾"
+
+msgid "Maximum notices"
+msgstr "ŠŠ°ŠŗŃŠøŠ¼Š°Š»ŠµŠ½ Š±ŃŠ¾Š¹ ŃŃŠ¾Š±ŃŠµŠ½ŠøŃ"
+
+msgid "Account"
+msgstr "ŠŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠ° ŃŠ¼ŠµŃŠŗŠ° (Š°ŠŗŠ°ŃŠ½Ń)"
+
+msgid "Change password"
+msgstr "ŠŃŠ¾Š¼ŃŠ½Š° Š½Š° ŠæŠ°ŃŠ¾Š»Š°ŃŠ°"
+
+msgid "Delete account"
+msgstr "ŠŠ·ŃŃŠøŠ²Š°Š½Šµ Š½Š° ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠ°ŃŠ° ŃŠ¼ŠµŃŠŗŠ° (Š°ŠŗŠ°ŃŠ½Ń)"
+
+msgid "Old"
+msgstr "Š”ŃŠ°Ń(Šø)"
+
+msgid "New (2 times)"
+msgstr "ŠŠ¾Š²(Šø) (2 ŠæŃŃŠø)"
+
+msgid "Continue"
+msgstr "ŠŃŠ¾Š“ŃŠ»Š¶Š°Š²Š°Š½Šµ"
+
+msgid "To"
+msgstr "ŠŃŠ¼/Š·Š°"
+
+msgid "Close"
+msgstr "ŠŠ°ŃŠ²Š°ŃŃŠ½Šµ"
+
+msgid "unknown"
+msgstr "Š½ŠµŠæŠ¾Š·Š½Š°Ń"
+
+msgid "Unavailable"
+msgstr "ŠŠµ Šµ Š½Š° ŃŠ°Š·ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµ (Š¾ŃŠ»Š°Š¹Š½)"
+
+msgid "is now"
+msgstr "Šµ ŃŠµŠ³Š°"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr "ŠŠ¾Š»Ń, ŠøŠ·ŃŠ°ŠŗŠ°Š¹ŃŠµ Š“Š¾ŠŗŠ°ŃŠ¾ Š°Š²Š°ŃŠ°ŃŃŃ Š²Šø ŃŠµ ŠŗŠ°ŃŠ²Š° (ŃŠæŠ»Š¾ŃŠ“Š²Š°)..."
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "ŠŃŠ¾ Š³Š¾! Š„ŃŠ±Š°Š²Š¾ Š½Š¾Š²Š¾ ŠøŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµ (Š°Š²Š°ŃŠ°Ń) Š·Š° ŠæŃŠ¾ŃŠøŠ»Š° Š²Šø!"
+
+msgid "The image file is not supported or has a bad size."
+msgstr "Š¤Š°Š¹Š»ŃŃ Š¾Ń ŃŠøŠæ ŠøŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµ Š½Šµ ŃŠµ ŠæŠ¾Š“Š“ŃŃŠ¶Š° ŠøŠ»Šø ŠøŠ¼Š° Š³ŃŠµŃŠ½Š° Š³Š¾Š»ŠµŠ¼ŠøŠ½Š°."
+
+msgid "Reply"
+msgstr "ŠŃŠ³Š¾Š²Š¾Ń"
+
+msgid "Error"
+msgstr "ŠŃŠµŃŠŗŠ°"
+
+msgid "Click here to solve the error"
+msgstr "ŠŠ°ŃŠøŃŠ½ŠµŃŠµ ŃŃŠŗ, Š·Š° Š“Š° ŠæŠ¾ŠæŃŠ°Š²ŠøŃŠµ Š³ŃŠµŃŠŗŠ°ŃŠ°"
+
+msgid "You"
+msgstr "Š¢Šø/ŠŠøŠµ"
+
+msgid "Remove"
+msgstr "ŠŃŠµŠ¼Š°Ń
Š²Š°Š½Šµ"
+
+msgid "Rename"
+msgstr "ŠŃŠµŠøŠ¼ŠµŠ½ŃŠ²Š°Š½Šµ"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "ŠŠ“ŃŠ°Š²ŠµŠ¹, Š°Š· ŃŃŠ¼ %s, Š±ŠøŃ
ŠøŃŠŗŠ°Š» Š“Š° Š²Šø Š“Š¾Š±Š°Š²Ń ŠŗŃŠ¼ Š¼Š¾Ń ŃŠæŠøŃŃŠŗ Ń ŠæŃŠøŃŃŠµŠ»Šø."
+
+msgid "Smiley insertion"
+msgstr "ŠŃŠ²ŠµŠ¶Š“Š°Š½Šµ Š½Š° ŠµŠ¼Š¾ŃŠøŠŗŠ¾Š½(Šø)"
+
+msgid "Change style"
+msgstr "ŠŃŠ¾Š¼ŃŠ½Š° Š½Š° ŃŃŠøŠ»Š°"
+
+msgid "Text in bold"
+msgstr "Š£Š“ŠµŠ±ŠµŠ»ŠµŠ½ ŃŠµŠŗŃŃ (bold)"
+
+msgid "Text in italic"
+msgstr "ŠŃŃŃŠøŠ²ŠµŠ½ ŃŠµŠŗŃŃ (italic)"
+
+msgid "Underlined text"
+msgstr "ŠŠ¾Š“ŃŠµŃŃŠ°Š½ ŃŠµŠŗŃŃ"
+
+msgid "Save chat"
+msgstr "ŠŠ°ŠæŠ°Š·Š²Š°Š½Šµ Š½Š° ŃŠ°ŃŠ°"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr "ŠŠ°ŃŠøŃŠ½ŠµŃŠµ ŃŠ»ŠµŠ“Š½Š°ŃŠ° Š²ŃŃŠ·ŠŗŠ° (Ń
ŠøŠæŠµŃŠ»ŠøŠ½Šŗ), Š·Š° Š“Š° ŠæŠ¾Š»ŃŃŠøŃŠµ ŠøŃŃŠ¾ŃŠøŃŃŠ° Š½Š° ŃŠ°ŃŠ°, ŃŠ»ŠµŠ“ ŃŠ¾Š²Š° ŠøŠ·ŃŠ°ŠŗŠ°Š¹ŃŠµ. Š”Š»ŠµŠ“ ŃŠ¾Š²Š° Š½Š°ŃŠøŃŠ½ŠµŃŠµ Š¾ŃŠ½Š¾Š²Š¾, Š·Š° Š“Š° ŠøŠ·ŃŠµŠ³Š»ŠøŃŠµ ŃŠ°Š¹Š»Š° Ń ŠøŃŃŠ¾ŃŠøŃŃŠ° Š½Š° ŃŠ°ŃŠ°."
+
+msgid "This chat is empty!"
+msgstr "Š§Š°ŃŃŃ Šµ ŠæŃŠ°Š·ŠµŠ½!"
+
+msgid "Generate file!"
+msgstr "ŠŠµŠ½ŠµŃŠøŃŠ°Š½Šµ Š½Š° ŃŠ°Š¹Š»!"
+
+msgid "Download file!"
+msgstr "ŠŠ·ŃŠµŠ³Š»ŃŠ½Šµ (Š“Š°ŃŠ½Š»Š¾ŃŠ“) Š½Š° ŃŠ°Š¹Š»!"
+
+msgid "Clean current chat"
+msgstr "ŠŠ·ŃŠøŃŃŠ²Š°Š½Šµ Š½Š° Š½Š°ŃŃŠ¾ŃŃŠøŃ ŃŠ°Ń"
+
+msgid "View chat history"
+msgstr "ŠŃŠµŠ³Š»ŠµŠ“ Š½Š° ŠøŃŃŠ¾ŃŠøŃŃŠ° Š½Š° ŃŠ°ŃŠ°"
+
+msgid "Show user profile"
+msgstr "ŠŠ¾ŠŗŠ°Š·Š²Š°Š½Šµ Š½Š° ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠøŃ ŠæŃŠ¾ŃŠøŠ»"
+
+msgid "Add this contact to your friends"
+msgstr "ŠŠ¾Š±Š°Š²ŃŠ½Šµ Š½Š° ŠŗŠ¾Š½ŃŠ°ŠŗŃŠ° ŠŗŃŠ¼ ŃŠæŠøŃŃŠŗŠ° Ń ŠæŃŠøŃŃŠµŠ»Šø"
+
+msgid "Add this groupchat to your favorites"
+msgstr "ŠŠ¾Š±Š°Š²ŃŠ½Šµ Š½Š° Š³ŃŃŠæŠ¾Š²ŠøŃ ŃŠ°Ń ŠŗŃŠ¼ ŃŠ²Š¾ŠøŃŠµ Š»ŃŠ±ŠøŠ¼Šø"
+
+msgid "All tabs"
+msgstr "ŠŃŠøŃŠŗŠø ŠæŠ¾Š“ŠæŃŠ¾Š·Š¾ŃŃŠø (ŃŠ°Š±Š¾Š²Šµ)"
+
+msgid "Close this tab"
+msgstr "ŠŠ°ŃŠ²Š°ŃŃŠ½Šµ Š½Š° ŠæŠ¾Š“ŠæŃŠ¾Š·Š¾ŃŠµŃŠ° (ŃŠ°Š±Š°)"
+
+msgid "no subject defined for this room."
+msgstr "ŠŠµ Šµ Š“ŠµŃŠøŠ½ŠøŃŠ°Š½Š° ŃŠµŠ¼Š° Š·Š° ŃŠ°Š·Šø ŃŠ°Ń ŃŃŠ°Ń."
+
+msgid "Administration panel for this room"
+msgstr "ŠŠ“Š¼ŠøŠ½ŠøŃŃŃŠ°ŃŠøŠ¾Š½ŠµŠ½ ŠæŠ°Š½ŠµŠ» Š·Š° ŃŃŠ°ŃŃŠ°"
+
+msgid "Moderators"
+msgstr "ŠŠ¾Š“ŠµŃŠ°ŃŠ¾ŃŠø"
+
+msgid "Participants"
+msgstr "Š£ŃŠ°ŃŃŠ½ŠøŃŠø"
+
+msgid "Visitors"
+msgstr "ŠŠ¾ŃŠµŃŠøŃŠµŠ»Šø"
+
+msgid "Manage favorite rooms"
+msgstr "Š£ŠæŃŠ°Š²Š»ŠµŠ½ŠøŠµ Š½Š° Š»ŃŠ±ŠøŠ¼ŠøŃŠµ ŃŃŠ°Šø"
+
+msgid "Change favorites"
+msgstr "ŠŃŠ¾Š¼ŃŠ½Š° Š½Š° Š»ŃŠ±ŠøŠ¼ŠøŃŠµ"
+
+msgid "Search a room"
+msgstr "Š¢ŃŃŃŠµŠ½Šµ ŠøŠ·/Š² ŃŃŠ°ŃŃŠ°"
+
+msgid "Select a favorite"
+msgstr "ŠŠ·Š±Š¾Ń Š½Š° Š»ŃŠ±ŠøŠ¼(Šø)"
+
+msgid "Getting the name..."
+msgstr "ŠŃŠøŃ
Š²Š°ŃŠ°Š½Šµ Š½Š° ŠøŠ¼ŠµŠ½Š°..."
+
+msgid "Gateway"
+msgstr "ŠŃŠ°ŃŠ°/Š²Ń
Š¾Š“/ŠæŃŃ"
+
+msgid "Name"
+msgstr "ŠŠ¼Šµ"
+
+msgid "Room"
+msgstr "Š”ŃŠ°Ń"
+
+msgid "Add"
+msgstr "ŠŠ¾Š±Š°Š²ŃŠ½Šµ"
+
+msgid "Edit"
+msgstr "Š ŠµŠ“Š°ŠŗŃŠøŃŠ°Š½Šµ"
+
+msgid "Search a room on"
+msgstr "ŠŠ¾ŃŃŃŃŠø ŃŃŠ°ŃŠøŃ Š¾Ń/Š²(ŃŠ²)"
+
+msgid "No room found on this server."
+msgstr "ŠŠµ ŃŠ° Š½Š°Š¼ŠµŃŠµŠ½Šø ŃŃŠ°Šø Š½Š° ŃŠ¾Š·Šø ŃŃŃŠ²ŃŃ."
+
+msgid "Service discovery"
+msgstr "ŠŃŠŗŃŠøŠ²Š°Š½Šµ Š½Š° ŃŃŠ»ŃŠ³Šø"
+
+msgid "Server to query"
+msgstr "ŠŠ°ŃŠ²ŠŗŠ° Š·Š° ŃŃŃŠ²ŃŃ"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr "Š”ŃŠ¶Š°Š»ŃŠ²Š°Š¼, Š½Š¾ ŃŃŃŃŠµŠ½ŠµŃŠ¾ Š·Š° Š¾Š±ŠµŠŗŃŠ° Š½Šµ Š²ŃŃŠ½Š° Š½ŠøŠŗŠ°ŠŗŃŠ² ŃŠµŠ·ŃŠ»ŃŠ°Ń!"
+
+msgid "Accounts"
+msgstr "ŠŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠø ŃŠ¼ŠµŃŠŗŠø (Š°ŠŗŠ°ŃŠ½ŃŠø)"
+
+msgid "Authentications"
+msgstr "Š£Š“Š¾ŃŃŠ¾Š²ŠµŃŠµŠ½ŠøŃ Š·Š° ŠøŠ“ŠµŠ½ŃŠøŃŠøŠŗŠ°ŃŠøŃ"
+
+msgid "Automation"
+msgstr "ŠŠ²ŃŠ¾Š¼Š°ŃŠøŠ·Š°ŃŠøŃ"
+
+msgid "Clients"
+msgstr "ŠŠ»ŠøŠµŠ½ŃŠø"
+
+msgid "Collaboration"
+msgstr "Š”ŃŃŃŃŠ“Š½ŠøŃŠµŃŃŠ²Š¾ (ŠŗŠ¾Š»Š°Š±Š¾ŃŠ°ŃŠøŃ)"
+
+msgid "Components"
+msgstr "ŠŠ¾Š¼ŠæŠ¾Š½ŠµŠ½ŃŠø"
+
+msgid "Rooms"
+msgstr "Š”ŃŠ°Šø"
+
+msgid "Directories"
+msgstr "ŠŠøŃŠµŠŗŃŠ¾ŃŠøŠø"
+
+msgid "Gateways"
+msgstr "ŠŃŃŠøŃŠ°/Š²Ń
Š¾Š“Š¾Š²Šµ"
+
+msgid "News"
+msgstr "ŠŠ¾Š²ŠøŠ½Šø"
+
+msgid "Hierarchy"
+msgstr "ŠŠµŃŠ°ŃŃ
ŠøŃ"
+
+msgid "Proxies"
+msgstr "ŠŃŠ¾ŠŗŃŠøŃŠ° (ŃŃŃŠ²ŃŃŠø-ŠæŠ¾ŃŃŠµŠ“Š½ŠøŃŠø)"
+
+msgid "Publication/Subscription"
+msgstr "ŠŃŠ±Š»ŠøŠŗŠ°ŃŠøŃ/ŠŠ±Š¾Š½Š°Š¼ŠµŠ½Ń"
+
+msgid "Storage"
+msgstr "Š„ŃŠ°Š½ŠøŠ»ŠøŃŠµ"
+
+msgid "Service offline or broken"
+msgstr "Š£ŃŠ»ŃŠ³Š°ŃŠ° Šµ Š¾ŃŠ»Š°Š¹Š½ (ŠøŠ·Š²ŃŠ½ Š»ŠøŠ½ŠøŃ) ŠøŠ»Šø Šµ ŃŃŃŠæŠµŠ½Š°/ŠæŠ¾Š²ŃŠµŠ“ŠµŠ½Š°"
+
+msgid "Your inbox"
+msgstr "ŠŠ°ŃŠ°ŃŠ° Š²Ń
Š¾Š“ŃŃŠ° ŠŗŃŃŠøŃ"
+
+msgid "Available actions"
+msgstr "ŠŠµŠ¹ŃŃŠ²ŠøŃ Š½Š° ŃŠ°Š·ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµ"
+
+msgid "Clean"
+msgstr "ŠŠ·ŃŠøŃŃŠ²Š°Š½Šµ"
+
+msgid "New"
+msgstr "ŠŠ¾Š²(Šø)"
+
+msgid "Received"
+msgstr "ŠŠ¾Š»ŃŃŠµŠ½(Šø)"
+
+msgid "Subject"
+msgstr "Š¢ŠµŠ¼Š°"
+
+msgid "Content"
+msgstr "Š”ŃŠ“ŃŃŠ¶Š°Š½ŠøŠµ"
+
+msgid "Send message"
+msgstr "ŠŠ·ŠæŃŠ°ŃŠ°Š½Šµ Š½Š° ŃŃŠ¾Š±ŃŠµŠ½ŠøŠµŃŠ¾"
+
+msgid "Your inbox is empty."
+msgstr "ŠŃ
Š¾Š“ŃŃŠ°ŃŠ° Š²Šø ŠŗŃŃŠøŃ Šµ ŠæŃŠ°Š·Š½Š°."
+
+msgid "MUC administration"
+msgstr "ŠŠ“Š¼ŠøŠ½ŠøŃŃŃŠ°ŃŠøŃ Š½Š° MUC"
+
+msgid "You administrate this room"
+msgstr "ŠŠøŠµ ŃŃŠµ Š°Š“Š¼ŠøŠ½ŠøŃŃŃŠ°ŃŠ¾ŃŃŃ Š½Š° ŃŠ°Š·Šø ŃŃŠ°Ń"
+
+msgid "Enter new subject"
+msgstr "ŠŃŠ²ŠµŠ¶Š“Š°Š½Šµ Š½Š° ŃŠ¾Š²Š° ŃŠµŠ¼Š°"
+
+msgid "Configuration"
+msgstr "ŠŠ¾Š½ŃŠøŠ³ŃŃŠ°ŃŠøŃ"
+
+msgid "Authorizations"
+msgstr "ŠŃŠ°Š²Š° Šø ŠæŃŠ»Š½Š¾Š¼Š¾ŃŠ½Šø"
+
+msgid "Member list"
+msgstr "Š”ŠæŠøŃŃŠŗ Ń ŃŃŠ°ŃŃŠ½ŠøŃŠø"
+
+msgid "Owner list"
+msgstr "Š”ŠæŠøŃŃŠŗ ŃŃŃ ŃŠ¾Š±ŃŃŠ²ŠµŠ½ŠøŃŠø"
+
+msgid "Administrator list"
+msgstr "Š”ŠæŠøŃŃŠŗ Ń Š°Š“Š¼ŠøŠ½ŠøŃŃŃŠ°ŃŠ¾ŃŠø"
+
+msgid "Outcast list"
+msgstr "Š”ŠæŠøŃŃŠŗ Ń outcast-Šø"
+
+msgid "Add an input"
+msgstr "ŠŠ¾Š±Š°Š²ŃŠ½Šµ Š½Š° Š²Ń
Š¾Š“Š½Šø Š“Š°Š½Š½Šø"
+
+msgid "Destroy this MUC"
+msgstr "Š£Š½ŠøŃŠ¾Š¶Š°Š²Š°Š½Šµ Š½Š° ŃŠ¾Š·Šø MUC (Š¼Š½Š¾Š³Š¾ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠø ŃŠ°Ń)"
+
+msgid "Yes, let's do it!"
+msgstr "ŠŠ°, Š“Š° Š³Š¾ Š½Š°ŠæŃŠ°Š²ŠøŠ¼!"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr "ŠŃŠøŃŃŠµŠ»ŃŃ Š²Šø Š¾Š±ŃŃŃŠ° Š²Š½ŠøŠ¼Š°Š½ŠøŠµ Š½Š° Š“ŠøŃŠŗŃŃŠøŃŃŠ°."
+
+msgid "Your friend is writing a message..."
+msgstr "ŠŃŠøŃŃŠµŠ»ŃŃ Š²Šø ŠæŠøŃŠµ ŃŃŠ¾Š±ŃŠµŠ½ŠøŠµ..."
+
+msgid "Your friend stopped writing a message."
+msgstr "ŠŃŠøŃŃŠµŠ»ŃŃ Š²Šø ŃŠæŃŃ Š“Š° ŠæŠøŃŠµ ŃŃŠ¾Š±ŃŠµŠ½ŠøŠµ."
+
+msgid "Your friend is doing something else."
+msgstr "ŠŃŠøŃŃŠµŠ»ŃŃ Š²Šø ŠæŃŠ°Š²Šø Š½ŠµŃŠ¾ Š“ŃŃŠ³Š¾."
+
+msgid "Your friend closed the chat."
+msgstr "ŠŃŠøŃŃŠµŠ»ŃŃ Š²Šø Š·Š°ŃŠ²Š°ŃŃ ŃŠ°ŃŠ°."
+
+msgid "Requesting this service..."
+msgstr "ŠŠ°ŃŠ²ŠŗŠ° Š½Š° ŃŠ°Š·Šø ŃŃŠ»ŃŠ³Š°..."
+
+msgid "Loading"
+msgstr "ŠŠ°ŃŠµŠ¶Š“Š°Š½Šµ"
+
+msgid "joined the chat room"
+msgstr "ŃŠµ ŠæŃŠøŃŃŠµŠ“ŠøŠ½Šø ŠŗŃŠ¼ ŃŠ°Ń ŃŃŠ°ŃŃŠ°"
+
+msgid "left the chat room"
+msgstr "Š½Š°ŠæŃŃŠ½Š° ŃŠ°Ń ŃŃŠ°ŃŃŠ°"
+
+msgid "no status"
+msgstr "Š±ŠµŠ· ŃŃŠ°ŃŃŃ"
+
+msgid "has been kicked"
+msgstr "Š±ŠµŃŠµ ŠøŠ·Ń
Š²ŃŃŠ»ŠµŠ½ (kick-Š½Š°Ń) [Š¾Ń ŃŃŠ°ŃŃŠ°]"
+
+msgid "has been banned"
+msgstr "Šµ Š±Š°Š½Š½Š°Ń"
+
+msgid "no reason"
+msgstr "Š±ŠµŠ· ŠæŃŠøŃŠøŠ½Š°"
+
+msgid "Communicate with the entire world!"
+msgstr "ŠŠ¾Š¼ŃŠ½ŠøŠŗŠøŃŠ°Š¹ Ń ŃŠµŠ»ŠøŃ ŃŠ²ŃŃ!"
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr "ŠŠ¾Š·Š²Š¾Š»ŃŠ²Š° Š²Šø Š“Š° ŃŠµ ŃŠ²ŃŃŠ·Š²Š°ŃŠµ Ń Š¼ŠøŠ»ŠøŠ¾Š½Šø ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»Šø, ŠŗŠ¾ŠøŃŠ¾ ŠøŠ·ŠæŠ¾Š»Š·Š²Š°Ń Š¼ŃŠµŠ¶Š°ŃŠ° XMPP ŠŗŠ°ŠŗŃŠ¾ Šø ŃŠø Ń Jappix. ŠŃŠøŃŃŠµŠ“ŠøŠ½Šø ŃŠµ ŠŗŃŠ¼ Š¾Š±ŃŠ½Š¾ŃŃŃŠ° Šø Š¾ŃŃŠ°Š½Šø ŃŠ²Š¾Š±Š¾Š“ŠµŠ½. ŠŠ¾ŃŃŠ½ŠµŠ½ŠøŠµ: XMPP = ŠµŠŗŃ-ŠµŠ¼-ŠæŠø-ŠæŠø, eXtensible Messaging and Presence Protocol, http://xmpp.org/."
+
+msgid "Hi there!"
+msgstr "ŠŠ¹, ŃŠø ŃŠ°Š¼, Š·Š“ŃŠ°Š²ŠµŠ¹!"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr "ŠŠ¾Š±ŃŠµ Š“Š¾ŃŠ»Šø Š² %1s, ā%2sā."
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr "ŠŠ»ŠµŠ·ŃŠµ Š²ŃŠ² Š²Š°ŃŠ°ŃŠ° Š²ŠµŃŠµ ŃŃŃŠµŃŃŠ²ŃŠ²Š°ŃŠ° XMPP ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠ° ŃŠ¼ŠµŃŠŗŠ° (Š°ŠŗŠ°ŃŠ½Ń) ŠøŠ»Šø ŃŃŠ·Š“Š°Š¹ŃŠµ Š½Š¾Š²Š° ŃŠ²Š¾Š±Š¾Š“Š½Š¾ Šø Š±ŠµŠ·ŠæŠ»Š°ŃŠ½Š¾!"
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr "Jappix Šµ ŠæŃŠ¾ŠµŠŗŃ Ń Š¾ŃŠ²Š¾ŃŠµŠ½ ŠŗŠ¾Š“ (FLOSS, ŃŠ²Š¾Š±Š¾Š“ŠµŠ½ ŃŠ¾ŃŃŃŠµŃ) Š¾Ń PostPro, Š½ŠµŠŗŠ¾Š¼ŠµŃŃŠøŠ°Š»Š½Š° (non-profit) Š¾ŃŠ³Š°Š½ŠøŠ·Š°ŃŠøŃ, ŠŗŠ¾ŃŃŠ¾ Š½Šø Š¾ŃŠøŠ³ŃŃŃŠ²Š° Š¼Š½Š¾Š³Š¾ ŠæŠ¾Š¼Š¾Ń."
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr "ŠŠ»ŠµŠ·ŃŠµ Š²ŃŠ² Š²ŠµŃŠµ Š½Š°Š»ŠøŃŠ½Š°ŃŠ° ŃŠø (ŃŃŃŠµŃŃŠ²ŃŠ²Š°ŃŠ°) XMPP ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠ° ŃŠ¼ŠµŃŠŗŠ° (Š°ŠŗŠ°ŃŠ½Ń). Š”ŃŃŠ¾ ŃŠ°ŠŗŠ° Š¼Š¾Š¶ŠµŃŠµ Š“Š° ŠøŠ·ŠæŠ¾Š»Š·Š²Š°ŃŠµ %s, Š·Š° Š“Š° ŃŠµ ŠæŃŠøŃŃŠµŠ“ŠøŠ½ŠøŃŠµ ŠŗŃŠ¼ Š³ŃŃŠæŠ¾Š² ŃŠ°Ń."
+
+msgid "Previous"
+msgstr "ŠŃŠµŠ“ŠøŃŠ½Šø"
+
+msgid "General"
+msgstr "ŠŠ±ŃŠø"
+
+msgid "Advanced"
+msgstr "Š Š°Š·ŃŠøŃŠµŠ½Šø"
+
+msgid "Resource"
+msgstr "Š ŠµŃŃŃŃ"
+
+msgid "Priority"
+msgstr "ŠŃŠøŠ¾ŃŠøŃŠµŃ"
+
+msgid "Low"
+msgstr "ŠŠøŃŃŠŗ"
+
+msgid "Medium"
+msgstr "Š”ŃŠµŠ“ŠµŠ½"
+
+msgid "High"
+msgstr "ŠŠøŃŠ¾Šŗ"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr "ŠŃŠ²ŠµŠ“ŠµŃŠµ Š°Š“ŃŠµŃŠ° Š½Š° Š³ŃŃŠæŠ¾Š²ŠøŃ ŃŠ°Ń, ŠŗŃŠ¼ ŠŗŠ¾Š¹ŃŠ¾ ŠøŃŠŗŠ°ŃŠµ Š“Š° ŃŠµ ŠæŃŠøŃŃŠµŠ“ŠøŠ½ŠøŃŠµ, ŠŗŠ°ŠŗŃŠ¾ Šø ŠæŃŠµŠ²Š“Š¾Š½ŠøŠ¼ŃŃ, ŠŗŠ¾Š¹ŃŠ¾ ŠøŃŠŗŠ°ŃŠµ Š“Š° ŠøŠ·ŠæŠ¾Š»Š·Š²Š°ŃŠµ. Š”ŃŃŠ¾ ŃŠ°ŠŗŠ° Š¼Š¾Š¶ŠµŃŠµ Š“Š° ŃŠµ Š²ŃŃŠ½ŠµŃŠµ ŠŗŃŠ¼ %s."
+
+msgid "login page"
+msgstr "ŃŃŃŠ°Š½ŠøŃŠ° Š·Š° Š²Ń
Š¾Š“"
+
+msgid "Share this link with your friends:"
+msgstr "Š”ŠæŠ¾Š“ŠµŠ»ŃŠ½Šµ Š½Š° Š²ŃŃŠ·ŠŗŠ°ŃŠ° Ń Š²Š°ŃŠøŃŠµ ŠæŃŠøŃŃŠµŠ»Šø:"
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr "Š ŠµŠ³ŠøŃŃŃŠøŃŠ°Š¹ŃŠµ Š½Š¾Š²Š° ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠ° ŃŠ¼ŠµŃŠŗŠ° (Š°ŠŗŠ°ŃŠ½Ń) Š·Š° XMPP, Š·Š° Š“Š° ŃŠµ ŠæŃŠøŃŃŠµŠ“ŠøŠ½ŠøŃŠµ ŠŗŃŠ¼ Š²Š°ŃŠøŃŠµ ŠæŃŠøŃŃŠµŠ»Šø Š¾Ń Š²Š°ŃŠøŃ ŃŠ¾Š±ŃŃŠ²ŠµŠ½ ŃŠ¾ŃŠøŠ°Š»ŠµŠ½ Š¾Š±Š»Š°Šŗ. ŠŃŠ¾ŃŃŠ¾ Šµ!"
+
+msgid "Required"
+msgstr "Š·Š°Š“ŃŠ»Š¶ŠøŃŠµŠ»Š½Š¾"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr "ŠŠøŠµ ŃŠµ ŃŠµŠ³ŠøŃŃŃŠøŃŠ°Ń
ŃŠµ ŃŃŠæŠµŃŠ½Š¾, ŠµŃŠ¾ Š²Šø Š²Š°ŃŠøŃ Š»ŠøŃŠµŠ½ XMPP Š°Š“ŃŠµŃ:"
+
+msgid "Manager"
+msgstr "ŠŠµŠ½ŠøŠ“Š¶ŃŃ (Š°Š“Š¼. ŃŠæŃŠ°Š²Š»ŠµŠ½ŠøŠµ)"
+
+msgid "Project"
+msgstr "ŠŃŠ¾ŠµŠŗŃ"
+
+msgid "Encrypted"
+msgstr "ŠŃŠøŠæŃŠøŃŠ°Š½ (ŃŠøŃŃŠ¾Š²Š°Š½) Š²Ń
Š¾Š“"
+
+msgid "Unencrypted"
+msgstr "ŠŠµŠŗŃŠøŠæŃŠøŃŠ°Š½ (Š½ŠµŃŠøŃŃŠ¾Š²Š°Š½) Š²Ń
Š¾Š“"
+
+msgid "Where are you?"
+msgstr "ŠŃŠ“Šµ ŃŃŠµ?"
+
+msgid "What's up with you?"
+msgstr "ŠŠ°Šŗ ŃŃŠµ?"
+
+msgid "Fetching the social channel..."
+msgstr "ŠŃŠøŃ
Š²Š°ŃŠ°Š½Šµ Š½Š° ŃŠ¾ŃŠøŠ°Š»Š½ŠøŃ ŠŗŠ°Š½Š°Š»..."
+
+msgid "You are synchronized with your network."
+msgstr "Š”ŠøŠ½Ń
ŃŠ¾Š½ŠøŠ·ŠøŃŠ°Š½ ŃŃŠµ Ń Š¼ŃŠµŠ¶Š°ŃŠ° ŃŠø."
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr "ŠŠµ Š¼Š¾Š¶ŠµŃŠµ Š“Š° ŠøŠ·ŠæŃŠ°ŃŠ°ŃŠµ Š½ŠøŃŠ¾: Š¼Š¾Š¶ŠµŃŠµ ŃŠ°Š¼Š¾ Š“Š° ŠæŠ¾Š»ŃŃŠ°Š²Š°ŃŠµ ŠøŠ·Š²ŠµŃŃŠøŃ!"
+
+msgid "Media viewer"
+msgstr "ŠŠµŠ“ŠøŠµŠ½ ŠæŃŠµŠ³Š»ŠµŠ“/ŃŠ°Š·Š³Š»ŠµŠ¶Š“Š°Š½Šµ"
+
+msgid "Browse"
+msgstr "Š Š°Š·Š³Š»ŠµŠ¶Š“Š°Š½Šµ/ŠæŃŠµŠ³Š»ŠµŠ“"
+
+msgid "Command"
+msgstr "ŠŠ¾Š¼Š°Š½Š“Š°"
+
+msgid "Subscribe"
+msgstr "ŠŠ±Š¾Š½Š°Š¼ŠµŠ½Ń"
+
+msgid "Join"
+msgstr "ŠŃŠøŃŃŠµŠ“ŠøŠ½ŃŠ²Š°Š½Šµ"
+
+msgid "Automatic"
+msgstr "ŠŠ²ŃŠ¾Š¼Š°ŃŠøŃŠ½Š¾"
+
+msgid "Search"
+msgstr "Š¢ŃŃŃŠµŠ½Šµ"
+
+msgid "No result!"
+msgstr "ŠŃŠ¼Š° ŃŠµŠ·ŃŠ»ŃŠ°Ń!"
+
+msgid "No notifications."
+msgstr "ŠŃŠ¼Š° ŠøŠ·Š²ŠµŃŃŠøŃ."
+
+msgid "would like to add you as a friend."
+msgstr "Š¶ŠµŠ»Š°Šµ Š“Š° Š²Šø Š“Š¾Š±Š°Š²Šø ŠŗŃŠ¼ ŃŠæŠøŃŃŠŗŠ° ŃŠø Ń ŠæŃŠøŃŃŠµŠ»Šø."
+
+msgid "would like you to join this chatroom:"
+msgstr "Š¶ŠµŠ»Š°Šµ Š²ŠøŠµ Š“Š° ŃŠµ ŠæŃŠøŃŃŠµŠ“ŠøŠ½ŠøŃŠµ ŠŗŃŠ¼ ŃŠ»ŠµŠ“Š½Š°ŃŠ° ŃŠ°Ń ŃŃŠ°Ń:"
+
+msgid "Do you accept?"
+msgstr "ŠŃŠøŠµŠ¼Š°ŃŠµ Š»Šø?"
+
+msgid "Yes"
+msgstr "ŠŠ°/ŠŠ"
+
+msgid "No"
+msgstr "ŠŠµ"
+
+msgid "would like to get authorization."
+msgstr "Š¶ŠµŠ»Š°Šµ Š“Š° ŠæŠ¾Š»ŃŃŠø ŠæŃŠ»Š½Š¾Š¼Š¾ŃŠ½Š¾."
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr "ŠŠµŠ»Š°ŠµŃŠµ Š»Šø Š“Š° Š²ŠøŠ“ŠøŃŠµ ŃŠæŠøŃŃŠŗŠ° Ń ŠæŃŠøŃŃŠµŠ»Šø, ŠŗŠ¾ŠøŃŠ¾ %s Š²Šø ŠæŃŠµŠ“Š»Š°Š³Š°?"
+
+msgid "Submit"
+msgstr "ŠŠ·ŠæŃŠ°ŃŠ°Š½Šµ"
+
+msgid "Client"
+msgstr "ŠŠ»ŠøŠµŠ½Ń"
+
+msgid "System"
+msgstr "Š”ŠøŃŃŠµŠ¼Š°"
+
+msgid "Local time"
+msgstr "ŠŠµŃŃŠ½Š¾ Š²ŃŠµŠ¼Šµ"
+
+msgid "Comments"
+msgstr "ŠŠ¾Š¼ŠµŠ½ŃŠ°ŃŠø"
+
+msgid "User profile"
+msgstr "ŠŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠø ŠæŃŠ¾ŃŠøŠ»"
+
+msgid "See his/her position on the globe"
+msgstr "ŠŠøŠ¶ŃŠµ Š½ŠµŠ³Š¾Š²Š°ŃŠ°/Š½ŠµŠ¹Š½Š°ŃŠ° ŠæŠ¾Š·ŠøŃŠøŃ (Š¼ŠµŃŃŠ¾ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµ) Š½Š° Š³Š»Š¾Š±ŃŃŠ° [ŃŃŠµŠ· Š³ŠµŠ¾Š»Š¾ŠŗŠ°ŃŠøŃ]"
+
+msgid "Confirm"
+msgstr "ŠŠ¾ŃŠ²ŃŃŠ¶Š“Š°Š²Š°Š½Šµ"
+
+msgid "anonymous mode"
+msgstr "ŃŠµŠ¶ŠøŠ¼ ŠøŠ½ŠŗŠ¾Š³Š½ŠøŃŠ¾ (Š² Š°Š½Š¾Š½ŠøŠ¼Š½Š¾ŃŃ)"
+
+msgid "Groups"
+msgstr "ŠŃŃŠæŠø"
+
+msgid "Unclassified"
+msgstr "ŠŠµŠŗŠ»Š°ŃŠøŃŠøŃŠøŃŠ°Š½Šø"
+
+msgid "Authorize"
+msgstr "Š Š°Š·ŃŠµŃŠ°Š²Š°Š½Šµ/ŃŠæŃŠ»Š½Š¾Š¼Š¾ŃŠ°Š²Š°Š½Šµ"
+
+msgid "Ask for authorization"
+msgstr "ŠŠøŃŠ°Š¹/-Š½Šµ Š·Š° ŃŠ°Š·ŃŠµŃŠµŠ½ŠøŠµ/ŃŠæŃŠ»Š½Š¾Š¼Š¾ŃŠµŠ½ŠøŠµ"
+
+msgid "Unblock"
+msgstr "ŠŃŠ±Š»Š¾ŠŗŠøŃŠ°Š½Šµ"
+
+msgid "Prohibit"
+msgstr "ŠŠ°Š±ŃŠ°Š½Š°"
+
+msgid "Block"
+msgstr "ŠŠ»Š¾ŠŗŠøŃŠ°Š½Šµ"
+
+msgid "Chat"
+msgstr "Š§Š°Ń"
+
+msgid "Groupchat"
+msgstr "ŠŃŃŠæŠ¾Š² ŃŠ°Ń"
+
+msgid "Jappix Mobile"
+msgstr "Š¼Š¾Š±ŠøŠ»Š½Š° Š²ŠµŃŃŠøŃ Š½Š° Jappix"
+
+msgid "Desktop"
+msgstr "Desktop (Š“ŠµŃŠŗŃŠ¾Šæ, Š½Š°ŃŃŠ¾Š»Š½Š° Š²ŠµŃŃŠøŃ)"
+
+msgid "Mobile"
+msgstr "Mobile (Š¼Š¾Š±ŠøŠ»Š½Š° Š²ŠµŃŃŠøŃ)"
+
+msgid "Please wait..."
+msgstr "ŠŠ¾Š»Ń, ŠøŠ·ŃŠ°ŠŗŠ°Š¹ŃŠµ..."
+
+msgid "Please enable JavaScript"
+msgstr "ŠŠ¾Š»Ń, Š²ŠŗŠ»ŃŃŠµŃŠµ JavaScript"
+
+msgid "Your channel"
+msgstr "ŠŠ°ŃŠøŃ ŠŗŠ°Š½Š°Š»"
+
+msgid "Channel of"
+msgstr "ŠŠ°Š½Š°Š» Š½Š°"
+
+msgid "More notices..."
+msgstr "ŠŃŠµ ŠøŠ·Š²ŠµŃŃŠøŃ..."
+
+msgid "Attach a file"
+msgstr "ŠŃŠøŠŗŠ°ŃŠ²Š°Š½Šµ Š½Š° ŃŠ°Š¹Š»"
+
+msgid "Send"
+msgstr "ŠŠ·ŠæŃŠ°ŃŠ°Š½Šµ"
+
+msgid "Unattach the file"
+msgstr "ŠŃŠµŠ¼Š°Ń
Š²Š°Š½Šµ Š½Š° ŠæŃŠøŠŗŠ°ŃŠµŠ½ŠøŃ ŃŠ°Š¹Š»"
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr "ŠŃŠµŃŠŗŠ° ŠæŃŠø ŠŗŠ°ŃŠ²Š°Š½ŠµŃŠ¾ (ŃŠæŠ»Š¾ŃŠ“Š²Š°Š½ŠµŃŠ¾) Š½Š° Š²Š°ŃŠøŃ ŃŠ°Š¹Š»: Š¼Š¾Š¶Šµ Š±Šø Šµ ŠæŃŠµŠŗŠ°Š»ŠµŠ½Š¾ Š³Š¾Š»ŃŠ¼ (Š¼Š°ŠŗŃŠøŠ¼ŃŠ¼ŃŃ Šµ %s) ŠøŠ»Šø Šµ Š¾Ń Š·Š°Š±ŃŠ°Š½ŠµŠ½ ŃŠøŠæ ŃŠ°Š¹Š»Š¾Š²Š¾ ŃŠ°Š·ŃŠøŃŠµŠ½ŠøŠµ!"
+
+msgid "Authorization failed"
+msgstr "ŠŠµŃŃŠæŠµŃŠ½Š¾ ŠæŠ¾ŃŠ²ŃŃŠ¶Š“ŠµŠ½ŠøŠµ Š½Š° ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠøŃŠµ Š“Š°Š½Š½Šø"
+
+msgid "Registration failed, please choose a different username"
+msgstr "Š ŠµŠ³ŠøŃŃŃŠ°ŃŠøŃŃŠ° Šµ Š½ŠµŃŃŠæŠµŃŠ½Š°, Š¼Š¾Š»Ń, ŠøŠ·Š±ŠµŃŠµŃŠµ Š“ŃŃŠ³Š¾ ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠ¾ ŠøŠ¼Šµ/ŠæŃŠµŠ²Š“Š¾Š½ŠøŠ¼"
+
+msgid "Service unavailable"
+msgstr "Š£ŃŠ»ŃŠ³Š°ŃŠ° Š½Šµ Šµ Š½Š° ŃŠ°Š·ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµ (Š¾ŃŠ»Š°Š¹Š½, ŠøŠ·Š²ŃŠ½ Š»ŠøŠ½ŠøŃ)"
+
+msgid "Internal server error, try later"
+msgstr "ŠŃŃŃŠµŃŠ½Š° ŃŃŃŠ²ŃŃŠ½Š° Š³ŃŠµŃŠŗŠ°, ŠæŃŠ¾Š±Š²Š°Š¹ŃŠµ Š¾ŃŠ½Š¾Š²Š¾ ŠæŠ¾-ŠŗŃŃŠ½Š¾"
+
+msgid "Your form has been sent."
+msgstr "Š¤Š¾ŃŠ¼ŃŠ»ŃŃŃŃ Š²Šø Š±ŠµŃŠµ ŠøŠ·ŠæŃŠ°ŃŠµŠ½."
+
+msgid "Application"
+msgstr "ŠŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŠµ"
+
+msgid "XMPP links"
+msgstr "XMPP Š²ŃŃŠ·ŠŗŠø"
+
+msgid "Open XMPP links with Jappix"
+msgstr "ŠŃŠ²Š°ŃŃŠ½Šµ Š½Š° XMPP Š²ŃŃŠ·ŠŗŠø Ń Jappix"
+
+msgid "changed the subject to:"
+msgstr "ŠæŃŠ¾Š¼ŠµŠ½Šø ŃŠµŠ¼Š°ŃŠ° Š½Š°:"
+
+msgid "Welcome!"
+msgstr "ŠŠ¾Š±ŃŠµ Š“Š¾ŃŠ»Šø!"
+
+msgid "Friends"
+msgstr "ŠŃŠøŃŃŠµŠ»Šø"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr "ŠŠ¾Š±ŃŠµ Š“Š¾ŃŠ»Šø Š² Jappix, ŃŠ²Š¾ŃŃ ŃŠ¾Š±ŃŃŠ²ŠµŠ½ ŃŠ¾ŃŠøŠ°Š»ŠµŠ½ Š¾Š±Š»Š°Šŗ!"
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr "ŠŃŠµŠ“Šø Š“Š° Š·Š°ŠæŠ¾ŃŠ½ŠµŃŠµ Š“Š° Š³Š¾ ŠøŠ·ŠæŠ¾Š»Š·Š²Š°ŃŠµ, ŃŃŃŠ±Š²Š° Š“Š° ŠæŃŠ¾Š¼ŠµŠ½ŠøŃŠµ Š½ŃŠŗŠ¾Šø Š½Š°ŃŃŃŠ¾Š¹ŠŗŠø, Š“Š° ŠæŠ¾ŃŃŃŃŠøŃŠµ ŠæŃŠøŃŃŠµŠ»Šø Šø Š“Š° ŠæŠ¾ŠæŃŠ»Š½ŠøŃŠµ ŠæŃŠ¾ŃŠøŠ»Š° ŃŠø."
+
+msgid "Enable notification sounds"
+msgstr "ŠŠŗŠ»ŃŃŠ²Š°Š½Šµ Š½Š° Š·Š²ŃŃŠø Š·Š° ŠøŠ·Š²ŠµŃŃŠøŃ"
+
+msgid "Share your position on the globe"
+msgstr "Š”ŠæŠ¾Š“ŠµŠ»ŃŠ½Šµ Š½Š° ŠæŠ¾Š·ŠøŃŠøŃŃŠ° (Š¼ŠµŃŃŠ¾ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŃŠ¾) Š²Šø Š½Š° Š³Š»Š¾Š±ŃŃŠ°"
+
+msgid "Offline friends"
+msgstr "ŠŃŠøŃŃŠµŠ»Šø ŠøŠ·Š²ŃŠ½ Š»ŠøŠ½ŠøŃ"
+
+msgid "Don't hide offline friends"
+msgstr "ŠŠµŠ· ŃŠŗŃŠøŠ²Š°Š½Šµ Š½Š° ŠæŃŠøŃŠµŠ»ŠøŃŠµ ŠøŠ·Š²ŃŠ½ Š»ŠøŠ½ŠøŃ"
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr "ŠŠ·ŠæŠ¾Š»Š·Š²Š°Š¹ŃŠµ ŃŠ¾Š·Šø ŠæŠ¾Š¼Š¾ŃŠ½ŠøŠŗ/ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½Ń, Š·Š° Š“Š° Š½Š°Š¼ŠµŃŠøŃŠµ ŠæŃŠøŃŃŠµŠ»ŠøŃŠµ ŃŠø Š½Š° ŃŃŃŠ²ŃŃŠ°, ŠŗŠ¾Š¹ŃŠ¾ ŠøŠ·ŠæŠ¾Š»Š·Š²Š°ŃŠµ Š² Š¼Š¾Š¼ŠµŠ½ŃŠ°, ŠøŠ»Šø Š³Šø Š“Š¾Š±Š°Š²ŠµŃŠµ ŠæŠ¾-ŠŗŃŃŠ½Š¾."
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr "ŠŠ¾Š±ŃŠ° ŃŠ°Š±Š¾ŃŠ°! Š”ŠµŠ³Š° Š¼Š¾Š¶ŠµŃŠµ Š“Š° ŃŠæŠ¾Š“ŠµŠ»ŠøŃŠµ Jappix ŃŃŃ ŃŠ²Š¾ŠøŃŠµ ŠæŃŠøŃŃŠµŠ»Šø!"
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr "ŠŠ¾Š³Š°ŃŠ¾ Š½Š°ŃŠøŃŠ½ŠµŃŠµ Š±ŃŃŠ¾Š½Š° Š·Š° Š·Š°ŠæŠ°Š·Š²Š°Š½Šµ, ŃŠµ Š±ŃŠ“Šµ Š¾ŃŠ²Š¾ŃŠµŠ½ ŃŠµŠ“Š°ŠŗŃŠ¾ŃŃŃ Š½Š° ŠæŃŠ¾ŃŠøŠ»Š°. ŠŃŠøŃŃŠ½Š¾ ŃŠ¾ŃŠøŠ°Š»ŠøŠ·ŠøŃŠ°Š½Šµ!"
+
+msgid "Share Jappix on %s"
+msgstr "Š”ŠæŠ¾Š“ŠµŠ»ŃŠ½Šµ Š½Š° Jappix ŠæŠ¾ %s"
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr "ŠŠ·ŠæŠ¾Š»Š·Š²Š°Š¼ Jappix, Š¾ŃŠ²Š¾ŃŠµŠ½Š° ŃŠ¾ŃŠøŠ°Š»Š½Š° ŠæŠ»Š°ŃŃŠ¾ŃŠ¼Š°. ŠŠ· ŃŃŠ¼ %s!"
+
+msgid "Unknown name"
+msgstr "ŠŠµŠøŠ·Š²ŠµŃŃŠ½Š¾ ŠøŠ¼Šµ"
+
+msgid "Unknown country"
+msgstr "ŠŠµŠøŠ·Š²ŠµŃŃŠ½Š° ŃŃŃŠ°Š½Š°/Š“ŃŃŠ¶Š°Š²Š°"
+
+msgid "Click to enable"
+msgstr "ŠŠ°ŃŠøŃŠ½ŠµŃŠµ Š·Š° Š²ŠŗŠ»ŃŃŠ²Š°Š½Šµ"
+
+msgid "Click to disable"
+msgstr "ŠŠ°ŃŠøŃŠ½ŠµŃŠµ Š·Š° ŠøŠ·ŠŗŠ»ŃŃŠ²Š°Š½Šµ"
+
+msgid "Installation"
+msgstr "ŠŠ½ŃŃŠ°Š»Š°ŃŠøŃ"
+
+msgid "Jappix installation"
+msgstr "ŠŠ½ŃŃŠ°Š»Š°ŃŠøŃ Š½Š° Jappix"
+
+msgid "Welcome to the Jappix installation!"
+msgstr "ŠŠ¾Š±ŃŠµ Š“Š¾ŃŠ»Šø Š² ŠøŠ½ŃŃŠ°Š»Š°ŃŠøŃŃŠ° Š·Š°/Š½Š° Jappix!"
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr "Š¢Š¾Š·Šø ŠæŠ¾Š¼Š¾ŃŠ½ŠøŠŗ/ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½Ń ŃŠµ Š²Šø ŠæŠ¾Š¼Š¾Š³Š½Šµ Š±ŃŃŠ·Š¾ Š“Š° ŠøŠ½ŃŃŠ°Š»ŠøŃŠ°ŃŠµ Jappix, ŠæŃŃŠ²Š°ŃŠ° ŠæŃŠ»Š½Š¾ŃŠµŠ½Š½Š° Š¾Š½Š»Š°Š¹Š½ ŃŠ¾ŃŠøŠ°Š»Š½Š° ŠæŠ»Š°ŃŃŠ¾ŃŠ¼Š°, Š±Š°Š·ŠøŃŠ°Š½Š° Š½Š° XMPP, Š½Š° Š²Š°ŃŠøŃ ŃŃŃŠ²ŃŃ. ŠŠ¾ŃŠø Š½Šµ ŃŠ° Š²Šø Š½ŃŠ¶Š½Šø ŃŠµŃ
Š½ŠøŃŠµŃŠŗŠø ŠæŠ¾Š·Š½Š°Š½ŠøŃ."
+
+msgid "Let's have a look at the installation steps:"
+msgstr "ŠŠµŠŗŠ° Š“Š° ŃŠ°Š·Š³Š»ŠµŠ“Š°Š¼Šµ ŃŃŃŠæŠŗŠøŃŠµ ŠæŃŠø/Š½Š° ŠøŠ½ŃŃŠ°Š»Š°ŃŠøŃŃŠ°:"
+
+msgid "Welcome"
+msgstr "ŠŠ“ŃŠ°Š²ŠµŠ¹ŃŠµ"
+
+msgid "Storage configuration"
+msgstr "ŠŠ¾Š½ŃŠøŠ³ŃŃŠ°ŃŠøŃ Š½Š° Ń
ŃŠ°Š½ŠøŠ»ŠøŃŠµŃŠ¾"
+
+msgid "Administrator account"
+msgstr "ŠŠ“Š¼ŠøŠ½ŠøŃŃŃŠ°ŃŠ¾ŃŃŠŗŠ° ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠ° ŃŠ¼ŠµŃŠŗŠ° (Š°ŠŗŠ°ŃŠ½Ń)"
+
+msgid "Main configuration"
+msgstr "ŠŃŠ½Š¾Š²Š½Š° ŠŗŠ¾Š½ŃŠøŠ³ŃŃŠ°ŃŠøŃ"
+
+msgid "Hosts configuration"
+msgstr "ŠŠ¾Š½ŃŠøŠ³ŃŃŠ°ŃŠøŃ Š½Š° Ń
Š¾ŃŃŠ¾Š²ŠµŃŠµ"
+
+msgid "Services installation"
+msgstr "ŠŠ½ŃŃŠ°Š»Š°ŃŠøŃ Š½Š° ŃŃŠ»ŃŠ³Šø"
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr "ŠŠŗŠ¾ Š½Š°ŃŃŠ¾ŃŃŠøŃŃ ŠµŠ·ŠøŠŗ Š½Šµ ŃŃŠ²ŠæŠ°Š“Š° Ń Š²Š°ŃŠøŃ (%1s), Š¼Š¾Š¶ŠµŃŠµ Š“Š° Š½Š°ŠæŃŠ°Š²ŠøŃŠµ Jappix Š“Š° Š³Š¾Š²Š¾ŃŠø Š½Š° %2s, ŠŗŠ°ŃŠ¾ ŃŠ¾Š²Š° ŃŠµ ŃŠµ Š·Š°ŠæŠ°Š·Šø."
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr "ŠŠŗŠ¾ Š¶ŠµŠ»Š°ŠµŃŠµ Š“Š° ŠæŠ¾Š»ŃŃŠøŃŠµ ŠæŠ¾Š¼Š¾Ń Š¾ŃŠ½Š¾ŃŠ½Š¾ ŠøŠ½ŃŃŠ°Š»Š°ŃŠøŃŃŠ° Šø ŠŗŠ¾Š½ŃŠøŠ³ŃŃŠ°ŃŠøŃŃŠ° Š½Š° Jappix, Š¼Š¾Š¶ŠµŃŠµ Š“Š° ŠøŠ·ŠæŠ¾Š»Š·Š²Š°ŃŠµ ŃŃŠ»Š°ŃŠ° Š½Š°ŃŠ° Š“Š¾ŠŗŃŠ¼ŠµŠ½ŃŠ°ŃŠøŃ Š½Š° ŠæŃŠ¾Š³ŃŠ°Š¼Š°ŃŠ°, ŠŗŠ¾ŃŃŠ¾ Šµ Š½Š° ŃŠ°Š·ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµ Š¾Ń:"
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr "ŠŃŠµŠ¼Šµ Šµ Š“Š° ŠæŠ¾ŃŃŃŠ¾ŠøŃŠµ Š²Š°ŃŠøŃ ŃŠ¾Š±ŃŃŠ²ŠµŠ½ ŃŠ¾ŃŠøŠ°Š»ŠµŠ½ Š¾Š±Š»Š°Šŗ: ŠæŃŠ¾ŃŃŠ¾ Š¾ŃŠøŠ“ŠµŃŠµ Š½Š° ŃŠ»ŠµŠ“Š²Š°ŃŠ°ŃŠ° ŃŃŃŠæŠŗŠ°!"
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr "Jappix ŃŃŃ
ŃŠ°Š½ŃŠ²Š° Š½Š°ŃŃŠ°ŠæŃŠøŠ²Šø/ŠæŠ¾ŃŃŠ¾ŃŠ½Š½Šø Š“Š°Š½Š½Šø (ŠŗŠ°ŃŠ¾ ŃŠæŠ¾Š“ŠµŠ»ŠµŠ½Šø ŃŠ°Š¹Š»Š¾Š²Šµ, Š“Š½ŠµŠ²Š½ŠøŃŠø/Š°ŃŃ
ŠøŠ²Šø Š½Š° ŃŠ°ŃŠ¾Š²ŠµŃŠµ, Š²Š°ŃŠ°ŃŠ° Š¼ŃŠ·ŠøŠŗŠ° Šø ŃŠ¾Š±ŃŃŠ²ŠµŠ½Š°ŃŠ° ŃŠø ŠŗŠ¾Š½ŃŠøŠ³ŃŃŠ°ŃŠøŃ) Š² ŃŠ²Š¾ŃŃŠ° ŃŠ¾Š±ŃŃŠ²ŠµŠ½Š° ŃŠøŠ³ŃŃŠ½Š° ŠæŠ°ŠæŠŗŠ°/Š“ŠøŃŠµŠŗŃŠ¾ŃŠøŃ Š·Š° ŃŃŃ
ŃŠ°Š½ŠµŠ½ŠøŠµ."
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr "Jappix ŃŃŃŠ±Š²Š° Š“Š° Š¼Š¾Š¶Šµ Š“Š° Š²ŠæŠøŃŠ²Š° Š“Š°Š½Š½Šø Š² ŃŠ°Š·Šø ŠæŠ°ŠæŠŗŠ°/Š“ŠøŃŠµŠŗŃŠ¾ŃŠøŃ, Š·Š° Š“Š° ŃŃŠ·Š“Š°Š“Šµ ŃŠ²Š¾ŠøŃŠµ ŠæŠ¾Š“Š“ŠøŃŠµŠŗŃŠ¾ŃŠøŠø. ŠŠŗŠ¾ ŃŠ¾Š²Š° Šµ Š½ŠµŠ²ŃŠ·Š¼Š¾Š¶Š½Š¾, ŃŃŃŠ±Š²Š° Š“Š° Š½Š°ŃŃŃŠ¾ŠøŃŠµ ŠæŃŠ°Š²Š¾Š¼Š¾ŃŠøŃŃŠ° Š½Š° %1s ŠøŠ»Šø Š“Š° ŠæŃŠ¾Š¼ŠµŠ½ŠøŃŠµ ŃŠ¾Š±ŃŃŠ²ŠµŠ½ŠøŠŗŠ° Š½Š° ŠæŠ°ŠæŠŗŠ°ŃŠ° Š½Š° %2s (Š² Š·Š°Š²ŠøŃŠøŠ¼Š¾ŃŃ Š¾Ń Š²Š°ŃŠ°ŃŠ° ŠŗŠ¾Š½ŃŠøŠ³ŃŃŠ°ŃŠøŃ)."
+
+msgid "The folder is writable, you can continue!"
+msgstr "Š ŃŠ°Š·Šø ŠæŠ°ŠæŠŗŠ°/Š“ŠøŃŠµŠŗŃŠ¾ŃŠøŃ Š¼Š¾Š¶Šµ Š“Š° ŃŠµ Š·Š°ŠæŠøŃŠ²Š°, Š¼Š¾Š¶ŠµŃŠµ Š“Š° ŠæŃŠ¾Š“ŃŠ»Š¶ŠøŃŠµ!"
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix Š²Šø ŠæŠ¾Š·Š²Š¾Š»ŃŠ²Š° Š“Š° ŃŠæŃŠ°Š²Š»ŃŠ²Š°ŃŠµ Šø Š¼ŠµŠ½Š°Š¶ŠøŃŠ°ŃŠµ Š²Š°ŃŠ°ŃŠ° ŠŗŠ¾Š½ŃŠøŠ³ŃŃŠ°ŃŠøŃ, Š“Š° ŠøŠ½ŃŃŠ°Š»ŠøŃŠ°ŃŠµ Š½Š¾Š²Šø ŃŠ°Š·ŃŠøŃŠµŠ½ŠøŃ (ŠæŠ»ŃŠ³ŠøŠ½Šø) ŠøŠ»Šø Š“Š° ŠæŠ¾ŃŃŃŃŠøŃŠµ Š·Š° Š¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŃ Š½Š° ŠæŃŠ¾Š³ŃŠ°Š¼Š°ŃŠ° (ŃŠæŠ“ŠµŠ¹ŃŠø). ŠŠ°ŃŠ¾Š²Š° ŃŃŃŠ±Š²Š° Š“Š° ŃŃŠ·Š“Š°Š“ŠµŃŠµ Š°Š“Š¼ŠøŠ½ŠøŃŃŃŠ°ŃŠ¾ŃŃŠŗŠ° ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠ° ŃŠ¼ŠµŃŠŗŠ° (Š°ŠŗŠ°ŃŠ½Ń), Š·Š° Š“Š° Š¼Š¾Š¶ŠµŃŠµ Š“Š° ŠøŠ¼Š°ŃŠµ Š“Š¾ŃŃŃŠæ Š“Š¾ Š¼ŠµŠ½ŠøŠ“Š¶ŃŃŠ° Ń Š½Š°ŃŃŃŠ¾Š¹ŠŗŠøŃŠµ Š½Š° Jappix."
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr "ŠŠ¾Š³Š°ŃŠ¾ Jappix ŃŠµ ŠøŠ½ŃŃŠ°Š»ŠøŃŠ°, ŠæŃŠ¾ŃŃŠ¾ Š½Š°ŃŠøŃŠ½ŠµŃŠµ Š²ŃŃŃ
Ń Ń
ŠøŠæŠµŃŠ²ŃŃŠ·ŠŗŠ°ŃŠ° ŠŗŃŠ¼ Š¼ŠµŠ½ŠøŠ“Š¶ŃŃŠ° Ń Š½Š°ŃŃŃŠ¾Š¹ŠŗŠøŃŠµ Š·Š° ŠæŃŠ¾Š³ŃŠ°Š¼Š°ŃŠ°, Š½Š°Š¼ŠøŃŠ°Ń ŃŠµ Š½Š° Š“Š¾Š¼Š°ŃŠ½Š°ŃŠ° ŃŃŃŠ°Š½ŠøŃŠ°, Š·Š° Š“Š° Š²Š»ŠµŠ·ŠµŃŠµ Š² Š½ŠµŠ³Š¾."
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr "ŠŠæŠ°, ŠæŃŠ¾ŠæŃŃŠ½Š°Š»Šø ŃŃŠµ Š½ŠµŃŠ¾ ŠøŠ»Šø Š“Š²ŠµŃŠµ ŠæŠ°ŃŠ¾Š»Šø Š½Šµ ŃŃŠ²ŠæŠ°Š“Š°Ń!"
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr "Jappix ŠøŠ·ŠøŃŠŗŠ²Š° Š“Š° Š¼Ń Š²ŃŠ²ŠµŠ“ŠµŃŠµ Š½ŃŠŗŠ¾Šø ŃŃŠ¾Š¹Š½Š¾ŃŃŠø, Š·Š° Š“Š° ŃŃŠ½ŠŗŃŠøŠ¾Š½ŠøŃŠ° ŠæŃŠ°Š²ŠøŠ»Š½Š¾. ŠŠ¾Š»Ń, ŠŗŠ¾ŃŠøŠ³ŠøŃŠ°Š¹ŃŠµ ŃŠ»ŠµŠ“Š½ŠøŃŠµ Š²Ń
Š¾Š“Š½Šø Š“Š°Š½Š½Šø (ŠøŠ»Šø Š¾ŃŃŠ°Š½ŠµŃŠµ ŃŃŃ ŃŃŠ¾Š¹Š½Š¾ŃŃŠøŃŠµ ŠæŠ¾ ŠæŠ¾Š“ŃŠ°Š·Š±ŠøŃŠ°Š½Šµ, ŠŗŠ¾ŠøŃŠ¾ Š²ŃŃŃŠ°Ń ŃŠ°Š±Š¾ŃŠ° Š½Š° ŠæŠ¾Š²ŠµŃŠµŃŠ¾ Ń
Š¾ŃŠ°)."
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr "ŠŠ±ŃŃŠ½ŠµŃŠµ Š²Š½ŠøŠ¼Š°Š½ŠøŠµ Š½Š° ŃŠ¾Š²Š°, ŃŠµ Š°ŠŗŠ¾ Š½Šµ ŠøŠ·Š±ŠµŃŠµŃŠµ ŃŃŃŠ½Š¾ ŃŃŠ¾Š¹Š½Š¾ŃŃ, ŠŗŠ¾ŃŃŠ¾ Šµ Š·Š°Š“ŃŠ»Š¶ŠøŃŠµŠ»Š½Š°, ŃŃ Š°Š²ŃŠ¾Š¼Š°ŃŠøŃŠ½Š¾ ŃŠµ Š±ŃŠ“Šµ ŠæŠ¾ŠæŃŠ»Š½ŠµŠ½Š° Ń ŃŠ°Š±ŃŠøŃŠ½Š° ŃŃŠ¾Š¹Š½Š¾ŃŃ ŠæŠ¾ ŠæŠ¾Š“ŃŠ°Š·Š±ŠøŃŠ°Š½Šµ."
+
+msgid "User"
+msgstr "ŠŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»"
+
+msgid "Service"
+msgstr "Š£ŃŠ»ŃŠ³Š°"
+
+msgid "Service name"
+msgstr "ŠŠ°ŠøŠ¼ŠµŠ½Š¾Š²Š°Š½ŠøŠµ Š½Š° ŃŃŠ»ŃŠ³Š°ŃŠ°"
+
+msgid "Service description"
+msgstr "ŠŠæŠøŃŠ°Š½ŠøŠµ Š½Š° ŃŃŠ»ŃŠ³Š°ŃŠ°"
+
+msgid "Connection"
+msgstr "ŠŃŃŠ·ŠŗŠ°"
+
+msgid "Lock the host"
+msgstr "ŠŠ°ŠŗŠ»ŃŃŠ²Š°Š½Šµ Š½Š° Ń
Š¾ŃŃŠ°"
+
+msgid "Anonymous mode"
+msgstr "Š ŠµŠ¶ŠøŠ¼ ŠøŠ½ŠŗŠ¾Š³Š½ŠøŃŠ¾ (Š² Š°Š½Š¾Š½ŠøŠ¼Š½Š¾ŃŃ)"
+
+msgid "Registration allowed"
+msgstr "Š ŠµŠ³ŠøŃŃŃŠ°ŃŠøŠøŃŠµ ŃŠ° ŃŠ°Š·ŃŠµŃŠµŠ½Šø"
+
+msgid "Use a proxy"
+msgstr "ŠŠ·ŠæŠ¾Š»Š·Š²Š°Š½Šµ Š½Š° ŠæŃŠ¾ŠŗŃŠø (ŃŃŃŠ²ŃŃ-ŠæŠ¾ŃŃŠµŠ“Š½ŠøŠŗ)"
+
+msgid "Encryption"
+msgstr "ŠŃŠøŠæŃŠøŃŠ°Š½Šµ (ŃŠøŃŃŠ¾Š²Š°Š½Šµ)"
+
+msgid "HTTPS storage"
+msgstr "ŃŃŃ
ŃŠ°Š½ŠµŠ½ŠøŠµ/ŃŠŗŠ»Š°Š“ŠøŃŠ°Š½Šµ Ń HTTPS"
+
+msgid "Force HTTPS"
+msgstr "ŠŃŠøŠ½ŃŠ“ŠøŃŠµŠ»Š½Š¾ ŠøŠ·ŠæŠ¾Š»Š·Š²Š°Š½Šµ Š½Š° HTTPS"
+
+msgid "Compression"
+msgstr "ŠŠ¾Š¼ŠæŃŠµŃŠøŃ"
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr "Š¢Š°Š·Šø ŃŃŃŠ°Š½ŠøŃŠ° Š²Šø ŠæŠ¾Š¼Š°Š³Š° Š“Š° Š½Š°ŃŃŃŠ¾ŠøŃŠµ Ń
Š¾ŃŃŠ¾Š²ŠµŃŠµ ŠæŠ¾ ŠæŠ¾Š“ŃŠ°Š·Š±ŠøŃŠ°Š½Šµ, Ń ŠŗŠ¾ŠøŃŠ¾ Jappix ŃŠµ ŃŠµ ŃŠ²ŃŃŠ·Š²Š°. ŠŠ¾Š¶ŠµŃŠµ Š“Š° Š¾ŃŃŠ°Š²ŠøŃŠµ Š½Š°ŃŃŃŠ¾Š¹ŠŗŠøŃŠµ ŃŠ°ŠŗŠøŠ²Š°, ŠŗŠ°ŠŗŠ²ŠøŃŠ¾ ŃŠ° ŠæŠ¾ ŠæŠ¾Š“ŃŠ°Š·Š±ŠøŃŠ°Š½Šµ, Šø Š“Š° ŠæŃŠ¾Š“ŃŠ»Š¶ŠøŃŠµ Š½Š°ŠæŃŠµŠ“, Š°ŠŗŠ¾ ŠøŃŠŗŠ°ŃŠµ Š“Š° ŠøŠ·ŠæŠ¾Š»Š·Š²Š°ŃŠµ Š¾ŃŠøŃŠøŠ°Š»Š½ŠøŃŠµ Ń
Š¾ŃŃŠ¾Š²Šµ Š½Š° ŃŃŠ»ŃŠ³Šø."
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr "ŠŠ¾Š¶Šµ Š±Šø Š½Šµ Š·Š½Š°ŠµŃŠµ ŠŗŠ°ŠŗŠ²Š¾ Šµ BOSH ŃŃŃŠ²ŃŃ? ŠŃŃŃŠ½Š¾ŃŃ, ŃŠ¾Š²Š° Šµ Š²ŠøŠ“ Š¼ŠµŠ¶Š“ŠøŠ½Š½Š° ŃŃŠ°Š½ŃŠøŃ Š¼ŠµŠ¶Š“Ń Jappix ŠŗŠ»ŠøŠµŠ½ŃŠ° Šø Š¾ŠæŃŠµŠ“ŠµŠ»ŠµŠ½ XMPP ŃŃŃŠ²ŃŃ, ŠŗŠ°ŃŠ¾ ŃŃ Šµ Š½ŃŠ¶Š½Š° ŠæŠ¾ŃŠ°Š“Šø ŃŠµŃ
Š½ŠøŃŠµŃŠŗŠø Š¾Š³ŃŠ°Š½ŠøŃŠµŠ½ŠøŃ."
+
+msgid "Main host"
+msgstr "ŠŃŠ½Š¾Š²ŠµŠ½ Ń
Š¾ŃŃ"
+
+msgid "Groupchat host"
+msgstr "Š„Š¾ŃŃ Š½Š° Š³ŃŃŠæŠ¾Š²Šø ŃŠ°ŃŠ¾Š²Šµ"
+
+msgid "Anonymous host"
+msgstr "ŠŠ½Š¾Š½ŠøŠ¼ŠµŠ½ Ń
Š¾ŃŃ"
+
+msgid "Directory host"
+msgstr "Š„Š¾ŃŃ Š½Š° Š“ŠøŃŠµŠŗŃŠ¾ŃŠøŃŃŠ°"
+
+msgid "BOSH host"
+msgstr "BOSH Ń
Š¾ŃŃ"
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr "ŠŠ¾Š¶ŠµŃŠµ Š“Š° ŠøŠ½ŃŃŠ°Š»ŠøŃŠ°ŃŠµ Š“Š¾ŠæŃŠ»Š½ŠøŃŠµŠ»Š½Šø ŃŠ¾ŃŃŃŃŠ½Šø ŠæŃŠ¾Š“ŃŠŗŃŠø Š½Š° Š²Š°ŃŠøŃ ŃŃŃŠ²ŃŃ, Ń ŠŗŠ¾ŠøŃŠ¾ Š“Š° ŃŠ°Š·ŃŠøŃŠøŃŠµ Š²ŃŠ·Š¼Š¾Š¶Š½Š¾ŃŃŠøŃŠµ Š½Š° Š²Š°ŃŠ°ŃŠ° ŠøŠ½ŃŃŠ°Š»Š°ŃŠøŃ Š½Š° Jappix. ŠŃŠŗŠ¾Šø Š“ŃŃŠ³Šø Š¼Š¾Š³Š°Ń Š“Š° Š±ŃŠ“Š°Ń Š¼Š¾Š“ŠøŃŠøŃŠøŃŠ°Š½Šø ŠæŠ¾ŃŠ°Š“Šø Š¾Š³ŃŠ°Š½ŠøŃŠµŠ½ŠøŃ Š·Š°ŃŠ°Š“Šø ŃŠøŠ³ŃŃŠ½Š¾ŃŃŃŠ°, ŠŗŠ¾ŠøŃŠ¾ ŃŠ° ŃŠ»Š¾Š¶ŠµŠ½Šø ŠæŠ¾ ŠæŠ¾Š“ŃŠ°Š·Š±ŠøŃŠ°Š½Šµ."
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr "ŠŠ° Š“Š° ŠøŠ·ŠæŃŠ»Š½ŠøŃŠµ ŃŠ¾Š²Š° Š“ŠµŠ¹ŃŃŠ²ŠøŠµ Šµ Š½ŠµŠ¾Š±Ń
Š¾Š“ŠøŠ¼Š¾ Š“Š° ŠøŠ¼Š°ŃŠµ Š“Š¾ŃŃŃŠæ Š“Š¾ shell-Š° (ŃŠµŃŃŠæŠŗŠ°ŃŠ°) Š½Š° Š²Š°ŃŠøŃ ŃŃŃŠ²ŃŃ Šø Š“Š° Š±ŃŠ“ŠµŃŠµ Š²Š»ŠµŠ·Š»Šø Š² ŃŠøŃŃŠµŠ¼Š°ŃŠ° Š¼Ń ŠŗŠ°ŃŠ¾ root (ŠŗŠ¾ŃŠµŠ½) ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ», Ń.Šµ. Ń Š°Š“Š¼ŠøŠ½ŠøŃŃŃŠ°ŃŠøŠ²Š½Šø ŠæŃŠ°Š²Š°. ŠŠ°ŠæŠ¾Š¼Š½ŠµŃŠµ, ŃŠµ ŃŠ¾Š²Š° Šµ Š½ŠµŠ·Š°Š“ŃŠ»Š¶ŠøŃŠµŠ»Š½Š¾, Jappix ŃŠµ ŃŠ°Š±Š¾ŃŠø Šø Š±ŠµŠ· ŃŠµŠ·Šø Š¼Š¾Š“ŃŠ»Šø, Š½Š¾ Š½ŃŠŗŠ¾Šø Š¾Ń Š½ŠµŠ³Š¾Š²ŠøŃŠµ Š²ŃŠ·Š¼Š¾Š¶Š½Š¾ŃŃŠø Š¼Š¾Š¶Šµ Š“Š° Š½Šµ ŃŠ° Š½Š°Š»ŠøŃŠ½Šø Š·Š° ŠøŠ·ŠæŠ¾Š»Š·Š²Š°Š½Šµ ŠæŠ¾ŃŠ°Š“Šø ŃŠ¾Š²Š°."
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr "Š”Š»ŠµŠ“ ŠŗŠ°ŃŠ¾ ŠæŃŠøŠŗŠ»ŃŃŠøŃŠµ Ń ŠøŠ½ŃŃŠ°Š»Š°ŃŠøŃŃŠ°, Jappix ŃŠµ Š³ŠµŠ½ŠµŃŠøŃŠ°/ŃŃŠ·Š“Š°Š“Šµ ŠŗŠµŃ (cache) ŃŠ°Š¹Š»Š¾Š²ŠµŃŠµ. Š¢Š¾Š²Š° Š¼Š¾Š¶Šµ Š“Š° Š±ŃŠ“Šµ Š±Š°Š²ŠµŠ½ ŠæŃŠ¾ŃŠµŃ, Š·Š°ŃŠ¾Š²Š° ŠæŃŠ¾ŃŃŠ¾ ŠæŠ¾ŠŗŠ°ŃŠ°Š¹ŃŠµ, Š“Š¾ŠŗŠ°ŃŠ¾ ŠæŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŠµŃŠ¾ Š½Šµ ŃŠµ Š²ŠøŠ·ŃŠ°Š»ŠøŠ·ŠøŃŠ°, Šø Š¼ŠµŠ¶Š“ŃŠ²ŃŠµŠ¼ŠµŠ½Š½Š¾ Š½Šµ Š½Š°ŃŠøŃŠŗŠ°Š¹ŃŠµ ŠŗŠ°ŠŗŠ²ŠøŃŠ¾ Šø Š“Š° Šµ Š±ŃŃŠ¾Š½Šø."
+
+msgid "Thanks for using Jappix!"
+msgstr "ŠŠ»Š°Š³Š¾Š“Š°ŃŠøŠ¼ Š²Šø, ŃŠµ ŠøŠ·ŠæŠ¾Š»Š·Š²Š°ŃŠµ Jappix!"
+
+msgid "Next"
+msgstr "Š”Š»ŠµŠ“Š²Š°Ń/Š½Š°ŠæŃŠµŠ“"
+
+msgid "Finish"
+msgstr "ŠŃŠ°Š¹"
+
+msgid "Check again"
+msgstr "ŠŃŠ¾Š²ŠµŃŠµŃŠµ Š¾ŃŠ½Š¾Š²Š¾"
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr "ŠŠµ Š¼Š¾Š¶ŠµŃŠµ Š“Š° Š·Š°ŠæŠøŃŠ²Š°ŃŠµ Š² ŃŠ°Š·Šø ŠæŠ°ŠæŠŗŠ°/Š“ŠøŃŠµŠŗŃŠ¾ŃŠøŃ, ŠæŠ¾ŃŃŠ°Š²ŠµŃŠµ ŠæŃŠ°Š²ŠøŠ»Š½ŠøŃŠµ ŠæŃŠ»Š½Š¾Š¼Š¾ŃŠ½Šø ŠæŃŠ°Š²Š°/ŃŠ²Š¾Š¹ŃŃŠ²Š° Š½Š° Š“ŠøŃŠµŠŗŃŠ¾ŃŠøŃŃŠ° %s."
+
+msgid "%s is installed on your system."
+msgstr "%s Šµ ŠøŠ½ŃŃŠ°Š»ŠøŃŠ°Š½ Š½Š° Š²Š°ŃŠ°ŃŠ° ŃŠøŃŃŠµŠ¼Š°."
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr "%1s Š½Šµ Šµ ŠøŠ½ŃŃŠ°Š»ŠøŃŠ°Š½/Š°/Š¾ Š½Š° Š²Š°ŃŠ°ŃŠ° ŃŠøŃŃŠµŠ¼Š°, Š½ŃŠ¶Š½Š¾ Šµ Š“Š° ŠøŠ½ŃŃŠ°Š»ŠøŃŠ°ŃŠµ %2s."
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr "ŠŠ°ŠŗŃŠøŠ¼Š°Š»Š½Š°ŃŠ° Š³Š¾Š»ŠµŠ¼ŠøŠ½Š° Š·Š° ŠŗŠ°ŃŠ²Š°Š½Šµ Š½Š° PHP Šµ Š“Š¾ŃŃŠ°ŃŃŃŠ½Š° (%s)."
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr "ŠŠ°ŠŗŃŠøŠ¼Š°Š»Š½Š°ŃŠ° Š³Š¾Š»ŠµŠ¼ŠøŠ½Š° Š·Š° ŠŗŠ°ŃŠ²Š°Š½Šµ Š½Š°/ŃŃŠµŠ·/Ń PHP Šµ Š½ŠµŠ“Š¾ŃŃŠ°ŃŃŃŠ½Š° (%1s), Š½ŃŠ¶Š½Š¾ Šµ Š“Š° Ń ŠæŃŠ¾Š¼ŠµŠ½ŠøŃŠµ ŠŗŃŠ¼ %2s Š² %3s."
+
+msgid "Jappix manager"
+msgstr "Jappix Š¼ŠµŠ½ŠøŠ“Š¶ŃŃ"
+
+msgid "Manager access"
+msgstr "ŠŠµŠ½ŠøŠ“Š¶ŃŃŃŠŗŠø Š“Š¾ŃŃŃŠæ"
+
+msgid "Statistics"
+msgstr "Š”ŃŠ°ŃŠøŃŃŠøŠŗŠø"
+
+msgid "Hosts"
+msgstr "Š„Š¾ŃŃŠ¾Š²Šµ"
+
+msgid "Design"
+msgstr "ŠŠøŠ·Š°Š¹Š½"
+
+msgid "Repeat"
+msgstr "ŠæŠ¾Š²ŃŠ°ŃŃŠ½Šµ"
+
+msgid "All"
+msgstr "ŠŃŠøŃŠŗŠø"
+
+msgid "Horizontal"
+msgstr "Š„Š¾ŃŠøŠ·Š¾Š½ŃŠ°Š»Š½Š¾"
+
+msgid "Vertical"
+msgstr "ŠŠµŃŃŠøŠŗŠ°Š»Š½Š¾"
+
+msgid "Center"
+msgstr "Š¦ŠµŠ½ŃŃŠ°Š»Š½Š¾"
+
+msgid "Left"
+msgstr "ŠŃŠ»ŃŠ²Š¾"
+
+msgid "Right"
+msgstr "ŠŃŠ“ŃŃŠ½Š¾"
+
+msgid "Top"
+msgstr "Š³Š¾ŃŠµ"
+
+msgid "Bottom"
+msgstr "ŠŠ¾Š»Ń"
+
+msgid "Adapt"
+msgstr "ŠŠ“Š°ŠæŃŠøŠ²Š½Š¾"
+
+msgid "Color"
+msgstr "Š¦Š²ŃŃ"
+
+msgid "Users"
+msgstr "ŠŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»Šø"
+
+msgid "Updates"
+msgstr "ŠŠ±Š½Š¾Š²Š»ŠµŠ½ŠøŃ"
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr "Š¢Š¾Š²Š° Šµ Š¾Š³ŃŠ°Š½ŠøŃŠµŠ½Š° Š·Š¾Š½Š°: ŃŠ°Š¼Š¾ Š¾ŠæŃŠ°Š²Š¾Š¼Š¾ŃŠµŠ½Šø ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»Šø Š¼Š¾Š³Š°Ń Š“Š° ŃŠæŃŠ°Š²Š»ŃŠ²Š°Ń ŃŠ¾Š·Šø Jappix Š²ŃŠ·ŠµŠ»."
+
+msgid "Please use the form below to login to the administration panel."
+msgstr "ŠŠ¾Š»Ń, ŠøŠ·ŠæŠ¾Š»Š·Š²Š°Š¹ŃŠµ ŃŠ¾ŃŠ¼ŃŠ»ŃŃŠ° Š½Š°Š“Š¾Š»Ń, Š·Š° Š“Š° Š²Š»ŠµŠ·ŠµŃŠµ Š² Š°Š“Š¼ŠøŠ½ŠøŃŃŃŠ°ŃŠøŠ¾Š½Š½ŠøŃ ŠæŠ°Š½ŠµŠ»."
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr "ŠŠ° ŠæŠ¾Š“Š¾Š±ŃŃŠ²Š°Š½Šµ Š½Š° ŃŠøŠ³ŃŃŠ½Š¾ŃŃŃŠ°, ŃŠµŃŠøŠøŃŠµ ŃŠ° Š²ŃŠµŠ¼ŠµŠ²Š¾ Š¾Š³ŃŠ°Š½ŠøŃŠµŠ½Šø Šø ŠŗŠ¾Š³Š°ŃŠ¾ ŃŠµŠ±Š±ŃŠ°ŃŠ·ŃŃŃŃ Š²Šø Š±ŃŠ“Šµ Š·Š°ŃŠ²Š¾ŃŠµŠ½, Š²ŠøŠµ Š°Š²ŃŠ¾Š¼Š°ŃŠøŃŠ½Š¾ ŃŠµ Š±ŃŠ“ŠµŃŠµ ŠøŠ·Ń
Š²ŃŃŠ»ŠµŠ½Šø Š¾Ń ŃŠøŃŃŠµŠ¼Š°ŃŠ°."
+
+msgid "Credentials"
+msgstr "ŠŠŗŃŠµŠ“ŠøŃŠøŠ²Š½Šø ŠæŃŠ»Š½Š¾Š¼Š¾ŃŠ½Šø/ŠæŃŠ°Š²Š°"
+
+msgid "You have been logged out. Goodbye!"
+msgstr "ŠŠøŠµ ŠøŠ·Š»ŃŠ·Š¾Ń
ŃŠµ. ŠŠ¾Š²ŠøŠ¶Š“Š°Š½Šµ!"
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr "ŠŠæŠ°, ŃŠøŃŃŠµŠ¼Š°ŃŠ° Š½Šµ Š²Šø ŃŠ°Š·ŠæŠ¾Š·Š½Š°Š²Š° ŠŗŠ°ŃŠ¾ Š²Š°Š»ŠøŠ“ŠµŠ½ Š°Š“Š¼ŠøŠ½ŠøŃŃŃŠ°ŃŠ¾Ń. ŠŠ¾Š»Ń, ŠæŃŠ¾Š²ŠµŃŠµŃŠµ Š²ŠµŃŠ½Š¾ŃŃŃŠ° Š½Š° Š“Š°Š½Š½ŠøŃŠµ ŃŠø Š·Š° Š²Ń
Š¾Š“!"
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr ""
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr "ŠŃŠ¾Š¼ŠµŠ½ŠµŃŠµ ŠŗŠ¾Š½ŃŠøŠ³ŃŃŠ°ŃŠøŃŃŠ° Š½Š° Š²Š°ŃŠøŃ Jappix Š²ŃŠ·ŠµŠ» Ń ŃŠ¾Š·Šø ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½Ń/ŠæŠ¾Š¼Š¾ŃŠ½ŠøŠŗ."
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr "ŠŃŠ¾Š¼ŃŠ½Š° Š½Š° XMPP Ń
Š¾ŃŃŠ¾Š²ŠµŃŠµ, ŠŗŠ¾ŠøŃŠ¾ Š¾Š±ŃŠ»ŃŠ¶Š²Š° ŃŠ¾Š·Šø Jappix Š²ŃŠ·ŠµŠ», Ń ŃŠ¾Š·Šø ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½Ń/ŠæŠ¾Š¼Š¾ŃŠ½ŠøŠŗ."
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr "ŠŃŠøŃŠŗŠø ŃŃŃ
ŃŠ°Š½ŠµŠ½Šø ŃŠ°Š¹Š»Š¾Š²Šµ Š·Š°/Š½Š° ŃŠ¾Š·Šø Jappix Š²ŃŠ·ŠµŠ» Š¼Š¾Š³Š°Ń Š“Š° Š±ŃŠ“Š°Ń ŃŠæŃŠ°Š²Š»ŃŠ²Š°Š½Šø Ń ŃŠ¾Š·Šø ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½Ń/ŠæŠ¾Š¼Š¾ŃŠ½ŠøŠŗ: Š·Š° ŃŠµŠ»ŃŠ°, Š¼Š¾Š»Ń, ŠøŠ·Š±ŠµŃŠµŃŠµ ŠæŠ¾Š“ŠæŠ°ŠæŠŗŠ° Šø Š·Š°ŠæŠ¾ŃŠ½ŠµŃŠµ Š“Š° ŃŠµŠ“Š°ŠŗŃŠøŃŠ°ŃŠµ ŃŃŠ“ŃŃŠ¶Š°Š½ŠøŠµŃŠ¾ Ń!"
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr "Jappix Š¼Š¾Š¶Šµ Š½Š°ŠæŃŠ»Š½Š¾ Š“Š° ŃŠµ ŠæŃŠ¾Š¼ŠµŠ½Šø ŠæŠ¾ Š²ŠŗŃŃŠ° Š²Šø: Š¼Š¾Š¶ŠµŃŠµ Š“Š° ŠæŃŠ¾Š¼ŠµŠ½ŠøŃŠµ Š½ŠµŠ³Š¾Š²ŠøŃ Š“ŠøŠ·Š°Š¹Š½ Š¾Ń ŃŃŠŗ."
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr "ŠŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŃŠ¾ Šµ Š½ŠµŠ²Š°Š»ŠøŠ“Š½Š¾, Š¼Š¾Š»Ń, ŠøŠ·ŠæŠ¾Š»Š·Š²Š°Š¹ŃŠµ ŠøŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃ Ń ŃŠ°Š¹Š»Š¾Š²Šø ŃŠ¾ŃŠ¼Š°ŃŠø PNG, GIF ŠøŠ»Šø JPG!"
+
+msgid "The image could not be received, would you mind retry?"
+msgstr "ŠŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµŃŠ¾ Š½Šµ Š¼Š¾Š¶Šµ Š“Š° Š±ŃŠ“Šµ ŠæŠ¾Š»ŃŃŠµŠ½Š¾, Š±ŠøŃ
ŃŠµ Š»Šø ŠæŃŠ¾Š±Š²Š°Š»Šø Š“Š° Š³Š¾ ŠøŠ·ŠæŃŠ°ŃŠøŃŠµ Š¾ŃŠ½Š¾Š²Š¾?"
+
+msgid "Your image was added to the list!"
+msgstr "ŠŠ°ŃŠµŃŠ¾ ŠøŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµ Šµ Š“Š¾Š±Š°Š²ŠµŠ½Š¾ ŠŗŃŠ¼ ŃŠæŠøŃŃŠŗŠ°!"
+
+msgid "Changes saved!"
+msgstr "ŠŃŠ¾Š¼ŠµŠ½ŠøŃŠµ ŃŠ° Š·Š°ŠæŠ°Š·ŠµŠ½Šø!"
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr "ŠŠ¾Š¶ŠµŃŠµ Š“Š° ŠøŠ·Š±ŠµŃŠµŃŠµ ŠæŠ¾Š²ŠµŃŠµ Š¾Ń ŠµŠ“ŠøŠ½ Š°Š“Š¼ŠøŠ½ŠøŃŃŃŠ°ŃŠ¾Ń Š·Š° ŃŠ¾Š·Šø Jappix Š²ŃŠ·ŠµŠ». Š”ŃŃŠ¾ ŃŠ°ŠŗŠ° Š¼Š¾Š¶ŠµŃŠµ Š“Š° ŠæŃŠ¾Š¼ŠµŠ½ŠøŃŠµ ŠæŠ°ŃŠ¾Š»Š° ŃŃŠµŠ· ŃŠ¾Š·Šø ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½Ń/ŠæŠ¾Š¼Š¾ŃŠ½ŠøŠŗ."
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr "Š” ŃŠ¾Š·Šø ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½Ń/ŠæŠ¾Š¼Š¾ŃŠ½ŠøŠŗ Š¼Š¾Š¶ŠµŃŠµ Š“Š° Š¾Š±Š½Š¾Š²ŠøŃŠµ Š²ŠµŃŃŠøŃŃŠ° Š½Š° Š²Š°ŃŠøŃ Jappix Š²ŃŠ·ŠµŠ», ŠøŠ»Šø Š“Š° ŠæŃŠ¾Š²ŠµŃŠøŃŠµ Š“Š°Š»Šø Šµ Š½Š°Š»ŠøŃŠ½Š° Š½Š¾Š²Š° Š²ŠµŃŃŠøŃ. ŠŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŃ Š¾ŃŠ½Š¾ŃŠ½Š¾ Š½Š°Š¹-Š½Š¾Š²Š°ŃŠ° Š²ŠµŃŃŠøŃ ŃŃŃŠ¾ ŃŠµ ŠæŠ¾ŠŗŠ°Š·Š²Š° (Š½Š° Š°Š½Š³Š»ŠøŠ¹ŃŠŗŠø)."
+
+msgid "Access statistics"
+msgstr "ŠŠ¾ŃŃŃŠæ Š“Š¾ ŃŃŠ°ŃŠøŃŃŠøŠŗŠøŃŠµ"
+
+msgid "Share statistics"
+msgstr "Š”ŠæŠ¾Š“ŠµŠ»ŃŠ½Šµ Š½Š° ŃŃŠ°ŃŠøŃŃŠøŠŗŠøŃŠµ"
+
+msgid "Other statistics"
+msgstr "ŠŃŃŠ³Šø ŃŃŠ°ŃŠøŃŃŠøŠŗŠø"
+
+msgid "January"
+msgstr "ŃŠ½ŃŠ°ŃŠø"
+
+msgid "February"
+msgstr "ŃŠµŠ²ŃŃŠ°ŃŠø"
+
+msgid "March"
+msgstr "Š¼Š°ŃŃ"
+
+msgid "April"
+msgstr "Š°ŠæŃŠøŠ»"
+
+msgid "May"
+msgstr "Š¼Š°Š¹"
+
+msgid "June"
+msgstr "ŃŠ½Šø"
+
+msgid "July"
+msgstr "ŃŠ»Šø"
+
+msgid "August"
+msgstr "Š°Š²Š³ŃŃŃ"
+
+msgid "September"
+msgstr "ŃŠµŠæŃŠµŠ¼Š²ŃŠø"
+
+msgid "October"
+msgstr "Š¾ŠŗŃŠ¾Š¼Š²ŃŠø"
+
+msgid "November"
+msgstr "Š½Š¾ŠµŠ¼Š²ŃŠø"
+
+msgid "December"
+msgstr "Š“ŠµŠŗŠµŠ¼Š²ŃŠø"
+
+msgid "Monday"
+msgstr "ŠæŠ¾Š½ŠµŠ“ŠµŠ»Š½ŠøŠŗ"
+
+msgid "Tuesday"
+msgstr "Š²ŃŠ¾ŃŠ½ŠøŠŗ"
+
+msgid "Wednesday"
+msgstr "ŃŃŃŠ“Š°"
+
+msgid "Thursday"
+msgstr "ŃŠµŃŠ²ŃŃŃŃŠŗ"
+
+msgid "Friday"
+msgstr "ŠæŠµŃŃŠŗ"
+
+msgid "Saturday"
+msgstr "ŃŃŠ±Š¾ŃŠ°"
+
+msgid "Sunday"
+msgstr "Š½ŠµŠ“ŠµŠ»Ń"
+
+msgid "Total"
+msgstr "ŠŠ±ŃŠ¾"
+
+msgid "Cache"
+msgstr "ŠŠµŃ (cache)"
+
+msgid "Logs"
+msgstr "ŠŠ½ŠµŠ²Š½ŠøŃŠø (logs)"
+
+msgid "Music"
+msgstr "ŠŃŠ·ŠøŠŗŠ°"
+
+msgid "Backgrounds"
+msgstr "Š¤Š¾Š½Š¾Š²Šµ"
+
+msgid "Share"
+msgstr "Š”ŠæŠ¾Š“ŠµŠ»ŃŠ½Šµ"
+
+msgid "Background"
+msgstr "Š¤Š¾Š½"
+
+msgid "Notice"
+msgstr "ŠŠµŠ»ŠµŠ¶ŠŗŠ°"
+
+msgid "Your design preferences have been saved!"
+msgstr "ŠŃŠµŠ“ŠæŠ¾ŃŠøŃŠ°Š½ŠøŃŃŠ° Š²Šø Š·Š° Š“ŠøŠ·Š°Š¹Š½Š° ŃŠ° Š·Š°ŠæŠ°Š·ŠµŠ½Šø!"
+
+msgid "Please check your inputs: something is missing!"
+msgstr "ŠŠ¾Š»Ń, ŠæŃŠ¾Š²ŠµŃŠµŃŠµ ŃŠ²Š¾ŠøŃŠµ Š²Ń
Š¾Š“Š½Šø Š“Š°Š½Š½Šø: Š½ŠµŃŠ¾ Š»ŠøŠæŃŠ²Š°!"
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr "ŠŃŠ¾Š¼ŠµŠ½ŠµŃŠµ ŃŠ¾Š½Š° Š½Š° Š²Š°ŃŠøŃ Jappix Š²ŃŠ·ŠµŠ» Ń ŃŠ¾Š·Šø ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½Ń. ŠŠ¾Š¶ŠµŃŠµ ŠøŠ»Šø Š“Š° ŃŠ»Š¾Š¶ŠøŃŠµ ŃŠ²ŃŃ ŠæŠ¾ ŠøŠ·Š±Š¾Ń Š·Š° ŃŠ¾Š½, ŠøŠ»Šø Š“Š° ŠøŠ·ŠæŠ¾Š»Š·Š²Š°ŃŠµ ŠŗŠ°ŃŠµŠ½Š¾ ŠøŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµ Š·Š° ŃŠ¾Š½. ŠŠµŠŗŠ° Š²Š°ŃŠ°ŃŠ° ŠŗŃŠµŠ°ŃŠøŠ²Š½Š¾ŃŃ ŃŠµ Š»ŠµŠµ!"
+
+msgid "Use default background"
+msgstr "ŠŠ·ŠæŠ¾Š»Š·Š²Š°Š½Šµ Š½Š° ŃŠ¾Š½Š° ŠæŠ¾ ŠæŠ¾Š“ŃŠ°Š·Š±ŠøŃŠ°Š½Šµ (ŃŠ°Š±ŃŠøŃŠ½ŠøŃ ŃŠ¾Š½)"
+
+msgid "Use your own image"
+msgstr "ŠŠ·ŠæŠ¾Š»Š·Š²Š°Š½Šµ Š½Š° Š²Š°ŃŠµ ŠøŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµ"
+
+msgid "Select a background to use and change the display options."
+msgstr "ŠŠ·Š±ŠµŃŠµŃŠµ ŃŠ¾Š½Š°, ŠŗŠ¾Š¹ŃŠ¾ ŃŠµ ŠøŠ·ŠæŠ¾Š»Š·Š²Š°ŃŠµ, Šø ŠæŃŠ¾Š¼ŠµŠ½ŠµŃŠµ Š½Š°ŃŃŃŠ¾Š¹ŠŗŠøŃŠµ Š·Š° Š²ŠøŠ·ŃŠ°Š»ŠøŠ·Š°ŃŠøŃ."
+
+msgid "Use your own color"
+msgstr "ŠŠ·ŠæŠ¾Š»Š·Š²Š°Š½Šµ Š½Š° ŃŠ²ŃŃ ŠæŠ¾ Š²Š°Ń ŠøŠ·Š±Š¾Ń"
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr "ŠŃŠ²ŠµŠ“ŠµŃŠµ ŃŠµŃŃŠ½Š°Š“ŠµŃŠµŃŠøŃŠ½Š°ŃŠ° (HTML hex) ŃŃŠ¾Š¹Š½Š¾ŃŃ Š½Š° ŃŠ²ŠµŃŠ°, ŠŗŠ¾Š¹ŃŠ¾ ŠøŃŠŗŠ°ŃŠµ Š“Š° ŠøŠ·ŠæŠ¾Š»Š·Š²Š°ŃŠµ Š·Š° ŃŠ¾Š½."
+
+msgid "Manage backgrounds"
+msgstr "Š£ŠæŃŠ°Š²Š»ŠµŠ½ŠøŠµ Š½Š° ŃŠ¾Š½Š¾Š²ŠµŃŠµ"
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr "ŠŠ¾Š¶ŠµŃŠµ Š“Š° Š“Š¾Š±Š°Š²ŠøŃŠµ Š½Š¾Š² ŃŠ¾Š½ ŠŗŃŠ¼ ŃŠæŠøŃŃŠŗŠ° Ń ŠæŠ¾Š¼Š¾ŃŃŠ° Š½Š° ŃŠ¾Š·Šø ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½Ń/ŠæŠ¾Š¼Š¾ŃŠ½ŠøŠŗ. ŠŠ¾Š»Ń, ŠŗŠ°ŃŠµŃŠµ Š²Š°Š»ŠøŠ“Š½Š¾ ŠøŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµ."
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr ""
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr "Š” ŃŠ¾Š·Šø ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½Ń/ŠæŠ¾Š¼Š¾ŃŠ½ŠøŠŗ Š¼Š¾Š¶ŠµŃŠµ Š“Š° Š“ŠµŃŠøŠ½ŠøŃŠ°ŃŠµ ŃŃŠ“ŃŃŠ¶Š°Š½ŠøŠµŃŠ¾ Š½Š° Š±ŠµŠ»ŠµŠ¶ŠŗŠ° (Š·Š° ŠæŠ¾ŠŗŠ°Š·Š²Š°Š½Šµ Š½Š° Š¾ŃŠ½Š¾Š²Š½Š°ŃŠ° ŃŃŃŠ°Š½ŠøŃŠ° Š½Š° Jappix Š²ŃŠ·ŠµŠ»Š° Š²Šø), Š½Š°ŠæŃŠøŠ¼ŠµŃ ŠæŃŠµŠ“ŃŠæŃŠµŠ¶Š“ŠµŠ½ŠøŠµ, Š²Š°Š¶Š½Š¾ ŃŃŠ¾Š±ŃŠµŠ½ŠøŠµ ŠøŠ»Šø ŃŠµŠŗŠ»Š°Š¼Š°."
+
+msgid "Simple notice"
+msgstr "ŠŃŠ¾ŃŃŠ° Š±ŠµŠ»ŠµŠ¶ŠŗŠ°"
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr "Š¢Š¾Š²Š° ŠøŠ·Š²ŠµŃŃŠøŠµ ŠøŠ·ŠøŃŠŗŠ²Š° Š²ŠøŠ·ŃŠ°Š»ŠøŠ·Š°ŃŠøŃŃŠ° ŃŠ°Š¼Š¾ Š½Š° ŠæŃŠ¾ŃŃ ŃŠµŠŗŃŃ, Š½Š¾ Š½Šµ Šµ ŠæŠ¾Š·Š²Š¾Š»ŠµŠ½Š° ŃŠæŠ¾ŃŃŠµŠ±Š°ŃŠ° Š½Š° ŠŗŠ¾Š“ Š² Š½ŠµŠ³Š¾!"
+
+msgid "Advanced notice"
+msgstr "Š Š°Š·ŃŠøŃŠµŠ½Š° Š±ŠµŠ»ŠµŠ¶ŠŗŠ°"
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr "ŠŠ¾Š¶ŠµŃŠµ Š“Š° ŠæŃŠ¾Š¼ŠµŠ½ŠøŃŠµ ŠæŠ¾ Š²ŠŗŃŃŠ° Š²Šø Š±ŠµŠ»ŠµŠ¶ŠŗŠ°ŃŠ° ŃŃŠµŠ· Š²Š³ŃŠ°Š“ŠµŠ½Šø (embedded) HTML, CSS Šø JavaScript, Š½Š¾ ŃŃŃŠ±Š²Š° ŃŠ°Š¼Šø Š“Š° ŠŗŠ¾Š“ŠøŃŠ°ŃŠµ (Š½Š°ŠæŠøŃŠµŃŠµ ŠŗŠ¾Š“Š°) Š½Š° ŃŃŠøŠ»Š°."
+
+msgid "Available updates"
+msgstr "ŠŠ±Š½Š¾Š²Š»ŠµŠ½ŠøŃ (ŃŠæŠ“ŠµŠ¹ŃŠø) Š½Š° ŃŠ°Š·ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµ"
+
+msgid "What's new?"
+msgstr "ŠŠ°ŠŗŠ²Š¾ Š½Š¾Š²Š¾?"
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr "ŠŠ°ŃŠøŃŠµ ŠæŠ°ŠæŠŗŠøŃŠµ/Š“ŠøŃŠµŠŗŃŠ¾ŃŠøŠø Ń
ŃŠ°Š½ŠøŠ»ŠøŃŠ° Š½Šµ ŠæŠ¾Š·Š²Š¾Š»ŃŠ²Š°Ń Š·Š°ŠæŠøŃ Š² ŃŃŃ
, Š¼Š¾Š»Ń, ŠæŃŠøŠ»Š¾Š¶ŠµŃŠµ ŠæŃŠ°Š²ŠøŠ»Š½ŠøŃŠµ ŠæŃŠ°Š²Š¾Š¼Š¾ŃŠøŃ/ŃŠ²Š¾Š¹ŃŃŠ²Š° Š·Š° ŠæŠ°ŠæŠŗŠøŃŠµ!"
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr "%1s Š¼Š¾Š¶Šµ Š“Š° ŠæŃŠµŠ“ŠøŠ·Š²ŠøŠŗŠ° ŠæŃŠ¾Š±Š»ŠµŠ¼Šø Š½Š° ŠæŃŠ¾ŠŗŃŠøŃŠ¾ (ŃŃŃŠ²ŃŃŠ°-ŠæŠ¾ŃŃŠµŠ“Š½ŠøŠŗ), Š¼Š¾Š»Ń, ŃŠ²ŠµŠ»ŠøŃŠµŃŠµ ŃŃŠ¾Š¹Š½Š¾ŃŃŃŠ° %2s Š“Š¾ %3s!"
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr "ŠŠ·ŠæŠ¾Š»Š·Š²Š°ŃŠµ Š²ŠµŃŃŠøŃ Š½Š° Jappix Š·Š° ŃŠ°Š·ŃŠ°Š±Š¾ŃŃŠøŃŠø (Ń.Šµ. Š½Šµ ŃŃŠ°Š±ŠøŠ»Š½Š° Š²ŠµŃŃŠøŃ Š·Š° ŠŗŃŠ°Š¹Š½Šø ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»Šø, Š° Š½ŠµŃŃŠ°Š±ŠøŠ»Š½Š° Š²ŠµŃŃŠøŃ Š·Š° ŃŠ°Š·ŃŠ°Š±Š¾ŃŃŠøŃŠø). ŠŠ¾Š¶ŠµŃŠµ Š“Š° Š¾Š±Š½Š¾Š²ŠøŃŠµ Jappix ŃŃŠµŠ· Š½Š°ŃŠµŃŠ¾ Ń
ŃŠ°Š½ŠøŠ»ŠøŃŠµ, ŠŗŠ°ŃŠ¾ ŠøŠ·ŠæŃŠ»Š½ŠøŃŠµ ŠŗŠ¾Š¼Š°Š½Š“Š°ŃŠ°: %s."
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr "ŠŠ°Š»ŠøŃŠ½Š° Šµ Š½Š¾Š²Š° Š²ŠµŃŃŠøŃ Š½Š° Jappix! ŠŃŠ¾Š²ŠµŃŠµŃŠµ ŠŗŠ°ŠŗŠ²Š¾ Š½Š¾Š²Š¾ ŠøŠ¼Š° Šø ŠæŃŃŠ½ŠµŃŠµ Š“Š° ŃŠµ ŠøŠ½ŃŃŠ°Š»ŠøŃŠ° Š¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŠµŃŠ¾ (ŃŠæŠ“ŠµŠ¹ŃŠ°)!"
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr "ŠŠ·ŠæŠ¾Š»Š·Š²Š°ŃŠµ Š¾ŃŃŠ°ŃŃŠ»Š° Š²ŠµŃŃŠøŃ. ŠŠ¾Š¶ŠµŃŠµ Š“Š° Š¾Š±Š½Š¾Š²ŠøŃŠµ Jappix Š“Š¾ ŠæŠ¾-Š½Š¾Š²Š°ŃŠ° Š½Š°Š»ŠøŃŠ½Š° Š²ŠµŃŃŠøŃ (%s), ŠŗŠ°ŃŠ¾ Š½Š°ŃŠøŃŠ½ŠµŃŠµ ŃŃŠŗ!"
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr "ŠŠ°ŃŠ°ŃŠ° Š²ŠµŃŃŠøŃ Š½Š° ŠæŃŠ¾Š³ŃŠ°Š¼Š°ŃŠ° ŠøŠ·Š³Š»ŠµŠ¶Š“Š° Šµ Š½Š°Š¹-Š½Š¾Š²Š°ŃŠ° Š½Š°Š»ŠøŃŠ½Š°, Š½Š¾ ŠæŠ¾ Š¶ŠµŠ»Š°Š½ŠøŠµ Š¼Š¾Š¶ŠµŃŠµ Š“Š° ŠæŃŠ¾Š²ŠµŃŃŠ²Š°ŃŠµ ŃŃŃŠ½Š¾ Š·Š° Š¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŃ (ŃŠæŠ“ŠµŠ¹ŃŠø), ŠŗŠ°ŃŠ¾ Š½Š°ŃŠøŃŠ½ŠµŃŠµ ŃŃŠŗ."
+
+msgid "Check for updates"
+msgstr "ŠŃŠ¾Š²ŠµŃŠŗŠ° Š·Š° Š¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŃ (ŃŠæŠ“ŠµŠ¹ŃŠø)"
+
+msgid "Update in progress"
+msgstr "Š ŠæŃŠ¾ŃŠµŃ Š½Š° Š¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŠµ (ŃŠæŠ“ŠµŠ¹ŃŠ²Š°Š½Šµ)..."
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr "Jappix Šµ Š¾Š±Š½Š¾Š²ŠµŠ½: ŃŠµŠ³Š° ŠøŠ·ŠæŠ¾Š»Š·Š²Š°ŃŠµ Š½Š°Š¹-Š½Š¾Š²Š°ŃŠ° Š²ŠµŃŃŠøŃ. ŠŃŠøŃŃŠ½Š¾ ŠæŠ¾Š»Š·Š²Š°Š½Šµ!"
+
+msgid "The update has failed! Please try again later."
+msgstr "ŠŠ±Š½Š¾Š²ŃŠ²Š°Š½ŠµŃŠ¾ Šµ Š½ŠµŃŃŠæŠµŃŠ½Š¾! ŠŠ¾Š»Ń, Š¾ŠæŠøŃŠ°Š¹ŃŠµ Š¾ŃŠ½Š¾Š²Š¾ ŠæŠ¾-ŠŗŃŃŠ½Š¾!"
+
+msgid "Downloading package..."
+msgstr "ŠŠ·ŃŠµŠ³Š»ŃŠ½Šµ Š½Š° ŠæŠ°ŠŗŠµŃŠ°..."
+
+msgid "Removing current Jappix system files..."
+msgstr "ŠŃŠµŠ¼Š°Ń
Š²Š°Š½Šµ/ŠøŠ·ŃŃŠøŠ²Š°Š½Šµ Š½Š° Š½Š°ŃŃŠ¾ŃŃŠøŃŠµ ŃŠøŃŃŠµŠ¼Š½Šø ŃŠ°Š¹Š»Š¾Š²Šµ Š½Š° Jappix..."
+
+msgid "Extracting package..."
+msgstr "ŠŠ·Š²Š»ŠøŃŠ°Š½Šµ Š½Š° ŠæŠ°ŠŗŠµŃŠ°..."
+
+msgid "Regenerating storage folder tree..."
+msgstr "ŠŃŠµŠ·Š°ŃŠµŠ¶Š“Š°Š½Šµ Š½Š° Š“ŃŃŠ²Š¾Š²ŠøŠ“Š½Š°ŃŠ° ŃŃŃŃŠŗŃŃŃŠ° Š½Š° Ń
ŃŠ°Š½ŠøŠ»ŠøŃŠ½ŠøŃŠµ ŠæŠ°ŠæŠŗŠø..."
+
+msgid "Jappix is now up to date!"
+msgstr "Jappix Šµ Š²ŠµŃŠµ Š¾Š±Š½Š¾Š²ŠµŠ½ Š“Š¾ Š½Š°Š¹-Š½Š¾Š²Š°ŃŠ° Š²ŠµŃŃŠøŃ!"
+
+msgid "Aborted: socket error!"
+msgstr "ŠŃŠµŠŗŃŃŠ½Š°ŃŠ° Š¾ŠæŠµŃŠ°ŃŠøŃ: ŃŠ¾ŠŗŃŠ»Š½Š° (socket) Š³ŃŠµŃŠŗŠ°!"
+
+msgid "Aborted: buffer error!"
+msgstr "ŠŠµŃŃŠæŠµŃŠ½Š° Š¾ŠæŠµŃŠ°ŃŠøŃ: Š±ŃŃŠµŃŠ½Š° Š³ŃŠµŃŠŗŠ°!"
+
+msgid "Aborted: everything is not writable!"
+msgstr "ŠŠµŃŃŠæŠµŃ
: Š½Šµ Š²ŃŠøŃŠŗŠ¾ Šµ Š·Š°ŠæŠøŃŠ²Š°ŠµŠ¼Š¾ (writable)!"
+
+msgid "Aborted: could not extract the package!"
+msgstr "ŠŠæŠµŃŠ°ŃŠøŃŃŠ° Šµ Š½ŠµŃŃŠæŠµŃŠ½Š°: ŠæŠ°ŠŗŠµŃŃŃ Š½Šµ Š¼Š¾Š¶Šµ Š“Š° ŃŠµ ŠøŠ·Š²Š»ŠµŃŠµ!"
+
+msgid "Visits"
+msgstr "ŠŠ¾ŃŠµŃŠµŠ½ŠøŃ"
+
+msgid "Daily"
+msgstr "Š“Š½ŠµŠ²Š½Š¾"
+
+msgid "Weekly"
+msgstr "ŃŠµŠ“Š¼ŠøŃŠ½Š¾"
+
+msgid "Monthly"
+msgstr "Š¼ŠµŃŠµŃŠ½Š¾"
+
+msgid "Yearly"
+msgstr "Š³Š¾Š“ŠøŃŠ½Š¾"
+
+msgid "Size"
+msgstr "ŠŠ¾Š»ŠµŠ¼ŠøŠ½Š°"
+
+msgid "Clean everything"
+msgstr "ŠŠ·ŃŠøŃŃŠ²Š°Š½Šµ Š½Š° Š²ŃŠøŃŠŗŠ¾/-Šø"
+
+msgid "Purge cache"
+msgstr "ŠŠ·ŃŃŠøŠ²Š°Š½Šµ Š½Š° ŠŗŠµŃŠ° (cache)"
+
+msgid "Purge logs"
+msgstr "ŠŠ·ŃŃŠøŠ²Š°Š½Šµ Š½Š° Š“Š½ŠµŠ²Š½ŠøŃŠøŃŠµ (logs)"
+
+msgid "Purge updates"
+msgstr "ŠŠ·ŃŃŠøŠ²Š°Š½Šµ/Š¾ŃŠøŃŃŠ²Š°Š½Šµ Š½Š° Š¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŃ"
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr "ŠŠ°ŠæŠŗŠ°ŃŠ° Š·Š° ŃŃŃ
ŃŠ°Š½ŠµŠ½ŠøŠµ, ŠŗŠ¾ŃŃŠ¾ ŠøŃŠŗŠ°Ń
ŃŠµ Š“Š° ŠæŃŠ¾ŃŠøŃŃŠøŃŠµ, Šµ Š¾ŠæŃŠ°Š·Š½ŠµŠ½Š°!"
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr "ŠŠ¾Š“Š“ŃŃŠ¶Š°Š¹ŃŠµ Š²Š°ŃŠøŃ Jappix Š²ŃŠ·ŠµŠ» ŃŠ²ŠµŠ¶ Šø Š±ŃŃŠ· ŠŗŠ°ŃŠ¾ ŠæŃŠ¾ŃŠøŃŃŠ²Š°ŃŠµ Ń
ŃŠ°Š½ŠøŠ»ŠøŃŠ½ŠøŃŠµ ŠæŠ°ŠæŠŗŠø ŃŠµŃŃŠ¾!"
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr "ŠŠ°ŃŠµŃŠµ (ŃŠæŠ»Š¾ŃŠ“Š½ŠµŃŠµ) Š²Š°ŃŠ° Š¼ŃŠ·ŠøŠŗŠ° (ŠæŠ¾Š·Š²Š¾Š»ŠµŠ½Šø ŃŠ°Š¹Š»Š¾Š²Šø ŃŠ¾ŃŠ¼Š°ŃŠø: Ogg Vorbis, MP3 ŠøŠ»Šø WAV), Š·Š° Š“Š° Š¼Š¾Š¶ŠµŃŠµ Š“Š° Ń ŃŠ»ŃŃŠ°ŃŠµ Š² Jappix."
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr "Š¤Š°Š¹Š»ŃŃ, ŠŗŠ¾Š¹ŃŠ¾ ŠøŃŠŗŠ°ŃŠµ Š“Š° ŠŗŠ°ŃŠøŃŠµ (ŃŠæŠ»Š¾ŃŠ“Š½ŠµŃŠµ) ŃŃŃŠ±Š²Š° Š“Š° Šµ ŠæŠ¾-Š¼Š°Š»ŃŠŗ Š¾Ń %s."
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr "Š”Š»ŠµŠ“ŠµŃŠµ ŠŗŠ°ŠŗŠ²Š¾ ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŠøŃŠµ Š²Šø ŃŃŃ
ŃŠ°Š½ŃŠ²Š°Ń Š½Š° Š²Š°ŃŠøŃ ŃŃŃŠ²ŃŃ Šø ŠæŃŠµŠ¼Š°Ń
Š²Š°Š¹ŃŠµ/ŠøŠ·ŃŃŠøŠ²Š°Š¹ŃŠµ Š½ŠµŠ¶ŠµŠ»Š°ŃŠµŠ»Š½Š¾ ŃŃŠ“ŃŃŠ¶Š°Š½ŠøŠµ ŃŃŠµŠ· ŃŠ¾Š·Šø ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½Ń/ŠæŠ¾Š¼Š¾ŃŠ½ŠøŠŗ."
+
+msgid "Title"
+msgstr "ŠŠ°Š³Š»Š°Š²ŠøŠµ"
+
+msgid "Artist"
+msgstr "ŠŠ·ŠæŃŠ»Š½ŠøŃŠµŠ»/Š°Š²ŃŠ¾Ń"
+
+msgid "Album"
+msgstr "ŠŠ»Š±ŃŠ¼"
+
+msgid "File"
+msgstr "Š¤Š°Š¹Š»"
+
+msgid "Upload"
+msgstr "ŠŠ°ŃŠ²Š°Š½Šµ"
+
+msgid "The folder is empty."
+msgstr "Š¢Š°Š·Šø ŠæŠ°ŠæŠŗŠ°/Š“ŠøŃŠµŠŗŃŠ¾ŃŠøŃ Šµ ŠæŃŠ°Š·Š½Š°."
+
+msgid "The music could not be received, please retry!"
+msgstr "ŠŃŠ·ŠøŠŗŠ°Š»Š½ŠøŃŃ ŃŠ°Š¹Š» Š½Šµ Š¼Š¾Š¶Šµ Š“Š° Š±ŃŠ“Šµ ŠæŠ¾Š»ŃŃŠµŠ½, Š¼Š¾Š»Ń, ŠæŃŠ¾Š±Š²Š°Š¹ŃŠµ Š¾ŃŠ½Š¾Š²Š¾!"
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr "Š¢Š¾Š²Š° Šµ Š½ŠµŠ²Š°Š»ŠøŠ“ŠµŠ½ Š¼ŃŠ·ŠøŠŗŠ°Š»ŠµŠ½ (Š°ŃŠ“ŠøŠ¾) ŃŠ°Š¹Š», Š¼Š¾Š»Ń, ŠæŃŠµŠŗŠ¾Š“ŠøŃŠ°Š¹ŃŠµ (ŃŃŠ°Š½ŃŠŗŠ¾Š“ŠøŃŠ°Š¹ŃŠµ) ŃŠ°Š¹Š»Š° ŠŗŃŠ¼ ŃŠ¾ŃŠ¼Š°ŃŠø ŠŗŠ°ŃŠ¾ Ogg Vorbis, MP3 ŠøŠ»Šø WAV!"
+
+msgid "Your music has been added!"
+msgstr "ŠŃŠ·ŠøŠŗŠ°ŃŠ° Š²Šø Šµ Š“Š¾Š±Š°Š²ŠµŠ½Š°!"
+
+msgid "The selected elements have been removed."
+msgstr "ŠŠ·Š±ŃŠ°Š½ŠøŃŠµ ŠµŠ»ŠµŠ¼ŠµŠ½ŃŠø ŃŠ° ŠæŃŠµŠ¼Š°Ń
Š½Š°ŃŠø/ŠøŠ·ŃŃŠøŃŠø."
+
+msgid "You must select elements to remove!"
+msgstr "Š¢ŃŃŠ±Š²Š° Š“Š° ŠøŠ·Š±ŠµŃŠµŃŠµ ŠµŠ»ŠµŠ¼ŠµŠ½ŃŠø Š·Š° ŠæŃŠµŠ¼Š°Ń
Š²Š°Š½Šµ!"
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr "Š” ŃŠ¾Š·Šø ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½Ń Š¼Š¾Š¶ŠµŃŠµ Š“Š° Š“Š¾Š±Š°Š²ŠøŃŠµ Š½Š¾Š² ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ» ŠøŠ»Šø Š“Š° ŠæŃŠ¾Š¼ŠµŠ½ŠøŃŠµ ŠæŠ°ŃŠ¾Š»Š° (Š·Š° ŃŠ¾Š²Š° Šµ Š½ŃŠ¶Š½Š¾ Š“Š° Š²ŃŠ²ŠµŠ“ŠµŃŠµ ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠ¾ŃŠ¾ ŠøŠ¼Šµ/ŠæŃŠµŠ²Š“Š¾Š½ŠøŠ¼ Š½Š° ŃŃŃŠµŃŃŠ²ŃŠ²Š°Ń ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»). ŠŠ¾Š»Ń, ŠøŠ·ŠæŠ¾Š»Š·Š²Š°Š¹ŃŠµ ŃŠøŠ»Š½Š° (ŃŠøŠ³ŃŃŠ½Š°) ŠæŠ°ŃŠ¾Š»Š°!"
+
+msgid "Manage"
+msgstr "Š£ŠæŃŠ°Š²Š»ŠµŠ½ŠøŠµ"
+
+msgid "List"
+msgstr "Š”ŠæŠøŃŃŠŗ"
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr "Š” ŃŠ¾Š·Šø ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½Ń/ŠæŠ¾Š¼Š¾ŃŠ½ŠøŠŗ Š¼Š¾Š¶ŠµŃŠµ Š“Š° ŠæŃŠµŠ¼Š°Ń
Š²Š°ŃŠµ/ŠøŠ·ŃŃŠøŠ²Š°ŃŠµ ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»Šø. ŠŠ±ŃŃŠ½ŠµŃŠµ Š²Š½ŠøŠ¼Š°Š½ŠøŠµ Š½Š° ŃŠ¾Š²Š°, ŃŠµ Š½Šµ Š¼Š¾Š¶ŠµŃŠµ Š“Š° ŠæŃŠµŠ¼Š°Ń
Š½ŠµŃŠµ ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ» Š¾Ń ŃŠøŃŃŠµŠ¼Š°ŃŠ°, Š°ŠŗŠ¾ ŃŠ¾Š¹ Šµ ŠµŠ“ŠøŠ½ŃŃŠ²ŠµŠ½ŠøŃŃ ŃŃŃŠµŃŃŠ²ŃŠ²Š°Ń/Š²ŠæŠøŃŠ°Š½."
+
+msgid "The user has been added!"
+msgstr "ŠŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŃ Šµ Š“Š¾Š±Š°Š²ŠµŠ½!"
+
+msgid "The chosen users have been removed."
+msgstr "ŠŠ·Š±ŃŠ°Š½ŠøŃŠµ ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»Šø ŃŠ° ŠæŃŠµŠ¼Š°Ń
Š½Š°ŃŠø."
+
+msgid "You must select one or more users to be removed!"
+msgstr "Š¢ŃŃŠ±Š²Š° Š“Š° ŠøŠ·Š±ŠµŃŠµŃŠµ ŠµŠ“ŠøŠ½ ŠøŠ»Šø ŠæŠ¾Š²ŠµŃŠµ ŠæŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»Šø, ŠŗŠ¾ŠøŃŠ¾ ŠøŃŠŗŠ°ŃŠµ Š“Š° ŠæŃŠµŠ¼Š°Ń
Š½ŠµŃŠµ Š¾Ń ŃŠæŠøŃŃŠŗŠ°!"
+
+msgid "Yesterday"
+msgstr "Š²ŃŠµŃŠ°"
+
+msgid "%s days ago"
+msgstr "ŠæŃŠµŠ“Šø %s Š“Š½Šø"
+
+msgid "User currently active"
+msgstr "ŠŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŃ Šµ Š°ŠŗŃŠøŠ²ŠµŠ½ Š² Š¼Š¾Š¼ŠµŠ½ŃŠ°"
+
+msgid "Last seen: %s"
+msgstr "ŠŠ¾ŃŠ»ŠµŠ“Š½Š¾ Š²ŠøŠ“ŃŠ½(Šø): %s"
+
+msgid "Inactive since: %s"
+msgstr "ŠŠµŠ°ŠŗŃŠøŠ²ŠµŠ½ Š¾Ń: %s"
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr "ŠŃŠøŃŃŠµŠ»ŃŃ Š²Šø ŠøŠ·Š³Š»ŠµŠ¶Š“Š° Š½Šµ Šµ ŠæŠ¾Š»ŃŃŠøŠ» Š²Š°ŃŠµŃŠ¾ ŃŃŠ¾Š±ŃŠµŠ½ŠøŠµ/-Ń!"
+
+msgid "Static content server"
+msgstr "Š”ŃŠ°ŃŠøŃŠµŠ½ ŃŃŃŠ²ŃŃ Š·Š° ŃŃŠ“ŃŃŠ¶Š°Š½ŠøŠµŃŠ¾"
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr "Š¢Š¾Š²Š° Šµ ŃŃŠ°ŃŠøŃŠ½ŠøŃŃ ŃŃŃŠ²ŃŃ Š·Š° ŃŃŠ“ŃŃŠ¶Š°Š½ŠøŠµŃŠ¾ Š·Š° %1s, ā%2sā."
+
+msgid "Suggested friends"
+msgstr "ŠŃŠµŠ“Š»Š¾Š¶ŠµŠ½Šø ŠæŃŠøŃŃŠµŠ»Šø"
+
+msgid "Check all"
+msgstr "ŠŠ°ŃŠŗŠøŃŠ°Š½Šµ/ŠøŠ·Š±ŠøŃŠ°Š½Šµ Š½Š° Š²ŃŠøŃŠŗŠø"
+
+msgid "Uncheck all"
+msgstr "Š Š°Š·Š¼Š°ŃŠŗŠøŃŠ°Š½Šµ/ŠæŃŠµŠ¼Š°Ń
Š²Š°Š½Šµ Š½Š° Š²ŃŠøŃŠŗŠø"
+
+msgid "Choose"
+msgstr "ŠŠ·Š±ŠøŃŠ°Š½Šµ"
+
+msgid "List name"
+msgstr "ŠŠ¼Šµ Š½Š° ŃŠæŠøŃŃŠŗŠ°"
+
+msgid "Allow"
+msgstr "ŠŠ¾Š·Š²Š¾Š»ŃŠ²Š°Š½Šµ"
+
+msgid "Deny"
+msgstr "ŠŃŠŗŠ°Š·Š²Š°Š½Šµ/Š¾ŃŃ
Š²ŃŃŠ»ŃŠ½Šµ"
+
+msgid "Group"
+msgstr "ŠŃŃŠæŠ°"
+
+msgid "Subscription"
+msgstr "ŠŠ±Š¾Š½Š°Š¼ŠµŠ½Ń"
+
+msgid "Both"
+msgstr "Š Š“Š²Š°Š¼Š°ŃŠ°/Š“Š²ŠµŃŠµ"
+
+msgid "From"
+msgstr "ŠŃ"
+
+msgid "Everybody"
+msgstr "ŠŃŠøŃŠŗŠø"
+
+msgid "Send messages"
+msgstr "ŠŠ·ŠæŃŠ°ŃŠ°Š½Šµ Š½Š° ŃŃŠ¾Š±ŃŠµŠ½ŠøŃ"
+
+msgid "Send queries"
+msgstr "ŠŠ·ŠæŃŠ°ŃŠ°Š½Šµ Š½Š° Š·Š°ŃŠ²ŠŗŠø"
+
+msgid "See my status"
+msgstr "Š Š°Š·Š³Š»ŠµŠ¶Š“Š°Š½Šµ Š½Š° Š¼Š¾Ń ŃŃŠ°ŃŃŃ"
+
+msgid "Send his/her status"
+msgstr "ŠŠ·ŠæŃŠ°ŃŠ°Š½Šµ Š½Š° Š½ŠµŠ³Š¾Š²ŠøŃ/Š½ŠµŠ¹Š½ŠøŃ ŃŃŠ°ŃŃŃ"
+
+msgid "Everything"
+msgstr "ŠŃŠøŃŠŗŠ¾/-Šø"
+
+msgid "Item"
+msgstr "ŠŠ¾Š¼ŠµŃ"
+
+msgid "Order"
+msgstr "Š ŠµŠ“"
+
+msgid "Active for this session"
+msgstr "ŠŠŗŃŠøŠ²ŠµŠ½ Š·Š° ŃŠ°Š·Šø ŃŠµŃŠøŃ"
+
+msgid "Always active"
+msgstr "ŠŠøŠ½Š°Š³Šø Š°ŠŗŃŠøŠ²ŠµŠ½"
+
+msgid "User directory"
+msgstr "ŠŠ¾ŃŃŠµŠ±ŠøŃŠµŠ»ŃŠŗŠ° Š“ŠøŃŠµŠŗŃŠ¾ŃŠøŃ"
+
+msgid "Search a friend"
+msgstr "Š¢ŃŃŃŠµŠ½Šµ Š·Š° ŠæŃŠøŃŃŠµŠ»"
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr "ŠŠ·ŠøŃŠŗŠ°Š½Š°ŃŠ° Š²ŃŠ·Š¼Š¾Š¶Š½Š¾ŃŃ Š½Šµ Šµ ŠøŠ¼ŠæŠ»ŠµŠ¼ŠµŠ½ŃŠøŃŠ°Š½Š° Š¾Ń ŠæŠ¾Š»ŃŃŠ°ŃŠµŠ»Ń ŠøŠ»Šø ŃŃŃŠ²ŃŃŠ° Šø ŠæŠ¾ŃŠ°Š“Šø ŃŠ¾Š²Š° Š½Šµ Š¼Š¾Š¶Šµ Š“Š° Š±ŃŠ“Šµ Š¾Š±ŃŠ°Š±Š¾ŃŠµŠ½Š°."
+
+msgid "This is a repeat from %s"
+msgstr "Š¢Š¾Š²Š° Šµ ŠæŠ¾Š²ŃŠ¾ŃŠµŠ½ŠøŠµ Š¾Ń %s"
+
+msgid "Loading comments..."
+msgstr "ŠŠ°ŃŠµŠ¶Š“Š°Š½Šµ Š½Š° ŠŗŠ¾Š¼ŠµŠ½ŃŠ°ŃŠøŃŠµ..."
+
+msgid "Type your comment here..."
+msgstr "ŠŃŠ²ŠµŠ“ŠµŃŠµ Š²Š°ŃŠøŃ ŠŗŠ¾Š¼ŠµŠ½ŃŠ°Ń ŃŃŠŗ..."
+
+msgid "Could not get the comments!"
+msgstr "ŠŠ¾Š¼ŠµŠ½ŃŠ°ŃŠøŃŠµ Š½Šµ Š¼Š¾Š³Š°Ń Š“Š° Š±ŃŠ“Š°Ń Š·Š°ŃŠµŠ“ŠµŠ½Šø!"
+
+msgid "Show comments"
+msgstr "ŠŠ¾ŠŗŠ°Š·Š²Š°Š½Šµ Š½Š° ŠŗŠ¾Š¼ŠµŠ½ŃŠ°ŃŠøŃŠµ"
+
+msgid "Send him/her a message"
+msgstr "ŠŠ·ŠæŃŠ°ŃŠ°Š½Šµ Š½Š° ŃŃŠ¾Š±ŃŠµŠ½ŠøŠµ Š·Š° Š½ŠµŠ³Š¾/Š½ŠµŃ"
+
+msgid "Start a chat with him/her"
+msgstr "ŠŠ°ŠæŠ¾ŃŠ²Š°Š½Šµ Š½Š° ŃŠ°Ń Ń Š½ŠµŠ³Š¾/Š½ŠµŃ"
+
+msgid "Media integration"
+msgstr "ŠŠµŠ“ŠøŠ¹Š½Š° ŠøŠ½ŃŠµŠ³ŃŠ°ŃŠøŃ"
+
+msgid "Comments locked!"
+msgstr "ŠŠ¾Š¼ŠµŠ½ŃŠ°ŃŠøŃŠµ ŃŠ° Š·Š°ŠŗŠ»ŃŃŠµŠ½Šø!"
+
+msgid "Type something you want to share with your friends..."
+msgstr "ŠŃŠ²ŠµŠ“ŠµŃŠµ Š½ŠµŃŠ¾, ŠŗŠ¾ŠµŃŠ¾ Š±ŠøŃ
ŃŠµ ŠøŃŠŗŠ°Š»Šø Š“Š° ŃŠæŠ¾Š“ŠµŠ»ŠøŃŠµ Ń Š²Š°ŃŠøŃŠµ ŠæŃŠøŃŃŠµŠ»Šø..."
+
+msgid "changed his/her nickname to %s"
+msgstr "ŠæŃŠ¾Š¼ŠµŠ½Šø ŃŠ²Š¾Ń ŠæŃŠµŠ²Š“Š¾Š½ŠøŠ¼ Š½Š° %s"
+
+msgid "commented an item you follow: ā%sā."
+msgstr ""
+
+msgid "Hide"
+msgstr ""
+
+msgid "liked your post: ā%sā."
+msgstr ""
+
+msgid "quoted you somewhere: ā%sā."
+msgstr ""
+
+msgid "published on your wall: ā%sā."
+msgstr ""
+
+msgid "tagged you in a photo (%s)."
+msgstr ""
+
+msgid "tagged you in a video (%s)."
+msgstr ""
+
+msgid "Show"
+msgstr ""
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr ""
+
+msgid "Pubsub host"
+msgstr ""
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr ""
+
+msgid "Manager link"
+msgstr ""
+
+msgid "User uploads server"
+msgstr ""
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Logo"
+msgstr ""
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr ""
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr ""
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr ""
+
+msgid "Your service logo has been successfully changed!"
+msgstr ""
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr ""
+
+msgid "Remove this logo"
+msgstr ""
+
+msgid "View this logo"
+msgstr ""
+
+msgid "Send a file"
+msgstr ""
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr ""
+
+msgid "Groupchats to join"
+msgstr ""
+
+msgid "Purge sent files"
+msgstr ""
+
+msgid "would like to send you a file: ā%sā."
+msgstr ""
+
+msgid "has accepted to received your file: ā%sā."
+msgstr ""
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr ""
+
+msgid "could not receive your file: ā%sā."
+msgstr ""
+
+msgid "has received a file exchange request: ā%sā."
+msgstr ""
+
+msgid "Available shortcuts:"
+msgstr ""
+
+msgid "%s removes the chat logs"
+msgstr ""
+
+msgid "%s joins a groupchat"
+msgstr ""
+
+msgid "%s closes the chat"
+msgstr ""
+
+msgid "%s shows the user profile"
+msgstr ""
+
+msgid "%s sends a message to the room"
+msgstr ""
+
+msgid "%s changes your nickname"
+msgstr ""
+
+msgid "%s sends a message to someone in the room"
+msgstr ""
+
+msgid "%s changes the room topic"
+msgstr ""
+
+msgid "%s kicks an user of the room"
+msgstr ""
+
+msgid "%s bans an user of the room"
+msgstr ""
+
+msgid "%s invites someone to join the room"
+msgstr ""
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr "Jappix (ŠŠ¶Š°ŠæŠøŠŗŃ) Šµ Š½ŠµŠŗŠ¾Š¼ŠµŃŃŠøŠ°Š»Š½Š° (non-profit) ŃŠ¾ŃŠøŠ°Š»Š½Š° ŠæŠ»Š°ŃŃŠ¾ŃŠ¼Š°, ŠŗŠ¾ŃŃŠ¾ Šµ Š“Š¾ŃŃŃŠæŠ½Š¾ Š½Š°Š²ŃŃŠŗŃŠ“Šµ [ŃŃŠøŠ³Š° Š“Š° ŠøŠ¼Š°ŃŠµ ŠŗŠ¾Š¼ŠæŃŃŃŃ Šø Š°ŠŗŃŠøŠ²Š½Š° ŠŠ½ŃŠµŃŠ½ŠµŃ Š²ŃŃŠ·ŠŗŠ°], ŠæŠ¾ Š²ŃŃŠŗŠ¾ Š²ŃŠµŠ¼Šµ, ŠŗŠ¾Š³Š°ŃŠ¾ ŠæŠ¾Š¶ŠµŠ»Š°ŠµŃŠµ, Šø Ń ŠŗŠ¾ŃŃŠ¾ Š¼Š¾Š¶ŠµŃŠµ Š“Š° ŠŗŠ¾Š¼ŃŠ½ŠøŠŗŠøŃŠ°ŃŠµ Ń ŠŗŠ¾Š³Š¾ŃŠ¾ ŠæŠ¾ŠøŃŠŗŠ°ŃŠµ."
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# Czech translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:26+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "Ve vaÅ”em prohlĆžeÄi chybĆ JavaScript, takže nebude možnĆ© spustit Jappix! ProsĆm napravte to."
+
+msgid "An open social network"
+msgstr "OtevÅenĆ” sociĆ”lnĆ sĆÅ„"
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "Äinnost Jappixe byla pÅeruÅ”ena buÄ chybou ve spojenim , programu nebo nesprĆ”vnĆ½mi pÅihlaÅ”ovacĆmi Ćŗdaji (zkontrolujte vaÅ”e pÅihlaÅ”ovacĆ Ćŗdaje), omlouvĆ”me se za komplikace"
+
+msgid "The element list on this server could not be obtained!"
+msgstr "Seznam položek na tomto cloud serveru nenĆ možnĆ© zĆskat!"
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "VaÅ”e heslo bylo zmÄnÄno, nynĆ se mÅÆžete pÅihlĆ”sit k vaÅ”emu ĆŗÄtu s novĆ½mi Ćŗdaji."
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "VĆ”Å” XMPP ĆŗÄet byl zruÅ”en, nashledanou!"
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "Byli jste odhlĆ”Å”eni z vaÅ”eho XMPP ĆŗÄtu, pÅejeme pÄknĆ½ den!"
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "ZdĆ” se, že mĆstnost do kterĆ© vstoupujete neexistuje. Nejprve jĆ založte!"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "SkupinovĆ½ rozhovor byl odstranÄn, nyĆ ho mÅÆže vytvoÅit nÄkdo jinĆ½."
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "Uživatel, kterĆ©ho chcete zastihnout se v tĆ©to mĆstnosti nenachĆ”zĆ."
+
+msgid "Please enter the group chat address to join."
+msgstr "ProsĆm, vložte adresu skupinovĆ©ho rozhovoru ke kterĆ©mu se chcete pÅipojit."
+
+msgid "Please enter your nickname to join %s."
+msgstr "ProsĆm, vložte pÅezdĆvku pro pÅipojenĆ do %s."
+
+msgid "This room (%s) is protected with a password."
+msgstr "MĆstnost (%s) je chrĆ”nÄna heslem."
+
+msgid "Your browser is out of date!"
+msgstr "VĆ”Å” prohlĆžeÅ” je zastaralĆ½."
+
+msgid "Last %s version is better!"
+msgstr "PoslednĆ %s verze je lepÅ”Ć!"
+
+msgid "Login"
+msgstr "PÅihlĆ”Å”enĆ"
+
+msgid "Register"
+msgstr "Registrace"
+
+msgid "Here we go!"
+msgstr "PojÄme na to!"
+
+msgid "Server"
+msgstr "Server"
+
+msgid "Password"
+msgstr "Heslo"
+
+msgid "Remember me"
+msgstr "Zapamatuj si mÄ"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "Tato možnost je zakĆ”zĆ”na, nelze jĆ použĆt!"
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "Byli jste odhlĆ”Å”eni, potože se vyskytly potĆže se sĆtĆ. Co si pÅejete udÄlat?"
+
+msgid "Reconnect"
+msgstr "Znovu pÅipojit"
+
+msgid "Messages"
+msgstr "ZprƔvy"
+
+msgid "Profile"
+msgstr "Profil"
+
+msgid "Options"
+msgstr "NastavenĆ"
+
+msgid "Disconnect"
+msgstr "Odpojit se"
+
+msgid "Filter"
+msgstr "Filtr"
+
+msgid "Add a friend"
+msgstr "PÅidat kamarĆ”da"
+
+msgid "Your groupchats"
+msgstr "VaÅ”e skupinovĆ© rozhovory"
+
+msgid "Manage your favorite groupchats"
+msgstr "Spravovat vaÅ”e blĆbenĆ© skupinovĆ© rozhovory"
+
+msgid "More stuff"
+msgstr "DalÅ”Ć možnosti"
+
+msgid "Show all friends"
+msgstr "Zobrazit vÅ”echny kamarĆ”dy"
+
+msgid "Only show connected friends"
+msgstr "Zobrazit pouze pÅipojenĆ© kamarĆ”dy"
+
+msgid "Message archives"
+msgstr "Archiv zprƔv"
+
+msgid "Date"
+msgstr "Datum"
+
+msgid "Please select a friend to view the chat history."
+msgstr "ProsĆm, vyperte kamarĆ”da pro zobrazenĆ historie rozhovoru."
+
+msgid "Nothing found for: %s"
+msgstr "Å½Ć”dnĆ½ vĆ½sledek pro: %s"
+
+msgid "A short message?"
+msgstr "KrƔtkƔ zprƔva?"
+
+msgid "How are you?"
+msgstr "Jak se vede ?"
+
+msgid "What are you doing?"
+msgstr "Co dÄlĆ”Å”?"
+
+msgid "Join a chat"
+msgstr "ZahƔjit rozhovor"
+
+msgid "Status"
+msgstr "Stav"
+
+msgid "Available"
+msgstr "PÅĆtomen"
+
+msgid "Talkative"
+msgstr "HovornĆ½"
+
+msgid "Away"
+msgstr "PryÄ"
+
+msgid "Not available"
+msgstr "NedostupnĆ½"
+
+msgid "Busy"
+msgstr "NeruŔit"
+
+msgid "Mood"
+msgstr "NƔlada"
+
+msgid "None"
+msgstr "Neuvedena"
+
+msgid "Crazy"
+msgstr "BlĆ”znivĆ½"
+
+msgid "Excited"
+msgstr "VzruÅ”enĆ½"
+
+msgid "Playful"
+msgstr "HravĆ½"
+
+msgid "Happy"
+msgstr "Å Å„astnĆ½"
+
+msgid "Shocked"
+msgstr "Å okovanĆ½"
+
+msgid "Hot"
+msgstr "NažhavenĆ½"
+
+msgid "Sad"
+msgstr "SmutnĆ½"
+
+msgid "Amorous"
+msgstr "ZamilovanĆ½"
+
+msgid "Confident"
+msgstr "DÅÆvÄÅivĆ½"
+
+msgid "Activity"
+msgstr "Äinnost"
+
+msgid "Chores"
+msgstr "Nakupuje"
+
+msgid "Drinking"
+msgstr "Pije"
+
+msgid "Eating"
+msgstr "JĆ"
+
+msgid "Exercising"
+msgstr "CvĆÄĆ"
+
+msgid "Grooming"
+msgstr "PeÄuje"
+
+msgid "Appointment"
+msgstr "SchÅÆzka"
+
+msgid "Inactive"
+msgstr "NeÄinnĆ½"
+
+msgid "Relaxing"
+msgstr "Relaxuje"
+
+msgid "Talking"
+msgstr "HovoÅĆ"
+
+msgid "Traveling"
+msgstr "Cestuje"
+
+msgid "Working"
+msgstr "Pracuje"
+
+msgid "View profile"
+msgstr "Zobrazit profil"
+
+msgid "Repeat this notice"
+msgstr "Opakovat toto upozornÄnĆ"
+
+msgid "Remove this notice"
+msgstr "Odstranit upozornÄnĆ"
+
+msgid "Your profile"
+msgstr "VĆ”Å” profil"
+
+msgid "Identity"
+msgstr "OsobnĆ Ćŗdaje"
+
+msgid "Profile image"
+msgstr "Fotografie k profilu"
+
+msgid "Others"
+msgstr "OstatnĆ"
+
+msgid "Personal"
+msgstr "OsobnĆ"
+
+msgid "Complete name"
+msgstr "CelƩ jmƩno"
+
+msgid "Nickname"
+msgstr "PÅezdĆvka"
+
+msgid "First name"
+msgstr "JmƩno"
+
+msgid "Last name"
+msgstr "PÅĆjmenĆ"
+
+msgid "Date of birth"
+msgstr "Datum narozenĆ"
+
+msgid "Contact"
+msgstr "Kontakt"
+
+msgid "E-mail"
+msgstr "E-mail"
+
+msgid "Phone"
+msgstr "Telefon"
+
+msgid "Website"
+msgstr "WebovƔ strƔnka"
+
+msgid "Current"
+msgstr "SouÄasnĆ”"
+
+msgid "Delete"
+msgstr "Smazat"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "JakĆ” Å”koda! NemĆ”te nastavenou fotografii u profilu ve vaÅ”Ć vizitce!"
+
+msgid "Address"
+msgstr "Adresa"
+
+msgid "Street"
+msgstr "Ulice"
+
+msgid "City"
+msgstr "MÄsto"
+
+msgid "Postal code"
+msgstr "PSÄ"
+
+msgid "Country"
+msgstr "ZemÄ"
+
+msgid "Biography"
+msgstr "O mÄ"
+
+msgid "Important notice"
+msgstr "DÅÆležitĆ© upozornÄnĆ"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr "BuÄte opatrnĆ, informace, kterĆ© vyplnĆte v profilu jsou pÅĆstupnĆ© každĆ©mu (i tomu, komu nechcete)."
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr "NenĆ vÅ”echno v XMPP jen soukromĆ©; toto je jednou z tÄch vÄcĆ, kterĆ© nejsou, vĆ”Å” veÅejnĆ½ profil (vCard)."
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr "VÅele doporuÄujeme nahrĆ”t obrĆ”zek k profilu (%s maximĆ”lnÄ), napÅĆklad vaÅ”Ć fotografii, aby vĆ”s kamarĆ”di lĆ©pe poznali. "
+
+msgid "Save"
+msgstr "Uložit"
+
+msgid "Cancel"
+msgstr "ZruŔit"
+
+msgid "Edit options"
+msgstr "Upravit nastavenĆ"
+
+msgid "Channel"
+msgstr "KanƔl"
+
+msgid "Commands"
+msgstr "PÅĆkazy"
+
+msgid "Sounds"
+msgstr "Zvuky"
+
+msgid "Privacy"
+msgstr "SoukromĆ"
+
+msgid "Message archiving"
+msgstr "Archivace zprƔv"
+
+msgid "Store a history of your chats"
+msgstr "UklĆ”dat historii vaÅ”ich rozhovorÅÆ"
+
+msgid "Geolocation"
+msgstr "GeologickĆ” poloha"
+
+msgid "Empty"
+msgstr "Odstranit"
+
+msgid "Empty channel"
+msgstr "Vymazat kanƔl"
+
+msgid "Persistent"
+msgstr "Natrvalo"
+
+msgid "Maximum notices"
+msgstr "Maximum upozornÄnĆ"
+
+msgid "Account"
+msgstr "ĆÄet"
+
+msgid "Change password"
+msgstr "ZmÄnit heslo"
+
+msgid "Delete account"
+msgstr "ZruÅ”it ĆŗÄet"
+
+msgid "Old"
+msgstr "StarƩ"
+
+msgid "New (2 times)"
+msgstr "NovƩ (2 krƔt)"
+
+msgid "Continue"
+msgstr "PokraÄovat"
+
+msgid "To"
+msgstr "Komu"
+
+msgid "Close"
+msgstr "ZavÅĆt"
+
+msgid "unknown"
+msgstr "neznƔmƔ"
+
+msgid "Unavailable"
+msgstr "Odpojen"
+
+msgid "is now"
+msgstr ""
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr "ProsĆm Äekejte, než se vĆ”Å” avatar nahraje ..."
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "Zde je! NovĆ½ krĆ”snĆ½ obrĆ”zek profilu!"
+
+msgid "The image file is not supported or has a bad size."
+msgstr "Soubor s obrĆ”zkem nenĆ podporovĆ”n nebo je pÅĆliÅ” velkĆ½."
+
+msgid "Reply"
+msgstr "OdpovÄdÄt"
+
+msgid "Error"
+msgstr "Chyba"
+
+msgid "Click here to solve the error"
+msgstr "KLiknÄte zde pro ÅeÅ”enĆ problĆ©mu"
+
+msgid "You"
+msgstr "Ty"
+
+msgid "Remove"
+msgstr "Odstranit"
+
+msgid "Rename"
+msgstr "PÅejmenovat"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "Ahoj, JĆ” jsem %s, chci si TÄ pÅidat jako kamarĆ”da."
+
+msgid "Smiley insertion"
+msgstr "Vložit smajlĆka"
+
+msgid "Change style"
+msgstr "PĆsmo"
+
+msgid "Text in bold"
+msgstr "TuÄnĆ©"
+
+msgid "Text in italic"
+msgstr "KurzĆva"
+
+msgid "Underlined text"
+msgstr "PodtrženĆ©"
+
+msgid "Save chat"
+msgstr "Uložit rozhovor"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr "Klikni na nasledujĆcĆ odkaz pro vytvoÅenĆ logu rozhovoru, a poÄkej. Potom klikni znovu ke staženĆ souboru."
+
+msgid "This chat is empty!"
+msgstr "Tento rozhovor je prĆ”zdnĆ½!"
+
+msgid "Generate file!"
+msgstr "Vygeneruj soubor!"
+
+msgid "Download file!"
+msgstr "StaženĆ souboru!"
+
+msgid "Clean current chat"
+msgstr "VyÄistit probĆhajĆcĆ rozhovor"
+
+msgid "View chat history"
+msgstr "Zobrazit historii rozhovoru"
+
+msgid "Show user profile"
+msgstr "Zobrazit profil uživatele"
+
+msgid "Add this contact to your friends"
+msgstr "PÅidej tento kontakt mezi svĆ© kamarĆ”dy"
+
+msgid "Add this groupchat to your favorites"
+msgstr "PÅidej tento skupinovĆ½ rozhovor do oblĆbenĆ½ch"
+
+msgid "All tabs"
+msgstr "VŔechny listy"
+
+msgid "Close this tab"
+msgstr "ZavÅĆt tento list"
+
+msgid "no subject defined for this room."
+msgstr "NenĆ nastaven pÅedmÄt pro tuto mĆstnost"
+
+msgid "Administration panel for this room"
+msgstr "Panel administrace pro tuto mĆstnost"
+
+msgid "Moderators"
+msgstr "ModerĆ”toÅi"
+
+msgid "Participants"
+msgstr "ÄlenovĆ©"
+
+msgid "Visitors"
+msgstr "NĆ”vÅ”tÄvnĆci"
+
+msgid "Manage favorite rooms"
+msgstr "Spravovat oblĆbenĆ© skupinovĆ© rozhovory"
+
+msgid "Change favorites"
+msgstr "ZmÄnit oblĆbenĆ©"
+
+msgid "Search a room"
+msgstr "NajĆt mĆstnost"
+
+msgid "Select a favorite"
+msgstr "Vyberte oblĆbenou"
+
+msgid "Getting the name..."
+msgstr "ZĆskĆ”vĆ”m jmĆ©no ..."
+
+msgid "Gateway"
+msgstr "BrƔna"
+
+msgid "Name"
+msgstr "JmƩno"
+
+msgid "Room"
+msgstr "MĆstnost"
+
+msgid "Add"
+msgstr "PÅidat"
+
+msgid "Edit"
+msgstr "Upravit"
+
+msgid "Search a room on"
+msgstr "NajĆt mĆstnost na"
+
+msgid "No room found on this server."
+msgstr "Na tomto serveru nebyla nalezena Å¾Ć”dnĆ” mĆstnost."
+
+msgid "Service discovery"
+msgstr "ZjiÅ”tÄnĆ služeb"
+
+msgid "Server to query"
+msgstr "ProhledĆ”vanĆ½ server"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr "PromiÅte, ale hledanĆ½ vĆ½raz nebyl nalezen!"
+
+msgid "Accounts"
+msgstr "ĆÄty"
+
+msgid "Authentications"
+msgstr "OvÄÅovĆ”nĆ"
+
+msgid "Automation"
+msgstr "Automaticky"
+
+msgid "Clients"
+msgstr "Klienti"
+
+msgid "Collaboration"
+msgstr "SpoluprƔce"
+
+msgid "Components"
+msgstr "Komponenty"
+
+msgid "Rooms"
+msgstr "MĆstnosti"
+
+msgid "Directories"
+msgstr "AdresĆ”Åe"
+
+msgid "Gateways"
+msgstr "BrƔny"
+
+msgid "News"
+msgstr "Novinky"
+
+msgid "Hierarchy"
+msgstr "Hierarchie"
+
+msgid "Proxies"
+msgstr "Proxy server"
+
+msgid "Publication/Subscription"
+msgstr "PublikovĆ”nĆ/OdebĆrĆ”nĆ"
+
+msgid "Storage"
+msgstr "ĆložiÅ”tÄ"
+
+msgid "Service offline or broken"
+msgstr "Služba je vypnutĆ” nebo nedostupnĆ”"
+
+msgid "Your inbox"
+msgstr "VaÅ”e schrĆ”nka"
+
+msgid "Available actions"
+msgstr "DostupnƩ akce"
+
+msgid "Clean"
+msgstr "VyÄistit"
+
+msgid "New"
+msgstr "NovĆ”"
+
+msgid "Received"
+msgstr "PÅijatĆ©"
+
+msgid "Subject"
+msgstr "PÅedmÄt"
+
+msgid "Content"
+msgstr "Obsah"
+
+msgid "Send message"
+msgstr "Odeslat zprƔvu"
+
+msgid "Your inbox is empty."
+msgstr "VaÅ”e schrĆ”nka je prĆ”zdnĆ”."
+
+msgid "MUC administration"
+msgstr "Administrace MUC"
+
+msgid "You administrate this room"
+msgstr "Spravujte tuto mĆstnost"
+
+msgid "Enter new subject"
+msgstr "Vložte novĆ½ pÅednÄt"
+
+msgid "Configuration"
+msgstr "NastavenĆ"
+
+msgid "Authorizations"
+msgstr "PovolenĆ"
+
+msgid "Member list"
+msgstr "Seznam ÄlenÅÆ"
+
+msgid "Owner list"
+msgstr "Seznam vlastnĆkÅÆ"
+
+msgid "Administrator list"
+msgstr "Seznam sprĆ”vcÅÆ"
+
+msgid "Outcast list"
+msgstr "Seznam neÅ¾Ć”doucĆch"
+
+msgid "Add an input"
+msgstr "PÅidej Älena"
+
+msgid "Destroy this MUC"
+msgstr "ZruŔit tento MUC"
+
+msgid "Yes, let's do it!"
+msgstr "Ano, pojÄme na to!"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr "VĆ”Å” kamarĆ”d sleduje rozhovor."
+
+msgid "Your friend is writing a message..."
+msgstr "VĆ”Å” kamarĆ”d pĆÅ”e ..."
+
+msgid "Your friend stopped writing a message."
+msgstr "VĆ”Å” kamarĆ”d pÅestal psĆ”t."
+
+msgid "Your friend is doing something else."
+msgstr "VĆ”Å” kamarĆ”d se vÄnuje nÄÄemu jinĆ©mu."
+
+msgid "Your friend closed the chat."
+msgstr "VĆ”Å” kamarĆ”d ukonÄil rozhovor."
+
+msgid "Requesting this service..."
+msgstr "Å½Ć”dĆ”m o tuto službu ..."
+
+msgid "Loading"
+msgstr "NaÄĆtĆ”nĆ"
+
+msgid "joined the chat room"
+msgstr "Vstoupit do mĆstnosti"
+
+msgid "left the chat room"
+msgstr "opustit mĆstnost"
+
+msgid "no status"
+msgstr "bez statusu"
+
+msgid "has been kicked"
+msgstr "byl vylouÄen"
+
+msgid "has been banned"
+msgstr "byl zakƔzƔn"
+
+msgid "no reason"
+msgstr "bez dÅÆvodu"
+
+msgid "Communicate with the entire world!"
+msgstr "Komunikujte s celĆ½m svÄtem!"
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr "UmožnĆ vĆ”m bĆ½t v kontaktu s miliĆ³ny uživateli, kteÅĆ prĆ”vÄ využĆvajĆ XMPP sĆÅ„ stejnÄ jako vy s Jabbixem. PÅidpojte se ke komunitÄ a zÅÆstaÅte svobodnĆ."
+
+msgid "Hi there!"
+msgstr "Ahoj!"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr "VĆtejte na %1s, ā%2sā."
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr "PÅihlaste se ke svĆ©mu již existujĆcĆmu XMPP ĆŗÄtu nebo si zaregistrujte zdarma novĆ½!"
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr "Jappix je open-source projekt od PostPro, neziskovƩ organizace, kterƔ poskytuje velkou podporu."
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr "PÅihlaÅ” se ke svĆ©mu již existujĆcĆmu XMPP ĆŗÄtu. TakĆ© mÅÆžeÅ” použĆt %s pro pÅipojenĆ ke skupinovĆ©mu rozhovoru."
+
+msgid "Previous"
+msgstr "PÅedchozĆ"
+
+msgid "General"
+msgstr "ObecnƩ"
+
+msgid "Advanced"
+msgstr "RozÅ”ĆÅenĆ©"
+
+msgid "Resource"
+msgstr "Zdroj"
+
+msgid "Priority"
+msgstr "Priorita"
+
+msgid "Low"
+msgstr "NĆzkĆ”"
+
+msgid "Medium"
+msgstr "StÅednĆ"
+
+msgid "High"
+msgstr "VysokĆ”"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr "Zadejte nĆ”zev skupinovĆ©ho rozhovoru ke kterĆ©mu se chcete pÅipojit a zvolte si pÅezdĆvku. Nebo se mÅÆžete vrĆ”tit na %s."
+
+msgid "login page"
+msgstr "pÅihlaÅ”ovacĆ strĆ”nku"
+
+msgid "Share this link with your friends:"
+msgstr "SdĆlejte tento odkaz s kamarĆ”dy:"
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr "Zaregistruj si novĆ½ XMPP ĆŗÄet a spoj se s kamarĆ”dy ve vlastnĆ sociĆ”lnĆ sĆti. Je to jednoduchĆ©!"
+
+msgid "Required"
+msgstr "PovinnƩ"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr "Jste zaregistrivĆ”nĆ, toto je vaÅ”e XMPP adresa:"
+
+msgid "Manager"
+msgstr "SprƔvce"
+
+msgid "Project"
+msgstr "Projekt"
+
+msgid "Encrypted"
+msgstr "Å ifrovanÄ"
+
+msgid "Unencrypted"
+msgstr "Bez Å”ifrovĆ”nĆ"
+
+msgid "Where are you?"
+msgstr "Kde jsi?"
+
+msgid "What's up with you?"
+msgstr "Co je s tebou?"
+
+msgid "Fetching the social channel..."
+msgstr "Stahuji kanƔl ..."
+
+msgid "You are synchronized with your network."
+msgstr "NynĆ jste synchronizovanĆ½ s vaÅ”Ć sĆtĆ."
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr "Nelze nic odesĆlat: mÅÆžete pouze pÅijĆmat zprĆ”vy!"
+
+msgid "Media viewer"
+msgstr "ProhlĆžeÄ mĆ©diĆ"
+
+msgid "Browse"
+msgstr "ProhlĆžet"
+
+msgid "Command"
+msgstr "PÅĆkaz"
+
+msgid "Subscribe"
+msgstr "Registrace"
+
+msgid "Join"
+msgstr "PÅipojit"
+
+msgid "Automatic"
+msgstr "Automaticky"
+
+msgid "Search"
+msgstr "Hledat"
+
+msgid "No result!"
+msgstr "Nic nenalezeno!"
+
+msgid "No notifications."
+msgstr "Å½Ć”dnĆ© upozornÄnĆ."
+
+msgid "would like to add you as a friend."
+msgstr "si vĆ”s chce pÅidat jako kamarĆ”da."
+
+msgid "would like you to join this chatroom:"
+msgstr "Å¾Ć”dĆ” vĆ”s aby jste vstoupili do mĆstnosti."
+
+msgid "Do you accept?"
+msgstr "SouhlasĆte?"
+
+msgid "Yes"
+msgstr "Ano"
+
+msgid "No"
+msgstr "Ne"
+
+msgid "would like to get authorization."
+msgstr "Å¾Ć”dĆ” o povolenĆ."
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr "PÅejete si vidÄt kamarĆ”dy, kterĆ© vĆ”m %s navrhuje?"
+
+msgid "Submit"
+msgstr "Odeslat"
+
+msgid "Client"
+msgstr "Klient"
+
+msgid "System"
+msgstr "SystƩm"
+
+msgid "Local time"
+msgstr "MĆstnĆ Äas"
+
+msgid "Comments"
+msgstr "KomentĆ”Åe"
+
+msgid "User profile"
+msgstr "Profil uživatele"
+
+msgid "See his/her position on the globe"
+msgstr "Zobraz jeho/jejĆ polohu na zemÄkouli"
+
+msgid "Confirm"
+msgstr "OvÄÅit"
+
+msgid "anonymous mode"
+msgstr "anonymnĆ mĆ³d"
+
+msgid "Groups"
+msgstr "Skupiny"
+
+msgid "Unclassified"
+msgstr "NezaÅazenĆ©"
+
+msgid "Authorize"
+msgstr "OprƔvnit"
+
+msgid "Ask for authorization"
+msgstr "PoÅ¾Ć”dat o oprĆ”vnÄnĆ"
+
+msgid "Unblock"
+msgstr "Odblokovat"
+
+msgid "Prohibit"
+msgstr "ZakƔzat"
+
+msgid "Block"
+msgstr "Blokovat"
+
+msgid "Chat"
+msgstr "Rozhovor"
+
+msgid "Groupchat"
+msgstr "SkupinovĆ½ rozhovor"
+
+msgid "Jappix Mobile"
+msgstr "Jabbix pro Mobil"
+
+msgid "Desktop"
+msgstr "PoÄĆtaÄ"
+
+msgid "Mobile"
+msgstr "Mobil"
+
+msgid "Please wait..."
+msgstr "Äekejte prosĆm ..."
+
+msgid "Please enable JavaScript"
+msgstr "ProsĆm povolte JavaScript"
+
+msgid "Your channel"
+msgstr "VĆ”Å” kanĆ”l"
+
+msgid "Channel of"
+msgstr "KanĆ”l uživatele"
+
+msgid "More notices..."
+msgstr "DalÅ”Ć upozornÄnĆ ..."
+
+msgid "Attach a file"
+msgstr "PÅipojit soubor"
+
+msgid "Send"
+msgstr "Odeslat"
+
+msgid "Unattach the file"
+msgstr "Odebrat soubor"
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr "Nastala chyba bÄhem nahrĆ”vĆ”nĆ souboru: buÄ je pÅĆliÅ” velkĆ½ (%s maximĆ”lnÄ) nebo nenĆ povolen!"
+
+msgid "Authorization failed"
+msgstr "Autorizace se nezdaÅila"
+
+msgid "Registration failed, please choose a different username"
+msgstr "Registrace se nezdaÅila, zvolte prosĆm jinĆ© uživatelskĆ© jmĆ©no"
+
+msgid "Service unavailable"
+msgstr "Služba je nedostupnĆ”"
+
+msgid "Internal server error, try later"
+msgstr "VnitÅnĆ chyba serveru, zkuste pozdÄji"
+
+msgid "Your form has been sent."
+msgstr "VĆ”Å” formulĆ”Å byl odeslĆ”n."
+
+msgid "Application"
+msgstr "Aplikace"
+
+msgid "XMPP links"
+msgstr "XMPP odkaz"
+
+msgid "Open XMPP links with Jappix"
+msgstr "OtevÅĆt XMPP odkaz pomocĆ Jappix"
+
+msgid "changed the subject to:"
+msgstr "zmÄnit pÅedmÄt na:"
+
+msgid "Welcome!"
+msgstr "VĆtejte!"
+
+msgid "Friends"
+msgstr "KamarƔdi"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr "VĆtejte v Jappix, vaÅ”Ć vlastnĆ sociĆ”lnĆ sĆti!"
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr "DÅĆve než jĆ zaÄnete použĆvat, mÄli by jste upravit nÄkterĆ” nastavenĆ, vyhledat kamarĆ”dy a vyplnit svÅÆj profil."
+
+msgid "Enable notification sounds"
+msgstr "Povolit upozorÅovĆ”nĆ pomocĆ zvukÅÆ"
+
+msgid "Share your position on the globe"
+msgstr "SdĆlet svojĆ polohu na zemÄkouli"
+
+msgid "Offline friends"
+msgstr "OdpojenĆ kamarĆ”di"
+
+msgid "Don't hide offline friends"
+msgstr "NeskrĆ½vat odpojenĆ© kamarĆ”dy"
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr "Použijte tento nĆ”stroj na vyhledĆ”nĆ kamarĆ”dÅÆ na tomto serveru. Nebo je mÅÆžete pÅidat pozdÄji."
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr "SkvÄle! NynĆ mÅÆžete sdĆlet Jappix se svĆ½mi kamarĆ”dy!"
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr "NynĆ, když stisknete tlaÄitko Uložit, nĆ”sleduje otevÅenĆ editoru vaÅ”eho profilu."
+
+msgid "Share Jappix on %s"
+msgstr "SdĆlejte Jappix na %s"
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr "PoužĆvĆ”m Jappix, otevÅenou sociĆ”lnĆ platformu. Jsem %s!"
+
+msgid "Unknown name"
+msgstr "NeznƔmƩ jmƩno"
+
+msgid "Unknown country"
+msgstr "NeznĆ”mĆ” zemÄ"
+
+msgid "Click to enable"
+msgstr "Klikni pro povolenĆ"
+
+msgid "Click to disable"
+msgstr "Klikni pro zakĆ”zĆ”nĆ"
+
+msgid "Installation"
+msgstr "Instalace"
+
+msgid "Jappix installation"
+msgstr "Jappix instalace"
+
+msgid "Welcome to the Jappix installation!"
+msgstr "VĆtejte v Jappix instalaci!"
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr "Tento nĆ”stroj vĆ”m pomÅÆže rychle nainstalovat Jappix, prvnĆ plnohodnotnou sociĆ”lnĆ platformu založenou na XMPP, na vĆ”Å” server. Nebudete dokonce potÅebovat Å¾Ć”dnĆ© technickĆ© znalosti."
+
+msgid "Let's have a look at the installation steps:"
+msgstr "PÅejdÄme k instalaÄnĆm krokÅÆm:"
+
+msgid "Welcome"
+msgstr "VĆtejte"
+
+msgid "Storage configuration"
+msgstr "NastavenĆ ĆŗložiÅ”tÄ"
+
+msgid "Administrator account"
+msgstr "ĆÄet administrĆ”tora"
+
+msgid "Main configuration"
+msgstr "HlavnĆ nastavenĆ"
+
+msgid "Hosts configuration"
+msgstr "NastavenĆ hostitele"
+
+msgid "Services installation"
+msgstr "Instalace služeb"
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr "Pokud se tento jazyk (%1s) neshoduje s vaÅ”Ćm, mÅÆžete nechat Jappix mluvit jinĆ½m jazykem %2s. Volba bude uložena."
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr "Pokud potÅebujete pomoci s instalacĆ a nastavenĆm Jappix, mÅÆžete využĆt dokumentaci, kterou naleznete zde:"
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr "Nastal Äas vybudovat vlastnĆ sociĆ”lnĆ sĆÅ„: staÄĆ pÅejĆt k nasledujĆcĆmu kroku!"
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr "Jappix uklĆ”dĆ” natrvalo data (sdĆlenĆ© soubory, vaÅ”e vlastnĆ hudba a konfigurace) do jedinĆ©ho zabezpeÄenĆ©ho adresĆ”Åe. "
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr "Jappix musĆ mĆt oprĆ”vnÄnĆ zapisovat do tohoto adresĆ”Åe pro vytvoÅenĆ vlastnĆch podadresĆ”ÅÅÆ.Pokud tomu tak nenĆ, je tÅeba nastavit oprĆ”vnÄnĆ na %1s a nebo nastavit vlastnĆka adresĆ”Åe na %2s (zĆ”visĆ to na vaÅ”em nastavenĆ)."
+
+msgid "The folder is writable, you can continue!"
+msgstr "Do adresĆ”Åe je povolen zĆ”pis, mÅÆžete pokraÄovat!"
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix vĆ”m ĆŗmožÅuje spravovat vaÅ”Ć konfiguraci, instalovat pluginy nebo vyhledĆ”vat aktualizace. Proto je nutnĆ© si vytvoÅit ĆŗÄet administrĆ”tora ke vstupu do SprĆ”vy Jappix."
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr "Když je Jappix nainstalovĆ”n, staÄĆ kliknout na odkaz SprĆ”vce na vĆ½chozĆ strĆ”nce pro vstup do SprĆ”vy. "
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr "Jejda, nÄco vĆ”m uniklo, nebo se hesla neshodujĆ!"
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr "Jappix vyžaduje nastavenĆ nÄkterĆ½ch ĆŗdajÅÆ. ProsĆm upravtel nĆ”sledujĆcĆ Ćŗdaje (nebo nechte pÅednastavenĆ©, kterĆ© vÄtÅ”inÄ uživatelÅÆ vyhovujĆ)."
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr "Pokud nenastavĆte povinnĆ© Ćŗdaje, budou nastaveny na vĆ½chozĆ."
+
+msgid "User"
+msgstr "Uživatel"
+
+msgid "Service"
+msgstr "Služba"
+
+msgid "Service name"
+msgstr "NĆ”zev služby"
+
+msgid "Service description"
+msgstr "Popis služby"
+
+msgid "Connection"
+msgstr "PÅipojenĆ"
+
+msgid "Lock the host"
+msgstr "Uzamknout hostitele"
+
+msgid "Anonymous mode"
+msgstr "AnonymnĆ mĆ³d"
+
+msgid "Registration allowed"
+msgstr "Registrace povolena"
+
+msgid "Use a proxy"
+msgstr "PoužĆt proxy"
+
+msgid "Encryption"
+msgstr "Å ifrovĆ”nĆ"
+
+msgid "HTTPS storage"
+msgstr "HTTPS ĆŗložiÅ”tÄ"
+
+msgid "Force HTTPS"
+msgstr "Vynutit HTTPS"
+
+msgid "Compression"
+msgstr "Komprese"
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr "Tato strĆ”nka vĆ”m pomÅÆže nastavit vĆ½chozĆho hostitele. Použijte pÅednastavenĆ© hodnoty, pokud chcete využĆvat oficiĆ”lnĆ službu hostitele."
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr "BOSH server v podstatÄ pÅedĆ”vĆ” informace mezi Jappix klientem a XMPP serverem a je nutnĆ½ vzhledem k technickĆ©mu omezenĆ."
+
+msgid "Main host"
+msgstr "HlavnĆ hostitel"
+
+msgid "Groupchat host"
+msgstr "Hostitel skupinovĆ½ch rozhovorÅÆ (Groupchat host)"
+
+msgid "Anonymous host"
+msgstr "AnonymnĆ host"
+
+msgid "Directory host"
+msgstr "Directory host"
+
+msgid "BOSH host"
+msgstr "BOSH host"
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr "MÅÆžete nainstalovat dalÅ”Ć software pro rozÅ”ĆÅenĆ funkcĆ vaÅ”eho Jappix. NÄkterĆ© jinĆ© funkce mÅÆžete upravit, zejmĆ©na z dÅÆvodÅÆ bezpeÄnosti, protože byly nastaveny na vychozĆ hodnoty."
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr "K tomu je nutnĆ½ pÅĆstup na konzoli serveru a mĆt oprĆ”vnÄnĆ root uživatele, Jappix bude pracovat i bez tÄchto dalÅ”Ćch modulÅÆ, ale nÄkterĆ© funkce budou nedostupnĆ©."
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr "Po ukonÄenĆ nastavenĆ Jappix vygeneruje cache soubory. Toto mÅÆže nÄjakĆ½ Äas trvat, poÄkejte až se zobrazĆ aplikace a do tĆ© doby nemaÄkejte jakoukoli klĆ”vesu."
+
+msgid "Thanks for using Jappix!"
+msgstr "DÄkujeme za použĆvĆ”nĆ Jappix!"
+
+msgid "Next"
+msgstr "DalÅ”Ć"
+
+msgid "Finish"
+msgstr "DokonÄit"
+
+msgid "Check again"
+msgstr "Opakovat"
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr "Do adresĆ”Åe nelze zapisovat, nastavte oprĆ”vnÄnĆ na %s."
+
+msgid "%s is installed on your system."
+msgstr "%s je nainstalovĆ”n na vaÅ”em systĆ©mu."
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr "%1s nenĆ na vaÅ”em systĆ©mu nainstalovĆ”n, nainstalujte %2s."
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr "PHP maximĆ”lnĆ velikost nahrĆ”vanĆ©ho souboru je dostateÄnĆ” (%s)."
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr "PHP maximĆ”lnĆ velikost nahrĆ”vanĆ©ho souboru nenĆ dostateÄnĆ” (%1s), mÄli byste jĆ nastavit na %2s v %3s."
+
+msgid "Jappix manager"
+msgstr "Jappix sprƔvce"
+
+msgid "Manager access"
+msgstr "PÅĆstup ke SprĆ”vÄ"
+
+msgid "Statistics"
+msgstr "Statistika"
+
+msgid "Hosts"
+msgstr "HostitelƩ"
+
+msgid "Design"
+msgstr "Vzhled"
+
+msgid "Repeat"
+msgstr "Opakovat"
+
+msgid "All"
+msgstr "VŔe"
+
+msgid "Horizontal"
+msgstr "HorizontĆ”lnÄ"
+
+msgid "Vertical"
+msgstr "VertikĆ”lnÄ"
+
+msgid "Center"
+msgstr "StÅed"
+
+msgid "Left"
+msgstr "Vlevo"
+
+msgid "Right"
+msgstr "Vpravo"
+
+msgid "Top"
+msgstr "NahoÅe"
+
+msgid "Bottom"
+msgstr "Dole"
+
+msgid "Adapt"
+msgstr "PÅizpÅÆsobit"
+
+msgid "Color"
+msgstr "Barva"
+
+msgid "Users"
+msgstr "UživatelĆ©"
+
+msgid "Updates"
+msgstr "Aktualizace"
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr "OmezenĆ½ pÅĆstup: pouze oprĆ”vnÄnĆ uživatelĆ© mohou spravovat tento Jappix uzel."
+
+msgid "Please use the form below to login to the administration panel."
+msgstr "ProsĆm požijte nĆ”sledujĆcĆ formulĆ”Å pro pÅihlĆ”Å”enĆ do administrĆ”torskĆ©ho rozhranĆ."
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr "Pro zvĆ½Å”enĆ bezpeÄnosti je pÅihlĆ”Å”enĆ ÄasovÄ omezeno a pokud zavÅetel prohlĆžeÄ budete odhlĆ”Å”eni."
+
+msgid "Credentials"
+msgstr "OvÄÅenĆ"
+
+msgid "You have been logged out. Goodbye!"
+msgstr "Jste odhlĆ”Å”eni, Nashledanou!"
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr "Jejda, nejste platnĆ½ sprĆ”vce. Zkontrolujte, vaÅ”e pÅihlaÅ”ovacĆ Ćŗdaje!"
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr "ZĆ”kladnĆ statisticky o nÄkterĆ½ch dÅÆležitĆ½ch ĆŗdajĆch zpracovĆ”vĆ”nĆ½ch Jappixem najdete nĆže."
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr "ZmÄna konfiguraci vaÅ”eho Jabbix uzlu pomocĆ sprĆ”vce."
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr "ZmÄnit nastavenĆ XMPP hostitelÅÆ, kterĆ© tento Jappix uzel využĆvĆ”, lze v tomto panelu."
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr "VÅ”echny soubory uloženĆ© na tomot Jappix uzlu mÅÆžete spravovat v tomto panelu: zvolte podadresĆ”Å a mÅÆžete upravovat obsah."
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr "Jappix je zcela pÅizpÅÆsobitelnĆ½: jeho vzhled si mÅÆžete zde upravit."
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr "Toto nenĆ povolenĆ½ obrĆ”zek, prosĆm použijte PNG, GIF nebo JPG!"
+
+msgid "The image could not be received, would you mind retry?"
+msgstr "ObrĆ”zek nebyl pÅijat, pÅejete si akci zopakovat?"
+
+msgid "Your image was added to the list!"
+msgstr "VĆ”Å” obrĆ”zek byl pÅidĆ”n do seznamu!"
+
+msgid "Changes saved!"
+msgstr "ZmÄny byly uloženy!"
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr "Na tomto Jappix uzlu lze zadat vĆce sprĆ”vcÅÆ. TakĆ© lze zmÄnit heslo v tomto panelu."
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr "Aktualizuj Jappix uzel v tohoto panelu nebo zjisti, zda nenĆ dostupnĆ” novĆ© verze. Informace o poslednĆ verzi se takĆ© zobrazĆ (anglicky)."
+
+msgid "Access statistics"
+msgstr "Statistiky pÅĆstupÅÆ"
+
+msgid "Share statistics"
+msgstr "Statistiky sdĆlenĆ"
+
+msgid "Other statistics"
+msgstr "OatatnĆ statistiky"
+
+msgid "January"
+msgstr "Leden"
+
+msgid "February"
+msgstr "Ćnor"
+
+msgid "March"
+msgstr "BÅezen"
+
+msgid "April"
+msgstr "Duben"
+
+msgid "May"
+msgstr "KvÄten"
+
+msgid "June"
+msgstr "Äerven"
+
+msgid "July"
+msgstr "Äervenec"
+
+msgid "August"
+msgstr "Srpen"
+
+msgid "September"
+msgstr "ZĆ”ÅĆ"
+
+msgid "October"
+msgstr "ÅĆjen"
+
+msgid "November"
+msgstr "Listopad"
+
+msgid "December"
+msgstr "Prosinec"
+
+msgid "Monday"
+msgstr "PondÄlĆ"
+
+msgid "Tuesday"
+msgstr "ĆterĆ½"
+
+msgid "Wednesday"
+msgstr "StÅeda"
+
+msgid "Thursday"
+msgstr "Ätvrtek"
+
+msgid "Friday"
+msgstr "PƔtek"
+
+msgid "Saturday"
+msgstr "Sobota"
+
+msgid "Sunday"
+msgstr "NedÄle"
+
+msgid "Total"
+msgstr "Celkem"
+
+msgid "Cache"
+msgstr "KeÅ”"
+
+msgid "Logs"
+msgstr "Logy"
+
+msgid "Music"
+msgstr "Hudba"
+
+msgid "Backgrounds"
+msgstr "PozadĆ"
+
+msgid "Share"
+msgstr "SdĆlenĆ"
+
+msgid "Background"
+msgstr "PozadĆ"
+
+msgid "Notice"
+msgstr "UpozornÄnĆ"
+
+msgid "Your design preferences have been saved!"
+msgstr "NastavenĆ vaÅ”eho vzhledu bylo uloženo."
+
+msgid "Please check your inputs: something is missing!"
+msgstr "Zkontrolujte Ćŗdaje: nejsou kompletnĆ!"
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr "V tomto panelu lze nastavit vzhled vaÅ”eho Jappix uzlu. Lze nastavit vlastnĆ barvu Äi uloženĆ½ obrĆ”zek. Nechte volnost svĆ© tvoÅivosti!"
+
+msgid "Use default background"
+msgstr "PoužĆt vĆ½chozĆ pozadĆ"
+
+msgid "Use your own image"
+msgstr "PoužĆt vlastnĆ obrĆ”zek"
+
+msgid "Select a background to use and change the display options."
+msgstr "Zvolte pozadĆ a upravte nastavenĆ zobrazenĆ."
+
+msgid "Use your own color"
+msgstr "Použijte vlastnĆ barvu"
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr "Zadejte hexadecimĆ”lnÄ barvu vaÅ”eho pozadĆ."
+
+msgid "Manage backgrounds"
+msgstr "SprĆ”va pozadĆ"
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr "V tomto panelu lze pÅidat novĆ© pozadĆ do seznamu. ProsĆm odeÅ”lete platnĆ½ obrĆ”zek."
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr "Pokud chcete nÄkterĆ© pozadĆ odstranit, použijte nĆ”sledujĆcĆ prohlĆžeÄ."
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr "NastavenĆ upozornÄnĆ na vĆ½chozĆ strĆ”nce pro vÅ”echny uživatele, napÅ. varovĆ”nĆ, dÅÆležitĆ© oznĆ”menĆ Äi raklama."
+
+msgid "Simple notice"
+msgstr "JednoduchĆ© upozornÄnĆ"
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr "Toto upozornÄnĆ umožÅuje pouze jednoduchĆ½ text. Å½Ć”dnĆ½ kĆ³d nenĆ povolen."
+
+msgid "Advanced notice"
+msgstr "RozÅ”ĆÅenĆ© upozornÄnĆ"
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr "VaÅ”e upozornÄnĆ lze upravit vloženĆm HTML, CSS a JavaScript, ale je tÅeba i kĆ³d stylu."
+
+msgid "Available updates"
+msgstr "DostupnƩ aktualizace"
+
+msgid "What's new?"
+msgstr "Co je novƩho?"
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr "Do adresĆ”Åe k uklĆ”dĆ”nĆ nelze zapisovat, prosĆm upravte oprĆ”vnÄnĆ!"
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr "%1s mÅÆže zpÅÆsobit problĆ©my s proxy, prosĆm zvyÅ”te hodnotu %2s na %3s!"
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr "PrĆ”vÄ použĆvĆ”te vĆ½vojovou verzi Jappix. Aktualizujte jĆ z repozitĆ”Åe spÅÆÅ”tÄnĆm %s."
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr "Je dostupnĆ” novĆ” verze Jappix! ZjistÄte co je v nĆ novĆ©ho a proveÄte update!"
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr "VaÅ”e verze je zastaralĆ”. Aktualizujte ji nynĆ na %s kliknutĆm zde!"
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr "VaÅ”e verze se zdĆ” bĆ½t aktuĆ”lnĆ, ale je možnĆ© zkontrolovat aktualizace ruÄnÄ kliknutĆm zde."
+
+msgid "Check for updates"
+msgstr "DostupnƩ aktualizace"
+
+msgid "Update in progress"
+msgstr "ProhĆhĆ” aktualizace"
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr "Jabbix byl aktualizovĆ”n: prĆ”vÄ použĆvĆ”te nejnovÄjÅ”Ć verzi. PÅĆjemnou zĆ”bavu!"
+
+msgid "The update has failed! Please try again later."
+msgstr "Aktualizace selhala! ProsĆm opakujte pozdÄji."
+
+msgid "Downloading package..."
+msgstr "Stahuji balĆÄek ..."
+
+msgid "Removing current Jappix system files..."
+msgstr "OdstraÅovĆ”nĆ aktuĆ”lnĆch systĆ©movĆ½ch souborÅÆ Jappixe ..."
+
+msgid "Extracting package..."
+msgstr "Rozbaluji balĆÄek ..."
+
+msgid "Regenerating storage folder tree..."
+msgstr "ObnovovĆ”nĆ stromu adresĆ”Åe ĆŗložiÅ”tÄ ..."
+
+msgid "Jappix is now up to date!"
+msgstr "Jappix je aktualizovƔn!"
+
+msgid "Aborted: socket error!"
+msgstr "NezdaÅilo se: chyba soketu!"
+
+msgid "Aborted: buffer error!"
+msgstr "NezdaÅilo se: chyba bufferu!"
+
+msgid "Aborted: everything is not writable!"
+msgstr "NezdaÅilo se: nelze zapsat!"
+
+msgid "Aborted: could not extract the package!"
+msgstr "NezdaÅilo se: nelze rozbalti balĆÄek!"
+
+msgid "Visits"
+msgstr "NĆ”vÅ”tÄvnost"
+
+msgid "Daily"
+msgstr "DennÄ"
+
+msgid "Weekly"
+msgstr "TĆ½dnÄ"
+
+msgid "Monthly"
+msgstr "MÄsĆÄnÄ"
+
+msgid "Yearly"
+msgstr "RoÄnÄ"
+
+msgid "Size"
+msgstr "Velikost"
+
+msgid "Clean everything"
+msgstr "VŔe odstranit"
+
+msgid "Purge cache"
+msgstr "Vymazat keÅ”"
+
+msgid "Purge logs"
+msgstr "Vymazat logy"
+
+msgid "Purge updates"
+msgstr "Vymazat aktualizace"
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr "OdklĆ”dacĆ adresĆ”Å, kterĆ½ chcete vymazat je nynĆ prĆ”zdny!"
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr "Udržujte vĆ”Å” uzel Jappix ÄistĆ½ a rychlĆ½, pravidelnÄ ÄistÄte adklĆ”dacĆ prostor!"
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr "Nahrajte vlastnĆ hudbu (Ogg Vorbis, MP3 or WAV) a mÅÆžete jĆ poslouchat v Jappixu!"
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr "Soubor kterĆ½ chcete nahrĆ”t nesmĆ bĆ½t vÄtÅ”Ć než %s."
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr "BuÄte v obraze o tom co vaÅ”i uživatelĆ© uklĆ”dajĆ na server a odstraÅte nevhodnĆ½ obsah v tomto panelu."
+
+msgid "Title"
+msgstr "NƔzev"
+
+msgid "Artist"
+msgstr "ZpÄvĆ”k/ZpÄvaÄka"
+
+msgid "Album"
+msgstr "Album"
+
+msgid "File"
+msgstr "Soubor"
+
+msgid "Upload"
+msgstr "NahrƔt"
+
+msgid "The folder is empty."
+msgstr "AdresĆ”Å je prĆ”zdnĆ½."
+
+msgid "The music could not be received, please retry!"
+msgstr "Hudba nebyla pÅijata, prosĆm opakujte akci!"
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr "Toto nenĆ platnĆ½ hudebnĆ soubor, prosĆm použijte Ogg Vorbis, MP3 nebo WAV!"
+
+msgid "Your music has been added!"
+msgstr "VaÅ”e pĆsniÄka byla pÅidĆ”na!"
+
+msgid "The selected elements have been removed."
+msgstr "VybranĆ© položky budou nynĆ odstranÄny."
+
+msgid "You must select elements to remove!"
+msgstr "MusĆte vybrat položky k odstranÄnĆ!"
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr "Zde lze pÅidat uživatele, zmÄnit heslo (použijte existujĆcĆ uživatelskĆ© jmĆ©no). Zvolte silnĆ© heslo!"
+
+msgid "Manage"
+msgstr "Spravovat"
+
+msgid "List"
+msgstr "Seznam"
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr "V tomto panelu lze odstranit uživatele. MÄjte na pamÄti, že nelze odstranit uživatele, pokud je poslednĆ."
+
+msgid "The user has been added!"
+msgstr "Uživatel byl pÅidĆ”n!"
+
+msgid "The chosen users have been removed."
+msgstr "ZvolenĆ½ uživatel byl odstranÄn."
+
+msgid "You must select one or more users to be removed!"
+msgstr "MusĆte zvolit jednoho nebo vĆce uživatelu k odstranÄnĆ!"
+
+msgid "Yesterday"
+msgstr "VÄera"
+
+msgid "%s days ago"
+msgstr "PÅed %s dny"
+
+msgid "User currently active"
+msgstr "Uživatel je nynĆ aktivnĆ"
+
+msgid "Last seen: %s"
+msgstr "Naposledy vidÄn: %s"
+
+msgid "Inactive since: %s"
+msgstr "NeÄinnĆ½ od: %s"
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr "ZdĆ” se, že vĆ”Å” kamarĆ”d nedostal vaÅ”Ć zprĆ”vu(y)!"
+
+msgid "Static content server"
+msgstr "StatickĆ½ obsah serveru"
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr "Toto je statickĆ½ obsah serveru pÅed %1s, ā%2sā."
+
+msgid "Suggested friends"
+msgstr "NavrhovanĆ kamarĆ”di"
+
+msgid "Check all"
+msgstr "OznaÄit vÅ”e"
+
+msgid "Uncheck all"
+msgstr "ZruÅ”it oznaÄenĆ vÅ”eho"
+
+msgid "Choose"
+msgstr "Vybrat"
+
+msgid "List name"
+msgstr "JmƩno seznamu"
+
+msgid "Allow"
+msgstr "Povolit"
+
+msgid "Deny"
+msgstr "ZakƔzat"
+
+msgid "Group"
+msgstr "Skupina"
+
+msgid "Subscription"
+msgstr "OprĆ”vnÄnĆ"
+
+msgid "Both"
+msgstr "ObojĆ"
+
+msgid "From"
+msgstr "Od"
+
+msgid "Everybody"
+msgstr "VŔichni"
+
+msgid "Send messages"
+msgstr "Odeslat zprƔvu"
+
+msgid "Send queries"
+msgstr "Odeslat Å¾Ć”dost"
+
+msgid "See my status"
+msgstr "VidÄt mÅÆj status"
+
+msgid "Send his/her status"
+msgstr "Odeslat jemu/ji status"
+
+msgid "Everything"
+msgstr "VŔe"
+
+msgid "Item"
+msgstr "Položka"
+
+msgid "Order"
+msgstr "PoÅadĆ"
+
+msgid "Active for this session"
+msgstr "AktivnĆ v tomto sezenĆ"
+
+msgid "Always active"
+msgstr "StĆ”le aktivnĆ"
+
+msgid "User directory"
+msgstr "AdresĆ”Å uživatelÅÆ"
+
+msgid "Search a friend"
+msgstr "NajĆt kamarĆ”da"
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr "Požadovanou vlastnost nepodporuje buÄ pÅĆjemce nebo server, a proto nemÅÆže bĆ½t vykonĆ”na."
+
+msgid "This is a repeat from %s"
+msgstr "JednĆ” se o opakovĆ”nĆ od %s"
+
+msgid "Loading comments..."
+msgstr "NaÄĆtĆ”m komentĆ”Åe..."
+
+msgid "Type your comment here..."
+msgstr "NapiÅ”te svÅÆj komentĆ”Å zde ..."
+
+msgid "Could not get the comments!"
+msgstr "Nelze zĆskat komentĆ”Åe!"
+
+msgid "Show comments"
+msgstr "Zobrazit komentĆ”Åe"
+
+msgid "Send him/her a message"
+msgstr "Odeslat jemu/jĆ zprĆ”vu"
+
+msgid "Start a chat with him/her"
+msgstr "ZaÄĆt rozhovor s nĆm/nĆ"
+
+msgid "Media integration"
+msgstr "Integrovat media"
+
+msgid "Comments locked!"
+msgstr "KomentĆ”Åe jsou uzamÄenĆ©!"
+
+msgid "Type something you want to share with your friends..."
+msgstr "Zde napiÅ”te, co si pÅejete sdĆlet s vaÅ”imi pÅĆ”teli ..."
+
+msgid "changed his/her nickname to %s"
+msgstr "byla zmÄnÄna jeho/jejĆ pÅezdĆvka na %s"
+
+msgid "commented an item you follow: ā%sā."
+msgstr "pro komentovĆ”nĆ položky postupujte nĆ”sledovnÄ: ā%sā."
+
+msgid "Hide"
+msgstr "SkrĆ½t"
+
+msgid "liked your post: ā%sā."
+msgstr "vĆ”Å” oblĆbenĆ½ pÅĆspÄvek: ā%sā."
+
+msgid "quoted you somewhere: ā%sā."
+msgstr "citoval jste nÄkde: ā%sā."
+
+msgid "published on your wall: ā%sā."
+msgstr "zvÄÅejnÄno na vaÅ”Ć nĆ”stÄnce: ā%sā."
+
+msgid "tagged you in a photo (%s)."
+msgstr "jste oznaÄen na fotografii (%s)."
+
+msgid "tagged you in a video (%s)."
+msgstr "jste oznaÄen na videu (%s)."
+
+msgid "Show"
+msgstr "Zobrazit"
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr "PotÅebujete pomoct? RadÄji si nejprve pÅeÄtete v dokumentaci strĆ”nku jak vyplnit tento formulĆ”Å!"
+
+msgid "Pubsub host"
+msgstr "Pubsub hostitel"
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr "Jappix je velkĆ” sociĆ”lnĆ platforma, ke kterĆ© mĆ”te pÅĆstup aÅ„ jste kdekoliv, kdykoliv chcete s nÄkĆ½m komunikovat."
+
+msgid "Manager link"
+msgstr "Odkaz sprƔvce"
+
+msgid "User uploads server"
+msgstr "Uživate nahrĆ”vajĆcĆ na server"
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr "Toto je uživatel nahrĆ”vajĆcĆ na server pro %1s, ā%2sā."
+
+msgid "Logo"
+msgstr "Logo"
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr "MÅÆžete si nastavit vlastnĆ logo služby, kterĆ© nahradĆ to vĆ½chozĆ. DĆ”vejte pÅi tom pozor na velikost a hlavnĆ barvu každĆ©ho loga!"
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr "NahrĆ”t každĆ© logo s doporuÄenĆ½m maximĆ”lnĆm rozmÄrem v pixelech."
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr "Toto nenĆ platnĆ½ obrĆ”zek, použijte prosĆm PNG formĆ”t!"
+
+msgid "Your service logo has been successfully changed!"
+msgstr "VaÅ”e logo služby bylo ĆŗspÄÅ”nÄ zmÄnÄno!"
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr "VaÅ”e logo musĆ bĆ½t ve formĆ”tu PNG. Pokud je pole prĆ”zdnĆ© logo se nezmÄnĆ."
+
+msgid "Remove this logo"
+msgstr "Odstranit toto logo"
+
+msgid "View this logo"
+msgstr "Zobrazit toto logo"
+
+msgid "Send a file"
+msgstr "Odeslat soubor"
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr "Jakmile dojde k nahrĆ”nĆ, bude vĆ”Å” kamarĆ”d vyzvĆ”n ke staženĆ souboru, kterĆ½ jste odeslal."
+
+msgid "Groupchats to join"
+msgstr "PÅipojit skupinovĆ© rozhovory"
+
+msgid "Purge sent files"
+msgstr "VyÄistit odeslanĆ© soubory"
+
+msgid "would like to send you a file: ā%sā."
+msgstr "pÅejete si odeslat soubor: ā%sā."
+
+msgid "has accepted to received your file: ā%sā."
+msgstr "souhlasĆ s pÅijetĆm souboru: ā%sā."
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr "odmĆtl pÅijmout soubor: ā%sā."
+
+msgid "could not receive your file: ā%sā."
+msgstr "nelze pÅijmout soubor: ā%sā."
+
+msgid "has received a file exchange request: ā%sā."
+msgstr "obdržel Å¾Ć”dost pro vĆ½mÄnu souboru: ā%sā."
+
+msgid "Available shortcuts:"
+msgstr "DostupnƩ klƔvesovƩ zkratky:"
+
+msgid "%s removes the chat logs"
+msgstr "%s odstranĆ chat logy"
+
+msgid "%s joins a groupchat"
+msgstr "%s pÅipojĆ skupinivĆ½ rozhovor"
+
+msgid "%s closes the chat"
+msgstr "%s uzavÅe rozhovor"
+
+msgid "%s shows the user profile"
+msgstr "%s zobrazĆ profil uživatele"
+
+msgid "%s sends a message to the room"
+msgstr "%s odeÅ”le zprĆ”vu do mĆstnosti"
+
+msgid "%s changes your nickname"
+msgstr "%s zmÄnĆ vaÅ”Ć pÅezdĆvku"
+
+msgid "%s sends a message to someone in the room"
+msgstr "%s odeÅ”le zprĆ”vu nÄkomu v mĆstnosti"
+
+msgid "%s changes the room topic"
+msgstr "%s zmÄnĆ tĆ©ma mĆstnosti"
+
+msgid "%s kicks an user of the room"
+msgstr "%s vykĆ”Å¾e uživatele z mĆstnosti"
+
+msgid "%s bans an user of the room"
+msgstr "%s zakĆ”Å¾e uživateli pÅĆstup do mĆstnosti"
+
+msgid "%s invites someone to join the room"
+msgstr "%s zve nÄkoho do mĆstnosti"
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr "Jappix je neziskovĆ” sociĆ”lnĆ platforma, ke kterĆ© mĆ”te pÅĆstup aÅ„ jste kdekoliv, kdykoli budete chtĆt s nÄkĆ½m komunikovat."
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# German translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:42+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "Jappix benƶtigt JavaScript um zu funktionieren. Bitte erlaube die AusfĆ¼hrung von JavaScript."
+
+msgid "An open social network"
+msgstr "Ein offenes soziales Netzwerk"
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "Jappix wurde von einem Netzwerkproblem, einem Programmfehler oder einer ungĆ¼ltigen Anmeldung unterbrochen. Bitte Ć¼berprĆ¼fe, ob du deine Daten richtig eingegeben hast. Entschuldige die Stƶrung."
+
+msgid "The element list on this server could not be obtained!"
+msgstr "Die Elementliste konnte nicht vom Server geladen werden."
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "Dein Passwort wurde geƤndert. Du kannst dich jetzt mit deinen neuen Anmeldedaten anmelden."
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "Dein XMPP-Konto wurde entfernt."
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "Du wurdest von Jappix abgemeldet."
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "Der Chatraum, den du betreten hast, scheint nicht zu existieren. Du solltest ihn erstellen!"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "Der Chatraum wurde gelƶscht. Jetzt kann ihn jemand anders registrieren."
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "Der Benutzer, den du erreichen mƶchtest, ist nicht in diesem Raum."
+
+msgid "Please enter the group chat address to join."
+msgstr "Gib die Adresse des Gruppenchats ein, um beizutreten."
+
+msgid "Please enter your nickname to join %s."
+msgstr "Gib deinen Spitznamen ein, um %s beizutreten."
+
+msgid "This room (%s) is protected with a password."
+msgstr "Dieser Raum (%s) ist passwortgeschĆ¼tzt."
+
+msgid "Your browser is out of date!"
+msgstr "Dein Browser ist veraltet!"
+
+msgid "Last %s version is better!"
+msgstr "Die letzte Version von %s ist besser!"
+
+msgid "Login"
+msgstr "Anmelden"
+
+msgid "Register"
+msgstr "Registrieren"
+
+msgid "Here we go!"
+msgstr "Los gehtās!"
+
+msgid "Server"
+msgstr "Anbieter"
+
+msgid "Password"
+msgstr "Passwort"
+
+msgid "Remember me"
+msgstr "Anmeldung merken"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "Dieses Werkzeug wurde deaktiviert, du kannst es nicht verwenden."
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "Aufgrund eines Netzwerkproblems wurde die Verbindung getrennt. Was mƶchtest du jetzt tun?"
+
+msgid "Reconnect"
+msgstr "Wiederverbinden"
+
+msgid "Messages"
+msgstr "Nachrichten"
+
+msgid "Profile"
+msgstr "Profil"
+
+msgid "Options"
+msgstr "Optionen"
+
+msgid "Disconnect"
+msgstr "Abmelden"
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Add a friend"
+msgstr "Freund hinzufĆ¼gen"
+
+msgid "Your groupchats"
+msgstr "Deine GruppengesprƤche"
+
+msgid "Manage your favorite groupchats"
+msgstr "Verwalte deine Lieblings-Gruppenchats"
+
+msgid "More stuff"
+msgstr "Weitere Funktionen"
+
+msgid "Show all friends"
+msgstr "Alle Freunde anzeigen"
+
+msgid "Only show connected friends"
+msgstr "Nur verfĆ¼gbare Freunde anzeigen"
+
+msgid "Message archives"
+msgstr "Nachrichtenarchiv"
+
+msgid "Date"
+msgstr "Datum"
+
+msgid "Please select a friend to view the chat history."
+msgstr "WƤhle einen Freund, um den GesprƤchsverlauf anzusehen."
+
+msgid "Nothing found for: %s"
+msgstr "Nichts gefunden fĆ¼r: %s"
+
+msgid "A short message?"
+msgstr "Eine kurze Nachricht?"
+
+msgid "How are you?"
+msgstr "Wie geht es dir?"
+
+msgid "What are you doing?"
+msgstr "Was machst du gerade?"
+
+msgid "Join a chat"
+msgstr "Ein GesprƤch betreten"
+
+msgid "Status"
+msgstr "Status"
+
+msgid "Available"
+msgstr "VerfĆ¼gbar"
+
+msgid "Talkative"
+msgstr "GesprƤchig"
+
+msgid "Away"
+msgstr "Abwesend"
+
+msgid "Not available"
+msgstr "Nicht verfĆ¼gbar"
+
+msgid "Busy"
+msgstr "BeschƤftigt"
+
+msgid "Mood"
+msgstr "Laune"
+
+msgid "None"
+msgstr "Nichts"
+
+msgid "Crazy"
+msgstr "VerrĆ¼ckt"
+
+msgid "Excited"
+msgstr "Aufgeregt"
+
+msgid "Playful"
+msgstr "Verspielt"
+
+msgid "Happy"
+msgstr "GlĆ¼cklich"
+
+msgid "Shocked"
+msgstr "Schockiert"
+
+msgid "Hot"
+msgstr "HeiĆ"
+
+msgid "Sad"
+msgstr "Traurig"
+
+msgid "Amorous"
+msgstr "Verliebt"
+
+msgid "Confident"
+msgstr "Zuversichtlich"
+
+msgid "Activity"
+msgstr "AktivitƤt"
+
+msgid "Chores"
+msgstr "Haushalt"
+
+msgid "Drinking"
+msgstr "Trinken"
+
+msgid "Eating"
+msgstr "Essen"
+
+msgid "Exercising"
+msgstr "Bewegung"
+
+msgid "Grooming"
+msgstr "Hygiene"
+
+msgid "Appointment"
+msgstr "Termin"
+
+msgid "Inactive"
+msgstr "Inaktiv"
+
+msgid "Relaxing"
+msgstr "Entspannt sich"
+
+msgid "Talking"
+msgstr "UnterhƤlt sich"
+
+msgid "Traveling"
+msgstr "Auf Reise"
+
+msgid "Working"
+msgstr "Arbeiten"
+
+msgid "View profile"
+msgstr "Profil ansehen"
+
+msgid "Repeat this notice"
+msgstr "Wiederhole diese Nachricht"
+
+msgid "Remove this notice"
+msgstr "Entferne diese Nachricht"
+
+msgid "Your profile"
+msgstr "Dein Profil"
+
+msgid "Identity"
+msgstr "IdentitƤt"
+
+msgid "Profile image"
+msgstr "Profilbild"
+
+msgid "Others"
+msgstr "Andere"
+
+msgid "Personal"
+msgstr "Persƶnlich"
+
+msgid "Complete name"
+msgstr "VollstƤndiger Name"
+
+msgid "Nickname"
+msgstr "Spitzname"
+
+msgid "First name"
+msgstr "Vorname"
+
+msgid "Last name"
+msgstr "Nachname"
+
+msgid "Date of birth"
+msgstr "Geburtstag"
+
+msgid "Contact"
+msgstr "Kontakt"
+
+msgid "E-mail"
+msgstr "E-Mail"
+
+msgid "Phone"
+msgstr "Telefon"
+
+msgid "Website"
+msgstr "Internetseite"
+
+msgid "Current"
+msgstr "Momentan"
+
+msgid "Delete"
+msgstr "Lƶschen"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "Schade, du hast kein Profilbild angegeben."
+
+msgid "Address"
+msgstr "Adresse"
+
+msgid "Street"
+msgstr "StraĆe"
+
+msgid "City"
+msgstr "Stadt"
+
+msgid "Postal code"
+msgstr "Postleitzahl"
+
+msgid "Country"
+msgstr "Land"
+
+msgid "Biography"
+msgstr "Biografie"
+
+msgid "Important notice"
+msgstr "Wichtige Nachricht"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr "Sei vorsichtig mit Informationen, die du in dein Profil schreibst. Diese Infos kƶnnen von allen gelesen werden."
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr "Nicht alles ist privat bei XMPP. Das hier ist eines davon: dein ƶffentliches Profil (vCard)."
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr "Es wird empfohlen ein Profilbild hochzuladen (maximal %s), z.b. ein Bild von dir damit deine Freunde dich leichter wieder erkennen kƶnnen."
+
+msgid "Save"
+msgstr "Speichern"
+
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgid "Edit options"
+msgstr "Eigenschaften bearbeiten"
+
+msgid "Channel"
+msgstr "Kanal"
+
+msgid "Commands"
+msgstr "Befehle"
+
+msgid "Sounds"
+msgstr "GerƤusche"
+
+msgid "Privacy"
+msgstr "PrivatsphƤre"
+
+msgid "Message archiving"
+msgstr "Nachrichtenarchivierung"
+
+msgid "Store a history of your chats"
+msgstr "Speichere einen Verlauf deiner GesprƤche"
+
+msgid "Geolocation"
+msgstr "Geodaten"
+
+msgid "Empty"
+msgstr "Leer"
+
+msgid "Empty channel"
+msgstr "Leerer Kanal"
+
+msgid "Persistent"
+msgstr "Dauerhaft"
+
+msgid "Maximum notices"
+msgstr "Maximale Benachrichtigungen"
+
+msgid "Account"
+msgstr "Account"
+
+msgid "Change password"
+msgstr "Passwort Ƥndern"
+
+msgid "Delete account"
+msgstr "Konto lƶschen"
+
+msgid "Old"
+msgstr "Alt"
+
+msgid "New (2 times)"
+msgstr "Neu (zwei Mal)"
+
+msgid "Continue"
+msgstr "Fortsetzen"
+
+msgid "To"
+msgstr "An"
+
+msgid "Close"
+msgstr "SchlieĆen"
+
+msgid "unknown"
+msgstr "Unbekannt"
+
+msgid "Unavailable"
+msgstr "Nicht erreichbar"
+
+msgid "is now"
+msgstr "ist jetzt"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr "Bitte warte wƤhrend dein Avatar hochgeladen wird..."
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "Hier ist es! Ein wunderschƶnes, neues Profilbild."
+
+msgid "The image file is not supported or has a bad size."
+msgstr "Die Bilddatei hat ein falsches Format oder ist zu groĆ."
+
+msgid "Reply"
+msgstr "Antworten"
+
+msgid "Error"
+msgstr "Fehler"
+
+msgid "Click here to solve the error"
+msgstr "Klicke hier, um den Fehler zu beheben"
+
+msgid "You"
+msgstr "Du"
+
+msgid "Remove"
+msgstr "Entfernen"
+
+msgid "Rename"
+msgstr "Umbenennen"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "Hey, ich bin %s. Ich mƶchte dich gerne als Freund hinzufĆ¼gen."
+
+msgid "Smiley insertion"
+msgstr "Smilie einfĆ¼gen"
+
+msgid "Change style"
+msgstr "Stil Ƥndern"
+
+msgid "Text in bold"
+msgstr "Text fett"
+
+msgid "Text in italic"
+msgstr "Text kursiv"
+
+msgid "Underlined text"
+msgstr "Text unterstrichen"
+
+msgid "Save chat"
+msgstr "Protokoll speichern"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr "Klicke auf den folgenden Link, um das Chatprotokoll zu erhalten. Warte ein bisschen und klicke noch Mal, um die Datei zu bekommen."
+
+msgid "This chat is empty!"
+msgstr "Dieses GesprƤch ist leer."
+
+msgid "Generate file!"
+msgstr "Datei generieren!"
+
+msgid "Download file!"
+msgstr "Datei herunterladen!"
+
+msgid "Clean current chat"
+msgstr "Aktuelles GesprƤch leeren"
+
+msgid "View chat history"
+msgstr "GesprƤchsverlauf anzeigen"
+
+msgid "Show user profile"
+msgstr "Nutzerprofil zeigen"
+
+msgid "Add this contact to your friends"
+msgstr "Kontakt zu Freunden hinzufĆ¼gen"
+
+msgid "Add this groupchat to your favorites"
+msgstr "GruppengesprƤch zu Favoriten hinzufĆ¼gen"
+
+msgid "All tabs"
+msgstr "Alle Tabs"
+
+msgid "Close this tab"
+msgstr "Diesen Tab schlieĆen"
+
+msgid "no subject defined for this room."
+msgstr "FĆ¼r diesen Raum ist kein Thema festgelegt."
+
+msgid "Administration panel for this room"
+msgstr "Verwaltung fĆ¼r diesen Raum"
+
+msgid "Moderators"
+msgstr "Moderatoren"
+
+msgid "Participants"
+msgstr "Teilnehmer"
+
+msgid "Visitors"
+msgstr "Besucher"
+
+msgid "Manage favorite rooms"
+msgstr "Favorisierte RƤume verwalten"
+
+msgid "Change favorites"
+msgstr "Favoriten Ƥndern"
+
+msgid "Search a room"
+msgstr "Raum suchen"
+
+msgid "Select a favorite"
+msgstr "Einen Favoriten wƤhlen"
+
+msgid "Getting the name..."
+msgstr "Name wird geladen ā¦"
+
+msgid "Gateway"
+msgstr "Gateway"
+
+msgid "Name"
+msgstr "Name"
+
+msgid "Room"
+msgstr "Raum"
+
+msgid "Add"
+msgstr "HinzufĆ¼gen"
+
+msgid "Edit"
+msgstr "Bearbeiten"
+
+msgid "Search a room on"
+msgstr "Einen Raum suchen in "
+
+msgid "No room found on this server."
+msgstr "Auf diesem Server wurden keine RƤume gefunden."
+
+msgid "Service discovery"
+msgstr "Ćbersicht der Dienste"
+
+msgid "Server to query"
+msgstr "Server zur Abfrage"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr "Es wurde kein Ergebnis gefunden."
+
+msgid "Accounts"
+msgstr "Konten"
+
+msgid "Authentications"
+msgstr "Genehmigung"
+
+msgid "Automation"
+msgstr "Automatisierung"
+
+msgid "Clients"
+msgstr "Klienten"
+
+msgid "Collaboration"
+msgstr "Zusammenarbeit"
+
+msgid "Components"
+msgstr "Komponenten"
+
+msgid "Rooms"
+msgstr "RƤume"
+
+msgid "Directories"
+msgstr "Verzeichnisse"
+
+msgid "Gateways"
+msgstr "Gateways"
+
+msgid "News"
+msgstr "Neuigkeiten"
+
+msgid "Hierarchy"
+msgstr "Hierarchie"
+
+msgid "Proxies"
+msgstr "Proxys"
+
+msgid "Publication/Subscription"
+msgstr "Verƶffentlichung / Abonnement"
+
+msgid "Storage"
+msgstr "Speicher"
+
+msgid "Service offline or broken"
+msgstr "Service offline oder abgestĆ¼rzt"
+
+msgid "Your inbox"
+msgstr "Posteingang"
+
+msgid "Available actions"
+msgstr "VerfĆ¼gbare Aktionen"
+
+msgid "Clean"
+msgstr "SƤubern"
+
+msgid "New"
+msgstr "Neu"
+
+msgid "Received"
+msgstr "Erhalten"
+
+msgid "Subject"
+msgstr "Betreff"
+
+msgid "Content"
+msgstr "Inhalt"
+
+msgid "Send message"
+msgstr "Nachricht schicken"
+
+msgid "Your inbox is empty."
+msgstr "Dein Posteingang ist leer."
+
+msgid "MUC administration"
+msgstr "MUC-Administration"
+
+msgid "You administrate this room"
+msgstr "Du verwaltest diesen Raum."
+
+msgid "Enter new subject"
+msgstr "Neuer Betreff"
+
+msgid "Configuration"
+msgstr "Einstellungen"
+
+msgid "Authorizations"
+msgstr "Genehmigung"
+
+msgid "Member list"
+msgstr "Mitgliederliste"
+
+msgid "Owner list"
+msgstr "Besitzerliste"
+
+msgid "Administrator list"
+msgstr "Verwalterliste"
+
+msgid "Outcast list"
+msgstr "Gebannten-Liste"
+
+msgid "Add an input"
+msgstr "Eingabe hinzufĆ¼gen"
+
+msgid "Destroy this MUC"
+msgstr "Diesen MUC schlieĆen"
+
+msgid "Yes, let's do it!"
+msgstr "Ja, los geht's!"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr "Dein Freund tippt."
+
+msgid "Your friend is writing a message..."
+msgstr "Dein Freund schreibt eine Nachricht."
+
+msgid "Your friend stopped writing a message."
+msgstr "Dein Freund hat aufgehƶrt, eine Nachricht zu schreiben."
+
+msgid "Your friend is doing something else."
+msgstr "Dein Freund tut etwas anderes."
+
+msgid "Your friend closed the chat."
+msgstr "Dein Freund hat die Unterhaltung beendet."
+
+msgid "Requesting this service..."
+msgstr "Dienst wird angefordert ā¦"
+
+msgid "Loading"
+msgstr "LƤdt ā¦"
+
+msgid "joined the chat room"
+msgstr "hat den Raum betreten"
+
+msgid "left the chat room"
+msgstr "hat den Raum verlassen"
+
+msgid "no status"
+msgstr "kein Status"
+
+msgid "has been kicked"
+msgstr "wurde rausgeschmissen."
+
+msgid "has been banned"
+msgstr "wurde verbannt."
+
+msgid "no reason"
+msgstr "kein Grund"
+
+msgid "Communicate with the entire world!"
+msgstr "Kommuniziere mit der ganzen Welt!"
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr "Du kannst Kontakt aufnehmen mit den Millionen von Nutzern des XMPP-Netzwerkes. Tritt der Gemeinschaft bei und bleib frei!"
+
+msgid "Hi there!"
+msgstr "Hallo du!"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr "Willkommen bei %1s, Ā»%2sĀ«."
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr "Melde dich mit deinem bestehenden XMPP-Konto an oder erstelle gratis ein Neues!"
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr "Jappix ist ein quelloffenes Projekt von PostPro, einer gemeinnĆ¼tzigen Organisation die uns groĆartig unterstĆ¼tzt."
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr "Melde dich mit deinem XMPP-Konto an. Du kannst auch %s benutzen, um einem Gruppenchat beizutreten."
+
+msgid "Previous"
+msgstr "Vorhergehend"
+
+msgid "General"
+msgstr "Allgemeines"
+
+msgid "Advanced"
+msgstr "Erweitert"
+
+msgid "Resource"
+msgstr "Ressource"
+
+msgid "Priority"
+msgstr "PrioritƤt"
+
+msgid "Low"
+msgstr "Niedrig"
+
+msgid "Medium"
+msgstr "Mittel"
+
+msgid "High"
+msgstr "Hoch"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr "Nenne den Chat, dem du beitreten willst und das Pseudonym, das du haben willst. Du kannst auch zurĆ¼ck zu %s."
+
+msgid "login page"
+msgstr "Anmeldeseite"
+
+msgid "Share this link with your friends:"
+msgstr "Teile diesen Verweis mit deinen Freunden:"
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr "Registriere ein neues XMPP-Konto, um mit deinen Freunden dein eigenes soziales Netz zu bilden. Es ist so einfach!"
+
+msgid "Required"
+msgstr "Notwendig"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr "Du wurdest registriert, deine XMPP-Adresse lautet:"
+
+msgid "Manager"
+msgstr "Verwalter"
+
+msgid "Project"
+msgstr "Projekt"
+
+msgid "Encrypted"
+msgstr "VerschlĆ¼sselt"
+
+msgid "Unencrypted"
+msgstr "UnverschlĆ¼sselt"
+
+msgid "Where are you?"
+msgstr "Wo bist du?"
+
+msgid "What's up with you?"
+msgstr "Was gibtās?"
+
+msgid "Fetching the social channel..."
+msgstr "Sozialer Kanal wird abgerufen ā¦"
+
+msgid "You are synchronized with your network."
+msgstr "Du bist mit deinen Netzwerken abgeglichen."
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr "Nichts kann gesendet werden: Du kannst nur Nachrichten empfangen!"
+
+msgid "Media viewer"
+msgstr "Medienbibliothek"
+
+msgid "Browse"
+msgstr "DurchblƤttern"
+
+msgid "Command"
+msgstr "Befehl"
+
+msgid "Subscribe"
+msgstr "Abonnieren"
+
+msgid "Join"
+msgstr "Beitreten"
+
+msgid "Automatic"
+msgstr "Automatisch"
+
+msgid "Search"
+msgstr "Suchen"
+
+msgid "No result!"
+msgstr "Kein Ergebnis!"
+
+msgid "No notifications."
+msgstr "Keine Benachrichtigungen."
+
+msgid "would like to add you as a friend."
+msgstr "wĆ¼rde dich gerne als Freund hinzufĆ¼gen."
+
+msgid "would like you to join this chatroom:"
+msgstr "wĆ¼rde gerne diesen Chatraum betreten."
+
+msgid "Do you accept?"
+msgstr "Akzeptieren?"
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Nein"
+
+msgid "would like to get authorization."
+msgstr "mƶchte bestƤtigt werden."
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr "Mƶchtest du die Freunde sehen, die %s dir empfiehlt?"
+
+msgid "Submit"
+msgstr "Senden"
+
+msgid "Client"
+msgstr "Client"
+
+msgid "System"
+msgstr "System"
+
+msgid "Local time"
+msgstr "Lokale Zeit"
+
+msgid "Comments"
+msgstr "Kommentare"
+
+msgid "User profile"
+msgstr "Benutzerprofil"
+
+msgid "See his/her position on the globe"
+msgstr "Position auf der Welt"
+
+msgid "Confirm"
+msgstr "BestƤtigen"
+
+msgid "anonymous mode"
+msgstr "Anonymer Modus"
+
+msgid "Groups"
+msgstr "Gruppen"
+
+msgid "Unclassified"
+msgstr "Nicht eingeordnet"
+
+msgid "Authorize"
+msgstr "Genehmigen"
+
+msgid "Ask for authorization"
+msgstr "Frage nach Genehmigung"
+
+msgid "Unblock"
+msgstr "Freischalten"
+
+msgid "Prohibit"
+msgstr "Verbieten"
+
+msgid "Block"
+msgstr "Blockieren"
+
+msgid "Chat"
+msgstr "Chat"
+
+msgid "Groupchat"
+msgstr "Gruppenchat"
+
+msgid "Jappix Mobile"
+msgstr "Jappix unterwegs"
+
+msgid "Desktop"
+msgstr "Desktop"
+
+msgid "Mobile"
+msgstr "Unterwegs"
+
+msgid "Please wait..."
+msgstr "Bitte warten ā¦"
+
+msgid "Please enable JavaScript"
+msgstr "Bitte JavaScript aktivieren"
+
+msgid "Your channel"
+msgstr "Dein Kanal"
+
+msgid "Channel of"
+msgstr "Kanal von"
+
+msgid "More notices..."
+msgstr "Mehr Nachrichten ā¦"
+
+msgid "Attach a file"
+msgstr "Datei anhƤngen"
+
+msgid "Send"
+msgstr "Senden"
+
+msgid "Unattach the file"
+msgstr "AngehƤngte Datei lƶschen"
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr "Beim Hochladen deiner Datei ist ein Fehler aufgetreten: Wahrscheinlich ist es zu groĆ (maximal %s) oder verboten!"
+
+msgid "Authorization failed"
+msgstr "Genehmigung fehlgeschlagen"
+
+msgid "Registration failed, please choose a different username"
+msgstr "Registrierung fehlgeschlagen. Bitte wƤhle einen anderen Benutzernamen."
+
+msgid "Service unavailable"
+msgstr "Dienst nicht erreichbar"
+
+msgid "Internal server error, try later"
+msgstr "Interner Serverfehler. Versuche es spƤter noch Mal."
+
+msgid "Your form has been sent."
+msgstr "Das Formular wurde versendet."
+
+msgid "Application"
+msgstr "Anwendung"
+
+msgid "XMPP links"
+msgstr "XMPP-Verweise"
+
+msgid "Open XMPP links with Jappix"
+msgstr "XMPP-Verweise mit Jappix ƶffnen"
+
+msgid "changed the subject to:"
+msgstr "hat das Thema geƤndert zu:"
+
+msgid "Welcome!"
+msgstr "Willkommen!"
+
+msgid "Friends"
+msgstr "Freunde"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr "Willkommen bei Jappix!"
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr "Bevor du beginnst, musst du noch einiges einstellen, nach Freunden suchen und dein Profil ausfĆ¼llen."
+
+msgid "Enable notification sounds"
+msgstr "BenachrichtigungsgerƤusche einschalten"
+
+msgid "Share your position on the globe"
+msgstr "Deine Position freigeben"
+
+msgid "Offline friends"
+msgstr "Freunde (nicht verfĆ¼gbar)"
+
+msgid "Don't hide offline friends"
+msgstr "Nicht verfĆ¼gbare Freunde anzeigen"
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr "Benutze dieses Werkzeug, um Freunde auf dem aktuellen Server zu finden, oder versuche es spƤter."
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr "Gut gemacht! Jetzt kannst du Jappix mit deinen Freunden teilen!"
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr "Wenn du Speichern klickst, wird die Profilbearbeitung geƶffnet. Frƶhliches Netzwerken!"
+
+msgid "Share Jappix on %s"
+msgstr "Jappix Ć¼ber %s teilen"
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr "Ich nutze Jappix, ein freies soziales Netzwerk. Ich bin %s!"
+
+msgid "Unknown name"
+msgstr "Unbekannter Name"
+
+msgid "Unknown country"
+msgstr "Unbekanntes Land"
+
+msgid "Click to enable"
+msgstr "Zum Einschalten klicken"
+
+msgid "Click to disable"
+msgstr "Zum Ausschalten klicken"
+
+msgid "Installation"
+msgstr "Installation"
+
+msgid "Jappix installation"
+msgstr "Jappix-Installation"
+
+msgid "Welcome to the Jappix installation!"
+msgstr "Willkommen zur Jappix-Installation"
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr "Dieses Tool wird dir helfen Jappix, die erste voll funktionstĆ¼chtige XMPP-basierte soziale Platform, schnell auf deinem Server zu installieren. Du brauchst dazu nichteinmal technisches Wissen."
+
+msgid "Let's have a look at the installation steps:"
+msgstr "Lass uns die Installationsschritte durchgehen."
+
+msgid "Welcome"
+msgstr "Willkommen"
+
+msgid "Storage configuration"
+msgstr "Speicher-Konfiguration"
+
+msgid "Administrator account"
+msgstr "Verwalter-Konto"
+
+msgid "Main configuration"
+msgstr "Haupteinstellungen"
+
+msgid "Hosts configuration"
+msgstr "Host-Einstellungen"
+
+msgid "Services installation"
+msgstr "Installation von Diensten"
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr "Wenn die derzeitige Sprache nicht deine ist (%1s), kann Jappix deine sprechen %2s dies wird gespeichert werden."
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr "Wenn du Hilfe bei der Jappix-Installation und -Konfiguration benƶtigst, kannst du unsere ganze Dokumentation verwenden:"
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr "Es ist Zeit dein eigenes soziales Netzt zu bauen: Gehe zum nƤchsten Schritt!"
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr "Jappix speichert permanente Dateien (wie ƶffentliche Dateien, Chatlogs, deine Musik und die Einstellungen) in einem separat gesicherten Ordner."
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr "Jappix muss Schreibberechtigungen in diesem Ordner haben um sein Unterordner zu erzeugen. Wenn nicht, setze die Rechte zu %1s oder Ƥndere den Besitzer des Ordners zu %2s, je nach deiner Konfiguration."
+
+msgid "The folder is writable, you can continue!"
+msgstr "Der Ordner ist schreibbar, du kannst weitermachen!"
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix bietet dir die Mƶglichkeit, deine Konfiguration einzustellen, neue Plugins zu installieren oder nach Updates zu suchen. Deshalb musst Du ein Admin-Account anlegen um auf die Verwaltung zugreifen zu kƶnnen."
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr "Wenn Jappix installiert ist, klicke einfach auf den Manager-Link auf der Homepage um darauf zuzugreifen."
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr "Du hast etwas vergessen, oder die beiden Passwƶrter stimmen nicht Ć¼berein."
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr "Jappix benƶtigt einige Werte um richtig zum Funktionieren. Bitte Ƥndere die folgenden Eingaben (oder behalte die Vorgaben, welche fĆ¼r die meisten Leute passen)."
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr "Beachte, wenn ein obligatorischer Wert nicht gesetzt wird, so wird dieser automatisch mit dem vorgegebenen ersetzt. "
+
+msgid "User"
+msgstr "Benutzer"
+
+msgid "Service"
+msgstr "Dienst"
+
+msgid "Service name"
+msgstr "Name des Dienstes"
+
+msgid "Service description"
+msgstr "Dienst-Beschreibung"
+
+msgid "Connection"
+msgstr "Verbindung"
+
+msgid "Lock the host"
+msgstr "Sperre den Host"
+
+msgid "Anonymous mode"
+msgstr "Anonymer Modus"
+
+msgid "Registration allowed"
+msgstr "Registrieren erlaubt"
+
+msgid "Use a proxy"
+msgstr "Einen Proxy nutzen"
+
+msgid "Encryption"
+msgstr "VerschlĆ¼sselung"
+
+msgid "HTTPS storage"
+msgstr "HTTPS-Speicher"
+
+msgid "Force HTTPS"
+msgstr "Sichere Verbindung erzwingen"
+
+msgid "Compression"
+msgstr "Komprimierung"
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr "Diese Seite hilft dir Jappix' Default-Hosts zu spezifizieren. Du kannst alles lassen wie es ist, wenn du den offiziellen Service-Host nutzen willst."
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr "Vielleicht weiĆt du nicht, was ein BOSH-Server ist? Es ist ein Verbindung zwischen dem Jappix-Client und einem XMPP-Server, welcher aufgrund technischer BeschrƤnkungen nƶtig ist."
+
+msgid "Main host"
+msgstr "Haupt-Host"
+
+msgid "Groupchat host"
+msgstr "Gruppenchat-Host"
+
+msgid "Anonymous host"
+msgstr "Anonymer Host"
+
+msgid "Directory host"
+msgstr "Verzeichnis-Host"
+
+msgid "BOSH host"
+msgstr "BOSH-Host"
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr "Du kannst einige extra Software auf deinem Server installieren um Jappix Funktionen zu erweitern. Manche mĆ¼ssen vielleicht aufgrund von SicherheitsbeschrƤnkungen modifiziert werden."
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr "Um dies durchzufĆ¼hren, musst du Zugriff auf Konsole des Servers mit Root-Rechten haben. Dies ist fakultativ. Jappix wird ohne die Module funktionieren, aber einige Features werden nicht verfĆ¼gbar sein."
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr "Nach dem Ende der Installation wird Jappix die Cache-Files erzeugen. Dies kann etwas dauern. Bitte warte, bis die Anwendung angezeigt wird und drĆ¼cke keine wƤhrenddessen keine Taste."
+
+msgid "Thanks for using Jappix!"
+msgstr "Vielen Dank fĆ¼r die Benutzung von Jappix!"
+
+msgid "Next"
+msgstr "Weiter"
+
+msgid "Finish"
+msgstr "Beenden"
+
+msgid "Check again"
+msgstr "Nochmals Ć¼berprĆ¼fen"
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr "Der Ordner ist nicht beschreibbar. Setze die korrekten Berechtigungen fĆ¼r den Ordner %s"
+
+msgid "%s is installed on your system."
+msgstr "%s ist auf deinem System installiert."
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr "%1s ist nicht auf denem System installiert, du solltest %2s installieren."
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr "Die maximale GrƶĆe fĆ¼r PHP-Uploads reicht aus (%s)."
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr "Die maximale GrƶĆe fĆ¼r PHP-Uploads reicht nicht aus (%1s), du solltest es fĆ¼r %2s in %3s bestimmen."
+
+msgid "Jappix manager"
+msgstr "Jappix-Verwaltung"
+
+msgid "Manager access"
+msgstr "Verwalter-Zugang"
+
+msgid "Statistics"
+msgstr "Statistiken"
+
+msgid "Hosts"
+msgstr "Hosts"
+
+msgid "Design"
+msgstr "Gestaltung"
+
+msgid "Repeat"
+msgstr "Wiederholen"
+
+msgid "All"
+msgstr "Alle"
+
+msgid "Horizontal"
+msgstr "Horizontal"
+
+msgid "Vertical"
+msgstr "Vertikal"
+
+msgid "Center"
+msgstr "Zentriert"
+
+msgid "Left"
+msgstr "Links"
+
+msgid "Right"
+msgstr "Rechts"
+
+msgid "Top"
+msgstr "Oben"
+
+msgid "Bottom"
+msgstr "Unten"
+
+msgid "Adapt"
+msgstr "Anpassen"
+
+msgid "Color"
+msgstr "Farbe"
+
+msgid "Users"
+msgstr "Benutzer"
+
+msgid "Updates"
+msgstr "Aktualisierungen"
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr "Dies ist ein eingeschrƤnkter Bereich: Nur genehmigte Benutzer kƶnnen diese Jappix-Node verwalten."
+
+msgid "Please use the form below to login to the administration panel."
+msgstr "Benutze das Formular fĆ¼r die Anmeldung in den Verwaltungsbereich."
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr "Zur Sicherheit sind Sitzungen zeitbegrenzt. Wenn du den Browser schlieĆt, wirst du ebenfalls abgemeldet."
+
+msgid "Credentials"
+msgstr "Anmeldedaten"
+
+msgid "You have been logged out. Goodbye!"
+msgstr "Du wurdest abgemeldet. Auf Wiedersehen!"
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr "Du konntest nicht als Verwalter erkannt werden. Bitte prĆ¼fe deine Eingabe."
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr "GrundsƤtzliche Statistiken einiger wichtiger Dinge werden von Jappix erfasst. Du findest sie untenstehend."
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr "Ćndere die Jappix Node-Konfiguration mit diesem Tool."
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr "Ćndere den XMPP-Hosts den dieser Jappix-Node nutzt mit diesem Tool."
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr "Alle Datein dieses Jappix-Nodes kƶnnen mit diesem Tool verwaltet werden: Bitte wƤhle ein Unterverzeichnis und editiere dessen Inhalt."
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr "Jappix ist voll anpassbar: Du kannst sein Design hier Ƥndern."
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr "UngĆ¼ltiges Bildformat! Benutze bitte PNG, GIF oder JPEG!"
+
+msgid "The image could not be received, would you mind retry?"
+msgstr "Das Bild konnte nicht Ć¼bertragen werden. Bitte versuche es noch Mal."
+
+msgid "Your image was added to the list!"
+msgstr "Dein Bild wurde hinzugefĆ¼gt!"
+
+msgid "Changes saved!"
+msgstr "Ćnderungen gespeichert!"
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr "Du kannst mehr als einen Administrator fĆ¼r diesen Jappix-Node festlegen. Du kannst mit diesem Tool auch ein Password Ƥndern."
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr "Aktualisiere deinen Jappix-Node mit diesem Tool, oder schau nach, ob ein neues verfĆ¼gbar ist. Informationen Ć¼ber die neuste Version werden auch (in englisch) angezeigt."
+
+msgid "Access statistics"
+msgstr "Zugriffs-Statistiken"
+
+msgid "Share statistics"
+msgstr "Freigabe-Statistiken"
+
+msgid "Other statistics"
+msgstr "Andere Statistiken"
+
+msgid "January"
+msgstr "Januar"
+
+msgid "February"
+msgstr "Februar"
+
+msgid "March"
+msgstr "MƤrz"
+
+msgid "April"
+msgstr "April"
+
+msgid "May"
+msgstr "Mai"
+
+msgid "June"
+msgstr "Juni"
+
+msgid "July"
+msgstr "Juli"
+
+msgid "August"
+msgstr "August"
+
+msgid "September"
+msgstr "September"
+
+msgid "October"
+msgstr "Oktober"
+
+msgid "November"
+msgstr "November"
+
+msgid "December"
+msgstr "Dezember"
+
+msgid "Monday"
+msgstr "Montag"
+
+msgid "Tuesday"
+msgstr "Dienstag"
+
+msgid "Wednesday"
+msgstr "Mittwoch"
+
+msgid "Thursday"
+msgstr "Donnerstag"
+
+msgid "Friday"
+msgstr "Freitag"
+
+msgid "Saturday"
+msgstr "Samstag"
+
+msgid "Sunday"
+msgstr "Sonntag"
+
+msgid "Total"
+msgstr "Gesamt"
+
+msgid "Cache"
+msgstr "Zwischenspeicher"
+
+msgid "Logs"
+msgstr "Protokolle"
+
+msgid "Music"
+msgstr "Musik"
+
+msgid "Backgrounds"
+msgstr "HintergrĆ¼nde"
+
+msgid "Share"
+msgstr "Freigabe"
+
+msgid "Background"
+msgstr "Hintergrund"
+
+msgid "Notice"
+msgstr "Hinweis"
+
+msgid "Your design preferences have been saved!"
+msgstr "Deine Gestaltung wurde gespeichert."
+
+msgid "Please check your inputs: something is missing!"
+msgstr "Bitte kontrolliere deine Eingaben: Es fehlt etwas!"
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr "Ćndere Dein Jappix-Node Hintergrund mit diesem Tool. Du kannst entweder eine eigene Farbe oder ein hochgeladenes Bild wƤhlen. Sei kreativ!"
+
+msgid "Use default background"
+msgstr "Vorgegebenen Hintergrund verwenden"
+
+msgid "Use your own image"
+msgstr "Bild selber wƤhlen"
+
+msgid "Select a background to use and change the display options."
+msgstr "Einen Hintergrund wƤhlen und die Gestaltung Ƥndern."
+
+msgid "Use your own color"
+msgstr "Farbe selber wƤhlen"
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr "Der hexadezimale Farbwert fĆ¼r den Hintergrund."
+
+msgid "Manage backgrounds"
+msgstr "HintergrĆ¼nde verwalten"
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr "Du kannst einen neuen Hintergrund hinzufĆ¼gen. Bitte sende ein gĆ¼ltiges Bild."
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr "Wenn du einen Hintergrund entfernen mƶchtest, benutze den untenstehenden Browser."
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr "Einen Hinweis auf der Startseite fĆ¼r all deine Besucher erstellen."
+
+msgid "Simple notice"
+msgstr "Einfacher Hinweis"
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr "Diesen Hinweis kannst du mit normalem Text nutzen, Code ist nicht erlaubt!"
+
+msgid "Advanced notice"
+msgstr "Erweiterter Hinweis"
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr "Du kannst deine AnkĆ¼ndigung mit HTML, CSS und JavaScript bearbeiten. Aber du musst den Code selbst erstellen."
+
+msgid "Available updates"
+msgstr "VerfĆ¼gbare Aktualisierungen"
+
+msgid "What's new?"
+msgstr "Was gibtās Neues?"
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr "Deine Speicherordner haben keine Schreibrechte, bitte Ƥndere das!"
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr "%1s kann Probleme mit dem Proxy verursachen. Bitte erhƶhe den Wert von %2s auf %3s."
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr "Du benutzt eine Entwicklerversion von Jappix. Du kannst Ć¼ber unser Repository Updates beziehen wenn du %s ausfĆ¼hrst."
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr "Eine neue Version von Jappix ist verfĆ¼gbar! Schauā dir die Neuerungen an und starte die Aktualisierung!"
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr "Deine Version ist veraltet. Klicke hier, um auf %2 zu aktualisieren."
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr "Deine Version schein aktuell zu sein, aber du kannst es manuell prĆ¼fen, indem du hier klickst."
+
+msgid "Check for updates"
+msgstr "Nach Updates suchen"
+
+msgid "Update in progress"
+msgstr "Wird aktualisiert"
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr "Jappix wurde aktualisiert: Du benutzt nun die neueste Version. Viel SpaĆ!"
+
+msgid "The update has failed! Please try again later."
+msgstr "Die Aktualisierung schlug fehl! Bitte versuche es spƤter noch ein Mal."
+
+msgid "Downloading package..."
+msgstr "Wird heruntergeladen ā¦"
+
+msgid "Removing current Jappix system files..."
+msgstr "Aktuelle Jappix-Systemdateien werden entfernt ā¦"
+
+msgid "Extracting package..."
+msgstr "Wird entpackt ā¦"
+
+msgid "Regenerating storage folder tree..."
+msgstr "Verzeichnisbaum wird neu erstellt ā¦"
+
+msgid "Jappix is now up to date!"
+msgstr "Jappix ist jetzt aktuell!"
+
+msgid "Aborted: socket error!"
+msgstr "Abbruch: Socket-Fehler!"
+
+msgid "Aborted: buffer error!"
+msgstr "Abbruch: Puffer-Fehler!"
+
+msgid "Aborted: everything is not writable!"
+msgstr "Abbruch: Keine Schreibrechte!"
+
+msgid "Aborted: could not extract the package!"
+msgstr "Abbruch: Paket konnte nicht entpackt werden!"
+
+msgid "Visits"
+msgstr "Besuche"
+
+msgid "Daily"
+msgstr "TƤglich"
+
+msgid "Weekly"
+msgstr "Wƶchentlich"
+
+msgid "Monthly"
+msgstr "Monatlich"
+
+msgid "Yearly"
+msgstr "JƤhrlich"
+
+msgid "Size"
+msgstr "GrƶĆe"
+
+msgid "Clean everything"
+msgstr "Alles sƤubern"
+
+msgid "Purge cache"
+msgstr "Cache leeren"
+
+msgid "Purge logs"
+msgstr "Protokolle lƶschen"
+
+msgid "Purge updates"
+msgstr "Aktualisierungen lƶschen"
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr "Das Speicher-Verzeichnis, das du sƤubern wolltest ist jetzt leer!"
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr "Halte deinen Jappix-Node frisch und schnell, sƤubere die Speicher-Ordner regelmƤĆig!"
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr "Lade deine Musik (Ogg Vorbis, MP3 oder WAV) hoch um sie in Jappix zu hƶren."
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr "Die hochzuladende Datei muss kleiner als %s sein."
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr "Bleib auf dem Laufenden, was Deine Nutzer auf deinem Server speichern und entferne ungewĆ¼nschte Inhalte mit diesem Tool."
+
+msgid "Title"
+msgstr "Titel"
+
+msgid "Artist"
+msgstr "KĆ¼nstler"
+
+msgid "Album"
+msgstr "Album"
+
+msgid "File"
+msgstr "Datei"
+
+msgid "Upload"
+msgstr "Hochladen"
+
+msgid "The folder is empty."
+msgstr "Dieser Ordner ist leer."
+
+msgid "The music could not be received, please retry!"
+msgstr "Deine Musik konnte nicht empfangen werden, bitte versuche es noch ein Mal."
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr "Das ist keine gĆ¼ltige Musikdatei, bitte nimm eine Ogg Vorbis, MP3 oder WAV!"
+
+msgid "Your music has been added!"
+msgstr "Deine Musik wurde hinzugefĆ¼gt."
+
+msgid "The selected elements have been removed."
+msgstr "Die ausgewƤhlten Elemente wurden entfernt."
+
+msgid "You must select elements to remove!"
+msgstr "Sie mĆ¼ssen Elemente auswƤhlen um welche zu entfernen!"
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr "FĆ¼ge neue Beutzer mit diesem Tool hinzu. Ćndere ein Passwort (gebe einen existierenden Benutzernamen ein). Bitte benutze ein starkes Passwort!"
+
+msgid "Manage"
+msgstr "Verwalten"
+
+msgid "List"
+msgstr "Liste"
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr "Entferne Benutzer mit diesem Tool. Beachte, dass du keinen Benutzer entfernen kannst, wenn er der einzig exisierende ist."
+
+msgid "The user has been added!"
+msgstr "Der Benutzer wurde hinzugefĆ¼gt."
+
+msgid "The chosen users have been removed."
+msgstr "Die ausgewƤhlten Benutzer wurden entfernt."
+
+msgid "You must select one or more users to be removed!"
+msgstr "Du musst einen oder mehrere Benutzer auswƤhlen, die gelƶscht werden sollen!"
+
+msgid "Yesterday"
+msgstr "Gestern"
+
+msgid "%s days ago"
+msgstr "Vor %s Tagen"
+
+msgid "User currently active"
+msgstr "Benutzer momentan aktiv"
+
+msgid "Last seen: %s"
+msgstr "Zuletzt gesehen: %s"
+
+msgid "Inactive since: %s"
+msgstr "Inaktiv seit: %s"
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr "Dein Freund hat deine Nachricht anscheinend nicht erhalten!"
+
+msgid "Static content server"
+msgstr "Statischer Inhaltsserver"
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr "Dies ist der statische Inhaltsserver fĆ¼r %1s, Ā»%2sĀ«."
+
+msgid "Suggested friends"
+msgstr "Empfohlene Freunde"
+
+msgid "Check all"
+msgstr "Alle auswƤhlen"
+
+msgid "Uncheck all"
+msgstr "Alle abwƤhlen"
+
+msgid "Choose"
+msgstr "WƤhlen"
+
+msgid "List name"
+msgstr "Listenname"
+
+msgid "Allow"
+msgstr "Erlauben"
+
+msgid "Deny"
+msgstr "Ablehnen"
+
+msgid "Group"
+msgstr "Gruppe"
+
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgid "Both"
+msgstr "Beides"
+
+msgid "From"
+msgstr "Von"
+
+msgid "Everybody"
+msgstr "Jeder"
+
+msgid "Send messages"
+msgstr "Nachrichten senden"
+
+msgid "Send queries"
+msgstr "Anfragen senden"
+
+msgid "See my status"
+msgstr "Status einsehen"
+
+msgid "Send his/her status"
+msgstr "Status senden"
+
+msgid "Everything"
+msgstr "Alles"
+
+msgid "Item"
+msgstr "Element"
+
+msgid "Order"
+msgstr "Reihenfolge"
+
+msgid "Active for this session"
+msgstr "Aktiv in dieser Sitzung"
+
+msgid "Always active"
+msgstr "Immer aktiv"
+
+msgid "User directory"
+msgstr "Nutzerverzeichnis"
+
+msgid "Search a friend"
+msgstr "Einen Freund suchen"
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr "Die anfegorderte Funktion ist beim Server oder EmpfƤnger nicht implementiert und kann daher nicht ausgefĆ¼hrt werden."
+
+msgid "This is a repeat from %s"
+msgstr "Dies ist eine Wiederholung von %s"
+
+msgid "Loading comments..."
+msgstr "Lade Kommentare..."
+
+msgid "Type your comment here..."
+msgstr "Gebe dein Kommentar hier ein..."
+
+msgid "Could not get the comments!"
+msgstr "Konnte Kommentare nicht laden!"
+
+msgid "Show comments"
+msgstr "Zeige Kommentare"
+
+msgid "Send him/her a message"
+msgstr "Sende Ihm/Ihr eine Nachricht"
+
+msgid "Start a chat with him/her"
+msgstr "Starte Chat mit Ihm/Ihr"
+
+msgid "Media integration"
+msgstr "Medien Einbindung"
+
+msgid "Comments locked!"
+msgstr "Kommentare sind gesperrt!"
+
+msgid "Type something you want to share with your friends..."
+msgstr "Schreibe etwas, um es mit deinen Freunden zu teilen..."
+
+msgid "changed his/her nickname to %s"
+msgstr "hat Seinen Spitznamen zu %s geƤndert"
+
+msgid "commented an item you follow: ā%sā."
+msgstr "hat ein Item, dem du folgst, kommentiert: Ā»%sĀ«."
+
+msgid "Hide"
+msgstr "Verstecken"
+
+msgid "liked your post: ā%sā."
+msgstr ""
+
+msgid "quoted you somewhere: ā%sā."
+msgstr "hat dich zitiert: Ā»%sĀ«."
+
+msgid "published on your wall: ā%sā."
+msgstr ""
+
+msgid "tagged you in a photo (%s)."
+msgstr "hat dich in einem Foto markiert (%s)."
+
+msgid "tagged you in a video (%s)."
+msgstr "hat dich in einem Video markiert (%s)."
+
+msgid "Show"
+msgstr "Zeigen"
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr "Brauchst du Hilfe? Lies unsere Dokumentation, wie man dieses Formular ausfĆ¼llt!"
+
+msgid "Pubsub host"
+msgstr "Pubsub Anbieter"
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr "Jappix ist eine groĆartige soziale Platform, auf die du immer und Ć¼berall Zugriff hast und auf der du kommunizieren kannst, mit wem du willst."
+
+msgid "Manager link"
+msgstr "Manager Link"
+
+msgid "User uploads server"
+msgstr "Nutzer-Uploadserver"
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr "Dies ist der Nutzer-Uploadserver fĆ¼r %1s, Ā»%2sĀ«."
+
+msgid "Logo"
+msgstr "Logo"
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr "Du kannst dein eigenes Service-Logo setzen, um das Standard-Logo zu ersetzen. Pass auf die GrƶĆe und Hauptfarbe jedes Logos auf!"
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr "Lade jedes Logo mit der empfohlenen maximalen Auflƶsung hoch."
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr "Dies ist kein gĆ¼ltiges Bild, bitte verwende das PNG format!"
+
+msgid "Your service logo has been successfully changed!"
+msgstr "Dein Service-Logo wurde erfolgreich geƤndert!"
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr "Das Format deines Logos muss PNG sein. Lasse ein Feld aus und das Logo wird nicht geƤndert."
+
+msgid "Remove this logo"
+msgstr "Entferne dieses Logo."
+
+msgid "View this logo"
+msgstr "Zeige dieses Logo"
+
+msgid "Send a file"
+msgstr "Eine Datei senden"
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr "Wenn hochgeladen, werden deine Freunde dazu aufgefordert, die Datei herunterzuladen."
+
+msgid "Groupchats to join"
+msgstr "Gruppenchats zum Beitreten"
+
+msgid "Purge sent files"
+msgstr "Die gesendeten Dateien leeren"
+
+msgid "would like to send you a file: ā%sā."
+msgstr "wĆ¼rde dir gerne eine Datei senden: ā%sā."
+
+msgid "has accepted to received your file: ā%sā."
+msgstr "ist damit einverstanden, deine Datei zu empfangen: ā%sā."
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr "will deine Datei nicht empfangen: ā%sā."
+
+msgid "could not receive your file: ā%sā."
+msgstr "konnte deine Datei nicht empfangen: ā%sā"
+
+msgid "has received a file exchange request: ā%sā."
+msgstr "hat eine Anfrage zum Dateiaustausch empfangen: ā%sā"
+
+msgid "Available shortcuts:"
+msgstr "VerfĆ¼gbare Tastenkombinationen:"
+
+msgid "%s removes the chat logs"
+msgstr "%s entfernt die Chat-Protokolle"
+
+msgid "%s joins a groupchat"
+msgstr "%s tritt einem Gruppenchat bei"
+
+msgid "%s closes the chat"
+msgstr "%s schlieĆt den Chat"
+
+msgid "%s shows the user profile"
+msgstr "%s zeigt das Benutzerprofil"
+
+msgid "%s sends a message to the room"
+msgstr "%s sendet eine Nachricht in den Raum"
+
+msgid "%s changes your nickname"
+msgstr "%s Ƥndert deinen Nicknamen"
+
+msgid "%s sends a message to someone in the room"
+msgstr "%s sendet eine Nachricht zu jemandem im Raum"
+
+msgid "%s changes the room topic"
+msgstr "%s Ƥndert das Thema des Raumes"
+
+msgid "%s kicks an user of the room"
+msgstr "%s schmeiĆt jemanden aus dem Raum"
+
+msgid "%s bans an user of the room"
+msgstr "%s bannt jemanden aus dem Raum"
+
+msgid "%s invites someone to join the room"
+msgstr "%s lƤdt jemanden ein, den Raum beizutreten"
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr "Jappix in eine gemeinnĆ¼tzige soziale Plattform, die du nutzen kannst wo du auch bist, wann immer du willst und egal mit wem du dich unterhalten mƶchtest."
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# Jappix - An open social platform
+# These are the default english strings of Jappix
+
+# -------------------------------------------------
+
+# License: AGPL
+# Authors: Vanaryon, JanCBorchardt
+# Last revision: 16/01/12
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr ""
+
+msgid "An open social network"
+msgstr ""
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr ""
+
+msgid "The element list on this server could not be obtained!"
+msgstr ""
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr ""
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr ""
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr ""
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr ""
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr ""
+
+msgid "The user that you want to reach is not present in the room."
+msgstr ""
+
+msgid "Please enter the group chat address to join."
+msgstr ""
+
+msgid "Please enter your nickname to join %s."
+msgstr ""
+
+msgid "This room (%s) is protected with a password."
+msgstr ""
+
+msgid "Your browser is out of date!"
+msgstr ""
+
+msgid "Last %s version is better!"
+msgstr ""
+
+msgid "Login"
+msgstr ""
+
+msgid "Register"
+msgstr ""
+
+msgid "Here we go!"
+msgstr ""
+
+msgid "Server"
+msgstr ""
+
+msgid "Password"
+msgstr ""
+
+msgid "Remember me"
+msgstr ""
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr ""
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr ""
+
+msgid "Reconnect"
+msgstr ""
+
+msgid "Messages"
+msgstr ""
+
+msgid "Profile"
+msgstr ""
+
+msgid "Options"
+msgstr ""
+
+msgid "Disconnect"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "Add a friend"
+msgstr ""
+
+msgid "Your groupchats"
+msgstr ""
+
+msgid "Manage your favorite groupchats"
+msgstr ""
+
+msgid "More stuff"
+msgstr ""
+
+msgid "Show all friends"
+msgstr ""
+
+msgid "Only show connected friends"
+msgstr ""
+
+msgid "Message archives"
+msgstr ""
+
+msgid "Date"
+msgstr ""
+
+msgid "Please select a friend to view the chat history."
+msgstr ""
+
+msgid "Nothing found for: %s"
+msgstr ""
+
+msgid "A short message?"
+msgstr ""
+
+msgid "How are you?"
+msgstr ""
+
+msgid "What are you doing?"
+msgstr ""
+
+msgid "Join a chat"
+msgstr ""
+
+msgid "Status"
+msgstr ""
+
+msgid "Available"
+msgstr ""
+
+msgid "Talkative"
+msgstr ""
+
+msgid "Away"
+msgstr ""
+
+msgid "Not available"
+msgstr ""
+
+msgid "Busy"
+msgstr ""
+
+msgid "Mood"
+msgstr ""
+
+msgid "None"
+msgstr ""
+
+msgid "Crazy"
+msgstr ""
+
+msgid "Excited"
+msgstr ""
+
+msgid "Playful"
+msgstr ""
+
+msgid "Happy"
+msgstr ""
+
+msgid "Shocked"
+msgstr ""
+
+msgid "Hot"
+msgstr ""
+
+msgid "Sad"
+msgstr ""
+
+msgid "Amorous"
+msgstr ""
+
+msgid "Confident"
+msgstr ""
+
+msgid "Activity"
+msgstr ""
+
+msgid "Chores"
+msgstr ""
+
+msgid "Drinking"
+msgstr ""
+
+msgid "Eating"
+msgstr ""
+
+msgid "Exercising"
+msgstr ""
+
+msgid "Grooming"
+msgstr ""
+
+msgid "Appointment"
+msgstr ""
+
+msgid "Inactive"
+msgstr ""
+
+msgid "Relaxing"
+msgstr ""
+
+msgid "Talking"
+msgstr ""
+
+msgid "Traveling"
+msgstr ""
+
+msgid "Working"
+msgstr ""
+
+msgid "View profile"
+msgstr ""
+
+msgid "This is a repeat from %s"
+msgstr ""
+
+msgid "Repeat this notice"
+msgstr ""
+
+msgid "Remove this notice"
+msgstr ""
+
+msgid "Your profile"
+msgstr ""
+
+msgid "Identity"
+msgstr ""
+
+msgid "Profile image"
+msgstr ""
+
+msgid "Others"
+msgstr ""
+
+msgid "Personal"
+msgstr ""
+
+msgid "Complete name"
+msgstr ""
+
+msgid "Nickname"
+msgstr ""
+
+msgid "First name"
+msgstr ""
+
+msgid "Last name"
+msgstr ""
+
+msgid "Date of birth"
+msgstr ""
+
+msgid "Contact"
+msgstr ""
+
+msgid "E-mail"
+msgstr ""
+
+msgid "Phone"
+msgstr ""
+
+msgid "Website"
+msgstr ""
+
+msgid "Current"
+msgstr ""
+
+msgid "Delete"
+msgstr ""
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr ""
+
+msgid "Address"
+msgstr ""
+
+msgid "Street"
+msgstr ""
+
+msgid "City"
+msgstr ""
+
+msgid "Postal code"
+msgstr ""
+
+msgid "Country"
+msgstr ""
+
+msgid "Biography"
+msgstr ""
+
+msgid "Important notice"
+msgstr ""
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr ""
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr ""
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
+msgid "Edit options"
+msgstr ""
+
+msgid "Channel"
+msgstr ""
+
+msgid "Commands"
+msgstr ""
+
+msgid "Sounds"
+msgstr ""
+
+msgid "Inactive"
+msgstr ""
+
+msgid "Privacy"
+msgstr ""
+
+msgid "Message archiving"
+msgstr ""
+
+msgid "Store a history of your chats"
+msgstr ""
+
+msgid "Geolocation"
+msgstr ""
+
+msgid "Empty"
+msgstr ""
+
+msgid "Empty channel"
+msgstr ""
+
+msgid "Persistent"
+msgstr ""
+
+msgid "Maximum notices"
+msgstr ""
+
+msgid "Account"
+msgstr ""
+
+msgid "Change password"
+msgstr ""
+
+msgid "Delete account"
+msgstr ""
+
+msgid "Old"
+msgstr ""
+
+msgid "New (2 times)"
+msgstr ""
+
+msgid "Continue"
+msgstr ""
+
+msgid "To"
+msgstr ""
+
+msgid "Close"
+msgstr ""
+
+msgid "unknown"
+msgstr ""
+
+msgid "Unavailable"
+msgstr ""
+
+msgid "is now"
+msgstr ""
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr ""
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr ""
+
+msgid "The image file is not supported or has a bad size."
+msgstr ""
+
+msgid "Reply"
+msgstr ""
+
+msgid "Error"
+msgstr ""
+
+msgid "Click here to solve the error"
+msgstr ""
+
+msgid "You"
+msgstr ""
+
+msgid "Remove"
+msgstr ""
+
+msgid "Rename"
+msgstr ""
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr ""
+
+msgid "Smiley insertion"
+msgstr ""
+
+msgid "Change style"
+msgstr ""
+
+msgid "Text in bold"
+msgstr ""
+
+msgid "Text in italic"
+msgstr ""
+
+msgid "Underlined text"
+msgstr ""
+
+msgid "Send a file"
+msgstr ""
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr ""
+
+msgid "Save chat"
+msgstr ""
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr ""
+
+msgid "This chat is empty!"
+msgstr ""
+
+msgid "Generate file!"
+msgstr ""
+
+msgid "Download file!"
+msgstr ""
+
+msgid "Clean current chat"
+msgstr ""
+
+msgid "View chat history"
+msgstr ""
+
+msgid "Show user profile"
+msgstr ""
+
+msgid "Add this contact to your friends"
+msgstr ""
+
+msgid "Add this groupchat to your favorites"
+msgstr ""
+
+msgid "All tabs"
+msgstr ""
+
+msgid "Close this tab"
+msgstr ""
+
+msgid "no subject defined for this room."
+msgstr ""
+
+msgid "Administration panel for this room"
+msgstr ""
+
+msgid "Moderators"
+msgstr ""
+
+msgid "Participants"
+msgstr ""
+
+msgid "Visitors"
+msgstr ""
+
+msgid "Manage favorite rooms"
+msgstr ""
+
+msgid "Change favorites"
+msgstr ""
+
+msgid "Search a room"
+msgstr ""
+
+msgid "Select a favorite"
+msgstr ""
+
+msgid "Getting the name..."
+msgstr ""
+
+msgid "Gateway"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Room"
+msgstr ""
+
+msgid "Add"
+msgstr ""
+
+msgid "Edit"
+msgstr ""
+
+msgid "Search a room on"
+msgstr ""
+
+msgid "No room found on this server."
+msgstr ""
+
+msgid "Service discovery"
+msgstr ""
+
+msgid "Server to query"
+msgstr ""
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr ""
+
+msgid "Accounts"
+msgstr ""
+
+msgid "Authentications"
+msgstr ""
+
+msgid "Automation"
+msgstr ""
+
+msgid "Clients"
+msgstr ""
+
+msgid "Collaboration"
+msgstr ""
+
+msgid "Components"
+msgstr ""
+
+msgid "Rooms"
+msgstr ""
+
+msgid "Directories"
+msgstr ""
+
+msgid "Gateways"
+msgstr ""
+
+msgid "News"
+msgstr ""
+
+msgid "Hierarchy"
+msgstr ""
+
+msgid "Proxies"
+msgstr ""
+
+msgid "Publication/Subscription"
+msgstr ""
+
+msgid "Storage"
+msgstr ""
+
+msgid "Service offline or broken"
+msgstr ""
+
+msgid "Your inbox"
+msgstr ""
+
+msgid "Available actions"
+msgstr ""
+
+msgid "Clean"
+msgstr ""
+
+msgid "New"
+msgstr ""
+
+msgid "Received"
+msgstr ""
+
+msgid "Subject"
+msgstr ""
+
+msgid "Content"
+msgstr ""
+
+msgid "Send message"
+msgstr ""
+
+msgid "Your inbox is empty."
+msgstr ""
+
+msgid "MUC administration"
+msgstr ""
+
+msgid "You administrate this room"
+msgstr ""
+
+msgid "Enter new subject"
+msgstr ""
+
+msgid "Configuration"
+msgstr ""
+
+msgid "Authorizations"
+msgstr ""
+
+msgid "Member list"
+msgstr ""
+
+msgid "Owner list"
+msgstr ""
+
+msgid "Administrator list"
+msgstr ""
+
+msgid "Outcast list"
+msgstr ""
+
+msgid "Add an input"
+msgstr ""
+
+msgid "Destroy this MUC"
+msgstr ""
+
+msgid "Yes, let's do it!"
+msgstr ""
+
+msgid "Your friend is paying attention to the conversation."
+msgstr ""
+
+msgid "Your friend is writing a message..."
+msgstr ""
+
+msgid "Your friend stopped writing a message."
+msgstr ""
+
+msgid "Your friend is doing something else."
+msgstr ""
+
+msgid "Your friend closed the chat."
+msgstr ""
+
+msgid "Requesting this service..."
+msgstr ""
+
+msgid "Loading"
+msgstr ""
+
+msgid "changed his/her nickname to %s"
+msgstr ""
+
+msgid "joined the chat room"
+msgstr ""
+
+msgid "left the chat room"
+msgstr ""
+
+msgid "no status"
+msgstr ""
+
+msgid "has been kicked"
+msgstr ""
+
+msgid "has been banned"
+msgstr ""
+
+msgid "no reason"
+msgstr ""
+
+msgid "Communicate with the entire world!"
+msgstr ""
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr ""
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr ""
+
+msgid "Hi there!"
+msgstr ""
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr ""
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr ""
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr ""
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr ""
+
+msgid "Previous"
+msgstr ""
+
+msgid "General"
+msgstr ""
+
+msgid "Advanced"
+msgstr ""
+
+msgid "Resource"
+msgstr ""
+
+msgid "Priority"
+msgstr ""
+
+msgid "Low"
+msgstr ""
+
+msgid "Medium"
+msgstr ""
+
+msgid "High"
+msgstr ""
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr ""
+
+msgid "login page"
+msgstr ""
+
+msgid "Share this link with your friends:"
+msgstr ""
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr ""
+
+msgid "Required"
+msgstr ""
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr ""
+
+msgid "Manager"
+msgstr ""
+
+msgid "Project"
+msgstr ""
+
+msgid "Encrypted"
+msgstr ""
+
+msgid "Unencrypted"
+msgstr ""
+
+msgid "Where are you?"
+msgstr ""
+
+msgid "What's up with you?"
+msgstr ""
+
+msgid "Type something you want to share with your friends..."
+msgstr ""
+
+msgid "Fetching the social channel..."
+msgstr ""
+
+msgid "You are synchronized with your network."
+msgstr ""
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr ""
+
+msgid "Media viewer"
+msgstr ""
+
+msgid "Browse"
+msgstr ""
+
+msgid "Command"
+msgstr ""
+
+msgid "Subscribe"
+msgstr ""
+
+msgid "Join"
+msgstr ""
+
+msgid "Automatic"
+msgstr ""
+
+msgid "Search"
+msgstr ""
+
+msgid "No result!"
+msgstr ""
+
+msgid "No notifications."
+msgstr ""
+
+msgid "would like to add you as a friend."
+msgstr ""
+
+msgid "would like you to join this chatroom:"
+msgstr ""
+
+msgid "Do you accept?"
+msgstr ""
+
+msgid "Yes"
+msgstr ""
+
+msgid "No"
+msgstr ""
+
+msgid "would like to get authorization."
+msgstr ""
+
+msgid "would like to send you a file: ā%sā."
+msgstr ""
+
+msgid "has received a file exchange request: ā%sā."
+msgstr ""
+
+msgid "has accepted to received your file: ā%sā."
+msgstr ""
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr ""
+
+msgid "could not receive your file: ā%sā."
+msgstr ""
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr ""
+
+msgid "commented an item you follow: ā%sā."
+msgstr ""
+
+msgid "liked your post: ā%sā."
+msgstr ""
+
+msgid "quoted you somewhere: ā%sā."
+msgstr ""
+
+msgid "published on your wall: ā%sā."
+msgstr ""
+
+msgid "tagged you in a photo (%s)."
+msgstr ""
+
+msgid "tagged you in a video (%s)."
+msgstr ""
+
+msgid "Show"
+msgstr ""
+
+msgid "Hide"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
+msgid "Client"
+msgstr ""
+
+msgid "System"
+msgstr ""
+
+msgid "Local time"
+msgstr ""
+
+msgid "Comments"
+msgstr ""
+
+msgid "User profile"
+msgstr ""
+
+msgid "See his/her position on the globe"
+msgstr ""
+
+msgid "Confirm"
+msgstr ""
+
+msgid "anonymous mode"
+msgstr ""
+
+msgid "Groups"
+msgstr ""
+
+msgid "Unclassified"
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Ask for authorization"
+msgstr ""
+
+msgid "Unblock"
+msgstr ""
+
+msgid "Prohibit"
+msgstr ""
+
+msgid "Block"
+msgstr ""
+
+msgid "Chat"
+msgstr ""
+
+msgid "Groupchat"
+msgstr ""
+
+msgid "Jappix Mobile"
+msgstr ""
+
+msgid "Desktop"
+msgstr ""
+
+msgid "Mobile"
+msgstr ""
+
+msgid "Please wait..."
+msgstr ""
+
+msgid "Please enable JavaScript"
+msgstr ""
+
+msgid "Show comments"
+msgstr ""
+
+msgid "Loading comments..."
+msgstr ""
+
+msgid "Could not get the comments!"
+msgstr ""
+
+msgid "Comments locked!"
+msgstr ""
+
+msgid "Type your comment here..."
+msgstr ""
+
+msgid "Your channel"
+msgstr ""
+
+msgid "Channel of"
+msgstr ""
+
+msgid "More notices..."
+msgstr ""
+
+msgid "Attach a file"
+msgstr ""
+
+msgid "Send"
+msgstr ""
+
+msgid "Unattach the file"
+msgstr ""
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr ""
+
+msgid "Authorization failed"
+msgstr ""
+
+msgid "Registration failed, please choose a different username"
+msgstr ""
+
+msgid "Service unavailable"
+msgstr ""
+
+msgid "Internal server error, try later"
+msgstr ""
+
+msgid "Your form has been sent."
+msgstr ""
+
+msgid "Application"
+msgstr ""
+
+msgid "Media integration"
+msgstr ""
+
+msgid "XMPP links"
+msgstr ""
+
+msgid "Open XMPP links with Jappix"
+msgstr ""
+
+msgid "changed the subject to:"
+msgstr ""
+
+msgid "Welcome!"
+msgstr ""
+
+msgid "Friends"
+msgstr ""
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr ""
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr ""
+
+msgid "Enable notification sounds"
+msgstr ""
+
+msgid "Share your position on the globe"
+msgstr ""
+
+msgid "Offline friends"
+msgstr ""
+
+msgid "Don't hide offline friends"
+msgstr ""
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr ""
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr ""
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr ""
+
+msgid "Share Jappix on %s"
+msgstr ""
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr ""
+
+msgid "Unknown name"
+msgstr ""
+
+msgid "Unknown country"
+msgstr ""
+
+msgid "Click to enable"
+msgstr ""
+
+msgid "Click to disable"
+msgstr ""
+
+msgid "Installation"
+msgstr ""
+
+msgid "Jappix installation"
+msgstr ""
+
+msgid "Welcome to the Jappix installation!"
+msgstr ""
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr ""
+
+msgid "Let's have a look at the installation steps:"
+msgstr ""
+
+msgid "Welcome"
+msgstr ""
+
+msgid "Storage configuration"
+msgstr ""
+
+msgid "Administrator account"
+msgstr ""
+
+msgid "Main configuration"
+msgstr ""
+
+msgid "Hosts configuration"
+msgstr ""
+
+msgid "Services installation"
+msgstr ""
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr ""
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr ""
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr ""
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr ""
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr ""
+
+msgid "The folder is writable, you can continue!"
+msgstr ""
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr ""
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr ""
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr ""
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr ""
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr ""
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr ""
+
+msgid "User"
+msgstr ""
+
+msgid "Service"
+msgstr ""
+
+msgid "Service name"
+msgstr ""
+
+msgid "Service description"
+msgstr ""
+
+msgid "Connection"
+msgstr ""
+
+msgid "Lock the host"
+msgstr ""
+
+msgid "Anonymous mode"
+msgstr ""
+
+msgid "Registration allowed"
+msgstr ""
+
+msgid "Use a proxy"
+msgstr ""
+
+msgid "Manager link"
+msgstr ""
+
+msgid "Groupchats to join"
+msgstr ""
+
+msgid "Encryption"
+msgstr ""
+
+msgid "HTTPS storage"
+msgstr ""
+
+msgid "Force HTTPS"
+msgstr ""
+
+msgid "Compression"
+msgstr ""
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr ""
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr ""
+
+msgid "Main host"
+msgstr ""
+
+msgid "Groupchat host"
+msgstr ""
+
+msgid "Pubsub host"
+msgstr ""
+
+msgid "Anonymous host"
+msgstr ""
+
+msgid "Directory host"
+msgstr ""
+
+msgid "BOSH host"
+msgstr ""
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr ""
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr ""
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr ""
+
+msgid "Thanks for using Jappix!"
+msgstr ""
+
+msgid "Next"
+msgstr ""
+
+msgid "Finish"
+msgstr ""
+
+msgid "Check again"
+msgstr ""
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr ""
+
+msgid "%s is installed on your system."
+msgstr ""
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr ""
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr ""
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr ""
+
+msgid "Jappix manager"
+msgstr ""
+
+msgid "Manager access"
+msgstr ""
+
+msgid "Statistics"
+msgstr ""
+
+msgid "Hosts"
+msgstr ""
+
+msgid "Design"
+msgstr ""
+
+msgid "Repeat"
+msgstr ""
+
+msgid "All"
+msgstr ""
+
+msgid "Horizontal"
+msgstr ""
+
+msgid "Vertical"
+msgstr ""
+
+msgid "Center"
+msgstr ""
+
+msgid "Left"
+msgstr ""
+
+msgid "Right"
+msgstr ""
+
+msgid "Top"
+msgstr ""
+
+msgid "Bottom"
+msgstr ""
+
+msgid "Adapt"
+msgstr ""
+
+msgid "Color"
+msgstr ""
+
+msgid "Users"
+msgstr ""
+
+msgid "Updates"
+msgstr ""
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr ""
+
+msgid "Please use the form below to login to the administration panel."
+msgstr ""
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr ""
+
+msgid "Credentials"
+msgstr ""
+
+msgid "You have been logged out. Goodbye!"
+msgstr ""
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr ""
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr ""
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr ""
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr ""
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr ""
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr ""
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr ""
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr ""
+
+msgid "The image could not be received, would you mind retry?"
+msgstr ""
+
+msgid "Your service logo has been successfully changed!"
+msgstr ""
+
+msgid "Your image was added to the list!"
+msgstr ""
+
+msgid "Changes saved!"
+msgstr ""
+
+msgid "Logo"
+msgstr ""
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr ""
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr ""
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr ""
+
+msgid "Remove this logo"
+msgstr ""
+
+msgid "View this logo"
+msgstr ""
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr ""
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr ""
+
+msgid "Access statistics"
+msgstr ""
+
+msgid "Share statistics"
+msgstr ""
+
+msgid "Other statistics"
+msgstr ""
+
+msgid "January"
+msgstr ""
+
+msgid "February"
+msgstr ""
+
+msgid "March"
+msgstr ""
+
+msgid "April"
+msgstr ""
+
+msgid "May"
+msgstr ""
+
+msgid "June"
+msgstr ""
+
+msgid "July"
+msgstr ""
+
+msgid "August"
+msgstr ""
+
+msgid "September"
+msgstr ""
+
+msgid "October"
+msgstr ""
+
+msgid "November"
+msgstr ""
+
+msgid "December"
+msgstr ""
+
+msgid "Monday"
+msgstr ""
+
+msgid "Tuesday"
+msgstr ""
+
+msgid "Wednesday"
+msgstr ""
+
+msgid "Thursday"
+msgstr ""
+
+msgid "Friday"
+msgstr ""
+
+msgid "Saturday"
+msgstr ""
+
+msgid "Sunday"
+msgstr ""
+
+msgid "Total"
+msgstr ""
+
+msgid "Cache"
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Music"
+msgstr ""
+
+msgid "Backgrounds"
+msgstr ""
+
+msgid "Share"
+msgstr ""
+
+msgid "Background"
+msgstr ""
+
+msgid "Notice"
+msgstr ""
+
+msgid "Your design preferences have been saved!"
+msgstr ""
+
+msgid "Please check your inputs: something is missing!"
+msgstr ""
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr ""
+
+msgid "Use default background"
+msgstr ""
+
+msgid "Use your own image"
+msgstr ""
+
+msgid "Select a background to use and change the display options."
+msgstr ""
+
+msgid "Use your own color"
+msgstr ""
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr ""
+
+msgid "Manage backgrounds"
+msgstr ""
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr ""
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr ""
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr ""
+
+msgid "Simple notice"
+msgstr ""
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr ""
+
+msgid "Advanced notice"
+msgstr ""
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr ""
+
+msgid "Available updates"
+msgstr ""
+
+msgid "What's new?"
+msgstr ""
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr ""
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr ""
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr ""
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr ""
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr ""
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr ""
+
+msgid "Check for updates"
+msgstr ""
+
+msgid "Update in progress"
+msgstr ""
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr ""
+
+msgid "The update has failed! Please try again later."
+msgstr ""
+
+msgid "Downloading package..."
+msgstr ""
+
+msgid "Removing current Jappix system files..."
+msgstr ""
+
+msgid "Extracting package..."
+msgstr ""
+
+msgid "Regenerating storage folder tree..."
+msgstr ""
+
+msgid "Jappix is now up to date!"
+msgstr ""
+
+msgid "Aborted: socket error!"
+msgstr ""
+
+msgid "Aborted: buffer error!"
+msgstr ""
+
+msgid "Aborted: everything is not writable!"
+msgstr ""
+
+msgid "Aborted: could not extract the package!"
+msgstr ""
+
+msgid "Visits"
+msgstr ""
+
+msgid "Daily"
+msgstr ""
+
+msgid "Weekly"
+msgstr ""
+
+msgid "Monthly"
+msgstr ""
+
+msgid "Yearly"
+msgstr ""
+
+msgid "Size"
+msgstr ""
+
+msgid "Clean everything"
+msgstr ""
+
+msgid "Purge cache"
+msgstr ""
+
+msgid "Purge logs"
+msgstr ""
+
+msgid "Purge sent files"
+msgstr ""
+
+msgid "Purge updates"
+msgstr ""
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr ""
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr ""
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr ""
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr ""
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr ""
+
+msgid "Title"
+msgstr ""
+
+msgid "Artist"
+msgstr ""
+
+msgid "Album"
+msgstr ""
+
+msgid "File"
+msgstr ""
+
+msgid "Upload"
+msgstr ""
+
+msgid "The folder is empty."
+msgstr ""
+
+msgid "The music could not be received, please retry!"
+msgstr ""
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr ""
+
+msgid "Your music has been added!"
+msgstr ""
+
+msgid "The selected elements have been removed."
+msgstr ""
+
+msgid "You must select elements to remove!"
+msgstr ""
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr ""
+
+msgid "Manage"
+msgstr ""
+
+msgid "List"
+msgstr ""
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr ""
+
+msgid "The user has been added!"
+msgstr ""
+
+msgid "The chosen users have been removed."
+msgstr ""
+
+msgid "You must select one or more users to be removed!"
+msgstr ""
+
+msgid "Yesterday"
+msgstr ""
+
+msgid "%s days ago"
+msgstr ""
+
+msgid "User currently active"
+msgstr ""
+
+msgid "Last seen: %s"
+msgstr ""
+
+msgid "Last seen: %s"
+msgstr ""
+
+msgid "Inactive since: %s"
+msgstr ""
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr ""
+
+msgid "Static content server"
+msgstr ""
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr ""
+
+msgid "User uploads server"
+msgstr ""
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Suggested friends"
+msgstr ""
+
+msgid "Check all"
+msgstr ""
+
+msgid "Uncheck all"
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "List name"
+msgstr ""
+
+msgid "Allow"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
+msgid "Group"
+msgstr ""
+
+msgid "Subscription"
+msgstr ""
+
+msgid "Both"
+msgstr ""
+
+msgid "From"
+msgstr ""
+
+msgid "Everybody"
+msgstr ""
+
+msgid "Send messages"
+msgstr ""
+
+msgid "Send queries"
+msgstr ""
+
+msgid "See my status"
+msgstr ""
+
+msgid "Send his/her status"
+msgstr ""
+
+msgid "Everything"
+msgstr ""
+
+msgid "Item"
+msgstr ""
+
+msgid "Order"
+msgstr ""
+
+msgid "Active for this session"
+msgstr ""
+
+msgid "Always active"
+msgstr ""
+
+msgid "User directory"
+msgstr ""
+
+msgid "Search a friend"
+msgstr ""
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr ""
+
+msgid "Send him/her a message"
+msgstr ""
+
+msgid "Start a chat with him/her"
+msgstr ""
+
+msgid "Available shortcuts:"
+msgstr ""
+
+msgid "%s removes the chat logs"
+msgstr ""
+
+msgid "%s joins a groupchat"
+msgstr ""
+
+msgid "%s closes the chat"
+msgstr ""
+
+msgid "%s shows the user profile"
+msgstr ""
+
+msgid "%s sends a message to the room"
+msgstr ""
+
+msgid "%s changes your nickname"
+msgstr ""
+
+msgid "%s sends a message to someone in the room"
+msgstr ""
+
+msgid "%s changes the room topic"
+msgstr ""
+
+msgid "%s kicks an user of the room"
+msgstr ""
+
+msgid "%s bans an user of the room"
+msgstr ""
+
+msgid "%s invites someone to join the room"
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
\ No newline at end of file
--- /dev/null
+# Esperanto translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:45+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "Äavaskripto mankas en via retumilo, do vi ne povas lanÄi Jappix-on! Bonvolu ripari tion Äi."
+
+msgid "An open social network"
+msgstr "Malferma socia reto"
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "Jappix estis interrompita pro reta problemo, cimo aÅ malbona ensaluto (bv. kontroli ke vi tajpis la Äustan pasvorton). Pardonon por la Äeno."
+
+msgid "The element list on this server could not be obtained!"
+msgstr "La elementa listo sur Äi tiu servilo ne povus esti akirita!"
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "Via pasvorto estis ÅanÄita, nun vi povas konekti al via konto kun via nova ensaluta datumo."
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "Via XMPPa konto estis forigita. Äis!"
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "Vi estis adiaÅita de via XMPPa konto. Belan tagon!"
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "La Äambro vi aliÄis Åajnas ke ne ekzistas. Vi devus krei Äin!"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "La retbabilejo estis forigita.Iu alia estos nun kapabla krei Äi denove."
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "La uzanto ke vi deziras atingi ne estas en la Äambro."
+
+msgid "Please enter the group chat address to join."
+msgstr "Bonvolu tajpi la retbabilejan adreson por aliÄi."
+
+msgid "Please enter your nickname to join %s."
+msgstr "Bonvolu tajpi vian kromnomon por aliÄi %s."
+
+msgid "This room (%s) is protected with a password."
+msgstr "Äi tiu Äambro (%s) estas protektita kun pasvorto."
+
+msgid "Your browser is out of date!"
+msgstr "Via retumilo tro malnovas!"
+
+msgid "Last %s version is better!"
+msgstr "Lasta %s versio estas pli bona!"
+
+msgid "Login"
+msgstr "Ensaluti"
+
+msgid "Register"
+msgstr "Registri"
+
+msgid "Here we go!"
+msgstr "Ek!"
+
+msgid "Server"
+msgstr "Servilo"
+
+msgid "Password"
+msgstr "Pasvorto"
+
+msgid "Remember me"
+msgstr "Memoru min"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "Äi tiu ilo estis malaktivigita, vi ne povas uzi Äin!"
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "Pro reta problemo, vi estis malkonektita. Kio vi deziras fari nun?"
+
+msgid "Reconnect"
+msgstr "Rekonekti"
+
+msgid "Messages"
+msgstr "MesaÄoj"
+
+msgid "Profile"
+msgstr "Profilo"
+
+msgid "Options"
+msgstr "Opcioj"
+
+msgid "Disconnect"
+msgstr "Elsaluti"
+
+msgid "Filter"
+msgstr "Filtri"
+
+msgid "Add a friend"
+msgstr "Aldoni amikon"
+
+msgid "Your groupchats"
+msgstr "Viaj babilejoj"
+
+msgid "Manage your favorite groupchats"
+msgstr "Administri viajn preferatajn retbabilejojn"
+
+msgid "More stuff"
+msgstr "Pli aĵoj"
+
+msgid "Show all friends"
+msgstr "Montri Äiojn amikojn"
+
+msgid "Only show connected friends"
+msgstr "Nur montri konektitajn amikojn"
+
+msgid "Message archives"
+msgstr "MesaÄaj arkivoj"
+
+msgid "Date"
+msgstr "Dato"
+
+msgid "Please select a friend to view the chat history."
+msgstr "Bonvolu elekti amikon por vidi la konversacian historion."
+
+msgid "Nothing found for: %s"
+msgstr "Nenion trovita por: %s"
+
+msgid "A short message?"
+msgstr "Mallonga mesaÄo?"
+
+msgid "How are you?"
+msgstr "Kiel vi fartas?"
+
+msgid "What are you doing?"
+msgstr "Kion vi faras?"
+
+msgid "Join a chat"
+msgstr "AliÄi babilejo"
+
+msgid "Status"
+msgstr "Stato"
+
+msgid "Available"
+msgstr "Enrete"
+
+msgid "Talkative"
+msgstr "Babilema"
+
+msgid "Away"
+msgstr "Fora"
+
+msgid "Not available"
+msgstr "Nedisponebla"
+
+msgid "Busy"
+msgstr "Okupata"
+
+msgid "Mood"
+msgstr "Humoro"
+
+msgid "None"
+msgstr "Neniu"
+
+msgid "Crazy"
+msgstr "Freneza"
+
+msgid "Excited"
+msgstr "Ekscitema"
+
+msgid "Playful"
+msgstr "Ludema"
+
+msgid "Happy"
+msgstr "FeliÄa"
+
+msgid "Shocked"
+msgstr "Åokita"
+
+msgid "Hot"
+msgstr "Varma"
+
+msgid "Sad"
+msgstr "MalfeliÄa"
+
+msgid "Amorous"
+msgstr "Amorema"
+
+msgid "Confident"
+msgstr "Fidema"
+
+msgid "Activity"
+msgstr "Aktiveco"
+
+msgid "Chores"
+msgstr "Taskoj"
+
+msgid "Drinking"
+msgstr "Drinkante"
+
+msgid "Eating"
+msgstr "ManÄante"
+
+msgid "Exercising"
+msgstr "Ekzercante"
+
+msgid "Grooming"
+msgstr "Tualetante"
+
+msgid "Appointment"
+msgstr "Rendevuo"
+
+msgid "Inactive"
+msgstr "Senfara"
+
+msgid "Relaxing"
+msgstr "Ripozante"
+
+msgid "Talking"
+msgstr "Parolante"
+
+msgid "Traveling"
+msgstr "VojaÄante"
+
+msgid "Working"
+msgstr "Laborante"
+
+msgid "View profile"
+msgstr "Vidi profilon"
+
+msgid "Repeat this notice"
+msgstr "Ripeti tion avizon"
+
+msgid "Remove this notice"
+msgstr "Forigi tion avizon"
+
+msgid "Your profile"
+msgstr "Via profilo"
+
+msgid "Identity"
+msgstr "Identeco"
+
+msgid "Profile image"
+msgstr "Profila bildo"
+
+msgid "Others"
+msgstr "Aliaj"
+
+msgid "Personal"
+msgstr "Persona"
+
+msgid "Complete name"
+msgstr "Tuta nomo"
+
+msgid "Nickname"
+msgstr "PseÅdonimo"
+
+msgid "First name"
+msgstr "AntaÅa nomo"
+
+msgid "Last name"
+msgstr "Familia nomo"
+
+msgid "Date of birth"
+msgstr "Dato de nasko"
+
+msgid "Contact"
+msgstr "Kontakto"
+
+msgid "E-mail"
+msgstr "RetpoÅto"
+
+msgid "Phone"
+msgstr "Telefono"
+
+msgid "Website"
+msgstr "RetpaÄo"
+
+msgid "Current"
+msgstr "Aktuala"
+
+msgid "Delete"
+msgstr "ForviÅi"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "Kio domaÄo! Vi ne havas profilan bildon en via identeca karto!"
+
+msgid "Address"
+msgstr "Adreso"
+
+msgid "Street"
+msgstr "Strato"
+
+msgid "City"
+msgstr "Urbo"
+
+msgid "Postal code"
+msgstr "PoÅtkodo"
+
+msgid "Country"
+msgstr "Lando"
+
+msgid "Biography"
+msgstr "Vivhistorio"
+
+msgid "Important notice"
+msgstr "Grava avizo"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr "Estu zorgema pri la informojn vi skribas en via profilo, Äar Äi povus esti alirita de Äiuj (eÄ iu kiu vi ne deziras montri)."
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr "Ne Äio estas privata sur XMPP. Via publika profilo (vCard) estas unu el tiuj aferoj."
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr "AlÅuti profila bildo estas forte rekomendita (%s maksimumo), kiel bildo de vi mem, Äar Äi faras vin facile rekonebla de viaj amikoj."
+
+msgid "Save"
+msgstr "Akcepti"
+
+msgid "Cancel"
+msgstr "Nuligi"
+
+msgid "Edit options"
+msgstr "Modifi opciojn"
+
+msgid "Channel"
+msgstr "Kanalo"
+
+msgid "Commands"
+msgstr "Komandoj"
+
+msgid "Sounds"
+msgstr "Sonoj"
+
+msgid "Privacy"
+msgstr "Privateco"
+
+msgid "Message archiving"
+msgstr "MesaÄa enarkivago"
+
+msgid "Store a history of your chats"
+msgstr "Entenas historion de viaj konversacioj"
+
+msgid "Geolocation"
+msgstr "Surtera loko"
+
+msgid "Empty"
+msgstr "Malplena"
+
+msgid "Empty channel"
+msgstr "Malplena kanalo"
+
+msgid "Persistent"
+msgstr "DaÅra"
+
+msgid "Maximum notices"
+msgstr "Maksimumaj avizoj"
+
+msgid "Account"
+msgstr "Konto"
+
+msgid "Change password"
+msgstr "ÅanÄi pasvorton"
+
+msgid "Delete account"
+msgstr "Forigi konton"
+
+msgid "Old"
+msgstr "Malnova"
+
+msgid "New (2 times)"
+msgstr "Nova (2 fojoj)"
+
+msgid "Continue"
+msgstr "DaÅri"
+
+msgid "To"
+msgstr "Al"
+
+msgid "Close"
+msgstr "Fermi"
+
+msgid "unknown"
+msgstr "nekonata"
+
+msgid "Unavailable"
+msgstr "Nedisponebla"
+
+msgid "is now"
+msgstr "nun estas"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr "Bonvolu atendi dum via avatar estos alÅutitaā¦"
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "Jen! Nova bela profila bildo!"
+
+msgid "The image file is not supported or has a bad size."
+msgstr "La bilda dosiero havas nesubtenita tipon aÅ malbonan grandecon."
+
+msgid "Reply"
+msgstr "Respondo"
+
+msgid "Error"
+msgstr "Eraro"
+
+msgid "Click here to solve the error"
+msgstr "Klaku Äi-tie por solvi la eraron"
+
+msgid "You"
+msgstr "Vi"
+
+msgid "Remove"
+msgstr "Forigi"
+
+msgid "Rename"
+msgstr "Renomi"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "Saluton, mi estas %s, mi Åatus aldoni vin kiel mia amiko."
+
+msgid "Smiley insertion"
+msgstr "Ridetula inserto"
+
+msgid "Change style"
+msgstr "ÅanÄi stilon"
+
+msgid "Text in bold"
+msgstr "Grasa"
+
+msgid "Text in italic"
+msgstr "Kursiva"
+
+msgid "Underlined text"
+msgstr "Substreka"
+
+msgid "Save chat"
+msgstr "Registrigi babilon"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr "Klaku sur la sekvanta ligo por akiri la konversacian protokolan dosieron kaj atendu. Tiam klaku denove por akiri la dosieron."
+
+msgid "This chat is empty!"
+msgstr "Tio babilejo estas malplena!"
+
+msgid "Generate file!"
+msgstr "Generi dosieron!"
+
+msgid "Download file!"
+msgstr "ElÅuti dosieron!"
+
+msgid "Clean current chat"
+msgstr "ForviÅi nun babilon"
+
+msgid "View chat history"
+msgstr "Vidi konversacio historio"
+
+msgid "Show user profile"
+msgstr "Montri uzatan profilon"
+
+msgid "Add this contact to your friends"
+msgstr "Aldoni Äi-tiun kontakton al viaj amikoj"
+
+msgid "Add this groupchat to your favorites"
+msgstr "Aldoni Äi tiu retbabilejo al via Åatolisto"
+
+msgid "All tabs"
+msgstr "Tutaj folioj"
+
+msgid "Close this tab"
+msgstr "Fermi tion folion"
+
+msgid "no subject defined for this room."
+msgstr "neniu temo difinita por Äi tiu Äambro."
+
+msgid "Administration panel for this room"
+msgstr "Administra panelo por Äi tiu Äambro."
+
+msgid "Moderators"
+msgstr "Kontrolantoj"
+
+msgid "Participants"
+msgstr "Partoprenantoj"
+
+msgid "Visitors"
+msgstr "Vizituloj"
+
+msgid "Manage favorite rooms"
+msgstr "Administri preferatajn Äambrojn"
+
+msgid "Change favorites"
+msgstr "ÅanÄi Åatolisto"
+
+msgid "Search a room"
+msgstr "SerÄi babilejon"
+
+msgid "Select a favorite"
+msgstr "Elekti Åatolistero"
+
+msgid "Getting the name..."
+msgstr "Akirante la nomonā¦"
+
+msgid "Gateway"
+msgstr "Kluzo"
+
+msgid "Name"
+msgstr "Nomo"
+
+msgid "Room"
+msgstr "Babilejo"
+
+msgid "Add"
+msgstr "Aldoni"
+
+msgid "Edit"
+msgstr "Modifi"
+
+msgid "Search a room on"
+msgstr "SerÄi babilejon sur"
+
+msgid "No room found on this server."
+msgstr "Neniu Äambro trovita sur Äi tiu servilo."
+
+msgid "Service discovery"
+msgstr "Serva eltrovo"
+
+msgid "Server to query"
+msgstr "Servilo por pridemandi"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr "Pardonu, sed la ento ne revenis ajnan rezulton!"
+
+msgid "Accounts"
+msgstr "Kontoj"
+
+msgid "Authentications"
+msgstr "AÅtentokontroloj"
+
+msgid "Automation"
+msgstr "AÅtomatigo"
+
+msgid "Clients"
+msgstr "Klientoj"
+
+msgid "Collaboration"
+msgstr "Kunlaborado"
+
+msgid "Components"
+msgstr "Komponento"
+
+msgid "Rooms"
+msgstr "Babilejoj"
+
+msgid "Directories"
+msgstr "Dosierujoj"
+
+msgid "Gateways"
+msgstr "Kluzoj"
+
+msgid "News"
+msgstr "Novaĵoj"
+
+msgid "Hierarchy"
+msgstr "Hierarkio"
+
+msgid "Proxies"
+msgstr "Prokuraj serviloj"
+
+msgid "Publication/Subscription"
+msgstr "Eldona/Abono"
+
+msgid "Storage"
+msgstr "Konservado"
+
+msgid "Service offline or broken"
+msgstr "Servo elretan aÅ rompita"
+
+msgid "Your inbox"
+msgstr "Via enirkesto"
+
+msgid "Available actions"
+msgstr "Haveblaj agoj"
+
+msgid "Clean"
+msgstr "Purigi"
+
+msgid "New"
+msgstr "Nova"
+
+msgid "Received"
+msgstr "Ricevitaj"
+
+msgid "Subject"
+msgstr "Temo"
+
+msgid "Content"
+msgstr "Enhavo"
+
+msgid "Send message"
+msgstr "Sendi mesaÄon"
+
+msgid "Your inbox is empty."
+msgstr "Via enirkesto estas malplene."
+
+msgid "MUC administration"
+msgstr "Retbabileja administrado."
+
+msgid "You administrate this room"
+msgstr "Vi administras Äi-tiun Äambron"
+
+msgid "Enter new subject"
+msgstr "Tajpu novan subjekton"
+
+msgid "Configuration"
+msgstr "Agordoj"
+
+msgid "Authorizations"
+msgstr "AÅtentigoj"
+
+msgid "Member list"
+msgstr "Membra listo"
+
+msgid "Owner list"
+msgstr "Posedanta listo"
+
+msgid "Administrator list"
+msgstr "Administranta listo"
+
+msgid "Outcast list"
+msgstr "Forĵetuloj listo"
+
+msgid "Add an input"
+msgstr "Aldonas enigon"
+
+msgid "Destroy this MUC"
+msgstr "Detrui la retbabilejon"
+
+msgid "Yes, let's do it!"
+msgstr "Jes, faru ni!"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr "Via amiko estas atentita al la konversacio."
+
+msgid "Your friend is writing a message..."
+msgstr "Via amiko estas skribanti mesaÄon... "
+
+msgid "Your friend stopped writing a message."
+msgstr "Via amiko haltis skribi mesaÄon."
+
+msgid "Your friend is doing something else."
+msgstr "Via amiko estas farante ion alia."
+
+msgid "Your friend closed the chat."
+msgstr "Via amiko fermis la konversacion."
+
+msgid "Requesting this service..."
+msgstr "Petanta Äi-tiun servonā¦"
+
+msgid "Loading"
+msgstr "Åargi"
+
+msgid "joined the chat room"
+msgstr "aliÄis al la babilejo"
+
+msgid "left the chat room"
+msgstr "foriris la babilejo"
+
+msgid "no status"
+msgstr "neniu stato"
+
+msgid "has been kicked"
+msgstr "estas elpelita"
+
+msgid "has been banned"
+msgstr "estis ekskludita"
+
+msgid "no reason"
+msgstr "neniu motivo"
+
+msgid "Communicate with the entire world!"
+msgstr "Komuniku kun la tuta mondo!"
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr "Kontaktu la milionojn de uzantoj kiu nuntempe uzas la XMPPan reton, kiel vi faras uzante Jappix-on. AliÄu la komunumon kaj restu libere!"
+
+msgid "Hi there!"
+msgstr "Saluton!"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr "Bonvenon en %1s, ā%2sā."
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr "Ensalutu al via ekzistanta XMPP konto, aÅ krei novan senkoste!"
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr "Jappix estas malferma-fonta projekto de PostPro, neprofita organizo kiu grande helpas nin."
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr "Ensalutu kun via ekzistanta XMPP-a konto. Vi ankaÅ povas uzi la %s por aliÄi retbabilejon."
+
+msgid "Previous"
+msgstr "AntaÅa"
+
+msgid "General"
+msgstr "Äenerala"
+
+msgid "Advanced"
+msgstr "Krome"
+
+msgid "Resource"
+msgstr "Risurco"
+
+msgid "Priority"
+msgstr "Prioritato"
+
+msgid "Low"
+msgstr "Malgrava"
+
+msgid "Medium"
+msgstr "Norma"
+
+msgid "High"
+msgstr "Grava"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr "Eniru la retbablejon vi deziras aliÄi, kaj la kromnomon kiu vi deziras. Vi ankaÅ povas reveni al la %s."
+
+msgid "login page"
+msgstr "ensaluta paÄo"
+
+msgid "Share this link with your friends:"
+msgstr "Kundividu Äi-tiun ligon kun viaj amikoj:"
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr "Registru novan XMPPan konton por aligi viajn amikojn sur via propra socia nubo. Tio estas simpla!"
+
+msgid "Required"
+msgstr "Postulita"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr "Vi estis registrita, jen via XMPPa adreso:"
+
+msgid "Manager"
+msgstr "Administrilo"
+
+msgid "Project"
+msgstr "Projekto"
+
+msgid "Encrypted"
+msgstr "Äifrita"
+
+msgid "Unencrypted"
+msgstr "NeÄifrita"
+
+msgid "Where are you?"
+msgstr "Kie vi estas?"
+
+msgid "What's up with you?"
+msgstr "Kio nova?"
+
+msgid "Fetching the social channel..."
+msgstr "Akirante la socian kanalon..."
+
+msgid "You are synchronized with your network."
+msgstr "Vi estas samtempigita kun via reto."
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr "Ne povas sendi ion-ajn: vi nur povas ricevi avizojn!"
+
+msgid "Media viewer"
+msgstr "AÅdvidaĵa legilo"
+
+msgid "Browse"
+msgstr "Foliumi"
+
+msgid "Command"
+msgstr "Komando"
+
+msgid "Subscribe"
+msgstr "Aboni"
+
+msgid "Join"
+msgstr "AliÄi"
+
+msgid "Automatic"
+msgstr "AÅtomata"
+
+msgid "Search"
+msgstr "SerÄi"
+
+msgid "No result!"
+msgstr "Neniu trafo!"
+
+msgid "No notifications."
+msgstr "Neniuj sciigoj."
+
+msgid "would like to add you as a friend."
+msgstr "Åatus aldoni vin kiel amiko."
+
+msgid "would like you to join this chatroom:"
+msgstr "Åatus vin aliÄi Äi tiun babilejon:"
+
+msgid "Do you accept?"
+msgstr "Äu vi akceptas?"
+
+msgid "Yes"
+msgstr "Jes"
+
+msgid "No"
+msgstr "Ne"
+
+msgid "would like to get authorization."
+msgstr "Åatus akiri rajtigon."
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr "Äu vi deziras vidi la amikojn %s sugestas vin?"
+
+msgid "Submit"
+msgstr "Sendi"
+
+msgid "Client"
+msgstr "Kliento"
+
+msgid "System"
+msgstr "Sistemo"
+
+msgid "Local time"
+msgstr "Loka tempo"
+
+msgid "Comments"
+msgstr "Komentoj"
+
+msgid "User profile"
+msgstr "Uzanta profilo"
+
+msgid "See his/her position on the globe"
+msgstr "Vidi lia/Åia pozicio sur Tero"
+
+msgid "Confirm"
+msgstr "Konfirmi"
+
+msgid "anonymous mode"
+msgstr "anonima modo"
+
+msgid "Groups"
+msgstr "Grupoj"
+
+msgid "Unclassified"
+msgstr "Neklasigita"
+
+msgid "Authorize"
+msgstr "Rajtigi"
+
+msgid "Ask for authorization"
+msgstr "Peto por rajtigo"
+
+msgid "Unblock"
+msgstr "Malbloki"
+
+msgid "Prohibit"
+msgstr "Malpermesi"
+
+msgid "Block"
+msgstr "Bloki"
+
+msgid "Chat"
+msgstr "Babilado"
+
+msgid "Groupchat"
+msgstr "Retbabilejo"
+
+msgid "Jappix Mobile"
+msgstr "PoÅtelefona Jappix"
+
+msgid "Desktop"
+msgstr "Surtabla versio"
+
+msgid "Mobile"
+msgstr "PoÅtelefona versio"
+
+msgid "Please wait..."
+msgstr "Momentonā¦"
+
+msgid "Please enable JavaScript"
+msgstr "Bonvolu enÅalti Äavoskripton"
+
+msgid "Your channel"
+msgstr "Via kanalo"
+
+msgid "Channel of"
+msgstr "Kanalo da"
+
+msgid "More notices..."
+msgstr "Pli da avizojā¦"
+
+msgid "Attach a file"
+msgstr "Alligas dosieron "
+
+msgid "Send"
+msgstr "Sendi"
+
+msgid "Unattach the file"
+msgstr "Malalligas dosieron "
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr "Eraro okazis dum via dosiero elÅutado: eble Äi estas tro granda (%s maksimuma) aÅ malpermesita!"
+
+msgid "Authorization failed"
+msgstr "Rajtigo malsuksesis"
+
+msgid "Registration failed, please choose a different username"
+msgstr "Registrigo malsuksesis. Bonvolu elekti alian salutnomon."
+
+msgid "Service unavailable"
+msgstr "Maldisponebla servo"
+
+msgid "Internal server error, try later"
+msgstr "Interna servila eraro, provas poste"
+
+msgid "Your form has been sent."
+msgstr "Via formo estis sendita."
+
+msgid "Application"
+msgstr "Aplikaĵo"
+
+msgid "XMPP links"
+msgstr "XMPPa ligoj"
+
+msgid "Open XMPP links with Jappix"
+msgstr "Malfermi XMPPan ligojn kun Jappix"
+
+msgid "changed the subject to:"
+msgstr "ÅanÄis la temon al:"
+
+msgid "Welcome!"
+msgstr "Bonvenon!"
+
+msgid "Friends"
+msgstr "Amikoj"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr "Bonvenon Äe Jappix, via propra socia nubo!"
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr "AntaÅ ol vi komencas uzi Äin, vi devos ÅanÄi kelkajn agordojn, serÄi amikojn kaj kompletigi vian profilon."
+
+msgid "Enable notification sounds"
+msgstr "EnÅalti sciigajn sonojn"
+
+msgid "Share your position on the globe"
+msgstr "Komuniku vian lokon sur Tero"
+
+msgid "Offline friends"
+msgstr "Eksterretaj amikoj"
+
+msgid "Don't hide offline friends"
+msgstr "Ne kaÅi eksterretajn amikojn"
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr "Uzi Äi tiun ilon por trovi viajn amikojn sur la servilo kiu vi Äus uzas nun, aÅ aldoni ilin poste."
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr "Bonege! Nun, vi povas kunuzi Jappix kun viaj amikoj!"
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr "Kiam vi premos la āsaviā butonon, la profila redaktorilo estos malfermita. FeliÄan societumon!"
+
+msgid "Share Jappix on %s"
+msgstr "Kunuzigi Jappix-on Äe %s"
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr "Uzante Jappix-on, malferma socia platformo. Mi estas %s!"
+
+msgid "Unknown name"
+msgstr "Nekonata nomo"
+
+msgid "Unknown country"
+msgstr "Nekonata lando"
+
+msgid "Click to enable"
+msgstr "Premi por enÅalti"
+
+msgid "Click to disable"
+msgstr "Premi por elÅalti"
+
+msgid "Installation"
+msgstr "Instalado"
+
+msgid "Jappix installation"
+msgstr "Jappix-a instalado"
+
+msgid "Welcome to the Jappix installation!"
+msgstr "Bonvenon en la instalado de Jappix!"
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr "Äi tiu ilo helpos vin instali Jappix-on rapide, la unua XMPP-bazita socian platformon, sur via servilo. Vi ne eÄ devas ajnan teknikan scion."
+
+msgid "Let's have a look at the installation steps:"
+msgstr "Jen la instaladaj paÅoj:"
+
+msgid "Welcome"
+msgstr "Bonvenon"
+
+msgid "Storage configuration"
+msgstr "Konservada agordo"
+
+msgid "Administrator account"
+msgstr "Administranta konto"
+
+msgid "Main configuration"
+msgstr "Äefa agordo"
+
+msgid "Hosts configuration"
+msgstr "Agordo de gastigoj"
+
+msgid "Services installation"
+msgstr "Instalado de servoj"
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr "Se la nuna lingvo ne kongruas la vian (%1s), vi povas paroligi Jappix %2s Äi estos savita."
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr "Se vi deziras akiri helpon pri la Jappix-a instalaĵo kaj agordaĵo, vi povas uzi nian tutan dokumentaron, havebla Äe:"
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr "Estas tempo por konstrui vian propran socian nubon: nur iru al la sekvanta paÅo!"
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr "Jappix entenas persistan datumon (kiel komunaj dosieroj, konversaciaj Åtipoj, via propra muziko kaj Äia konfiguracio) en ununura gardata konservada dosierujo."
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr "Jappix devas esti kapabla skribi en Äi tiu teko krei Äia sub-adresaroj. Se ne, vi devas fiksi la rajtojn al %1s aÅ ÅanÄi la tekan posedanton al %2s (dependanta de via konfiguracio)."
+
+msgid "The folder is writable, you can continue!"
+msgstr "La dosierujo estas skribebla, vi povas daÅri!"
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix ebligas vin administri vian konfiguron, instali novajn kromaĵojn aÅ serÄi Äisdatigojn. Tio estas kial vi devas krei administrantan konton por aliri la manaÄeron."
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr "Kiam Jappix estos instalita, ĵus klaku sur la manaÄera ligo Äe la hejmpaÄo por aliri Äin."
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr "Ohoh, vi perdiÄis ion aÅ la du pasvortoj ne kongruas!"
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr "Jappix necesas ke vi specifu kelkajn valorojn por funkcii. Bonvolu Äustigi la sekvantajn enigojn (aÅ teni la apriorajn valorojn, kiu estas sufiÄa por plejpartoj de homoj)."
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr "Notu ke se vi ne specifas valoron kiu estas deviga, Äi estos aÅtomate kompletigita kun la apriora unu."
+
+msgid "User"
+msgstr "Uzanto"
+
+msgid "Service"
+msgstr "Servo"
+
+msgid "Service name"
+msgstr "Serva nomo"
+
+msgid "Service description"
+msgstr "Serva priskribo"
+
+msgid "Connection"
+msgstr "Konekto"
+
+msgid "Lock the host"
+msgstr "Ålozi la gastigon"
+
+msgid "Anonymous mode"
+msgstr "Sennoma modo"
+
+msgid "Registration allowed"
+msgstr "RegistriÄo permesita"
+
+msgid "Use a proxy"
+msgstr "Uzi prokurilon"
+
+msgid "Encryption"
+msgstr "Äifrado"
+
+msgid "HTTPS storage"
+msgstr "HTTPS-a konservado"
+
+msgid "Force HTTPS"
+msgstr "Perforti HTTPS-n"
+
+msgid "Compression"
+msgstr "Densigo"
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr "Äi-tiu paÄo helpas vin por specifi la apriorajn gastigojn kiu konektos al Jappix. Vi povas lasi Äin kiel Äi estas, kaj daÅri se vi deziras uzi la oficialajn servajn gastigojn."
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr "Eble vi ne scias kiu BOSH-a servilo estas? Fakte, tio Äi estas transsendado inter Jappix kliento kaj XMPP-a servilo, kiu estas necesa pro teknikaj limoj."
+
+msgid "Main host"
+msgstr "Äefa gastigo"
+
+msgid "Groupchat host"
+msgstr "Retbabileja gastigo"
+
+msgid "Anonymous host"
+msgstr "Sennoma gastigo"
+
+msgid "Directory host"
+msgstr "Dosieruja gastigo"
+
+msgid "BOSH host"
+msgstr "BOSH-a gastigo"
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr "Vi povas instali kelkajn kromaĵojn sur via servilo, etendi vian Jappix-an funkciojn. Kelkaj aliaj povus esti modifita, pro sekurecaj restriktoj kiuj estas fiksita apriore."
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr "Por fari tion-Äi, vi devas esti kapabla aliri la via servila Åelo, kaj esti ensalutita kiel administranto. Memori Äi-tion ne estas deviga, Jappix laboros sen Äi-tiuj kapsuloj, sed kelkaj el funkcioj estos malhaveblaj."
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr "Kiam tiam vi finigis la agordon, Jappix produktos la kaÅdosierojn. Povus esti malrapida, bv. atendi Äis la aplikaĵo estos montrita kaj ne premu iu-ajnan butonon."
+
+msgid "Thanks for using Jappix!"
+msgstr "Dankon por uzi Jappix-n!"
+
+msgid "Next"
+msgstr "LaÅ"
+
+msgid "Finish"
+msgstr "Fini"
+
+msgid "Check again"
+msgstr "Denove kontroli"
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr "La dosierujo ne estas skribebla. Bonvolu agordi la Äustajn permesojn al la %s dosierujon."
+
+msgid "%s is installed on your system."
+msgstr "%s estas instalita sur via sistemo."
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr "%1s ne estas instalita sur via sistemo. Vi devus instali %2s."
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr "PHP maksimuma alÅuta grando estas sufiÄa (%s)."
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr "PHP maksimuma alÅuta grando ne estas sufiÄa (%1s). Vi devus defini Äin inter %2s kaj %3s."
+
+msgid "Jappix manager"
+msgstr "Jappix-a administrilo"
+
+msgid "Manager access"
+msgstr "Administrila aliro"
+
+msgid "Statistics"
+msgstr "Statistiko"
+
+msgid "Hosts"
+msgstr "Gastigoj"
+
+msgid "Design"
+msgstr "Fasonado"
+
+msgid "Repeat"
+msgstr "Ripeti"
+
+msgid "All"
+msgstr "Äio"
+
+msgid "Horizontal"
+msgstr "Horizontala"
+
+msgid "Vertical"
+msgstr "Vertikala"
+
+msgid "Center"
+msgstr "Centre"
+
+msgid "Left"
+msgstr "Maldekstre"
+
+msgid "Right"
+msgstr "Dekstre"
+
+msgid "Top"
+msgstr "Supre"
+
+msgid "Bottom"
+msgstr "Fundo"
+
+msgid "Adapt"
+msgstr "Adapti"
+
+msgid "Color"
+msgstr "koloro"
+
+msgid "Users"
+msgstr "Uzantoj"
+
+msgid "Updates"
+msgstr "Äisdatigoj"
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr "Tio Äi estas restriktita zonon: nur la rajtigitaj uzantoj povus administri Äi-tiun Jappix-an nodon."
+
+msgid "Please use the form below to login to the administration panel."
+msgstr "Bonvolu uzi la suban formularon por ensaluti en la administrita panelo."
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr "Por plibonigi sekurecon, sesioj estas limigitaj per tempo kaj kiam via retumilo estos fermita, vi estos adiaÅita."
+
+msgid "Credentials"
+msgstr "Legitimaĵo"
+
+msgid "You have been logged out. Goodbye!"
+msgstr "Vi estis elsalutita. Äis!"
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr "Hoho, vi ne povus esti rekonita kiel valida administranto. Bonvolu kontroli vian leÄitimaĵon!"
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr "Bazan statistikon estas faritaj per Jappix pri kelkaj gravaj aferoj. Vi povas trovi ilin malsupre."
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr "ÅanÄu vian Jappix-an nodna konfiguracion kun Äi-tiu ilo."
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr "ÅanÄu la XMPP-an gastigojn ke Äi-tiu Jappix-a nodo povas servi kun Äi-tiu ilo."
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr "Äiuj Jappix-a noda konservitaj dosierojn povas esti administrita kun Äi tiu ilo: bonvolu elekti subdosierujon kaj komenci redakti Äian enhavon!"
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr "Jappix estas tute tajlorebla: vi povas ÅanÄi Äian fasonadon Äi-tie."
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr "Tio-Äi ne estas valida bildo. Bonvolu uzi PNG, GIF aÅ JPG!"
+
+msgid "The image could not be received, would you mind retry?"
+msgstr "La bildo ne povus esti ricevita. Bonvolu provi denove."
+
+msgid "Your image was added to the list!"
+msgstr "Vian bildon estas aldonita al la listo!"
+
+msgid "Changes saved!"
+msgstr "ÅanÄoj konservitaj"
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr "Vi povas difini pli ol unu administranto por Äi-tiu Jappix nodo. Vi ankaÅ povas ÅanÄi pasvorton kun Äi tiu ilo."
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr "Äisdatigu vian Jappix-an nodon kun Äi-tiu ilo, aÅ kontroli se nova estas havebla. Informoj pri la plej lasta versio estas ankaÅ montritaj (en la angla)."
+
+msgid "Access statistics"
+msgstr "Iri al statistiko"
+
+msgid "Share statistics"
+msgstr "Disvastigi statistikon"
+
+msgid "Other statistics"
+msgstr "Alia statistiko"
+
+msgid "January"
+msgstr "Januaro"
+
+msgid "February"
+msgstr "Februaro"
+
+msgid "March"
+msgstr "Marto"
+
+msgid "April"
+msgstr "Aprilo"
+
+msgid "May"
+msgstr "Majo"
+
+msgid "June"
+msgstr "Junio"
+
+msgid "July"
+msgstr "Julio"
+
+msgid "August"
+msgstr "AÅgusto"
+
+msgid "September"
+msgstr "Septembro"
+
+msgid "October"
+msgstr "Oktobro"
+
+msgid "November"
+msgstr "Novembro"
+
+msgid "December"
+msgstr "Decembro"
+
+msgid "Monday"
+msgstr "lundo"
+
+msgid "Tuesday"
+msgstr "mardo"
+
+msgid "Wednesday"
+msgstr "merkredo"
+
+msgid "Thursday"
+msgstr "jaÅdo"
+
+msgid "Friday"
+msgstr "vendredo"
+
+msgid "Saturday"
+msgstr "sabato"
+
+msgid "Sunday"
+msgstr "dimanÄo"
+
+msgid "Total"
+msgstr "Totala"
+
+msgid "Cache"
+msgstr "KaÅmemoro"
+
+msgid "Logs"
+msgstr "Protokoloj"
+
+msgid "Music"
+msgstr "Muziko"
+
+msgid "Backgrounds"
+msgstr "Fonoj"
+
+msgid "Share"
+msgstr "Disvastigi"
+
+msgid "Background"
+msgstr "Fono"
+
+msgid "Notice"
+msgstr "Avizo"
+
+msgid "Your design preferences have been saved!"
+msgstr "Viaj fasonaj preferoj estis savita!"
+
+msgid "Please check your inputs: something is missing!"
+msgstr "Bonvolu kontroli viajn enigojn: io mankas!"
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr "ÅanÄu vian Jappix-an nodan fonon kun Äi tiu ilo. Vi povas agordi propran koloron aÅ alÅutitan bildon. Lasu vian kreecon flui!"
+
+msgid "Use default background"
+msgstr "Uzi aprioran fonon"
+
+msgid "Use your own image"
+msgstr "Uzi vian propran bildon"
+
+msgid "Select a background to use and change the display options."
+msgstr "Elektu fonon por uzi kaj ÅanÄi la vidigajn elektojn."
+
+msgid "Use your own color"
+msgstr "Uzi vian propran koloron"
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr "Tajpu la deksesuman koloran valoron kiun vi deziras uzi kiel fono."
+
+msgid "Manage backgrounds"
+msgstr "Administri fonojn"
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr "Vi povas aldoni novan fonon al la listo kun Äi-tiu ilo. Bonvolu sendi validan bildon."
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr "Se vi deziras forigi kelkajn fonojn, uzu la suban retumilon."
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr "Difinu ÄefpaÄan avizon por Äiuj viaj uzantoj, ekzemple averto, grava mesaÄo aÅ reklamo kun Äi-tiu ilo."
+
+msgid "Simple notice"
+msgstr "Simple avizo"
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr "Äi-tiu avizo nur bezonas simplan tekston por esti montrita, sed kodo ne estas permesita!"
+
+msgid "Advanced notice"
+msgstr "Kroma avizo"
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr "Vi povas agordi vian avizon kun enigita HTML, CSS kaj Äavoskripto, sed vi bezonas kodi la stilon."
+
+msgid "Available updates"
+msgstr "Haveblaj Äisdatigoj"
+
+msgid "What's new?"
+msgstr "Kio nova?"
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr "Viaj konservaj dosierujon ne estas skribeblaj. Bonvolu apliki la Äustajn rajtojn!"
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr "%1s povas kaÅzi problemojn al la prokurilo. Bonvolu pliigi %2s valoro Äis %3s!"
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr "Vi estas uzanta konstruatan version de Jappix. Äisdatigu Äin tra nia deponejo plenumigante: %s."
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr "Nova versio de Jappix estas havebla! Kontrolu kion estas nova kaj lanÄu la Äisdatigon!"
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr "Via versio ne estas Äisdatiga. Bonvolu nun Äisdatigi al %s, klakante Äi-tie!"
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr "Via versio Åajnas esti Äisdatiga, sed vi povas kontroli Äisdatigojn mane, klakante Äi-tie."
+
+msgid "Check for updates"
+msgstr "Kontroli Äisdatigoj"
+
+msgid "Update in progress"
+msgstr "Äisdatiganteā¦"
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr "Jappix estis Äisdatigita: vi nun uzas la plej lastan version. AmuziÄu!"
+
+msgid "The update has failed! Please try again later."
+msgstr "La Äisdatigo fiaskis! Bonvolu provi denove poste."
+
+msgid "Downloading package..."
+msgstr "ElÅutante pakaĵonā¦"
+
+msgid "Removing current Jappix system files..."
+msgstr "Forigas nunajn Jappix-an sistemajn dosierojnā¦"
+
+msgid "Extracting package..."
+msgstr "Eltirante pakaĵonā¦"
+
+msgid "Regenerating storage folder tree..."
+msgstr "Regenerante konservadan dosierujan arbon..."
+
+msgid "Jappix is now up to date!"
+msgstr "Jappix estas nun Äisdatigita!"
+
+msgid "Aborted: socket error!"
+msgstr "Äesita: inga eraro!"
+
+msgid "Aborted: buffer error!"
+msgstr "Äesita: bufra eraro!"
+
+msgid "Aborted: everything is not writable!"
+msgstr "Äesita: Äio ne skribeblas!"
+
+msgid "Aborted: could not extract the package!"
+msgstr "Äesita: ne povas eltiri la pakaĵon!"
+
+msgid "Visits"
+msgstr "Vizitoj"
+
+msgid "Daily"
+msgstr "Äiutaga"
+
+msgid "Weekly"
+msgstr "Äiusemajna"
+
+msgid "Monthly"
+msgstr "Äiumonata"
+
+msgid "Yearly"
+msgstr "Äiujara"
+
+msgid "Size"
+msgstr "Grando"
+
+msgid "Clean everything"
+msgstr "ViÅi Äion"
+
+msgid "Purge cache"
+msgstr "ViÅi kaÅmemoron"
+
+msgid "Purge logs"
+msgstr "ViÅi protokolojn"
+
+msgid "Purge updates"
+msgstr "ViÅi Äisdatigojn"
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr "La konservada dosiero tiun, kiun vi volus viÅi estas nun malplena!"
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr "Tenu vian Jappix-an nodon freÅe kaj rapide, viÅu la konservadan dosieron regule!"
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr "AlÅutu vian muzikon (Ogg Vorbis, Mp3 aÅ WAV) por esti kapabla aÅskulti Äin Äe Jappix!"
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr "La dosiero vi deziras alÅuti devus esti malpli grande ol %s."
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr "Estu vigla pri kion viaj uzantoj konservas en via servilo, kaj forigu nedezireman enhavon kun Äi tiu ilo."
+
+msgid "Title"
+msgstr "Titolo"
+
+msgid "Artist"
+msgstr "Artisto"
+
+msgid "Album"
+msgstr "Albumo"
+
+msgid "File"
+msgstr "Dosiero"
+
+msgid "Upload"
+msgstr "AlÅuti"
+
+msgid "The folder is empty."
+msgstr "La dosieraro estas malplena."
+
+msgid "The music could not be received, please retry!"
+msgstr "La muziko ne povus esti ricevita, bonvolu provi denove!"
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr "Tio Äi ne estas valida muzika dosiero. Bonvolu kodigi en Ogg Vorbis, Mp3 aÅ WAV."
+
+msgid "Your music has been added!"
+msgstr "Via muziko ĵus estas aldonita!"
+
+msgid "The selected elements have been removed."
+msgstr "La elektitajn elementojn estas forigita."
+
+msgid "You must select elements to remove!"
+msgstr "Vin devas elekti forigendajn elementojn!"
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr "Aldonu novan uzanton kun Äi-tiu ilo, aÅ ÅanÄu pasvorton (tajpu ekzistantan salutnomon). Bonvolu sendi fortan pasvorton!"
+
+msgid "Manage"
+msgstr "Administri"
+
+msgid "List"
+msgstr "Listo"
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr "Forigu uzantojn kun Äi-tiu ilo. Notu ke vi ne povas forigi uzanton se li estas la ununura restante."
+
+msgid "The user has been added!"
+msgstr "La uzanto estis aldonita!"
+
+msgid "The chosen users have been removed."
+msgstr "La elektitaj uzantoj estis forigita."
+
+msgid "You must select one or more users to be removed!"
+msgstr "Vi devas elekti unu aÅ pli da uzantoj por esti forigi!"
+
+msgid "Yesterday"
+msgstr "HieraÅ"
+
+msgid "%s days ago"
+msgstr "%s tagoj antaÅe"
+
+msgid "User currently active"
+msgstr "Uzanto nune aktiva"
+
+msgid "Last seen: %s"
+msgstr "Laste vidita: %s"
+
+msgid "Inactive since: %s"
+msgstr "Malaktiva ekde: %s"
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr "Via amiko Åajnas ke li ne ricevas viajn mesaÄojn! "
+
+msgid "Static content server"
+msgstr "Senmova enhava servilo"
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr "Tiu estas la senmova enhava servilo por %1s, ā%2sā."
+
+msgid "Suggested friends"
+msgstr "Proponi amikojn"
+
+msgid "Check all"
+msgstr "EnÅalti Äion"
+
+msgid "Uncheck all"
+msgstr "ElÅalti Äion"
+
+msgid "Choose"
+msgstr "Elekti"
+
+msgid "List name"
+msgstr "Lista nomo"
+
+msgid "Allow"
+msgstr "Permesi"
+
+msgid "Deny"
+msgstr "Malpermesi"
+
+msgid "Group"
+msgstr "Groupo"
+
+msgid "Subscription"
+msgstr "Abono"
+
+msgid "Both"
+msgstr "AmbaÅ"
+
+msgid "From"
+msgstr "De"
+
+msgid "Everybody"
+msgstr "Äiuj"
+
+msgid "Send messages"
+msgstr "Sendi mesaÄojn"
+
+msgid "Send queries"
+msgstr "Sendi petojn"
+
+msgid "See my status"
+msgstr "Vidi mia stato"
+
+msgid "Send his/her status"
+msgstr "Sendi lia/Åia staton"
+
+msgid "Everything"
+msgstr "Äio"
+
+msgid "Item"
+msgstr "Elemento"
+
+msgid "Order"
+msgstr "Ordo"
+
+msgid "Active for this session"
+msgstr "Aktiva por tiu seanco"
+
+msgid "Always active"
+msgstr "Äiam aktiva"
+
+msgid "User directory"
+msgstr "Jarlibro de uzantoj"
+
+msgid "Search a friend"
+msgstr "SerÄi amikon"
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr "La petita funkcio ne estas efektivigita de la ricevinto aÅ servilo kaj sekve ne povas esti pretigita."
+
+msgid "This is a repeat from %s"
+msgstr "Tio estas ripeto de %s"
+
+msgid "Loading comments..."
+msgstr "ÄarÄante komentojnā¦"
+
+msgid "Type your comment here..."
+msgstr "Tajpu vian komenton Äi-tieā¦"
+
+msgid "Could not get the comments!"
+msgstr "Ne povis akiri komentojn!"
+
+msgid "Show comments"
+msgstr "Montri komentojn"
+
+msgid "Send him/her a message"
+msgstr "Sendi mesaÄon al li/Åi"
+
+msgid "Start a chat with him/her"
+msgstr "Komenci babilon kun li/Åi"
+
+msgid "Media integration"
+msgstr "AÅdvidaĵo integrado"
+
+msgid "Comments locked!"
+msgstr "Komentoj Ålositaj!"
+
+msgid "Type something you want to share with your friends..."
+msgstr "Tajpu ion vi deziras disvastigi al viaj amikoj..."
+
+msgid "changed his/her nickname to %s"
+msgstr "ÅanÄis lia/Åia kromnomo al %s"
+
+msgid "commented an item you follow: ā%sā."
+msgstr "komentis elementon kiun vi sekvas: ā%sā."
+
+msgid "Hide"
+msgstr "KaÅi"
+
+msgid "liked your post: ā%sā."
+msgstr "Åatas vian afiÄon: ā%sā."
+
+msgid "quoted you somewhere: ā%sā."
+msgstr "citigis vin ie: ā%sā."
+
+msgid "published on your wall: ā%sā."
+msgstr "publikigis sur via muro: ā%sā."
+
+msgid "tagged you in a photo (%s)."
+msgstr "markis vin sur bildon (%s)."
+
+msgid "tagged you in a video (%s)."
+msgstr "markis vin sur videon (%s)."
+
+msgid "Show"
+msgstr "Montri"
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr "Bezoni helpon? Vi povus legi nian dokumentaran paÄon pri kiel plenigi Äi-tiun formularon!"
+
+msgid "Pubsub host"
+msgstr "Pubsub-a gastigo"
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr "Jappix estas genia socia platformo, kiu vi povas aliri ie-ajn vi estas, iam-ajn vi deziras kaj komuniki kun kiu-ajn vi deziras."
+
+msgid "Manager link"
+msgstr "Administra ligilo"
+
+msgid "User uploads server"
+msgstr "Uzanta alÅutitaj servilo"
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr "Äi-tio estas la uzanta alÅutaj servilo por %1s, ā%2sā."
+
+msgid "Logo"
+msgstr "Emblemo"
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr "Vi povas agordi vian propran servan emblemon por anstataÅigi la aprioran unun. Zorgu la grandon kaj la Äefan koloron de Äiu emblemo!"
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr "AlÅutu Äiun emblemon kun la rekomenda maksimuma bildera grandeco."
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr "Ne estas valida bildo. Bonvolu uzi la formato PNG."
+
+msgid "Your service logo has been successfully changed!"
+msgstr "Via serva emblemo estas sukcese ÅanÄita!"
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr "Via emblema formato devus esti PNG. La emblemon ne estos ÅanÄita se vi lasu malplenan kampon."
+
+msgid "Remove this logo"
+msgstr "ForviÅi Äi-tiun emblemon"
+
+msgid "View this logo"
+msgstr "Vidi Äi-tiun emblemon"
+
+msgid "Send a file"
+msgstr "Sendi dosieron"
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr "Kiam alÅutita, via amiko estos invitata por elÅuti la senditan dosieron."
+
+msgid "Groupchats to join"
+msgstr "Alireblaj retbabilejoj"
+
+msgid "Purge sent files"
+msgstr "ViÅi senditajn dosierojn"
+
+msgid "would like to send you a file: ā%sā."
+msgstr "deziras sendi al vi dosieron: ā%sā."
+
+msgid "has accepted to received your file: ā%sā."
+msgstr "akceptis ricevi vian dosieron:ā%sā."
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr "malakceptis ricevi vian dosieron:ā%sā."
+
+msgid "could not receive your file: ā%sā."
+msgstr "ne povas ricevi vian dosieron: ā%sā."
+
+msgid "has received a file exchange request: ā%sā."
+msgstr "ricevis dosieran interÅanÄan peton:ā%sā."
+
+msgid "Available shortcuts:"
+msgstr "Haveblaj fulmoklavoj:"
+
+msgid "%s removes the chat logs"
+msgstr "%s forigas la babilemajn protokoldosierojn"
+
+msgid "%s joins a groupchat"
+msgstr "%s aliris retbabilejon"
+
+msgid "%s closes the chat"
+msgstr "%s fermas la babilejon"
+
+msgid "%s shows the user profile"
+msgstr "%s montras la uzantan profilon"
+
+msgid "%s sends a message to the room"
+msgstr "%s sendas mesaÄon al la babilejo"
+
+msgid "%s changes your nickname"
+msgstr "%s ÅanÄas vian kromnomon"
+
+msgid "%s sends a message to someone in the room"
+msgstr "%s sendas mesaÄon al iu en la babilejo"
+
+msgid "%s changes the room topic"
+msgstr "%s ÅanÄas la babilejan subjekton"
+
+msgid "%s kicks an user of the room"
+msgstr "%s forpelas uzanton el la babilejo"
+
+msgid "%s bans an user of the room"
+msgstr "%s ekskludas uzanton el la babilejo"
+
+msgid "%s invites someone to join the room"
+msgstr "%s invitas iun por aliri la babilejon"
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr ""
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# Spanish translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:27+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "Javascript no se encuentra activado en tu navegador, de modo que no podrƔs poner en marcha Jappix! Por favor, corrige esto."
+
+msgid "An open social network"
+msgstr "Una red social abierta"
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "Jappix ha sido interrumpido por un problema de red, un fallo o un acceso incorrecto (comprueba que has introducido las credenciales correctas). Lamentamos el inconveniente."
+
+msgid "The element list on this server could not be obtained!"
+msgstr "Ā”No se pudo conseguir la lista de elementos de este servidor!"
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "Tu contraseƱa ha sido cambiada, ahora puedes conectarte a tu cuenta con los nuevos datos de acceso."
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "Tu cuenta XMPP ha sido suprimida... Ā”AdiĆ³s!"
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "Ya saliste de tu cuenta de XMPP, Ā”que disfrutes el resto del dĆa!"
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "La sala a la que te has unido no existe. Ā”La deberĆas crear primero!"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "El grupo de charla ha sido eliminado, ahora culquiera puede volver a crearla."
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "El usuario no se encuentra en esta sala."
+
+msgid "Please enter the group chat address to join."
+msgstr "Escribe el nombre de la sala donde quieres entrar."
+
+msgid "Please enter your nickname to join %s."
+msgstr "ĀæQuĆ© apodo quieres tener en la sala %s?"
+
+msgid "This room (%s) is protected with a password."
+msgstr "La sala %s estĆ” protegida por una clave."
+
+msgid "Your browser is out of date!"
+msgstr "Ā”Necesita actualizar tu navegador!"
+
+msgid "Last %s version is better!"
+msgstr "Ā”La Ćŗltima versiĆ³n de %s es mejor!"
+
+msgid "Login"
+msgstr "Acceder"
+
+msgid "Register"
+msgstr "Registrarse"
+
+msgid "Here we go!"
+msgstr "Ā”AllĆ” vamos!"
+
+msgid "Server"
+msgstr "Servidor"
+
+msgid "Password"
+msgstr "ContraseƱa"
+
+msgid "Remember me"
+msgstr "Recordarme"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "No se puede usar esta herramienta porque no estĆ” activada."
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "Debido a un problema de red, se le ha desconectado. ĀæQuĆ© quieres hacer ahora?"
+
+msgid "Reconnect"
+msgstr "Volver a conectar"
+
+msgid "Messages"
+msgstr "Mensajes"
+
+msgid "Profile"
+msgstr "Perfil"
+
+msgid "Options"
+msgstr "Opciones"
+
+msgid "Disconnect"
+msgstr "Desconectar"
+
+msgid "Filter"
+msgstr "Filtro"
+
+msgid "Add a friend"
+msgstr "Agregar a un amigo"
+
+msgid "Your groupchats"
+msgstr "Tus salas de conversaciĆ³n"
+
+msgid "Manage your favorite groupchats"
+msgstr "Gestiona tus grupos de chat favoritos"
+
+msgid "More stuff"
+msgstr "MƔs cosas"
+
+msgid "Show all friends"
+msgstr "Mostrar a todos los amigos"
+
+msgid "Only show connected friends"
+msgstr "Mostrar sĆ³lo a los amigos conectados"
+
+msgid "Message archives"
+msgstr "Archivos de mensajes"
+
+msgid "Date"
+msgstr "Fecha"
+
+msgid "Please select a friend to view the chat history."
+msgstr "Selecciona el amigo con el cual quieres ver el historial de conversaciones"
+
+msgid "Nothing found for: %s"
+msgstr "Nada se encontrĆ³ para: %s"
+
+msgid "A short message?"
+msgstr "ĀæUn mensaje corto?"
+
+msgid "How are you?"
+msgstr "ĀæCĆ³mo estĆ”s?"
+
+msgid "What are you doing?"
+msgstr "ĀæQuĆ© estĆ”s haciendo?"
+
+msgid "Join a chat"
+msgstr "Unirse al chat"
+
+msgid "Status"
+msgstr "Estado"
+
+msgid "Available"
+msgstr "Disponible"
+
+msgid "Talkative"
+msgstr "Hablador"
+
+msgid "Away"
+msgstr "Ausente"
+
+msgid "Not available"
+msgstr "No disponible"
+
+msgid "Busy"
+msgstr "Ocupado"
+
+msgid "Mood"
+msgstr "Humor"
+
+msgid "None"
+msgstr "Ninguno"
+
+msgid "Crazy"
+msgstr "Loco"
+
+msgid "Excited"
+msgstr "Excitado"
+
+msgid "Playful"
+msgstr "JuguetĆ³n"
+
+msgid "Happy"
+msgstr "Feliz"
+
+msgid "Shocked"
+msgstr "Conmocionado"
+
+msgid "Hot"
+msgstr "Caliente"
+
+msgid "Sad"
+msgstr "Triste"
+
+msgid "Amorous"
+msgstr "Amoroso"
+
+msgid "Confident"
+msgstr "Seguro"
+
+msgid "Activity"
+msgstr "Actividad"
+
+msgid "Chores"
+msgstr "Tareas"
+
+msgid "Drinking"
+msgstr "Bebiendo"
+
+msgid "Eating"
+msgstr "Comiendo"
+
+msgid "Exercising"
+msgstr "Haciendo ejercicio"
+
+msgid "Grooming"
+msgstr "Aseando"
+
+msgid "Appointment"
+msgstr "Cita"
+
+msgid "Inactive"
+msgstr "Inactivos"
+
+msgid "Relaxing"
+msgstr "Relajando"
+
+msgid "Talking"
+msgstr "Hablando"
+
+msgid "Traveling"
+msgstr "Viajando"
+
+msgid "Working"
+msgstr "Trabajando"
+
+msgid "View profile"
+msgstr "Ver el perfil"
+
+msgid "Repeat this notice"
+msgstr "Repetir este aviso"
+
+msgid "Remove this notice"
+msgstr "Eliminar este aviso"
+
+msgid "Your profile"
+msgstr "Tu perfil"
+
+msgid "Identity"
+msgstr "Identidad"
+
+msgid "Profile image"
+msgstr "Imagen del perfil"
+
+msgid "Others"
+msgstr "Otros"
+
+msgid "Personal"
+msgstr "Personal"
+
+msgid "Complete name"
+msgstr "Nombre completo"
+
+msgid "Nickname"
+msgstr "Apodo"
+
+msgid "First name"
+msgstr "Nombre"
+
+msgid "Last name"
+msgstr "Apellido"
+
+msgid "Date of birth"
+msgstr "Fecha de nacimiento"
+
+msgid "Contact"
+msgstr "Contacto"
+
+msgid "E-mail"
+msgstr "E-mail"
+
+msgid "Phone"
+msgstr "TelƩfono"
+
+msgid "Website"
+msgstr "Sitio web"
+
+msgid "Current"
+msgstr "Actual"
+
+msgid "Delete"
+msgstr "Borrar"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "QuƩ pena, no tienes imagen en tu tarjeta de visita..."
+
+msgid "Address"
+msgstr "DirecciĆ³n"
+
+msgid "Street"
+msgstr "Calle"
+
+msgid "City"
+msgstr "Ciudad"
+
+msgid "Postal code"
+msgstr "CĆ³digo postal"
+
+msgid "Country"
+msgstr "PaĆs"
+
+msgid "Biography"
+msgstr "BiografĆa"
+
+msgid "Important notice"
+msgstr "Aviso importante"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr "Cuidado con la difusiĆ³n de la informaciĆ³n que le pongas a tu perfil: todo el mundo va a poder verla."
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr "No todo es privado en XMPP. Por ejemplo tu tarjeta de visita no lo es."
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr ""
+
+msgid "Save"
+msgstr "Guardar"
+
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgid "Edit options"
+msgstr "Editar opciones"
+
+msgid "Channel"
+msgstr "Canal"
+
+msgid "Commands"
+msgstr "Comandos"
+
+msgid "Sounds"
+msgstr "Sonidos"
+
+msgid "Privacy"
+msgstr "Privacidad"
+
+msgid "Message archiving"
+msgstr "Archivado de mensajes"
+
+msgid "Store a history of your chats"
+msgstr "Guardar un historial de tus chats"
+
+msgid "Geolocation"
+msgstr "GeolocalizaciĆ³n"
+
+msgid "Empty"
+msgstr "Vaciar"
+
+msgid "Empty channel"
+msgstr "Canal vacĆo"
+
+msgid "Persistent"
+msgstr "Persistente"
+
+msgid "Maximum notices"
+msgstr "MƔximo de avisos"
+
+msgid "Account"
+msgstr "Cuenta"
+
+msgid "Change password"
+msgstr "Cambiar la contraseƱa"
+
+msgid "Delete account"
+msgstr "Eliminar cuenta"
+
+msgid "Old"
+msgstr "Antigua"
+
+msgid "New (2 times)"
+msgstr "Nueva (2 veces)"
+
+msgid "Continue"
+msgstr "Continuar"
+
+msgid "To"
+msgstr "A"
+
+msgid "Close"
+msgstr "Cerrar"
+
+msgid "unknown"
+msgstr "desconocido"
+
+msgid "Unavailable"
+msgstr "No disponible"
+
+msgid "is now"
+msgstr "es ahora"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr ""
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "Ya estĆ”! Una nueva y bonita imagen en tu tarjeta de visita!"
+
+msgid "The image file is not supported or has a bad size."
+msgstr "No se maneja este tipo de imagen, o tal vez sea un problema de tamaƱo."
+
+msgid "Reply"
+msgstr "Responder"
+
+msgid "Error"
+msgstr "Error"
+
+msgid "Click here to solve the error"
+msgstr "Dale clic aquĆ para solucionar el problema"
+
+msgid "You"
+msgstr "TĆŗ"
+
+msgid "Remove"
+msgstr "Eliminar"
+
+msgid "Rename"
+msgstr "Renombrar"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "Hola, soy %s. Me gustarĆa tenerte como amigo en mi lista."
+
+msgid "Smiley insertion"
+msgstr "InserciĆ³n de emoticono"
+
+msgid "Change style"
+msgstr "Cambio de estilo"
+
+msgid "Text in bold"
+msgstr "Texto en negrita"
+
+msgid "Text in italic"
+msgstr "Texto en cursiva"
+
+msgid "Underlined text"
+msgstr "Texto subrayado"
+
+msgid "Save chat"
+msgstr "Chat guardado"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr "Haz click en el siguiente enlace para guardar la conversaciĆ³n, y espera un momento. Luego haz click de nuevo para descargar el archivo."
+
+msgid "This chat is empty!"
+msgstr "Ā”La sala estĆ” vacĆa!"
+
+msgid "Generate file!"
+msgstr "Ā”Generar archivo!"
+
+msgid "Download file!"
+msgstr "Ā”Bajar el archivo!"
+
+msgid "Clean current chat"
+msgstr "Limpieza del chat"
+
+msgid "View chat history"
+msgstr "Ver el historial del chat"
+
+msgid "Show user profile"
+msgstr "Visualizar el perfil del usuario"
+
+msgid "Add this contact to your friends"
+msgstr "AƱadir a este contacto como amigo"
+
+msgid "Add this groupchat to your favorites"
+msgstr "AƱadir este grupo de chat a tus favoritos"
+
+msgid "All tabs"
+msgstr "Todas las pestaƱas"
+
+msgid "Close this tab"
+msgstr "Cerrar esta pestaƱa"
+
+msgid "no subject defined for this room."
+msgstr "no se especificĆ³ un tema para esta sala."
+
+msgid "Administration panel for this room"
+msgstr "Panel de administraciĆ³n de la sala"
+
+msgid "Moderators"
+msgstr "Moderadores"
+
+msgid "Participants"
+msgstr "Participantes"
+
+msgid "Visitors"
+msgstr "Visitantes"
+
+msgid "Manage favorite rooms"
+msgstr "Organiza tus salas favoritas"
+
+msgid "Change favorites"
+msgstr "Cambiar tus favoritos"
+
+msgid "Search a room"
+msgstr "Buscar una sala"
+
+msgid "Select a favorite"
+msgstr "Seleccionar un favorito"
+
+msgid "Getting the name..."
+msgstr "Consiguiendo el nombre..."
+
+msgid "Gateway"
+msgstr "Pasarela"
+
+msgid "Name"
+msgstr "Nombre"
+
+msgid "Room"
+msgstr "Sala"
+
+msgid "Add"
+msgstr "AƱadir"
+
+msgid "Edit"
+msgstr "Editar"
+
+msgid "Search a room on"
+msgstr "Buscar una sala en"
+
+msgid "No room found on this server."
+msgstr "No se encontraron salas en este servidor."
+
+msgid "Service discovery"
+msgstr "Descubrir servicios"
+
+msgid "Server to query"
+msgstr "Servidor que consultar"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr "Esta entidad no mandĆ³ ningĆŗn resultado..."
+
+msgid "Accounts"
+msgstr "Cuentas"
+
+msgid "Authentications"
+msgstr "Autentificaciones"
+
+msgid "Automation"
+msgstr "AutomatizaciĆ³n"
+
+msgid "Clients"
+msgstr "Clientes"
+
+msgid "Collaboration"
+msgstr "ColaboraciĆ³n"
+
+msgid "Components"
+msgstr "Componentes"
+
+msgid "Rooms"
+msgstr "Salas"
+
+msgid "Directories"
+msgstr "Directorios"
+
+msgid "Gateways"
+msgstr "Pasarelas"
+
+msgid "News"
+msgstr "Noticias"
+
+msgid "Hierarchy"
+msgstr "JerarquĆa"
+
+msgid "Proxies"
+msgstr "Servidores proxy"
+
+msgid "Publication/Subscription"
+msgstr "PublicaciĆ³n/SuscripciĆ³n"
+
+msgid "Storage"
+msgstr "Almacenamiento"
+
+msgid "Service offline or broken"
+msgstr "Servidor fuera de lĆnea o roto"
+
+msgid "Your inbox"
+msgstr "Tu bandeja de entrada"
+
+msgid "Available actions"
+msgstr "Acciones disponibles"
+
+msgid "Clean"
+msgstr "Limpiar"
+
+msgid "New"
+msgstr "Nuevo"
+
+msgid "Received"
+msgstr "Recibido"
+
+msgid "Subject"
+msgstr "Asunto"
+
+msgid "Content"
+msgstr "Contenido"
+
+msgid "Send message"
+msgstr "Enviar mensaje"
+
+msgid "Your inbox is empty."
+msgstr "Tu bandeja de entrada estĆ” vacĆa"
+
+msgid "MUC administration"
+msgstr "AdministraciĆ³n de MUC"
+
+msgid "You administrate this room"
+msgstr "TĆŗ administras esta sala"
+
+msgid "Enter new subject"
+msgstr "Introduce el nuevo asunto"
+
+msgid "Configuration"
+msgstr "ConfiguraciĆ³n"
+
+msgid "Authorizations"
+msgstr "Autorizaciones"
+
+msgid "Member list"
+msgstr "Lista de miembros"
+
+msgid "Owner list"
+msgstr "Lista de propietarios"
+
+msgid "Administrator list"
+msgstr "Lista de administradores"
+
+msgid "Outcast list"
+msgstr "Lista de rechazados"
+
+msgid "Add an input"
+msgstr "AƱadir una entrada"
+
+msgid "Destroy this MUC"
+msgstr "Destruir este MUC"
+
+msgid "Yes, let's do it!"
+msgstr "SĆ, Ā”hagĆ”moslo!"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr "Tu amigo estĆ” prestando atenciĆ³n a la conversaciĆ³n."
+
+msgid "Your friend is writing a message..."
+msgstr "Tu amigo estĆ” escribiendo un mensaje..."
+
+msgid "Your friend stopped writing a message."
+msgstr "Tu amigo dejĆ³ de escribir un mensaje."
+
+msgid "Your friend is doing something else."
+msgstr "Tu amigo estĆ” haciendo otra cosa."
+
+msgid "Your friend closed the chat."
+msgstr "Tu amigo cerrĆ³ el chat."
+
+msgid "Requesting this service..."
+msgstr "Solicitando este servicio..."
+
+msgid "Loading"
+msgstr "Cargando"
+
+msgid "joined the chat room"
+msgstr "se uniĆ³ al chat"
+
+msgid "left the chat room"
+msgstr "ha dejado el chat"
+
+msgid "no status"
+msgstr "no tiene estado"
+
+msgid "has been kicked"
+msgstr "ha sido expulsado"
+
+msgid "has been banned"
+msgstr "ha sido prohibido"
+
+msgid "no reason"
+msgstr "ninguna razĆ³n"
+
+msgid "Communicate with the entire world!"
+msgstr "Ā”ComunĆcate con el mundo entero!"
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr "Te permite mantenerte en contacto con los millones de usuarios que en la actualidad usan la red XMPP como tĆŗ con Jappix. Ā”Ćnete a la comunidad y sigue libre!"
+
+msgid "Hi there!"
+msgstr "Ā”Hola!"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr "Bienvenida en %1s: ā%2sā."
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr "Entra a tu cuenta de XMPP existente, o crea una nueva!"
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr "Jappix es un proyecto de cĆ³digo abierto de PostPro, una organizaciĆ³n sin Ć”nimo de lucro que nos proporciona una gran ayuda."
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr "Entra a tu cuenta de XMPP existente. TambiƩn se puede usar el %s para entrar a una sala de charla."
+
+msgid "Previous"
+msgstr "AtrƔs"
+
+msgid "General"
+msgstr "General"
+
+msgid "Advanced"
+msgstr "Avanzado"
+
+msgid "Resource"
+msgstr "Recurso"
+
+msgid "Priority"
+msgstr "Prioridad"
+
+msgid "Low"
+msgstr "Bajo"
+
+msgid "Medium"
+msgstr "Medio"
+
+msgid "High"
+msgstr "Alto"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr "Introduce el grupo de chat al que deseas unirte y el nick que quieres tener. TambiƩn puedes volver a la %s."
+
+msgid "login page"
+msgstr "PƔgina de acceso"
+
+msgid "Share this link with your friends:"
+msgstr "Comparte este enlace con tus amigos"
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr "Crea una nueva cuenta XMPP para unirte a tus amigos en vuestra propia nube social. Ā”Es fĆ”cil!"
+
+msgid "Required"
+msgstr "Requerido"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr "Ya creaste tu cuenta, aquĆ viene tu direcciĆ³n de XMPP:"
+
+msgid "Manager"
+msgstr "Gerente"
+
+msgid "Project"
+msgstr "Proyecto"
+
+msgid "Encrypted"
+msgstr "Encriptado"
+
+msgid "Unencrypted"
+msgstr "No cifrado."
+
+msgid "Where are you?"
+msgstr "ĀæDĆ³nde estĆ”s?"
+
+msgid "What's up with you?"
+msgstr "ĀæQue pasa contigo?"
+
+msgid "Fetching the social channel..."
+msgstr "Consiguiendo el canal social..."
+
+msgid "You are synchronized with your network."
+msgstr "EstƔs sincronizadx con tu red."
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr "No puedes enviar nada: Ā”solo puedes recibir avisos!"
+
+msgid "Media viewer"
+msgstr "Visor de medios"
+
+msgid "Browse"
+msgstr "Examinar"
+
+msgid "Command"
+msgstr "Comando"
+
+msgid "Subscribe"
+msgstr "Suscribirse"
+
+msgid "Join"
+msgstr "Unirse"
+
+msgid "Automatic"
+msgstr "AutomƔtico"
+
+msgid "Search"
+msgstr "Buscar"
+
+msgid "No result!"
+msgstr "Ā”Sin resultados!"
+
+msgid "No notifications."
+msgstr "Ninguna notificaciĆ³n."
+
+msgid "would like to add you as a friend."
+msgstr "le gustarĆa aƱadirte como amigo/a."
+
+msgid "would like you to join this chatroom:"
+msgstr "le gustarĆa que te unieras a esta sala:"
+
+msgid "Do you accept?"
+msgstr "ĀæAceptas?"
+
+msgid "Yes"
+msgstr "Si"
+
+msgid "No"
+msgstr "No"
+
+msgid "would like to get authorization."
+msgstr "quisiera tener autorizaciĆ³n de ver tu estado."
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr "ĀæQuiere ver las amistades que %s te sugiere?"
+
+msgid "Submit"
+msgstr "Enviar"
+
+msgid "Client"
+msgstr "Cliente"
+
+msgid "System"
+msgstr "Sistema"
+
+msgid "Local time"
+msgstr "Hora local"
+
+msgid "Comments"
+msgstr "Comentarios"
+
+msgid "User profile"
+msgstr "Perfil de usuaria/o"
+
+msgid "See his/her position on the globe"
+msgstr "Ver su ubicaciĆ³n el el mapa mundial"
+
+msgid "Confirm"
+msgstr "Confirmar"
+
+msgid "anonymous mode"
+msgstr "modo anĆ³nimo"
+
+msgid "Groups"
+msgstr "Grupos"
+
+msgid "Unclassified"
+msgstr "Sin clasificar"
+
+msgid "Authorize"
+msgstr "Autorizar"
+
+msgid "Ask for authorization"
+msgstr "Pedir autorizaciĆ³n"
+
+msgid "Unblock"
+msgstr "Desbloquear"
+
+msgid "Prohibit"
+msgstr "Prohibir"
+
+msgid "Block"
+msgstr "Bloque"
+
+msgid "Chat"
+msgstr "Chat"
+
+msgid "Groupchat"
+msgstr "Chat en grupo"
+
+msgid "Jappix Mobile"
+msgstr "Jappix MĆ³vil"
+
+msgid "Desktop"
+msgstr "Escritorio"
+
+msgid "Mobile"
+msgstr "MĆ³vil"
+
+msgid "Please wait..."
+msgstr "Por favor, espera..."
+
+msgid "Please enable JavaScript"
+msgstr "Por favor, habilita JavaScript"
+
+msgid "Your channel"
+msgstr "Tu canal"
+
+msgid "Channel of"
+msgstr "Canal de"
+
+msgid "More notices..."
+msgstr "MƔs avisos..."
+
+msgid "Attach a file"
+msgstr "Adjuntar un archivo"
+
+msgid "Send"
+msgstr "Enviar"
+
+msgid "Unattach the file"
+msgstr "Ya no adjuntar el archivo"
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr "Hubo un error al tratar de enviar tu archivo: a lo mejor pesa demasiado (el mƔximo es %s), o estƔ prohibido!"
+
+msgid "Authorization failed"
+msgstr "FallĆ³ la autorizaciĆ³n"
+
+msgid "Registration failed, please choose a different username"
+msgstr "FallĆ³ el registro, por favor, elije otro nombre de usuario"
+
+msgid "Service unavailable"
+msgstr "Servicio no disponible"
+
+msgid "Internal server error, try later"
+msgstr "Error interno del servidor, intentar mƔs tarde"
+
+msgid "Your form has been sent."
+msgstr "Ya se enviĆ³ tu formulario."
+
+msgid "Application"
+msgstr "AplicaciĆ³n"
+
+msgid "XMPP links"
+msgstr "Enlaces XMPP"
+
+msgid "Open XMPP links with Jappix"
+msgstr "Abrir enlaces XMPP con Jappix"
+
+msgid "changed the subject to:"
+msgstr "asunto cambiado a:"
+
+msgid "Welcome!"
+msgstr "Ā”Bienvenido!"
+
+msgid "Friends"
+msgstr "Amigos"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr "Ā”Bienvenido a Jappix, tu propia nube social!"
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr "Antes de que lo empiezes a usar, tendrƔs que cambiar unos parametros, buscar a amigxs, y completar tu perfil."
+
+msgid "Enable notification sounds"
+msgstr "Habilitar notificaciĆ³n por sonidos"
+
+msgid "Share your position on the globe"
+msgstr "Comparte tu ubicaciĆ³n geogrĆ”fica"
+
+msgid "Offline friends"
+msgstr "Amigos fuera de lĆnea"
+
+msgid "Don't hide offline friends"
+msgstr "Que aparezcan mis amigos no conectados"
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr "Usa esta herramienta para encontrar a tus amigos en el servidor que estƔs usando ahora mismo, o aƱƔdelos mƔs tarde."
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr "Muy bien! Ahora puedes compartir Jappix con tus amigxs!"
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr "Cuando uses el botĆ³n āGuardarā, el editor de perfil se abrirĆ”. Ā”Te deseamos buena socializaciĆ³n!"
+
+msgid "Share Jappix on %s"
+msgstr "Comparte Jappix en %s"
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr "Soy %s, y estoy usando Jappix, una plataforma social abierta."
+
+msgid "Unknown name"
+msgstr "Nombre desconocido"
+
+msgid "Unknown country"
+msgstr "PaĆs desconocido"
+
+msgid "Click to enable"
+msgstr "Haz click para habilitar"
+
+msgid "Click to disable"
+msgstr "Haz click para deshabilitar"
+
+msgid "Installation"
+msgstr "InstalaciĆ³n"
+
+msgid "Jappix installation"
+msgstr "InstalaciĆ³n de Jappix"
+
+msgid "Welcome to the Jappix installation!"
+msgstr "Ā”Bienvenido a la instalaciĆ³n de Jappix!"
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr "Esta herramienta te ayudarƔ a instalar Jappix mƔs rƔpidamente, la primera plataforma social con todas las funciones y basada en XMPP, en tu servidor. Ni siquiera necesitas conocimientos tƩcnicos."
+
+msgid "Let's have a look at the installation steps:"
+msgstr "Vamos a ver los pasos de instalaciĆ³n:"
+
+msgid "Welcome"
+msgstr "Bienvenido"
+
+msgid "Storage configuration"
+msgstr "ConfiguraciĆ³n de almacenamiento"
+
+msgid "Administrator account"
+msgstr "Cuenta de administrador"
+
+msgid "Main configuration"
+msgstr "ConfiguraciĆ³n principal"
+
+msgid "Hosts configuration"
+msgstr "ConfiguraciĆ³n de los huĆ©spedes"
+
+msgid "Services installation"
+msgstr "InstalaciĆ³n de servicios"
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr "Si el idioma actual no coincide con el tuyo (%1s), puedes hacer que Jappix hable en %2s. Esta opciĆ³n se guardarĆ”."
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr "Si deseas obtener ayuda sobre la instalaciĆ³n y configuraciĆ³n de Jappix, puedes utilizar toda nuestra documentaciĆ³n, disponible en:"
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr "Es hora de construir nuestra propia nube social: Ā”solo tienes que ir al siguiente paso! "
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr "Jappix almacena informaciĆ³n permanente (archivos compartidos, historial de conversaciones, su mĆŗsica, y la configuraciĆ³n) dentro de una carpeta segura."
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr "Jappix debe ser capaz de escribir en esta carpeta para crear sus sub-directorios. Si no es asĆ, debes establecer los derechos a 1s% o cambiar el propietario de la carpeta a 2s% (dependiendo de tu configuraciĆ³n)."
+
+msgid "The folder is writable, you can continue!"
+msgstr "La carpeta es escribible, Ā”puedes continuar!"
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix te ofrece la posibilidad de gestionar tu configuraciĆ³n, instalar nuevos plugins y buscar actualizaciones. Por eso tienes que crear una cuenta de administraciĆ³n para acceder al gerente."
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr "Cuando Jappix estƩ instalado, basta con hacer clic en el enlace de gerente en la pƔgina principal para acceder."
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr "Uy, Ā”se olvidĆ³ algo o las dos contraseƱas no coinciden!"
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr "Jappix necesita que especifiques algunos valores para trabajar. Por favor, corrije las siguientes entradas (o mantĆ©n los valores por defecto, que bastan para la mayorĆa de la gente)."
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr "Ten en cuenta que si no especificas un valor que es obligatorio, se completarĆ” automĆ”ticamente con la opciĆ³n por defecto."
+
+msgid "User"
+msgstr "Usuario"
+
+msgid "Service"
+msgstr "Servicio"
+
+msgid "Service name"
+msgstr "Nombre del servicio"
+
+msgid "Service description"
+msgstr "DescripciĆ³n del servicio"
+
+msgid "Connection"
+msgstr "ConexiĆ³n"
+
+msgid "Lock the host"
+msgstr "Bloquear el anfitriĆ³n "
+
+msgid "Anonymous mode"
+msgstr "Modo anĆ³nimo"
+
+msgid "Registration allowed"
+msgstr "Permitir la creaciĆ³n de cuentas"
+
+msgid "Use a proxy"
+msgstr "Usar un proxy"
+
+msgid "Encryption"
+msgstr "Cifrado"
+
+msgid "HTTPS storage"
+msgstr "Almacenamiento con HTTPS"
+
+msgid "Force HTTPS"
+msgstr "Forzar el uso de HTTPS"
+
+msgid "Compression"
+msgstr "CompresiĆ³n"
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr "Esta pƔgina te ayuda a especificar los hosts por defecto a los que Jappix se conectarƔ. Puedes dejarlo como estƔ y continuar si quieres usar los hosts oficiales del servicio."
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr "QuizƔ no sepas lo que es un servidor BOSH. De hecho, hay un enlace entre un cliente Jappix y un servidor XMPP, que es necesario debido a limitaciones tƩcnicas."
+
+msgid "Main host"
+msgstr "Host principal"
+
+msgid "Groupchat host"
+msgstr "Host de chat en grupo"
+
+msgid "Anonymous host"
+msgstr "Host anĆ³nimo"
+
+msgid "Directory host"
+msgstr "Host directorio"
+
+msgid "BOSH host"
+msgstr "Host BOSH"
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr "Puedes instalar algunos programas adicionales en tu servidor, para ampliar las funciones de Jappix. Otros podrĆan ser modificados, debido a las restricciones de seguridad que se establecen de forma predeterminada."
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr "Para realizar esto, debes poder acceder al shell de tu servidor e iniciar una sesiĆ³n como root. Recuerda que esto es facultativo, Jappix funcionarĆ” sin estos mĆ³dulos, pero algunas de sus caracterĆsticas no estarĆ”n disponibles."
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr "DespuĆ©s de terminar la instalaciĆ³n, Jappix generarĆ” los archivos de cache. Puede ser lento, sĆ³lo tienes que esperar hasta que se muestre la aplicaciĆ³n, sin presionar ningĆŗn botĆ³n."
+
+msgid "Thanks for using Jappix!"
+msgstr "Ā”Gracias por usar Jappix!"
+
+msgid "Next"
+msgstr "Siguiente"
+
+msgid "Finish"
+msgstr "Terminar"
+
+msgid "Check again"
+msgstr "Comprobar otra vez"
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr "La carpeta no tiene permisos de escritura, configura correctamente los permisos al directorio %s."
+
+msgid "%s is installed on your system."
+msgstr "%s estĆ” instalado en tu sistema."
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr "%1s no estĆ” instalado en tu sistema, debes instalar %2s."
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr "El peso mĆ”ximo de envĆo que acepta PHP es suficiente (%s)."
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr "El peso mĆ”ximo de envĆo que acepta PHP no es suficiente (%1s). Le deberĆas indicar un valor de %2s en el archivo %3s."
+
+msgid "Jappix manager"
+msgstr "Gerente de Jappix"
+
+msgid "Manager access"
+msgstr "Administrador de acceso"
+
+msgid "Statistics"
+msgstr "EstadĆsticas"
+
+msgid "Hosts"
+msgstr "Anfitriones"
+
+msgid "Design"
+msgstr "DiseƱo"
+
+msgid "Repeat"
+msgstr "Repita"
+
+msgid "All"
+msgstr "Todo"
+
+msgid "Horizontal"
+msgstr "Horizontal"
+
+msgid "Vertical"
+msgstr "Vertical"
+
+msgid "Center"
+msgstr "Centro"
+
+msgid "Left"
+msgstr "Izquierda"
+
+msgid "Right"
+msgstr "Derecha"
+
+msgid "Top"
+msgstr "Arriba"
+
+msgid "Bottom"
+msgstr "Abajo"
+
+msgid "Adapt"
+msgstr "Adaptar"
+
+msgid "Color"
+msgstr "Color"
+
+msgid "Users"
+msgstr "Usuarios"
+
+msgid "Updates"
+msgstr "Actualizaciones"
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr "Ćsta es un Ć”rea restringida: sĆ³lo los usuarios autorizados pueden gestionar este nodo Jappix."
+
+msgid "Please use the form below to login to the administration panel."
+msgstr "Por favor, utiliza el formulario de abajo para acceder al panel de administraciĆ³n."
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr "Para mejorar la seguridad, las sesiones son limitadas en tiempo y cuando se cierre el navegador, la sesiĆ³n se cerrarĆ”."
+
+msgid "Credentials"
+msgstr "Credenciales"
+
+msgid "You have been logged out. Goodbye!"
+msgstr "Se ha cerrado la sesiĆ³n. Ā”AdiĆ³s!"
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr "Uy, no ha sido posible reconocerte como administrador vƔlido. Comprueba tus credenciales!"
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr "Las estadĆsticas bĆ”sicas son procesadas por Jappix sobre algunas cosas importantes, Las puedes encontrar mĆ”s abajo."
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr "Modifica la configuraciĆ³n de tu nodo Jappix con esta herramienta"
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr "Con esta herramienta, modifica los anfitriones manejados por Jappix"
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr "Todos los archivos de almacenamiento dentro de Jappix se pueden organizar con esta herramienta: selecciona una carpeta para ir editando su contenido!"
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr "Jappix es totalmente configurable: aquĆ se puede cambiar su diseƱo."
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr "Ćsta no es una imagen vĆ”lida, por favor usa PNG, GIF o JPG!"
+
+msgid "The image could not be received, would you mind retry?"
+msgstr "La imagen no se pudo recibir. ĀæSerĆa posible intentarlo nuevamente?"
+
+msgid "Your image was added to the list!"
+msgstr "Ā”Tu imagen se agregĆ³ a la lista!"
+
+msgid "Changes saved!"
+msgstr "Los cambios han sido guardados!"
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr "Se puede definir mƔs de un administrador de Jappix. TambiƩn se puede cambiar contraseƱas."
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr "Actualiza tu nodo de Jappix aquĆ, o revisa si existe alguna nueva versiĆ³n. TambiĆ©n aparece informaciĆ³n sobre la versiĆ³n mĆ”s reciente (en inglĆ©s)."
+
+msgid "Access statistics"
+msgstr "Acceder a las estadĆsticas"
+
+msgid "Share statistics"
+msgstr "Compartir estadĆsticas"
+
+msgid "Other statistics"
+msgstr "Otras estadĆsticas"
+
+msgid "January"
+msgstr "Enero"
+
+msgid "February"
+msgstr "Febrero"
+
+msgid "March"
+msgstr "Marzo"
+
+msgid "April"
+msgstr "Abril"
+
+msgid "May"
+msgstr "Mayo"
+
+msgid "June"
+msgstr "Junio"
+
+msgid "July"
+msgstr "Julio"
+
+msgid "August"
+msgstr "Agosto"
+
+msgid "September"
+msgstr "Septiembre"
+
+msgid "October"
+msgstr "Octubre"
+
+msgid "November"
+msgstr "Noviembre"
+
+msgid "December"
+msgstr "Diciembre"
+
+msgid "Monday"
+msgstr "Lunes"
+
+msgid "Tuesday"
+msgstr "Martes"
+
+msgid "Wednesday"
+msgstr "MiƩrcoles"
+
+msgid "Thursday"
+msgstr "Jueves"
+
+msgid "Friday"
+msgstr "Viernes"
+
+msgid "Saturday"
+msgstr "SƔbado"
+
+msgid "Sunday"
+msgstr "Domingo"
+
+msgid "Total"
+msgstr "Total"
+
+msgid "Cache"
+msgstr "Cache"
+
+msgid "Logs"
+msgstr "Registros"
+
+msgid "Music"
+msgstr "MĆŗsica"
+
+msgid "Backgrounds"
+msgstr "Fondos de pantalla"
+
+msgid "Share"
+msgstr "Compartir"
+
+msgid "Background"
+msgstr "Fondo de pantalla"
+
+msgid "Notice"
+msgstr "Aviso"
+
+msgid "Your design preferences have been saved!"
+msgstr "Ā”Ya se guardaron tus preferencias de diseƱo!"
+
+msgid "Please check your inputs: something is missing!"
+msgstr "Por favor comprueba los datos introducidos: Ā”falta algo!"
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr "AquĆ puedes cambiar el fondo de pantalla de Jappix. Puede ser el color que quieras, o una imagen. Ā”Deja que tu creatividad fluya!"
+
+msgid "Use default background"
+msgstr "Usar el fondo de pantalla por defecto"
+
+msgid "Use your own image"
+msgstr "Usa tu propia imagen"
+
+msgid "Select a background to use and change the display options."
+msgstr "Seleccione un fondo para usar y modificar las opciones de visualizaciĆ³n."
+
+msgid "Use your own color"
+msgstr "Usa tu propio color"
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr "Escribe el valor en hexadecimal del color que deseas tener como fondo."
+
+msgid "Manage backgrounds"
+msgstr "Organizar los fondos de pantalla"
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr "AquĆ puedes agregarle imĆ”genes de fondo a la lista. Gracias por enviar una imagen vĆ”lida."
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr "Si deseas quitar algunos fondos, utiliza el navegador a continuaciĆ³n."
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr "Define un aviso de inicio que vean todxs lxs usuarixs. Puede ser una alerta, un mensaje importante, o una publicidad."
+
+msgid "Simple notice"
+msgstr "Aviso simple "
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr "Este aviso sĆ³lo necesita un texto simple para ser visualizado, pero no se permite cĆ³digo!"
+
+msgid "Advanced notice"
+msgstr "Aviso avanzado"
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr "Puedes personalizar tu aviso con cĆ³digo HTML, CSS y Javascript, pero necesitarĆ”s programar el estilo."
+
+msgid "Available updates"
+msgstr "Actualizaciones disponibles"
+
+msgid "What's new?"
+msgstr "ĀæQuĆ© hay de nuevo?"
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr "No se puede escribir en tu carpeta de almacenamiento. Gracias por otorgarle al servidor los permisos adecuados."
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr "%1s le puede causar problemas al proxy. Por favor, sube el valor de %2s a %3s."
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr "Estas utilizando una versiĆ³n de desarrollo de Jappix. Actualizala con nuestro repositorio ejecutando: %s"
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr "Una nueva versiĆ³n de Jappix estĆ” disponible! Comprueba las novedades y ejecuta la actualizaciĆ³n!"
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr "Esta versiĆ³n ya no es la mĆ”s reciente. ActualĆzala ahora a %s haciendo clic aquĆ!"
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr "Esta versiĆ³n parece ser la mĆ”s reciente, pero todavĆa puedes buscar actualizaciones manualmente con este enlace."
+
+msgid "Check for updates"
+msgstr "Buscar actualizaciones"
+
+msgid "Update in progress"
+msgstr "ActualizaciĆ³n en curso"
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr "Jappix ha sido actualizado: ahora estĆ”s ejecutando la Ćŗltima versiĆ³n. Que te diviertas!"
+
+msgid "The update has failed! Please try again later."
+msgstr "La actualizaciĆ³n ha fallado! Por favor, intĆ©ntalo nuevamente mĆ”s tarde."
+
+msgid "Downloading package..."
+msgstr "Descargando el paquete..."
+
+msgid "Removing current Jappix system files..."
+msgstr "EliminaciĆ³n de archivos del sistema actual de Jappix ..."
+
+msgid "Extracting package..."
+msgstr "Extrayendo el paquete..."
+
+msgid "Regenerating storage folder tree..."
+msgstr "Generando otra vez la jerarquĆa de almacenamiento..."
+
+msgid "Jappix is now up to date!"
+msgstr "Jappix estĆ” actualizado!"
+
+msgid "Aborted: socket error!"
+msgstr "Abortada: error de socket!"
+
+msgid "Aborted: buffer error!"
+msgstr "Abortada: Error de buffer!"
+
+msgid "Aborted: everything is not writable!"
+msgstr "Abortada: faltan algunos permisos de escritura!"
+
+msgid "Aborted: could not extract the package!"
+msgstr "Abortado: no se pudo extraer el paquete!"
+
+msgid "Visits"
+msgstr "Visitas"
+
+msgid "Daily"
+msgstr "Diario"
+
+msgid "Weekly"
+msgstr "Semanal"
+
+msgid "Monthly"
+msgstr "Mensual"
+
+msgid "Yearly"
+msgstr "Anual"
+
+msgid "Size"
+msgstr "TamaƱo"
+
+msgid "Clean everything"
+msgstr "Limpiar todo"
+
+msgid "Purge cache"
+msgstr "Purgar cachƩ"
+
+msgid "Purge logs"
+msgstr "Purgar registros"
+
+msgid "Purge updates"
+msgstr "Purgar actualizaciones"
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr "La carpeta de almacenamiento que querĆas limpiar estĆ” vacĆa ahora!"
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr "MantƩn tu nodo de Jappix fresco y dinƔmico, limpiando las carpetas de almacenamiento regularmente!"
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr "Carga tu mĆŗsica (Ogg Vorbis, MP3 o WAV) para poder escucharla en Jappix!"
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr "El archivo que quieres subir tiene que pesar menos de %s."
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr "AquĆ puedes quedarte al tanto de lo que tus usuarios guarden en el servidor, y quitarle cualquier contenido no deseable."
+
+msgid "Title"
+msgstr "TĆtulo"
+
+msgid "Artist"
+msgstr "Artista"
+
+msgid "Album"
+msgstr "Album"
+
+msgid "File"
+msgstr "Archivo"
+
+msgid "Upload"
+msgstr "Cargar"
+
+msgid "The folder is empty."
+msgstr "La carpeta estĆ” vacĆa."
+
+msgid "The music could not be received, please retry!"
+msgstr "La mĆŗsica no se pudo recibir, por favor intenta otra vez!"
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr "Ćste no es un archivo de mĆŗsica vĆ”lida. Por favor, Ā”codifĆcalo en formato Ogg Vorbis, MP3 o WAV!"
+
+msgid "Your music has been added!"
+msgstr "Ā”Ya se agregĆ³ tu mĆŗsica!"
+
+msgid "The selected elements have been removed."
+msgstr "Los elementos seleccionados han sido suprimidos."
+
+msgid "You must select elements to remove!"
+msgstr "Debes seleccionar elementos que quitar!"
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr "AquĆ puedes agregar un nuevo usuario, o cambiar contraseƱas (introduce un nombre de usuario existente). Por favor, Ā”usa una contraseƱa fuerte!"
+
+msgid "Manage"
+msgstr "Administrar"
+
+msgid "List"
+msgstr "Lista"
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr "AquĆ se pueden quitar usuarios. El Ćŗltimo que quede no se puede quitar."
+
+msgid "The user has been added!"
+msgstr "El usuario ha sido agregado!"
+
+msgid "The chosen users have been removed."
+msgstr "Los usuarios seleccionados han sido suprimidos"
+
+msgid "You must select one or more users to be removed!"
+msgstr "Debes seleccionar por lo menos un usuario que quitar!"
+
+msgid "Yesterday"
+msgstr "Ayer"
+
+msgid "%s days ago"
+msgstr "hace %s dĆas"
+
+msgid "User currently active"
+msgstr "Usuario activo actualmente"
+
+msgid "Last seen: %s"
+msgstr "Se viĆ³ por Ćŗltima vez: %s"
+
+msgid "Inactive since: %s"
+msgstr "Inactivo desde: %s"
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr "Parece que tu amigo no recibiĆ³ el mensaje!"
+
+msgid "Static content server"
+msgstr "Servidor de contenido estƔtico"
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr "Ćste es el servidor de contenido estĆ”tico para %1s: ā%2sā."
+
+msgid "Suggested friends"
+msgstr "Amistades recomendadas"
+
+msgid "Check all"
+msgstr "Activar todo"
+
+msgid "Uncheck all"
+msgstr "Deactivar todo"
+
+msgid "Choose"
+msgstr "Escoga"
+
+msgid "List name"
+msgstr ""
+
+msgid "Allow"
+msgstr "Permitir"
+
+msgid "Deny"
+msgstr "prohibir"
+
+msgid "Group"
+msgstr "Grupo"
+
+msgid "Subscription"
+msgstr "suscripciĆ³n"
+
+msgid "Both"
+msgstr "Ambos"
+
+msgid "From"
+msgstr "De"
+
+msgid "Everybody"
+msgstr "Todo el mundo"
+
+msgid "Send messages"
+msgstr "Enviar mensajes"
+
+msgid "Send queries"
+msgstr "Enviar peticiones"
+
+msgid "See my status"
+msgstr "Ver mi estado"
+
+msgid "Send his/her status"
+msgstr "Enviar su estado"
+
+msgid "Everything"
+msgstr "Todo"
+
+msgid "Item"
+msgstr "ArtĆculo"
+
+msgid "Order"
+msgstr "Orden"
+
+msgid "Active for this session"
+msgstr "Activo en esta sesiĆ³n"
+
+msgid "Always active"
+msgstr "Siempre activo"
+
+msgid "User directory"
+msgstr "Directorio del usuario"
+
+msgid "Search a friend"
+msgstr "Buscar a un amigo"
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr ""
+
+msgid "This is a repeat from %s"
+msgstr ""
+
+msgid "Loading comments..."
+msgstr ""
+
+msgid "Type your comment here..."
+msgstr ""
+
+msgid "Could not get the comments!"
+msgstr ""
+
+msgid "Show comments"
+msgstr ""
+
+msgid "Send him/her a message"
+msgstr ""
+
+msgid "Start a chat with him/her"
+msgstr ""
+
+msgid "Media integration"
+msgstr ""
+
+msgid "Comments locked!"
+msgstr ""
+
+msgid "Type something you want to share with your friends..."
+msgstr ""
+
+msgid "changed his/her nickname to %s"
+msgstr ""
+
+msgid "commented an item you follow: ā%sā."
+msgstr ""
+
+msgid "Hide"
+msgstr ""
+
+msgid "liked your post: ā%sā."
+msgstr ""
+
+msgid "quoted you somewhere: ā%sā."
+msgstr ""
+
+msgid "published on your wall: ā%sā."
+msgstr ""
+
+msgid "tagged you in a photo (%s)."
+msgstr ""
+
+msgid "tagged you in a video (%s)."
+msgstr ""
+
+msgid "Show"
+msgstr ""
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr ""
+
+msgid "Pubsub host"
+msgstr ""
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr ""
+
+msgid "Manager link"
+msgstr ""
+
+msgid "User uploads server"
+msgstr ""
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Logo"
+msgstr ""
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr ""
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr ""
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr ""
+
+msgid "Your service logo has been successfully changed!"
+msgstr ""
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr ""
+
+msgid "Remove this logo"
+msgstr ""
+
+msgid "View this logo"
+msgstr ""
+
+msgid "Send a file"
+msgstr ""
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr ""
+
+msgid "Groupchats to join"
+msgstr ""
+
+msgid "Purge sent files"
+msgstr ""
+
+msgid "would like to send you a file: ā%sā."
+msgstr ""
+
+msgid "has accepted to received your file: ā%sā."
+msgstr ""
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr ""
+
+msgid "could not receive your file: ā%sā."
+msgstr ""
+
+msgid "has received a file exchange request: ā%sā."
+msgstr ""
+
+msgid "Available shortcuts:"
+msgstr ""
+
+msgid "%s removes the chat logs"
+msgstr ""
+
+msgid "%s joins a groupchat"
+msgstr ""
+
+msgid "%s closes the chat"
+msgstr ""
+
+msgid "%s shows the user profile"
+msgstr ""
+
+msgid "%s sends a message to the room"
+msgstr ""
+
+msgid "%s changes your nickname"
+msgstr ""
+
+msgid "%s sends a message to someone in the room"
+msgstr ""
+
+msgid "%s changes the room topic"
+msgstr ""
+
+msgid "%s kicks an user of the room"
+msgstr ""
+
+msgid "%s bans an user of the room"
+msgstr ""
+
+msgid "%s invites someone to join the room"
+msgstr ""
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr "Jappix es una plataforma social sin Ɣnimo de lucro que se puede acceder en cualquier lugar, cualquier momento y comunicarse con quien desees."
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# Estonian translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:25+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "Teie brauseris puudub JavaScript, mis tƤhendab seda et teil ei ole vƵimalik Jappixit kƤivitada! Palun parandage see."
+
+msgid "An open social network"
+msgstr "Avatud sotsiaalvƵrgustik"
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "Jappixi tƶƶ on katkestatud vƵrgu tƵrke, halva sisselogimise vƵi mƵne muu vea tƵttu (kontrollige, et sisestasite Ƶiged andmed), vabandame ebameeldivuste pƤrast."
+
+msgid "The element list on this server could not be obtained!"
+msgstr "Selle serveri elemendi nimekirja polnud vƵimalik omandada."
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "Teie parool on muudetud, Te saate taas sisse logida kasutades uusi andmeid."
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "Teie XMPP konto on eemaldatud, hĆ¼vasti!"
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "Te olete oma XMPP kontost vƤlja logitud, head pƤeva!"
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "Ruum millega Te liituda proovisite ei eksisteeri. Proovige see ise teha!"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "Grupivestlus on eemaldatud, nĆ¼Ć¼d saab keegi teine selle uuesti luua."
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "Kasutaja, kellega te pĆ¼Ć¼ate Ć¼hendust saada, ei eksisteeri enam selles ruumis."
+
+msgid "Please enter the group chat address to join."
+msgstr "Palun sisestage grupivestluse aadress millega liituda."
+
+msgid "Please enter your nickname to join %s."
+msgstr "Palun sisestage oma hĆ¼Ć¼dnimi, et liituda %s."
+
+msgid "This room (%s) is protected with a password."
+msgstr "Ruum (%s) on parooliga kaitstud."
+
+msgid "Your browser is out of date!"
+msgstr "Teil on liiga vana brauser!"
+
+msgid "Last %s version is better!"
+msgstr "Viimane versioon %s on parem!"
+
+msgid "Login"
+msgstr "Sisse logimine"
+
+msgid "Register"
+msgstr "Registreerimine"
+
+msgid "Here we go!"
+msgstr "LƤks!"
+
+msgid "Server"
+msgstr "Server"
+
+msgid "Password"
+msgstr "Parool"
+
+msgid "Remember me"
+msgstr "JƤta mind meelde"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "See tƶƶriist on keelatud, Te ei saa seda kasutada!"
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "VƵrgu tƵrke tƵttu katkes Ć¼hendus serveriga. Mida te jƤrgmiseks teha soovite?"
+
+msgid "Reconnect"
+msgstr "TaasĆ¼hendus"
+
+msgid "Messages"
+msgstr "SƵnumid"
+
+msgid "Profile"
+msgstr "Profiil"
+
+msgid "Options"
+msgstr "Valikud"
+
+msgid "Disconnect"
+msgstr "Katkesta Ć¼hendus"
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Add a friend"
+msgstr "Lisa kontakt"
+
+msgid "Your groupchats"
+msgstr "Minu grupivestlused"
+
+msgid "Manage your favorite groupchats"
+msgstr "Halda oma lemmikuid grupivestluseid"
+
+msgid "More stuff"
+msgstr "Rohkem asju"
+
+msgid "Show all friends"
+msgstr "NƤita kƵiki sƵpru"
+
+msgid "Only show connected friends"
+msgstr "NƤita ainult sisselogitud sƵpru"
+
+msgid "Message archives"
+msgstr "SƵnumite arhiiv"
+
+msgid "Date"
+msgstr "KuupƤev"
+
+msgid "Please select a friend to view the chat history."
+msgstr "Palun valige kontakt, et nƤha vestluse ajalugu."
+
+msgid "Nothing found for: %s"
+msgstr "Midagi ei leitud: %s"
+
+msgid "A short message?"
+msgstr "LĆ¼hisƵnum?"
+
+msgid "How are you?"
+msgstr "Kuidas lƤheb?"
+
+msgid "What are you doing?"
+msgstr "Mida sa teed?"
+
+msgid "Join a chat"
+msgstr "Liitu vestlusega"
+
+msgid "Status"
+msgstr "Staatus"
+
+msgid "Available"
+msgstr "Saadaval"
+
+msgid "Talkative"
+msgstr "Jutukas"
+
+msgid "Away"
+msgstr "Eemal"
+
+msgid "Not available"
+msgstr "Mitte saadaval"
+
+msgid "Busy"
+msgstr "HƵivatud"
+
+msgid "Mood"
+msgstr "Meeleolu"
+
+msgid "None"
+msgstr "Midagi"
+
+msgid "Crazy"
+msgstr "Pƶƶrane"
+
+msgid "Excited"
+msgstr "Elevil"
+
+msgid "Playful"
+msgstr "Vallatu"
+
+msgid "Happy"
+msgstr "Ćnnelik"
+
+msgid "Shocked"
+msgstr "Å okeeritud"
+
+msgid "Hot"
+msgstr "Kuum"
+
+msgid "Sad"
+msgstr "Kurb"
+
+msgid "Amorous"
+msgstr "Armunud"
+
+msgid "Confident"
+msgstr "Enesekindel"
+
+msgid "Activity"
+msgstr "Tegevus"
+
+msgid "Chores"
+msgstr "Tƶƶd"
+
+msgid "Drinking"
+msgstr "Joomine"
+
+msgid "Eating"
+msgstr "Sƶƶmine"
+
+msgid "Exercising"
+msgstr "Sportimine"
+
+msgid "Grooming"
+msgstr "Hooldamine"
+
+msgid "Appointment"
+msgstr "Kohtumine"
+
+msgid "Inactive"
+msgstr "Tegevusetu"
+
+msgid "Relaxing"
+msgstr "LƵƵgastumine"
+
+msgid "Talking"
+msgstr "RƤƤkimine"
+
+msgid "Traveling"
+msgstr "Reisimine"
+
+msgid "Working"
+msgstr "Tƶƶtamine"
+
+msgid "View profile"
+msgstr "Vaata profiili"
+
+msgid "Repeat this notice"
+msgstr "Korda seda teadet"
+
+msgid "Remove this notice"
+msgstr "Eemalda see teade"
+
+msgid "Your profile"
+msgstr "Sinu profiil"
+
+msgid "Identity"
+msgstr "Identiteet"
+
+msgid "Profile image"
+msgstr "Profiili pilt"
+
+msgid "Others"
+msgstr "Muu"
+
+msgid "Personal"
+msgstr "Personaalne"
+
+msgid "Complete name"
+msgstr "TƤisnimi"
+
+msgid "Nickname"
+msgstr "HĆ¼Ć¼dnimi"
+
+msgid "First name"
+msgstr "Eesnimi"
+
+msgid "Last name"
+msgstr "Perekonnanimi"
+
+msgid "Date of birth"
+msgstr "SĆ¼nniaeg"
+
+msgid "Contact"
+msgstr "Kontakt"
+
+msgid "E-mail"
+msgstr "E-mail"
+
+msgid "Phone"
+msgstr "Telefon"
+
+msgid "Website"
+msgstr "Koduleht"
+
+msgid "Current"
+msgstr "Praegune"
+
+msgid "Delete"
+msgstr "Kustuta"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "Kui kahju! Teil ei ole oma identiteedi kaardil profiili pilti!"
+
+msgid "Address"
+msgstr "Aadress"
+
+msgid "Street"
+msgstr "TƤnav"
+
+msgid "City"
+msgstr "Linn"
+
+msgid "Postal code"
+msgstr "Postiindeks"
+
+msgid "Country"
+msgstr "Riik"
+
+msgid "Biography"
+msgstr "Elulugu"
+
+msgid "Important notice"
+msgstr "Oluline teave"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr "Olge ettevaatlik millist infot Te oma profiili alla lisate, sest seda vƵidakse kergesti nƤha teiste kasutajate poolt (isegi nende poolt keda Te ei soovi)."
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr "Mitte kƵik pole XMPP's privaatne, see siin on Ć¼ks nendest asjadest, teie avalik profiil (vCard)."
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr "On soovitatav Ć¼les laadida enda profiili pilt (%s maximum), sest see muudab Teid paremini Ƥratuntavaks."
+
+msgid "Save"
+msgstr "Salvesta"
+
+msgid "Cancel"
+msgstr "TĆ¼hista"
+
+msgid "Edit options"
+msgstr "Muuda valikuid"
+
+msgid "Channel"
+msgstr "Kanal"
+
+msgid "Commands"
+msgstr "KƤsud"
+
+msgid "Sounds"
+msgstr "Helid"
+
+msgid "Privacy"
+msgstr "Privaatsus"
+
+msgid "Message archiving"
+msgstr "SƵnumite arhiveerimine"
+
+msgid "Store a history of your chats"
+msgstr "Salvesta oma vestlused"
+
+msgid "Geolocation"
+msgstr "Geolokatsioon"
+
+msgid "Empty"
+msgstr "TĆ¼hi"
+
+msgid "Empty channel"
+msgstr "TĆ¼hi kanal"
+
+msgid "Persistent"
+msgstr "PĆ¼siv"
+
+msgid "Maximum notices"
+msgstr "Maksimaalsed teavitused"
+
+msgid "Account"
+msgstr "Konto"
+
+msgid "Change password"
+msgstr "Muuda parool"
+
+msgid "Delete account"
+msgstr "Kustuta konto"
+
+msgid "Old"
+msgstr "Vana"
+
+msgid "New (2 times)"
+msgstr "Uus"
+
+msgid "Continue"
+msgstr "JƤtka"
+
+msgid "To"
+msgstr "Kellele"
+
+msgid "Close"
+msgstr "Sulge"
+
+msgid "unknown"
+msgstr "tundmatu"
+
+msgid "Unavailable"
+msgstr "Mitte saadaval"
+
+msgid "is now"
+msgstr "on nĆ¼Ć¼d"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr "Palun oodake kuni Teie pilt on Ć¼les laetud..."
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "Siin see on! Uus ilus profiili pilt"
+
+msgid "The image file is not supported or has a bad size."
+msgstr "Pildi formaat ei ole toetatud vƵi on suurus mitte sobiv."
+
+msgid "Reply"
+msgstr "Vasta"
+
+msgid "Error"
+msgstr "Viga"
+
+msgid "Click here to solve the error"
+msgstr "Kliki siia, et viga lahendada"
+
+msgid "You"
+msgstr "Teie"
+
+msgid "Remove"
+msgstr "Eemalda"
+
+msgid "Rename"
+msgstr "Nimeta Ć¼mber"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "Tere, ma olen %s, Ma sooviksin Teid endale sƵbraks lisada."
+
+msgid "Smiley insertion"
+msgstr "Smaili sisestamine"
+
+msgid "Change style"
+msgstr "Muuda stiili"
+
+msgid "Text in bold"
+msgstr "Tekst paksult"
+
+msgid "Text in italic"
+msgstr "Tekst kaldkirjas"
+
+msgid "Underlined text"
+msgstr "Tekst allajoonitult"
+
+msgid "Save chat"
+msgstr "Salvesta vestlus"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr "Vajutage jƤrgnevale lingile ja oodake, et saada vestluslogi. SeejƤrel klikkige uuesti, et saada fail."
+
+msgid "This chat is empty!"
+msgstr "See vestlus on tĆ¼hi!"
+
+msgid "Generate file!"
+msgstr "Genereeri fail!"
+
+msgid "Download file!"
+msgstr "Lae fail alla!"
+
+msgid "Clean current chat"
+msgstr "Puhasta hetkeline vestlus"
+
+msgid "View chat history"
+msgstr "Vaata vestluse ajalugu"
+
+msgid "Show user profile"
+msgstr "NƤita kasutaja profiili"
+
+msgid "Add this contact to your friends"
+msgstr "Lisa see kontakt oma kontakti nimekirja"
+
+msgid "Add this groupchat to your favorites"
+msgstr "Lisa see grupivestlus oma lemmikutesse"
+
+msgid "All tabs"
+msgstr "KƵik kaardid"
+
+msgid "Close this tab"
+msgstr "Sulge see kaart"
+
+msgid "no subject defined for this room."
+msgstr "sellele ruumile ei ole teemat pandud"
+
+msgid "Administration panel for this room"
+msgstr "Selle ruumi administratsiooni paneel"
+
+msgid "Moderators"
+msgstr "Moderaatorid"
+
+msgid "Participants"
+msgstr "Osalejad"
+
+msgid "Visitors"
+msgstr "KĆ¼lastajad"
+
+msgid "Manage favorite rooms"
+msgstr "Halda lemmik ruume"
+
+msgid "Change favorites"
+msgstr "Muuda lemmikuid"
+
+msgid "Search a room"
+msgstr "Otsi ruumi"
+
+msgid "Select a favorite"
+msgstr "Vali lemmik"
+
+msgid "Getting the name..."
+msgstr "Hangin nime..."
+
+msgid "Gateway"
+msgstr "VƤrav"
+
+msgid "Name"
+msgstr "Nimi"
+
+msgid "Room"
+msgstr "Ruum"
+
+msgid "Add"
+msgstr "Lisa"
+
+msgid "Edit"
+msgstr "Muuda"
+
+msgid "Search a room on"
+msgstr "Otsi ruumi"
+
+msgid "No room found on this server."
+msgstr "Ruumi ei leitud sellest serverist."
+
+msgid "Service discovery"
+msgstr "Teenuse avastamine"
+
+msgid "Server to query"
+msgstr "Serveri pƤring"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr "Vabandame, aga tulemusi ei leitud!"
+
+msgid "Accounts"
+msgstr "Kontod"
+
+msgid "Authentications"
+msgstr "Autentimised"
+
+msgid "Automation"
+msgstr "Automaatika"
+
+msgid "Clients"
+msgstr "Kliendid"
+
+msgid "Collaboration"
+msgstr "Koostƶƶ"
+
+msgid "Components"
+msgstr "Komponendid"
+
+msgid "Rooms"
+msgstr "Ruumid"
+
+msgid "Directories"
+msgstr "Kataloogid"
+
+msgid "Gateways"
+msgstr "VƤravad"
+
+msgid "News"
+msgstr "Uudised"
+
+msgid "Hierarchy"
+msgstr "Hierarhia"
+
+msgid "Proxies"
+msgstr "Proksid"
+
+msgid "Publication/Subscription"
+msgstr "Avalikustamine/Tellimus"
+
+msgid "Storage"
+msgstr "Hoiuruum"
+
+msgid "Service offline or broken"
+msgstr "Teenus lahti Ć¼hendatud vƵi katki"
+
+msgid "Your inbox"
+msgstr "Teie postkast"
+
+msgid "Available actions"
+msgstr "Saadaval valikud"
+
+msgid "Clean"
+msgstr "Puhasta"
+
+msgid "New"
+msgstr "Uus"
+
+msgid "Received"
+msgstr "Vastu vƵetud"
+
+msgid "Subject"
+msgstr "Teema"
+
+msgid "Content"
+msgstr "Sisu"
+
+msgid "Send message"
+msgstr "Saada sƵnum"
+
+msgid "Your inbox is empty."
+msgstr "Teie postkast on tĆ¼hi."
+
+msgid "MUC administration"
+msgstr "MUC administratsioon"
+
+msgid "You administrate this room"
+msgstr "Teie olete ruumi administraator"
+
+msgid "Enter new subject"
+msgstr "Sisestage uus teema"
+
+msgid "Configuration"
+msgstr "Seadistus"
+
+msgid "Authorizations"
+msgstr "Load"
+
+msgid "Member list"
+msgstr "Liikmete nimekiri"
+
+msgid "Owner list"
+msgstr "Omanike nimekiri"
+
+msgid "Administrator list"
+msgstr "Administraatorite nimekiri"
+
+msgid "Outcast list"
+msgstr "HĆ¼ljatute nimekiri"
+
+msgid "Add an input"
+msgstr "Lisa sisend"
+
+msgid "Destroy this MUC"
+msgstr "HƤvita see MUC"
+
+msgid "Yes, let's do it!"
+msgstr "Jah, teeme seda!"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr "Teie sƵber jƤlgib vestlust."
+
+msgid "Your friend is writing a message..."
+msgstr "Teie sƵber kirjutab..."
+
+msgid "Your friend stopped writing a message."
+msgstr "Teie sƵber lƵpetas kirjutamise."
+
+msgid "Your friend is doing something else."
+msgstr "Teie sƵber teeb midagi muud."
+
+msgid "Your friend closed the chat."
+msgstr "Teie sƵber sulges vestluse."
+
+msgid "Requesting this service..."
+msgstr "PƤrin seda teenust..."
+
+msgid "Loading"
+msgstr "Laen"
+
+msgid "joined the chat room"
+msgstr "liitus jututoaga"
+
+msgid "left the chat room"
+msgstr "lahkus jututoast"
+
+msgid "no status"
+msgstr "staatus puudub"
+
+msgid "has been kicked"
+msgstr "on vƤlja visatud"
+
+msgid "has been banned"
+msgstr "on keelu alla pandud"
+
+msgid "no reason"
+msgstr "pƵhjust pole"
+
+msgid "Communicate with the entire world!"
+msgstr "Suhtle terve maailmaga!"
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr "See lubab Teil miljonite inimestega kontakteeruda kes kasutavad XMPP vƵrgustikku nagu Teie kasutate Jappix'it. Liitu sƵpruskonnaga ja ole vaba!"
+
+msgid "Hi there!"
+msgstr "Tere!"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr "Tere tulemast %1s, ā%2sā."
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr "Logi sisse enda XMPP kontole vƵi tee tasuta uus!"
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr "Jappix on avatud lƤhtekoodiga projekt PostPro'lt, mittetulundusĆ¼hingult kes pakub meile suurt abi."
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr "Logige sisse oma XMPP kontole. Te saate kasutada ka %s et liituda grupivestlusega."
+
+msgid "Previous"
+msgstr "Eelmine"
+
+msgid "General"
+msgstr "Ćldine"
+
+msgid "Advanced"
+msgstr "Muud"
+
+msgid "Resource"
+msgstr "Vahend"
+
+msgid "Priority"
+msgstr "Eelis"
+
+msgid "Low"
+msgstr "Madal"
+
+msgid "Medium"
+msgstr "Keskmine"
+
+msgid "High"
+msgstr "KƵrge"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr "Sisestage grupivestlus millega soovite liituda ja oma hĆ¼Ć¼dnimi. Te saate ka alati minna tagasi %s."
+
+msgid "login page"
+msgstr "sisselogimise leht"
+
+msgid "Share this link with your friends:"
+msgstr "Jaga seda linki oma sƵpradega:"
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr "Registreeri uus XMPP konto ja liitu oma sƵpradega. See on lihtne!"
+
+msgid "Required"
+msgstr "Kohustuslik"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr "Te olete registreeritud, siin on Teie XMPP aadress:"
+
+msgid "Manager"
+msgstr "Haldur"
+
+msgid "Project"
+msgstr "Projekt"
+
+msgid "Encrypted"
+msgstr "KrĆ¼pteeritud"
+
+msgid "Unencrypted"
+msgstr "KrĆ¼pteerimata"
+
+msgid "Where are you?"
+msgstr "Kus Te olete?"
+
+msgid "What's up with you?"
+msgstr "Mis toimub?"
+
+msgid "Fetching the social channel..."
+msgstr "PĆ¼Ć¼an kanalit..."
+
+msgid "You are synchronized with your network."
+msgstr "Te olete oma vƵrguga sĆ¼nkroniseeritud."
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr "Ei saa midagi saata: te saate ainult teateid vastu vƵtta!"
+
+msgid "Media viewer"
+msgstr "Meedia vaatur"
+
+msgid "Browse"
+msgstr "Brausi"
+
+msgid "Command"
+msgstr "KƤsk"
+
+msgid "Subscribe"
+msgstr "Telli"
+
+msgid "Join"
+msgstr "Liitu"
+
+msgid "Automatic"
+msgstr "Automaatne"
+
+msgid "Search"
+msgstr "Otsi"
+
+msgid "No result!"
+msgstr "Ćhtegi tulemust!"
+
+msgid "No notifications."
+msgstr "Pole teateid."
+
+msgid "would like to add you as a friend."
+msgstr "soovib lisada Teid sƵbraks."
+
+msgid "would like you to join this chatroom:"
+msgstr "soovib kutsuda Teid sellesse jututuppa:"
+
+msgid "Do you accept?"
+msgstr "Kas Te olete nƵus?"
+
+msgid "Yes"
+msgstr "Jah"
+
+msgid "No"
+msgstr "Ei"
+
+msgid "would like to get authorization."
+msgstr "soovib saada luba."
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr "Kas Te soovite nƤha mida sƵbra %s Teile soovitab?"
+
+msgid "Submit"
+msgstr "Kinnita"
+
+msgid "Client"
+msgstr "Klient"
+
+msgid "System"
+msgstr "SĆ¼steem"
+
+msgid "Local time"
+msgstr "Kohalik aeg"
+
+msgid "Comments"
+msgstr "Kommentaarid"
+
+msgid "User profile"
+msgstr "Kasutaja profiil"
+
+msgid "See his/her position on the globe"
+msgstr "Vaata tema asukohta kaardil"
+
+msgid "Confirm"
+msgstr "Kinnita"
+
+msgid "anonymous mode"
+msgstr "anonĆ¼Ć¼mne režiim"
+
+msgid "Groups"
+msgstr "Grupid"
+
+msgid "Unclassified"
+msgstr "Liigitamata"
+
+msgid "Authorize"
+msgstr "Autoriseeri"
+
+msgid "Ask for authorization"
+msgstr "KĆ¼si autoriseerimist"
+
+msgid "Unblock"
+msgstr "Deblokeeri"
+
+msgid "Prohibit"
+msgstr "Keela"
+
+msgid "Block"
+msgstr "Blokeeri"
+
+msgid "Chat"
+msgstr "Vestlus"
+
+msgid "Groupchat"
+msgstr "Grupivestlus"
+
+msgid "Jappix Mobile"
+msgstr "Jappix Mobiilis"
+
+msgid "Desktop"
+msgstr "Pealeht"
+
+msgid "Mobile"
+msgstr "Mobiil"
+
+msgid "Please wait..."
+msgstr "Palun oodake..."
+
+msgid "Please enable JavaScript"
+msgstr "Palun lubage JavaScript"
+
+msgid "Your channel"
+msgstr "Teie kanal"
+
+msgid "Channel of"
+msgstr "Kanal kuulub"
+
+msgid "More notices..."
+msgstr "Rohkem teateid..."
+
+msgid "Attach a file"
+msgstr "Lisa fail"
+
+msgid "Send"
+msgstr "Saada"
+
+msgid "Unattach the file"
+msgstr "Eemalda fail"
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr "Faili Ć¼leslaadimisel tekkis viga: Ƥkki on see liiga suur (%s maximum) vƵi keelatud!"
+
+msgid "Authorization failed"
+msgstr "Autoriseerimine ebaƵnnestus"
+
+msgid "Registration failed, please choose a different username"
+msgstr "Registreerimine ebaƵnnestus, palun valige teine kasutajanimi"
+
+msgid "Service unavailable"
+msgstr "Teenus mitte saadaval"
+
+msgid "Internal server error, try later"
+msgstr "Serverisisene viga, proovige hiljem uuesti"
+
+msgid "Your form has been sent."
+msgstr "Teie ankeet on saadetud."
+
+msgid "Application"
+msgstr "Aplikatsioon"
+
+msgid "XMPP links"
+msgstr "XMPP lingid"
+
+msgid "Open XMPP links with Jappix"
+msgstr "Ava XMPP lingid Jappix'iga"
+
+msgid "changed the subject to:"
+msgstr "muutis teema:"
+
+msgid "Welcome!"
+msgstr "Tere tulemast!"
+
+msgid "Friends"
+msgstr "SƵbrad"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr "Tere tulemast Jappix'isse, Teie isiklik sotsiaalvƵrgustik!"
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr "Enne kui Te seda kasutama hakkate, peate te mƵned seaded salvestama, otsima sƵpru ja tƤitma oma profiili."
+
+msgid "Enable notification sounds"
+msgstr "VƵimalda teadete helid"
+
+msgid "Share your position on the globe"
+msgstr "Jaga oma asukohta kaardil"
+
+msgid "Offline friends"
+msgstr "Ćhenduseta sƵbrad"
+
+msgid "Don't hide offline friends"
+msgstr "Ćra peida Ć¼henduseta sƵpru"
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr "Kasuta seda tƶƶriista, et leida oma sƵpru serverist vƵi lisa nad hiljem."
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr "Hea tƶƶ! NĆ¼Ć¼d saate te Jappix'it sƵpradega jagada!"
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr "Kui te vajutate salvestamise nuppu siis avaneb profiili muutmise aken."
+
+msgid "Share Jappix on %s"
+msgstr "Jaga Jappix'it %s"
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr "Kasutan Jappix'it, avatud sotsiaalvƵrgustik. Ma olen %s!"
+
+msgid "Unknown name"
+msgstr "Tundmatu nimi"
+
+msgid "Unknown country"
+msgstr "Tundmatu riik"
+
+msgid "Click to enable"
+msgstr "Kliki, et vƵimaldada"
+
+msgid "Click to disable"
+msgstr "Kliki, et keelata"
+
+msgid "Installation"
+msgstr "Paigaldus"
+
+msgid "Jappix installation"
+msgstr "jappixi paigaldus"
+
+msgid "Welcome to the Jappix installation!"
+msgstr "Tere tulemast Jappixi paigaldajasse!"
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr "See tƶƶriist aitab Teil kiiresti paigaldada Jappixi, avatud sotsiaalvƵrgustiku, Teie serverisse. Teil ei ole isegi vaja tehnilist taipu."
+
+msgid "Let's have a look at the installation steps:"
+msgstr "Vaatame paigalduse samme:"
+
+msgid "Welcome"
+msgstr "Tere tulemast"
+
+msgid "Storage configuration"
+msgstr "Hoiuruumi konfiguratsioon"
+
+msgid "Administrator account"
+msgstr "Administraatori konto"
+
+msgid "Main configuration"
+msgstr "PƵhiline konfiguratsioon"
+
+msgid "Hosts configuration"
+msgstr "Hosti konfiguratsioon"
+
+msgid "Services installation"
+msgstr "Teenuste paigaldus"
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr "Kui hetkeline keel (%1s) ei kattu teie omaga siis saate muuta keele %2s."
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr "Kui te soovite abi Jappixi paigalduse kohta siis Te vƵite vaadata tervet dokumentatsiooni, mis on saadaval:"
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr "On aeg paigaldada Teie enda isiklik avatud sotsiaalvƵrgustik: Minge jƤrgmise sammu juurde!"
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr "Jappix hoiab sƤilivaid andmeid (nagu nt jagatud failid, vestluse logid, Teie muusika ja konfiguratsioon) Ć¼hes ainsas turvatud kataloogis."
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr "Jappixil peab olema siia ja alamkataloogidesse kirjutusƵigus. Kui see puudub siis peate Te muutma Ƶigused %1s vƵi muutma kataloogi omaniku %2s (olenevalt Teie konfiguratsioonist)."
+
+msgid "The folder is writable, you can continue!"
+msgstr "Kataloogil on kirjutusƵigused, Te vƵite jƤtkata!"
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix pakub vƵimalust hallata oma konfiguratsiooni, installida uusi pluginaid vƵi otsida uuendusi. SellepƤrast peate te tegema administraatori konto, et haldus lehele ligi pƤƤseda."
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr "Kui Jappix on paigaldatud siis lihtsalt vajutage Haldaja lingile avalehel, et sellele ligi pƤƤseda."
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr "Tundub, et Teil jƤi midagi mƤrkamata vƵi need kaks parooli ei klapi omavahel!"
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr "Jappixi tƶƶtamiseks on vajalik mƵned vƤƤrtused muuta. Palun muutke jƤrgmised vƤljad (vƵi jƤtke need samaks, mis peaksid samuti tƶƶtama)."
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr "NB: Kui Te ei kinnita vajalikke vƤljasid siis kasutatakse olemasolevaid seadeid."
+
+msgid "User"
+msgstr "Kasutaja"
+
+msgid "Service"
+msgstr "Teenus"
+
+msgid "Service name"
+msgstr "Teenuse nimi"
+
+msgid "Service description"
+msgstr "Teenuse kirjeldus"
+
+msgid "Connection"
+msgstr "Ćhendus"
+
+msgid "Lock the host"
+msgstr "Lukusta host"
+
+msgid "Anonymous mode"
+msgstr "AnonĆ¼Ć¼mne režiim"
+
+msgid "Registration allowed"
+msgstr "Registreerimine lubatud"
+
+msgid "Use a proxy"
+msgstr "Kasuta proksit"
+
+msgid "Encryption"
+msgstr "KrĆ¼pteering"
+
+msgid "HTTPS storage"
+msgstr "HTTPS hoiustus"
+
+msgid "Force HTTPS"
+msgstr "Sunni HTTPS kasutus"
+
+msgid "Compression"
+msgstr "Pakkimine"
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr "See lehekĆ¼lg aitab Teil tƤpsustada hosti kuhu Jappix ennast Ć¼hendab. Te vƵite selle jƤtta nii nagu on kui soovite kasutada ametliku teenuse hosti."
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr "VƵib-olla Te ei tea mis on BOSH server? See on vahelĆ¼li Jappixi ja XMPP serveri vahel, see on vajalik tehniliste piirangute tƵttu."
+
+msgid "Main host"
+msgstr "PƵhiline host"
+
+msgid "Groupchat host"
+msgstr "Grupivestluse host"
+
+msgid "Anonymous host"
+msgstr "AnonĆ¼Ć¼mne host"
+
+msgid "Directory host"
+msgstr "Kataloogi host"
+
+msgid "BOSH host"
+msgstr "BOSH host"
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr "Te saate paigaldada lisatarkvara oma serverile, et laiendada Jappixi vƵimalusi."
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr "Et seda tegevust sooritada, peate Te olema serverisse sisse logitud administraatorina."
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr "Kui te olete seadistamise lƵpetanud, tekitab Jappix vahemƤlu failid. See vƵib aega vƵtta nii, et oodake millal rakendus on nƤhtaval ning Ƥrge vajutage Ć¼htegi nuppu."
+
+msgid "Thanks for using Jappix!"
+msgstr "AitƤh, et kasutate Jappixit!"
+
+msgid "Next"
+msgstr "JƤrgmine"
+
+msgid "Finish"
+msgstr "Valmis"
+
+msgid "Check again"
+msgstr "Kontrolli uuesti"
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr "Kataloogil ei ole kirjutusƵigusi, lisage need Ƶigused sellele asukohale %s."
+
+msgid "%s is installed on your system."
+msgstr "%s on Teie sĆ¼steemi paigaldatud."
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr "%1s ei ole Teie sĆ¼steemi paigaldatud, Te peaksite paigaldama %2s."
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr "PHP maksimaalse faili Ć¼leslaadimise mahu piirang on piisav (%s)."
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr "PHP maksimaalse faili Ć¼leslaadimise mahu piirang ei ole piisav (%1s), Te peaksite selle %2s mƤƤrama %3s."
+
+msgid "Jappix manager"
+msgstr "Jappixi haldur"
+
+msgid "Manager access"
+msgstr "Halduri juurdepƤƤs"
+
+msgid "Statistics"
+msgstr "Statistika"
+
+msgid "Hosts"
+msgstr "Hostid"
+
+msgid "Design"
+msgstr "Disain"
+
+msgid "Repeat"
+msgstr "Korda"
+
+msgid "All"
+msgstr "KƵik"
+
+msgid "Horizontal"
+msgstr "Horisontaalne"
+
+msgid "Vertical"
+msgstr "Vertikaalne"
+
+msgid "Center"
+msgstr "Keskel"
+
+msgid "Left"
+msgstr "Vasakule"
+
+msgid "Right"
+msgstr "Paremale"
+
+msgid "Top"
+msgstr "Ćles"
+
+msgid "Bottom"
+msgstr "Alla"
+
+msgid "Adapt"
+msgstr "Kohanda"
+
+msgid "Color"
+msgstr "VƤrv"
+
+msgid "Users"
+msgstr "Kasutajad"
+
+msgid "Updates"
+msgstr "Uuendused"
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr "See on keelatud ala: ainult autoriseeritud kasutajad saavad siia juurdepƤƤsu."
+
+msgid "Please use the form below to login to the administration panel."
+msgstr "Palun tƤitke alljƤrgnev vorm, et administraatori paneelile juurdepƤƤs saada."
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr "Et turvalisust suurendada, siis sessioonid on ajalise piiranguga ja kui brauser sulgeda siis Teid logitakse vƤlja."
+
+msgid "Credentials"
+msgstr "Isikutunnistus"
+
+msgid "You have been logged out. Goodbye!"
+msgstr "Teid on vƤlja logitud. NƤgemiseni!"
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr "Teid ei olnud vƵimalik kinnitada kui administraatorit. Kontrollige sisestatud andmeid!"
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr "PƵhiline statistika on protsessitud Jappixi poolt, Te leiate selle siit alt."
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr "Muutke oma Jappixi konfiguratsiooni selle tƶƶriista abil."
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr "Muutke XMPP hosti, mida Jappix pakub, selle tƶƶriista abil."
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr "KƵiki Jappixi poolt salvestatud faile saab hallata selle tƶƶriista abil: palun valige alamkataloog ja hakake selle sisu muutma!"
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr "Jappix on tƤielikult kohandatav: Te saate selle kujundust muuta siin."
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr "See ei ole Ƶige pildi formaat, palun kasutage PNG, GIF vƵi JPG formaati!"
+
+msgid "The image could not be received, would you mind retry?"
+msgstr "Pilti ei olnud vƵimalik vastu vƵtta, kas soovite uuesti proovida?"
+
+msgid "Your image was added to the list!"
+msgstr "Teie pilt lisati nimekirja!"
+
+msgid "Changes saved!"
+msgstr "Muudatused salvestatud!"
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr "Te saate lisada rohkem kui Ć¼he administraatori. Selle tƶƶriistaga saate ka parooli muuta."
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr "Selle tƶƶriistaga saate Jappixit uuendada vƵi vaadata kas uus versioon on saadaval. Informatsioon uue versiooni kohta on inglise keeles."
+
+msgid "Access statistics"
+msgstr "JuurdepƤƤs statistikale"
+
+msgid "Share statistics"
+msgstr "Jaga statistikat"
+
+msgid "Other statistics"
+msgstr "Muu statistika"
+
+msgid "January"
+msgstr "Jaanuar"
+
+msgid "February"
+msgstr "Veebruar"
+
+msgid "March"
+msgstr "MƤrts"
+
+msgid "April"
+msgstr "Aprill"
+
+msgid "May"
+msgstr "Mai"
+
+msgid "June"
+msgstr "Juuni"
+
+msgid "July"
+msgstr "Juuli"
+
+msgid "August"
+msgstr "August"
+
+msgid "September"
+msgstr "September"
+
+msgid "October"
+msgstr "Oktoober"
+
+msgid "November"
+msgstr "November"
+
+msgid "December"
+msgstr "Detsember"
+
+msgid "Monday"
+msgstr "EsmaspƤev"
+
+msgid "Tuesday"
+msgstr "TeisipƤev"
+
+msgid "Wednesday"
+msgstr "KolmapƤev"
+
+msgid "Thursday"
+msgstr "NeljapƤev"
+
+msgid "Friday"
+msgstr "Reede"
+
+msgid "Saturday"
+msgstr "LaupƤev"
+
+msgid "Sunday"
+msgstr "PĆ¼hapƤev"
+
+msgid "Total"
+msgstr "Kokku"
+
+msgid "Cache"
+msgstr "VahemƤlu"
+
+msgid "Logs"
+msgstr "Logid"
+
+msgid "Music"
+msgstr "Muusika"
+
+msgid "Backgrounds"
+msgstr "Tagataustad"
+
+msgid "Share"
+msgstr "Jaga"
+
+msgid "Background"
+msgstr "Tagataust"
+
+msgid "Notice"
+msgstr "Teade"
+
+msgid "Your design preferences have been saved!"
+msgstr "Teie kujunduse seadistused on salvestatud!"
+
+msgid "Please check your inputs: something is missing!"
+msgstr "Palun kontrollige vƤljasid: midagi on puudu!"
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr "Selle tƶƶriistaga saate muuta Jappixi tagatausta. Te saate panna kas Ć¼hte vƤrvi tagatausta vƵi Ć¼les laadida pildi. Laske kujutlusvƵimel lennata!"
+
+msgid "Use default background"
+msgstr "Kasutage olemasolevat tagatausta"
+
+msgid "Use your own image"
+msgstr "Kasutage enda Ć¼les laetud pilti"
+
+msgid "Select a background to use and change the display options."
+msgstr "Valige tagaataust ja seejƤrel valige kuidas seda kuvama peaks."
+
+msgid "Use your own color"
+msgstr "Kasutage enda valitud vƤrvi"
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr "Kirjutage HEX vƤƤrtusega vƤrvi valik mida Te soovite tagataustaks kasutada."
+
+msgid "Manage backgrounds"
+msgstr "Tagataustade haldamine"
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr "Selle tƶƶriistaga saate Te lisada uusi tagatausta pilte."
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr "Kui Te soovite mingisuguseid taustapilte eemaldada siis kasutage all olevat brauserit."
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr "Defineerige avalehe mƤrguanne oma teenuse kasutajatele. Nagu nƤiteks hoiatus sƵnumid, mƤrguanded vƵi reklaam."
+
+msgid "Simple notice"
+msgstr "Lihtne mƤrguanne"
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr "Sellele mƤrguandele saab kirjutada tavalist teksti, kood ei ole lubatud!"
+
+msgid "Advanced notice"
+msgstr "Ćlendatud mƤrguanne"
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr "Te saate lisada mƤrguande kus vƵite kasutada HTML'i, CSS'i ja JavaScripti, aga Te peate kodeerima stiili."
+
+msgid "Available updates"
+msgstr "Saadaval olevad uuendused"
+
+msgid "What's new?"
+msgstr "Mis on uut?"
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr "Teie failihoidla kataloogil ei ole kirjutusƵigusi, palun lisage need!"
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr "%1s vƵib pƵhjustada proksi probleeme, palun suurendage vƤƤrtust %2s kuni %3s!"
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr "Te kasutate Jappixi arendusversiooni. Uuendage seda lƤbi repository (hoidla) kƤivitades %s."
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr "Uus Jappixi versioon on saadaval! Vaadake mis on uut ja kƤivitage uuendus!"
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr "Teil on vana Jappixi versioon. Uuendage see versioonini %s siia klikkides!"
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr "Teil nƤib olevat Jappixi uusim versioon, aga te saate ka manuaalselt uuendusi kontrollida siia klikkides."
+
+msgid "Check for updates"
+msgstr "Kontrolli uuendusi"
+
+msgid "Update in progress"
+msgstr "Uuendamine kƤigus"
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr "Jappix on uuendatud: Teil on nĆ¼Ć¼d kƵige uuem versioon."
+
+msgid "The update has failed! Please try again later."
+msgstr "Uuendamine ebaƵnnestus! Palun proovige hiljem uuesti."
+
+msgid "Downloading package..."
+msgstr "Pakkide alla laadimine..."
+
+msgid "Removing current Jappix system files..."
+msgstr "Eemaldan hetkelisi Jappixi sĆ¼steemi faile..."
+
+msgid "Extracting package..."
+msgstr "Pakin pakke lahti..."
+
+msgid "Regenerating storage folder tree..."
+msgstr "Taastan hoiukataloogi..."
+
+msgid "Jappix is now up to date!"
+msgstr "Jappix on nĆ¼Ć¼d uuendatud!"
+
+msgid "Aborted: socket error!"
+msgstr "Katkestatud: pesa viga!"
+
+msgid "Aborted: buffer error!"
+msgstr "Katkestatud: puhvri viga!"
+
+msgid "Aborted: everything is not writable!"
+msgstr "Katkestatud: kƵikidel vajalikel asjadel ei ole kirjutusƵigusi!"
+
+msgid "Aborted: could not extract the package!"
+msgstr "Katkestatud: ei saanud pakke lahti pakkida!"
+
+msgid "Visits"
+msgstr "KĆ¼lastused"
+
+msgid "Daily"
+msgstr "PƤevane"
+
+msgid "Weekly"
+msgstr "NƤdalane"
+
+msgid "Monthly"
+msgstr "Kuine"
+
+msgid "Yearly"
+msgstr "Aastane"
+
+msgid "Size"
+msgstr "Suurus"
+
+msgid "Clean everything"
+msgstr "Puhasta kƵik"
+
+msgid "Purge cache"
+msgstr "Puhasta vahemƤlu"
+
+msgid "Purge logs"
+msgstr "Puhasta logid"
+
+msgid "Purge updates"
+msgstr "Puhasta uuendused"
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr "Failihoidla mida Te puhastasite on nĆ¼Ć¼d tĆ¼hi!"
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr "Hoidke oma Jappix vƤrske ja kiire, puhastage failihoidlaid regulaarselt!"
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr "Lae Ć¼les oma muusikat (OGG Vorbis, MP3 vƵi WAV) et seda saaks Jappix'is kuulata!"
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr "Fail mida Te tahtsite Ć¼les laadida peab olema vƤiksem kui %s."
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr "Selle tƶƶriistaga saate ennast kursis hoida mida Teie kasutajad serveris hoiavad ja vajaduse korral eemaldada ebasobivaid materjale."
+
+msgid "Title"
+msgstr "Pealkiri"
+
+msgid "Artist"
+msgstr "Esitaja"
+
+msgid "Album"
+msgstr "Album"
+
+msgid "File"
+msgstr "Fail"
+
+msgid "Upload"
+msgstr "Ćleslaadimine"
+
+msgid "The folder is empty."
+msgstr "Kaust on tĆ¼hi."
+
+msgid "The music could not be received, please retry!"
+msgstr "Muusikat ei saadud vastu vƵtta, proovige uuesti!"
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr "Vale muusikafaili formaat, palun laadige Ć¼les OGG Vorbis, MP3 vƵi WAV formaadis!"
+
+msgid "Your music has been added!"
+msgstr "Teie muusika on lisatud!"
+
+msgid "The selected elements have been removed."
+msgstr "Valitud elemendid on eemaldatud."
+
+msgid "You must select elements to remove!"
+msgstr "Te peate valima elemente mida eemaldada!"
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr "Selle tƶƶriistaga saate lisada uue kasutaja vƵi muuta parooli. Palun lisage tugev parool!"
+
+msgid "Manage"
+msgstr "Halda"
+
+msgid "List"
+msgstr "Nimekiri"
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr "Selle tƶƶriistaga saate eemaldada kasutajaid. Viimast kasutajat eemaldada ei saa, vƤhemalt Ć¼ks peab alati alles jƤƤma."
+
+msgid "The user has been added!"
+msgstr "Kasutaja on lisatud!"
+
+msgid "The chosen users have been removed."
+msgstr "Valitud kasutajad on eemaldatud."
+
+msgid "You must select one or more users to be removed!"
+msgstr "Te peate valima Ć¼he vƵi mitu kasutajat keda eemaldada!"
+
+msgid "Yesterday"
+msgstr "Eile"
+
+msgid "%s days ago"
+msgstr "%s pƤeva tagasi"
+
+msgid "User currently active"
+msgstr "Hetkel aktiivsed kasutajad"
+
+msgid "Last seen: %s"
+msgstr "Viimati nƤhtud: %s"
+
+msgid "Inactive since: %s"
+msgstr "Inaktiivsed alates: %s"
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr "NƤib, et Teie sƵber ei ole Teie sƵnumeid kƤtte saanud!"
+
+msgid "Static content server"
+msgstr "Staatilise sisuga server"
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr "Siin on staatilise sisuga serverid %1s, ā%2sā."
+
+msgid "Suggested friends"
+msgstr "Soovitatud sƵbrad"
+
+msgid "Check all"
+msgstr "Vali kƵik"
+
+msgid "Uncheck all"
+msgstr "Eemalda valik kƵigelt"
+
+msgid "Choose"
+msgstr "Vali"
+
+msgid "List name"
+msgstr "NƤita nime"
+
+msgid "Allow"
+msgstr "Luba"
+
+msgid "Deny"
+msgstr "Keela"
+
+msgid "Group"
+msgstr "Grupp"
+
+msgid "Subscription"
+msgstr "Tellimus"
+
+msgid "Both"
+msgstr "MƵlemad"
+
+msgid "From"
+msgstr "Kellelt"
+
+msgid "Everybody"
+msgstr "IgaĆ¼ks"
+
+msgid "Send messages"
+msgstr "Saada sƵnum"
+
+msgid "Send queries"
+msgstr "Saada pƤringud"
+
+msgid "See my status"
+msgstr "Vaata minu staatust"
+
+msgid "Send his/her status"
+msgstr "Saada tema staatus"
+
+msgid "Everything"
+msgstr "KƵik"
+
+msgid "Item"
+msgstr "Ćhik"
+
+msgid "Order"
+msgstr "JƤrjekord"
+
+msgid "Active for this session"
+msgstr "Selleks sessiooniks aktiivne"
+
+msgid "Always active"
+msgstr "Alati aktiivne"
+
+msgid "User directory"
+msgstr "Kasutaja kataloog"
+
+msgid "Search a friend"
+msgstr "Otsi sƵpra"
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr "Server ei toeta nƵutud detaili vƵi ei ole see saadaval, seega detaili protsessimine on katkestatud."
+
+msgid "This is a repeat from %s"
+msgstr "%s kordab seda"
+
+msgid "Loading comments..."
+msgstr "Laen kommentaare..."
+
+msgid "Type your comment here..."
+msgstr "Kirjuta oma kommentaar siia..."
+
+msgid "Could not get the comments!"
+msgstr "Ei saanud kommentaare kƤtte!"
+
+msgid "Show comments"
+msgstr "NƤita kommentaare"
+
+msgid "Send him/her a message"
+msgstr "Saada temale sƵnum"
+
+msgid "Start a chat with him/her"
+msgstr "Alusta temaga vestlust"
+
+msgid "Media integration"
+msgstr "Meedia integratsioon"
+
+msgid "Comments locked!"
+msgstr "Kommentaarid lukus!"
+
+msgid "Type something you want to share with your friends..."
+msgstr "Kirjuta midagi mida sa tahad oma sƵpradega jagada..."
+
+msgid "changed his/her nickname to %s"
+msgstr "muutis oma hĆ¼Ć¼dnime %s"
+
+msgid "commented an item you follow: ā%sā."
+msgstr "kommenteeris asja Ć¼le mida sa jƤlgid: ā%sā."
+
+msgid "Hide"
+msgstr "Peida"
+
+msgid "liked your post: ā%sā."
+msgstr "linkis sinu postituse: ā%sā."
+
+msgid "quoted you somewhere: ā%sā."
+msgstr "tsiteeris sind kuskil: ā%sā."
+
+msgid "published on your wall: ā%sā."
+msgstr "kirjutas sinu seinale: ā%sā."
+
+msgid "tagged you in a photo (%s)."
+msgstr "sildistas sind fotol (%s)."
+
+msgid "tagged you in a video (%s)."
+msgstr "sildistas sind videol (%s)."
+
+msgid "Show"
+msgstr "NƤita"
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr "Vajad abi? Parem oleks kui sa loed meie dokumentatsiooni lehte enne kui sa selle vormi tƤidad!"
+
+msgid "Pubsub host"
+msgstr "Pubsub host"
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr "Jappix on suurepƤrane sotsiaalvƵrgustik millele Te saate ligi pƤƤseda kusiganes Te olete, millal iganes Te soovite ja suhelda kellega iganes Te soovite."
+
+msgid "Manager link"
+msgstr "Halduri link"
+
+msgid "User uploads server"
+msgstr "Kasutajate Ć¼leslaadimised serverisse"
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr "Siin on kasutajate Ć¼leslaadimised %1s, ā%2sā."
+
+msgid "Logo"
+msgstr "Logo"
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr "Te saate lisada enda teenuse logo ja asendada olemasoleva. Hoolitsege selle eest, et suurus ja vƤrvid oleksid Ƶiged!"
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr "Lae Ć¼les iga logo soovitatud pikseli suurusega."
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr "See ei ole Ƶige pildi formaat, palun valige PNG formaat!"
+
+msgid "Your service logo has been successfully changed!"
+msgstr "Teie teenuse logo on edukalt muudetud!"
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr "Teie logo formaat peab olema PNG. Kui te jƤtate vƤlja tĆ¼hjaks siis logo ei muutu."
+
+msgid "Remove this logo"
+msgstr "Eemalda see logo"
+
+msgid "View this logo"
+msgstr "Vaata seda logo"
+
+msgid "Send a file"
+msgstr "Saada fail"
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr "Kui te olete faili Ć¼les laadinud siis Teie sƵber saab mƤrguande Teie saadetud faili kohta."
+
+msgid "Groupchats to join"
+msgstr "Grupivestlused millega liituda"
+
+msgid "Purge sent files"
+msgstr "Puhasta saadetud failid"
+
+msgid "would like to send you a file: ā%sā."
+msgstr "soovib Teile saata faili: ā%sā."
+
+msgid "has accepted to received your file: ā%sā."
+msgstr "on nƵustunud Teie saadetud faili vastu vƵtma: ā%sā."
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr "on keeldunud Teie saadetud faili vastu vƵtmast: ā%sā."
+
+msgid "could not receive your file: ā%sā."
+msgstr "ei saanud Teie faili kƤtte: ā%sā."
+
+msgid "has received a file exchange request: ā%sā."
+msgstr "On failivahetuse pakkumise vastu vƵtnud: ā%sā."
+
+msgid "Available shortcuts:"
+msgstr "Saadaolevad otseteed:"
+
+msgid "%s removes the chat logs"
+msgstr "%s eemaldab vestluse logid"
+
+msgid "%s joins a groupchat"
+msgstr "%s liitub grupivestlusega"
+
+msgid "%s closes the chat"
+msgstr "%s sulgeb vestluse"
+
+msgid "%s shows the user profile"
+msgstr "%s nƤitab kasutaja profiili"
+
+msgid "%s sends a message to the room"
+msgstr "%s saadab ruumi sƵnumi"
+
+msgid "%s changes your nickname"
+msgstr "%s muudab Teie hĆ¼Ć¼dnime"
+
+msgid "%s sends a message to someone in the room"
+msgstr "%s saadab kellegile ruumis olevale sƵnumi"
+
+msgid "%s changes the room topic"
+msgstr "%s muudab ruumi teema"
+
+msgid "%s kicks an user of the room"
+msgstr "%s lƶƶb kasutaja ruumist vƤlja"
+
+msgid "%s bans an user of the room"
+msgstr "%s paneb kasutajale ruumi keelu"
+
+msgid "%s invites someone to join the room"
+msgstr "%s kutsub kellegi ruumiga liituma"
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr ""
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# Persian translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:25+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "ŁŁ
ŪāŲŖŁŲ§Ł Ų¬Ų§ŁŲ§Ų§Ų³Ś©Ų±ŪŁ¾ŲŖ Ų±Ų§ ŲÆŲ± Ł
Ų±ŁŲ±ŚÆŲ± Ų“Ł
Ų§ ŪŲ§ŁŲŖ. ŲØŁŲ§ŲØŲ±Ų§ŪŁ Ų“Ł
Ų§ ŁŁ
ŪāŲŖŁŲ§ŁŪŲÆ Jappix Ų±Ų§ ŲØŲØŪŁŪŲÆ! ŁŲ·ŁŲ§Ł Ų§ŪŁ Ų±Ų§ Ų§ŲµŁŲ§Ų Ś©ŁŪŲÆ."
+
+msgid "An open social network"
+msgstr "ŪŚ© Ų“Ł
Ų§ Ų§Ų¬ŲŖŁ
Ų§Ų¹Ū ŲØŲ§Ų²"
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "Jappix ŲŖŁŲ³Ų· ŪŚ© Ų§Ų“Ś©Ų§Ł Ų“ŲØŚ©Ł Ł
ŲŖŁŁŁ Ų“ŲÆŁāŲ§Ų³ŲŖ. ŪŚ© Ų§Ų“Ś©Ų§Ł ŪŲ§ ŁŲ±ŁŲÆ ŲØŲÆ (ŲØŲ±Ų±Ų³Ū Ś©ŁŪŲÆ Ś©Ł Ų§Ų¹ŲŖŲØŲ§Ų±Ų§ŲŖ ŲÆŲ±Ų³ŲŖ Ų±Ų§ ŁŲ§Ų±ŲÆ Ś©Ų±ŲÆŁāŲ§ŪŲÆ). Ų“Ų±Ł
ŁŲÆŁ ŲØŲ§ŲØŲ§ŲŖ ŲÆŲ±ŲÆŲ³Ų± Ų§ŪŲ¬Ų§ŲÆ Ų“ŲÆŁ."
+
+msgid "The element list on this server could not be obtained!"
+msgstr "ŁŁŲ±Ų³ŲŖ Ų¹ŁŲ§ŲµŲ± Ų§ŪŁ Ų³Ų±ŁŲ± ŁŁ
ŪāŲŖŁŲ§ŁŲÆ ŚÆŲ±ŁŲŖŁ Ų“ŁŲÆ!"
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "ŚÆŲ°Ų±ŁŲ§ŚŁŁ Ų“Ł
Ų§ ŲŖŲŗŪŪŲ± Ś©Ų±ŲÆŁāŲ§Ų³ŲŖ. Ų“Ł
Ų§ Ł
ŪāŲŖŁŲ§ŁŪŲÆ ŲØŲ§ ŲÆŲ§ŲÆŁāŁŲ§ Ų¬ŲÆŪŲÆ ŁŲ±ŁŲÆŪ Ł
ŲŖŲµŁ Ų“ŁŪŲÆ."
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "ŲŲ³Ų§ŲØ XMPP Ų“Ł
Ų§ ŲŲ°Ł Ų“ŲÆŁāŲ§Ų³ŲŖ. ŲØŲÆŲ±ŁŲÆ!"
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "Ų“Ł
Ų§ Ų§Ų² ŲŲ³Ų§ŲØ XMPP Ų®ŁŲÆ Ų®Ų§Ų±Ų¬ Ų“ŲÆŁāŲ§ŪŲÆ. Ų±ŁŲ² Ų®ŁŲ“!"
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "Ų§ŲŖŲ§ŁŪ Ś©Ł Ų“Ł
Ų§ ŲØŁ Ų¢Ł ŁŲµŁ Ų“ŲÆŁāŲ§ŪŲÆ ŲØŁ ŁŲøŲ± ŁŲ¬ŁŲÆ ŁŲÆŲ§Ų±ŲÆ. Ų“Ł
Ų§ Ł
ŪāŲŖŁŲ§ŁŪŲÆ Ų§ŪŲ¬Ų§ŲÆŲ“ Ś©ŁŪŲÆ!"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "ŚŁ¾ ŚÆŲ±ŁŁŪ Ų®Ų°Ł Ų“ŲÆ. Ų§ŁŲ¢Ł ŁŲ± Ś©Ų³ ŲÆŪŚÆŲ±Ū Ł
ŪāŲŖŁŲ§ŁŲÆ Ų¢Ł Ų±Ų§ Ų§ŪŲ¬Ų§ŲÆ Ś©ŁŲÆ."
+
+msgid "The user that you want to reach is not present in the room."
+msgstr ""
+
+msgid "Please enter the group chat address to join."
+msgstr ""
+
+msgid "Please enter your nickname to join %s."
+msgstr ""
+
+msgid "This room (%s) is protected with a password."
+msgstr ""
+
+msgid "Your browser is out of date!"
+msgstr "Ł
Ų±ŁŲ±ŚÆŲ± Ų“Ł
Ų§ Ł
ŁŲ³ŁŲ® Ų§Ų³ŲŖ!"
+
+msgid "Last %s version is better!"
+msgstr ""
+
+msgid "Login"
+msgstr "ŁŲ§Ų±ŲÆ Ų“ŲÆŁ"
+
+msgid "Register"
+msgstr "Ų«ŲØŲŖ ŁŲ§Ł
"
+
+msgid "Here we go!"
+msgstr "Ų§ŪŁŲ¬Ų§ Ł
ŪāŲ±ŁŪŁ
!"
+
+msgid "Server"
+msgstr "Ų³Ų±ŁŲ±"
+
+msgid "Password"
+msgstr "Ł¾Ų³ŁŲ±ŲÆ"
+
+msgid "Remember me"
+msgstr "Ł
Ų±Ų§ ŲØŁ Ų®Ų§Ų·Ų± ŲØŲ³Ł¾Ų§Ų±"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "Ų§ŪŁ Ų³Ų±ŁŪŲ³ ŲŗŪŲ± ŁŲ¹Ų§Ł Ų“ŲÆŁ Ł ŲÆŲ³ŲŖŲ±Ų³Ū Ų“Ł
Ų§ ŲØŁ Ų§Ł Ł
Ł
Ś©Ł ŁŪŲ³ŲŖ"
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "ŲØŁ ŲÆŁŪŁ Ł
Ų“Ś©Ł Ų“ŲØŚ©ŁāŲ§ŪŲ Ų“Ł
Ų§ ŁŲ·Ų¹ Ų“ŲÆŁāŲ§ŪŲÆ. Ų§ŁŲ¢Ł ŚŁ Ł
ŪāŲ®ŁŲ§ŁŪŲÆ ŲØŚ©ŁŪŲÆŲ"
+
+msgid "Reconnect"
+msgstr "Ų§ŲŖŲµŲ§Ł Ł
Ų¬ŲÆŲÆ"
+
+msgid "Messages"
+msgstr "Ł¾ŪŲŗŲ§Ł
āŁŲ§"
+
+msgid "Profile"
+msgstr "Ł¾Ų±ŁŁŲ§ŪŁ"
+
+msgid "Options"
+msgstr "ŚÆŲ²ŪŁŁāŁŲ§"
+
+msgid "Disconnect"
+msgstr "ŁŲ·Ų¹"
+
+msgid "Filter"
+msgstr "Ł¾Ų§ŁŲ§ŪŁ"
+
+msgid "Add a friend"
+msgstr "Ų§ŁŲ²ŁŲÆŁ ŪŚ© ŲÆŁŲ³ŲŖ"
+
+msgid "Your groupchats"
+msgstr "ŚÆŲ±ŁŁāŁŲ§Ū ŚŲŖ Ų“Ł
Ų§"
+
+msgid "Manage your favorite groupchats"
+msgstr "ŚÆŁŲŖŚÆŁŪ ŚÆŲ±ŁŁŪ Ł
ŲŲØŁŲØŲŖŲ§Ł Ų±Ų§ Ł
ŲÆŪŲ±ŪŲŖ Ś©ŁŪŲÆ"
+
+msgid "More stuff"
+msgstr "ŚŪŲ²ŁŲ§Ū ŲØŪŲ“ŲŖŲ±"
+
+msgid "Show all friends"
+msgstr "Ł
Ų“Ų§ŁŲÆŁ ŁŁ
Ł ŲÆŁŲ³ŲŖŲ§Ł"
+
+msgid "Only show connected friends"
+msgstr "Ł
Ų“Ų§ŁŲÆŁ ŲÆŁŲ³ŲŖŲ§Ł Ų§ŁŁŲ§ŪŁ"
+
+msgid "Message archives"
+msgstr "ŲØŲ§ŪŚÆŲ§ŁŪāŁŲ§Ū Ł¾ŪŲŗŲ§Ł
"
+
+msgid "Date"
+msgstr "ŲŖŲ§Ų±ŪŲ®"
+
+msgid "Please select a friend to view the chat history."
+msgstr ""
+
+msgid "Nothing found for: %s"
+msgstr "ŚŪŲ²Ū ŪŲ§ŁŲŖ ŁŲ“ŲÆ ŲØŲ±Ų§Ū: %s"
+
+msgid "A short message?"
+msgstr "ŪŚ© Ł¾ŪŲŗŲ§Ł
Ś©ŁŲŖŲ§ŁŲ"
+
+msgid "How are you?"
+msgstr "ŚŲ·ŁŲ±ŪŲÆŲ"
+
+msgid "What are you doing?"
+msgstr "ŚŚ©Ų§Ų±Ū Ł
ŪāŚ©ŁŪŲÆŲ"
+
+msgid "Join a chat"
+msgstr "ŁŲ±ŁŲÆ ŲØŁ ŚÆŁŲŖŚÆŁ"
+
+msgid "Status"
+msgstr "ŁŲ¶Ų¹ŪŲŖ"
+
+msgid "Available"
+msgstr "ŲŲ§Ų¶Ų±"
+
+msgid "Talkative"
+msgstr "Ł¾Ų±ŲŲ±Ł"
+
+msgid "Away"
+msgstr "ŲÆŁŲ±"
+
+msgid "Not available"
+msgstr "ŁŲ§ŲŲ§Ų¶Ų±"
+
+msgid "Busy"
+msgstr "Ł
Ų“ŲŗŁŁ"
+
+msgid "Mood"
+msgstr "ŲŲ§ŁŲŖ"
+
+msgid "None"
+msgstr "ŁŪŚ"
+
+msgid "Crazy"
+msgstr "ŲÆŪŁŲ§ŁŁ"
+
+msgid "Excited"
+msgstr "ŁŪŲŲ§Ł Ų²ŲÆŁ"
+
+msgid "Playful"
+msgstr "Ų§ŁŁ ŲØŲ§Ų²Ū"
+
+msgid "Happy"
+msgstr "Ų®ŁŲ“ŲŲ§Ł"
+
+msgid "Shocked"
+msgstr "Ł¾Ų§Ų³Ų® ŁŁ
Ų±Ų§Ł ŲØŲ§ Ų§Ų¹ŁŲ§Ł"
+
+msgid "Hot"
+msgstr "ŲÆŲ§Ųŗ"
+
+msgid "Sad"
+msgstr "ŲŗŁ
ŚÆŪŁ"
+
+msgid "Amorous"
+msgstr "Ų¹Ų§Ų“Ł"
+
+msgid "Confident"
+msgstr "Ų§Ų¹ŲŖŁ
Ų§ŲÆ ŲØŁ ŁŁŲ³"
+
+msgid "Activity"
+msgstr "ŁŲ¹Ų§ŁŪŲŖ"
+
+msgid "Chores"
+msgstr ""
+
+msgid "Drinking"
+msgstr "ŁŁŲ“ŪŲÆŁ"
+
+msgid "Eating"
+msgstr "Ų®ŁŲ±ŲÆŁ"
+
+msgid "Exercising"
+msgstr "ŲŖŁ
Ų±ŪŁāŚ©Ų±ŲÆŁ"
+
+msgid "Grooming"
+msgstr "Ų¢Ų±Ų§Ų³ŲŖŁāŚ©Ų±ŲÆŁ"
+
+msgid "Appointment"
+msgstr "Ų§ŁŲŖŲµŲ§ŲØ"
+
+msgid "Inactive"
+msgstr "ŲŗŪŲ±ŁŲ¹Ų§Ł"
+
+msgid "Relaxing"
+msgstr "Ų¢Ų±Ų§Ł
Ų“"
+
+msgid "Talking"
+msgstr "ŚÆŁŲŖŚÆŁ"
+
+msgid "Traveling"
+msgstr "Ų³ŁŲ± Ś©Ų±ŲÆŁ"
+
+msgid "Working"
+msgstr "Ś©Ų§Ų± Ś©Ų±ŲÆŁ"
+
+msgid "View profile"
+msgstr "ŁŁ
Ų§ŪŲ“ Ł
Ų“Ų®ŲµŲ§ŲŖ"
+
+msgid "Repeat this notice"
+msgstr "ŲŖŚ©Ų±Ų§Ų± Ų§ŪŁ Ł
ŁŲ¶ŁŲ¹"
+
+msgid "Remove this notice"
+msgstr "ŲŲ°Ł Ų§ŪŁ Ł
ŁŲ¶ŁŲ¹"
+
+msgid "Your profile"
+msgstr "Ł
Ų“Ų®ŲµŲ§ŲŖ Ų“Ł
Ų§"
+
+msgid "Identity"
+msgstr "ŁŁŪŲŖ"
+
+msgid "Profile image"
+msgstr "Ł
Ų“Ų®ŲµŲ§ŲŖ Ų“Ł
Ų§"
+
+msgid "Others"
+msgstr "ŲÆŪŚÆŲ±Ų§Ł"
+
+msgid "Personal"
+msgstr "Ų“Ų®ŲµŪ"
+
+msgid "Complete name"
+msgstr "ŁŲ§Ł
Ś©Ų§Ł
Ł"
+
+msgid "Nickname"
+msgstr "ŁŲ§Ł
Ś©Ų§Ų±ŲØŲ±Ū"
+
+msgid "First name"
+msgstr "ŁŲ§Ł
"
+
+msgid "Last name"
+msgstr "ŁŲ§Ł
Ų®Ų§ŁŁŲ§ŲÆŚÆŪ"
+
+msgid "Date of birth"
+msgstr "ŲŖŲ§Ų±ŪŲ® ŲŖŁŁŲÆ"
+
+msgid "Contact"
+msgstr "Ł
Ų“Ų®ŲµŲ§ŲŖ ŲŖŁ
Ų§Ų³"
+
+msgid "E-mail"
+msgstr "Ų§ŪŁ
ŪŁ"
+
+msgid "Phone"
+msgstr "ŲŖŁŁŁ"
+
+msgid "Website"
+msgstr "Ų¢ŲÆŲ±Ų³ ŁŲØ Ų³Ų§ŪŲŖ"
+
+msgid "Current"
+msgstr "ŁŲ§ŲŲÆ Ł¾ŁŁ"
+
+msgid "Delete"
+msgstr "ŲŲ°ŁāŚ©Ų±ŲÆŁ"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "ŚŁ Ł
ŲŖŲ£Ų³Ų± Ś©ŁŁŲÆŁ! Ų“Ł
Ų§ ŲŖŲµŁŪŲ± Ł¾Ų±ŁŁŲ§ŪŁŪ ŲÆŲ± Ś©Ų§Ų±ŲŖ Ų“ŁŲ§Ų³Ų§ŪŪŲŖŲ§Ł ŲŖŲ¹ŪŪŁ ŁŚ©Ų±ŲÆŁāŲ§ŪŲÆ!"
+
+msgid "Address"
+msgstr "ŁŲ“Ų§ŁŪ"
+
+msgid "Street"
+msgstr "Ų®ŪŲ§ŲØŲ§Ł"
+
+msgid "City"
+msgstr "Ų“ŁŲ±"
+
+msgid "Postal code"
+msgstr "Ś©ŲÆ Ł¾Ų³ŲŖŪ"
+
+msgid "Country"
+msgstr "Ś©Ų“ŁŲ±"
+
+msgid "Biography"
+msgstr "Ų²ŁŲÆŚÆŪāŁŲ§Ł
Ł"
+
+msgid "Important notice"
+msgstr "Ų§Ų®Ų·Ų§Ų± Ł
ŁŁ
"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr ""
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr ""
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr ""
+
+msgid "Save"
+msgstr "Ų°Ų®ŪŲ±Ł"
+
+msgid "Cancel"
+msgstr "Ų§ŁŲµŲ±Ų§Ł"
+
+msgid "Edit options"
+msgstr "ŁŪŲ±Ų§ŪŲ“ Ų§Ų®ŲŖŪŲ§Ų±Ų§ŲŖ"
+
+msgid "Channel"
+msgstr "Ś©Ų§ŁŲ§Ł"
+
+msgid "Commands"
+msgstr "ŲÆŲ³ŲŖŁŲ±Ų§ŲŖ"
+
+msgid "Sounds"
+msgstr "ŲµŲÆŲ§ŁŲ§"
+
+msgid "Privacy"
+msgstr "ŲŲ±ŪŁ
Ų®ŲµŁŲµŪ"
+
+msgid "Message archiving"
+msgstr "ŲØŲ§ŪŚÆŲ§ŁŪ Ł¾ŪŲ§Ł
"
+
+msgid "Store a history of your chats"
+msgstr "Ų°Ų®ŪŲ±ŁŁ ŲŖŲ§Ų±ŪŲ®ŚŁŁ ŚÆŁŲŖŚÆŁŁŲ§Ū Ų“Ł
Ų§"
+
+msgid "Geolocation"
+msgstr "Ł
ŁŲ·ŁŁŁ Ų¬ŲŗŲ±Ų§ŁŪŲ§ŪŪ"
+
+msgid "Empty"
+msgstr "Ų®Ų§ŁŪ"
+
+msgid "Empty channel"
+msgstr "Ś©Ų§ŁŲ§Ł Ų®Ų§ŁŪ"
+
+msgid "Persistent"
+msgstr "Ł
Ų§ŁŲÆŚÆŲ§Ų±"
+
+msgid "Maximum notices"
+msgstr "ŲØŪŲ“ŲŖŲ±ŪŁ Ų¢ŚÆŲ§ŁŪāŲÆŲ§ŲÆŁāŁŲ§"
+
+msgid "Account"
+msgstr "ŲŲ³Ų§ŲØ"
+
+msgid "Change password"
+msgstr "ŲŖŲŗŪŪŲ± ŚÆŲ°Ų±ŁŲ§ŚŁ"
+
+msgid "Delete account"
+msgstr "ŲŲ°Ł ŲŲ³Ų§ŲØ"
+
+msgid "Old"
+msgstr "ŁŲÆŪŁ
Ū"
+
+msgid "New (2 times)"
+msgstr "Ų¬ŲÆŪŲÆ (Ū² Ł
Ų±ŲŖŲØŁ)"
+
+msgid "Continue"
+msgstr "Ų§ŲÆŲ§Ł
Ł"
+
+msgid "To"
+msgstr "ŲØŁ"
+
+msgid "Close"
+msgstr "ŲØŲ³ŲŖŁ"
+
+msgid "unknown"
+msgstr "ŁŲ§Ų“ŁŲ§Ų®ŲŖŁ"
+
+msgid "Unavailable"
+msgstr "ŁŲ§Ł
ŁŲ¬ŁŲÆ"
+
+msgid "is now"
+msgstr "Ų§ŁŲ¢Ł ŁŲ³ŲŖ"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr "ŁŲøŁŲ§Ł ŲµŲØŲ± Ś©ŁŪŲÆ ŲŖŲ§ Ų¢ŁŲ§ŲŖŲ§Ų± Ų“Ł
Ų§ ŲØŲ§Ų±ŚÆŲ°Ų§Ų±Ū Ų“ŁŲÆ..."
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "Ų§ŪŁŲ¬Ų§Ų³ŲŖ! ŪŚ© ŲŖŲµŁŪŲ± Ų²ŪŲØŲ§ Ł Ų¬ŲÆŪŲÆ Ł¾Ų±ŁŁŲ§ŪŁ!"
+
+msgid "The image file is not supported or has a bad size."
+msgstr ""
+
+msgid "Reply"
+msgstr "Ł¾Ų§Ų³Ų®"
+
+msgid "Error"
+msgstr "Ų®Ų·Ų§"
+
+msgid "Click here to solve the error"
+msgstr "Ų§ŪŁŲ¬Ų§ Ų±Ų§ ŲØŲ±Ų§Ū ŲŁ Ų§ŪŲ±Ų§ŲÆ Ś©ŁŪŚ© Ś©ŁŪŲÆ"
+
+msgid "You"
+msgstr "Ų“Ł
Ų§"
+
+msgid "Remove"
+msgstr "ŲŲ°Ł"
+
+msgid "Rename"
+msgstr "ŲŖŲŗŪŪŲ± ŁŲ§Ł
"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr ""
+
+msgid "Smiley insertion"
+msgstr "Ų§ŁŲ²ŁŲÆŁ Ų“Ś©ŁŚ©"
+
+msgid "Change style"
+msgstr "ŲŖŲŗŪŪŲ± Ų³ŲØŚ©"
+
+msgid "Text in bold"
+msgstr "Ł
ŲŖŁ Ų¶Ų®ŪŁ
"
+
+msgid "Text in italic"
+msgstr "Ł
ŲŖŁ Ł
ŁŲ±ŲØ"
+
+msgid "Underlined text"
+msgstr "Ł
ŲŖŁ Ų²ŪŲ±Ų®Ų· Ś©Ų“ŪŲÆŁ Ų“ŲÆŁ"
+
+msgid "Save chat"
+msgstr "Ų°Ų®ŪŲ±ŁŁ ŚÆŁŲŖŚÆŁ"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr ""
+
+msgid "This chat is empty!"
+msgstr "Ų§ŪŁ ŚÆŁŲŖŚÆŁ Ų®Ų§ŁŪāŲ§Ų³ŲŖ!"
+
+msgid "Generate file!"
+msgstr "Ų³Ų§Ų®ŲŖŁ Ł¾Ų±ŁŁŲÆŁ!"
+
+msgid "Download file!"
+msgstr "ŲØŲ§Ų±ŚÆŪŲ±Ū Ł¾Ų±ŁŁŲÆŁ!"
+
+msgid "Clean current chat"
+msgstr "Ł¾Ų§Ś©Ų³Ų§Ų²Ū ŚÆŁŲŖŚÆŁŪ ŁŲ¹ŁŪ"
+
+msgid "View chat history"
+msgstr "ŲÆŪŲÆŁ ŲŖŲ§Ų±ŪŲ®ŚŁŁ ŚÆŁŲŖŚÆŁ"
+
+msgid "Show user profile"
+msgstr "ŁŁ
Ų§ŪŲ“ Ł¾Ų±ŁŁŲ§ŪŁ Ś©Ų§Ų±ŲØŲ±Ū"
+
+msgid "Add this contact to your friends"
+msgstr "Ų§ŁŲ²ŁŲÆŁ Ų§ŪŁ ŲŖŁ
Ų§Ų³ ŲØŁ ŲÆŁŲ³ŲŖŲ§Ł Ų“Ł
Ų§"
+
+msgid "Add this groupchat to your favorites"
+msgstr "Ų§ŁŲ²ŁŲÆŁ Ų§ŪŁ ŚÆŁŲŖŚÆŁŪ ŚÆŲ±ŁŁŪ ŲØŁ Ł
ŲŲØŁŲØāŁŲ§ Ų“Ł
Ų§"
+
+msgid "All tabs"
+msgstr "ŁŁ
ŁŁ ŲØŲ±ŚÆŁāŁŲ§"
+
+msgid "Close this tab"
+msgstr "ŲØŲ³ŲŖŁ Ų§ŪŁ ŲØŲ±ŚÆŁ"
+
+msgid "no subject defined for this room."
+msgstr "Ł
ŁŲ¶ŁŲ¹Ū ŲØŲ±Ų§Ū Ų§ŪŁ Ų§ŲŖŲ§Ł ŲŖŲ¹ŪŪŁ ŁŲ“ŲÆŁāŲ§Ų³ŲŖ."
+
+msgid "Administration panel for this room"
+msgstr "Ł¾ŁŁ Ł
ŲÆŪŲ±ŪŲŖŪ Ų§ŪŁ Ų§ŲŖŲ§Ł"
+
+msgid "Moderators"
+msgstr "Ł
ŲÆŪŲ±Ų§Ł"
+
+msgid "Participants"
+msgstr "Ų“Ų±ŪŚ©āŁŲ§"
+
+msgid "Visitors"
+msgstr "ŲØŲ§Ų²ŲÆŪŲÆŚ©ŁŁŲÆŚÆŲ§Ł"
+
+msgid "Manage favorite rooms"
+msgstr "Ł
ŲÆŪŲ±ŪŲŖ Ų§ŲŖŲ§ŁāŁŲ§ Ł
ŲŲØŁŲØ Ų“ŲÆŁ"
+
+msgid "Change favorites"
+msgstr "Ų¹ŁŲ¶āŚ©Ų±ŲÆŁ Ł
ŲŲØŁŲØ Ų“ŲÆŁāŁŲ§"
+
+msgid "Search a room"
+msgstr "Ų¬Ų³ŲŖŲ¬ŁŪ ŪŚ© Ų§ŲŖŲ§Ł"
+
+msgid "Select a favorite"
+msgstr "Ų§ŁŲŖŲ®Ų§ŲØ ŪŚ©Ū Ų§Ų² Ł
ŲŲØŁŲØ Ų“ŲÆŁāŁŲ§"
+
+msgid "Getting the name..."
+msgstr "ŚÆŲ±ŁŲŖŁ ŁŲ§Ł
..."
+
+msgid "Gateway"
+msgstr "ŲÆŲ±ŁŲ§Ų²Ł"
+
+msgid "Name"
+msgstr "ŁŲ§Ł
"
+
+msgid "Room"
+msgstr "Ų§ŲŖŲ§Ł"
+
+msgid "Add"
+msgstr "Ų§ŁŲ²ŁŲÆŁ"
+
+msgid "Edit"
+msgstr "ŁŪŲ±Ų§ŪŲ“"
+
+msgid "Search a room on"
+msgstr ""
+
+msgid "No room found on this server."
+msgstr "Ų§ŲŖŲ§ŁŪ ŲÆŲ± Ų§ŪŁ Ų³Ų±ŁŲ± ŪŲ§ŁŲŖ ŁŲ“ŲÆ."
+
+msgid "Service discovery"
+msgstr "Ų¬Ų³ŲŖŲ¬ŁŪ "
+
+msgid "Server to query"
+msgstr "Ś©Ų§Ų±Ų³Ų§Ų² ŲØŲ±Ų§Ū Ł¾Ų±Ų³āŁŲ¬Ł"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr "Ų“Ų±Ł
ŁŲÆŁ. ŁŁŪ Ł
ŁŲ¬ŁŲÆŪŲŖ ŁŪŚ ŁŲŖŪŲ¬ŁāŲ§Ū Ų±Ų§ ŲØŲ±ŁŚÆŲ±ŲÆŲ§ŁŲÆ!"
+
+msgid "Accounts"
+msgstr "ŲŲ³Ų§ŲØāŁŲ§"
+
+msgid "Authentications"
+msgstr "ŲŖŲµŲÆŪŁŲ§ŲŖ"
+
+msgid "Automation"
+msgstr "Ų®ŁŲÆŚ©Ų§Ų±Ū"
+
+msgid "Clients"
+msgstr "Ł
Ų“ŲŖŲ±ŪāŁŲ§"
+
+msgid "Collaboration"
+msgstr "ŁŁ
Ś©Ų§Ų±Ū"
+
+msgid "Components"
+msgstr "Ų§Ų¬Ų²Ų§Ų”"
+
+msgid "Rooms"
+msgstr "Ų§ŲŖŲ§ŁāŁŲ§"
+
+msgid "Directories"
+msgstr ""
+
+msgid "Gateways"
+msgstr "ŲÆŲ±ŁŲ§Ų²ŁāŁŲ§"
+
+msgid "News"
+msgstr "Ų§Ų®ŲØŲ§Ų±"
+
+msgid "Hierarchy"
+msgstr "Ų³ŁŲ³Ł Ł
Ų±Ų§ŲŖŲØŪ"
+
+msgid "Proxies"
+msgstr "Ł¾Ų±ŁŚ©Ų³ŪāŁŲ§"
+
+msgid "Publication/Subscription"
+msgstr ""
+
+msgid "Storage"
+msgstr "Ų§ŁŲØŲ§Ų±Ł"
+
+msgid "Service offline or broken"
+msgstr ""
+
+msgid "Your inbox"
+msgstr "ŲµŁŲÆŁŁ ŁŲ±ŁŲÆŪ Ų“Ł
Ų§"
+
+msgid "Available actions"
+msgstr "Ų§ŁŲÆŲ§Ł
āŁŲ§ Ł
ŁŲ¬ŁŲÆ"
+
+msgid "Clean"
+msgstr "ŲŖŁ
ŪŲ²"
+
+msgid "New"
+msgstr "Ų¬ŲÆŪŲÆ"
+
+msgid "Received"
+msgstr "ŲÆŲ±ŪŲ§ŁŲŖ Ų“ŲÆŁ"
+
+msgid "Subject"
+msgstr "Ł
ŁŲ¶ŁŲ¹"
+
+msgid "Content"
+msgstr "Ł
ŲŲŖŁŲ§"
+
+msgid "Send message"
+msgstr "ŁŲ±Ų³ŲŖŲ§ŲÆŁ Ł¾ŪŲ§Ł
"
+
+msgid "Your inbox is empty."
+msgstr "ŲµŁŲÆŁŁ ŁŲ±ŁŲÆŪ Ų“Ł
Ų§ Ų®Ų§ŁŪāŲ§Ų³ŲŖ."
+
+msgid "MUC administration"
+msgstr "Ł
ŲÆŪŲ±ŪŲŖ MUC"
+
+msgid "You administrate this room"
+msgstr ""
+
+msgid "Enter new subject"
+msgstr "Ų§ŁŲ²ŁŲÆŁ Ų¹ŁŁŲ§Ł Ų¬ŲÆŪŲÆ"
+
+msgid "Configuration"
+msgstr "Ł¾ŪŚ©Ų±ŲØŁŲÆŪ"
+
+msgid "Authorizations"
+msgstr "Ų§Ų¬Ų§Ų²ŁāŁŲ§"
+
+msgid "Member list"
+msgstr "ŁŁŲ±Ų³ŲŖ Ų¹Ų¶Ł"
+
+msgid "Owner list"
+msgstr "ŁŁŲ±Ų³ŲŖ ŲÆŲ§Ų±ŁŲÆŁ"
+
+msgid "Administrator list"
+msgstr "ŁŁŲ±Ų³ŲŖ Ł
ŲÆŪŲ±Ų§Ł"
+
+msgid "Outcast list"
+msgstr ""
+
+msgid "Add an input"
+msgstr "Ų§ŁŲ²ŁŲÆŁ ŪŚ© ŁŲ±Ų±Ł"
+
+msgid "Destroy this MUC"
+msgstr "ŁŲ§ŲØŁŲÆŲ³Ų§Ų²Ū Ų§ŪŁ MUC"
+
+msgid "Yes, let's do it!"
+msgstr "ŲØŁŁ. ŲØŚÆŲ°Ų§Ų± Ų§ŁŲ¬Ų§Ł
Ų“ ŲÆŁŪŁ
!"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr "ŲÆŁŲ³ŲŖ Ų“Ł
Ų§ ŲØŁ Ł
Ś©Ų§ŁŁ
Ł ŲŖŁŲ¬Ł Ł
ŪāŚ©ŁŁŲÆ."
+
+msgid "Your friend is writing a message..."
+msgstr "ŲÆŁŲ³ŲŖ Ų“Ł
Ų§ ŲÆŲ± ŲŲ§Ł ŁŁŲ“ŲŖŁ ŪŚ© Ł¾ŪŲ§Ł
Ų§Ų³ŲŖ..."
+
+msgid "Your friend stopped writing a message."
+msgstr "ŲÆŁŲ³ŲŖ Ų“Ł
Ų§ Ų§Ų² ŁŁŲ“ŲŖŁ Ł¾ŪŲ§Ł
Ū ŲØŲ§Ų² Ų§ŪŲ³ŲŖŲ§ŲÆ."
+
+msgid "Your friend is doing something else."
+msgstr "ŲÆŁŲ³ŲŖ Ų“Ł
Ų§ Ś©Ų§ ŲÆŪŚÆŲ±Ū Ł
ŪāŚ©ŁŲÆ."
+
+msgid "Your friend closed the chat."
+msgstr "ŲÆŁŲ³ŲŖ Ų“Ł
Ų§ ŚÆŁŲŖŚÆŁ Ų±Ų§ ŲØŲ³ŲŖ."
+
+msgid "Requesting this service..."
+msgstr "ŲÆŲ±Ų®ŁŲ§Ų³ŲŖ Ś©Ų±ŲÆŁ Ų§ŪŁ Ų³Ų±ŁŪŲ³..."
+
+msgid "Loading"
+msgstr "ŲØŲ§Ų±ŚÆŪŲ±Ū"
+
+msgid "joined the chat room"
+msgstr "ŲØŁ Ų§ŲŖŲ§Ł ŚÆŁŲŖŚÆŁ Ł¾ŪŁŲ³ŲŖ"
+
+msgid "left the chat room"
+msgstr "ŲŖŲ±Ś©āŚ©Ų±ŲÆŁ Ų§ŲŖŲ§Ł ŚÆŁŲŖŚÆŁ"
+
+msgid "no status"
+msgstr "ŲØŪāŁŲ¶Ų¹ŪŲŖ"
+
+msgid "has been kicked"
+msgstr "ŲØŪŲ±ŁŁ Ų“ŲÆŁāŲ§Ų³ŲŖ"
+
+msgid "has been banned"
+msgstr "ŲØŲ³ŲŖŁ Ų“ŲÆŁāŲ§Ų³ŲŖ"
+
+msgid "no reason"
+msgstr "ŲØŪāŲÆŁŪŁ"
+
+msgid "Communicate with the entire world!"
+msgstr ""
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr ""
+
+msgid "Hi there!"
+msgstr "Ų³ŁŲ§Ł
!"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr "Ų®ŁŲ“āŲ¢Ł
ŲÆŪŲÆ ŲØŁ %1s. Ā«%2sĀ»"
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr ""
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr ""
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr ""
+
+msgid "Previous"
+msgstr "ŁŲØŁŪ"
+
+msgid "General"
+msgstr "Ų¹Ł
ŁŁ
Ū"
+
+msgid "Advanced"
+msgstr "Ł¾ŪŲ“Ų±ŁŲŖŁ"
+
+msgid "Resource"
+msgstr "Ł
ŁŲØŲ¹"
+
+msgid "Priority"
+msgstr "Ų§ŁŁŁŪŲŖ"
+
+msgid "Low"
+msgstr "Ś©Ł
"
+
+msgid "Medium"
+msgstr "Ł
ŲŖŁŲ³Ų·"
+
+msgid "High"
+msgstr "Ų²ŪŲ§ŲÆ"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr ""
+
+msgid "login page"
+msgstr "ŲµŁŲŁŁ ŁŲ§Ų±ŲÆŲ“ŲÆŁ"
+
+msgid "Share this link with your friends:"
+msgstr "Ų§Ų“ŲŖŲ±Ų§Ś© Ų§ŪŁ Ł¾ŪŁŁŲÆ ŲØŲ§ ŲÆŁŲ³ŲŖŲ§ŁŲŖŲ§Ł:"
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr ""
+
+msgid "Required"
+msgstr "Ł
ŁŲ±ŲÆ ŁŪŲ§Ų²"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr ""
+
+msgid "Manager"
+msgstr "Ł
ŲÆŪŲ±"
+
+msgid "Project"
+msgstr "Ł¾Ų±ŁŚŁ"
+
+msgid "Encrypted"
+msgstr "Ų±Ł
Ų²ŁŚÆŲ§Ų±ŪāŲ“ŲÆŁ"
+
+msgid "Unencrypted"
+msgstr "Ų±Ł
Ų²ŁŚÆŲ§Ų±ŪāŁŲ“ŲÆŁ"
+
+msgid "Where are you?"
+msgstr ""
+
+msgid "What's up with you?"
+msgstr ""
+
+msgid "Fetching the social channel..."
+msgstr ""
+
+msgid "You are synchronized with your network."
+msgstr ""
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr ""
+
+msgid "Media viewer"
+msgstr "ŁŁ
Ų§ŪŲ“ŚÆŲ± Ų±Ų³Ų§ŁŁ"
+
+msgid "Browse"
+msgstr "Ų¬Ų³ŲŖŲ¬Ł"
+
+msgid "Command"
+msgstr "ŲÆŲ³ŲŖŁŲ±"
+
+msgid "Subscribe"
+msgstr "ŲŖŲµŁŪŲØāŚ©Ų±ŲÆŁ"
+
+msgid "Join"
+msgstr "ŁŲµŁāŲ“ŲÆŁ"
+
+msgid "Automatic"
+msgstr "Ų®ŁŲÆŚ©Ų§Ų±"
+
+msgid "Search"
+msgstr "Ų¬Ų³ŲŖŲ¬Ł"
+
+msgid "No result!"
+msgstr "ŲØŪāŁŲŖŪŲ¬Ł!"
+
+msgid "No notifications."
+msgstr ""
+
+msgid "would like to add you as a friend."
+msgstr "ŲÆŁŲ³ŲŖ ŲÆŲ§Ų±ŲÆ Ų“Ł
Ų§ Ų±Ų§ ŲØŁ Ų¹ŁŁŲ§Ł ŪŚ© ŲØŪŲ§ŁŲ²Ų§ŪŲÆ."
+
+msgid "would like you to join this chatroom:"
+msgstr ""
+
+msgid "Do you accept?"
+msgstr "ŁŲØŁŁ Ł
ŪāŚ©ŁŪŲÆŲ"
+
+msgid "Yes"
+msgstr "ŲØŁŁ"
+
+msgid "No"
+msgstr "Ų®ŪŲ±"
+
+msgid "would like to get authorization."
+msgstr "ŲÆŁŲ³ŲŖ ŲÆŲ§Ų±ŲÆ Ś©Ł ŲÆŲ³ŲŖŲ±Ų³Ū ŲØŚÆŪŲ±ŲÆ."
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr ""
+
+msgid "Submit"
+msgstr "Ų§Ų±Ų§Ų¦ŁāŚ©Ų±ŲÆŁ"
+
+msgid "Client"
+msgstr "Ł
Ų“ŲŖŲ±Ū"
+
+msgid "System"
+msgstr "Ų³Ų§Ł
Ų§ŁŁ"
+
+msgid "Local time"
+msgstr "Ų²Ł
Ų§Ł Ł
ŲŁŪ"
+
+msgid "Comments"
+msgstr "ŲŖŁŲ¶ŪŲŲ§ŲŖ"
+
+msgid "User profile"
+msgstr "Ł¾Ų±ŁŁŲ§ŪŁ Ś©Ų§Ų±ŲØŲ±Ū"
+
+msgid "See his/her position on the globe"
+msgstr ""
+
+msgid "Confirm"
+msgstr "ŲŖŲ£ŪŪŲÆ"
+
+msgid "anonymous mode"
+msgstr "ŲŲ§ŁŲŖ ŁŲ§Ų“ŁŲ§Ų³"
+
+msgid "Groups"
+msgstr "ŚÆŲ±ŁŁāŁŲ§"
+
+msgid "Unclassified"
+msgstr "Ų·ŲØŁŁāŲØŁŲÆŪāŁŲ“ŲÆŁ"
+
+msgid "Authorize"
+msgstr "Ų§Ų¬Ų§Ų²ŁāŲÆŲ§ŲÆŁ"
+
+msgid "Ask for authorization"
+msgstr "ŲÆŲ±Ų®ŁŲ§Ų³ŲŖ ŲØŲ±Ų§Ū Ų§Ų¬Ų§Ų²ŁāŲÆŲ§ŲÆŁ"
+
+msgid "Unblock"
+msgstr "ŲØŲ§Ų²Ś©Ų±ŲÆŁ"
+
+msgid "Prohibit"
+msgstr "Ł
ŁŲ¹āŚ©Ų±ŲÆŁ"
+
+msgid "Block"
+msgstr "ŲØŲ³ŲŖŁ"
+
+msgid "Chat"
+msgstr "ŚÆŁŲŖŚÆŁ"
+
+msgid "Groupchat"
+msgstr "ŚÆŲ±ŁŁ ŚÆŁŲŖŚÆŁ"
+
+msgid "Jappix Mobile"
+msgstr "Jappix ŁŁ
Ų±Ų§Ł"
+
+msgid "Desktop"
+msgstr "Ł
ŪŲ²Ś©Ų§Ų±"
+
+msgid "Mobile"
+msgstr "ŚÆŁŲ“Ū ŁŁ
Ų±Ų§Ł"
+
+msgid "Please wait..."
+msgstr "ŁŲ·ŁŲ§Ł ŲµŲØŲ±Ś©ŁŪŲÆ..."
+
+msgid "Please enable JavaScript"
+msgstr "ŁŲ·ŁŲ§Ł Ų¬Ų§ŁŲ§Ų§Ų³Ś©Ų±ŪŁ¾ŲŖ Ų±Ų§ ŁŲ¹Ų§Ł Ś©ŁŪŲÆ"
+
+msgid "Your channel"
+msgstr "Ś©Ų§ŁŲ§Ł Ų“Ł
Ų§"
+
+msgid "Channel of"
+msgstr "Ś©Ų§ŁŲ§Ł"
+
+msgid "More notices..."
+msgstr "Ł¾ŪŲŗŲ§Ł
āŁŲ§Ū ŲØŪŲ“ŲŖŲ±..."
+
+msgid "Attach a file"
+msgstr "Ł
ŲŖŲµŁāŚ©Ų±ŲÆŁ ŪŚ© Ł¾Ų±ŁŁŲÆŁ"
+
+msgid "Send"
+msgstr "Ų§Ų±Ų³Ų§Ł"
+
+msgid "Unattach the file"
+msgstr "Ų¬ŲÆŲ§Ś©Ų±ŲÆŁ Ł¾Ų±ŁŁŲÆŁ"
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr ""
+
+msgid "Authorization failed"
+msgstr "Ų“Ś©Ų³ŲŖ ŲÆŲ± Ų§Ų¬Ų§Ų²ŁāŚÆŪŲ±Ū"
+
+msgid "Registration failed, please choose a different username"
+msgstr ""
+
+msgid "Service unavailable"
+msgstr "Ų®ŲÆŁ
ŲŖ ŁŲ§Ł
ŁŲ¬ŁŲÆ Ų§Ų³ŲŖ"
+
+msgid "Internal server error, try later"
+msgstr "Ų§ŪŲ±Ų§ŲÆ ŲÆŲ§Ų®ŁŪ Ś©Ų§Ų±Ų³Ų§Ų². ŲØŲ¹ŲÆŲ§Ł ŲŖŁŲ§Ų“ Ś©ŁŪŲÆ"
+
+msgid "Your form has been sent."
+msgstr "ŁŲ±Ł
Ų“Ł
Ų§ ŁŲ±Ų³ŲŖŲ§ŲÆŁ Ų“ŲÆŁāŲ§Ų³ŲŖ."
+
+msgid "Application"
+msgstr "ŲØŲ±ŁŲ§Ł
Ł"
+
+msgid "XMPP links"
+msgstr "Ł¾ŪŁŁŲÆ XMPP"
+
+msgid "Open XMPP links with Jappix"
+msgstr ""
+
+msgid "changed the subject to:"
+msgstr ""
+
+msgid "Welcome!"
+msgstr ""
+
+msgid "Friends"
+msgstr ""
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr ""
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr ""
+
+msgid "Enable notification sounds"
+msgstr ""
+
+msgid "Share your position on the globe"
+msgstr ""
+
+msgid "Offline friends"
+msgstr "ŲÆŁŲ³ŲŖŲ§Ł Ų¢ŁŁŲ§ŪŁ"
+
+msgid "Don't hide offline friends"
+msgstr "ŲÆŁŲ³ŲŖŲ§Ł Ų¢ŁŁŲ§ŪŁ Ų±Ų§ Ł
Ų®ŁŪ ŁŚ©Ł"
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr ""
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr ""
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr ""
+
+msgid "Share Jappix on %s"
+msgstr ""
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr ""
+
+msgid "Unknown name"
+msgstr "ŁŲ§Ł
ŁŲ§Ų“ŁŲ§Ų®ŲŖŁ"
+
+msgid "Unknown country"
+msgstr "Ś©Ų“ŁŲ± ŁŲ§Ų“ŁŲ§Ų®ŲŖŁ"
+
+msgid "Click to enable"
+msgstr "Ś©ŁŪŚ© ŲØŲ±Ų§Ū ŁŲ¹Ų§ŁāŲ³Ų§Ų²Ū"
+
+msgid "Click to disable"
+msgstr "Ś©ŁŪŚ© ŲØŲ±Ų§Ū ŲŗŪŲ±ŁŲ¹Ų§ŁāŲ³Ų§Ų²Ū"
+
+msgid "Installation"
+msgstr "ŁŲµŲØ"
+
+msgid "Jappix installation"
+msgstr "ŁŲµŲØ Jappix"
+
+msgid "Welcome to the Jappix installation!"
+msgstr "ŲØŁ ŁŲµŲØ Jappix Ų®ŁŲ“āŲ¢Ł
ŲÆŪŲÆ!"
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr ""
+
+msgid "Let's have a look at the installation steps:"
+msgstr ""
+
+msgid "Welcome"
+msgstr "Ų®ŁŲ“āŲ¢Ł
ŲÆŪŲÆ"
+
+msgid "Storage configuration"
+msgstr "ŲŖŁŲøŪŁ
Ų§ŲŖ ŲŲ§ŁŲøŁ"
+
+msgid "Administrator account"
+msgstr "ŲŲ³Ų§ŲØ Ł
ŲÆŪŲ±"
+
+msgid "Main configuration"
+msgstr "ŲŖŁŲøŪŁ
Ų§ŲŖ Ų§ŲµŁŪ"
+
+msgid "Hosts configuration"
+msgstr "ŲŖŁŲøŪŁ
Ų§ŲŖ Ł
ŪŲ²ŲØŲ§Ł"
+
+msgid "Services installation"
+msgstr "ŁŲµŲØ Ų®ŲÆŁ
Ų§ŲŖ"
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr ""
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr ""
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr ""
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr ""
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr ""
+
+msgid "The folder is writable, you can continue!"
+msgstr "Ł¾ŁŲ“Ł ŁŲ§ŲØŁ ŁŪŲ±Ų§ŪŲ“ Ų§Ų³ŲŖ. Ł
ŪāŲŖŁŲ§ŁŪŲÆ Ų§ŲÆŲ§Ł
Ł ŲÆŁŪŲÆ!"
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr ""
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr ""
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr ""
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr ""
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr ""
+
+msgid "User"
+msgstr "Ś©Ų§Ų±ŲØŲ±"
+
+msgid "Service"
+msgstr "Ų®ŲÆŁ
ŲŖ"
+
+msgid "Service name"
+msgstr "ŁŲ§Ł
Ų®ŲÆŁ
ŲŖ"
+
+msgid "Service description"
+msgstr "ŲŖŁŲ¶ŪŲ Ų®ŲÆŁ
ŲŖ"
+
+msgid "Connection"
+msgstr "Ų§ŲŖŲµŲ§Ł"
+
+msgid "Lock the host"
+msgstr "ŁŁŁāŚ©Ų±ŲÆŁ Ł
ŪŲ²ŲØŲ§Ł"
+
+msgid "Anonymous mode"
+msgstr "ŲŲ§ŁŲŖ ŁŲ§Ų“ŁŲ§Ų³"
+
+msgid "Registration allowed"
+msgstr "Ų«ŲØŲŖāŁŲ§Ł
Ų§Ų¬Ų§Ų²ŁāŲÆŲ§ŲÆŁ Ų“ŲÆŁāŲ§Ų³ŲŖ"
+
+msgid "Use a proxy"
+msgstr "Ų§Ų³ŲŖŁŲ§ŲÆŁ Ų§Ų² Ł¾Ų±Ų§Ś©Ų³Ū"
+
+msgid "Encryption"
+msgstr "Ų±Ł
Ų²ŁŚÆŲ§Ų±Ū"
+
+msgid "HTTPS storage"
+msgstr "Ų§ŁŲØŲ§Ų±ŁŁ HTTPS"
+
+msgid "Force HTTPS"
+msgstr "HTTPS Ų§Ų¬ŲØŲ§Ų±Ū"
+
+msgid "Compression"
+msgstr "ŁŲ“Ų±ŲÆŁāŲ³Ų§Ų²Ū"
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr ""
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr ""
+
+msgid "Main host"
+msgstr "Ł
ŪŲ²ŲØŲ§Ł Ų§ŲµŁŪ"
+
+msgid "Groupchat host"
+msgstr "Ł
ŪŲ²ŲØŲ§Ł ŚÆŁŲŖŚÆŁŪ ŚÆŲ±ŁŁŪ"
+
+msgid "Anonymous host"
+msgstr "Ł
ŪŲ²ŲØŲ§Ł ŁŲ§Ų“ŁŲ§Ų³"
+
+msgid "Directory host"
+msgstr "Ł
ŪŲ²ŲØŲ§Ł Ł¾ŁŲ“Ł"
+
+msgid "BOSH host"
+msgstr ""
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr ""
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr ""
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr ""
+
+msgid "Thanks for using Jappix!"
+msgstr "Ł
Ł
ŁŁŁ ŲØŲ±Ų§Ū Ų§Ų³ŲŖŁŲ§ŲÆŁ Ų§Ų² Jappix!"
+
+msgid "Next"
+msgstr "ŲØŲ¹ŲÆŪ"
+
+msgid "Finish"
+msgstr "ŲŖŁ
Ų§Ł
"
+
+msgid "Check again"
+msgstr "ŲØŲ±Ų±Ų³Ū Ł
Ų¬ŲÆŲÆ"
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr ""
+
+msgid "%s is installed on your system."
+msgstr ""
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr ""
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr "ŲŲÆŲ§Ś©Ų«Ų± Ų§ŁŲÆŲ§Ų²ŁŁ ŲØŲ§Ų±ŚÆŲ°Ų§Ų±Ū PHP Ś©Ų§ŁŪ Ų§Ų³ŲŖ (%s)."
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr ""
+
+msgid "Jappix manager"
+msgstr "Ł
ŲÆŪŲ±ŪŲŖāŚ©ŁŁŲÆŁŁ Jappix"
+
+msgid "Manager access"
+msgstr ""
+
+msgid "Statistics"
+msgstr "Ų¢Ł
Ų§Ų±ŁŲ§"
+
+msgid "Hosts"
+msgstr "Ł
ŪŲ²ŲØŲ§ŁāŁŲ§"
+
+msgid "Design"
+msgstr "Ų·Ų±Ų§ŲŪ"
+
+msgid "Repeat"
+msgstr "ŲŖŚ©Ų±Ų§Ų±"
+
+msgid "All"
+msgstr "ŁŁ
Ł"
+
+msgid "Horizontal"
+msgstr "Ų§ŁŁŪ"
+
+msgid "Vertical"
+msgstr "Ų¹Ł
ŁŲÆŪ"
+
+msgid "Center"
+msgstr "ŁŲ³Ų·"
+
+msgid "Left"
+msgstr "ŚŁ¾"
+
+msgid "Right"
+msgstr "Ų±Ų§Ų³ŲŖ"
+
+msgid "Top"
+msgstr "ŲØŲ§ŁŲ§"
+
+msgid "Bottom"
+msgstr "Ų²ŪŲ±"
+
+msgid "Adapt"
+msgstr "ŲŖŲ·Ų§ŲØŁ"
+
+msgid "Color"
+msgstr "Ų±ŁŚÆ"
+
+msgid "Users"
+msgstr "Ś©Ų§Ų±ŲØŲ±Ų§Ł"
+
+msgid "Updates"
+msgstr ""
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr ""
+
+msgid "Please use the form below to login to the administration panel."
+msgstr ""
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr ""
+
+msgid "Credentials"
+msgstr "Ų§Ų®ŲŖŪŲ§Ų±Ų§ŲŖ"
+
+msgid "You have been logged out. Goodbye!"
+msgstr "Ų“Ł
Ų§ Ų®Ų§Ų±Ų¬ Ų“ŲÆŁāŲ§ŪŲÆ. ŲØŲÆŲ±ŁŲÆ!"
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr ""
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr ""
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr ""
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr ""
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr ""
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr ""
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr ""
+
+msgid "The image could not be received, would you mind retry?"
+msgstr ""
+
+msgid "Your image was added to the list!"
+msgstr ""
+
+msgid "Changes saved!"
+msgstr "ŲŖŲŗŪŪŲ±Ų§ŲŖ Ų°Ų®ŪŲ±Ł Ų“ŲÆ!"
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr ""
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr ""
+
+msgid "Access statistics"
+msgstr ""
+
+msgid "Share statistics"
+msgstr ""
+
+msgid "Other statistics"
+msgstr "Ų³Ų§ŪŲ± Ų¢Ł
Ų§Ų±ŁŲ§"
+
+msgid "January"
+msgstr "ŚŁŲ¦Ł"
+
+msgid "February"
+msgstr "ŁŁŲ±ŪŁ"
+
+msgid "March"
+msgstr "Ł
Ų§Ų±Ų³"
+
+msgid "April"
+msgstr "Ų¢ŁŲ±ŪŁ"
+
+msgid "May"
+msgstr "Ł
Ū"
+
+msgid "June"
+msgstr ""
+
+msgid "July"
+msgstr "Ų¬ŁŁŲ§Ū"
+
+msgid "August"
+msgstr "Ų¢ŚÆŁŲ³ŲŖ"
+
+msgid "September"
+msgstr "Ų³Ł¾ŲŖŲ§Ł
ŲØŲ±"
+
+msgid "October"
+msgstr "Ų§ŁŚ©ŲŖŁŲØŲ±"
+
+msgid "November"
+msgstr "ŁŁŲ§Ł
ŲØŲ±"
+
+msgid "December"
+msgstr "ŲÆŲ³Ų§Ł
ŲØŲ±"
+
+msgid "Monday"
+msgstr "ŲÆŁŲ“ŁŲØŁ"
+
+msgid "Tuesday"
+msgstr "Ų³ŁāŲ“ŁŲØŁ"
+
+msgid "Wednesday"
+msgstr "ŚŁŲ§Ų±Ų“ŲŖŲØŲ¹"
+
+msgid "Thursday"
+msgstr "Ł¾ŁŲ¬āŲ“ŁŲØŁ"
+
+msgid "Friday"
+msgstr "Ų¬Ł
Ų¹Ł"
+
+msgid "Saturday"
+msgstr "Ų“ŁŲØŁ"
+
+msgid "Sunday"
+msgstr "ŪŚ©āŲ“ŁŲØŁ"
+
+msgid "Total"
+msgstr "ŁŁ
Ł"
+
+msgid "Cache"
+msgstr "Ł
ŪŲ§ŁŚÆŪŲ±"
+
+msgid "Logs"
+msgstr "Ų³ŪŲ§ŁŁāŁŲ§"
+
+msgid "Music"
+msgstr "Ų¢ŁŁŚÆ"
+
+msgid "Backgrounds"
+msgstr "Ł¾Ų“ŲŖāŲ²Ł
ŪŁŁāŁŲ§"
+
+msgid "Share"
+msgstr "Ų§Ų“ŲŖŲ±Ų§Ś©"
+
+msgid "Background"
+msgstr "Ł¾Ų“ŲŖāŲ²Ł
ŪŁŁ"
+
+msgid "Notice"
+msgstr "Ų¢ŚÆŁŪ"
+
+msgid "Your design preferences have been saved!"
+msgstr ""
+
+msgid "Please check your inputs: something is missing!"
+msgstr "ŁŲ·ŁŲ§Ł ŁŲ±ŁŲÆŪāŁŲ§Ū Ų®ŁŲÆ Ų±Ų§ ŲØŲ±Ų±Ų³Ū Ś©ŁŪŲÆ: ŚŪŲ²Ū ŚÆŁ
Ų“ŲÆŁ!"
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr ""
+
+msgid "Use default background"
+msgstr "Ų§Ų³ŲŖŁŲ§ŲÆŁ Ų§Ų² Ł¾Ų“ŲŖāŲ²Ł
ŪŁŁŁ Ł¾ŪŲ“āŁŲ±Ų¶"
+
+msgid "Use your own image"
+msgstr ""
+
+msgid "Select a background to use and change the display options."
+msgstr ""
+
+msgid "Use your own color"
+msgstr ""
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr ""
+
+msgid "Manage backgrounds"
+msgstr ""
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr ""
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr ""
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr ""
+
+msgid "Simple notice"
+msgstr ""
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr ""
+
+msgid "Advanced notice"
+msgstr ""
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr ""
+
+msgid "Available updates"
+msgstr ""
+
+msgid "What's new?"
+msgstr ""
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr ""
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr ""
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr ""
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr ""
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr ""
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr ""
+
+msgid "Check for updates"
+msgstr "ŲØŲ±Ų±Ų³Ū ŲØŲ±Ų§Ū ŲØŁāŲ±ŁŲ²Ų±Ų³Ų§ŁŪāŁŲ§"
+
+msgid "Update in progress"
+msgstr "ŲØŁāŲ±ŁŲ²Ų±Ų³Ų§ŁŪ ŲÆŲ± Ų¬Ų±ŪŲ§Ł Ų§Ų³ŲŖ"
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr ""
+
+msgid "The update has failed! Please try again later."
+msgstr ""
+
+msgid "Downloading package..."
+msgstr "ŲØŲ§Ų±ŚÆŪŲ±Ū ŲØŲ³ŲŖŁ..."
+
+msgid "Removing current Jappix system files..."
+msgstr ""
+
+msgid "Extracting package..."
+msgstr "ŲØŲ§Ų²Ś©Ų±ŲÆŁ ŲØŲ³ŲŖŁ..."
+
+msgid "Regenerating storage folder tree..."
+msgstr ""
+
+msgid "Jappix is now up to date!"
+msgstr "Jappix Ų§ŁŲ¢Ł ŲØŁ Ų±ŁŲ² Ų§Ų³ŲŖ!"
+
+msgid "Aborted: socket error!"
+msgstr ""
+
+msgid "Aborted: buffer error!"
+msgstr ""
+
+msgid "Aborted: everything is not writable!"
+msgstr ""
+
+msgid "Aborted: could not extract the package!"
+msgstr ""
+
+msgid "Visits"
+msgstr "ŲØŲ§Ų²ŲÆŪŲÆŁŲ§"
+
+msgid "Daily"
+msgstr "Ų±ŁŲ²Ų§ŁŁ"
+
+msgid "Weekly"
+msgstr "ŁŁŲŖŁāŲ§Ū"
+
+msgid "Monthly"
+msgstr "Ł
Ų§ŁŲ§ŁŁ"
+
+msgid "Yearly"
+msgstr "Ų³Ų§ŁŲ§ŁŁ"
+
+msgid "Size"
+msgstr "Ų§ŁŲÆŲ§Ų²Ł"
+
+msgid "Clean everything"
+msgstr "Ł¾Ų§Ś©Ų³Ų§Ų²Ū ŁŁ
ŁāŚŪŲ²"
+
+msgid "Purge cache"
+msgstr "Ų®Ų§ŁŪāŚ©Ų±ŲÆŁ Ł
ŪŲ§ŁŚÆŪŲ±"
+
+msgid "Purge logs"
+msgstr "Ų®Ų§ŁŪāŚ©Ų±ŲÆŁ Ų³ŪŲ§ŁŁāŁŲ§"
+
+msgid "Purge updates"
+msgstr "Ų®Ų§ŁŪāŚ©Ų±ŲÆŁ ŲØŁāŲ±ŁŲ²Ų±Ų³Ų§ŁŪāŁŲ§"
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr ""
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr ""
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr ""
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr ""
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr ""
+
+msgid "Title"
+msgstr "Ų¹ŁŁŲ§Ł"
+
+msgid "Artist"
+msgstr "Ų¹ŁŁŲ§Ł"
+
+msgid "Album"
+msgstr "Ų¢ŁŲØŁŁ
"
+
+msgid "File"
+msgstr "Ł¾Ų±ŁŁŲÆŁ"
+
+msgid "Upload"
+msgstr "ŲØŲ§Ų±ŚÆŲ°Ų§Ų±Ū"
+
+msgid "The folder is empty."
+msgstr "Ł¾ŁŲ“Ł Ų®Ų§ŁŪ Ų§Ų³ŲŖ."
+
+msgid "The music could not be received, please retry!"
+msgstr "Ų¢ŁŁŚÆ ŁŁ
ŪāŲŖŁŲ§ŁŲÆ ŚÆŲ±ŁŲŖŁ Ų“ŁŲÆ. ŁŲ·ŁŲ§Ł Ł
Ų¬ŲÆŲÆŲ§Ł ŲŖŁŲ§Ų“ Ś©ŁŪŲÆ!"
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr ""
+
+msgid "Your music has been added!"
+msgstr "Ų¢ŁŁŚÆ Ų“Ł
Ų§ Ų§Ų¶Ų§ŁŁ Ų“ŲÆŁāŲ§Ų³ŲŖ!"
+
+msgid "The selected elements have been removed."
+msgstr "Ų¹ŁŲµŲ± Ų§ŁŲŖŲ®Ų§ŲØ Ų“ŲÆŁ ŲŲ°Ł Ų“ŲÆ."
+
+msgid "You must select elements to remove!"
+msgstr ""
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr ""
+
+msgid "Manage"
+msgstr "Ł
ŲÆŪŲ±ŪŲŖ"
+
+msgid "List"
+msgstr "ŁŁŲ±Ų³ŲŖ"
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr ""
+
+msgid "The user has been added!"
+msgstr "Ś©Ų§Ų±ŲØŲ± Ų§Ų¶Ų§ŁŁ Ų“ŲÆŁāŲ§Ų³ŲŖ!"
+
+msgid "The chosen users have been removed."
+msgstr "Ś©Ų§Ų±ŲØŲ±ŁŲ§Ū Ų§ŁŲŖŲ®Ų§ŲØ Ų“ŲÆŁ ŲŲ°Ł Ų“ŲÆŁāŲ§ŁŲÆ."
+
+msgid "You must select one or more users to be removed!"
+msgstr ""
+
+msgid "Yesterday"
+msgstr "ŲÆŪŲ±ŁŲ²"
+
+msgid "%s days ago"
+msgstr "%s Ų±ŁŲ² Ł¾ŪŲ“"
+
+msgid "User currently active"
+msgstr "Ś©Ų§Ų±ŲØŲ± ŁŲ¹Ų§Ł ŲÆŲ± ŲŲ§Ł ŲŲ§Ų¶Ų±"
+
+msgid "Last seen: %s"
+msgstr "Ų¢Ų®Ų±ŪŁ ŲÆŪŲÆŁ Ų“ŲÆŁ: %s"
+
+msgid "Inactive since: %s"
+msgstr "ŲŗŪŲ±ŁŲ¹Ų§Ł Ų§Ų²: %s"
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr ""
+
+msgid "Static content server"
+msgstr "Ś©Ų§Ų±Ų³Ų§Ų² Ł
ŲŲŖŁŪŲ§ŲŖ Ų«Ų§ŲØŲŖ"
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Suggested friends"
+msgstr "ŲÆŁŲ³ŲŖŲ§Ł Ł¾ŪŲ“ŁŁŲ§ŲÆŲ“ŲÆŁ"
+
+msgid "Check all"
+msgstr "Ų§ŁŲŖŲ®Ų§ŲØāŚ©Ų±ŲÆŁ ŁŁ
Ł"
+
+msgid "Uncheck all"
+msgstr "Ų§Ų² Ų§ŁŲŖŲ®Ų§ŲØ ŲÆŲ±Ų¢ŁŲ±ŲÆŁ ŁŁ
Ł"
+
+msgid "Choose"
+msgstr "Ų§ŁŲŖŲ®Ų§ŲØ"
+
+msgid "List name"
+msgstr "ŁŁŲ±Ų³ŲŖ ŁŲ§Ł
"
+
+msgid "Allow"
+msgstr "Ų§Ų¬Ų§Ų²ŁāŲÆŲ§ŲÆŁ"
+
+msgid "Deny"
+msgstr "Ų±ŲÆŚ©Ų±ŲÆŁ"
+
+msgid "Group"
+msgstr "ŚÆŲ±ŁŁ"
+
+msgid "Subscription"
+msgstr "Ų§Ų“ŲŖŲ±Ų§Ś©"
+
+msgid "Both"
+msgstr "ŁŲ±ŲÆŁ"
+
+msgid "From"
+msgstr "Ų§Ų²"
+
+msgid "Everybody"
+msgstr "ŁŁ
Ł"
+
+msgid "Send messages"
+msgstr "Ł¾ŪŲ§Ł
āŁŲ§ Ų±Ų§ ŲØŁŲ±Ų³ŲŖ"
+
+msgid "Send queries"
+msgstr "Ł¾Ų±Ų³āŁŲ¬Ł Ų±Ų§ ŲØŁŲ±Ų³ŲŖ"
+
+msgid "See my status"
+msgstr "ŁŲ¶Ų¹ŪŲŖ Ł
Ł Ų±Ų§ ŲØŲØŪŁ"
+
+msgid "Send his/her status"
+msgstr "ŁŲ¶Ų¹ŪŲŖŲ“ Ų±Ų§ ŲØŁŲ±Ų³ŲŖ"
+
+msgid "Everything"
+msgstr "ŁŁ
ŁāŚŪŲ²"
+
+msgid "Item"
+msgstr "ŁŁŁ
"
+
+msgid "Order"
+msgstr "ŲŖŲ±ŲŖŪŲØ"
+
+msgid "Active for this session"
+msgstr "ŁŲ¹Ų§Ł ŲØŲ±Ų§Ū Ų§ŪŁ ŁŲ“Ų³ŲŖ"
+
+msgid "Always active"
+msgstr "ŁŁ
ŪŲ“Ł ŁŲ¹Ų§Ł"
+
+msgid "User directory"
+msgstr "Ł¾ŁŲ“ŁŁ Ś©Ų§Ų±ŲØŲ±Ū"
+
+msgid "Search a friend"
+msgstr "Ų¬Ų³ŲŖŲ¬ŁŪ ŪŚ© ŲÆŁŲ³ŲŖ"
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr ""
+
+msgid "This is a repeat from %s"
+msgstr "Ų§ŪŁ ŪŚ© ŲŖŚ©Ų±Ų§Ų±Ū Ų§Ų² %s Ų§Ų³ŲŖ."
+
+msgid "Loading comments..."
+msgstr "ŲØŲ§Ų±ŚÆŲ°Ų§Ų±Ū ŲŖŁŲ¶ŪŲŲ§ŲŖ..."
+
+msgid "Type your comment here..."
+msgstr "ŲŖŁŲ¶ŪŲ Ų®ŁŲÆ Ų±Ų§ Ų§ŪŁŲ¬Ų§ ŲØŁŁŪŲ³ŪŲÆ..."
+
+msgid "Could not get the comments!"
+msgstr ""
+
+msgid "Show comments"
+msgstr "ŁŁ
Ų§ŪŲ“ ŲŖŁŲ¶ŪŲŲ§ŲŖ"
+
+msgid "Send him/her a message"
+msgstr ""
+
+msgid "Start a chat with him/her"
+msgstr ""
+
+msgid "Media integration"
+msgstr ""
+
+msgid "Comments locked!"
+msgstr ""
+
+msgid "Type something you want to share with your friends..."
+msgstr ""
+
+msgid "changed his/her nickname to %s"
+msgstr "ŁŲ§Ł
Ł
Ų³ŲŖŲ¹Ų§Ų±Ų“ Ų±Ų§ ŲØŁ %s ŲŖŲŗŪŪŲ± ŲÆŲ§ŲÆ"
+
+msgid "commented an item you follow: ā%sā."
+msgstr ""
+
+msgid "Hide"
+msgstr "Ł
Ų®ŁŪ"
+
+msgid "liked your post: ā%sā."
+msgstr ""
+
+msgid "quoted you somewhere: ā%sā."
+msgstr ""
+
+msgid "published on your wall: ā%sā."
+msgstr ""
+
+msgid "tagged you in a photo (%s)."
+msgstr ""
+
+msgid "tagged you in a video (%s)."
+msgstr ""
+
+msgid "Show"
+msgstr "ŁŁ
Ų§ŪŲ“"
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr ""
+
+msgid "Pubsub host"
+msgstr ""
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr ""
+
+msgid "Manager link"
+msgstr "Ł
ŲÆŪŲ± Ł¾ŪŁŁŲÆ"
+
+msgid "User uploads server"
+msgstr "Ś©Ų§Ų±Ų³Ų§Ų² ŲØŲ§Ų±ŚÆŲ°Ų§Ų±Ū Ś©Ų§Ų±ŲØŲ±"
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Logo"
+msgstr ""
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr ""
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr ""
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr ""
+
+msgid "Your service logo has been successfully changed!"
+msgstr ""
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr ""
+
+msgid "Remove this logo"
+msgstr ""
+
+msgid "View this logo"
+msgstr ""
+
+msgid "Send a file"
+msgstr ""
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr ""
+
+msgid "Groupchats to join"
+msgstr ""
+
+msgid "Purge sent files"
+msgstr ""
+
+msgid "would like to send you a file: ā%sā."
+msgstr ""
+
+msgid "has accepted to received your file: ā%sā."
+msgstr ""
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr ""
+
+msgid "could not receive your file: ā%sā."
+msgstr ""
+
+msgid "has received a file exchange request: ā%sā."
+msgstr ""
+
+msgid "Available shortcuts:"
+msgstr ""
+
+msgid "%s removes the chat logs"
+msgstr ""
+
+msgid "%s joins a groupchat"
+msgstr ""
+
+msgid "%s closes the chat"
+msgstr ""
+
+msgid "%s shows the user profile"
+msgstr ""
+
+msgid "%s sends a message to the room"
+msgstr ""
+
+msgid "%s changes your nickname"
+msgstr ""
+
+msgid "%s sends a message to someone in the room"
+msgstr ""
+
+msgid "%s changes the room topic"
+msgstr ""
+
+msgid "%s kicks an user of the room"
+msgstr ""
+
+msgid "%s bans an user of the room"
+msgstr ""
+
+msgid "%s invites someone to join the room"
+msgstr ""
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr ""
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# French translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:26+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "JavaScript est absent dans votre navigateur, vous ne pourrez donc pas lancer Jappix. Corrigez cela."
+
+msgid "An open social network"
+msgstr "Un rƩseau social libre"
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "Jappix a Ć©tĆ© interrompu par un problĆØme rĆ©seau, un bug ou de mauvais identifiants (vĆ©rifiez-les !). Nous sommes dĆ©solĆ©s pour ce souci."
+
+msgid "The element list on this server could not be obtained!"
+msgstr "La liste des Ć©lĆ©ments prĆ©sents sur ce serveur n'a pas pu ĆŖtre obtenue."
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "Votre mot de passe a Ć©tĆ© changĆ©, vous pouvez maintenant vous connecter Ć votre compte avec vos nouveaux identifiants."
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "Votre compte XMPP a ƩtƩ effacƩ, au revoir !"
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "Vous avez Ć©tĆ© dĆ©connectĆ© avec succĆØs de votre compte XMPP, bonne journĆ©e !"
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "Le salon que vous avez rejoint semble ne pas exister. Pourquoi vous ne le crƩeriez pas ?"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "Le salon a Ć©tĆ© supprimĆ© avec succĆØs, maintenant quelqu'un d'autre pourra le recrĆ©er."
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "L'utilisateur que vous souhaitez joindre n'est actuellement pas prƩsent dans le salon."
+
+msgid "Please enter the group chat address to join."
+msgstr "Veuillez entrer l'adresse du salon Ć rejoindre."
+
+msgid "Please enter your nickname to join %s."
+msgstr "Veuillez entrer votre pseudonyme pour rejoindre %s."
+
+msgid "This room (%s) is protected with a password."
+msgstr "Ce salon (%s) est protƩgƩ par un mot de passe."
+
+msgid "Your browser is out of date!"
+msgstr "Votre navigateur n'est pas Ć jour !"
+
+msgid "Last %s version is better!"
+msgstr "La derniĆØre version de %s est mieux !"
+
+msgid "Login"
+msgstr "Connexion"
+
+msgid "Register"
+msgstr "Inscription"
+
+msgid "Here we go!"
+msgstr "Allons-y !"
+
+msgid "Server"
+msgstr "Serveur"
+
+msgid "Password"
+msgstr "Mot de passe"
+
+msgid "Remember me"
+msgstr "Se souvenir"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "Cet outil a ƩtƩ dƩsactivƩ, vous ne pouvez pas l'utiliser !"
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "Ć cause d'un problĆØme rĆ©seau, vous avez Ć©tĆ© dĆ©connectĆ©. Que voulez-vous faire Ć prĆ©sent ? "
+
+msgid "Reconnect"
+msgstr "Reconnexion"
+
+msgid "Messages"
+msgstr "Messages"
+
+msgid "Profile"
+msgstr "Profil"
+
+msgid "Options"
+msgstr "PrƩfƩrences"
+
+msgid "Disconnect"
+msgstr "DĆ©connexion"
+
+msgid "Filter"
+msgstr "Filtrer"
+
+msgid "Add a friend"
+msgstr "Ajouter un ami"
+
+msgid "Your groupchats"
+msgstr "Vos salons de discussion"
+
+msgid "Manage your favorite groupchats"
+msgstr "GĆ©rer mes salons favoris"
+
+msgid "More stuff"
+msgstr "Plus de choses"
+
+msgid "Show all friends"
+msgstr "Afficher tous les amis"
+
+msgid "Only show connected friends"
+msgstr "N'afficher que les amis en ligne"
+
+msgid "Message archives"
+msgstr "Archives des messages"
+
+msgid "Date"
+msgstr "Date"
+
+msgid "Please select a friend to view the chat history."
+msgstr "SĆ©lectionnez un ami pour voir l'historique de discussion."
+
+msgid "Nothing found for: %s"
+msgstr "Rien de trouvƩ pour : %s"
+
+msgid "A short message?"
+msgstr "Un petit message ?"
+
+msgid "How are you?"
+msgstr "Comment allez-vous ?"
+
+msgid "What are you doing?"
+msgstr "Que faites-vous en ce moment ?"
+
+msgid "Join a chat"
+msgstr "Rejoindre une discussion"
+
+msgid "Status"
+msgstr "Statut"
+
+msgid "Available"
+msgstr "Disponible"
+
+msgid "Talkative"
+msgstr "Bavard(e)"
+
+msgid "Away"
+msgstr "Absent(e)"
+
+msgid "Not available"
+msgstr "Indisponible"
+
+msgid "Busy"
+msgstr "OccupƩ(e)"
+
+msgid "Mood"
+msgstr "Humeur"
+
+msgid "None"
+msgstr "Aucun(e)"
+
+msgid "Crazy"
+msgstr "CinglƩ(e)"
+
+msgid "Excited"
+msgstr "ExcitƩ(e)"
+
+msgid "Playful"
+msgstr "EnjouƩ(e)"
+
+msgid "Happy"
+msgstr "Heureux(se)"
+
+msgid "Shocked"
+msgstr "ChoquƩ(e)"
+
+msgid "Hot"
+msgstr "Bouillant(e)"
+
+msgid "Sad"
+msgstr "Triste"
+
+msgid "Amorous"
+msgstr "Amoureux(se)"
+
+msgid "Confident"
+msgstr "Confiant(e)"
+
+msgid "Activity"
+msgstr "ActivitƩ"
+
+msgid "Chores"
+msgstr "CorvƩes"
+
+msgid "Drinking"
+msgstr "Boit"
+
+msgid "Eating"
+msgstr "Mange"
+
+msgid "Exercising"
+msgstr "S'exerƧant "
+
+msgid "Grooming"
+msgstr "Toilette"
+
+msgid "Appointment"
+msgstr "Rendez-vous"
+
+msgid "Inactive"
+msgstr "Inactif(ve)"
+
+msgid "Relaxing"
+msgstr "Se relaxe"
+
+msgid "Talking"
+msgstr "Discute"
+
+msgid "Traveling"
+msgstr "En voyage"
+
+msgid "Working"
+msgstr "Travaille"
+
+msgid "View profile"
+msgstr "Voir le profil"
+
+msgid "Repeat this notice"
+msgstr "RƩpƩter cet avis"
+
+msgid "Remove this notice"
+msgstr "Effacer cet avis"
+
+msgid "Your profile"
+msgstr "Votre profil"
+
+msgid "Identity"
+msgstr "IdentitƩ"
+
+msgid "Profile image"
+msgstr "Photo de profil"
+
+msgid "Others"
+msgstr "Autres"
+
+msgid "Personal"
+msgstr "Personnel"
+
+msgid "Complete name"
+msgstr "Nom complet"
+
+msgid "Nickname"
+msgstr "Pseudonyme"
+
+msgid "First name"
+msgstr "PrƩnom"
+
+msgid "Last name"
+msgstr "Nom"
+
+msgid "Date of birth"
+msgstr "Anniversaire"
+
+msgid "Contact"
+msgstr "CoordonnƩes"
+
+msgid "E-mail"
+msgstr "Courriel"
+
+msgid "Phone"
+msgstr "TƩlƩphone"
+
+msgid "Website"
+msgstr "Site web"
+
+msgid "Current"
+msgstr "Actuel"
+
+msgid "Delete"
+msgstr "Supprimer"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "Comment Ƨa ? Vous n'avez pas de photo de profil dƩfinie dans votre carte d'identitƩ !"
+
+msgid "Address"
+msgstr "Adresse"
+
+msgid "Street"
+msgstr "Rue"
+
+msgid "City"
+msgstr "Ville"
+
+msgid "Postal code"
+msgstr "Code postal"
+
+msgid "Country"
+msgstr "Pays"
+
+msgid "Biography"
+msgstr "Biographie"
+
+msgid "Important notice"
+msgstr "Important"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr "Soyez prudent par rapport aux informations que vous inscrivez dans votre profil, Ć©tant donnĆ© que ceci peut ĆŖtre accessible de tous (mĆŖme de ceux que vous ne voulez pas)."
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr "Tout n'est pas privƩ sur XMPP, entre autres votre profil public."
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr "Il est fortement recommandĆ© de dĆ©finir une photo de profil (%s maximum), par exemple une photo de vous ou une image vous reprĆ©sentant. Cela vous permet d'ĆŖtre facilement identifiĆ© par vos amis."
+
+msgid "Save"
+msgstr "Enregistrer"
+
+msgid "Cancel"
+msgstr "Annuler"
+
+msgid "Edit options"
+msgstr "Ćditer les options"
+
+msgid "Channel"
+msgstr "Canal"
+
+msgid "Commands"
+msgstr "Commandes"
+
+msgid "Sounds"
+msgstr "Sons"
+
+msgid "Privacy"
+msgstr "Vie privƩe"
+
+msgid "Message archiving"
+msgstr "Archivage des messages"
+
+msgid "Store a history of your chats"
+msgstr "Garder un historique des conversations"
+
+msgid "Geolocation"
+msgstr "GĆ©olocalisation"
+
+msgid "Empty"
+msgstr "Vider"
+
+msgid "Empty channel"
+msgstr "Vider le canal"
+
+msgid "Persistent"
+msgstr "Persistant"
+
+msgid "Maximum notices"
+msgstr "Avis maximum"
+
+msgid "Account"
+msgstr "Compte"
+
+msgid "Change password"
+msgstr "Changer de mot de passe"
+
+msgid "Delete account"
+msgstr "Supprimer le compte"
+
+msgid "Old"
+msgstr "Ancien"
+
+msgid "New (2 times)"
+msgstr "Nouveau (2 fois)"
+
+msgid "Continue"
+msgstr "Continuer"
+
+msgid "To"
+msgstr "Ć"
+
+msgid "Close"
+msgstr "Fermer"
+
+msgid "unknown"
+msgstr "inconnu(e)"
+
+msgid "Unavailable"
+msgstr "DƩconnectƩ(e)"
+
+msgid "is now"
+msgstr "est maintenant"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr "Patientez pendant que votre avatar est envoyƩ..."
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "Et voilĆ ! Une nouvelle photo de profil !"
+
+msgid "The image file is not supported or has a bad size."
+msgstr "Le fichier image n'est pas pris en charge ou est trop gros."
+
+msgid "Reply"
+msgstr "RĆ©pondre"
+
+msgid "Error"
+msgstr "Erreur"
+
+msgid "Click here to solve the error"
+msgstr "Cliquez ici pour rƩsoudre l'erreur"
+
+msgid "You"
+msgstr "Vous"
+
+msgid "Remove"
+msgstr "Enlever"
+
+msgid "Rename"
+msgstr "Renommer"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "Bonjour, je suis %s, je souhaiterais vous ajouter comme ami."
+
+msgid "Smiley insertion"
+msgstr "Insertion d'ƩmoticƓne"
+
+msgid "Change style"
+msgstr "Changer l'apparence"
+
+msgid "Text in bold"
+msgstr "Texte en gras"
+
+msgid "Text in italic"
+msgstr "Texte en italique"
+
+msgid "Underlined text"
+msgstr "Texte soulignƩ"
+
+msgid "Save chat"
+msgstr "Enregistrer la discussion"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr "Cliquez sur le lien suivant pour obtenir l'historique de la discussion. Cliquez Ć nouveau pour le rĆ©cupĆ©rer."
+
+msgid "This chat is empty!"
+msgstr "Cette discussion est vide !"
+
+msgid "Generate file!"
+msgstr "GƩnƩrer le fichier !"
+
+msgid "Download file!"
+msgstr "TƩlƩcharger le fichier !"
+
+msgid "Clean current chat"
+msgstr "Nettoyer la discussion courante"
+
+msgid "View chat history"
+msgstr "Voir l'historique de discussion"
+
+msgid "Show user profile"
+msgstr "Afficher le profil de l'utilisateur"
+
+msgid "Add this contact to your friends"
+msgstr "Ajouter ce contact Ć vos amis"
+
+msgid "Add this groupchat to your favorites"
+msgstr "Ajouter ce salon Ć vos favoris"
+
+msgid "All tabs"
+msgstr "Tous les onglets"
+
+msgid "Close this tab"
+msgstr "Fermer cet onglet"
+
+msgid "no subject defined for this room."
+msgstr "aucun sujet dƩfini pour ce salon."
+
+msgid "Administration panel for this room"
+msgstr "Panneau d'administration du salon"
+
+msgid "Moderators"
+msgstr "ModƩrateurs"
+
+msgid "Participants"
+msgstr "Participants"
+
+msgid "Visitors"
+msgstr "Visiteurs"
+
+msgid "Manage favorite rooms"
+msgstr "GĆ©rer les salons favoris"
+
+msgid "Change favorites"
+msgstr "Modifier les favoris"
+
+msgid "Search a room"
+msgstr "Chercher un salon"
+
+msgid "Select a favorite"
+msgstr "SĆ©lectionnez un favori"
+
+msgid "Getting the name..."
+msgstr "Obtention du nom..."
+
+msgid "Gateway"
+msgstr "Passerelle"
+
+msgid "Name"
+msgstr "Nom"
+
+msgid "Room"
+msgstr "Salon"
+
+msgid "Add"
+msgstr "Ajouter"
+
+msgid "Edit"
+msgstr "Modifier"
+
+msgid "Search a room on"
+msgstr "Rechercher un salon sur"
+
+msgid "No room found on this server."
+msgstr "Aucun salon trouvƩ sur ce serveur."
+
+msgid "Service discovery"
+msgstr "DĆ©couverte des services"
+
+msgid "Server to query"
+msgstr "Serveur Ć interroger"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr "DƩsolƩ, mais l'entitƩ n'a pas retournƩ de rƩsultat !"
+
+msgid "Accounts"
+msgstr "Comptes"
+
+msgid "Authentications"
+msgstr "Authentifications"
+
+msgid "Automation"
+msgstr "Automatismes"
+
+msgid "Clients"
+msgstr "Clients"
+
+msgid "Collaboration"
+msgstr "Collaboration"
+
+msgid "Components"
+msgstr "Composants"
+
+msgid "Rooms"
+msgstr "Salons"
+
+msgid "Directories"
+msgstr "Annuaires"
+
+msgid "Gateways"
+msgstr "Passerelles"
+
+msgid "News"
+msgstr "ActualitƩs"
+
+msgid "Hierarchy"
+msgstr "HiƩrarchie"
+
+msgid "Proxies"
+msgstr "Proxies"
+
+msgid "Publication/Subscription"
+msgstr "Publication/Abonnement"
+
+msgid "Storage"
+msgstr "Stockage"
+
+msgid "Service offline or broken"
+msgstr "Service hors ligne ou cassƩ"
+
+msgid "Your inbox"
+msgstr "Votre boƮte de rƩception"
+
+msgid "Available actions"
+msgstr "Actions disponibles"
+
+msgid "Clean"
+msgstr "Vider"
+
+msgid "New"
+msgstr "Nouveau"
+
+msgid "Received"
+msgstr "ReƧus"
+
+msgid "Subject"
+msgstr "Sujet"
+
+msgid "Content"
+msgstr "Contenu"
+
+msgid "Send message"
+msgstr "Envoyer le message"
+
+msgid "Your inbox is empty."
+msgstr "Votre boƮte de rƩception est vide."
+
+msgid "MUC administration"
+msgstr "Administration d'un MUC"
+
+msgid "You administrate this room"
+msgstr "Vous administrez ce salon"
+
+msgid "Enter new subject"
+msgstr "Entrez le nouveau sujet"
+
+msgid "Configuration"
+msgstr "Configuration"
+
+msgid "Authorizations"
+msgstr "Autorisations"
+
+msgid "Member list"
+msgstr "Liste des membres"
+
+msgid "Owner list"
+msgstr "Liste des propriƩtaires"
+
+msgid "Administrator list"
+msgstr "Liste des administrateurs"
+
+msgid "Outcast list"
+msgstr "Liste des bannis"
+
+msgid "Add an input"
+msgstr "Ajouter un champ"
+
+msgid "Destroy this MUC"
+msgstr "DĆ©truire le MUC"
+
+msgid "Yes, let's do it!"
+msgstr "Oui, dƩtruisons-le !"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr "Votre ami prĆŖte attention Ć la conversation."
+
+msgid "Your friend is writing a message..."
+msgstr "Votre ami est en train de composer un message..."
+
+msgid "Your friend stopped writing a message."
+msgstr "Votre ami a arrĆŖtĆ© d'Ć©crire un message."
+
+msgid "Your friend is doing something else."
+msgstr "Votre ami fait quelque-chose d'autre."
+
+msgid "Your friend closed the chat."
+msgstr "Votre ami a quittƩ la conversation."
+
+msgid "Requesting this service..."
+msgstr "RequĆŖte en cours..."
+
+msgid "Loading"
+msgstr "En attente"
+
+msgid "joined the chat room"
+msgstr "a rejoint le salon"
+
+msgid "left the chat room"
+msgstr "a quittƩ le salon"
+
+msgid "no status"
+msgstr "aucun statut"
+
+msgid "has been kicked"
+msgstr "a ƩtƩ ƩjectƩ"
+
+msgid "has been banned"
+msgstr "a ƩtƩ banni"
+
+msgid "no reason"
+msgstr "pas de raison"
+
+msgid "Communicate with the entire world!"
+msgstr "Communiquez avec le monde entier !"
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr "Entrez en contact avec les millions de personnes qui utilisent le rƩseau XMPP comme vous le faites avec Jappix. Rejoignez-nous et restez libre !"
+
+msgid "Hi there!"
+msgstr "Salut toi !"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr "Bienvenue sur %1s, Ā« %2s Ā»."
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr "Connectez-vous Ć votre compte XMPP existant ou crĆ©ez-en un nouveau gratuitement !"
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr "Jappix est un projet libre de PostPro, une organisation Ć but non lucratif qui nous aide beaucoup."
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr "Connectez-vous Ć votre compte XMPP existant. Vous pouvez aussi utiliser le %s pour rejoindre un salon."
+
+msgid "Previous"
+msgstr "PrƩcƩdent"
+
+msgid "General"
+msgstr "GƩnƩral"
+
+msgid "Advanced"
+msgstr "AvancƩ"
+
+msgid "Resource"
+msgstr "Ressource"
+
+msgid "Priority"
+msgstr "PrioritƩ"
+
+msgid "Low"
+msgstr "Bas"
+
+msgid "Medium"
+msgstr "Moyen"
+
+msgid "High"
+msgstr "Haut"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr "Entrez le salon que vous voulez rejoindre ainsi que votre pseudo. Vous pouvez aussi revenir Ć la %s. "
+
+msgid "login page"
+msgstr "page de connexion"
+
+msgid "Share this link with your friends:"
+msgstr "Partagez ce lien avec vos amis :"
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr "CrƩez un nouveau compte XMPP pour rejoindre vos amis sur votre propre nuage social. C'est super simple !"
+
+msgid "Required"
+msgstr "Requis"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr "Vous avez ƩtƩ inscrit, voici votre adresse XMPP :"
+
+msgid "Manager"
+msgstr "Gestionnaire"
+
+msgid "Project"
+msgstr "Projet"
+
+msgid "Encrypted"
+msgstr "ChiffrƩ"
+
+msgid "Unencrypted"
+msgstr "Non chiffrƩ"
+
+msgid "Where are you?"
+msgstr "OĆ¹ ĆŖtes-vous ?"
+
+msgid "What's up with you?"
+msgstr "Quoi de neuf de votre cƓtƩ ?"
+
+msgid "Fetching the social channel..."
+msgstr "RƩcupƩration du canal social..."
+
+msgid "You are synchronized with your network."
+msgstr "Vous ĆŖtes synchronisĆ©(e) avec votre rĆ©seau."
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr "Impossible d'envoyer des avis, vous ne pouvez qu'en recevoir !"
+
+msgid "Media viewer"
+msgstr "Visualisateur de mƩdias"
+
+msgid "Browse"
+msgstr "Parcourir"
+
+msgid "Command"
+msgstr "Commande"
+
+msgid "Subscribe"
+msgstr "Souscrire"
+
+msgid "Join"
+msgstr "Rejoindre"
+
+msgid "Automatic"
+msgstr "Automatique"
+
+msgid "Search"
+msgstr "Rechercher"
+
+msgid "No result!"
+msgstr "Aucun rƩsultat !"
+
+msgid "No notifications."
+msgstr "Pas de notifications."
+
+msgid "would like to add you as a friend."
+msgstr "voudrait vous ajouter comme ami."
+
+msgid "would like you to join this chatroom:"
+msgstr "voudrait que vous rejoigniez ce salon :"
+
+msgid "Do you accept?"
+msgstr "Acceptez-vous ?"
+
+msgid "Yes"
+msgstr "Oui"
+
+msgid "No"
+msgstr "Non"
+
+msgid "would like to get authorization."
+msgstr "voudrait obtenir une autorisation."
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr "Voulez-vous voir les amis que %s vous suggĆØre ?"
+
+msgid "Submit"
+msgstr "Soumettre"
+
+msgid "Client"
+msgstr "Client"
+
+msgid "System"
+msgstr "SystĆØme"
+
+msgid "Local time"
+msgstr "Heure locale"
+
+msgid "Comments"
+msgstr "Commentaires"
+
+msgid "User profile"
+msgstr "Profil de l'utilisateur"
+
+msgid "See his/her position on the globe"
+msgstr "Afficher sa position sur le globe"
+
+msgid "Confirm"
+msgstr "Confirmez"
+
+msgid "anonymous mode"
+msgstr "mode anonyme"
+
+msgid "Groups"
+msgstr "Groupes"
+
+msgid "Unclassified"
+msgstr "Non classƩs"
+
+msgid "Authorize"
+msgstr "Autoriser"
+
+msgid "Ask for authorization"
+msgstr "Demander l'autorisation"
+
+msgid "Unblock"
+msgstr "DĆ©bloquer"
+
+msgid "Prohibit"
+msgstr "Interdire"
+
+msgid "Block"
+msgstr "Bloquer"
+
+msgid "Chat"
+msgstr "Discussion"
+
+msgid "Groupchat"
+msgstr "Salon de discussion"
+
+msgid "Jappix Mobile"
+msgstr "Jappix Mobile"
+
+msgid "Desktop"
+msgstr "Bureau"
+
+msgid "Mobile"
+msgstr "Mobile"
+
+msgid "Please wait..."
+msgstr "Patientez..."
+
+msgid "Please enable JavaScript"
+msgstr "Veuillez activer JavaScript"
+
+msgid "Your channel"
+msgstr "Votre canal"
+
+msgid "Channel of"
+msgstr "Canal de"
+
+msgid "More notices..."
+msgstr "Plus d'avis..."
+
+msgid "Attach a file"
+msgstr "Attacher un fichier"
+
+msgid "Send"
+msgstr "Envoyer"
+
+msgid "Unattach the file"
+msgstr "DĆ©tacher le fichier"
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr "Une erreur est survenue lors de l'envoi de votre fichier : il peut ĆŖtre trop gros (%s maximum) ou interdit ! "
+
+msgid "Authorization failed"
+msgstr "Ćchec de l'autorisation"
+
+msgid "Registration failed, please choose a different username"
+msgstr "Ćchec de l'inscription, choisissez un pseudo diffĆ©rent"
+
+msgid "Service unavailable"
+msgstr "Service indisponible"
+
+msgid "Internal server error, try later"
+msgstr "Erreur interne du serveur, essayez plus tard"
+
+msgid "Your form has been sent."
+msgstr "Votre formulaire a ƩtƩ soumis."
+
+msgid "Application"
+msgstr "Application"
+
+msgid "XMPP links"
+msgstr "Liens XMPP"
+
+msgid "Open XMPP links with Jappix"
+msgstr "Ouvrir les liens XMPP avec Jappix"
+
+msgid "changed the subject to:"
+msgstr "a changƩ le sujet en :"
+
+msgid "Welcome!"
+msgstr "Bienvenue !"
+
+msgid "Friends"
+msgstr "Amis"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr "Bienvenue sur Jappix, votre propre nuage social !"
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr "Avant de l'utiliser, vous aurez Ć changer quelques paramĆØtres, rechercher vos amis et complĆ©ter votre profil."
+
+msgid "Enable notification sounds"
+msgstr "Activer les sons de notification"
+
+msgid "Share your position on the globe"
+msgstr "Partager votre position sur le globe"
+
+msgid "Offline friends"
+msgstr "Amis hors ligne"
+
+msgid "Don't hide offline friends"
+msgstr "Ne pas masquer les amis hors ligne"
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr "Utilisez cet outil pour retrouver vos amis sur le serveur que vous utilisez, ou ajoutez-les plus tard."
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr "Super boulot ! Maintenant, vous pouvez partager Jappix avec vos amis !"
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr "Quand vous cliquerez sur le bouton d'enregistrement, l'Ć©diteur de profil sera ouvert. Bonne socialisation !"
+
+msgid "Share Jappix on %s"
+msgstr "Partagez Jappix sur %s"
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr "Utilise Jappix, une plateforme sociale ouverte. Je suis %s !"
+
+msgid "Unknown name"
+msgstr "Nom inconnu"
+
+msgid "Unknown country"
+msgstr "Pays inconnu"
+
+msgid "Click to enable"
+msgstr "Cliquez pour activer"
+
+msgid "Click to disable"
+msgstr "Cliquez pour dƩsactiver"
+
+msgid "Installation"
+msgstr "Installation"
+
+msgid "Jappix installation"
+msgstr "Installation de Jappix"
+
+msgid "Welcome to the Jappix installation!"
+msgstr "Bienvenue dans l'installation de Jappix !"
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr "Cet outil vous aidera Ć installer rapidement Jappix, le premier rĆ©seau social complet utilisant XMPP, sur votre serveur. Vous n'avez pas besoin d'avoir de connaissances techniques particuliĆØres.."
+
+msgid "Let's have a look at the installation steps:"
+msgstr "Jetons un coup d'Åil aux Ć©tapes de l'installation :"
+
+msgid "Welcome"
+msgstr "Bienvenue"
+
+msgid "Storage configuration"
+msgstr "Configuration du stockage"
+
+msgid "Administrator account"
+msgstr "Compte administrateur"
+
+msgid "Main configuration"
+msgstr "Configuration principale"
+
+msgid "Hosts configuration"
+msgstr "Configuration des hƓtes"
+
+msgid "Services installation"
+msgstr "Installation des services"
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr "Si la langue courante n'est pas la vƓtre (%1s), vous pouvez faire parler Jappix %2s ce sera sauvegardƩ."
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr "Si vous voulez obtenir de l'aide Ć propos de l'installation et la configuration de Jappix, vous pouvez utiliser notre documentation, disponible Ć :"
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr "Il est temps de crĆ©er votre propre nuage social : rendez-vous Ć l'Ć©tape suivante !"
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr "Jappix stocke les donnƩes persistantes (comme les fichiers partagƩs, les historiques des discussions et sa configuration) dans un dossier de stockage sƩcurisƩ."
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr "Jappix doit pouvoir Ć©crire dans ce dossier pour y crĆ©er ses sous-rĆ©pertoires. S'il ne le peut pas, vous devrez appliquer les droits Ć %1s ou changer le propriĆ©taire Ć %2s (dĆ©pend de votre configuration)."
+
+msgid "The folder is writable, you can continue!"
+msgstr "Le dossier peut ĆŖtre Ć©crit, vous pouvez continuer !"
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix vous offre la possibilitĆ© de gĆ©rer votre configuration, installer des nouveaux modules et rechercher des mises Ć jour. C'est pourquoi vous devez crĆ©er un compte administrateur pour accĆ©der au gestionnaire."
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr "Quand Jappix sera installĆ©, vous n'aurez qu'Ć cliquer sur le lien vers le gestionnaire sur la page d'accueil pour y accĆ©der."
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr "Oups, vous avez oubliƩ quelque-chose ou les deux mots de passe ne correspondent pas !"
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr "Jappix a besoin que vous spƩcifiez quelques valeurs pour qu'il fonctionne. Corrigez les champs suivants (ou conservez les valeurs par dƩfaut, qui sont suffisantes pour la plupart des gens)."
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr "Notez que si vous ne spƩcifiez pas une valeur obligatoire, elle sera automatiquement complƩtƩe par celle par dƩfaut."
+
+msgid "User"
+msgstr "Utilisateur"
+
+msgid "Service"
+msgstr "Service"
+
+msgid "Service name"
+msgstr "Nom du service"
+
+msgid "Service description"
+msgstr "Description du service"
+
+msgid "Connection"
+msgstr "Connexion"
+
+msgid "Lock the host"
+msgstr "VƩrrouiller l'hƓte"
+
+msgid "Anonymous mode"
+msgstr "Mode anonyme"
+
+msgid "Registration allowed"
+msgstr "Inscription autorisƩe"
+
+msgid "Use a proxy"
+msgstr "Utiliser un proxy"
+
+msgid "Encryption"
+msgstr "Chiffrement"
+
+msgid "HTTPS storage"
+msgstr "Stockage en HTTPS"
+
+msgid "Force HTTPS"
+msgstr "Forcer le HTTPS"
+
+msgid "Compression"
+msgstr "Compression"
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr "Cette page vous permet de spĆ©cifier les hĆ“tes par dĆ©faut auxquels Jappix se connectera. Vous pouvez garder les mĆŖmes valeurs et continuer si vous souhaitez utiliser les hĆ“tes du service officiel."
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr "Peut-ĆŖtre que vous ne savez pas ce qu'est un serveur BOSH ? En fait, c'est un relai entre un client Jappix et un serveur XMPP, qui est nĆ©cessaire en raison de limitations techniques."
+
+msgid "Main host"
+msgstr "HĆ“te principal"
+
+msgid "Groupchat host"
+msgstr "HĆ“te de salons"
+
+msgid "Anonymous host"
+msgstr "HĆ“te anonyme"
+
+msgid "Directory host"
+msgstr "HĆ“te d'annuaire"
+
+msgid "BOSH host"
+msgstr "HĆ“te BOSH"
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr "Vous pouvez installer quelques logiciels supplĆ©mentaires sur votre serveur, pour Ć©tendre les fonctionnalitĆ©s de Jappix. Quelques autres pourraient ĆŖtre modifiĆ©s, en raison des restrictions de sĆ©curitĆ© qui sont en place par dĆ©faut."
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr "Pour rĆ©aliser cela, vous devez pouvoir accĆ©der Ć la ligne de commande de votre serveur et y ĆŖtre connectĆ© en tant qu'administrateur. Sachez que cela est facultatif, Jappix fonctionnera sans ces modules, mais quelques-unes de ses fonctionnalitĆ©s seront indisponibles."
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr "AprĆØs avoir terminĆ© l'installation, Jappix va gĆ©nĆ©rer les fichiers de cache. Cela pourra ĆŖtre lent, attendez que l'application soit affichĆ©e et ne pressez aucun bouton."
+
+msgid "Thanks for using Jappix!"
+msgstr "Merci d'utiliser Jappix !"
+
+msgid "Next"
+msgstr "Suivant"
+
+msgid "Finish"
+msgstr "Finir"
+
+msgid "Check again"
+msgstr "VĆ©rifier Ć nouveau"
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr "Le dossier ne peut pas ĆŖtre Ć©crit, appliquez les bonnes permissions au dossier %s."
+
+msgid "%s is installed on your system."
+msgstr "%s est installĆ© sur votre systĆØme."
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr "%1s n'est pas installĆ© sur votre systĆØme, vous devriez installer %2s."
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr "La limite PHP de la taille Ć l'envoi de fichiers est suffisante (%s)."
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr "La limite PHP de la taille Ć l'envoi de fichiers (%1s) n'est pas suffisante, vous devriez la dĆ©finir Ć %2s dans le %3s."
+
+msgid "Jappix manager"
+msgstr "Gestionnaire de Jappix"
+
+msgid "Manager access"
+msgstr "AccĆØs au gestionnaire"
+
+msgid "Statistics"
+msgstr "Statistiques"
+
+msgid "Hosts"
+msgstr "HĆ“tes"
+
+msgid "Design"
+msgstr "Apparence"
+
+msgid "Repeat"
+msgstr "RƩpƩter"
+
+msgid "All"
+msgstr "Tout"
+
+msgid "Horizontal"
+msgstr "Horizontal"
+
+msgid "Vertical"
+msgstr "Vertical"
+
+msgid "Center"
+msgstr "Centrer"
+
+msgid "Left"
+msgstr "Gauche"
+
+msgid "Right"
+msgstr "Droite"
+
+msgid "Top"
+msgstr "Haut"
+
+msgid "Bottom"
+msgstr "Bas"
+
+msgid "Adapt"
+msgstr "Adapter"
+
+msgid "Color"
+msgstr "Couleur"
+
+msgid "Users"
+msgstr "Utilisateurs"
+
+msgid "Updates"
+msgstr "Mises Ć jour"
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr "Ceci est une zone Ć accĆØs limitĆ© : seules les personnes autorisĆ©es peuvent gĆ©rer ce nÅud Jappix."
+
+msgid "Please use the form below to login to the administration panel."
+msgstr "Utilisez le formulaire ci-dessous pour vous connecter au panneau d'administration."
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr "Pour amƩliorer la sƩcuritƩ, les sessions sont limitƩes dans le temps, et quand votre navigateur sera fermƩ, vous serez dƩconnectƩ."
+
+msgid "Credentials"
+msgstr "Identifiants"
+
+msgid "You have been logged out. Goodbye!"
+msgstr "Vous avez ƩtƩ dƩconnectƩ. Au revoir !"
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr "Oups, vous n'avez pas pĆ» ĆŖtre reconnu comme administrateur valide. VĆ©rifiez vos identifiants !"
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr "Des statistiques basiques sont calculĆ©es par Jappix Ć propos de choses relativement importantes, vous pouvez les trouver ci-dessous."
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr "Modifiez la configuration de votre nÅud Jappix avec cet outil."
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr "Modifiez les hĆ“tes XMPP que ce nÅud Jappix peut servir avec cet outil."
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr "Tous les fichiers stockĆ©s de ce nÅud peuvent ĆŖtre gĆ©rĆ©s avec cet outil : sĆ©lectionnez un sous-dossier et commencez Ć Ć©diter son contenu !"
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr "Jappix est entiĆØrement personnalisable : vous pouvez modifier son apparence ici-mĆŖme."
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr "Ce n'est pas une image valide, utilisez du PNG, GIF ou JPG !"
+
+msgid "The image could not be received, would you mind retry?"
+msgstr "L'image n'a pas pĆ» ĆŖtre reƧue, pourriez-vous rĆ©essayer ?"
+
+msgid "Your image was added to the list!"
+msgstr "Votre image a Ć©tĆ© ajoutĆ©e Ć la liste !"
+
+msgid "Changes saved!"
+msgstr "Les changements ont ƩtƩ sauvegardƩs !"
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr "Vous pouvez dĆ©finir plus d'un administrateur pour ce nÅud Jappix. Vous pouvez aussi changer un mot de passe avec cet outil."
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr "Mettez Ć jour votre nÅud Jappix avec cet outil, ou vĆ©rifiez si une nouvelle est disponible. Des informations Ć propos de la derniĆØre version sont aussi affichĆ©es (en anglais)."
+
+msgid "Access statistics"
+msgstr "Statistiques des accĆØs"
+
+msgid "Share statistics"
+msgstr "Statistiques des partages"
+
+msgid "Other statistics"
+msgstr "Autres statistiques"
+
+msgid "January"
+msgstr "Janvier"
+
+msgid "February"
+msgstr "FĆ©vrier"
+
+msgid "March"
+msgstr "Mars"
+
+msgid "April"
+msgstr "Avril"
+
+msgid "May"
+msgstr "Mai"
+
+msgid "June"
+msgstr "Juin"
+
+msgid "July"
+msgstr "Juillet"
+
+msgid "August"
+msgstr "Aoƻt"
+
+msgid "September"
+msgstr "Septembre"
+
+msgid "October"
+msgstr "Octobre"
+
+msgid "November"
+msgstr "Novembre"
+
+msgid "December"
+msgstr "DĆ©cembre"
+
+msgid "Monday"
+msgstr "Lundi"
+
+msgid "Tuesday"
+msgstr "Mardi"
+
+msgid "Wednesday"
+msgstr "Mercredi"
+
+msgid "Thursday"
+msgstr "Jeudi"
+
+msgid "Friday"
+msgstr "Vendredi"
+
+msgid "Saturday"
+msgstr "Samedi"
+
+msgid "Sunday"
+msgstr "Dimanche"
+
+msgid "Total"
+msgstr "Total"
+
+msgid "Cache"
+msgstr "Cache"
+
+msgid "Logs"
+msgstr "Historiques"
+
+msgid "Music"
+msgstr "Musique"
+
+msgid "Backgrounds"
+msgstr "Fonds"
+
+msgid "Share"
+msgstr "Partage"
+
+msgid "Background"
+msgstr "Fond"
+
+msgid "Notice"
+msgstr "Annonce"
+
+msgid "Your design preferences have been saved!"
+msgstr "Vos prƩfƩrences d'apparence ont ƩtƩ enregistrƩes !"
+
+msgid "Please check your inputs: something is missing!"
+msgstr "Veuillez vƩrifier vos champs : quelque-chose manque !"
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr "Changez l'apparence de votre nÅud Jappix avec cet outil. Vous pouvez soit dĆ©finir une couleur personnalisĆ©e, soit envoyer une image. Laissez votre crĆ©ativitĆ© s'exprimer !"
+
+msgid "Use default background"
+msgstr "Utiliser le fond par dƩfaut"
+
+msgid "Use your own image"
+msgstr "Utiliser votre propre image"
+
+msgid "Select a background to use and change the display options."
+msgstr "SĆ©lectionnez un fond Ć utiliser et modifiez les options d'affichage."
+
+msgid "Use your own color"
+msgstr "Utiliser votre propre couleur"
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr "Entrez la valeur hexadƩcimale de la couleur que vous voulez utiliser comme fond."
+
+msgid "Manage backgrounds"
+msgstr "GĆ©rer les fonds"
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr "Vous pouvez ajouter un nouveau fond Ć la liste avec cet outil. Veillez Ć envoyer une image valide."
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr "Si vous voulez enlever des fonds, utilisez le navigateur ci-dessous."
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr "DƩfinissez, avec cet outil, une annonce de page d'accueil pour tous vos utilisateurs, comme un avertissement, un message important ou une publicitƩ."
+
+msgid "Simple notice"
+msgstr "Annonce simple"
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr "Cette annonce ne nĆ©cessite qu'un texte simple pour ĆŖtre affichĆ©, mais aucun code n'est autorisĆ© !"
+
+msgid "Advanced notice"
+msgstr "Annonce avancƩe"
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr "Vous pouvez personnaliser votre annonce avec du code intƩgrƩ (HTML, CSS et JS), mais vous devez coder l'apparence."
+
+msgid "Available updates"
+msgstr "Mises Ć jour disponibles"
+
+msgid "What's new?"
+msgstr "Quoi de nouveau ?"
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr "Vos dossiers de stockage ne peuvent ĆŖtre Ć©crits, pourriez-vous appliquer les bons droits ?"
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr "%1s pourrait causer des problĆØmes au proxy, veuillez augmenter la valeur de %2s Ć %3s !"
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr "Vous utilisez une version de dĆ©veloppement de Jappix. Mettez-la Ć jour Ć travers notre dĆ©pĆ“t en exĆ©cutant : %s. "
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr "Une nouvelle version de Jappix est disponible ! Jetez un coup d'Åil Ć ce qui est nouveau et lancez la mise Ć jour !"
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr "Votre version n'est pas Ć jour. Mettez-la Ć niveau maintenant vers %s en cliquant ici !"
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr "Votre version semble ĆŖtre Ć jour, mais vous pouvez vĆ©rifier les mises Ć jour manuellement en cliquant ici."
+
+msgid "Check for updates"
+msgstr "Rechercher des mises Ć jour"
+
+msgid "Update in progress"
+msgstr "Mise Ć jour en cours"
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr "Jappix a Ć©tĆ© mis Ć jour : vous utilisez Ć prĆ©sent la derniĆØre version. Amusez-vous bien !"
+
+msgid "The update has failed! Please try again later."
+msgstr "La mise Ć jour a Ć©chouĆ© ! Veuillez rĆ©essayer plus tard."
+
+msgid "Downloading package..."
+msgstr "TƩlƩchargement du paquet..."
+
+msgid "Removing current Jappix system files..."
+msgstr "Suppression des fichiers systĆØmes de Jappix..."
+
+msgid "Extracting package..."
+msgstr "Extraction du paquet..."
+
+msgid "Regenerating storage folder tree..."
+msgstr "RegƩnƩration de l'arbre de stockage..."
+
+msgid "Jappix is now up to date!"
+msgstr "Jappix est maintenant Ć jour !"
+
+msgid "Aborted: socket error!"
+msgstr "AvortƩ : erreur de connexion !"
+
+msgid "Aborted: buffer error!"
+msgstr "AvortƩ : erreur de tampon !"
+
+msgid "Aborted: everything is not writable!"
+msgstr "AvortĆ© : tout ne peut ĆŖtre Ć©crit !"
+
+msgid "Aborted: could not extract the package!"
+msgstr "AvortĆ© : paquet impossible Ć extraire !"
+
+msgid "Visits"
+msgstr "Visites"
+
+msgid "Daily"
+msgstr "Quotidien"
+
+msgid "Weekly"
+msgstr "Hebdomadaire"
+
+msgid "Monthly"
+msgstr "Mensuel"
+
+msgid "Yearly"
+msgstr "Annuelle"
+
+msgid "Size"
+msgstr "Taille"
+
+msgid "Clean everything"
+msgstr "Tout nettoyer"
+
+msgid "Purge cache"
+msgstr "Purger le cache"
+
+msgid "Purge logs"
+msgstr "Purger les historiques"
+
+msgid "Purge updates"
+msgstr "Purger les mises Ć jour"
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr "Le dossier de stockage que vous vouliez nettoyer est maintenant vide !"
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr "Gardez votre nÅud Jappix frais et rapide, nettoyez les dossiers de stockage rĆ©guliĆØrement !"
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr "Envoyez votre musique (Ogg Vorbis, MP3 ou WAV) pour pouvoir l'Ć©couter depuis Jappix !"
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr "Le fichier que vous souhaitez envoyer doit ĆŖtre plus petit que %s."
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr "Restez informƩ de ce que vos utilisateurs stockent sur votre serveur, et supprimez le contenu indƩsirable avec cet outil."
+
+msgid "Title"
+msgstr "Titre"
+
+msgid "Artist"
+msgstr "Artiste"
+
+msgid "Album"
+msgstr "Album"
+
+msgid "File"
+msgstr "Fichier"
+
+msgid "Upload"
+msgstr "Envoyer"
+
+msgid "The folder is empty."
+msgstr "Le dossier est vide."
+
+msgid "The music could not be received, please retry!"
+msgstr "La musique n'a pas pĆ» ĆŖtre reƧue, veuillez rĆ©essayer !"
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr "Ce n'est pas un fichier musical valide, encodez-le en Ogg Vorbis, MP3 ou WAV !"
+
+msgid "Your music has been added!"
+msgstr "Votre musique a ƩtƩ ajoutƩe !"
+
+msgid "The selected elements have been removed."
+msgstr "Les ƩlƩments sƩlectionnƩs ont ƩtƩ enlevƩs."
+
+msgid "You must select elements to remove!"
+msgstr "Vous devez sĆ©lectionner des Ć©lĆ©ments Ć effacer !"
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr "Ajoutez un nouvel utilisateur avec cet outil, ou changez un mot de passe (entrez un nom d'utilisateur existant). Veillez Ć utiliser un mot de passe fort !"
+
+msgid "Manage"
+msgstr "GĆ©rer"
+
+msgid "List"
+msgstr "Liste"
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr "Supprimez des utilisateurs avec cet outil. Notez que vous ne pouvez pas supprimer un utilisateur s'il est le seul restant."
+
+msgid "The user has been added!"
+msgstr "L'utilisateur a ƩtƩ ajoutƩ !"
+
+msgid "The chosen users have been removed."
+msgstr "Les utilisateurs sƩlectionnƩs ont ƩtƩ enlevƩs."
+
+msgid "You must select one or more users to be removed!"
+msgstr "Vous devez sĆ©lectionner un ou plusieurs utilisateurs Ć enlever !"
+
+msgid "Yesterday"
+msgstr "Hier"
+
+msgid "%s days ago"
+msgstr "Il y a %s jours"
+
+msgid "User currently active"
+msgstr "Utilisateur actuellement actif"
+
+msgid "Last seen: %s"
+msgstr "DerniĆØrement vu(e) : %s"
+
+msgid "Inactive since: %s"
+msgstr "Inactif depuis : %s"
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr "Votre ami(e) n'a pas l'air d'avoir reƧu(e) votre/vos messages(s) !"
+
+msgid "Static content server"
+msgstr "Serveur de contenu statique"
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr "Ceci est le serveur de contenu statique pour %1s, Ā« %2s Ā»."
+
+msgid "Suggested friends"
+msgstr "Amis suggƩrƩs"
+
+msgid "Check all"
+msgstr "Tout cocher"
+
+msgid "Uncheck all"
+msgstr "Tout dƩcocher"
+
+msgid "Choose"
+msgstr "Choisir"
+
+msgid "List name"
+msgstr "Nom de liste"
+
+msgid "Allow"
+msgstr "Autoriser"
+
+msgid "Deny"
+msgstr "Interdire"
+
+msgid "Group"
+msgstr "Groupe"
+
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgid "Both"
+msgstr "Les deux"
+
+msgid "From"
+msgstr "De"
+
+msgid "Everybody"
+msgstr "Tout le monde"
+
+msgid "Send messages"
+msgstr "Envoyer des messages"
+
+msgid "Send queries"
+msgstr "Envoyer des requĆŖtes"
+
+msgid "See my status"
+msgstr "Voir mon statut"
+
+msgid "Send his/her status"
+msgstr "Envoyer son statut"
+
+msgid "Everything"
+msgstr "Tout"
+
+msgid "Item"
+msgstr "ĆlĆ©ment"
+
+msgid "Order"
+msgstr "Ordre"
+
+msgid "Active for this session"
+msgstr "Actif pour cette session"
+
+msgid "Always active"
+msgstr "Toujours actif"
+
+msgid "User directory"
+msgstr "Annuaire des utilisateurs"
+
+msgid "Search a friend"
+msgstr "Chercher un ami"
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr "La fonction demandĆ©e n'est pas implĆ©mentĆ©e par l'entitĆ© de destination, et n'a donc pas pu ĆŖtre traitĆ©e."
+
+msgid "This is a repeat from %s"
+msgstr "C'est une rƩpƩtition depuis %s"
+
+msgid "Loading comments..."
+msgstr "Chargement des commentaires..."
+
+msgid "Type your comment here..."
+msgstr "Entrez votre commentaire..."
+
+msgid "Could not get the comments!"
+msgstr "Commentaires non rƩcupƩrƩs !"
+
+msgid "Show comments"
+msgstr "Afficher les commentaires"
+
+msgid "Send him/her a message"
+msgstr "Lui envoyer un message"
+
+msgid "Start a chat with him/her"
+msgstr "Commencer une discussion avec lui/elle"
+
+msgid "Media integration"
+msgstr "IntƩgration des mƩdias"
+
+msgid "Comments locked!"
+msgstr "Commentaires verrouillƩs !"
+
+msgid "Type something you want to share with your friends..."
+msgstr "Entrez quelque-chose que vous souhaitez partager avec vos amis..."
+
+msgid "changed his/her nickname to %s"
+msgstr "porte %s comme nouveau pseudo"
+
+msgid "commented an item you follow: ā%sā."
+msgstr "a commentĆ© un Ć©lĆ©ment que vous suivez : Ā« %s Ā»."
+
+msgid "Hide"
+msgstr "Masquer"
+
+msgid "liked your post: ā%sā."
+msgstr "a aimĆ© votre publication : Ā« %s Ā»."
+
+msgid "quoted you somewhere: ā%sā."
+msgstr "vous a citĆ© quelque-part : Ā« %s Ā»."
+
+msgid "published on your wall: ā%sā."
+msgstr "a publiĆ© sur votre mur : Ā« %s Ā»."
+
+msgid "tagged you in a photo (%s)."
+msgstr "vous a marquƩ dans une photo (%s)."
+
+msgid "tagged you in a video (%s)."
+msgstr "vous a marquƩ dans une vidƩo (%s)."
+
+msgid "Show"
+msgstr "Afficher"
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr "Besoin d'aide ? Vous feriez mieux de lire notre page de documentation Ć propos de comment complĆ©ter ce formulaire !"
+
+msgid "Pubsub host"
+msgstr "HĆ“te Pubsub"
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr "Jappix est une plateforme sociale gĆ©niale, accessible de n'importe oĆ¹, n'importe quand, et qui vous permet de communiquer avec qui vous voulez. "
+
+msgid "Manager link"
+msgstr "Lien du gestionnaire"
+
+msgid "User uploads server"
+msgstr "Serveur d'envois des utilisateurs"
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr "Ceci est le serveur d'envois des utilisateurs pour %1s, Ā« %2s Ā»."
+
+msgid "Logo"
+msgstr "Logo"
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr "Vous pouvez appliquez votre propre logo pour votre service et ainsi remplacer celui par dĆ©faut. Faites attention Ć la taille et la couleur dominante de chaque logo !"
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr "Envoyez chaque logo avec la taille maximum en pixel que nous vous recommandons."
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr "Ce n'est pas une image valide, veuillez utiliser le format PNG !"
+
+msgid "Your service logo has been successfully changed!"
+msgstr "Le logo de votre service a Ć©tĆ© changĆ© avec succĆØs !"
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr "Le format de votre logo doit ĆŖtre PNG. Laissez un champ vide et le logo correspondant ne sera pas changĆ©."
+
+msgid "Remove this logo"
+msgstr "Supprimer ce logo"
+
+msgid "View this logo"
+msgstr "Visualiser ce logo"
+
+msgid "Send a file"
+msgstr "Envoi d'un fichier"
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr "Une fois envoyĆ©, votre ami sera invitĆ© Ć tĆ©lĆ©charger le fichier."
+
+msgid "Groupchats to join"
+msgstr "Salons Ć rejoindre"
+
+msgid "Purge sent files"
+msgstr "Purger les fichiers envoyƩs"
+
+msgid "would like to send you a file: ā%sā."
+msgstr "voudrait vous envoyer un fichier : Ā« %s Ā»."
+
+msgid "has accepted to received your file: ā%sā."
+msgstr "a acceptĆ© de recevoir votre fichier : Ā« %s Ā»."
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr "a refusĆ© de recevoir votre fichier : Ā« %s Ā»."
+
+msgid "could not receive your file: ā%sā."
+msgstr "n'a pas pu recevoir votre fichier : Ā« %s Ā»."
+
+msgid "has received a file exchange request: ā%sā."
+msgstr "a reƧu une demande d'Ć©change de fichier : Ā« %s Ā»."
+
+msgid "Available shortcuts:"
+msgstr "Raccourcis disponibles :"
+
+msgid "%s removes the chat logs"
+msgstr "%s efface l'historique de la discussion"
+
+msgid "%s joins a groupchat"
+msgstr "%s rejoint un salon"
+
+msgid "%s closes the chat"
+msgstr "%s ferme la discussion"
+
+msgid "%s shows the user profile"
+msgstr "%s affiche le profil de l'utilisateur"
+
+msgid "%s sends a message to the room"
+msgstr "%s envoie un message au salon"
+
+msgid "%s changes your nickname"
+msgstr "%s modifie votre pseudonyme"
+
+msgid "%s sends a message to someone in the room"
+msgstr "%s envoie un message Ć quelqu'un du salon"
+
+msgid "%s changes the room topic"
+msgstr "%s modifie le sujet du salon"
+
+msgid "%s kicks an user of the room"
+msgstr "%s Ć©jecte un utilisateur du salon"
+
+msgid "%s bans an user of the room"
+msgstr "%s banni un utilisateur du salon"
+
+msgid "%s invites someone to join the room"
+msgstr "%s invite quelqu'un Ć rejoindre le salon"
+
+msgid "Social channel, chat and more."
+msgstr "Canal social, tchat et plus."
+
+msgid "Create your public profile."
+msgstr "CrƩez votre profil public."
+
+msgid "A mini-chat for your website."
+msgstr "Un mini-tchat pour votre site."
+
+msgid "Get Jappix, get support."
+msgstr "Obtenez Jappix, recevez de l'aide."
+
+msgid "Statistics around Jappix."
+msgstr "Statistiques sur Jappix."
+
+msgid "Download Jappix for free."
+msgstr "TƩlƩchargez gratuitement Jappix."
+
+msgid "Find a public Jappix node."
+msgstr "Trouvez un nÅud Jappix public."
+
+msgid "Public profile"
+msgstr "Profil public"
+
+msgid "Your profile anywhere on the Web."
+msgstr "Votre profil partout sur le Web."
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr "%s est un service de Jappix.com qui rend votre profil XMPP public. Il est plus facile de le partager. Aucun compte XMPP n'est requis pour voir votre canal social, votre position actuelle et vos informations de contact."
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr "De plus, chaque photo que vous publiez dans votre canal social est ajoutĆ©e Ć un magnifique journal de vos photos. Vous pouvez Ć prĆ©sent voir les photos que vous avez partagĆ©es annĆ©e par annĆ©e."
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr "Vous pouvez aussi utiliser votre avatar XMPP comme un avatar unique pour tout site, blog et forum que vous utilisez. Quand vous le changez sur XMPP, le nouvel avatar apparaƮt partout. Quelle innovation gƩniale !"
+
+msgid "Yay, let's create my public profile!"
+msgstr "Ouais, crƩons mon profil public !"
+
+msgid "Enable my public profile"
+msgstr "Activer mon profil public"
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr "Jappix est une plateforme sociale Ć but non lucratif, accessible n'importe oĆ¹, n'importe quand pour communiquer avec qui vous voulez."
+
+#~ msgid "See"
+#~ msgstr "Voir"
+
+#~ msgid "Use default logo"
+#~ msgstr "Utiliser le logo par dƩfaut"
+
+#~ msgid "Use your own logo"
+#~ msgstr "Utiliser votre propre logo"
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr "Le format d'image recommandƩ est PNG. Laisser un champ vide ne changera pas le logo correspondant."
--- /dev/null
+# Hungarian translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:41+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "A JavaScript hiĆ”nyzik a bƶngĆ©szÅdbÅl, anĆ©lkĆ¼l nem tudod hasznĆ”lni a Jappixot! KĆ©rlek javĆtsd."
+
+msgid "An open social network"
+msgstr "A nyĆlt szociĆ”lis hĆ”lĆ³zat."
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "A Jappix hĆ”lĆ³zati problĆ©ma miatt megszakadt, hiba vagy rossz bejelentkezĆ©s (ellenÅrĆzd helyesen tƶltƶtted-e ki az adatokat). ElnĆ©zĆ©st a kellemetlensĆ©gĆ©rt!"
+
+msgid "The element list on this server could not be obtained!"
+msgstr "Az elemek listĆ”ja ezen a szerveren nem elĆ©rhetÅ!"
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "A jelszavad megvĆ”ltozott. MostmĆ”r be tudsz jelentkezni a fiĆ³kodba az Ćŗj adatokkal."
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "Az XMPP fiĆ³kod tƶrƶlve, szia!"
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "Sikeresen kijelentkeztĆ©l az XMPP fiĆ³kodbĆ³l, tovĆ”bbi kellemes napot!"
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "A szoba ahova csatlakoztĆ”l mĆ©g nem lĆ©tezik. ElÅbb lĆ©tre kell hoznod!"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "A csoportos beszƩlgetƩst tƶrƶltƩk, most valaki mƔs lƩtre tudja hozni."
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "A felhasznĆ”lĆ³ akit keresel, nincs a szobĆ”ban!"
+
+msgid "Please enter the group chat address to join."
+msgstr "KĆ©rlek add meg a csoportos beszĆ©lgetĆ©s cĆmĆ©t a csatlakozĆ”shoz."
+
+msgid "Please enter your nickname to join %s."
+msgstr "Adj meg egy becenevet, hogy belƩpj a %s szobƔba."
+
+msgid "This room (%s) is protected with a password."
+msgstr "Ez a szoba (%s) jelszĆ³val vĆ©dett."
+
+msgid "Your browser is out of date!"
+msgstr "A bƶngĆ©szÅd rĆ©gi, elavult."
+
+msgid "Last %s version is better!"
+msgstr "Az utolsĆ³ %s verziĆ³ jobb!"
+
+msgid "Login"
+msgstr "BejelentkezƩs"
+
+msgid "Register"
+msgstr "RegisztrĆ”ciĆ³"
+
+msgid "Here we go!"
+msgstr "Indulhatunk is!"
+
+msgid "Server"
+msgstr "Szerver"
+
+msgid "Password"
+msgstr "JelszĆ³"
+
+msgid "Remember me"
+msgstr "EmlƩkezz rƔm"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "Ez az eszkƶz le van tiltva, nem tudod hasznƔlni!"
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "HĆ”lĆ³zati hiba miatt a kapcsolat megszakadt. Most mit szeretnĆ©l tenni?"
+
+msgid "Reconnect"
+msgstr "ĆjrakapcsolĆ³dĆ”s"
+
+msgid "Messages"
+msgstr "Ćzenetek"
+
+msgid "Profile"
+msgstr "Profil"
+
+msgid "Options"
+msgstr "BeĆ”llĆtĆ”sok"
+
+msgid "Disconnect"
+msgstr "KijelentkezƩs"
+
+msgid "Filter"
+msgstr "SzűrÅ"
+
+msgid "Add a friend"
+msgstr "BarƔt hozzƔadƔsa"
+
+msgid "Your groupchats"
+msgstr "Csoportos beszƩlgetƩseid"
+
+msgid "Manage your favorite groupchats"
+msgstr "A kedvenc csoportos beszƩlgetƩseid menedzselƩse"
+
+msgid "More stuff"
+msgstr "Tƶbb dolog"
+
+msgid "Show all friends"
+msgstr "Minden barƔt mutatƔsa"
+
+msgid "Only show connected friends"
+msgstr "Csak a csatlakozott barƔtok mutatƔsa"
+
+msgid "Message archives"
+msgstr "ArchivĆ”lt Ć¼zenetek"
+
+msgid "Date"
+msgstr "DƔtum"
+
+msgid "Please select a friend to view the chat history."
+msgstr "KĆ©rlek vĆ”lassz ki egy barĆ”tot, hogy lĆ”sd a beszĆ©lgetĆ©si elÅzmĆ©nyeket"
+
+msgid "Nothing found for: %s"
+msgstr "Nem talĆ”lhatĆ³: %s"
+
+msgid "A short message?"
+msgstr "Egy rƶvid Ć¼zenet?"
+
+msgid "How are you?"
+msgstr "Hogy vagy?"
+
+msgid "What are you doing?"
+msgstr "Mit csinƔlsz?"
+
+msgid "Join a chat"
+msgstr "CsatlakozƔs egy beszƩlgetƩshez"
+
+msgid "Status"
+msgstr "StƔtusz"
+
+msgid "Available"
+msgstr "ElĆ©rhetÅ"
+
+msgid "Talkative"
+msgstr "BeszƩdes"
+
+msgid "Away"
+msgstr "TƔvol"
+
+msgid "Not available"
+msgstr "Nem elĆ©rhetÅ"
+
+msgid "Busy"
+msgstr "Elfoglalt"
+
+msgid "Mood"
+msgstr "Hangulat"
+
+msgid "None"
+msgstr "Nincs"
+
+msgid "Crazy"
+msgstr "Bolond"
+
+msgid "Excited"
+msgstr "Izgatott"
+
+msgid "Playful"
+msgstr "JƔtƩkos"
+
+msgid "Happy"
+msgstr "Boldog"
+
+msgid "Shocked"
+msgstr "Dƶbbent"
+
+msgid "Hot"
+msgstr "Pimasz"
+
+msgid "Sad"
+msgstr "SzomorĆŗ"
+
+msgid "Amorous"
+msgstr "Szerelmes"
+
+msgid "Confident"
+msgstr "Magabiztos"
+
+msgid "Activity"
+msgstr "TevƩkenysƩg"
+
+msgid "Chores"
+msgstr "HƔzimunka"
+
+msgid "Drinking"
+msgstr "Iszik"
+
+msgid "Eating"
+msgstr "Eszik"
+
+msgid "Exercising"
+msgstr "TestedzƩs"
+
+msgid "Grooming"
+msgstr "SzƩpsƩgƔpolƔs"
+
+msgid "Appointment"
+msgstr "TalĆ”lkozĆ³"
+
+msgid "Inactive"
+msgstr "TĆ©tlen"
+
+msgid "Relaxing"
+msgstr "Pihen"
+
+msgid "Talking"
+msgstr "BeszƩlgetƩs"
+
+msgid "Traveling"
+msgstr "UtazƔs"
+
+msgid "Working"
+msgstr "Dolgozik"
+
+msgid "View profile"
+msgstr "Profil megtekintƩse"
+
+msgid "Repeat this notice"
+msgstr "ĆrtesĆtĆ©s megismĆ©tlĆ©se"
+
+msgid "Remove this notice"
+msgstr "ĆrtesĆtĆ©s eltĆ”volĆtĆ”sa"
+
+msgid "Your profile"
+msgstr "A te profilod"
+
+msgid "Identity"
+msgstr "SzemƩlyazonossƔg"
+
+msgid "Profile image"
+msgstr "ProfilkƩp"
+
+msgid "Others"
+msgstr "MƔsok /Egyebek"
+
+msgid "Personal"
+msgstr "SzemƩlyes"
+
+msgid "Complete name"
+msgstr "Teljes nƩv"
+
+msgid "Nickname"
+msgstr "FelhasznĆ”lĆ³nĆ©v"
+
+msgid "First name"
+msgstr "KeresztnƩv"
+
+msgid "Last name"
+msgstr "VezetƩknƩv"
+
+msgid "Date of birth"
+msgstr "SzĆ¼letĆ©si dĆ”tum"
+
+msgid "Contact"
+msgstr "Kapcsolat"
+
+msgid "E-mail"
+msgstr "E-mail"
+
+msgid "Phone"
+msgstr "Telefon"
+
+msgid "Website"
+msgstr "Honlap"
+
+msgid "Current"
+msgstr "Jelenlegi"
+
+msgid "Delete"
+msgstr "Tƶrƶl"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "Milyen kĆ”r! Nincs profilkĆ©p tĆ”rsĆtva a szemĆ©lyi igazolvĆ”nyodhoz."
+
+msgid "Address"
+msgstr "CĆm"
+
+msgid "Street"
+msgstr "Utca"
+
+msgid "City"
+msgstr "VƔros"
+
+msgid "Postal code"
+msgstr "IrĆ”nyĆtĆ³szĆ”m"
+
+msgid "Country"
+msgstr "OrszƔg"
+
+msgid "Biography"
+msgstr "Ćletrajz"
+
+msgid "Important notice"
+msgstr "Fontos Ć©rtesĆtĆ©s"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr "LĆ©gy Ć³vatos az informĆ”ciĆ³kkal amiket megadsz a profilodban, mert bĆ”rki hozzĆ”fĆ©rhet (olyan is akit lehet hogy nem akarsz)."
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr "Nem minden privĆ”t jellegű az XMPP-n, ez is egy ilyen dolog, a te publikus profilod (vCard)."
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr "ErÅsen ajĆ”nlott, hogy feltƶlts egy profilkĆ©pet (%s maximum), mondjuk egy kĆ©pet rĆ³lad, mert Ćgy a barĆ”taid kƶnnyebben felismernek. "
+
+msgid "Save"
+msgstr "MentƩs"
+
+msgid "Cancel"
+msgstr "MĆ©gse"
+
+msgid "Edit options"
+msgstr "OpciĆ³k szerkeztĆ©se"
+
+msgid "Channel"
+msgstr "Csatorna"
+
+msgid "Commands"
+msgstr "Parancsok"
+
+msgid "Sounds"
+msgstr "Hangok"
+
+msgid "Privacy"
+msgstr "AdatvƩdelem"
+
+msgid "Message archiving"
+msgstr "Ćzenet archivĆ”lĆ”sa"
+
+msgid "Store a history of your chats"
+msgstr "KorƔbbi beszƩlgetƩsek tƔrolƔsa"
+
+msgid "Geolocation"
+msgstr "TartĆ³zkodĆ”si hely"
+
+msgid "Empty"
+msgstr "Ćres"
+
+msgid "Empty channel"
+msgstr "Ćres csatorna"
+
+msgid "Persistent"
+msgstr "TartĆ³s"
+
+msgid "Maximum notices"
+msgstr "MaximĆ”lis Ć©rtesĆtĆ©s"
+
+msgid "Account"
+msgstr "FiĆ³k"
+
+msgid "Change password"
+msgstr "JelszĆ³ mĆ³dosĆtĆ”sa"
+
+msgid "Delete account"
+msgstr "FiĆ³k tƶrlĆ©se"
+
+msgid "Old"
+msgstr "RĆ©gi"
+
+msgid "New (2 times)"
+msgstr "Ćj (2-szer)"
+
+msgid "Continue"
+msgstr "FolytatƔs"
+
+msgid "To"
+msgstr "CĆmzett"
+
+msgid "Close"
+msgstr "BezƔrƔs"
+
+msgid "unknown"
+msgstr "nem ismert"
+
+msgid "Unavailable"
+msgstr "Nem elĆ©rhetÅ"
+
+msgid "is now"
+msgstr "most"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr "KĆ©rlek vĆ”rj amĆg az avatar kĆ©ped feltƶltÅdik... "
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "KĆ©sz is! Egy szĆ©p Ćŗj profilkĆ©p!"
+
+msgid "The image file is not supported or has a bad size."
+msgstr "Nem tĆ”mogatott kĆ©pfĆ”jl vagy tĆŗl nagy."
+
+msgid "Reply"
+msgstr "VƔlaszolƔs"
+
+msgid "Error"
+msgstr "Hiba"
+
+msgid "Click here to solve the error"
+msgstr "Kattints ide a hiba megoldƔsƔhoz"
+
+msgid "You"
+msgstr "Te"
+
+msgid "Remove"
+msgstr "EltĆ”volĆtĆ”s"
+
+msgid "Rename"
+msgstr "ĆtnevezĆ©s"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "Szia, %s vagyok, Ʃs szeretnƩlek hozzƔadni a barƔtaimhoz."
+
+msgid "Smiley insertion"
+msgstr "Hangulatjel beszĆŗrĆ”sa"
+
+msgid "Change style"
+msgstr "StĆlus megvĆ”ltoztatĆ”sa"
+
+msgid "Text in bold"
+msgstr "FƩlkƶvƩr "
+
+msgid "Text in italic"
+msgstr "DÅlt"
+
+msgid "Underlined text"
+msgstr "AlĆ”hĆŗzott"
+
+msgid "Save chat"
+msgstr "BeszƩlgetƩs mentƩse"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr "Kattints a kƶvetkezÅ linkre, hogy megkapd a beszĆ©lgetĆ©si naplĆ³t, majd vĆ”rj. UtĆ”na kattints Ćŗjra a fĆ”jl mentĆ©sĆ©hez."
+
+msgid "This chat is empty!"
+msgstr "Ez a beszĆ©lgetĆ©s Ć¼res!"
+
+msgid "Generate file!"
+msgstr "FƔjl generƔlƔsa!"
+
+msgid "Download file!"
+msgstr "FƔjl letƶltƩse!"
+
+msgid "Clean current chat"
+msgstr "AktuƔlis beszƩlgetƩs tƶrlƩse"
+
+msgid "View chat history"
+msgstr "BeszĆ©lgetĆ©s elÅzmĆ©nyeinek megnĆ©zĆ©se"
+
+msgid "Show user profile"
+msgstr "FelhasznĆ”lĆ³i profil megmutatĆ”sa"
+
+msgid "Add this contact to your friends"
+msgstr "Ezen kapcsolat hozzƔadƔsa a barƔtokhoz"
+
+msgid "Add this groupchat to your favorites"
+msgstr "Csoportos beszƩlgetƩs hozzƔadƔsa a kedvencekhez"
+
+msgid "All tabs"
+msgstr "Minden lap"
+
+msgid "Close this tab"
+msgstr "Lap bezƔrƔsa"
+
+msgid "no subject defined for this room."
+msgstr "nincs tƩma megadva ehhez a szobƔhoz."
+
+msgid "Administration panel for this room"
+msgstr "AdminisztrĆ”ciĆ³s panel ehhez a szobĆ”hoz"
+
+msgid "Moderators"
+msgstr "ModerƔtorok"
+
+msgid "Participants"
+msgstr "RĆ©sztvevÅk"
+
+msgid "Visitors"
+msgstr "LĆ”togatĆ³k"
+
+msgid "Manage favorite rooms"
+msgstr "Kedvenc szobƔk kezelƩse"
+
+msgid "Change favorites"
+msgstr "Kedvencek megvƔltoztatƔsa"
+
+msgid "Search a room"
+msgstr "Szoba keresƩse"
+
+msgid "Select a favorite"
+msgstr "Kedvenc kivƔlasztƔsa"
+
+msgid "Getting the name..."
+msgstr "NƩv megszerzƩse..."
+
+msgid "Gateway"
+msgstr "ĆtjĆ”rĆ³"
+
+msgid "Name"
+msgstr "NĆ©v"
+
+msgid "Room"
+msgstr "Szoba"
+
+msgid "Add"
+msgstr "HozzƔad"
+
+msgid "Edit"
+msgstr "SzerkesztƩs"
+
+msgid "Search a room on"
+msgstr "Szoba keresƩse a"
+
+msgid "No room found on this server."
+msgstr "Ezen a szerveren nincs ilyen szoba"
+
+msgid "Service discovery"
+msgstr "SzolgƔltatƔs megismerƩse"
+
+msgid "Server to query"
+msgstr "Szerver lekƩrdezƩse"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr "Bocs, de lekƩrdezƩs nem hozott eredmƩnyt!"
+
+msgid "Accounts"
+msgstr "FiĆ³kok"
+
+msgid "Authentications"
+msgstr "HitelesĆtĆ©sek"
+
+msgid "Automation"
+msgstr "Automatikusan"
+
+msgid "Clients"
+msgstr "Kliensek"
+
+msgid "Collaboration"
+msgstr "EgyĆ¼ttműkƶdĆ©s"
+
+msgid "Components"
+msgstr "Komponensek"
+
+msgid "Rooms"
+msgstr "SzobƔk"
+
+msgid "Directories"
+msgstr "KƶnyvtƔrak"
+
+msgid "Gateways"
+msgstr "ĆtjĆ”rĆ³k"
+
+msgid "News"
+msgstr "HĆrek"
+
+msgid "Hierarchy"
+msgstr "Hierarchia"
+
+msgid "Proxies"
+msgstr "Proxik"
+
+msgid "Publication/Subscription"
+msgstr "PublikĆ”ciĆ³k/FeliratkozĆ”sok"
+
+msgid "Storage"
+msgstr "TĆ”rolĆ³"
+
+msgid "Service offline or broken"
+msgstr "A szolgĆ”ltatĆ”s nem elĆ©rhetÅ, vagy lezĆ”rt"
+
+msgid "Your inbox"
+msgstr "PostalƔdƔd"
+
+msgid "Available actions"
+msgstr "ElĆ©rhetÅ műveletek"
+
+msgid "Clean"
+msgstr "TisztĆt"
+
+msgid "New"
+msgstr "Ćj"
+
+msgid "Received"
+msgstr "Fogadott"
+
+msgid "Subject"
+msgstr "TƔrgy"
+
+msgid "Content"
+msgstr "Tartalom"
+
+msgid "Send message"
+msgstr "Ćzenet kĆ¼ldĆ©se"
+
+msgid "Your inbox is empty."
+msgstr "A bejƶvÅ fiĆ³kod Ć¼res"
+
+msgid "MUC administration"
+msgstr "MUC adminisztrĆ”ciĆ³"
+
+msgid "You administrate this room"
+msgstr "Te adminisztrƔlod ezt a szobƔt"
+
+msgid "Enter new subject"
+msgstr "Ćrd be a tĆ©mĆ”t"
+
+msgid "Configuration"
+msgstr "TestreszabƔs"
+
+msgid "Authorizations"
+msgstr "EngedƩlyek"
+
+msgid "Member list"
+msgstr "Tag lista"
+
+msgid "Owner list"
+msgstr "Tulajdonos lista"
+
+msgid "Administrator list"
+msgstr "AdminisztrƔtor lista"
+
+msgid "Outcast list"
+msgstr "Letiltottak listƔja"
+
+msgid "Add an input"
+msgstr "Bemenet hozzƔadƔsa"
+
+msgid "Destroy this MUC"
+msgstr "MUC elpusztĆtĆ”sa"
+
+msgid "Yes, let's do it!"
+msgstr "Igen, csinƔljuk!"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr "A barĆ”tod figyelemmel kĆsĆ©ri a beszĆ©lgetĆ©st."
+
+msgid "Your friend is writing a message..."
+msgstr "A barĆ”tod Ć©pp Ćr nekedā¦"
+
+msgid "Your friend stopped writing a message."
+msgstr "A barĆ”tod abbahagyta az Ć¼zenet ĆrĆ”sĆ”t."
+
+msgid "Your friend is doing something else."
+msgstr "A barƔtod valami mƔst csinƔl."
+
+msgid "Your friend closed the chat."
+msgstr "A barƔtod bezƔrta a beszƩlgetƩst."
+
+msgid "Requesting this service..."
+msgstr "SzolgƔltatƔs kƩrƩse..."
+
+msgid "Loading"
+msgstr "BetƶltƩs"
+
+msgid "joined the chat room"
+msgstr "csatlakozƔs a szobƔhoz"
+
+msgid "left the chat room"
+msgstr "a szoba elhagyƔsa"
+
+msgid "no status"
+msgstr "nincs stƔtusz"
+
+msgid "has been kicked"
+msgstr "kirĆŗgva"
+
+msgid "has been banned"
+msgstr "kitiltva"
+
+msgid "no reason"
+msgstr "Nincs ok"
+
+msgid "Communicate with the entire world!"
+msgstr "KommunikƔlj az egƩsz vilƔggal!"
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr "SegĆt, hogy kapcsolatban maradj emberek milliĆ³ival akik az XMPP hĆ”lĆ³zatot hasznĆ”ljĆ”k, mint ahogy te is tudod a Jappix-el. Csatlakozz a kƶzƶssĆ©ghez Ć©s maradj szabad!"
+
+msgid "Hi there!"
+msgstr "Szia!"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr "ĆdvƶzƶljĆ¼k %1son, ā%2sā."
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr "Jelentkezz be az XMPP fiĆ³kodba, vagy csinĆ”lj egy Ćŗjat ingyen!"
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr "A Jappix egy nyĆlt-forrĆ”sĆŗ projekt a PostPro-tĆ³l, egy non-profit szervezettÅl ami nagy segĆtsĆ©ggel van a szĆ”munkra."
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr "Jelentkezz be az XMPP fiĆ³kodba. HasznĆ”lhatod a %s -t is, hogy csatlakozz egy csoportos beszĆ©lgetĆ©shez."
+
+msgid "Previous"
+msgstr "ElÅzÅ"
+
+msgid "General"
+msgstr "ĆltalĆ”nos"
+
+msgid "Advanced"
+msgstr "HaladĆ³"
+
+msgid "Resource"
+msgstr "ForrƔs"
+
+msgid "Priority"
+msgstr "PrioritƔs"
+
+msgid "Low"
+msgstr "Alacsony"
+
+msgid "Medium"
+msgstr "Kƶzepes"
+
+msgid "High"
+msgstr "Magas"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr "Add meg a csoportos beszĆ©lgetĆ©st amihez csatlakozni szeretnĆ©l Ć©s felhasznĆ”lĆ³ nevet amit szeretnĆ©l. Vissza is tudsz menni a %s -hez."
+
+msgid "login page"
+msgstr "bejelentkezƩs oldal"
+
+msgid "Share this link with your friends:"
+msgstr "Link megosztƔsa a barƔtaiddal"
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr "RegisztrĆ”lj egy Ćŗj XMPP fiĆ³kot, hogy csatlakozz a barĆ”taidhoz a sajĆ”t szociĆ”lis felhÅdben. Ez egyszerű!"
+
+msgid "Required"
+msgstr "SzĆ¼ksĆ©ges"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr "Sikeresen regisztrĆ”ltĆ”l, ez az XMPP cĆmed:"
+
+msgid "Manager"
+msgstr "Menedzser"
+
+msgid "Project"
+msgstr "Projekt"
+
+msgid "Encrypted"
+msgstr "TitkosĆtott"
+
+msgid "Unencrypted"
+msgstr "TitkosĆtatlan"
+
+msgid "Where are you?"
+msgstr "Hol vagy?"
+
+msgid "What's up with you?"
+msgstr "Mi a helyzet veled?"
+
+msgid "Fetching the social channel..."
+msgstr "SzociƔlis csatorna hozzƔadƔsa..."
+
+msgid "You are synchronized with your network."
+msgstr "SzinkronizĆ”lva vagy a hĆ”lĆ³zatoddal."
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr "Nem lehet kĆ¼ldeni semmit: csak fogadni tudsz!"
+
+msgid "Media viewer"
+msgstr "MĆ©dia nĆ©zÅ"
+
+msgid "Browse"
+msgstr "TallĆ³zĆ”s"
+
+msgid "Command"
+msgstr "Parancs"
+
+msgid "Subscribe"
+msgstr "FeliratkozƔs"
+
+msgid "Join"
+msgstr "EgyesĆt"
+
+msgid "Automatic"
+msgstr "Automatikus"
+
+msgid "Search"
+msgstr "KeresƩs"
+
+msgid "No result!"
+msgstr "Nincs talƔlat!"
+
+msgid "No notifications."
+msgstr "Nincs Ć©rtesĆtĆ©s."
+
+msgid "would like to add you as a friend."
+msgstr "hozzƔ szeretne tƩged adni barƔtkƩnt"
+
+msgid "would like you to join this chatroom:"
+msgstr "szeretnƩ hogy csatlakozz ehhez a szobƔhoz:"
+
+msgid "Do you accept?"
+msgstr "Elfogadod?"
+
+msgid "Yes"
+msgstr "Igen"
+
+msgid "No"
+msgstr "Nem"
+
+msgid "would like to get authorization."
+msgstr "szeretne engedƩlyt szeretne kapni."
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr "Akarod-e lƔtni azokat a barƔtokat, akiket %s ajƔln?"
+
+msgid "Submit"
+msgstr "KĆ¼ldĆ©s"
+
+msgid "Client"
+msgstr "Kliens"
+
+msgid "System"
+msgstr "Rendszer"
+
+msgid "Local time"
+msgstr "Helyi idÅ"
+
+msgid "Comments"
+msgstr "HozzĆ”szĆ³lĆ”sok"
+
+msgid "User profile"
+msgstr "FelhasznĆ”lĆ³i profil"
+
+msgid "See his/her position on the globe"
+msgstr "MegnĆ©zem a pozĆciĆ³jĆ”t a fƶldgƶmbƶn."
+
+msgid "Confirm"
+msgstr "MegerÅsĆtĆ©s"
+
+msgid "anonymous mode"
+msgstr "NĆ©vtelen mĆ³d"
+
+msgid "Groups"
+msgstr "Csoportok"
+
+msgid "Unclassified"
+msgstr "OsztƔlyozatlan"
+
+msgid "Authorize"
+msgstr "EngedƩlyez"
+
+msgid "Ask for authorization"
+msgstr "KƩrƩs engedƩlyezƩsre"
+
+msgid "Unblock"
+msgstr "Felold"
+
+msgid "Prohibit"
+msgstr "TiltƔs"
+
+msgid "Block"
+msgstr "LezƔr"
+
+msgid "Chat"
+msgstr "BeszƩlgetƩs"
+
+msgid "Groupchat"
+msgstr "Csoportos beszƩlgetƩs"
+
+msgid "Jappix Mobile"
+msgstr "Jappix Mobil"
+
+msgid "Desktop"
+msgstr "Asztal"
+
+msgid "Mobile"
+msgstr "Mobil"
+
+msgid "Please wait..."
+msgstr "KƩrlek vƔrj..."
+
+msgid "Please enable JavaScript"
+msgstr "KƩrlek engedƩlyezd a JavaScript-et"
+
+msgid "Your channel"
+msgstr "A te csatornƔd"
+
+msgid "Channel of"
+msgstr "CsatornƔja "
+
+msgid "More notices..."
+msgstr "MĆ©gtƶbb Ć©rtesĆtĆ©s... "
+
+msgid "Attach a file"
+msgstr "FƔjl csatolƔsa"
+
+msgid "Send"
+msgstr "KĆ¼ldĆ©s"
+
+msgid "Unattach the file"
+msgstr "FƔjlcsatolƔs tƶrlƩse"
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr "Hiba tƶrtĆ©nt a fĆ”jl feltƶltĆ©se kƶzben: talĆ”n tĆŗl nagy (%s maximum) vagy le van tiltva."
+
+msgid "Authorization failed"
+msgstr "EngedƩlyezƩsi hiba"
+
+msgid "Registration failed, please choose a different username"
+msgstr "A regisztrĆ”ciĆ³ nem sikerĆ¼lt, kĆ©rlek vĆ”lassz mĆ”sik felhasznĆ”lĆ³nevet."
+
+msgid "Service unavailable"
+msgstr "A szolgĆ”ltatĆ”s nem elĆ©rhetÅ"
+
+msgid "Internal server error, try later"
+msgstr "BelsÅ szerver hiba, kĆ©rlek prĆ³bĆ”ld Ćŗjra kĆ©sÅbb"
+
+msgid "Your form has been sent."
+msgstr "Az űrlapod elkĆ¼ldve."
+
+msgid "Application"
+msgstr "AlkalmazƔs"
+
+msgid "XMPP links"
+msgstr "XMPP linkek"
+
+msgid "Open XMPP links with Jappix"
+msgstr "XMPP linkek megnyitƔsa Jappix-el"
+
+msgid "changed the subject to:"
+msgstr "tƔrgy megvƔltoztatƔsa erre:"
+
+msgid "Welcome!"
+msgstr "ĆdvƶzƶljĆ¼k!"
+
+msgid "Friends"
+msgstr "BarƔtok"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr "ĆdvƶzlĆ¼nk a Jappix-en, a sajĆ”t szociĆ”lis felhÅdben!"
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr "MielÅtt elkezdenĆ©d hasznĆ”lni, meg kell vĆ”ltoztatnod nĆ©hĆ”ny beĆ”llĆtĆ”st, keresned kell barĆ”tokat Ć©s kitƶltened a profilodat."
+
+msgid "Enable notification sounds"
+msgstr "ĆrtesĆtĆ©si hangok engedĆ©lyezĆ©se."
+
+msgid "Share your position on the globe"
+msgstr "PozĆciĆ³m megosztĆ”sa a fƶldgƶmbƶn"
+
+msgid "Offline friends"
+msgstr "Kijelentkezett barƔtok"
+
+msgid "Don't hide offline friends"
+msgstr "Ne rejtse el a kijelentkezett barƔtokat"
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr "HasznĆ”ld ezt az eszkƶzt hogy megtalĆ”ld a barĆ”taidat a szerveren amit most hasznĆ”lsz, vagy add hozzĆ” Åket kĆ©sÅbb."
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr "Nagyszerű! Most mĆ”r meg tudod osztani a Jappix-et a barĆ”taiddal!"
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr "Ha megnyomod a mentĆ©s gombot, meg fog nyĆlni a profil szerkesztÅ. JĆ³ szocializĆ”lĆ³dĆ”st!"
+
+msgid "Share Jappix on %s"
+msgstr "A Jappix megosztƔsa a %s -en."
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr "Jappix-et, egy nyĆlt szociĆ”lis platformot hasznĆ”lok. %s vagyok!"
+
+msgid "Unknown name"
+msgstr "Ismeretlen nƩv"
+
+msgid "Unknown country"
+msgstr "Ismeretlen orszƔg"
+
+msgid "Click to enable"
+msgstr "Kattints az engedƩlyezƩshez."
+
+msgid "Click to disable"
+msgstr "Kattints az elutasĆtĆ”shoz"
+
+msgid "Installation"
+msgstr "TelepĆtĆ©s"
+
+msgid "Jappix installation"
+msgstr "Jappix telepĆtĆ©se"
+
+msgid "Welcome to the Jappix installation!"
+msgstr "ĆdvƶzƶljĆ¼k a Jappix telepĆtĆ©sĆ©ben!"
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr "Ez az eszkƶz segĆt gyorsan telepĆteni a Jappix-et, az elsÅ teljes Ć©rtĆ©kű XMPP alapĆŗ szociĆ”lis platformot a szerveredre. Nincs szĆ¼ksĆ©ged semmilyen technikai tudĆ”sra."
+
+msgid "Let's have a look at the installation steps:"
+msgstr "NĆ©zzĆ¼k, mik a telepĆtĆ©s lĆ©pĆ©sei:"
+
+msgid "Welcome"
+msgstr "ĆdvƶzƶljĆ¼k"
+
+msgid "Storage configuration"
+msgstr "TĆ”rolĆ³ konfigurĆ”lĆ”sa"
+
+msgid "Administrator account"
+msgstr "AdminisztrĆ”ciĆ³s fiĆ³k"
+
+msgid "Main configuration"
+msgstr "FÅ beĆ”llĆtĆ”sok"
+
+msgid "Hosts configuration"
+msgstr "KiszolgĆ”lĆ³ konfigurĆ”ciĆ³"
+
+msgid "Services installation"
+msgstr "SzolgĆ”ltatĆ”s telepĆtĆ©s"
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr "Ha az aktuĆ”lis nyelv nem egyezik a tiĆ©ddel (%1s), Ć”t tudod Ć”llĆtani a Jappix-et hogy %2s beszĆ©ljen."
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr "Ha problĆ©mĆ”d van a Jappix telepĆtĆ©sĆ©vel Ć©s konfigurĆ”lĆ”sĆ”val, megnĆ©zheted a dokumentĆ”ciĆ³t ami elĆ©rhetÅ itt:"
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr "Itt az idÅ lĆ©trehozni a sajĆ”t szociĆ”lis felhÅdet, kezd az elsÅ lĆ©pĆ©ssel!"
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr "A Jappix tĆ”rolja az Ć”llandĆ³ adatokat (mint a megosztott fĆ”jlok, beszĆ©lgetĆ©sek naplĆ³zĆ”sai, sajĆ”t zenĆ©k Ć©s konfigurĆ”ciĆ³k), egy egyedi, biztosĆtott mappĆ”ban."
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr "A Jappix-nak tudnia kell Ćrni ebbe a mappĆ”ba, hogy lĆ©tre tudjon hozni almappĆ”kat. Ha nem tud, be kell Ć”llĆtanod az ĆrĆ”si jogot %1s vagy megvĆ”ltoztatni a mappa tulajdonosĆ”t %2s -re (a konfigurĆ”ciĆ³dtĆ³l fĆ¼ggÅen)."
+
+msgid "The folder is writable, you can continue!"
+msgstr "A mappa ĆrhatĆ³, mĆ”r folytathatod!"
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix felajĆ”nlja a lehetÅsĆ©get, hogy menedzseld a konfigurĆ”ciĆ³d, telepĆts Ćŗj kiegĆ©szĆtÅket, vagy keress frissĆtĆ©seket. EzĆ©rt kell lĆ©trehoznod egy adminisztrĆ”tori fiĆ³kot, hogy hozzĆ”fĆ©rj ezekhez a beĆ”llĆtĆ”sokhoz."
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr "Ha telepĆtetted a Jappix-et, csak kattints a menedzser linkre a fÅoldalon, hogy hozzĆ”fĆ©rj."
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr "OppĆ”, valamit elĆrtĆ”l, vagy a kĆ©t jelszĆ³ nem egyezik!"
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr "A Jappixnak szĆ¼ksĆ©ge van pĆ”r Ć©rtĆ©k beĆ”llĆtĆ”sĆ”ra. KĆ©rlek korrigĆ”ld az alĆ”bbi bemeneteket (vagy tartsd meg az alapĆ©rtelmezetteket, amik a legtƶbb ember szĆ”mĆ”ra ajĆ”nlottak)."
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr "Jegyezd meg, hogy ha nem adod meg a kƶtelezÅ adatokat, akkor automatikusan ki lesznek tƶltve egy alapĆ©rtelmezettel."
+
+msgid "User"
+msgstr "FelhasznĆ”lĆ³"
+
+msgid "Service"
+msgstr "SzolgƔltatƔs"
+
+msgid "Service name"
+msgstr "SzolgƔltatƔs neve"
+
+msgid "Service description"
+msgstr "SzolgĆ”ltatĆ”s leĆrĆ”sa"
+
+msgid "Connection"
+msgstr "Kapcsolat"
+
+msgid "Lock the host"
+msgstr "Gazda lezƔrƔsa"
+
+msgid "Anonymous mode"
+msgstr "NĆ©vtelen mĆ³d"
+
+msgid "Registration allowed"
+msgstr "RegisztrĆ”ciĆ³ engedĆ©lyezve"
+
+msgid "Use a proxy"
+msgstr "Proxy hasznƔlata"
+
+msgid "Encryption"
+msgstr "TitkosĆtĆ”s"
+
+msgid "HTTPS storage"
+msgstr "HTTPS tĆ”rolĆ³"
+
+msgid "Force HTTPS"
+msgstr "HTTPS erÅltetĆ©se"
+
+msgid "Compression"
+msgstr "TƶmƶrĆtĆ©s"
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr "Ez az oldal segĆt beĆ”llĆtani, hogy melyik kiszolgĆ”lĆ³hoz fog csatlakozni a Jappix. Ćgy is hagyhatod a beĆ”llĆtĆ”sokat ha a hivatalos kiszolgĆ”lĆ³t szeretnĆ©d hasznĆ”lni."
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr "Nem tudod mi az a BOSH szerver? Ez egy tovĆ”bbĆtĆ³ a Jappix kliens Ć©s az XMPP szerver kƶzƶtt, ami a technikai korlĆ”tok miatt szĆ¼ksĆ©ges."
+
+msgid "Main host"
+msgstr "FÅ kiszolgĆ”lĆ³"
+
+msgid "Groupchat host"
+msgstr "Csoportos beszĆ©lgetĆ©s kiszolgĆ”lĆ³ja"
+
+msgid "Anonymous host"
+msgstr "NĆ©vtelensĆ©gi kiszolgĆ”lĆ³"
+
+msgid "Directory host"
+msgstr "CĆmtĆ”r kiszolgĆ”lĆ³"
+
+msgid "BOSH host"
+msgstr "BOSH kiszolgĆ”lĆ³"
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr "TelepĆthetsz nĆ©hĆ”ny extra szoftvert is a szerveredre, hogy kiterjeszd a felhasznĆ”lĆ³i Ć©lmĆ©nyt. NĆ©hĆ”nyat esetleg mĆ³dosĆthatnak a biztonsĆ”gi korlĆ”tozĆ”sok miatt."
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr "Hogy vĆ©grehajtsd ezt hozzĆ” kell fĆ©rned a szerver hĆ©jĆ”hoz Ć©s root-kĆ©nt kell bejelentkezned. Ne felejtsd hogy ez fakultatĆv, a Jappix műkƶdik ezek nĆ©lkĆ¼l a modulok nĆ©lkĆ¼l, de nĆ©hĆ”ny eleme elĆ©rhetetlen lehet."
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr "TelepĆtĆ©s utĆ”n a Jappix ideiglenes Ć”llomĆ”nyokat hoz lĆ©tre. Ez eltarthat egy ideig, addig ne nyomj semmilyen gombra."
+
+msgid "Thanks for using Jappix!"
+msgstr "KƶszƶnjĆ¼k, hogy a Jappix-ot hasznĆ”ltad!"
+
+msgid "Next"
+msgstr "KƶvetkezÅ"
+
+msgid "Finish"
+msgstr "VĆ©ge"
+
+msgid "Check again"
+msgstr "EllenÅrzĆ©s Ćŗjra"
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr "A mappa nem ĆrhatĆ³, ĆllĆtsd be a jogosultsĆ”gokat %s mappĆ”n."
+
+msgid "%s is installed on your system."
+msgstr "%s telepĆtve van a rendszereden."
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr "%1s nincs telepĆtve a rendszereden, telepĆtsd %2s-t."
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr "PHP maximum feltƶltĆ©si mĆ©ret kielĆ©gĆtÅ (%s)."
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr "PHP maximum feltƶltĆ©si mĆ©ret nem kielĆ©gĆtÅ (%1s), definiĆ”ld %2s Ć©s %3s kƶzĆ©."
+
+msgid "Jappix manager"
+msgstr "Jappix menedzser"
+
+msgid "Manager access"
+msgstr "Menedzser hozzƔfƩrƩs"
+
+msgid "Statistics"
+msgstr "StatisztikƔk"
+
+msgid "Hosts"
+msgstr "KiszolgĆ”lĆ³k"
+
+msgid "Design"
+msgstr "FormatervezƩs"
+
+msgid "Repeat"
+msgstr "IsmƩtlƩs"
+
+msgid "All"
+msgstr "Minden"
+
+msgid "Horizontal"
+msgstr "VĆzszintes"
+
+msgid "Vertical"
+msgstr "FĆ¼ggÅleges"
+
+msgid "Center"
+msgstr "KƶzƩpre"
+
+msgid "Left"
+msgstr "Balra"
+
+msgid "Right"
+msgstr "Jobbra"
+
+msgid "Top"
+msgstr "Fent"
+
+msgid "Bottom"
+msgstr "Lent"
+
+msgid "Adapt"
+msgstr "AdaptƔlƔs"
+
+msgid "Color"
+msgstr "SzĆn"
+
+msgid "Users"
+msgstr "FelhasznĆ”lĆ³k"
+
+msgid "Updates"
+msgstr "FrissĆtĆ©sek"
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr "Ez egy korlĆ”tozott rĆ©giĆ³: csak a kijelƶlt felhasznĆ”lĆ³k tudjĆ”k menedzselni ezeket a Jappix opciĆ³kat."
+
+msgid "Please use the form below to login to the administration panel."
+msgstr "KĆ©rlek hasznĆ”ld az alĆ”bbi formĆ”t hogy bejelentkezz az adminisztrĆ”ciĆ³s panelre."
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr "A biztonsĆ”g Ć©rdekĆ©ben a kapcsolat idÅben limitĆ”lt, Ć©s ha bezĆ”rod a bƶngĆ©szÅd, ki leszel jelentkeztetve. "
+
+msgid "Credentials"
+msgstr "AzonosĆtĆ³k"
+
+msgid "You have been logged out. Goodbye!"
+msgstr "Sikeresen kijelentkeztƩl. ViszlƔt!"
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr "OppĆ”, nem ismertĆ¼nk fel, mint Ć©rvĆ©nyes adminisztrĆ”tort. NĆ©zd meg az azonosĆtĆ³id!"
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr "Jappix feldolgozza az alapvetÅ statisztikĆ”kat nĆ©hĆ”ny fontos dologrĆ³l, lejjebb megtalĆ”lod Åket."
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr "VĆ”ltoztasd meg a Jappix csomĆ³ponti konfigurĆ”ciĆ³it ezzel az eszkƶzzel."
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr "VĆ”ltoztasd meg az XMPP kiszolgĆ”lĆ³kat a Jappix csomĆ³pont szerveren ezzel az eszkƶzzel."
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr "Az ƶsszes Jappix csomĆ³pont Ć”ltal tĆ”rolt fĆ”jl menedzselhetÅ ezzel az eszkƶzzel: kĆ©rlek vĆ”lassz ki egy almappĆ”t Ć©s kezdheted szerkeszteni a tartalmĆ”t!"
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr "A Jappix teljesen testre szabhatĆ³: itt meg tudod vĆ”ltoztatni a kinĆ©zetĆ©t."
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr "Nem ƩrvƩnyes kƩpformƔtum, kƩrlek hasznƔlj PNG, GIF, vagy JPG kƩpet!"
+
+msgid "The image could not be received, would you mind retry?"
+msgstr "A kĆ©pet nem tudtuk fogadni, szeretnĆ©d megprĆ³bĆ”lni Ćŗjra?"
+
+msgid "Your image was added to the list!"
+msgstr "A kƩped hozzƔ lett adva a listƔhoz!"
+
+msgid "Changes saved!"
+msgstr "VƔltoztatƔsok elmentve!"
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr "Ehhez a Jappix csomĆ³ponthoz tƶbb adminisztrĆ”tort is tudsz definiĆ”lni. Ezzel az eszkƶzzel jelszĆ³t is tudsz vĆ”ltoztatni."
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr "FrissĆtsd a Jappix csomĆ³pontod ezzel az eszkƶzzel, vagy nĆ©zd meg hogy lĆ©tezik-e egy Ćŗjabb. InformĆ”ciĆ³k fognak megjelenni a legĆŗjabb verziĆ³rĆ³l (angolul)."
+
+msgid "Access statistics"
+msgstr "ElƩrƩsi statisztikƔk"
+
+msgid "Share statistics"
+msgstr "MegosztƔsi statisztikƔk"
+
+msgid "Other statistics"
+msgstr "EgyƩb statisztikƔk"
+
+msgid "January"
+msgstr "JanuƔr"
+
+msgid "February"
+msgstr "FebruƔr"
+
+msgid "March"
+msgstr "MƔrcius"
+
+msgid "April"
+msgstr "Ćprilis"
+
+msgid "May"
+msgstr "MƔjus"
+
+msgid "June"
+msgstr "JĆŗnius"
+
+msgid "July"
+msgstr "JĆŗlius"
+
+msgid "August"
+msgstr "Augusztus"
+
+msgid "September"
+msgstr "Szeptember"
+
+msgid "October"
+msgstr "OktĆ³ber"
+
+msgid "November"
+msgstr "November"
+
+msgid "December"
+msgstr "December"
+
+msgid "Monday"
+msgstr "HĆ©tfÅ"
+
+msgid "Tuesday"
+msgstr "Kedd"
+
+msgid "Wednesday"
+msgstr "Szerda"
+
+msgid "Thursday"
+msgstr "CsĆ¼tƶrtƶk"
+
+msgid "Friday"
+msgstr "PĆ©ntek"
+
+msgid "Saturday"
+msgstr "Szombat"
+
+msgid "Sunday"
+msgstr "VasƔrnap"
+
+msgid "Total"
+msgstr "Ćsszeg"
+
+msgid "Cache"
+msgstr "GyorsĆtĆ³tĆ”r"
+
+msgid "Logs"
+msgstr "Logok"
+
+msgid "Music"
+msgstr "Zene"
+
+msgid "Backgrounds"
+msgstr "HƔtterek"
+
+msgid "Share"
+msgstr "MegosztƔs"
+
+msgid "Background"
+msgstr "HƔttƩr"
+
+msgid "Notice"
+msgstr "MegjegyzƩs"
+
+msgid "Your design preferences have been saved!"
+msgstr "A kinĆ©zeti beĆ”llĆtĆ”said elmentettĆ¼k."
+
+msgid "Please check your inputs: something is missing!"
+msgstr "KĆ©rlek ellenÅrizd a bemeneteket: valami hiĆ”nyzik!"
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr "VĆ”ltoztasd meg a Jappix hĆ”ttered ezzel az eszkƶzzel. VĆ”laszthatsz ezen kĆvĆ¼l egy egyedi szĆnt, vagy feltƶlthetsz egy kĆ©pet. Engedd szĆ”rnyalni a kreativitĆ”sod!"
+
+msgid "Use default background"
+msgstr "AlapƩrtelmezett hƔttƩr hasznƔlata"
+
+msgid "Use your own image"
+msgstr "HasznƔld a sajƔt kƩped"
+
+msgid "Select a background to use and change the display options."
+msgstr "HĆ”ttĆ©rkĆ©p vĆ”lasztĆ”sa, hogy hasznĆ”ld Ć©s vĆ”ltoztasd a kijelzĆ©si opciĆ³kat. "
+
+msgid "Use your own color"
+msgstr "HasznĆ”ld a sajĆ”t szĆned"
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr "Ćrd be a hexadecimĆ”lis kĆ³djĆ”t annak a szĆnnek, amit hĆ”ttĆ©rkĆ©nt szeretnĆ©l hasznĆ”lni."
+
+msgid "Manage backgrounds"
+msgstr "HƔttƩrkƩpek menedzselƩse"
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr "Ezzel az eszkƶzzel hozzĆ” tudsz adni egy Ćŗj hĆ”ttĆ©rkĆ©pet a listĆ”hoz. KĆ©rlek kĆ¼ldj egy Ć©rvĆ©nyes kĆ©pet."
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr "Ha el szeretnĆ©l tĆ”volĆtani hĆ”ttĆ©rkĆ©peket, hasznĆ”ld az alĆ”bbi bƶngĆ©szÅt."
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr "DefiniĆ”lj az ƶsszes felhasznĆ”lĆ³d szĆ”mĆ”ra egy kezdÅoldal Ć¼zenet, mint a figyelmeztetĆ©s, fontos Ć¼zenet vagy hirdetĆ©s, ezzel az eszkƶzzel. "
+
+msgid "Simple notice"
+msgstr "Egyszerű Ć©rtesĆtĆ©s"
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr "Ez az Ć©rtesĆtĆ©s csak egyszerű szƶveget tartalmazhat, tehĆ”t kĆ³dok nem elĆ©rhetÅek!"
+
+msgid "Advanced notice"
+msgstr ""
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr "HTML, CSS Ć©s JavaScript segĆtsĆ©gĆ©vel szemĆ©lyreszabhatod Ć©rtesĆtĆ©seidet, de szĆ¼ksĆ©ges stĆluskĆ³dok hasznĆ”lata."
+
+msgid "Available updates"
+msgstr "ElĆ©rhetÅ frissĆtĆ©sek"
+
+msgid "What's new?"
+msgstr "Mi ĆŗjsĆ”g?"
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr "A tĆ”rolĆ³id nem ĆrhatĆ³ak, kĆ©rlek hasznĆ”lj mĆ”sikat!"
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr "%1s talƔn hibƔt okoz a proxy kapcsolatban, kƩrlek emeld meg %2s ƩrtƩkƩt %3s -re!"
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr "A Jappix egy fejlesztÅi kiadĆ”sĆ”t hasznĆ”lod. FrissĆtsd a tĆ”rolĆ³nkbĆ³l ennek a vĆ©grehajtĆ”sĆ”val: %s."
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr "Ćj Jappix kiadĆ”s elĆ©rhetÅ! Lesd meg az ĆŗjdonsĆ”gokat, Ć©s futtasd a frissitÅt!"
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr "A te Jappixod elavult. Kattints ide, Ć©s frissits a %s verziĆ³ra!"
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr "Ćgy tűnik, hogy jelenlegi verziĆ³ a legfrissebb, de ellenÅrizheted manuĆ”lisan is ide kattintva."
+
+msgid "Check for updates"
+msgstr "FrissĆtĆ©sek keresĆ©se"
+
+msgid "Update in progress"
+msgstr "FrissĆtĆ©s folyamatban"
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr "Jappix frissitve: nĆ”lad jeleneg az utolsĆ³ kiadĆ”s fut. "
+
+msgid "The update has failed! Please try again later."
+msgstr "Sikertelen frissĆtĆ©s! PrĆ³bĆ”ld meg kĆ©sÅbb."
+
+msgid "Downloading package..."
+msgstr "Csomagok letƶltƩse..."
+
+msgid "Removing current Jappix system files..."
+msgstr "Az aktuƔlis Jappix rendszer fƔjlok tƶrlƩse..."
+
+msgid "Extracting package..."
+msgstr "Csomagok kibontƔsa..."
+
+msgid "Regenerating storage folder tree..."
+msgstr "TĆ”rolĆ³ mappĆ”k Ćŗjra generĆ”lĆ”sa..."
+
+msgid "Jappix is now up to date!"
+msgstr "Jappix most naprakƩsz!"
+
+msgid "Aborted: socket error!"
+msgstr "MegszakĆtva: foglaltsĆ”gi hiba!"
+
+msgid "Aborted: buffer error!"
+msgstr "MegszakĆtva: puffer hiba!"
+
+msgid "Aborted: everything is not writable!"
+msgstr "MegszakĆtva: nem minden ĆrhatĆ³!"
+
+msgid "Aborted: could not extract the package!"
+msgstr "MegszakĆtva: nem lehet kicsomagolni a csomagot!"
+
+msgid "Visits"
+msgstr "LƔtogatottsƔg"
+
+msgid "Daily"
+msgstr "Naponta"
+
+msgid "Weekly"
+msgstr "Hetente"
+
+msgid "Monthly"
+msgstr "Havonta"
+
+msgid "Yearly"
+msgstr "Ćvente"
+
+msgid "Size"
+msgstr "MĆ©ret"
+
+msgid "Clean everything"
+msgstr "Mindent tƶrƶl"
+
+msgid "Purge cache"
+msgstr "Cache tisztĆtĆ”sa"
+
+msgid "Purge logs"
+msgstr "Logok tisztĆtĆ”sa"
+
+msgid "Purge updates"
+msgstr "FrissĆtĆ©sek tisztĆtĆ”sa"
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr "A tĆ”rolĆ³hely, amit Ć¼rĆteni akarsz Ć¼res!"
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr "Tartsd frissen a Jappixodat, tisztĆtsd a tĆ”rolĆ³ mappĆ”kat rendszeresen!"
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr "Tƶltsd fel a zenĆ©id (Ogg Vorbis, MP3 vagy WAV formĆ”tumban), hogy tudd Åket hallgatni a Jappix-ban is!"
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr "A fƔjl amit felszeretnƩl tƶlteni, kisebbnek kell lennie %s-nƔl/nƩl."
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr "Maradj ƶsszhangban azzal amit a felhasznĆ”lĆ³id tĆ”rolnak a szerveren, Ć©s tƶrƶld a nem kĆvĆ”nt tartalmakat ezzel az eszkƶzzel."
+
+msgid "Title"
+msgstr "CĆm"
+
+msgid "Artist"
+msgstr "ElÅadĆ³"
+
+msgid "Album"
+msgstr "Album"
+
+msgid "File"
+msgstr "FƔjl"
+
+msgid "Upload"
+msgstr "FeltƶltƩs"
+
+msgid "The folder is empty."
+msgstr "A mappa Ć¼res."
+
+msgid "The music could not be received, please retry!"
+msgstr "A zenĆ©t nem tudtuk fogadni, kĆ©rlek prĆ³bĆ”ld Ćŗjra!"
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr "Ez nem egy Ć©rvĆ©nyes zenei fĆ”jl formĆ”tum, kĆ©rlek kĆ³dold Ć”t Ogg Vorbis, MP3 vagy WAV formĆ”tumba!"
+
+msgid "Your music has been added!"
+msgstr "Zene hozzƔadva!"
+
+msgid "The selected elements have been removed."
+msgstr "A kivƔlasztott elemek tƶrƶlve lettek."
+
+msgid "You must select elements to remove!"
+msgstr "Ahhoz, hogy tƶrƶlni tudj, ki kell vƔlasztanod egy elemet!"
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr "Adj meg Ćŗj felhasznĆ”lĆ³t, vagy vĆ”ltoztasd meg a jelszĆ³t (ehhez adj meg egy lĆ©tezÅ felhasznĆ”lĆ³ nevet) ezzel az eszkƶzzel. KĆ©rlek vĆ”lassz egy erÅs jelszĆ³t!"
+
+msgid "Manage"
+msgstr "IntƩzƩs"
+
+msgid "List"
+msgstr "Lista"
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr "FelhasznĆ”lĆ³ eltĆ”volĆtĆ”sa ezzel az eszkƶzzel. Akkor nem tudsz felhasznĆ”lĆ³t eltĆ”volĆtani, ha Å maradt az egyetlen."
+
+msgid "The user has been added!"
+msgstr "FelhasznĆ”lĆ³ hozzĆ”adva!"
+
+msgid "The chosen users have been removed."
+msgstr "A kivĆ”laszott felhasznĆ”lĆ³ eltĆ”volĆtva."
+
+msgid "You must select one or more users to be removed!"
+msgstr "LegalĆ”bb egy felhasznĆ”lĆ³t ki kell vĆ”lasztani ahhoz, hogy tƶrƶlni lehessen!"
+
+msgid "Yesterday"
+msgstr "Tegnap"
+
+msgid "%s days ago"
+msgstr "%s nappal ezelÅtt"
+
+msgid "User currently active"
+msgstr "A felhasznĆ”lĆ³ jelenleg elĆ©rhetÅ"
+
+msgid "Last seen: %s"
+msgstr "UtĆ³ljĆ”ra lĆ”ttad: %s"
+
+msgid "Inactive since: %s"
+msgstr "InaktĆv ideje: %s "
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr "A barĆ”tod Ćŗgy tűnik nem kapta meg az Ć¼zenete(i)det!"
+
+msgid "Static content server"
+msgstr "Statikus tartalom szerver"
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr "Ez egy statikus tartalom szerver a kƶvetkezÅknek: %1a, ā%2sā."
+
+msgid "Suggested friends"
+msgstr "Javasolt barƔtok"
+
+msgid "Check all"
+msgstr "Ćsszeset megjelƶl"
+
+msgid "Uncheck all"
+msgstr "MegjelƶlƩsek visszavonƔsa"
+
+msgid "Choose"
+msgstr "VƔlasztƔs"
+
+msgid "List name"
+msgstr "Nevek listƔzƔsa"
+
+msgid "Allow"
+msgstr "Elfogad"
+
+msgid "Deny"
+msgstr "Megtagad"
+
+msgid "Group"
+msgstr "Csoport"
+
+msgid "Subscription"
+msgstr "FeliratkozƔs"
+
+msgid "Both"
+msgstr "MindkƩt"
+
+msgid "From"
+msgstr "FeladĆ³"
+
+msgid "Everybody"
+msgstr "Mindenki"
+
+msgid "Send messages"
+msgstr "ĆzenetkĆ¼ldĆ©s"
+
+msgid "Send queries"
+msgstr "LekƩrdezƩsek"
+
+msgid "See my status"
+msgstr "Ćllapotom"
+
+msgid "Send his/her status"
+msgstr "Az Å stĆ”tuszĆ”nak elkĆ¼ldĆ©se"
+
+msgid "Everything"
+msgstr "Minden"
+
+msgid "Item"
+msgstr "Elem"
+
+msgid "Order"
+msgstr "Rendez"
+
+msgid "Active for this session"
+msgstr "AktĆv erre a szakaszra"
+
+msgid "Always active"
+msgstr "Mindig elĆ©rhetÅ"
+
+msgid "User directory"
+msgstr "FelhasznĆ”lĆ³i kƶnyvtĆ”r"
+
+msgid "Search a friend"
+msgstr "Egy barƔt keresƩse"
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr "A megkƶvetelt tulajdonsĆ”got a fogadĆ³ vagy a szerver nem tudja implementĆ”lni, ezĆ©rt ezĆ©rt művelet nem hajthatĆ³ vĆ©gre."
+
+msgid "This is a repeat from %s"
+msgstr "Ez egy ismĆ©tlĆ©s %s -tÅl"
+
+msgid "Loading comments..."
+msgstr "HozzĆ”szĆ³lĆ”sok betƶltĆ©se.."
+
+msgid "Type your comment here..."
+msgstr "HozzĆ”szĆ³lok..."
+
+msgid "Could not get the comments!"
+msgstr "A kommentek nem tƶlthetÅk be"
+
+msgid "Show comments"
+msgstr "Mutasd a hozzĆ”szĆ³lĆ”sokat"
+
+msgid "Send him/her a message"
+msgstr "KĆ¼ldj neki Ć¼zenetet"
+
+msgid "Start a chat with him/her"
+msgstr "BeszƩlj vele"
+
+msgid "Media integration"
+msgstr "MĆ©dia integrĆ”ciĆ³"
+
+msgid "Comments locked!"
+msgstr "HozzĆ”szĆ³lĆ”s lezĆ”rva!"
+
+msgid "Type something you want to share with your friends..."
+msgstr "Ćrj valamit, amit megosztanĆ”l a barĆ”taiddal..."
+
+msgid "changed his/her nickname to %s"
+msgstr "megvĆ”ltoztatta a felhasznĆ”lĆ³nevĆ©t %s -re"
+
+msgid "commented an item you follow: ā%sā."
+msgstr "KommentĆ”lva egy elem amit kƶvetsz: ā%sā."
+
+msgid "Hide"
+msgstr "Elrejt"
+
+msgid "liked your post: ā%sā."
+msgstr "kedveli a bejegyzĆ©sedet: ā%sā"
+
+msgid "quoted you somewhere: ā%sā."
+msgstr "szavaztak rĆ”d valahol: ā%sā."
+
+msgid "published on your wall: ā%sā."
+msgstr "Ćrt a faladra: ā%sā"
+
+msgid "tagged you in a photo (%s)."
+msgstr "megjelƶltek egy kƩpen (%s). "
+
+msgid "tagged you in a video (%s)."
+msgstr "megjelƶltek egy videĆ³n (%s). "
+
+msgid "Show"
+msgstr "Mutat"
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr "SzĆ¼ksĆ©ged van segĆtsĆ©gre? A legjobb, ha elolvasod a dokumentĆ”ciĆ³nkat arrĆ³l, hogyan tƶltsd ki az űrlapot!"
+
+msgid "Pubsub host"
+msgstr "Pubsub kiszolgĆ”lĆ³"
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr "A Jappix egy nagyszerű kƶzƶssĆ©gi felĆ¼let, amit bĆ”rhonnan Ć©s bĆ”rmikor elĆ©rhetsz, Ć©s bĆ”rkivel beszĆ©lhetsz."
+
+msgid "Manager link"
+msgstr "Menedzser link"
+
+msgid "User uploads server"
+msgstr "FelhasznĆ”lĆ³i feltƶltĆ©sek szervere"
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr "Ez a kƶvetkezÅk felhasznĆ”lĆ³i feltƶltĆ©sek szervere: %1s, ā%2sā."
+
+msgid "Logo"
+msgstr "Logo"
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr "Be tudod Ć”llĆtani a sajĆ”t vĆzjeled az alapĆ©rtelmezett helyett. LĆ©gy Ć³vatos a mĆ©retĆ©vel Ć©s a szĆnĆ©vel kapcsolatban!"
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr "Minden logĆ³ fƶltƶltĆ©se egy ajĆ”nlott maximum mĆ©rettel."
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr "Nem megfelelÅ kĆ©pformĆ”tum, kĆ©rlek PNG-t hasznĆ”lj!"
+
+msgid "Your service logo has been successfully changed!"
+msgstr "A vĆzjeled sikeresen mĆ³dosĆtva!"
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr "A logo formĆ”tumodnak PNG-nek kell lennie. Hagyj egy mezÅt Ć¼resen, Ć©s a logo nem lesz megvĆ”ltoztatva."
+
+msgid "Remove this logo"
+msgstr "Logo eltĆ”volĆtĆ”sa"
+
+msgid "View this logo"
+msgstr "Logo megtekintƩse"
+
+msgid "Send a file"
+msgstr "FĆ”jl kĆ¼ldĆ©se"
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr "Amint feltƶltƶtted, a barƔtaid azonnal le fogjƔk tudni tƶlteni."
+
+msgid "Groupchats to join"
+msgstr "Csoportos beszƩlgetƩshez csatlakozƔs"
+
+msgid "Purge sent files"
+msgstr "ElkĆ¼ldƶtt fĆ”jlok tƶrlĆ©se"
+
+msgid "would like to send you a file: ā%sā."
+msgstr "szeretne neked kĆ¼ldeni egy fĆ”lj-t : ā%sā"
+
+msgid "has accepted to received your file: ā%sā."
+msgstr "elfogadta, hogy kĆ¼ldj neki egy fĆ”lj-t : ā%sā"
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr "elutasĆtotta a fĆ”jl-t: ā%sā"
+
+msgid "could not receive your file: ā%sā."
+msgstr "nem tudta fogadni a fĆ”jl-t: ā%sā"
+
+msgid "has received a file exchange request: ā%sā."
+msgstr "kapott egy felkĆ©rĆ©st az alĆ”bbi fĆ”jl fogadĆ”sĆ”ra: ā%sā"
+
+msgid "Available shortcuts:"
+msgstr "ElĆ©rhetÅ parancsikonok:"
+
+msgid "%s removes the chat logs"
+msgstr "%s eltĆ”volĆtotta a beszĆ©lgetĆ©s elÅzmĆ©nyeit"
+
+msgid "%s joins a groupchat"
+msgstr "%s csatlakozott a csoportos beszƩlgetƩsbe"
+
+msgid "%s closes the chat"
+msgstr "%s bezƔrta a beszƩlgetƩst"
+
+msgid "%s shows the user profile"
+msgstr "%s megmutatta a felhasznĆ”lĆ³i profiljĆ”t"
+
+msgid "%s sends a message to the room"
+msgstr "%s Ć¼zenetet kĆ¼ldƶtt a szobĆ”bs"
+
+msgid "%s changes your nickname"
+msgstr "%s megvĆ”ltoztatta a felhasznĆ”lĆ³i nevedet"
+
+msgid "%s sends a message to someone in the room"
+msgstr "%s Ć¼zenetet kĆ¼ldƶtt valakinek a szobĆ”ban"
+
+msgid "%s changes the room topic"
+msgstr "%s megvƔltoztatta a szoba tƩmƔjƔt"
+
+msgid "%s kicks an user of the room"
+msgstr "%s kidobta az egyik felhasznĆ”lĆ³t a szobĆ”bĆ³l"
+
+msgid "%s bans an user of the room"
+msgstr "%s kitiltotta az egyik felhasznĆ”lĆ³t a szobĆ”bĆ³l"
+
+msgid "%s invites someone to join the room"
+msgstr "%s meghĆvott valakit a szobĆ”ba"
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr ""
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# Indonesia translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:26+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "JavaScript telah hilang di browser web anda, sehingga anda tidak akan dapat membuka Jappix! Harap perbaiki hal ini."
+
+msgid "An open social network"
+msgstr "Sebuah jaringan sosial terbuka"
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "Saat ini Jappix sedang mengalami gangguan jaringan, bug atau login yang salah (periksa lagi data kredensial yang telah anda masukkan), maaf untuk ketidaknyamanan ini."
+
+msgid "The element list on this server could not be obtained!"
+msgstr "Daftar elemen pada server ini tidak dapat diperoleh!"
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "Kata sandi anda telah dirubah, sekarang anda dapat terhubung ke akun anda dengan data login yang baru."
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "Akun XMPP anda telah dihapus, selamat tinggal!"
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "Anda telah keluar dari akun XMPP anda, semoga hari anda menyenangkan!"
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "Room yang anda masuki tampaknya tidak tersedia, anda harus membuatnya!"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "GroupChat telah dihapus, sekarang orang lain akan dapat membuatnya kembali."
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "Pengguna yang ingin anda hubungi sedang tidak hadir dalam room."
+
+msgid "Please enter the group chat address to join."
+msgstr "Silahkan masukkan alamat GroupChat untuk bergabung."
+
+msgid "Please enter your nickname to join %s."
+msgstr "Silakan masukkan nama panggilan anda untuk bergabung %s."
+
+msgid "This room (%s) is protected with a password."
+msgstr "Room ini (%s) dilindungi dengan sebuah kata sandi."
+
+msgid "Your browser is out of date!"
+msgstr "Browser anda telah ketinggalan jaman!"
+
+msgid "Last %s version is better!"
+msgstr "Versi %s terakhir lebih baik!"
+
+msgid "Login"
+msgstr "Masuk"
+
+msgid "Register"
+msgstr "Daftar"
+
+msgid "Here we go!"
+msgstr "Kita mulai!"
+
+msgid "Server"
+msgstr "Server"
+
+msgid "Password"
+msgstr "Kata Sandi"
+
+msgid "Remember me"
+msgstr "Ingat saya"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "Alat ini telah dinonaktifkan, anda tidak dapat menggunakannya!"
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "Karena masalah jaringan, anda terputus. Apa yang anda ingin lakukan sekarang?"
+
+msgid "Reconnect"
+msgstr "Hubungkan kembali"
+
+msgid "Messages"
+msgstr "Pesan"
+
+msgid "Profile"
+msgstr "Profil"
+
+msgid "Options"
+msgstr "Pilihan"
+
+msgid "Disconnect"
+msgstr "Memutuskan"
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Add a friend"
+msgstr "Tambahkan teman"
+
+msgid "Your groupchats"
+msgstr "Groupchats anda"
+
+msgid "Manage your favorite groupchats"
+msgstr "Kelola groupchats favorit anda"
+
+msgid "More stuff"
+msgstr "Kemampuan lain"
+
+msgid "Show all friends"
+msgstr "Tampilkan semua teman"
+
+msgid "Only show connected friends"
+msgstr "Hanya tampilkan teman-teman yang terhubung"
+
+msgid "Message archives"
+msgstr "Arsip pesan"
+
+msgid "Date"
+msgstr "Tanggal"
+
+msgid "Please select a friend to view the chat history."
+msgstr "Silahkan pilih seorang teman untuk melihat riwayat chatting."
+
+msgid "Nothing found for: %s"
+msgstr "Tidak ada hasil untuk: %s"
+
+msgid "A short message?"
+msgstr "Sebuah pesan singkat?"
+
+msgid "How are you?"
+msgstr "Bagaimana kabar anda?"
+
+msgid "What are you doing?"
+msgstr "Apa yang anda lakukan?"
+
+msgid "Join a chat"
+msgstr "Ikut obrolan"
+
+msgid "Status"
+msgstr "Status"
+
+msgid "Available"
+msgstr "Tersedia"
+
+msgid "Talkative"
+msgstr "Latah"
+
+msgid "Away"
+msgstr "Pergi"
+
+msgid "Not available"
+msgstr "Tidak tersedia"
+
+msgid "Busy"
+msgstr "Sibuk"
+
+msgid "Mood"
+msgstr "Suasana hati"
+
+msgid "None"
+msgstr "Tidak ada"
+
+msgid "Crazy"
+msgstr "Gila"
+
+msgid "Excited"
+msgstr "Gembira"
+
+msgid "Playful"
+msgstr "Playful"
+
+msgid "Happy"
+msgstr "Senang"
+
+msgid "Shocked"
+msgstr "Kaget"
+
+msgid "Hot"
+msgstr "Panas"
+
+msgid "Sad"
+msgstr "Sedih"
+
+msgid "Amorous"
+msgstr "Tunjukkan Cinta Kasih"
+
+msgid "Confident"
+msgstr "Yakin"
+
+msgid "Activity"
+msgstr "Aktivitas"
+
+msgid "Chores"
+msgstr "Tugas"
+
+msgid "Drinking"
+msgstr "Minum"
+
+msgid "Eating"
+msgstr "Makan"
+
+msgid "Exercising"
+msgstr "Berolahraga"
+
+msgid "Grooming"
+msgstr "Dandan"
+
+msgid "Appointment"
+msgstr "Janji"
+
+msgid "Inactive"
+msgstr "Tidak aktif"
+
+msgid "Relaxing"
+msgstr "Bersantai"
+
+msgid "Talking"
+msgstr "Berbicara"
+
+msgid "Traveling"
+msgstr "Perjalanan"
+
+msgid "Working"
+msgstr "Bekerja"
+
+msgid "View profile"
+msgstr "Lihat profil"
+
+msgid "Repeat this notice"
+msgstr "Ulangi pemberitahuan ini"
+
+msgid "Remove this notice"
+msgstr "Hapus pemberitahuan ini"
+
+msgid "Your profile"
+msgstr "Profil anda"
+
+msgid "Identity"
+msgstr "Identitas"
+
+msgid "Profile image"
+msgstr "Gambar profil"
+
+msgid "Others"
+msgstr "Lainnya"
+
+msgid "Personal"
+msgstr "Pribadi"
+
+msgid "Complete name"
+msgstr "Nama lengkap"
+
+msgid "Nickname"
+msgstr "Julukan"
+
+msgid "First name"
+msgstr "Nama awalan"
+
+msgid "Last name"
+msgstr "Nama akhiran"
+
+msgid "Date of birth"
+msgstr "Tanggal lahir"
+
+msgid "Contact"
+msgstr "Kontak"
+
+msgid "E-mail"
+msgstr "E-mail"
+
+msgid "Phone"
+msgstr "Telepon"
+
+msgid "Website"
+msgstr "Situs"
+
+msgid "Current"
+msgstr "Saat ini"
+
+msgid "Delete"
+msgstr "Hapus"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "Sayang sekali! anda tidak memiliki gambar profil untuk mendefinisikan anda di dalam kartu identitas!"
+
+msgid "Address"
+msgstr "Alamat"
+
+msgid "Street"
+msgstr "Jalan"
+
+msgid "City"
+msgstr "Kota"
+
+msgid "Postal code"
+msgstr "Kode pos"
+
+msgid "Country"
+msgstr "Negara"
+
+msgid "Biography"
+msgstr "Biografi"
+
+msgid "Important notice"
+msgstr "Pemberitahuan penting"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr "Hati-hati dengan informasi yang anda tulis ke profil anda, karena bisa diakses oleh setiap orang (bahkan seseorang yang anda tidak inginkan)."
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr "Tidak semuanya pribadi di XMPP; ini adalah salah satunya, profil publik anda (vCard)."
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr "Sangat dianjurkan untuk meng-upload gambar profil (maksimum %s), seperti gambar diri, karena itu yang membuat anda mudah dikenali oleh teman-teman anda."
+
+msgid "Save"
+msgstr "Simpan"
+
+msgid "Cancel"
+msgstr "Batal"
+
+msgid "Edit options"
+msgstr "Edit pilihan"
+
+msgid "Channel"
+msgstr "Channel"
+
+msgid "Commands"
+msgstr "Perintah"
+
+msgid "Sounds"
+msgstr "Suara"
+
+msgid "Privacy"
+msgstr "Privasi"
+
+msgid "Message archiving"
+msgstr "Pengarsipan pesan"
+
+msgid "Store a history of your chats"
+msgstr "Menyimpan riwayat chatting anda"
+
+msgid "Geolocation"
+msgstr "Geolokasi"
+
+msgid "Empty"
+msgstr "Kosong"
+
+msgid "Empty channel"
+msgstr "Kosongkan channel"
+
+msgid "Persistent"
+msgstr "Gigih"
+
+msgid "Maximum notices"
+msgstr "Pemberitahuan maksimum"
+
+msgid "Account"
+msgstr "Akun"
+
+msgid "Change password"
+msgstr "Ubah password"
+
+msgid "Delete account"
+msgstr "Hapus akun"
+
+msgid "Old"
+msgstr "Tua"
+
+msgid "New (2 times)"
+msgstr "Baru (2 kali)"
+
+msgid "Continue"
+msgstr "Lanjutkan"
+
+msgid "To"
+msgstr "Ke"
+
+msgid "Close"
+msgstr "Tutup"
+
+msgid "unknown"
+msgstr "Tidak diketahui"
+
+msgid "Unavailable"
+msgstr "Tidak ditempat"
+
+msgid "is now"
+msgstr "sedang"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr "Harap tunggu sementara avatar anda sedang di proses ..."
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "Ini dia! Sebuah foto profil baru yang indah!"
+
+msgid "The image file is not supported or has a bad size."
+msgstr "File gambar tidak didukung atau memiliki ukuran yang buruk."
+
+msgid "Reply"
+msgstr "Balas"
+
+msgid "Error"
+msgstr "Kesalahan"
+
+msgid "Click here to solve the error"
+msgstr "Klik di sini untuk memperbaiki kesalahan"
+
+msgid "You"
+msgstr "Anda"
+
+msgid "Remove"
+msgstr "Hapus"
+
+msgid "Rename"
+msgstr "Ubah nama"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "Hi, saya %s, saya ingin menambahkan anda sebagai teman saya."
+
+msgid "Smiley insertion"
+msgstr "Masukkan Smiley"
+
+msgid "Change style"
+msgstr "Mengubah gaya"
+
+msgid "Text in bold"
+msgstr "Teks dalam huruf tebal"
+
+msgid "Text in italic"
+msgstr "Teks dengan huruf miring"
+
+msgid "Underlined text"
+msgstr "Garisbawahi teks"
+
+msgid "Save chat"
+msgstr "Simpan pembicaraan"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr "Klik pada link berikut untuk mendapatkan log pembicaraan, tunggu. Lalu klik lagi untuk mendapatkan file."
+
+msgid "This chat is empty!"
+msgstr "Obrolan ini kosong!"
+
+msgid "Generate file!"
+msgstr "Menghasilkan file!"
+
+msgid "Download file!"
+msgstr "Download file!"
+
+msgid "Clean current chat"
+msgstr "Bersihkan obrolan saat ini"
+
+msgid "View chat history"
+msgstr "Lihat riwayat obrolan"
+
+msgid "Show user profile"
+msgstr "Tampilkan profil pengguna"
+
+msgid "Add this contact to your friends"
+msgstr "Tambahkan kontak ini ke teman anda"
+
+msgid "Add this groupchat to your favorites"
+msgstr "Tambahkan groupchat ini ke favorit anda"
+
+msgid "All tabs"
+msgstr "Semua tab"
+
+msgid "Close this tab"
+msgstr "Tutup tab ini"
+
+msgid "no subject defined for this room."
+msgstr "tidak ada subjek yang ditetapkan untuk room ini."
+
+msgid "Administration panel for this room"
+msgstr "Administrasi panel untuk room ini"
+
+msgid "Moderators"
+msgstr "Moderator"
+
+msgid "Participants"
+msgstr "Peserta"
+
+msgid "Visitors"
+msgstr "Pengunjung"
+
+msgid "Manage favorite rooms"
+msgstr "Mengelola room favorit"
+
+msgid "Change favorites"
+msgstr "Ubah favorit"
+
+msgid "Search a room"
+msgstr "Mencari room chat"
+
+msgid "Select a favorite"
+msgstr "Pilih favorit"
+
+msgid "Getting the name..."
+msgstr "Mendapatkan nama..."
+
+msgid "Gateway"
+msgstr "Gateway"
+
+msgid "Name"
+msgstr "Nama"
+
+msgid "Room"
+msgstr "Room"
+
+msgid "Add"
+msgstr "Tambahkan"
+
+msgid "Edit"
+msgstr "Mengedit"
+
+msgid "Search a room on"
+msgstr "Cari kamar di"
+
+msgid "No room found on this server."
+msgstr "Tidak ditemukan room di server ini."
+
+msgid "Service discovery"
+msgstr "Penemuan layanan"
+
+msgid "Server to query"
+msgstr "Server untuk permintaan"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr "Maaf, tapi entitas tidak mengembalikan hasil apapun!"
+
+msgid "Accounts"
+msgstr "Akun"
+
+msgid "Authentications"
+msgstr "Otentikasi"
+
+msgid "Automation"
+msgstr "Otomatisasi"
+
+msgid "Clients"
+msgstr "Klien"
+
+msgid "Collaboration"
+msgstr "Kolaborasi"
+
+msgid "Components"
+msgstr "Komponen"
+
+msgid "Rooms"
+msgstr "Kamar"
+
+msgid "Directories"
+msgstr "Direktori"
+
+msgid "Gateways"
+msgstr "Gateway"
+
+msgid "News"
+msgstr "Berita"
+
+msgid "Hierarchy"
+msgstr "Hirarki"
+
+msgid "Proxies"
+msgstr "Proxy"
+
+msgid "Publication/Subscription"
+msgstr "Publikasi / Berlangganan"
+
+msgid "Storage"
+msgstr "Penyimpanan"
+
+msgid "Service offline or broken"
+msgstr "Layanan sedang offline atau rusak"
+
+msgid "Your inbox"
+msgstr "Kotak masuk anda"
+
+msgid "Available actions"
+msgstr "Tersedia tindakan"
+
+msgid "Clean"
+msgstr "Bersih"
+
+msgid "New"
+msgstr "Baru"
+
+msgid "Received"
+msgstr "Diterima"
+
+msgid "Subject"
+msgstr "Subjek"
+
+msgid "Content"
+msgstr "Konten"
+
+msgid "Send message"
+msgstr "Kirim pesan"
+
+msgid "Your inbox is empty."
+msgstr "Kotak masuk kosong."
+
+msgid "MUC administration"
+msgstr "MUC administrasi"
+
+msgid "You administrate this room"
+msgstr "Anda administrate room ini"
+
+msgid "Enter new subject"
+msgstr "Masukkan subjek baru"
+
+msgid "Configuration"
+msgstr "Konfigurasi"
+
+msgid "Authorizations"
+msgstr "Otorisasi"
+
+msgid "Member list"
+msgstr "Daftar anggota"
+
+msgid "Owner list"
+msgstr "Daftar pemilik"
+
+msgid "Administrator list"
+msgstr "Daftar Administrator"
+
+msgid "Outcast list"
+msgstr "Daftar terbuang"
+
+msgid "Add an input"
+msgstr "Tambahkan masukan"
+
+msgid "Destroy this MUC"
+msgstr "Hancurkan MUC ini"
+
+msgid "Yes, let's do it!"
+msgstr "Ya, mari kita melakukannya!"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr "Teman anda sedang memperhatikan percakapan."
+
+msgid "Your friend is writing a message..."
+msgstr "Teman anda sedang menulis pesan ..."
+
+msgid "Your friend stopped writing a message."
+msgstr "Teman anda berhenti menulis pesan."
+
+msgid "Your friend is doing something else."
+msgstr "Teman anda sedang melakukan sesuatu yang lain."
+
+msgid "Your friend closed the chat."
+msgstr "Teman anda menutup obrolan."
+
+msgid "Requesting this service..."
+msgstr "Meminta layanan ini ..."
+
+msgid "Loading"
+msgstr "Pemuatan"
+
+msgid "joined the chat room"
+msgstr "bergabung dengan chat room"
+
+msgid "left the chat room"
+msgstr "meninggalkan chat room"
+
+msgid "no status"
+msgstr "tidak ada status"
+
+msgid "has been kicked"
+msgstr "telah ditendang"
+
+msgid "has been banned"
+msgstr "telah dilarang"
+
+msgid "no reason"
+msgstr "tanpa alasan"
+
+msgid "Communicate with the entire world!"
+msgstr "Berkomunikasi dengan seluruh dunia!"
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr "Hal ini memungkinkan anda untuk berhubungan dengan jutaan pengguna yang saat ini menggunakan jaringan XMPP seperti yang anda lakukan dengan Jappix. Bergabung dengan komunitas dan tetap bebas!"
+
+msgid "Hi there!"
+msgstr "Halo semua!"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr "Selamat datang di %1s, ā%2sā."
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr "Masuk ke akun XMPP anda atau buat yang baru dengan gratis!"
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr "Jappix adalah sebuah proyek open source dari PostPro, sebuah organisasi non-profit yang memberikan kita bantuan besar."
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr "Masuk ke akun XMPP anda. Anda juga dapat menggunakan %s untuk bergabung dengan suatu groupchat."
+
+msgid "Previous"
+msgstr "Sebelumnya"
+
+msgid "General"
+msgstr "Umum"
+
+msgid "Advanced"
+msgstr "Lebih lanjut"
+
+msgid "Resource"
+msgstr "Sumber daya"
+
+msgid "Priority"
+msgstr "Prioritas"
+
+msgid "Low"
+msgstr "Rendah"
+
+msgid "Medium"
+msgstr "Menengah"
+
+msgid "High"
+msgstr "Tinggi"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr "Masukkan groupchat yang anda ingin bergabung dan nick yang ingin anda miliki. Anda juga dapat kembali ke %s."
+
+msgid "login page"
+msgstr "halaman masuk"
+
+msgid "Share this link with your friends:"
+msgstr "Berbagi link ini dengan teman anda:"
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr "Daftarkan akun XMPP baru untuk bergabung dengan teman-teman anda di atas awan sosial anda sendiri. Sederhana bukan!"
+
+msgid "Required"
+msgstr "Diperlukan"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr "Anda telah terdaftar, alamat XMPP anda adalah:"
+
+msgid "Manager"
+msgstr "Manajer"
+
+msgid "Project"
+msgstr "Proyek"
+
+msgid "Encrypted"
+msgstr "Terenkripsi"
+
+msgid "Unencrypted"
+msgstr "Tidak terenkripsi"
+
+msgid "Where are you?"
+msgstr "Di mana anda?"
+
+msgid "What's up with you?"
+msgstr "Ada apa dengan anda?"
+
+msgid "Fetching the social channel..."
+msgstr "Mengambil saluran sosial ..."
+
+msgid "You are synchronized with your network."
+msgstr "Anda telah disinkronkan dengan jaringan anda."
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr "Tidak dapat mengirim apapun: anda hanya dapat menerima pemberitahuan!"
+
+msgid "Media viewer"
+msgstr "Media penampil"
+
+msgid "Browse"
+msgstr "Daftar"
+
+msgid "Command"
+msgstr "Perintah"
+
+msgid "Subscribe"
+msgstr "Berlangganan"
+
+msgid "Join"
+msgstr "Bergabung"
+
+msgid "Automatic"
+msgstr "Otomatis"
+
+msgid "Search"
+msgstr "Pencarian"
+
+msgid "No result!"
+msgstr "Tidak ada hasil!"
+
+msgid "No notifications."
+msgstr "Tidak ada pemberitahuan."
+
+msgid "would like to add you as a friend."
+msgstr "ingin menambahkan anda sebagai teman."
+
+msgid "would like you to join this chatroom:"
+msgstr "ingin anda untuk bergabung dengan chatroom:"
+
+msgid "Do you accept?"
+msgstr "Apakah anda menerima?"
+
+msgid "Yes"
+msgstr "Ya"
+
+msgid "No"
+msgstr "Tidak"
+
+msgid "would like to get authorization."
+msgstr "ingin mendapatkan otorisasi."
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr "Apakah anda ingin melihat teman-teman %s yang menyarankan anda?"
+
+msgid "Submit"
+msgstr "Menyerahkan"
+
+msgid "Client"
+msgstr "Klien"
+
+msgid "System"
+msgstr "Sistem"
+
+msgid "Local time"
+msgstr "Waktu setempat"
+
+msgid "Comments"
+msgstr "Komentar"
+
+msgid "User profile"
+msgstr "Profil pengguna"
+
+msgid "See his/her position on the globe"
+msgstr "Lihat / nya posisinya di dunia"
+
+msgid "Confirm"
+msgstr "Menegaskan"
+
+msgid "anonymous mode"
+msgstr "modus anonim"
+
+msgid "Groups"
+msgstr "Grup"
+
+msgid "Unclassified"
+msgstr "Unclassified"
+
+msgid "Authorize"
+msgstr "Otorisasi"
+
+msgid "Ask for authorization"
+msgstr "Minta untuk otorisasi"
+
+msgid "Unblock"
+msgstr "Tidak dilarang"
+
+msgid "Prohibit"
+msgstr "Melarang"
+
+msgid "Block"
+msgstr "Dilarang"
+
+msgid "Chat"
+msgstr "Bicara"
+
+msgid "Groupchat"
+msgstr "Groupchat"
+
+msgid "Jappix Mobile"
+msgstr "Jappix Handphone"
+
+msgid "Desktop"
+msgstr "Desktop"
+
+msgid "Mobile"
+msgstr "Ponsel"
+
+msgid "Please wait..."
+msgstr "Silakan tunggu ..."
+
+msgid "Please enable JavaScript"
+msgstr "Silahkan mengaktifkan JavaScript"
+
+msgid "Your channel"
+msgstr "Saluran anda"
+
+msgid "Channel of"
+msgstr "Saluran dari "
+
+msgid "More notices..."
+msgstr "Pemberitahuan yang lain..."
+
+msgid "Attach a file"
+msgstr "Lampirkan file"
+
+msgid "Send"
+msgstr "Kirim"
+
+msgid "Unattach the file"
+msgstr "Unattach file"
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr "Sebuah kesalahan terjadi ketika mengupload file anda: mungkin itu terlalu besar (maksimum %s) atau dilarang!"
+
+msgid "Authorization failed"
+msgstr "Otorisasi gagal"
+
+msgid "Registration failed, please choose a different username"
+msgstr "Pendaftaran gagal, silakan pilih username yang berbeda"
+
+msgid "Service unavailable"
+msgstr "Layanan tidak tersedia"
+
+msgid "Internal server error, try later"
+msgstr "Server error, coba beberapa saat kemudian"
+
+msgid "Your form has been sent."
+msgstr "Formulir anda telah dikirim."
+
+msgid "Application"
+msgstr "Aplikasi"
+
+msgid "XMPP links"
+msgstr "XMPP link"
+
+msgid "Open XMPP links with Jappix"
+msgstr "Buka XMPP link dengan Jappix"
+
+msgid "changed the subject to:"
+msgstr "mengubah topik menjadi:"
+
+msgid "Welcome!"
+msgstr "Selamat Datang!"
+
+msgid "Friends"
+msgstr "Teman"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr "Selamat datang di Jappix, awan sosial anda sendiri!"
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr "Sebelum anda mulai menggunakannya, anda harus mengubah beberapa pengaturan, mencari teman dan melengkapi profil anda."
+
+msgid "Enable notification sounds"
+msgstr "Aktifkan suara pemberitahuan"
+
+msgid "Share your position on the globe"
+msgstr "Berbagi posisi anda di dunia"
+
+msgid "Offline friends"
+msgstr "Teman offline"
+
+msgid "Don't hide offline friends"
+msgstr "Jangan sembunyikan teman offline"
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr "Gunakan tool ini untuk menemukan teman-teman anda pada server yang anda gunakan sekarang, atau menambahkan mereka nanti."
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr "Usaha hebat! Sekarang, anda dapat memberitahukan Jappix ke teman-teman anda!"
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr "Ketika anda akan menekan tombol simpan, editor profil akan dibuka. Selamat bersosialisasi!"
+
+msgid "Share Jappix on %s"
+msgstr "Berbagi Jappix ke %s"
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr "Menggunakan Jappix, sebuah platform sosial yang terbuka. Saya s!%"
+
+msgid "Unknown name"
+msgstr "Nama tidak diketahui"
+
+msgid "Unknown country"
+msgstr "Negara tidak diketahui"
+
+msgid "Click to enable"
+msgstr "Klik untuk mengaktifkan"
+
+msgid "Click to disable"
+msgstr "Klik untuk menonaktifkan"
+
+msgid "Installation"
+msgstr "Instalasi"
+
+msgid "Jappix installation"
+msgstr "Instalasi Jappix"
+
+msgid "Welcome to the Jappix installation!"
+msgstr "Selamat datang di instalasi Jappix!"
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr "Alat ini akan membantu anda secara cepat menginstal Jappix, fitur berbasis XMPP penuh pertama untuk platform sosial, pada server anda. Anda bahkan tidak perlu pengetahuan teknis apapun."
+
+msgid "Let's have a look at the installation steps:"
+msgstr "Mari kita lihat langkah-langkah instalasi:"
+
+msgid "Welcome"
+msgstr "Selamat Datang di"
+
+msgid "Storage configuration"
+msgstr "Konfigurasi penyimpanan"
+
+msgid "Administrator account"
+msgstr "Akun administrator"
+
+msgid "Main configuration"
+msgstr "Konfigurasi utama"
+
+msgid "Hosts configuration"
+msgstr "Host konfigurasi"
+
+msgid "Services installation"
+msgstr "Instalasi layanan"
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr "Jika bahasa saat ini tidak cocok dengan anda (%1s), anda dapat membuat Jappix berbicara %2s itu akan disimpan."
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr "Jika anda ingin mendapatkan beberapa bantuan tentang instalasi dan konfigurasi Jappix, anda dapat menggunakan seluruh dokumentasi kami, tersedia di:"
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr "Saatnya untuk membangun 'sosial cloud' anda sendiri: slahkan pergi ke langkah berikutnya!"
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr "Jappix menyimpan data persisten (seperti shared file, log chatting, musik anda sendiri dan konfigurasi nya) ke dalam folder penyimpanan tunggal yang aman."
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr "Jappix harus mampu menulis dalam folder ini untuk membuat sub-direktori. Jika tidak, anda harus mengatur hak untuk %1s atau mengubah pemilik folder untuk %2s (tergantung dari konfigurasi anda)."
+
+msgid "The folder is writable, you can continue!"
+msgstr "Folder dapat ditulis, anda dapat melanjutkan!"
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix menawarkan kemungkinan untuk mengelola konfigurasi anda, menginstal plugin baru atau mencari update. Itulah mengapa anda harus membuat account administrator untuk mengakses manajer."
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr "Ketika Jappix akan diinstal, cukup klik pada link manajer di halaman rumah untuk mengaksesnya."
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr "Ups, anda melewatkan sesuatu atau dua kata sandi tidak cocok!"
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr "Jappix membutuhkan beberapa nilai yang spesifik untuk bekerja. Harap perbaiki masukan sebagai berikut (atau menyimpan nilai-nilai default, yang cukup untuk kebanyakan orang)."
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr "Catatan, jika anda tidak menentukan nilai yang bersifat wajib, maka akan secara otomatis dilengkapi dengan default."
+
+msgid "User"
+msgstr "Pengguna"
+
+msgid "Service"
+msgstr "Layanan"
+
+msgid "Service name"
+msgstr "Nama layanan"
+
+msgid "Service description"
+msgstr "Layanan deskripsi"
+
+msgid "Connection"
+msgstr "Koneksi"
+
+msgid "Lock the host"
+msgstr "Kunci host"
+
+msgid "Anonymous mode"
+msgstr "Modus anonim"
+
+msgid "Registration allowed"
+msgstr "Pendaftaran diperbolehkan"
+
+msgid "Use a proxy"
+msgstr "Gunakan proxy"
+
+msgid "Encryption"
+msgstr "Enkripsi"
+
+msgid "HTTPS storage"
+msgstr "Penyimpanan HTTPS"
+
+msgid "Force HTTPS"
+msgstr "memaksa HTTPS"
+
+msgid "Compression"
+msgstr "Kompresi"
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr "Halaman ini membantu anda menentukan default host Jappix yang akan terhubung. Anda dapat meninggalkan seperti yang sudah ada dan melanjutkan jika anda ingin menggunakan host layanan resmi."
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr "Mungkin anda tidak tahu apa server Bosh adalah? Pada kenyataannya, ini adalah sebuah relay antara klien dan server Jappix XMPP, yang diperlukan karena keterbatasan teknis."
+
+msgid "Main host"
+msgstr "Host Utama"
+
+msgid "Groupchat host"
+msgstr "Host Groupchat"
+
+msgid "Anonymous host"
+msgstr "Host Anonim"
+
+msgid "Directory host"
+msgstr "Host Direktori"
+
+msgid "BOSH host"
+msgstr "Host Bosh"
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr "Anda dapat menginstal beberapa software tambahan pada server anda, untuk memperpanjang fitur Jappix anda. Beberapa yang lain mungkin diubah, karena pembatasan keamanan yang ditetapkan secara default."
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr "Untuk melakukan ini, anda harus dapat akses shell server anda dan login sebagai root. Ingat ini adalah fakultatif, Jappix akan bekerja tanpa modul ini, tetapi beberapa dari fitur-fiturnya akan tersedia."
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr "Setelah anda selesai setup, Jappix akan menghasilkan file cache. Mungkin lambat, hanya menunggu sampai aplikasi ditampilkan dan tidak menekan tombol apapun."
+
+msgid "Thanks for using Jappix!"
+msgstr "Terima kasih untuk menggunakan Jappix!"
+
+msgid "Next"
+msgstr "Berikutnya"
+
+msgid "Finish"
+msgstr "Selesai"
+
+msgid "Check again"
+msgstr "Periksa lagi"
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr "Folder tidak dapat ditulis, mengatur hak akses yang benar ke direktori %s."
+
+msgid "%s is installed on your system."
+msgstr "%s diinstal pada sistem anda."
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr "%1s tidak diinstal pada sistem anda, anda harus menginstal %2s."
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr "PHP ukuran maksimum upload cukup (%s)."
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr "PHP ukuran maksimum upload tidak cukup (%1s), anda harus mendefinisikan ke %2s di %3s."
+
+msgid "Jappix manager"
+msgstr "Jappix manajer"
+
+msgid "Manager access"
+msgstr "Manajer akses"
+
+msgid "Statistics"
+msgstr "Statistik"
+
+msgid "Hosts"
+msgstr "Host"
+
+msgid "Design"
+msgstr "Desain"
+
+msgid "Repeat"
+msgstr "Ulangi"
+
+msgid "All"
+msgstr "Semua"
+
+msgid "Horizontal"
+msgstr "Horisontal"
+
+msgid "Vertical"
+msgstr "Vertikal"
+
+msgid "Center"
+msgstr "Pusat"
+
+msgid "Left"
+msgstr "Kiri"
+
+msgid "Right"
+msgstr "Kanan"
+
+msgid "Top"
+msgstr "Atas"
+
+msgid "Bottom"
+msgstr "Bawah"
+
+msgid "Adapt"
+msgstr "Menyesuaikan"
+
+msgid "Color"
+msgstr "Warna"
+
+msgid "Users"
+msgstr "Pengguna"
+
+msgid "Updates"
+msgstr "Update"
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr "Ini adalah area terbatas: hanya pengguna yang berwenang dapat mengatur node ini Jappix."
+
+msgid "Please use the form below to login to the administration panel."
+msgstr "Silakan gunakan formulir di bawah untuk login ke panel administrasi."
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr "Untuk meningkatkan keamanan, sesi yang terbatas dalam waktu dan saat browser anda akan ditutup, anda akan log out."
+
+msgid "Credentials"
+msgstr "Surat kepercayaan"
+
+msgid "You have been logged out. Goodbye!"
+msgstr "Anda telah keluar. Selamat tinggal!"
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr "Ups, anda tidak dapat diakui sebagai administrator yang valid. Periksa kredensial anda!"
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr "Statistik dasar yang diproses oleh Jappix tentang beberapa hal penting, anda dapat menemukan mereka di bawah ini."
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr "Ubah Jappix konfigurasi node dengan alat ini."
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr "Mengubah host XMPP bahwa node ini Jappix melayani dengan alat ini."
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr "Semua file ini disimpan Jappix node dapat dikelola dengan alat ini: silahkan pilih sub-folder dan mulai mengedit isinya!"
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr "Jappix sepenuhnya dapat disesuaikan: anda bisa mengubah desain di sini."
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr "Ini bukan gambar yang sesuai, tolong gunakan PNG, GIF atau JPG!"
+
+msgid "The image could not be received, would you mind retry?"
+msgstr "Gambar tidak dapat diterima, maukah kau coba lagi?"
+
+msgid "Your image was added to the list!"
+msgstr "Gambar anda telah ditambahkan ke dalam daftar!"
+
+msgid "Changes saved!"
+msgstr "Perubahan disimpan!"
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr "Anda dapat menentukan lebih dari satu administrator untuk node ini Jappix. Anda juga dapat mengubah password dengan alat ini."
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr "Perbarui simpul Jappix anda dengan alat ini, atau periksa jika yang baru tersedia. Informasi tentang versi terbaru juga ditampilkan (dalam bahasa Inggris)."
+
+msgid "Access statistics"
+msgstr "Akses statistik"
+
+msgid "Share statistics"
+msgstr "Berbagi statistik"
+
+msgid "Other statistics"
+msgstr "Lain statistik"
+
+msgid "January"
+msgstr "Januari"
+
+msgid "February"
+msgstr "Februari"
+
+msgid "March"
+msgstr "Maret"
+
+msgid "April"
+msgstr "April"
+
+msgid "May"
+msgstr "Mei"
+
+msgid "June"
+msgstr "Juni"
+
+msgid "July"
+msgstr "Juli"
+
+msgid "August"
+msgstr "Agustus"
+
+msgid "September"
+msgstr "September"
+
+msgid "October"
+msgstr "Oktober"
+
+msgid "November"
+msgstr "November"
+
+msgid "December"
+msgstr "Desember"
+
+msgid "Monday"
+msgstr "Senin"
+
+msgid "Tuesday"
+msgstr "Selasa"
+
+msgid "Wednesday"
+msgstr "Rabu"
+
+msgid "Thursday"
+msgstr "Kamis"
+
+msgid "Friday"
+msgstr "Jumat"
+
+msgid "Saturday"
+msgstr "Sabtu"
+
+msgid "Sunday"
+msgstr "Minggu"
+
+msgid "Total"
+msgstr "Total"
+
+msgid "Cache"
+msgstr "Penutup"
+
+msgid "Logs"
+msgstr "Log"
+
+msgid "Music"
+msgstr "Musik"
+
+msgid "Backgrounds"
+msgstr "Backgrounds"
+
+msgid "Share"
+msgstr "Berbagi"
+
+msgid "Background"
+msgstr "Latar belakang"
+
+msgid "Notice"
+msgstr "Pemberitahuan"
+
+msgid "Your design preferences have been saved!"
+msgstr "Setting gambar anda telah disimpan!"
+
+msgid "Please check your inputs: something is missing!"
+msgstr "Silakan periksa masukan anda: sesuatu yang hilang!"
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr "Ubah latar belakang simpul Jappix dengan alat ini. Anda juga dapat mengatur warna kustom atau foto yang diunggah. Biarkan kreativitas anda mengalir!"
+
+msgid "Use default background"
+msgstr "Gunakan latar belakang standar"
+
+msgid "Use your own image"
+msgstr "Gunakan gambar anda sendiri"
+
+msgid "Select a background to use and change the display options."
+msgstr "Pilih latar belakang untuk menggunakan dan mengubah pilihan tampilan."
+
+msgid "Use your own color"
+msgstr "Gunakan warna sendiri"
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr "Ketik nilai warna heksadesimal yang ingin anda gunakan sebagai latar belakang."
+
+msgid "Manage backgrounds"
+msgstr "Mengelola latar belakang"
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr "Anda dapat menambahkan latar belakang baru ke dalam daftar dengan alat ini. Silakan kirim gambar yang valid."
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr "Jika anda ingin menghapus beberapa latar belakang, gunakan browser di bawah ini."
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr "Tentukan pemberitahuan homepage untuk semua pengguna anda, seperti memperingatkan, pesan penting atau sebuah iklan dengan alat ini."
+
+msgid "Simple notice"
+msgstr "Pemberitahuan Sederhana"
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr "Pemberitahuan ini hanya perlu teks sederhana yang akan ditampilkan, tetapi kode tidak diperbolehkan!"
+
+msgid "Advanced notice"
+msgstr "Pemberitahuan Lanjutan"
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr "Anda dapat menyesuaikan pemberitahuan anda dengan embedded HTML, CSS dan JavaScript, tetapi anda perlu kode tampilannya."
+
+msgid "Available updates"
+msgstr "Update tersedia"
+
+msgid "What's new?"
+msgstr "Apa yang baru?"
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr "Folder penyimpanan anda tidak dapat ditulis, silahkan menerapkan hak-hak baik!"
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr "%1s dapat menyebabkan masalah ke proxy, silahkan peningkatan nilai %2s sampai dengan %3s!"
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr "Anda menggunakan versi pengembangan dari Jappix. Pembaruan melalui repositori kita dengan menjalankan: %s."
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr "Sebuah versi Jappix baru tersedia! Memeriksa apa yang baru dan peluncuran update!"
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr "Versi anda keluar untuk tanggal. Update sekarang untuk %s dengan mengklik di sini!"
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr "Versi anda tampaknya up to date, tetapi anda dapat memeriksa update secara manual dengan mengklik di sini."
+
+msgid "Check for updates"
+msgstr "Periksa pembaruan"
+
+msgid "Update in progress"
+msgstr "Update sedang diproses"
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr "Jappix telah diperbarui: anda sekarang menjalankan versi terbaru. Selamat Bersenang-senang!"
+
+msgid "The update has failed! Please try again later."
+msgstr "Update telah gagal! Silakan coba lagi nanti."
+
+msgid "Downloading package..."
+msgstr "Men-download paket ..."
+
+msgid "Removing current Jappix system files..."
+msgstr "Menghapus file saat ini Jappix sistem ..."
+
+msgid "Extracting package..."
+msgstr "Ekstrak paket ..."
+
+msgid "Regenerating storage folder tree..."
+msgstr "Regenerasi penyimpanan folder ..."
+
+msgid "Jappix is now up to date!"
+msgstr "Jappix sekarang terbaru!"
+
+msgid "Aborted: socket error!"
+msgstr "Dibatalkan: kesalahan socket!"
+
+msgid "Aborted: buffer error!"
+msgstr "Dibatalkan: kesalahan penyangga!"
+
+msgid "Aborted: everything is not writable!"
+msgstr "Dibatalkan: semuanya tidak ditulis!"
+
+msgid "Aborted: could not extract the package!"
+msgstr "Dibatalkan: tidak bisa ekstrak paket itu!"
+
+msgid "Visits"
+msgstr "Kunjungan"
+
+msgid "Daily"
+msgstr "Harian"
+
+msgid "Weekly"
+msgstr "Mingguan"
+
+msgid "Monthly"
+msgstr "Bulanan"
+
+msgid "Yearly"
+msgstr "Tahunan"
+
+msgid "Size"
+msgstr "Ukuran"
+
+msgid "Clean everything"
+msgstr "Bersihkan semua"
+
+msgid "Purge cache"
+msgstr "Purge Cache"
+
+msgid "Purge logs"
+msgstr "Purge log"
+
+msgid "Purge updates"
+msgstr "Purge update"
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr "Folder penyimpanan yang anda ingin bersihkan sekarang kosong!"
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr "Pertahankan Jappix anda agar selalu segar dan cepat, bersihkan folder penyimpanan secara teratur!"
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr "Upload musik anda (Ogg Vorbis, MP3 atau WAV) untuk dapat didengarkan di Jappix!"
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr "File yang ingin anda upload harus lebih kecil dari %s."
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr "Tetap setia dalam apa toko pengguna anda pada server anda dan menghapus konten yang tidak diinginkan dengan alat ini."
+
+msgid "Title"
+msgstr "Judul"
+
+msgid "Artist"
+msgstr "Artist"
+
+msgid "Album"
+msgstr "Album"
+
+msgid "File"
+msgstr "File yang"
+
+msgid "Upload"
+msgstr "Upload"
+
+msgid "The folder is empty."
+msgstr "Folder kosong."
+
+msgid "The music could not be received, please retry!"
+msgstr "Musik tidak dapat didengar, silahkan coba lagi"
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr "Ini bukan file musik yang valid, silakan mengkodekan dalam Ogg Vorbis, MP3 atau WAV!"
+
+msgid "Your music has been added!"
+msgstr "Lagu anda telah dimasukkan"
+
+msgid "The selected elements have been removed."
+msgstr "Unsur-unsur yang dipilih telah dihapus."
+
+msgid "You must select elements to remove!"
+msgstr "Anda harus memilih elemen untuk menghapus!"
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr "Menambahkan user baru dengan alat ini, atau mengubah password (ketikkan nama pengguna yang sudah ada). Harap kirimkan password yang kuat!"
+
+msgid "Manage"
+msgstr "Mengelola"
+
+msgid "List"
+msgstr "Daftar"
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr "Hapus pengguna dengan alat ini. Perhatikan bahwa anda tidak dapat menghapus pengguna jika ia adalah satu-satunya yang tersisa."
+
+msgid "The user has been added!"
+msgstr "Pengguna telah ditambahkan!"
+
+msgid "The chosen users have been removed."
+msgstr "Para pengguna yang dipilih telah dihapus."
+
+msgid "You must select one or more users to be removed!"
+msgstr "Anda harus memilih satu atau lebih pengguna untuk dihapus"
+
+msgid "Yesterday"
+msgstr "Kemarin"
+
+msgid "%s days ago"
+msgstr "%s hari yang lalu"
+
+msgid "User currently active"
+msgstr "Pengguna yang sedang aktif"
+
+msgid "Last seen: %s"
+msgstr "Terakhir dilihat: %s"
+
+msgid "Inactive since: %s"
+msgstr "Tidak aktif sejak: %s"
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr "Teman anda tampaknya tidak menerima pesan anda (s)!"
+
+msgid "Static content server"
+msgstr "Statis server isi"
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr "Ini adalah server konten statis untuk %1s, ā%2sā."
+
+msgid "Suggested friends"
+msgstr "Sarankan teman"
+
+msgid "Check all"
+msgstr "Periksa semua"
+
+msgid "Uncheck all"
+msgstr "Hapus centang semua"
+
+msgid "Choose"
+msgstr "Pilih"
+
+msgid "List name"
+msgstr "Daftar nama"
+
+msgid "Allow"
+msgstr "Perbolehkan"
+
+msgid "Deny"
+msgstr "Menolak"
+
+msgid "Group"
+msgstr "Kelompok"
+
+msgid "Subscription"
+msgstr "Berlangganan"
+
+msgid "Both"
+msgstr "Keduanya"
+
+msgid "From"
+msgstr "Dari"
+
+msgid "Everybody"
+msgstr "Semua orang"
+
+msgid "Send messages"
+msgstr "Kirim pesan"
+
+msgid "Send queries"
+msgstr "Kirim query"
+
+msgid "See my status"
+msgstr "Lihat status saya"
+
+msgid "Send his/her status"
+msgstr "Kirim statusnya"
+
+msgid "Everything"
+msgstr "Segalanya"
+
+msgid "Item"
+msgstr "Barang"
+
+msgid "Order"
+msgstr "Rangka"
+
+msgid "Active for this session"
+msgstr "Aktif untuk sesi ini"
+
+msgid "Always active"
+msgstr "Selalu aktif"
+
+msgid "User directory"
+msgstr "Direktori user"
+
+msgid "Search a friend"
+msgstr "Cari teman"
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr "Fitur yang diminta tidak dilaksanakan oleh penerima atau server dan karena itu tidak dapat diproses."
+
+msgid "This is a repeat from %s"
+msgstr "Ini adalah pengulangan dari %s"
+
+msgid "Loading comments..."
+msgstr "Memuat komentar..."
+
+msgid "Type your comment here..."
+msgstr "Ketik komentar anda di sini..."
+
+msgid "Could not get the comments!"
+msgstr "Tidak dapat menampilkan komentar!"
+
+msgid "Show comments"
+msgstr "Tampilkan komentar"
+
+msgid "Send him/her a message"
+msgstr "Kirim kan dia pesan"
+
+msgid "Start a chat with him/her"
+msgstr "Mulai obrolan dengan dia"
+
+msgid "Media integration"
+msgstr "Integrasi Media"
+
+msgid "Comments locked!"
+msgstr "Komentar terkunci!"
+
+msgid "Type something you want to share with your friends..."
+msgstr "Ketik sesuatu untuk dibagikan ke teman..."
+
+msgid "changed his/her nickname to %s"
+msgstr "merubah nama panggilannya ke %s"
+
+msgid "commented an item you follow: ā%sā."
+msgstr "mengkomentari item yang kamu ikuti: ā%sā."
+
+msgid "Hide"
+msgstr "Menyembunyikan"
+
+msgid "liked your post: ā%sā."
+msgstr "suka dengan isian anda: ā%sā."
+
+msgid "quoted you somewhere: ā%sā."
+msgstr "dikutip di suatu tempat: ā%sā."
+
+msgid "published on your wall: ā%sā."
+msgstr "diterbitkan di dinding: ā%sā."
+
+msgid "tagged you in a photo (%s)."
+msgstr "tag anda di photo (%s)"
+
+msgid "tagged you in a video (%s)."
+msgstr "tag anda di video (%s)."
+
+msgid "Show"
+msgstr "Tampilkan"
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr "Perlu bantuan? Anda sebaiknya membaca halaman dokumentasi kami tentang bagaimana mengisi formulir ini!"
+
+msgid "Pubsub host"
+msgstr "Host Pubsub"
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr "Jappix adalah sebuah platform sosial yang hebat, yang dapat Anda akses di manapun Anda berada, kapan pun Anda inginkan dan berkomunikasi dengan siapapun yang Anda inginkan."
+
+msgid "Manager link"
+msgstr "Link manager"
+
+msgid "User uploads server"
+msgstr "Server upload pengguna"
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr "Ini server upload pengguna untuk %1s, ā%2sā."
+
+msgid "Logo"
+msgstr "Logo"
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr "Anda dapat mengatur logo layanan Anda sendiri untuk menggantikan default. Jaga ukuran dan warna utama logo masing-masing!"
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr "Upload masing-masing logo dengan ukuran pixel maksimum yang disarankan."
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr "Ini bukan gambar yang sesuai, tolong gunakan format PNG!"
+
+msgid "Your service logo has been successfully changed!"
+msgstr "Servis logo anda telah sukses diganti!"
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr "Format logo anda harus PNG. Tinggalkan field kosong dan Logo tidak akan terganti."
+
+msgid "Remove this logo"
+msgstr "Hapus logo ini"
+
+msgid "View this logo"
+msgstr "Lihat logo ini"
+
+msgid "Send a file"
+msgstr "Mengirim file"
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr "Setelah upload, teman Anda akan diminta untuk men-download file yang Anda kirim."
+
+msgid "Groupchats to join"
+msgstr "Groupchats untuk bergabung"
+
+msgid "Purge sent files"
+msgstr "Purge file terkirim"
+
+msgid "would like to send you a file: ā%sā."
+msgstr "ingin mengirimkan file: ā%sā."
+
+msgid "has accepted to received your file: ā%sā."
+msgstr "telah diterima untuk menerima file anda: ā%sā."
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr "telah menolak untuk menerima file anda: ā%sā."
+
+msgid "could not receive your file: ā%sā."
+msgstr "tidak bisa menerima file anda: ā%sā."
+
+msgid "has received a file exchange request: ā%sā."
+msgstr "telah menerima permintaan pertukaran file: ā%sā."
+
+msgid "Available shortcuts:"
+msgstr "Tersedia jalan pintas:"
+
+msgid "%s removes the chat logs"
+msgstr "%s menghapus chat log"
+
+msgid "%s joins a groupchat"
+msgstr "%s bergabung groupchat"
+
+msgid "%s closes the chat"
+msgstr "%s menutup obrolan"
+
+msgid "%s shows the user profile"
+msgstr "%s menunjukkan profil pengguna"
+
+msgid "%s sends a message to the room"
+msgstr "%s mengirim pesan ke room"
+
+msgid "%s changes your nickname"
+msgstr "%s perubahan nama panggilan anda"
+
+msgid "%s sends a message to someone in the room"
+msgstr "%s mengirim pesan kepada seseorang di dalam room"
+
+msgid "%s changes the room topic"
+msgstr "%s merubah topik di room"
+
+msgid "%s kicks an user of the room"
+msgstr "%s tendang pengguna room"
+
+msgid "%s bans an user of the room"
+msgstr "%s melarang pengguna ke room"
+
+msgid "%s invites someone to join the room"
+msgstr "%s mengajak seseorang untuk bergabung dalam room"
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr ""
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# Italian translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:27+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "Javascript ĆØ disattivato nel tuo browser, ed ĆØ richiesto per lanciare Jappix correttamente!"
+
+msgid "An open social network"
+msgstr "Un network sociale aperto"
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "Jappix ĆØ stato interrotto da un errore di rete, un bug o un login errato (controlla di aver inserito le credenziali corrette), ci spiace per il disagio."
+
+msgid "The element list on this server could not be obtained!"
+msgstr "Non sono stato in grado di ottenere la lista elementi di questo server!"
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "La tua password ĆØ stata cambiata, puoi accedere con i tuoi nuovi dati di accesso."
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "Il tuo account XMPP ĆØ stato rimosso, arrivederci!"
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "Ti sei disconnesso dal tuo account XMPP, buona giornata!"
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "La room a cui hai scelto di partecipare non esiste, dovresti crearla!"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "La chat di gruppo ĆØ stata rimossa, qualcun altro sarĆ adesso in grado di ricrearla."
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "L'utente che vuoi raggiungere non ĆØ presente nella room."
+
+msgid "Please enter the group chat address to join."
+msgstr "Perpiacere inserisci l'indirizzo della chat di gruppo a cui vuoi partecipare."
+
+msgid "Please enter your nickname to join %s."
+msgstr "Perpiacere inserisci il tuo nickname per entrare in %s."
+
+msgid "This room (%s) is protected with a password."
+msgstr "Questa room (%s) ĆØ protetta da una password."
+
+msgid "Your browser is out of date!"
+msgstr "Il tuo browser ĆØ obsoleto!"
+
+msgid "Last %s version is better!"
+msgstr "L'ultima versione (%s) ĆØ stata migliorata!"
+
+msgid "Login"
+msgstr "Accedi"
+
+msgid "Register"
+msgstr "Registrati"
+
+msgid "Here we go!"
+msgstr "Ecco fatto!"
+
+msgid "Server"
+msgstr "Server"
+
+msgid "Password"
+msgstr "Password"
+
+msgid "Remember me"
+msgstr "Ricordami"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "Questo strumento ĆØ stato disabilitato, non puoi utilizzarlo!"
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "Per via di un problema di rete, sei stato disconnesso. Cosa vuoi fare adesso?"
+
+msgid "Reconnect"
+msgstr "Riconnetti"
+
+msgid "Messages"
+msgstr "Messaggi"
+
+msgid "Profile"
+msgstr "Profilo"
+
+msgid "Options"
+msgstr "Preferenze"
+
+msgid "Disconnect"
+msgstr "Disconnettiti"
+
+msgid "Filter"
+msgstr "Filtro"
+
+msgid "Add a friend"
+msgstr "Aggiungi un amico o un'amica"
+
+msgid "Your groupchats"
+msgstr "Le tue chat di gruppo"
+
+msgid "Manage your favorite groupchats"
+msgstr "Amministra le tue chat di gruppo preferite"
+
+msgid "More stuff"
+msgstr "Altro"
+
+msgid "Show all friends"
+msgstr "Mostra tutti i tuoi amici"
+
+msgid "Only show connected friends"
+msgstr "Mostra solo gli amici connessi"
+
+msgid "Message archives"
+msgstr "Archivii messaggi"
+
+msgid "Date"
+msgstr "Data"
+
+msgid "Please select a friend to view the chat history."
+msgstr "Selezionare un amico per visualizzare la cronologia della chat"
+
+msgid "Nothing found for: %s"
+msgstr "Nessun risultato per: %s"
+
+msgid "A short message?"
+msgstr "Un piccolo messaggio?"
+
+msgid "How are you?"
+msgstr "Come stai?"
+
+msgid "What are you doing?"
+msgstr "Cosa stai facendo?"
+
+msgid "Join a chat"
+msgstr "Unisciti a una chat"
+
+msgid "Status"
+msgstr "Stato"
+
+msgid "Available"
+msgstr "Disponibile"
+
+msgid "Talkative"
+msgstr "Vuole chiaccherare"
+
+msgid "Away"
+msgstr "Assente"
+
+msgid "Not available"
+msgstr "Indisponibile"
+
+msgid "Busy"
+msgstr "Occupato"
+
+msgid "Mood"
+msgstr "Umore"
+
+msgid "None"
+msgstr "Nessuno"
+
+msgid "Crazy"
+msgstr "Svitato"
+
+msgid "Excited"
+msgstr "Eccitato"
+
+msgid "Playful"
+msgstr "Brioso"
+
+msgid "Happy"
+msgstr "Felice"
+
+msgid "Shocked"
+msgstr "Scioccato"
+
+msgid "Hot"
+msgstr "Ardente"
+
+msgid "Sad"
+msgstr "Triste"
+
+msgid "Amorous"
+msgstr "Amoroso"
+
+msgid "Confident"
+msgstr "Fiducioso"
+
+msgid "Activity"
+msgstr "AttivitĆ "
+
+msgid "Chores"
+msgstr "Sta facendo i mestieri..."
+
+msgid "Drinking"
+msgstr "Sta bevendo..."
+
+msgid "Eating"
+msgstr "Sta mangiando..."
+
+msgid "Exercising"
+msgstr "Esercizio"
+
+msgid "Grooming"
+msgstr "Si sta 'spulciando'..."
+
+msgid "Appointment"
+msgstr "Appuntamento"
+
+msgid "Inactive"
+msgstr "Inattivo"
+
+msgid "Relaxing"
+msgstr "Si rilassa"
+
+msgid "Talking"
+msgstr "Discute"
+
+msgid "Traveling"
+msgstr "In viaggio"
+
+msgid "Working"
+msgstr "Lavoro"
+
+msgid "View profile"
+msgstr "Guarda profilo"
+
+msgid "Repeat this notice"
+msgstr "Ripeti questo avviso"
+
+msgid "Remove this notice"
+msgstr "Rimuovi questa nota"
+
+msgid "Your profile"
+msgstr "Il tuo profilo"
+
+msgid "Identity"
+msgstr "IdentitĆ "
+
+msgid "Profile image"
+msgstr "Immagine del profilo"
+
+msgid "Others"
+msgstr "Altri"
+
+msgid "Personal"
+msgstr "Personale"
+
+msgid "Complete name"
+msgstr "Nome completo"
+
+msgid "Nickname"
+msgstr "Soprannome"
+
+msgid "First name"
+msgstr "Nome"
+
+msgid "Last name"
+msgstr "Cognome"
+
+msgid "Date of birth"
+msgstr "Data di nascita"
+
+msgid "Contact"
+msgstr "Contattaci"
+
+msgid "E-mail"
+msgstr "E-mail"
+
+msgid "Phone"
+msgstr "Telefono"
+
+msgid "Website"
+msgstr "Sito web"
+
+msgid "Current"
+msgstr "Corrente"
+
+msgid "Delete"
+msgstr "Cancella"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "Che peccato, non hai una immagine definita nel profilo della tua vCard!"
+
+msgid "Address"
+msgstr "Indirizzo"
+
+msgid "Street"
+msgstr "Via"
+
+msgid "City"
+msgstr "CittĆ "
+
+msgid "Postal code"
+msgstr "Numero postale"
+
+msgid "Country"
+msgstr "Nazione"
+
+msgid "Biography"
+msgstr "Biografia"
+
+msgid "Important notice"
+msgstr "Avviso importante"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr "Fai attenzione alle informazione che inserisci nel tuo profilo, perchĆØ potrebbero essere viste da chiunque (anche chi non vuoi)."
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr "Non tutto ĆØ riservato su XMPP; come il tuo profilo pubblico (vCard)."
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr "Ti incoraggiamo a caricare un'immagine per il tuo profile (%s massimo), come un'immagine di te stesso/a, ti renderĆ piĆ¹ facilmente riconoscibile dai tuoi amici."
+
+msgid "Save"
+msgstr "Salva"
+
+msgid "Cancel"
+msgstr "Annullare"
+
+msgid "Edit options"
+msgstr "Modifica opzioni"
+
+msgid "Channel"
+msgstr "Canale"
+
+msgid "Commands"
+msgstr "Comandi"
+
+msgid "Sounds"
+msgstr "Suoni"
+
+msgid "Privacy"
+msgstr "Privacy"
+
+msgid "Message archiving"
+msgstr "Archiviazione messaggi"
+
+msgid "Store a history of your chats"
+msgstr "Salva la cronologia delle tue chats"
+
+msgid "Geolocation"
+msgstr "Geolocazione"
+
+msgid "Empty"
+msgstr "Svuota"
+
+msgid "Empty channel"
+msgstr "Svuota canale"
+
+msgid "Persistent"
+msgstr "Persistente"
+
+msgid "Maximum notices"
+msgstr "Notifica di massimo"
+
+msgid "Account"
+msgstr "Account"
+
+msgid "Change password"
+msgstr "Cambia password"
+
+msgid "Delete account"
+msgstr "Cancella account"
+
+msgid "Old"
+msgstr "Vecchio"
+
+msgid "New (2 times)"
+msgstr "Nuovo (2 volte)"
+
+msgid "Continue"
+msgstr "Continua"
+
+msgid "To"
+msgstr "A"
+
+msgid "Close"
+msgstr "Chiuso"
+
+msgid "unknown"
+msgstr "sconosciuto"
+
+msgid "Unavailable"
+msgstr "Non disponibile"
+
+msgid "is now"
+msgstr "ĆØ adesso"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr "Perpiacere attendi mentre carico il tuo avatar..."
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "Ecco qui, la nuova immagine per il tuo profilo!"
+
+msgid "The image file is not supported or has a bad size."
+msgstr "Questo file immagine ĆØ in un formato non supportato o eccede la dimensione massima."
+
+msgid "Reply"
+msgstr "Rispondere"
+
+msgid "Error"
+msgstr "Errore"
+
+msgid "Click here to solve the error"
+msgstr "Clicca qui per risolvere l'errore"
+
+msgid "You"
+msgstr "Tu"
+
+msgid "Remove"
+msgstr "Rimuovi"
+
+msgid "Rename"
+msgstr "Rinomina"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "Ciao, sono %s, vorrei aggiungerti come amico."
+
+msgid "Smiley insertion"
+msgstr "Inserisci un emote"
+
+msgid "Change style"
+msgstr "Cambia stile"
+
+msgid "Text in bold"
+msgstr "Testo in grassetto"
+
+msgid "Text in italic"
+msgstr "Testo in corsivo"
+
+msgid "Underlined text"
+msgstr "Testo sottolineato"
+
+msgid "Save chat"
+msgstr "Salva discussione"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr "Clicca al link seguente per ottenere il log della chat, aspetta un attimo e clicca un'altra volta per ottenere il file."
+
+msgid "This chat is empty!"
+msgstr "Questa chat ĆØ vuota!"
+
+msgid "Generate file!"
+msgstr "Genera il file!"
+
+msgid "Download file!"
+msgstr "Scarica il file!"
+
+msgid "Clean current chat"
+msgstr "Pulisci la discussione corrente"
+
+msgid "View chat history"
+msgstr "Visualizza la cronologia della chat"
+
+msgid "Show user profile"
+msgstr "Mostra il profilo utente"
+
+msgid "Add this contact to your friends"
+msgstr "Aggiungi questo contatto ad i tuoi amici"
+
+msgid "Add this groupchat to your favorites"
+msgstr "Aggiungi questa chat di gruppo ai tuoi favoriti"
+
+msgid "All tabs"
+msgstr "Tutti i cavalieri"
+
+msgid "Close this tab"
+msgstr "Chiudi questo cavaliere"
+
+msgid "no subject defined for this room."
+msgstr "nessun oggetto definito per questa stanza"
+
+msgid "Administration panel for this room"
+msgstr "Pannello di controllo per questa stanza"
+
+msgid "Moderators"
+msgstr "Moderatori"
+
+msgid "Participants"
+msgstr "Partecipanti"
+
+msgid "Visitors"
+msgstr "Visitatori"
+
+msgid "Manage favorite rooms"
+msgstr "Controlla le tue room preferite"
+
+msgid "Change favorites"
+msgstr "Modifica i preferiti"
+
+msgid "Search a room"
+msgstr "Cerca stanza"
+
+msgid "Select a favorite"
+msgstr "Seleziona favorito"
+
+msgid "Getting the name..."
+msgstr "Sto ottenendo il nome..."
+
+msgid "Gateway"
+msgstr "Transporto"
+
+msgid "Name"
+msgstr "Nome"
+
+msgid "Room"
+msgstr "stanza"
+
+msgid "Add"
+msgstr "Aggiungi"
+
+msgid "Edit"
+msgstr "Modifica"
+
+msgid "Search a room on"
+msgstr "Cerca una stanza in"
+
+msgid "No room found on this server."
+msgstr "Nessuna stanza in questo server"
+
+msgid "Service discovery"
+msgstr "Scoperta servizi"
+
+msgid "Server to query"
+msgstr "Server in cui cercare"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr "Ci dispiace, ma l'entitĆ non ha dato nessun risultato!"
+
+msgid "Accounts"
+msgstr "Accounts"
+
+msgid "Authentications"
+msgstr "Autenticazioni"
+
+msgid "Automation"
+msgstr "Automazione"
+
+msgid "Clients"
+msgstr "Clienti"
+
+msgid "Collaboration"
+msgstr "Collaborazione"
+
+msgid "Components"
+msgstr "Componenti"
+
+msgid "Rooms"
+msgstr "Stanze"
+
+msgid "Directories"
+msgstr "Cartelle"
+
+msgid "Gateways"
+msgstr "Gateways"
+
+msgid "News"
+msgstr "News"
+
+msgid "Hierarchy"
+msgstr "Gerarchia"
+
+msgid "Proxies"
+msgstr "i Proxie"
+
+msgid "Publication/Subscription"
+msgstr "Pubblicazioni/Sottoscrizioni"
+
+msgid "Storage"
+msgstr "Spazio"
+
+msgid "Service offline or broken"
+msgstr "Servizio Off.line o Fuori Uso"
+
+msgid "Your inbox"
+msgstr "Messaggi in entrata"
+
+msgid "Available actions"
+msgstr "Azioni disponibili"
+
+msgid "Clean"
+msgstr "Svuota"
+
+msgid "New"
+msgstr "Nuovo"
+
+msgid "Received"
+msgstr "Ricevuti"
+
+msgid "Subject"
+msgstr "Oggetto"
+
+msgid "Content"
+msgstr "Contenuto"
+
+msgid "Send message"
+msgstr "Invia messaggio"
+
+msgid "Your inbox is empty."
+msgstr "Non hai messaggi in entrata."
+
+msgid "MUC administration"
+msgstr "Amministrazione MUC"
+
+msgid "You administrate this room"
+msgstr "Amministra questa stanza"
+
+msgid "Enter new subject"
+msgstr "Inserisci il nuovo topic"
+
+msgid "Configuration"
+msgstr "Configurazione"
+
+msgid "Authorizations"
+msgstr "Autorizzazioni"
+
+msgid "Member list"
+msgstr "Lista utenti"
+
+msgid "Owner list"
+msgstr "Lista gestori"
+
+msgid "Administrator list"
+msgstr "Lista amministratori"
+
+msgid "Outcast list"
+msgstr "Lista dei reietti"
+
+msgid "Add an input"
+msgstr "Aggiungi un input"
+
+msgid "Destroy this MUC"
+msgstr "Distruggi questa MUC"
+
+msgid "Yes, let's do it!"
+msgstr "Si, esegui!"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr "Il tuo amico sta guardando la conversazione."
+
+msgid "Your friend is writing a message..."
+msgstr "Il tuo amico sta scrivendo un messaggio"
+
+msgid "Your friend stopped writing a message."
+msgstr "Il tuo amico ha smesso di scrivere un messaggio"
+
+msgid "Your friend is doing something else."
+msgstr "Il tuo amico sta facendo altro."
+
+msgid "Your friend closed the chat."
+msgstr "Il tuo amico ha chiuso la chat"
+
+msgid "Requesting this service..."
+msgstr "Richiesta del servizio"
+
+msgid "Loading"
+msgstr "Carcamento"
+
+msgid "joined the chat room"
+msgstr "Si ĆØ aggiunto alla chat room"
+
+msgid "left the chat room"
+msgstr "ha lasciato la chat room"
+
+msgid "no status"
+msgstr "nessuno status"
+
+msgid "has been kicked"
+msgstr "ĆØ stato cacciato"
+
+msgid "has been banned"
+msgstr "ĆØ stato escluso"
+
+msgid "no reason"
+msgstr "nessuna ragione"
+
+msgid "Communicate with the entire world!"
+msgstr "Comunica con l'intero mondo"
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr "Ti permette di entrare in contatto con i milioni di utenti che utilizzano XMPP (Jabber) come fai tu con Jappix. Unisciti a noi."
+
+msgid "Hi there!"
+msgstr "Ciao!"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr "Benvenuti su %1s, ā%2sā."
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr "Accedi al tuo account XMPP esistente oppure creane uno nuovo gratuitamente!"
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr "Jappix ĆØ un progetto open-source di PostPro, un'organizzazione senza scopo di lucro che ci ĆØ stata molto d'aiuto."
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr "Accedi utilizzando il tuo account XMPP. Puoi anche utilizzare %s per accedere una chat di gruppo."
+
+msgid "Previous"
+msgstr "Precedente"
+
+msgid "General"
+msgstr "Generale"
+
+msgid "Advanced"
+msgstr "Avanzato"
+
+msgid "Resource"
+msgstr "Risorsa"
+
+msgid "Priority"
+msgstr "PrioritĆ "
+
+msgid "Low"
+msgstr "Inferiore"
+
+msgid "Medium"
+msgstr "Medio"
+
+msgid "High"
+msgstr "Superiore"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr "Inserisci la chat di gruppo a cui vuoi unirti ed il nick che vuoi usare. Puoi anche ritornare ad %s."
+
+msgid "login page"
+msgstr "pagina per login"
+
+msgid "Share this link with your friends:"
+msgstr "Condividi questo link con i tuoi amici"
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr "Registra un nuovo account XMPP/Jabber per unirti ad i tuoi amici nel tuo cloud sociale. E' semplice!"
+
+msgid "Required"
+msgstr "Richiesto"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr "Registrazione completata. Ecco il tuo indirizzo XMPP:"
+
+msgid "Manager"
+msgstr "Amministrazione"
+
+msgid "Project"
+msgstr "Progetto"
+
+msgid "Encrypted"
+msgstr "Criptato"
+
+msgid "Unencrypted"
+msgstr "Non criptato"
+
+msgid "Where are you?"
+msgstr "Dove sei?"
+
+msgid "What's up with you?"
+msgstr "Che passa?"
+
+msgid "Fetching the social channel..."
+msgstr "Sto scaricando il canale sociale..."
+
+msgid "You are synchronized with your network."
+msgstr "Sei sincronizzato con la tua rete."
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr "Impossibile inviare: puoi solo ricevere gli avvisi!"
+
+msgid "Media viewer"
+msgstr "Visualizzatore di Media"
+
+msgid "Browse"
+msgstr "Sfoglia"
+
+msgid "Command"
+msgstr "Comando"
+
+msgid "Subscribe"
+msgstr "Sottoscrivi"
+
+msgid "Join"
+msgstr "Unisciti"
+
+msgid "Automatic"
+msgstr "Automatico"
+
+msgid "Search"
+msgstr "Cerca"
+
+msgid "No result!"
+msgstr "nessun risultato"
+
+msgid "No notifications."
+msgstr "Niente avvisi."
+
+msgid "would like to add you as a friend."
+msgstr "vorrebbe aggiungerti come amico."
+
+msgid "would like you to join this chatroom:"
+msgstr "vorrebbe che lo raggiungessi in questa chatroom:"
+
+msgid "Do you accept?"
+msgstr "Accetti?"
+
+msgid "Yes"
+msgstr "Si"
+
+msgid "No"
+msgstr "No"
+
+msgid "would like to get authorization."
+msgstr "vorrebbe essere autorizzato ad aggiungerti."
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr "Vuoi vedere gli amici suggeriti da %s?"
+
+msgid "Submit"
+msgstr "Invia"
+
+msgid "Client"
+msgstr "Cliente"
+
+msgid "System"
+msgstr "Sistema"
+
+msgid "Local time"
+msgstr "Ora Locale"
+
+msgid "Comments"
+msgstr "Commenti"
+
+msgid "User profile"
+msgstr "Profilo utente"
+
+msgid "See his/her position on the globe"
+msgstr "Visualizza la sua posizione nel modo"
+
+msgid "Confirm"
+msgstr "Conferma"
+
+msgid "anonymous mode"
+msgstr "modalitĆ anonima"
+
+msgid "Groups"
+msgstr "Gruppi"
+
+msgid "Unclassified"
+msgstr "Non classificato"
+
+msgid "Authorize"
+msgstr "Autorizza"
+
+msgid "Ask for authorization"
+msgstr "Chiedi l'autorizzazione"
+
+msgid "Unblock"
+msgstr "Sblocca"
+
+msgid "Prohibit"
+msgstr "Proibisci"
+
+msgid "Block"
+msgstr "Blocca"
+
+msgid "Chat"
+msgstr "Chat"
+
+msgid "Groupchat"
+msgstr "Chat di gruppo"
+
+msgid "Jappix Mobile"
+msgstr "Jappix Mobile"
+
+msgid "Desktop"
+msgstr "Desktop"
+
+msgid "Mobile"
+msgstr "Mobile"
+
+msgid "Please wait..."
+msgstr "Attendere..."
+
+msgid "Please enable JavaScript"
+msgstr "Attiva i javascript"
+
+msgid "Your channel"
+msgstr "Il tuo canale"
+
+msgid "Channel of"
+msgstr "Canale di"
+
+msgid "More notices..."
+msgstr "Altre informazioni"
+
+msgid "Attach a file"
+msgstr "Allega un file"
+
+msgid "Send"
+msgstr "Invia"
+
+msgid "Unattach the file"
+msgstr "Rimuovi il file allegato"
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr "C'ĆØ stato un errore durante il caricamento del tuo file: forse ĆØ troppo grande (%s al massimo) o non permesso!"
+
+msgid "Authorization failed"
+msgstr "Autorizzazione fallita"
+
+msgid "Registration failed, please choose a different username"
+msgstr "Registrazione fallita, scegli un nuovo nome utente"
+
+msgid "Service unavailable"
+msgstr "Servizio non disponibile"
+
+msgid "Internal server error, try later"
+msgstr "Internal server error, prova piĆ¹ tardi"
+
+msgid "Your form has been sent."
+msgstr "Il tuo modulo ĆØ stato inviato."
+
+msgid "Application"
+msgstr "Applicazione"
+
+msgid "XMPP links"
+msgstr "Links XMPP"
+
+msgid "Open XMPP links with Jappix"
+msgstr "Apri i collegamenti XMPP con Jappix"
+
+msgid "changed the subject to:"
+msgstr "Cambia il soggetto a:"
+
+msgid "Welcome!"
+msgstr "Benvenuto!"
+
+msgid "Friends"
+msgstr "Amici"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr "Benvenuto su Jappix, il tuo cloud sociale personale!"
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr "Prima di iniziare ad utilizzare Jappix, devi cambiare alcune impostazione, aggiungere nuovi contatti e completare il tuo profilo."
+
+msgid "Enable notification sounds"
+msgstr "Attiva avvisi sonori"
+
+msgid "Share your position on the globe"
+msgstr "Condividi la tua posizione attuale"
+
+msgid "Offline friends"
+msgstr "Amici non in linea"
+
+msgid "Don't hide offline friends"
+msgstr "Non nascondere amici non in linea"
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr "Utilizza questa utilitĆ per cercare i tuoi amici sul server che stai utilizzando adesso, o aggiungili dopo."
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr "Ben fatto! Adesso, puoi condividere Jappix con i tuoi amici!"
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr "Quando premerai il tasto salva, l'editor del tuo profilo verrĆ aperto. Buona socializzazione!"
+
+msgid "Share Jappix on %s"
+msgstr "Condividi Jappix on %s"
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr "Using Jappix, an open social platform. I am %s!"
+
+msgid "Unknown name"
+msgstr "Nome sconosciuto"
+
+msgid "Unknown country"
+msgstr "Nazione sconosciuta"
+
+msgid "Click to enable"
+msgstr "Clicca per attivare"
+
+msgid "Click to disable"
+msgstr "Clicca per disattivare"
+
+msgid "Installation"
+msgstr "Installazione"
+
+msgid "Jappix installation"
+msgstr "Installazione Jappix"
+
+msgid "Welcome to the Jappix installation!"
+msgstr "Benvenuti nella installazione di Jappix!"
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr "Questo strumento ti aiuterĆ ad installare velocemente Jappix, il primo platform sociale basato su XMPP, sul tuo server. Non ĆØ richiesta alcuna conoscenza tecnica."
+
+msgid "Let's have a look at the installation steps:"
+msgstr "Diamo un occhiata ai passi per l'installazione:"
+
+msgid "Welcome"
+msgstr "Benvenuto"
+
+msgid "Storage configuration"
+msgstr "Configurazione per lo storage dei dati"
+
+msgid "Administrator account"
+msgstr "Account amministrativo"
+
+msgid "Main configuration"
+msgstr "Configurazione principale"
+
+msgid "Hosts configuration"
+msgstr "Configurazione degli hosts"
+
+msgid "Services installation"
+msgstr "Installazione servizi"
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr "Se la lingua corrente non riflette la tua (%1s), puoi fare in modo che Jappix sia tradotto in %2s e sarĆ salvato."
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr "Se hai bisogno di aiuto per l'installazione e la configurazione di Jappix, puoi utilizzare la nostra documentazione online disponibile qui: "
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr "E' tempo di costruire il tuo social cloud: vai al prossimo punto!"
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr "Jappix salva i dati persistenti (come file condivisi, registri delle conversazioni, la tua musica e la sua configurazione) dentro una singola cartella sicura."
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr "Jappix deve avere le autorizzazioni adeguate per scrivere in questa cartella per creare le sotto-directory necessarie. Se no, devi modificare le autorizzazioni per %1s o cambiare il suo proprietario a %2s (dipende anche dalla tua configurazione)."
+
+msgid "The folder is writable, you can continue!"
+msgstr "La directory ĆØ scrivibile, puoi continuare!"
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix ti offre la possibilitĆ controllare la configurazione di Jappix, installare nuove plugins e cercare aggiornamenti. Ecco perchĆØ devi creare un account amministrativo per accedere all'Amministrazione."
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr "Quando Jappix sarĆ installato, semplicemente clicca sul link āAmministrazioneā nella home page per accedervi."
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr "Opps, hai dimenticato qualche cosa o le due password non coincidono!"
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr "Jappix necessita l'impostazione di alcuni dati per funzionare correttamente. Perpiacere cambia i dati seguenti (o mantieni le impostazioni di default)."
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr "Nota che se non specifichi una delle impostazioni obbligatorie, sarĆ automaticamente completata con il valore di default."
+
+msgid "User"
+msgstr "Utente"
+
+msgid "Service"
+msgstr "Servizio"
+
+msgid "Service name"
+msgstr "Nome del servizio"
+
+msgid "Service description"
+msgstr "Descrizione del servizio"
+
+msgid "Connection"
+msgstr "Connessione"
+
+msgid "Lock the host"
+msgstr "Blocca il nome dell'host"
+
+msgid "Anonymous mode"
+msgstr "ModalitĆ anonima"
+
+msgid "Registration allowed"
+msgstr "Registrazione permessa"
+
+msgid "Use a proxy"
+msgstr "Utilizza un proxy"
+
+msgid "Encryption"
+msgstr "Crittografia"
+
+msgid "HTTPS storage"
+msgstr "Usa HTTPS per l'archiviazione"
+
+msgid "Force HTTPS"
+msgstr "Forza HTTPS"
+
+msgid "Compression"
+msgstr "Compressione"
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr "Questa pagina serve a specificare i server principali a cui Jappix si connette. Puoi lasciarli come sono e continuare se vuoi usare il servizio ufficiale."
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr "Forse non sai cos'ĆØ un server BOSH? E' un relay tra Jappix ĆØ il server XMPP, che ĆØ per il momento necessario per limitazioni tecniche."
+
+msgid "Main host"
+msgstr "Host del server"
+
+msgid "Groupchat host"
+msgstr "Host del server MUC"
+
+msgid "Anonymous host"
+msgstr "Host per le connessioni anonime"
+
+msgid "Directory host"
+msgstr "Server per la Directory degli utenti."
+
+msgid "BOSH host"
+msgstr "Server BOSH"
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr "Puoi installare del software opzionale sul tuo server, per estendere le funzioni di Jappix. Alcune altre potrebbero essere modificate, per via delle restrizioni di sicurezza impostate di default."
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr "Per completare questa operazione devi essere in grado di accedere al tuo server tramite terminale come root, Ricordati che questo ĆØ facoltativo, Jappix funziona anche senza questi moduli, ma alcune delle sue caratteristiche non saranno disponibili."
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr "Dopo che completi il setup, Jappix generĆ i files di cache. Potrebbe essere un processo abbastanza lento, semplicemente aspetta che l'applicazione sia mostrata senza premere nessun tasto."
+
+msgid "Thanks for using Jappix!"
+msgstr "Grazie per aver scelto Jappix!"
+
+msgid "Next"
+msgstr "Continua"
+
+msgid "Finish"
+msgstr "Completa"
+
+msgid "Check again"
+msgstr "Controlla ancora"
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr "La cartella non ĆØ scrivibile, imposta le autorizzazioni corrette per %s."
+
+msgid "%s is installed on your system."
+msgstr "%s ĆØ installato sul tuo sistema."
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr "%1s non ĆØ installato sul tuo sistema, dovresti installare %2s."
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr "La dimensione massima degli upload per PHP non ĆØ sufficente (%s)."
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr "La dimensione massima degli upload per PHP non ĆØ sufficente (%s), impostala a %2s in %3s."
+
+msgid "Jappix manager"
+msgstr "Manager di Jappix"
+
+msgid "Manager access"
+msgstr "Access del manager"
+
+msgid "Statistics"
+msgstr "Statistiche"
+
+msgid "Hosts"
+msgstr "Host"
+
+msgid "Design"
+msgstr "Progetto"
+
+msgid "Repeat"
+msgstr "Ripeti"
+
+msgid "All"
+msgstr "Tutti"
+
+msgid "Horizontal"
+msgstr "Orizzontale"
+
+msgid "Vertical"
+msgstr "Verticale"
+
+msgid "Center"
+msgstr "Centro"
+
+msgid "Left"
+msgstr "Sinistra"
+
+msgid "Right"
+msgstr "Destra"
+
+msgid "Top"
+msgstr "In Cima"
+
+msgid "Bottom"
+msgstr "In Fondo"
+
+msgid "Adapt"
+msgstr "Adatta"
+
+msgid "Color"
+msgstr "Colore"
+
+msgid "Users"
+msgstr "Utente"
+
+msgid "Updates"
+msgstr "Aggiornamenti"
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr "Questa ĆØ una area ristretta: solo gli utenti autorizzati possono gestire questo nodo Jappix"
+
+msgid "Please use the form below to login to the administration panel."
+msgstr "Perpiacere utilizza il modulo qui sotto per accedere al Pannello amministrativo."
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr "Per aumentare la sicurezza, le sessioni sono a tempo limitato e quando chiudi il tuo browser, sarai disconnesso."
+
+msgid "Credentials"
+msgstr "Informazioni di accesso"
+
+msgid "You have been logged out. Goodbye!"
+msgstr "Sei stato disconnesso. Arrivederci!"
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr "Opps, non sei stato riconusciuto come un amministratore valido. Controlla le tue credenziali!"
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr "Puoi trovare qui sotto, le statistiche base ottenute da Jappix."
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr "Cambia qui la configurazione del tuo nodo Jappix."
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr "Cambia qui gli hosts XMPP serviti da questo nodo Jappix."
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr "Tutti i file salvati di questo nodo Jappix possono essere controllati da questa pagina: perpiacere scegli una sotto-directory ed inizia a modificare il suo contenuto!"
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr "Jappix ĆØ completamente personalizzabile: puoi cambiare qui il suo look."
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr "Il formato di questa immagine non ĆØ valido, perpiacere utilizza PNG, GIF oppure JPG!"
+
+msgid "The image could not be received, would you mind retry?"
+msgstr "L'immagine non ĆØ stata caricata correttamente, Riprova?"
+
+msgid "Your image was added to the list!"
+msgstr "La tua immagina ĆØ stata aggiunta alla lista!"
+
+msgid "Changes saved!"
+msgstr "Modifiche salvate!"
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr "Puoi definire piĆ¹ di un amministratore per questo nodo Jappix e cambiare qui le passwords associate."
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr "Aggiorna qui il tuo nodo Jappix, puoi anche controllare se una nuova versione e disponibile. Le informazioni sulle ultime versioni sono disponibili solo in inglese."
+
+msgid "Access statistics"
+msgstr "Statistiche sugli accessi"
+
+msgid "Share statistics"
+msgstr "Condividi le statistiche"
+
+msgid "Other statistics"
+msgstr "Altre statistiche"
+
+msgid "January"
+msgstr "Gennaio"
+
+msgid "February"
+msgstr "Febbraio"
+
+msgid "March"
+msgstr "Marzo"
+
+msgid "April"
+msgstr "Aprile"
+
+msgid "May"
+msgstr "Maggio"
+
+msgid "June"
+msgstr "Giugno"
+
+msgid "July"
+msgstr "Luglio"
+
+msgid "August"
+msgstr "Agosto"
+
+msgid "September"
+msgstr "Settembre"
+
+msgid "October"
+msgstr "Ottobre"
+
+msgid "November"
+msgstr "Novembre"
+
+msgid "December"
+msgstr "Dicembre"
+
+msgid "Monday"
+msgstr "LunedƬ"
+
+msgid "Tuesday"
+msgstr "MartedƬ"
+
+msgid "Wednesday"
+msgstr "MercoledƬ"
+
+msgid "Thursday"
+msgstr "GiovedƬ"
+
+msgid "Friday"
+msgstr "VenerdƬ"
+
+msgid "Saturday"
+msgstr "Sabato"
+
+msgid "Sunday"
+msgstr "Domenica"
+
+msgid "Total"
+msgstr "Totali"
+
+msgid "Cache"
+msgstr "Cache"
+
+msgid "Logs"
+msgstr "Registri"
+
+msgid "Music"
+msgstr "Musica"
+
+msgid "Backgrounds"
+msgstr "Sfondi"
+
+msgid "Share"
+msgstr "Condividi"
+
+msgid "Background"
+msgstr "Sfondo"
+
+msgid "Notice"
+msgstr "Avviso"
+
+msgid "Your design preferences have been saved!"
+msgstr "Le tue preferenza per il design sono state salvate!"
+
+msgid "Please check your inputs: something is missing!"
+msgstr "Perpiacere controlla i tuoi dati inseriti: vi sono dei valori mancanti!"
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr "Cambia lo sfondo del tuo nodo Jappix in questa pagina. Puoi scegliere un colore una immagine caricata."
+
+msgid "Use default background"
+msgstr "Utilizza lo sfondo di default"
+
+msgid "Use your own image"
+msgstr "Utilizza una tua immagine"
+
+msgid "Select a background to use and change the display options."
+msgstr "Scegli uno sfondo da utilizzare ĆØ cambia le opzioni di display."
+
+msgid "Use your own color"
+msgstr "Utilizza un tuo colore personalizzato"
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr "Inserisci qui il valore esadecimale del colore che vuoi usare come background."
+
+msgid "Manage backgrounds"
+msgstr "Controlla sfondi"
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr "Puoi aggiungere un nuovo background alla lista con questa utilitĆ . Perpiacere invia un'immagine valida."
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr "Se vuoi rimuovere alcuni sfondi, utilizza browser qui sotto."
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr "Imposta un avviso mostrato nella homepage, per tutti i tuoi utenti come un avviso/messaggio importante con questa utilitĆ ."
+
+msgid "Simple notice"
+msgstr "Avviso semplice"
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr "Questo avviso mostra solo testo semplice, codice HTML non ĆØ permesso!"
+
+msgid "Advanced notice"
+msgstr "Avviso avanzato"
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr "Puoi personalizzare i tuoi avvisi con HTML, CSS e Javascript incluso, ma ĆØ richiesta la conoscenza dei rispettivi linguaggi."
+
+msgid "Available updates"
+msgstr "Aggiornamenti disponibili"
+
+msgid "What's new?"
+msgstr "Cosa c'ĆØ di nuovo?"
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr "Le cartelle per l'archiviazioni non sono scrivibili, perpiacere imposta le autorizzazioni corrette!"
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr "%1s puĆ² causare problemi al proxy, perpiacere incrementa il valore %2s a %3s!"
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr "Stai utilizzando una versione ancora non definitiva di Jappix. La puoi aggiornare tramite il nostro repositorio, eseguendo: %s."
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr "Una nuova versione di Jappix ĆØ disponibile! Controlla il registro delle modifica ed avvia l'aggiornamento!"
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr "La tua versione ĆØ obsoleta. Aggiornala a %s cliccando qui!"
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr "La tua versione sembra essere aggiornata, ma puoi controllare gli aggiornamenti manualmente cliccando qui."
+
+msgid "Check for updates"
+msgstr "Controlla aggiornamenti"
+
+msgid "Update in progress"
+msgstr "Aggiornamento in corso"
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr "Jappix ĆØ stato aggiornato: Stai utilizzando l'ultima version. Divertiti!"
+
+msgid "The update has failed! Please try again later."
+msgstr "L'aggiornamento ĆØ fallito! Perpiacere, riprova piĆ¹ tardi."
+
+msgid "Downloading package..."
+msgstr "Sto scaricando il pacchetto..."
+
+msgid "Removing current Jappix system files..."
+msgstr "Rimozione dei file di sistema di Jappix..."
+
+msgid "Extracting package..."
+msgstr "Sto estraendo il pacchetto..."
+
+msgid "Regenerating storage folder tree..."
+msgstr "Sto rigenerando l'albero delle cartelle di salvataggio..."
+
+msgid "Jappix is now up to date!"
+msgstr "Jappix ĆØ adesso aggiornato!"
+
+msgid "Aborted: socket error!"
+msgstr "Interrotto: errore del socket!"
+
+msgid "Aborted: buffer error!"
+msgstr "Interrotto: errore buffer!"
+
+msgid "Aborted: everything is not writable!"
+msgstr "Interrotto: il percorso non ĆØ scrivibile!"
+
+msgid "Aborted: could not extract the package!"
+msgstr "Interrotto: non ĆØ stato possibile estrarre il pacchetto!"
+
+msgid "Visits"
+msgstr "Visite"
+
+msgid "Daily"
+msgstr "Giornaliero"
+
+msgid "Weekly"
+msgstr "Settimanale"
+
+msgid "Monthly"
+msgstr "Mensile"
+
+msgid "Yearly"
+msgstr "Annuale"
+
+msgid "Size"
+msgstr "Dimensione"
+
+msgid "Clean everything"
+msgstr "Ripristina tutto"
+
+msgid "Purge cache"
+msgstr "Pulisci la cache"
+
+msgid "Purge logs"
+msgstr "Cancella i registri"
+
+msgid "Purge updates"
+msgstr "Pulisci la cartella degli aggiornamenti"
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr "Ho pulito la cartella degli archivi da te indicata!"
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr "La manutenzione di Jappix ĆØ importante, tieni pulite le cartelle di archiviazione!"
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr "Carica la tua musica (OGG Vorbis, MP3 o WAV) per sentirla da Jappix!"
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr "Il file che vuoi caricare deve essere piĆ¹ piccolo di %s."
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr "Puoi controllare qui il contenuto che i tuoi utemti salvano sul server, e rimuore quello indesiderato."
+
+msgid "Title"
+msgstr "Titolo"
+
+msgid "Artist"
+msgstr "Artista"
+
+msgid "Album"
+msgstr "Album"
+
+msgid "File"
+msgstr "File"
+
+msgid "Upload"
+msgstr "Carica"
+
+msgid "The folder is empty."
+msgstr "La cartella ĆØ vuota."
+
+msgid "The music could not be received, please retry!"
+msgstr "La musica non ĆØ stata caricata correttamente, perpiacere riprova!"
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr "Questo non ĆØ un file musicale valido, perpiacere codificalo in OGG Vorbis, MP3 oppure WAV!"
+
+msgid "Your music has been added!"
+msgstr "Ho aggiunto la tua musica!"
+
+msgid "The selected elements have been removed."
+msgstr "Gli elementi selezionati sono stati rimossi."
+
+msgid "You must select elements to remove!"
+msgstr "Devi selezionare almeno un elemento da rimuovere."
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr "Aggiungi un nuovo utente con questa utilitĆ oppure cambia la password di uno esistente. Perpiacere utilizza una password sicura."
+
+msgid "Manage"
+msgstr "Amministra"
+
+msgid "List"
+msgstr "Lista"
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr "Rimuovi gli utenti amministrativi con questa utilitĆ . Nota che deve essere presente almeno un utente amministrativo."
+
+msgid "The user has been added!"
+msgstr "L'utente ĆØ stato aggiunto!"
+
+msgid "The chosen users have been removed."
+msgstr "Gli utenti selezionati sono stati rimossi."
+
+msgid "You must select one or more users to be removed!"
+msgstr "Devi selezionare uno o piĆ¹ utenti da rimuovere!"
+
+msgid "Yesterday"
+msgstr "Ieri"
+
+msgid "%s days ago"
+msgstr "%s giorni fa'"
+
+msgid "User currently active"
+msgstr "Utente correntemente attivo"
+
+msgid "Last seen: %s"
+msgstr "Ultimo accesso: %s"
+
+msgid "Inactive since: %s"
+msgstr "Inattivo da: %s"
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr "Il tuo contatto sembra non aver ricevuto il tuo o i tuoi messagi!"
+
+msgid "Static content server"
+msgstr "Server per il contenuto statico"
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr "Questo ĆØ il server per il contenuto statico di %1s, ā%2sā."
+
+msgid "Suggested friends"
+msgstr "Amici suggeriti"
+
+msgid "Check all"
+msgstr "Seleziona tutte le opzioni"
+
+msgid "Uncheck all"
+msgstr "Deseleziona tutte le opzioni"
+
+msgid "Choose"
+msgstr "Scegli"
+
+msgid "List name"
+msgstr "Nome lista"
+
+msgid "Allow"
+msgstr "Permetti"
+
+msgid "Deny"
+msgstr "Rifiuta"
+
+msgid "Group"
+msgstr "Gruppo"
+
+msgid "Subscription"
+msgstr "Sottoscrizione"
+
+msgid "Both"
+msgstr "Entrambi"
+
+msgid "From"
+msgstr "Da"
+
+msgid "Everybody"
+msgstr "Tutti quanti"
+
+msgid "Send messages"
+msgstr "Invia messaggi"
+
+msgid "Send queries"
+msgstr "Invia richieste"
+
+msgid "See my status"
+msgstr "Vedi il mio stato"
+
+msgid "Send his/her status"
+msgstr "Invia il suo status"
+
+msgid "Everything"
+msgstr "Tutto"
+
+msgid "Item"
+msgstr "Oggetto"
+
+msgid "Order"
+msgstr "Ordina"
+
+msgid "Active for this session"
+msgstr "Attivo per questa sessione"
+
+msgid "Always active"
+msgstr "Sempre attivo"
+
+msgid "User directory"
+msgstr "Cartella utenti"
+
+msgid "Search a friend"
+msgstr "Cerca un amico"
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr "Questa caratteristica non ĆØ implementata dal client del recipiente oppure il suo server e quindi non puĆ² essere processata."
+
+msgid "This is a repeat from %s"
+msgstr "Questa ĆØ una ripetizione da %s"
+
+msgid "Loading comments..."
+msgstr "Sto caricando i commenti..."
+
+msgid "Type your comment here..."
+msgstr "Inserisci qui il tuo commento..."
+
+msgid "Could not get the comments!"
+msgstr "Non ho potuto ottenere nessun commento!"
+
+msgid "Show comments"
+msgstr "Mostra commenti"
+
+msgid "Send him/her a message"
+msgstr "Invia un messaggio a lui/lei"
+
+msgid "Start a chat with him/her"
+msgstr "Inizia una chat con lui/lei"
+
+msgid "Media integration"
+msgstr ""
+
+msgid "Comments locked!"
+msgstr ""
+
+msgid "Type something you want to share with your friends..."
+msgstr ""
+
+msgid "changed his/her nickname to %s"
+msgstr ""
+
+msgid "commented an item you follow: ā%sā."
+msgstr ""
+
+msgid "Hide"
+msgstr ""
+
+msgid "liked your post: ā%sā."
+msgstr ""
+
+msgid "quoted you somewhere: ā%sā."
+msgstr ""
+
+msgid "published on your wall: ā%sā."
+msgstr ""
+
+msgid "tagged you in a photo (%s)."
+msgstr ""
+
+msgid "tagged you in a video (%s)."
+msgstr ""
+
+msgid "Show"
+msgstr ""
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr ""
+
+msgid "Pubsub host"
+msgstr ""
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr ""
+
+msgid "Manager link"
+msgstr ""
+
+msgid "User uploads server"
+msgstr ""
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Logo"
+msgstr ""
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr ""
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr ""
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr ""
+
+msgid "Your service logo has been successfully changed!"
+msgstr ""
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr ""
+
+msgid "Remove this logo"
+msgstr ""
+
+msgid "View this logo"
+msgstr ""
+
+msgid "Send a file"
+msgstr ""
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr ""
+
+msgid "Groupchats to join"
+msgstr ""
+
+msgid "Purge sent files"
+msgstr ""
+
+msgid "would like to send you a file: ā%sā."
+msgstr ""
+
+msgid "has accepted to received your file: ā%sā."
+msgstr ""
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr ""
+
+msgid "could not receive your file: ā%sā."
+msgstr ""
+
+msgid "has received a file exchange request: ā%sā."
+msgstr ""
+
+msgid "Available shortcuts:"
+msgstr ""
+
+msgid "%s removes the chat logs"
+msgstr ""
+
+msgid "%s joins a groupchat"
+msgstr ""
+
+msgid "%s closes the chat"
+msgstr ""
+
+msgid "%s shows the user profile"
+msgstr ""
+
+msgid "%s sends a message to the room"
+msgstr ""
+
+msgid "%s changes your nickname"
+msgstr ""
+
+msgid "%s sends a message to someone in the room"
+msgstr ""
+
+msgid "%s changes the room topic"
+msgstr ""
+
+msgid "%s kicks an user of the room"
+msgstr ""
+
+msgid "%s bans an user of the room"
+msgstr ""
+
+msgid "%s invites someone to join the room"
+msgstr ""
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr "Jappix ĆØ un platform sociale no-profit, che puoi accedere duvunque tu sia, qualsiasi volta tu abbia voglia di communicare con qualcuno."
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# Japanese translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:25+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "ćć©ć¦ć¶ć®čØå®ć§JavaScriptćē”å¹ć«ćŖć£ć¦ććēŗćJappixćčµ·åć§ćć¾ćć! JavaScriptćęå¹ć«ćć¦ćć ććć"
+
+msgid "An open social network"
+msgstr "ćŖć¼ćć³ć½ć¼ć·ć£ć«ććććÆć¼ćÆ"
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "JappixćÆććććÆć¼ćÆć®åé”ć«ććåę¢ćć¾ććććć°ćäøę£ćŖćć°ć¤ć³ć§ćļ¼å
„åććčŖčؼę
å ±ćē¢ŗčŖćć¦ćć ććļ¼ććäøä¾æćććććć¦ē³ćčسććć¾ććć"
+
+msgid "The element list on this server could not be obtained!"
+msgstr "ćć®ćµć¼ćć®ćØć¬ć”ć³ććŖć¹ććåå¾ććććØćć§ćć¾ććć§ćć!"
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "ććŖćć®ćć¹ćÆć¼ććÆå¤ę“ććć¾ćććä»ććę°ćććć¹ćÆć¼ćć§ćć°ć¤ć³ć§ćć¾ćć"
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "ććŖćć®XMPPć¢ć«ć¦ć³ććÆę£åøøć«åé¤ććć¾ćććććććŖć!"
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "XMPPć¢ć«ć¦ć³ćććć°ć¢ć¦ććć¾ćććčÆćäøę„ć!"
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "åå ććć«ć¼ć ćååØćć¾ćććä½ęććåæ
č¦ćććć¾ć!"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "ć°ć«ć¼ććć£ćććÆåé¤ććć¾ćććä»ććčŖ°ć§ćåä½ęćč”ćććØćåŗę„ć¾ćć"
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "ć¦ć¼ć¶ćÆććŖćć®ęććć£ććć«ć¼ć ć«å°ēććććØćć§ćć¾ććć§ććć"
+
+msgid "Please enter the group chat address to join."
+msgstr "åå ććć°ć«ć¼ććć£ććć¢ćć¬ć¹ćå
„åćć¦ćć ććć"
+
+msgid "Please enter your nickname to join %s."
+msgstr "%s ć«åå ćććććÆćć¼ć ćå
„åćć¦ćć ććć"
+
+msgid "This room (%s) is protected with a password."
+msgstr "ćć®ćć£ććć«ć¼ć (%s) ćÆćć¹ćÆć¼ćć§äæč·ććć¦ćć¾ćć"
+
+msgid "Your browser is out of date!"
+msgstr "ćć©ć¦ć¶ćć¼ćøć§ć³ćå¤ćć§ć!"
+
+msgid "Last %s version is better!"
+msgstr "ćć¼ćøć§ć³ %s ćęØå„Øćć¾ćć"
+
+msgid "Login"
+msgstr "ćć°ć¤ć³"
+
+msgid "Register"
+msgstr "ē»é²"
+
+msgid "Here we go!"
+msgstr "ććććÆćććć!"
+
+msgid "Server"
+msgstr "ćµć¼ćć¼"
+
+msgid "Password"
+msgstr "ćć¹ćÆć¼ć"
+
+msgid "Remember me"
+msgstr "čØę¶ćć"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "ćć®ćć¼ć«ćÆē”å¹ć«ćŖć£ć¦ććēŗćä½æēØććććØćć§ćć¾ćć!"
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "ććććÆć¼ćÆć®åé”ć«ććåęććć¾ćććć©ććć¾ćć?"
+
+msgid "Reconnect"
+msgstr "åę„ē¶"
+
+msgid "Messages"
+msgstr "ć”ćć»ć¼ćø"
+
+msgid "Profile"
+msgstr "ćććć£ć¼ć«"
+
+msgid "Options"
+msgstr "ćŖćć·ć§ć³"
+
+msgid "Disconnect"
+msgstr "åę"
+
+msgid "Filter"
+msgstr "ćć£ć«ćæć¼"
+
+msgid "Add a friend"
+msgstr "åéćčæ½å "
+
+msgid "Your groupchats"
+msgstr "ć°ć«ć¼ććć£ćć"
+
+msgid "Manage your favorite groupchats"
+msgstr "ćę°ć«å
„ćć®ć°ć«ć¼ććć£ćććē®”ē"
+
+msgid "More stuff"
+msgstr "ćć£ćØå¤ć"
+
+msgid "Show all friends"
+msgstr "å
Øć¦ć®åéćč¦ć"
+
+msgid "Only show connected friends"
+msgstr "ćŖć³ć©ć¤ć³ć®åéć®ćæč”Øē¤ŗ"
+
+msgid "Message archives"
+msgstr "ć”ćć»ć¼ćøć¢ć¼ć«ć¤ć"
+
+msgid "Date"
+msgstr "ę„ä»"
+
+msgid "Please select a friend to view the chat history."
+msgstr "åéćéøęćććØćć£ććć®å±„ę“ćč¦ćć¾ć"
+
+msgid "Nothing found for: %s"
+msgstr "č¦ć¤ććć¾ćć: %s"
+
+msgid "A short message?"
+msgstr "ēćć”ćć»ć¼ćøć§ćć?"
+
+msgid "How are you?"
+msgstr "ćę©å«ććć?"
+
+msgid "What are you doing?"
+msgstr "ćŖć«ćć¦ć?"
+
+msgid "Join a chat"
+msgstr "ćć£ććć«åå "
+
+msgid "Status"
+msgstr "ć¹ćć¼ćæć¹"
+
+msgid "Available"
+msgstr "ćŖć³ć©ć¤ć³"
+
+msgid "Talkative"
+msgstr "ćććć¹ć"
+
+msgid "Away"
+msgstr "é¢åø"
+
+msgid "Not available"
+msgstr "åƾåæäøč½"
+
+msgid "Busy"
+msgstr "å¤åæ"
+
+msgid "Mood"
+msgstr "ć ć¼ć"
+
+msgid "None"
+msgstr "ćŖć"
+
+msgid "Crazy"
+msgstr "ēę°"
+
+msgid "Excited"
+msgstr "čå„®"
+
+msgid "Playful"
+msgstr "åč«åå"
+
+msgid "Happy"
+msgstr "å¹øē¦"
+
+msgid "Shocked"
+msgstr "ć·ć§ććÆ"
+
+msgid "Hot"
+msgstr "å
ę°"
+
+msgid "Sad"
+msgstr "ę²ćć"
+
+msgid "Amorous"
+msgstr "ęåæ"
+
+msgid "Confident"
+msgstr "大č"
+
+msgid "Activity"
+msgstr "ć¢ćÆćć£ćć£ćć£"
+
+msgid "Chores"
+msgstr "éēØ"
+
+msgid "Drinking"
+msgstr "飲é
"
+
+msgid "Eating"
+msgstr "é£äŗ"
+
+msgid "Exercising"
+msgstr "éå"
+
+msgid "Grooming"
+msgstr "čØē·“"
+
+msgid "Appointment"
+msgstr "äŗē“"
+
+msgid "Inactive"
+msgstr "ē”å¹"
+
+msgid "Relaxing"
+msgstr "ćŖć©ććÆć¹"
+
+msgid "Talking"
+msgstr "ä¼č©±"
+
+msgid "Traveling"
+msgstr "ę
č”"
+
+msgid "Working"
+msgstr "ä»äŗ"
+
+msgid "View profile"
+msgstr "ćććć£ć¼ć«ćč¦ć"
+
+msgid "Repeat this notice"
+msgstr "ćē„ćććē¹°ćčæć"
+
+msgid "Remove this notice"
+msgstr "ćē„ćććåé¤"
+
+msgid "Your profile"
+msgstr "ććŖćć®ćććć£ć¼ć«"
+
+msgid "Identity"
+msgstr "čŗ«å
"
+
+msgid "Profile image"
+msgstr "ćććć£ć¼ć«ē»å"
+
+msgid "Others"
+msgstr "ćć®ä»"
+
+msgid "Personal"
+msgstr "åäŗŗ"
+
+msgid "Complete name"
+msgstr "ę°å"
+
+msgid "Nickname"
+msgstr "ćććÆćć¼ć "
+
+msgid "First name"
+msgstr "å"
+
+msgid "Last name"
+msgstr "å§"
+
+msgid "Date of birth"
+msgstr "čŖēę„"
+
+msgid "Contact"
+msgstr "é£ēµ”å
"
+
+msgid "E-mail"
+msgstr "Eć”ć¼ć«"
+
+msgid "Phone"
+msgstr "é»č©±"
+
+msgid "Website"
+msgstr "WEBćµć¤ć"
+
+msgid "Current"
+msgstr "ć«ć¬ć³ć"
+
+msgid "Delete"
+msgstr "åé¤"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "ę®åæµ!ććŖćć®ę
å ±ć«ć¼ćć«ć¤ć”ć¼ćøćå®ē¾©ććć¦ćć¾ćć"
+
+msgid "Address"
+msgstr "ć¢ćć¬ć¹"
+
+msgid "Street"
+msgstr "ēŖå°"
+
+msgid "City"
+msgstr "åøēŗę"
+
+msgid "Postal code"
+msgstr "éµä¾æēŖå·"
+
+msgid "Country"
+msgstr "å½"
+
+msgid "Biography"
+msgstr "čŖå·±ē“¹ä»"
+
+msgid "Important notice"
+msgstr "éč¦ćŖćē„ćć"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr "ćæććŖćć¢ćÆć»ć¹ććēŗććććć£ć¼ć«ę
å ±ćęøćč¾¼ććØććÆę³Øęćć¦ćć ććć(ććŖććå
¬éćęć¾ćŖćę
å ±ćććć¾ć)"
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr "XMPPćÆćć©ć¤ćć¼ćć§ćÆććć¾ććććććŖććÆćććć”ć¤ć«(vCard)ćéøęćć¦ćć ććć"
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr "ä»ć®ć¦ć¼ć¶ćē°”åć«čå„ć§ććććć«ćććć”ć¤ć«ć¤ć”ć¼ćø(ę大 %s)ćć¢ćććć¼ćććäŗććå§ććć¾ćć"
+
+msgid "Save"
+msgstr "äæå"
+
+msgid "Cancel"
+msgstr "ćć£ć³ć»ć«"
+
+msgid "Edit options"
+msgstr "ćŖćć·ć§ć³ē·Øé"
+
+msgid "Channel"
+msgstr "ćć£ć³ćć«"
+
+msgid "Commands"
+msgstr "ć³ćć³ć"
+
+msgid "Sounds"
+msgstr "ćµć¦ć³ć"
+
+msgid "Privacy"
+msgstr "ćć©ć¤ćć·ć¼"
+
+msgid "Message archiving"
+msgstr "ć”ćć»ć¼ćøć¢ć¼ć«ć¤ć"
+
+msgid "Store a history of your chats"
+msgstr "ćć£ćć屄ę“ćäæęćć"
+
+msgid "Geolocation"
+msgstr "ä½ē½®ę
å ±"
+
+msgid "Empty"
+msgstr "ē©ŗ"
+
+msgid "Empty channel"
+msgstr "ē©ŗć®ćć£ć³ćć«"
+
+msgid "Persistent"
+msgstr "ęē¶"
+
+msgid "Maximum notices"
+msgstr "ćē„ććć®ę大ę°"
+
+msgid "Account"
+msgstr "ć¢ć«ć¦ć³ć"
+
+msgid "Change password"
+msgstr "ćć¹ćÆć¼ćå¤ę“"
+
+msgid "Delete account"
+msgstr "ć¢ć«ć¦ć³ćåé¤"
+
+msgid "Old"
+msgstr "å¤ć"
+
+msgid "New (2 times)"
+msgstr "ę°ćć(2å)"
+
+msgid "Continue"
+msgstr "ꬔ"
+
+msgid "To"
+msgstr "å®å
"
+
+msgid "Close"
+msgstr "éćć"
+
+msgid "unknown"
+msgstr "äøę"
+
+msgid "Unavailable"
+msgstr "ä½æēØåŗę„ć¾ćć"
+
+msgid "is now"
+msgstr "ę°č¦"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr "ć¢ććæć¼ć®ć¢ćććć¼ććå®äŗććć®ćå¾
ć£ć¦ćć ććā¦"
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "ē¾ććę°č¦ćććć”ć¤ć«ć¤ć”ć¼ćøćÆććć«ććć¾ć"
+
+msgid "The image file is not supported or has a bad size."
+msgstr "ćć®ć¤ć”ć¼ćøćÆćµćć¼ćććć¦ććŖććććµć¤ćŗćééć£ć¦ćć¾ć"
+
+msgid "Reply"
+msgstr "čæäæ”"
+
+msgid "Error"
+msgstr "ćØć©ć¼"
+
+msgid "Click here to solve the error"
+msgstr "ćÆćŖććÆćć¦ćØć©ć¼ćäæ®ę£ćć¦ćć ćć"
+
+msgid "You"
+msgstr "ććŖć"
+
+msgid "Remove"
+msgstr "åé¤"
+
+msgid "Rename"
+msgstr "ååå¤ę“"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "ććć«ć”ćÆćććććÆ %s ć§ććććŖććę°ććåäŗŗć«čæ½å ćććć§ćć"
+
+msgid "Smiley insertion"
+msgstr "é”ęåćęæå
„"
+
+msgid "Change style"
+msgstr "ć¹ćæć¤ć«å¤ę“"
+
+msgid "Text in bold"
+msgstr "å¤Ŗå"
+
+msgid "Text in italic"
+msgstr "ć¤ćæćŖććÆ"
+
+msgid "Underlined text"
+msgstr "äøē·"
+
+msgid "Save chat"
+msgstr "ćć£ćććäæå"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr "ćć£ćć屄ę“ćåå¾ććć«ćÆ仄äøć®ćŖć³ćÆććÆćŖććÆćć¦ćć°ććå¾
ć”ć¾ććꬔć«ååŗ¦ćÆćŖććÆćć¦ćć”ć¤ć«ćåå¾ćć¾ćć"
+
+msgid "This chat is empty!"
+msgstr "ćć®ćć£ćććÆē©ŗć§ć"
+
+msgid "Generate file!"
+msgstr "ćć”ć¤ć«ćēę!"
+
+msgid "Download file!"
+msgstr "ćć”ć¤ć«ććć¦ć³ćć¼ć!"
+
+msgid "Clean current chat"
+msgstr "ć«ć¬ć³ććć£ććććÆćŖć¢"
+
+msgid "View chat history"
+msgstr "ä¼č©±å±„ę“ćåē
§"
+
+msgid "Show user profile"
+msgstr "ć¦ć¼ć¶ć¼ćććć£ć¼ć«ćč”Øē¤ŗ"
+
+msgid "Add this contact to your friends"
+msgstr "é£ēµ”å
ć«åéćčæ½å "
+
+msgid "Add this groupchat to your favorites"
+msgstr "ćę°ć«å
„ćć«ć°ć«ć¼ććć£ćććčæ½å "
+
+msgid "All tabs"
+msgstr "å
Øć¦ć®ćæć"
+
+msgid "Close this tab"
+msgstr "ćć®ćæććéćć"
+
+msgid "no subject defined for this room."
+msgstr "ćć®ć«ć¼ć ć«ćÆ件åćććć¾ććć"
+
+msgid "Administration panel for this room"
+msgstr "ćć®éØå±ć®ē®”ēććć«"
+
+msgid "Moderators"
+msgstr "ć¢ćć¬ć¼ćæ"
+
+msgid "Participants"
+msgstr "åå č
"
+
+msgid "Visitors"
+msgstr "åč“č
"
+
+msgid "Manage favorite rooms"
+msgstr "ćę°ć«å
„ćć®éØå±ć®ē®”ē"
+
+msgid "Change favorites"
+msgstr "ćę°ć«å
„ćć®å¤ę“"
+
+msgid "Search a room"
+msgstr "ć«ć¼ć ćę¤ē“¢"
+
+msgid "Select a favorite"
+msgstr "ćę°ć«å
„ććéøę"
+
+msgid "Getting the name..."
+msgstr "ååćåå¾äø"
+
+msgid "Gateway"
+msgstr "ć²ć¼ćć¦ć§ć¤"
+
+msgid "Name"
+msgstr "åå"
+
+msgid "Room"
+msgstr "ć«ć¼ć "
+
+msgid "Add"
+msgstr "čæ½å "
+
+msgid "Edit"
+msgstr "ē·Øé"
+
+msgid "Search a room on"
+msgstr "ć«ć¼ć ćę¤ē“¢: "
+
+msgid "No room found on this server."
+msgstr "ćć®ćµć¼ćć¼ć§ć«ć¼ć ćÆč¦ć¤ććć¾ććć§ććć"
+
+msgid "Service discovery"
+msgstr "ćµć¼ćć¹ćć£ć¹ć«ććŖ"
+
+msgid "Server to query"
+msgstr "ćµć¼ćć¼ć«åćåćć"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr "ććććććØć³ćć£ćć£ćććććēµęćčæćć¾ććć§ćć!"
+
+msgid "Accounts"
+msgstr "ć¢ć«ć¦ć³ć"
+
+msgid "Authentications"
+msgstr "čŖčؼ"
+
+msgid "Automation"
+msgstr "čŖåå"
+
+msgid "Clients"
+msgstr "ćÆć©ć¤ć¢ć³ć"
+
+msgid "Collaboration"
+msgstr "ć³ć©ćć¬ć¼ć·ć§ć³"
+
+msgid "Components"
+msgstr "ć³ć³ćć¼ćć³ć"
+
+msgid "Rooms"
+msgstr "ć«ć¼ć "
+
+msgid "Directories"
+msgstr "ćć£ć¬ćÆććŖ"
+
+msgid "Gateways"
+msgstr "ć²ć¼ćć¦ć§ć¤"
+
+msgid "News"
+msgstr "ćć„ć¼ć¹"
+
+msgid "Hierarchy"
+msgstr "é層"
+
+msgid "Proxies"
+msgstr "ćććć·"
+
+msgid "Publication/Subscription"
+msgstr "å
¬é/č³¼čŖ"
+
+msgid "Storage"
+msgstr "ć¹ćć¬ć¼ćø"
+
+msgid "Service offline or broken"
+msgstr "ćµć¼ćć¹ććŖćć©ć¤ć³ćå£ćć¦ćć¾ć"
+
+msgid "Your inbox"
+msgstr "åäæ”ē®±"
+
+msgid "Available actions"
+msgstr "ęå¹ćŖåä½"
+
+msgid "Clean"
+msgstr "ę¶å»"
+
+msgid "New"
+msgstr "New"
+
+msgid "Received"
+msgstr "åäæ”"
+
+msgid "Subject"
+msgstr "件å"
+
+msgid "Content"
+msgstr "å
容"
+
+msgid "Send message"
+msgstr "ć”ćć»ć¼ćøćéäæ”"
+
+msgid "Your inbox is empty."
+msgstr "åäæ”ē®±ćÆē©ŗć§ćć"
+
+msgid "MUC administration"
+msgstr "MUCē®”ē"
+
+msgid "You administrate this room"
+msgstr "ććŖććÆćć®ć«ć¼ć ćē®”ēćć¾ć"
+
+msgid "Enter new subject"
+msgstr "ę°ćć件åćå
„åćć¦ćć ćć"
+
+msgid "Configuration"
+msgstr "čØå®"
+
+msgid "Authorizations"
+msgstr "čرåÆ"
+
+msgid "Member list"
+msgstr "ć”ć³ćć¼ćŖć¹ć"
+
+msgid "Owner list"
+msgstr "ęęč
ćŖć¹ć"
+
+msgid "Administrator list"
+msgstr "ē®”ēč
ćŖć¹ć"
+
+msgid "Outcast list"
+msgstr "čæ½ę¾č
ćŖć¹ć"
+
+msgid "Add an input"
+msgstr "å
„åćčæ½å "
+
+msgid "Destroy this MUC"
+msgstr "ćć®MUCćč§£ę£ćć"
+
+msgid "Yes, let's do it!"
+msgstr "ćÆćććććć¾ć!"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr "åéćÆćä¼č©±ć«ę³Øęćęć£ć¦ćć¾ćć"
+
+msgid "Your friend is writing a message..."
+msgstr "åéćÆć”ćć»ć¼ćøćęøćć¦ćć¾ćć"
+
+msgid "Your friend stopped writing a message."
+msgstr "åéćÆć”ćć»ć¼ćøć®ęøćč¾¼ćæćäøęćć¾ććć"
+
+msgid "Your friend is doing something else."
+msgstr "åéćÆä½ćććć¦ćć¾ćć"
+
+msgid "Your friend closed the chat."
+msgstr "åéćÆćć£ćććéćć¾ććć"
+
+msgid "Requesting this service..."
+msgstr "ćµć¼ćć¹ćč¦ę±äø..."
+
+msgid "Loading"
+msgstr "čŖćæč¾¼ćæäø"
+
+msgid "joined the chat room"
+msgstr "ćć£ććć«ć¼ć ć«čŖć"
+
+msgid "left the chat room"
+msgstr "ćć£ććć«ć¼ć ć«å
„室ćć"
+
+msgid "no status"
+msgstr "ć¹ćć¼ćæć¹ćććć¾ćć"
+
+msgid "has been kicked"
+msgstr "čæ½ćåŗććć¾ćć"
+
+msgid "has been banned"
+msgstr "ē¦ę¢ććć¦ćć¾ć"
+
+msgid "no reason"
+msgstr "ēē±ē”ć"
+
+msgid "Communicate with the entire world!"
+msgstr "å
ØäøēćØć³ćć„ćć±ć¼ć·ć§ć³!"
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr "ććć§ćÆ XMPPććććÆć¼ćÆćä½æēØććä½ē¾äøäŗŗć®ć¦ć¼ć¶ć¼ćØé£ēµ”ćåćććØćåŗę„ć¾ććć³ćć„ććć£ć¼ćøć®åå ćÆčŖē±ć§ć!"
+
+msgid "Hi there!"
+msgstr "ććć«ć”ćÆ!"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr "ćććć %1s ćøć ā%2sā."
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr "ę¢åć®XMPPć¢ć«ć¦ć³ćć§ćć°ć¤ć³ćč”ććē”ęć§ć¢ć«ć¦ć³ćä½ęć§ćć¾ć!"
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr "JappixćÆPostProć®ćŖć¼ćć³ć½ć¼ć¹ćććøć§ćÆćć§ććē§ćć”ćÆéå¶å©å£ä½ćŖć®ć§å©ććę±ćć¦ćć¾ćć"
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr "ććŖććä½ęććXMPPć¢ć«ć¦ć³ćć§ćć°ć¤ć³ćć¦ćć ććć%s ć°ć«ć¼ććć£ććć«ę„ē¶ććććØćåŗę„ć¾ćć"
+
+msgid "Previous"
+msgstr "ę»ć"
+
+msgid "General"
+msgstr "äøč¬"
+
+msgid "Advanced"
+msgstr "é«åŗ¦"
+
+msgid "Resource"
+msgstr "ćŖć½ć¼ć¹"
+
+msgid "Priority"
+msgstr "åŖå
åŗ¦"
+
+msgid "Low"
+msgstr "ä½"
+
+msgid "Medium"
+msgstr "äø"
+
+msgid "High"
+msgstr "é«"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr "ę„ē¶ćććć°ć«ć¼ććć£ćććØćććÆćć¼ć ćå
„åćć¦ćć ććć%sć§ę»ćććØćć§ćć¾ćć"
+
+msgid "login page"
+msgstr "ćć°ć¤ć³ćć¼ćø"
+
+msgid "Share this link with your friends:"
+msgstr "ꬔć®ćŖć³ćÆćåéćØå
±ęćć:"
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr "ććŖćć®åéćę„ē¶ććć«ćÆćć½ć¼ć·ć£ć«ćÆć©ć¦ćć§XMPPć¢ć«ć¦ć³ćć®ęæčŖćåććåæ
č¦ćććć¾ććęē¶ććÆē°”åć«ć§ćć¾ćć"
+
+msgid "Required"
+msgstr "č¦ę±"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr "ęæčŖććć¾ćććććŖćć®XMPPć¢ćć¬ć¹ćÆļ¼"
+
+msgid "Manager"
+msgstr "ććć¼ćøć£ć¼"
+
+msgid "Project"
+msgstr "ćććøć§ćÆć"
+
+msgid "Encrypted"
+msgstr "ęå·åęø"
+
+msgid "Unencrypted"
+msgstr "ęå·åććŖć"
+
+msgid "Where are you?"
+msgstr "ć©ćć«ćć¾ććļ¼"
+
+msgid "What's up with you?"
+msgstr "ćŖć«ćć¦ć?"
+
+msgid "Fetching the social channel..."
+msgstr "ć½ć¼ć·ć£ć«ćć£ć³ćć«ćåå¾..."
+
+msgid "You are synchronized with your network."
+msgstr "ććććÆć¼ćÆćØåęćć¾ććć"
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr "ä½ćéäæ”ć§ćć¾ćć: ććŖććÆćē„ććć®ćæåäæ”ć§ćć¾ć!"
+
+msgid "Media viewer"
+msgstr "ć”ćć£ć¢ćć„ć¼ć¢"
+
+msgid "Browse"
+msgstr "ćć©ć¦ćŗ"
+
+msgid "Command"
+msgstr "ć³ćć³ć"
+
+msgid "Subscribe"
+msgstr "č³¼čŖ"
+
+msgid "Join"
+msgstr "åå "
+
+msgid "Automatic"
+msgstr "čŖå"
+
+msgid "Search"
+msgstr "ę¤ē“¢"
+
+msgid "No result!"
+msgstr "ēµęćÆććć¾ćć!"
+
+msgid "No notifications."
+msgstr "ééē„"
+
+msgid "would like to add you as a friend."
+msgstr "ćÆććŖććåéć«čæ½å ćććć£ć¦ćć¾ćć"
+
+msgid "would like you to join this chatroom:"
+msgstr "ćÆććŖćććć£ććć«ć¼ć ć«ęå¾
ćć¦ćć¾ć:"
+
+msgid "Do you accept?"
+msgstr "čرåÆćć¾ćć?"
+
+msgid "Yes"
+msgstr "ćÆć"
+
+msgid "No"
+msgstr "ććć"
+
+msgid "would like to get authorization."
+msgstr "ęæčŖćåøęćć¾ć"
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr "%s ć«åéē³č«ććć¾ććļ¼"
+
+msgid "Submit"
+msgstr "éäæ”"
+
+msgid "Client"
+msgstr "ćÆć©ć¤ć¢ć³ć"
+
+msgid "System"
+msgstr "ć·ć¹ćć "
+
+msgid "Local time"
+msgstr "ćć¼ć«ć«ęé"
+
+msgid "Comments"
+msgstr "ć³ć”ć³ć"
+
+msgid "User profile"
+msgstr "ć¦ć¼ć¶ć¼ę
å ±"
+
+msgid "See his/her position on the globe"
+msgstr "ä½ē½®ćč¦ć"
+
+msgid "Confirm"
+msgstr "ē¢ŗčŖ"
+
+msgid "anonymous mode"
+msgstr "åæåć¢ć¼ć"
+
+msgid "Groups"
+msgstr "ć°ć«ć¼ć"
+
+msgid "Unclassified"
+msgstr "ē§åÆć§ćÆćŖć"
+
+msgid "Authorize"
+msgstr "ęæčŖ"
+
+msgid "Ask for authorization"
+msgstr "ęæčŖćä¾é ¼ććć"
+
+msgid "Unblock"
+msgstr "ććććÆč§£é¤"
+
+msgid "Prohibit"
+msgstr "ē¦ę¢ćć"
+
+msgid "Block"
+msgstr "é¤å¤"
+
+msgid "Chat"
+msgstr "ćć£ćć"
+
+msgid "Groupchat"
+msgstr "ć°ć«ć¼ććć£ćć"
+
+msgid "Jappix Mobile"
+msgstr "Jappixć¢ćć¤ć«"
+
+msgid "Desktop"
+msgstr "ćć¹ćÆććć"
+
+msgid "Mobile"
+msgstr "ć¢ćć¤ć«"
+
+msgid "Please wait..."
+msgstr "ćć°ćććå¾
ć”äøćć..."
+
+msgid "Please enable JavaScript"
+msgstr "JavaScriptćęå¹ć«ćć¦äøćć"
+
+msgid "Your channel"
+msgstr "ćć£ć³ćć«"
+
+msgid "Channel of"
+msgstr "ćć£ć³ćć«: "
+
+msgid "More notices..."
+msgstr "ä»ć®ćē„ćć..."
+
+msgid "Attach a file"
+msgstr "ćć”ć¤ć«ć®ę·»ä»"
+
+msgid "Send"
+msgstr "éäæ”"
+
+msgid "Unattach the file"
+msgstr "ę·»ä»ćć”ć¤ć«ć®åćę¶ć"
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr "ćć”ć¤ć«ć¢ćććć¼ćäøć«ćØć©ć¼ćēŗēćć¾ććļ¼ćć”ć¤ć«ćµć¤ćŗć大ćććć¢ćććć¼ććē¦ę¢ććć¦ćć¾ć"
+
+msgid "Authorization failed"
+msgstr "čŖčؼ失ę"
+
+msgid "Registration failed, please choose a different username"
+msgstr "ē»é²ć«å¤±ęćć¾ćććå„ć®ć¦ć¼ć¶ć¼åćéøćć§ćć ććć"
+
+msgid "Service unavailable"
+msgstr "ćµć¼ćć¹äøč½ć§ćć"
+
+msgid "Internal server error, try later"
+msgstr "å
éØćµć¼ćć¼ćØć©ć¼ćååŗ¦č©¦ćć¦ćć ććć"
+
+msgid "Your form has been sent."
+msgstr "ćć©ć¼ć ćéäæ”ććć¾ćć"
+
+msgid "Application"
+msgstr "ć¢ććŖć±ć¼ć·ć§ć³"
+
+msgid "XMPP links"
+msgstr "XMPPćŖć³ćÆ"
+
+msgid "Open XMPP links with Jappix"
+msgstr "Jappixć§XMPPćŖć³ćÆćéć"
+
+msgid "changed the subject to:"
+msgstr "ćµććøć§ćÆćć®å¤ę“"
+
+msgid "Welcome!"
+msgstr "ćććć"
+
+msgid "Friends"
+msgstr "åé"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr "JappixćøććććććććÆććŖćć®ć½ć¼ć·ć£ć«ćÆć©ć¦ćć§ć!"
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr "ä½æēØćéå§ććåć«ćććć¤ćć®čØå®å¤ę“ćę¤ē“¢ććć³ćććć£ć¼ć«ćčØå®ććåæ
č¦ćććć¾ćć"
+
+msgid "Enable notification sounds"
+msgstr "č¦åé³ćęå¹ć«ćć"
+
+msgid "Share your position on the globe"
+msgstr "ē¾åØä½ē½®ćå
±ęćć"
+
+msgid "Offline friends"
+msgstr "ćŖćć©ć¤ć³ć®åé"
+
+msgid "Don't hide offline friends"
+msgstr "ćŖćć©ć¤ć³ć®åéćé ć"
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr "ćć®ćć¼ć«ćä½æēØććććØć§ćµć¼ćäøć®åéć®ę¤ē“¢ććććčæ½å ććććØćåÆč½ć«ćŖćć¾ćć"
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr "ććć§ćć¾ćć!ććŖććÆåéćØJappixć§å
±ęć§ćć¾ćć"
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr "ć»ć¼ćććæć³ćę¼ććØćććć”ć¤ć«ćØćć£ćæć¼ćčµ·åćć¾ććå¹øććŖćä»ćåććļ¼"
+
+msgid "Share Jappix on %s"
+msgstr "%sćØJappixćå
±ęćć¾ćć"
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr "ē§ćÆ%sć§ćććŖć¼ćć³ć½ć¼ć·ć£ć«ćć©ćććć©ć¼ć Jappixćä½æēØćć¦ćć¾ć"
+
+msgid "Unknown name"
+msgstr "äøęćŖåå"
+
+msgid "Unknown country"
+msgstr "äøęćŖå½å"
+
+msgid "Click to enable"
+msgstr "enableććÆćŖććÆ"
+
+msgid "Click to disable"
+msgstr "disableććć§ććÆ"
+
+msgid "Installation"
+msgstr "ć¤ć³ć¹ćć¬ć¼ć·ć§ć³"
+
+msgid "Jappix installation"
+msgstr "Jappixć®ć¤ć³ć¹ćć¼ć«"
+
+msgid "Welcome to the Jappix installation!"
+msgstr "Jappixć®ć¤ć³ć¹ćć¼ć«ćøćććć!"
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr "ćć®ćć¼ć«ćÆJappixć®ć¤ć³ć¹ćć¼ć«ććµćć¼ććć¾ćććć«ę©č½ć®XMPPć½ć¼ć·ć£ć«ćć©ćććć©ć¼ć ćµć¼ććććć°ćęč”ēćŖē„čćÆåæ
č¦ććć¾ćć"
+
+msgid "Let's have a look at the installation steps:"
+msgstr "ć¤ć³ć¹ćć¼ć«ć®ć¹ććć:"
+
+msgid "Welcome"
+msgstr "ćććć"
+
+msgid "Storage configuration"
+msgstr "ć¹ćć¬ć¼ćøć®čØå®"
+
+msgid "Administrator account"
+msgstr "ē®”ēč
ć¢ć«ć¦ć³ć"
+
+msgid "Main configuration"
+msgstr "ć”ć¤ć³čØå®"
+
+msgid "Hosts configuration"
+msgstr "ćć¹ćć®čØå®"
+
+msgid "Services installation"
+msgstr "ćµć¼ćć¹ć®ć¤ć³ć¹ćć¼ć«"
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr "ććē¾åØć®čØčŖćććŖćć®ē°å¢ļ¼%1sļ¼ćØē°ćŖćå “åćJappixć¹ćć¼ćÆ %2s ćä½ęćäæåćć¦ćć ććć"
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr "Jappixć®ć¤ć³ć¹ćć¼ć«ćčØå®ć®ćć«ććåæ
č¦ćŖå “åć«ćÆćå
Øä½ććć„ć”ć³ććå©ēØććäŗćåÆč½ć§ćļ¼"
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr "åäŗŗēćŖć½ć¼ć·ć£ć«ćÆć©ć¦ććä½ęććć«ćÆćꬔć®ć¹ćććć«ē§»åćć¾ćļ¼"
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr "Jappixć®ćć¼ćæ(å
±ęćć”ć¤ć«ććć£ćććć°ćé³ę„½ćčØå®ē)ćÆćć»ćć„ćŖćć£ć§äæč·ććććć©ć«ćć«äæåćć¾ćć"
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr "ćµććć©ć«ććęøćč¾¼ćęØ©éćåæ
č¦ć§ćć%1sć«ęØ©éćäøććć%2sć«ęØ©éćäøćć¦ćć ćć"
+
+msgid "The folder is writable, you can continue!"
+msgstr "ćć©ć«ććÆęøćč¾¼ćæåÆč½ć§ććē¶ćć¦ćć ććć"
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "JappixćÆćčØå®ćć”ć¤ć«ćę°ćććć©ć°ć¤ć³ćć¢ćććć¼ććęä¾ć§ćć¾ććē®”ēč
ęØ©éć§ć®ć¢ćÆć»ć¹ćåæ
č¦ć§ćć"
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr "Jappixć®ć¤ć³ć¹ćć¼ć«ćēµäŗćć¾ććććććøć£ć¼ćŖć³ćÆććÆćŖććÆćć¦ćć¼ć ćć¼ćøć«ć¢ćÆć»ć¹ćć¦ćć ććć"
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr "ćć¹ćÆć¼ććäøč“ćć¾ćć"
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr "Jappixćåä½ććććć«čØå®ććåæ
č¦ćććć¾ććꬔć®é
ē®ćå
„åćć¦ćć ćć(éåøøćÆč¦å®å¤ć§ååć§ć)"
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr "å¤ćå
„åććŖćå “åć«ćÆćčŖåēć«č¦å®å¤ćčØå®ććć¾ćć"
+
+msgid "User"
+msgstr "ć¦ć¼ć¶ć¼"
+
+msgid "Service"
+msgstr "ćµć¼ćć¹"
+
+msgid "Service name"
+msgstr "ćµć¼ćć¹å"
+
+msgid "Service description"
+msgstr "ćµć¼ćć¹ć®čŖ¬ę"
+
+msgid "Connection"
+msgstr "ć³ććÆć·ć§ć³"
+
+msgid "Lock the host"
+msgstr "ćć¹ćććććÆććć¾ććć"
+
+msgid "Anonymous mode"
+msgstr "åæåć¢ć¼ć"
+
+msgid "Registration allowed"
+msgstr "ęæčŖčرåÆ"
+
+msgid "Use a proxy"
+msgstr "ćććć·ć¼ćä½æēØćć"
+
+msgid "Encryption"
+msgstr "ęå·å"
+
+msgid "HTTPS storage"
+msgstr "HTTPSć¹ćć¬ć¼ćø"
+
+msgid "Force HTTPS"
+msgstr "HTTPSćå¼·å¶ēć«ä½æēØćć"
+
+msgid "Compression"
+msgstr "å§ēø®"
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr "ćć®ćć¼ćøć§Jappixćę„ē¶ćććć¹ććčØå®ć§ćć¾ćććŖćć£ć·ć£ć«ćµć¼ćć¹ć®å “åćÆćć®ć¾ć¾ē¶č”ćć¦ćć ććć"
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr "äøęćŖBOSHćµć¼ćć§ććJappixćÆć©ć¤ć¢ć³ććØXMPPćµć¼ćéć®ę„ē¶ć«ęč”ēćŖå¶éćåæ
č¦ć§ćć"
+
+msgid "Main host"
+msgstr "ć”ć¤ć³ćć¹ć"
+
+msgid "Groupchat host"
+msgstr "ć°ć«ć¼ććć£ćććć¹ć"
+
+msgid "Anonymous host"
+msgstr "åæåćć¹ć"
+
+msgid "Directory host"
+msgstr "ćć¹ćć®ę¤ē“¢"
+
+msgid "BOSH host"
+msgstr "BOSHćć¹ć"
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr "Jappixćę”å¼µććććć«ć½ććć¦ćØć¢ćć¤ć³ć¹ćć¼ć«ććäŗćåŗę„ć¾ććć»ćć„ćŖćć£ć®ēŗč¦å®å¤ćå¤ććå “åćććć¾ćć"
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr "å®č”ććć«ćÆrootęØ©éć§ć·ć§ć«ćå®č”ć§ććć¦ć¼ć¶ć§ć¢ćÆć»ć¹ććåæ
č¦ćććć¾ććJappixć®ććć¤ćć®ę©č½ćå¶éćććå “åćććć¾ćć"
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr "ć»ććć¢ććå®äŗå¾ćć£ćć·ć„ćć”ć¤ć«ćä½ęćć¾ććć¢ććŖć±ć¼ć·ć§ć³ćč”Øē¤ŗćććć¾ć§ććæć³ćę¼ććć«ćå¾
ć”ćć ććć"
+
+msgid "Thanks for using Jappix!"
+msgstr "Jappixććå©ēØććć ćććććØććććć¾ć"
+
+msgid "Next"
+msgstr "ꬔ"
+
+msgid "Finish"
+msgstr "å®äŗ"
+
+msgid "Check again"
+msgstr "ććäøåŗ¦ē¢ŗčŖćć¦äøćć"
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr "ćć©ć«ćć¼ć«ęøćč¾¼ćæćć§ćć¾ććć%sćć£ć¬ćÆććŖć¼ć«ęøćč¾¼ćæęØ©éćčæ½å ćć¦ćć ććć"
+
+msgid "%s is installed on your system."
+msgstr "%s ćÆćććŖćć®ć·ć¹ćć ć«ć¤ć³ć¹ćć¼ć«ććć¾ćć"
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr "%1s ćÆć¤ć³ć¹ćć¼ć«ććć¦ć¾ććć%2sćć¤ć³ć¹ćć¼ć«ćć¦ćć ćć"
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr "PHPć®ę大ć¢ćććć¼ććµć¤ćŗćÆååć§ćć"
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr "PHPć®ę大ć¢ćććć¼ććµć¤ćŗćäøč¶³ćć¦ćć¾ćć%3ćć%2sć®éć§čØå®ćć¦ćć ććć"
+
+msgid "Jappix manager"
+msgstr "Jappixććć¼ćøć£"
+
+msgid "Manager access"
+msgstr "ććć¼ćøć£ćøć¢ćÆć»ć¹"
+
+msgid "Statistics"
+msgstr "ēµ±čØę
å ±"
+
+msgid "Hosts"
+msgstr "ćć¹ć"
+
+msgid "Design"
+msgstr "ćć¶ć¤ć³"
+
+msgid "Repeat"
+msgstr "å ±å"
+
+msgid "All"
+msgstr "å
Øć¦"
+
+msgid "Horizontal"
+msgstr "ę°“å¹³"
+
+msgid "Vertical"
+msgstr "åē“"
+
+msgid "Center"
+msgstr "äø"
+
+msgid "Left"
+msgstr "å·¦"
+
+msgid "Right"
+msgstr "å³"
+
+msgid "Top"
+msgstr "äø"
+
+msgid "Bottom"
+msgstr "äø"
+
+msgid "Adapt"
+msgstr "é©ēØ"
+
+msgid "Color"
+msgstr "č²"
+
+msgid "Users"
+msgstr "ć¦ć¼ć¶"
+
+msgid "Updates"
+msgstr "ć¢ćććć¼ć"
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr "å¶éćććé å:čŖčؼćććć¦ć¼ć¶ć ććJappixćć¼ććē®”ēć§ćć¾ćć"
+
+msgid "Please use the form below to login to the administration panel."
+msgstr "ē®”ēććć«ć«ćć°ć¤ć³ććć«ćÆćäøčØć®ćć©ć¼ć ćå©ēØćć¦ćć ććć"
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr "ć»ćć„ćŖćć£ćå¼·åććć«ćÆć»ćć·ć§ć³ć®å¶éęéćčØćććć©ć¦ć¶ēµäŗęć«ćć°ć¢ć¦ććć¾ćć"
+
+msgid "Credentials"
+msgstr "č³ę ¼ę
å ±"
+
+msgid "You have been logged out. Goodbye!"
+msgstr "ććŖććÆćć°ć¢ć¦ććć¦ćć¾ććććććŖć!"
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr "ē®”ēč
ćØćć¦čŖčć§ćć¾ććć§ćććč³ę ¼ę
å ±ćē¢ŗčŖćć¦ćć ććć"
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr "Jappixć§å¦ēćććēµ±čØę
å ±ć§ććéč¦ćŖę
å ±ćč¦ć¤ććććØćć§ćć¾ćć"
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr "ćć®ćć¼ć«ćä½æēØćć¦Jappixćć¼ćć®čØå®ćå¤ę“ććććØćåŗę„ć¾ćć"
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr "Jappixćć¼ććéäæ”ććXMPPćć¹ććå¤ę“ććććØćć§ćć¾ćć"
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr "Jappixćć¼ćć«äæåććć¦ćććć¹ć¦ć®ćć”ć¤ć«ć®ē®”ēćć§ćć¾ćććµććć©ć«ććéøęćć¦ē·Øéćéå§ļ¼"
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr "JappixćÆå®å
Øć«ć«ć¹ćæćć¤ćŗåÆč½ć§ććå³å“ć§ćć¶ć¤ć³ćå¤ę“ć§ćć¾ćć"
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr "ć¤ć”ć¼ćøć®å½¢å¼ćē”å¹ć§ććPNG,GIFåćÆJPGćä½æēØćć¦ćć ćć"
+
+msgid "The image could not be received, would you mind retry?"
+msgstr "ć¤ć”ć¼ćøćåäæ”ć§ćć¾ććć§ćććååäæ”ćć¾ććļ¼"
+
+msgid "Your image was added to the list!"
+msgstr "ć¤ć”ć¼ćøććŖć¹ćć«čæ½å ćć¾ććć"
+
+msgid "Changes saved!"
+msgstr "å¤ę“ćäæåćć¾ććć"
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr "äøäŗŗåćÆč¤ę°ć®Jappixćć¼ćć®ē®”ēč
ćå®ē¾©åÆč½ć§ćććć¹ćÆć¼ććå¤ę“ććäŗćåÆč½ć§ćć"
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr "Jappixć®ćć¼ćøć§ć³ććć§ććÆćććć¼ććć¢ćććć¼ćć§ćć¾ććč±čŖć§ęę°ćć¼ćøć§ć³ę
å ±ćč”Øē¤ŗććć¾ćć"
+
+msgid "Access statistics"
+msgstr "ć¢ćÆć»ć¹ēµ±čØę
å ±"
+
+msgid "Share statistics"
+msgstr "å
±ęēµ±čØę
å ±"
+
+msgid "Other statistics"
+msgstr "ćć®ä»ēµ±čØę
å ±"
+
+msgid "January"
+msgstr "1ę"
+
+msgid "February"
+msgstr "2ę"
+
+msgid "March"
+msgstr "3ę"
+
+msgid "April"
+msgstr "4ę"
+
+msgid "May"
+msgstr "5ę"
+
+msgid "June"
+msgstr "6ę"
+
+msgid "July"
+msgstr "7ę"
+
+msgid "August"
+msgstr "8ę"
+
+msgid "September"
+msgstr "9ę"
+
+msgid "October"
+msgstr "10ę"
+
+msgid "November"
+msgstr "11ę"
+
+msgid "December"
+msgstr "12ę"
+
+msgid "Monday"
+msgstr "ęęę„"
+
+msgid "Tuesday"
+msgstr "ē«ęę„"
+
+msgid "Wednesday"
+msgstr "ę°“ęę„"
+
+msgid "Thursday"
+msgstr "ęØęę„"
+
+msgid "Friday"
+msgstr "éęę„"
+
+msgid "Saturday"
+msgstr "åęę„"
+
+msgid "Sunday"
+msgstr "ę„ęę„"
+
+msgid "Total"
+msgstr "åčØ"
+
+msgid "Cache"
+msgstr "ćć£ćć·ć„"
+
+msgid "Logs"
+msgstr "ćć°"
+
+msgid "Music"
+msgstr "é³ę„½"
+
+msgid "Backgrounds"
+msgstr "ćććÆć°ć©ć³ć"
+
+msgid "Share"
+msgstr "å
±ę"
+
+msgid "Background"
+msgstr "ćććÆć°ć©ć³ć"
+
+msgid "Notice"
+msgstr "ćē„ćć"
+
+msgid "Your design preferences have been saved!"
+msgstr "ćć¶ć¤ć³ē°å¢čØå®ćäæåćć¾ćć!"
+
+msgid "Please check your inputs: something is missing!"
+msgstr "å
„åé
ē®ćē¢ŗčŖćć¦ćć ćć:ä½ććäøč¶³ćć¦ćć¾ćć"
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr "Jappixć®čęÆć儽ćæć®č²ćć¢ćććć¼ćććć¤ć”ć¼ćøć«å¤ę“ććććØćć§ćć¾ććććŖćć®ęę§ć«åććć¦ćć ććļ¼"
+
+msgid "Use default background"
+msgstr "ććć©ć«ćć§ćććÆć°ć©ć³ććå©ēØćć"
+
+msgid "Use your own image"
+msgstr "ęęćć¦ććć¤ć”ć¼ćøćä½æēØććć"
+
+msgid "Select a background to use and change the display options."
+msgstr "ćććÆć°ć©ć³ććéøęćććć£ć¹ćć¬ć¤ć¢ć¼ććå¤ę“ćć¦ćć ćć"
+
+msgid "Use your own color"
+msgstr "ē¬čŖć®č²ćä½æēØ"
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr "čęÆć§ä½æēØćććč²ć16é²ę°ć§å
„åćć¦ćć ćć"
+
+msgid "Manage backgrounds"
+msgstr "čęÆć®ē®”ē"
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr "ę°ććčęÆćčæ½å ććäŗćć§ćć¾ććęå¹ćŖć¤ć”ć¼ćøćć¢ćććć¼ććć¦ćć ććć"
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr "čęÆćåé¤ćććå “åć«ćÆć仄äøć®ćć©ć¦ć¶ćä½æēØćć¦ćć ććć"
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr "å
Øć¦ć®ć¦ć¼ć¶ć«åƾćć¦ć®ę³Øęęøććåŗåćå®ē¾©ć§ćć¾ćć"
+
+msgid "Simple notice"
+msgstr "ē°”åćŖćē„ćć"
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr "ę³ØęćÆććć¹ćć§č”Øē¤ŗć§ćć¾ććć³ć¼ććÆćµćć¼ćććć¦ćć¾ććć"
+
+msgid "Advanced notice"
+msgstr "é«åŗ¦ćŖéē„"
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr "ę³ØęćHTML,CSSćJavaScriptå½¢å¼ć«ć«ć¹ćæćć¤ćŗć§ćć¾ććć³ć¼ćå½¢å¼ć«ććåæ
č¦ćććć¾ćć"
+
+msgid "Available updates"
+msgstr "ć¢ćććć¼ććå©ēØć§ćć¾ćć"
+
+msgid "What's new?"
+msgstr "What's new?"
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr "ć¹ćć¬ć¼ćøćć©ć«ćć«ęøćč¾¼ćæćććć¾ćććęøćč¾¼ćæćčرåÆćć¦ćć ććļ¼"
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr "%1s ć®åå ćÆćććć·ć¼ć§ćć%2s ć«å¢å ććććęå¤§å¤ %3s ć«ćć¦ćć ććć"
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr "éēŗćć¼ćøć§ć³ć®Jappixćä½æēØćć¦ćć¾ćć%s ćå®č”ćć¦ćŖććøććŖćę“ę°ćć¦ćć ććć"
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr "ę°ćććć¼ćøć§ć³ć®Jappixćććć¾ććē¢ŗčŖćć¦ć¢ćććć¼ććć¦ćć ććć"
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr "ęéåćć®ćć¼ćøć§ć³ć§ććććććÆćŖććÆćć¦%sć«ćć¼ćøć§ć³ć¢ćććć¦ćć ććć"
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr "ćć¼ćøć§ć³ćÆęę°ć®ććć§ćććć¼ćøć§ć³ćęåć§ćć§ććÆććå “åć«ćÆćÆćŖććÆćć¦ćć ććć"
+
+msgid "Check for updates"
+msgstr "ć¢ćććć¼ćććÆćŖććÆćć¦ćć ćć"
+
+msgid "Update in progress"
+msgstr "ć¢ćććć¼ććå®äŗćć¾ććć"
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr "Jappixćć¢ćććć¼ććć¦ćć¾ć:ęę°ćć¼ćøć§ć³ć§åä½ćć¦ćć¾ćć"
+
+msgid "The update has failed! Please try again later."
+msgstr "ć¢ćććć¼ćć«å¤±ęćć¾ćć!ååŗ¦č©¦ćć¦ćć ććć"
+
+msgid "Downloading package..."
+msgstr "ććć±ć¼ćøććć¦ć³ćć¼ćäø..."
+
+msgid "Removing current Jappix system files..."
+msgstr "ē¾åØć®Jappixć·ć¹ćć ćć”ć¤ć«ćåé¤ćć¦ćć¾ćć"
+
+msgid "Extracting package..."
+msgstr "ććć±ć¼ćøćę½åŗäø..."
+
+msgid "Regenerating storage folder tree..."
+msgstr "ć¹ćć¬ć¼ćøćć©ć«ćććŖć¼ćåę§ęäø..."
+
+msgid "Jappix is now up to date!"
+msgstr "Jappixćć¢ćććć¼ććć¾ććļ¼"
+
+msgid "Aborted: socket error!"
+msgstr "äøę¢:ć½ć±ćććØć©ć¼"
+
+msgid "Aborted: buffer error!"
+msgstr "äøę¢:ćććć”ć¼ćØć©ć¼"
+
+msgid "Aborted: everything is not writable!"
+msgstr "äøę¢:å
Øć¦ęøćč¾¼ćæęØ©ćććć¾ććć"
+
+msgid "Aborted: could not extract the package!"
+msgstr "äøę¢:ććć±ć¼ćøćę½åŗććććØćć§ćć¾ććć§ććć"
+
+msgid "Visits"
+msgstr "čØŖå"
+
+msgid "Daily"
+msgstr "ę„"
+
+msgid "Weekly"
+msgstr "é±"
+
+msgid "Monthly"
+msgstr "ę"
+
+msgid "Yearly"
+msgstr "幓"
+
+msgid "Size"
+msgstr "ćµć¤ćŗ"
+
+msgid "Clean everything"
+msgstr "å
Øć¦ććÆćŖć¢"
+
+msgid "Purge cache"
+msgstr "ćć£ćć·ć„ććć¼ćø"
+
+msgid "Purge logs"
+msgstr "ćć°ććć¼ćø"
+
+msgid "Purge updates"
+msgstr "ć¢ćććć¼ćććć¼ćø"
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr "ć¹ćć¬ć¼ćøćć©ć«ććē©ŗć«ćć¾ćć!"
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr "Jappixćć¼ćć®åæ«é©ććē¶ęććććć«ćå®ęēć«ć¹ćć¬ć¼ćøćć©ć«ćććććć«ćć¦ćć ććļ¼"
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr "Jappixć«é³ę„½(Ogg Vorbis, MP3 ć¾ććÆ WAV å½¢å¼)ćć¢ćććć¼ććć¦čćććØćć§ćć¾ćļ¼"
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr "ć¢ćććć¼ććććć”ć¤ć«ćÆ%sććå°ććććåæ
č¦ćććć¾ćć"
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr "ć¦ć¼ć¶ć¹ćć¢ć®äæęęéćčŖæę“ććććęć¾ćććŖćć³ć³ćć³ććåé¤ć§ćć¾ćć"
+
+msgid "Title"
+msgstr "ćæć¤ćć«"
+
+msgid "Artist"
+msgstr "ć¢ć¼ćć£ć¹ć"
+
+msgid "Album"
+msgstr "ć¢ć«ćć "
+
+msgid "File"
+msgstr "ćć”ć¤ć«"
+
+msgid "Upload"
+msgstr "ć¢ćććć¼ć"
+
+msgid "The folder is empty."
+msgstr "ćć©ć«ććÆē©ŗć§ćć"
+
+msgid "The music could not be received, please retry!"
+msgstr "é³ę„½ćåäæ”ććććØćć§ćć¾ććć§ćććååäæ”ćć¦ćć ććć"
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr "é³ę„½ćć”ć¤ć«ćęå¹ć§ćÆććć¾ććććØć³ć³ć¼ććÆOgg Vorbis, MP3åćÆWAVćä½æēØćć¦ćć ćć!"
+
+msgid "Your music has been added!"
+msgstr "é³ę„½ćčæ½å ćć¾ćć"
+
+msgid "The selected elements have been removed."
+msgstr "éøęćććč¦ē“ ćÆåé¤ćć¾ććć"
+
+msgid "You must select elements to remove!"
+msgstr "åé¤ććč¦ē“ ćéøęććåæ
č¦ćććć¾ćć"
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr "ę°ććć¦ć¼ć¶ćčæ½å ććććć¹ćÆć¼ćć®å¤ę“ćć§ćć¾ććč¤éćŖćć¹ćÆć¼ććčØå®ćć¦ćć ććļ¼"
+
+msgid "Manage"
+msgstr "ē®”ē"
+
+msgid "List"
+msgstr "ćŖć¹ć"
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr "ć¦ć¼ć¶ć®åé¤ćć§ćć¾ććä½ććē»é²ććć¦ććć¦ć¼ć¶ć1äŗŗć®å “åć«ćÆåé¤ć§ćć¾ććć"
+
+msgid "The user has been added!"
+msgstr "ć¦ć¼ć¶ćčæ½å ćć¾ććć"
+
+msgid "The chosen users have been removed."
+msgstr "éøęććć¦ć¼ć¶ćåé¤ćć¾ććć"
+
+msgid "You must select one or more users to be removed!"
+msgstr "åé¤ććć«ćÆ1ć¤ć¾ććÆč¤ę°ć®ć¦ć¼ć¶ćéøęććåæ
č¦ćććć¾ćć"
+
+msgid "Yesterday"
+msgstr "ęØę„"
+
+msgid "%s days ago"
+msgstr "%s ę„å"
+
+msgid "User currently active"
+msgstr "ć¦ć¼ć¶ćÆē¾åØć¢ćÆćć£ćć§ćć"
+
+msgid "Last seen: %s"
+msgstr "ęēµē¢ŗčŖļ¼ %s"
+
+msgid "Inactive since: %s"
+msgstr "%s ććć¢ćÆćć£ćć§ćŖć"
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr "åéćÆć”ćć»ć¼ćøćčæäæ”ććććØćć§ćć¾ćć!"
+
+msgid "Static content server"
+msgstr "ć¹ćæćć£ććÆć³ć³ćć³ććµć¼ć"
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr "ā%2sā %1s ćÆć¹ćæćć£ććÆć³ć³ćć³ććµć¼ćć§ćć"
+
+msgid "Suggested friends"
+msgstr "åéć®ē³č«"
+
+msgid "Check all"
+msgstr "å
Øć¦ććć§ććÆ"
+
+msgid "Uncheck all"
+msgstr "å
Øć¦ć®ćć§ććÆć®č§£é¤"
+
+msgid "Choose"
+msgstr "éøę"
+
+msgid "List name"
+msgstr "čå"
+
+msgid "Allow"
+msgstr "čرåÆ"
+
+msgid "Deny"
+msgstr "äøčرåÆ"
+
+msgid "Group"
+msgstr "ć°ć«ć¼ć"
+
+msgid "Subscription"
+msgstr "ćµćć¹ćÆćŖćć·ć§ć³"
+
+msgid "Both"
+msgstr "äø”ę¹"
+
+msgid "From"
+msgstr "ćć"
+
+msgid "Everybody"
+msgstr "ćæććŖ"
+
+msgid "Send messages"
+msgstr "ć”ćć»ć¼ćøéäæ”"
+
+msgid "Send queries"
+msgstr "ćÆćØćŖć¼éäæ”"
+
+msgid "See my status"
+msgstr "čŖåć®ć¹ćć¼ćæć¹ćč¦ć"
+
+msgid "Send his/her status"
+msgstr "å½¼/彼儳ć«ć¹ćć¼ćæć¹ćéć"
+
+msgid "Everything"
+msgstr "å
ØéØ"
+
+msgid "Item"
+msgstr "ć¢ć¤ćć "
+
+msgid "Order"
+msgstr "ćć®ä»"
+
+msgid "Active for this session"
+msgstr "ć»ćć·ć§ć³ćć¢ćÆćć£ćć«ćŖćć¾ćć"
+
+msgid "Always active"
+msgstr "åøøć«ć¢ćÆćć£ć"
+
+msgid "User directory"
+msgstr "ć¦ć¼ć¶ć¼ćć£ć¬ćÆććŖ"
+
+msgid "Search a friend"
+msgstr "åéćę¤ē“¢"
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr "č¦ę±ććććŖćÆćØć¹ććÆćåäæ”č
åćÆćµć¼ćć«å®č£
ććć¦ććŖććććå¦ēććäŗćć§ćć¾ćć"
+
+msgid "This is a repeat from %s"
+msgstr "%sććć®ć¬ćć¼ć"
+
+msgid "Loading comments..."
+msgstr "ć³ć”ć³ćććć¼ćäøā¦"
+
+msgid "Type your comment here..."
+msgstr "ććć«ć³ć”ć³ććå
„åćć¦ćć ććā¦"
+
+msgid "Could not get the comments!"
+msgstr "ć³ć”ć³ććåå¾ć§ćć¾ććć§ććć"
+
+msgid "Show comments"
+msgstr "ć³ć”ć³ććč¦ć"
+
+msgid "Send him/her a message"
+msgstr "å½¼/彼儳ć«ć”ćć»ć¼ćøćéć"
+
+msgid "Start a chat with him/her"
+msgstr "å½¼/彼儳ćØćć£ćććć"
+
+msgid "Media integration"
+msgstr "ć”ćć£ć¢ēµ±å"
+
+msgid "Comments locked!"
+msgstr "ć³ć”ć³ćććććÆććć¦ćć¾ć"
+
+msgid "Type something you want to share with your friends..."
+msgstr "åéćØå
±ęććććć®ćå
„åā¦"
+
+msgid "changed his/her nickname to %s"
+msgstr "å½¼/彼儳ć®ćććÆćć¼ć ć %s ć«å¤ę“"
+
+msgid "commented an item you follow: ā%sā."
+msgstr "ā%sāć®ć³ć”ć³ćććć©ćć¼ćć"
+
+msgid "Hide"
+msgstr "é ć"
+
+msgid "liked your post: ā%sā."
+msgstr "ā%sāć«ććććéäæ”ćć"
+
+msgid "quoted you somewhere: ā%sā."
+msgstr "ā%sāćå¼ēØćć"
+
+msgid "published on your wall: ā%sā."
+msgstr "ā%sāćå
¬éććć"
+
+msgid "tagged you in a photo (%s)."
+msgstr "åē(%s)ć«ćæć°ćä»ćć¾ććć"
+
+msgid "tagged you in a video (%s)."
+msgstr "ę å(%s)ć«ćæć°ćä»ćć¾ććć"
+
+msgid "Show"
+msgstr "č¦ć"
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr "ćć«ććåæ
č¦ć§ććļ¼ććć„ć”ć³ććć¼ćøćććčŖććććć®ćć©ć¼ć ćå
„åćć¦ćć ććļ¼"
+
+msgid "Pubsub host"
+msgstr "Pubsubćć¹ć"
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr "JappixćÆē“ ę“ćććć½ć¼ć·ć£ć«ćć©ćććć©ć¼ć ć§ććć©ćć«ćć¦ććć¤ć§ćć¢ćÆć»ć¹ć§ćć¾ćć"
+
+msgid "Manager link"
+msgstr "ććć¼ćøć£ć¼ćŖć³ćÆ"
+
+msgid "User uploads server"
+msgstr "ć¦ć¼ć¶ć¢ćććć¼ććµć¼ć"
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr "ā%2sāć%1sćµć¼ćć«ć¢ćććć¼ććć¾ććć"
+
+msgid "Logo"
+msgstr "ćć“"
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr "ććć©ć«ćććććŖćć®ćµć¼ćć¹ćć“ć«å¤ę“ććäŗćåŗę„ć¾ćććµć¤ćŗćØč²ć«ę°ćć¤ćć¦ļ¼"
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr "ęØå„ØćććććÆć»ć«ćµć¤ćŗć®ćć“ćć¢ćććć¼ćć§ćć¾ć"
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr "ęå¹ćŖć¤ć”ć¼ćøć§ćÆććć¾ćććPNGćć©ć¼ććććä½æēØćć¦ćć ććć"
+
+msgid "Your service logo has been successfully changed!"
+msgstr "ćµć¼ćć¹ćć“ćå¤ę“ćć¾ććć"
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr "ćć“ćć©ć¼ććććÆPNGå½¢å¼ćä½æēØććåæ
č¦ćććć¾ćććć£ć¼ć«ććē©ŗę¬ć®å “åćÆćć“ćÆå¤ę“ććć¾ććć"
+
+msgid "Remove this logo"
+msgstr "ćć®ćć“ć®åé¤"
+
+msgid "View this logo"
+msgstr "ćć®ćć“ćč¦ć"
+
+msgid "Send a file"
+msgstr "ćć”ć¤ć«éäæ”"
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr "ć¢ćććć¼ććØćÆćåéćęććć¦ć³ćć¼ććć”ć¤ć«ćéćććØć§ćć"
+
+msgid "Groupchats to join"
+msgstr "ē»åēµå"
+
+msgid "Purge sent files"
+msgstr "éäæ”ćć”ć¤ć«ć®ćć¼ćø"
+
+msgid "would like to send you a file: ā%sā."
+msgstr "éäæ”ćć”ć¤ć«ćÆā%sāć®ććć«ćŖćć¾ć"
+
+msgid "has accepted to received your file: ā%sā."
+msgstr "ā%sāćć”ć¤ć«ćåäæ”ććäŗćåćå
„ćć¾ććć"
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr "ā%sāćć”ć¤ć«ć®åćåććęå¦ćć¾ććć"
+
+msgid "could not receive your file: ā%sā."
+msgstr "ā%sāćć”ć¤ć«ćåćåćććØćć§ćć¾ććć"
+
+msgid "has received a file exchange request: ā%sā."
+msgstr "ā%sāćć”ć¤ć«äŗ¤ęč¦ę±ćåäæ”ćć¾ććć"
+
+msgid "Available shortcuts:"
+msgstr "ä½æēØåÆč½ćŖć·ć§ć¼ćć«ććļ¼"
+
+msgid "%s removes the chat logs"
+msgstr "%s ćÆćć£ćććć°ćåé¤ćć¾ććć"
+
+msgid "%s joins a groupchat"
+msgstr "%s ćÆć°ć«ć¼ććć£ććć«ę„ē¶ćć¾ććć"
+
+msgid "%s closes the chat"
+msgstr "%s ćÆćć£ććććÆćć¼ćŗćć¾ććć"
+
+msgid "%s shows the user profile"
+msgstr "%s ć®ć¦ć¼ć¶ćććć”ć¤ć«ćč¦ćć"
+
+msgid "%s sends a message to the room"
+msgstr "%s ćÆéØå±ć«ć”ćć»ć¼ćøćéäæ”ććć"
+
+msgid "%s changes your nickname"
+msgstr "%s ćÆćććÆćć¼ć ćå¤ę“ćć¾ććć"
+
+msgid "%s sends a message to someone in the room"
+msgstr "%s ćÆéØå±ć®čŖ°ćć«ć”ćć»ć¼ćøćéćć¾ćć"
+
+msgid "%s changes the room topic"
+msgstr "%s ćÆéØå±ć®ććććÆćå¤ę“ćć¾ććć"
+
+msgid "%s kicks an user of the room"
+msgstr "%s ćéØå±ććčæ½ćåŗćć¾ććć"
+
+msgid "%s bans an user of the room"
+msgstr "%s ć®éØå±ć®ä½æēØćē¦ę¢ćć¾ććć"
+
+msgid "%s invites someone to join the room"
+msgstr "%s ćÆéØå±ć®åŗåøč
ćęå¾
ćć¦ćć¾ćć"
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr "JappixćÆéå¶å©ć®ć½ć¼ć·ć£ć«ćć©ćććć©ć¼ć ć§ććć©ćć«ćć¦ćć¢ćÆć»ć¹ć§ćććć¤ć§ćć³ćć„ćć±ć¼ć·ć§ć³ćåćććØćć§ćć¾ćć"
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# Dutch translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:25+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr ""
+
+msgid "An open social network"
+msgstr ""
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "Jappix is onderbroken door een netwerk probleem, een fout of een slechte login (controleer dat je de juiste gegevens hebt ingegeven), sorry voor het ongemak."
+
+msgid "The element list on this server could not be obtained!"
+msgstr ""
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "Uw paswoord is gewijzigd, U kan nu aanmelden met de nieuwe gegevens."
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr ""
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr ""
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "De kamer die je binnenkwam bestaat nog niet. Je moet ze eerst aanmaken!"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "Het groepsgesprek is verwijderd. Nu kan iemand anders ze opnieuw aanmaken."
+
+msgid "The user that you want to reach is not present in the room."
+msgstr ""
+
+msgid "Please enter the group chat address to join."
+msgstr ""
+
+msgid "Please enter your nickname to join %s."
+msgstr ""
+
+msgid "This room (%s) is protected with a password."
+msgstr ""
+
+msgid "Your browser is out of date!"
+msgstr ""
+
+msgid "Last %s version is better!"
+msgstr ""
+
+msgid "Login"
+msgstr "Log in"
+
+msgid "Register"
+msgstr "Registreer"
+
+msgid "Here we go!"
+msgstr "Hier gaan we dan!"
+
+msgid "Server"
+msgstr "Server"
+
+msgid "Password"
+msgstr "Paswoord"
+
+msgid "Remember me"
+msgstr "Herinner mij"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr ""
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr ""
+
+msgid "Reconnect"
+msgstr ""
+
+msgid "Messages"
+msgstr "Berichten"
+
+msgid "Profile"
+msgstr "Profiel"
+
+msgid "Options"
+msgstr "Opties"
+
+msgid "Disconnect"
+msgstr "Verbreek de verbinding"
+
+msgid "Filter"
+msgstr ""
+
+msgid "Add a friend"
+msgstr ""
+
+msgid "Your groupchats"
+msgstr ""
+
+msgid "Manage your favorite groupchats"
+msgstr "Beheer je favoriete groepsgesprekken"
+
+msgid "More stuff"
+msgstr ""
+
+msgid "Show all friends"
+msgstr "Toon alle vrienden"
+
+msgid "Only show connected friends"
+msgstr ""
+
+msgid "Message archives"
+msgstr "Berichten archief"
+
+msgid "Date"
+msgstr "Datum"
+
+msgid "Please select a friend to view the chat history."
+msgstr ""
+
+msgid "Nothing found for: %s"
+msgstr ""
+
+msgid "A short message?"
+msgstr "Een kort bericht?"
+
+msgid "How are you?"
+msgstr "Hoe gaat het ermee?"
+
+msgid "What are you doing?"
+msgstr "Wat ben je aan het doen?"
+
+msgid "Join a chat"
+msgstr ""
+
+msgid "Status"
+msgstr ""
+
+msgid "Available"
+msgstr "Beschikbaar"
+
+msgid "Talkative"
+msgstr "Spraakzaam"
+
+msgid "Away"
+msgstr "Weg"
+
+msgid "Not available"
+msgstr "Niet beschikbaar"
+
+msgid "Busy"
+msgstr "Bezig"
+
+msgid "Mood"
+msgstr ""
+
+msgid "None"
+msgstr "Geen"
+
+msgid "Crazy"
+msgstr "Gek"
+
+msgid "Excited"
+msgstr "Opgewonden"
+
+msgid "Playful"
+msgstr "Speels"
+
+msgid "Happy"
+msgstr "Vrolijk"
+
+msgid "Shocked"
+msgstr "Geschokt"
+
+msgid "Hot"
+msgstr "Vurig"
+
+msgid "Sad"
+msgstr "Triest"
+
+msgid "Amorous"
+msgstr "Verliefd"
+
+msgid "Confident"
+msgstr "Zelfverzekerd"
+
+msgid "Activity"
+msgstr ""
+
+msgid "Chores"
+msgstr ""
+
+msgid "Drinking"
+msgstr "Drinken"
+
+msgid "Eating"
+msgstr "Eten"
+
+msgid "Exercising"
+msgstr ""
+
+msgid "Grooming"
+msgstr ""
+
+msgid "Appointment"
+msgstr "Afspraak"
+
+msgid "Inactive"
+msgstr "Inactief"
+
+msgid "Relaxing"
+msgstr "Uitrusten"
+
+msgid "Talking"
+msgstr "Praten"
+
+msgid "Traveling"
+msgstr "Reizen"
+
+msgid "Working"
+msgstr "Werken"
+
+msgid "View profile"
+msgstr ""
+
+msgid "Repeat this notice"
+msgstr "Herhaal deze melding"
+
+msgid "Remove this notice"
+msgstr "Verwijder deze melding"
+
+msgid "Your profile"
+msgstr ""
+
+msgid "Identity"
+msgstr "Identiteit"
+
+msgid "Profile image"
+msgstr ""
+
+msgid "Others"
+msgstr ""
+
+msgid "Personal"
+msgstr ""
+
+msgid "Complete name"
+msgstr "Volledige naam"
+
+msgid "Nickname"
+msgstr ""
+
+msgid "First name"
+msgstr ""
+
+msgid "Last name"
+msgstr ""
+
+msgid "Date of birth"
+msgstr ""
+
+msgid "Contact"
+msgstr "Contact"
+
+msgid "E-mail"
+msgstr "E-mail"
+
+msgid "Phone"
+msgstr ""
+
+msgid "Website"
+msgstr "Website"
+
+msgid "Current"
+msgstr ""
+
+msgid "Delete"
+msgstr "Verwijder"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr ""
+
+msgid "Address"
+msgstr ""
+
+msgid "Street"
+msgstr "Straat"
+
+msgid "City"
+msgstr "Stad"
+
+msgid "Postal code"
+msgstr "Postcode"
+
+msgid "Country"
+msgstr "Land"
+
+msgid "Biography"
+msgstr "Biografie"
+
+msgid "Important notice"
+msgstr "Belangrijke mededeling"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr ""
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr ""
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr ""
+
+msgid "Save"
+msgstr "Opslaan"
+
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgid "Edit options"
+msgstr ""
+
+msgid "Channel"
+msgstr ""
+
+msgid "Commands"
+msgstr ""
+
+msgid "Sounds"
+msgstr "Geluiden"
+
+msgid "Privacy"
+msgstr "Privacy"
+
+msgid "Message archiving"
+msgstr "Bericht archivering"
+
+msgid "Store a history of your chats"
+msgstr ""
+
+msgid "Geolocation"
+msgstr "Geolocatie"
+
+msgid "Empty"
+msgstr "Leeg"
+
+msgid "Empty channel"
+msgstr ""
+
+msgid "Persistent"
+msgstr "Blijvend"
+
+msgid "Maximum notices"
+msgstr "Maximale meldingen"
+
+msgid "Account"
+msgstr ""
+
+msgid "Change password"
+msgstr ""
+
+msgid "Delete account"
+msgstr ""
+
+msgid "Old"
+msgstr "Oud"
+
+msgid "New (2 times)"
+msgstr "Nieuw (2 keer)"
+
+msgid "Continue"
+msgstr ""
+
+msgid "To"
+msgstr "Naar"
+
+msgid "Close"
+msgstr "Sluiten"
+
+msgid "unknown"
+msgstr "onbekend"
+
+msgid "Unavailable"
+msgstr "Niet beschikbaar"
+
+msgid "is now"
+msgstr ""
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr ""
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr ""
+
+msgid "The image file is not supported or has a bad size."
+msgstr ""
+
+msgid "Reply"
+msgstr "Antwoord"
+
+msgid "Error"
+msgstr "Fout"
+
+msgid "Click here to solve the error"
+msgstr ""
+
+msgid "You"
+msgstr ""
+
+msgid "Remove"
+msgstr "Verwijder"
+
+msgid "Rename"
+msgstr "Hernoem"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr ""
+
+msgid "Smiley insertion"
+msgstr "Emoticon invoegen"
+
+msgid "Change style"
+msgstr ""
+
+msgid "Text in bold"
+msgstr "Tekst vetgedrukt"
+
+msgid "Text in italic"
+msgstr "Tekst schuin"
+
+msgid "Underlined text"
+msgstr "Tekst onderstreept"
+
+msgid "Save chat"
+msgstr ""
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr ""
+
+msgid "This chat is empty!"
+msgstr ""
+
+msgid "Generate file!"
+msgstr ""
+
+msgid "Download file!"
+msgstr ""
+
+msgid "Clean current chat"
+msgstr ""
+
+msgid "View chat history"
+msgstr ""
+
+msgid "Show user profile"
+msgstr ""
+
+msgid "Add this contact to your friends"
+msgstr ""
+
+msgid "Add this groupchat to your favorites"
+msgstr ""
+
+msgid "All tabs"
+msgstr ""
+
+msgid "Close this tab"
+msgstr ""
+
+msgid "no subject defined for this room."
+msgstr "Deze kamer heeft geen onderwerp"
+
+msgid "Administration panel for this room"
+msgstr ""
+
+msgid "Moderators"
+msgstr ""
+
+msgid "Participants"
+msgstr "Deelnemers"
+
+msgid "Visitors"
+msgstr "Bezoekers"
+
+msgid "Manage favorite rooms"
+msgstr ""
+
+msgid "Change favorites"
+msgstr ""
+
+msgid "Search a room"
+msgstr "Zoek een kamer"
+
+msgid "Select a favorite"
+msgstr ""
+
+msgid "Getting the name..."
+msgstr ""
+
+msgid "Gateway"
+msgstr ""
+
+msgid "Name"
+msgstr "Naam"
+
+msgid "Room"
+msgstr "Kamer"
+
+msgid "Add"
+msgstr "Voeg toe"
+
+msgid "Edit"
+msgstr "Wijzig"
+
+msgid "Search a room on"
+msgstr ""
+
+msgid "No room found on this server."
+msgstr "Geen kamer gevonden op deze server"
+
+msgid "Service discovery"
+msgstr ""
+
+msgid "Server to query"
+msgstr ""
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr ""
+
+msgid "Accounts"
+msgstr ""
+
+msgid "Authentications"
+msgstr ""
+
+msgid "Automation"
+msgstr ""
+
+msgid "Clients"
+msgstr ""
+
+msgid "Collaboration"
+msgstr "Samenwerking"
+
+msgid "Components"
+msgstr ""
+
+msgid "Rooms"
+msgstr "Kamers"
+
+msgid "Directories"
+msgstr ""
+
+msgid "Gateways"
+msgstr ""
+
+msgid "News"
+msgstr "Nieuws"
+
+msgid "Hierarchy"
+msgstr "Hiƫrarchie"
+
+msgid "Proxies"
+msgstr ""
+
+msgid "Publication/Subscription"
+msgstr ""
+
+msgid "Storage"
+msgstr "Opslag"
+
+msgid "Service offline or broken"
+msgstr ""
+
+msgid "Your inbox"
+msgstr ""
+
+msgid "Available actions"
+msgstr "Beschikabre acties"
+
+msgid "Clean"
+msgstr ""
+
+msgid "New"
+msgstr "Nieuw"
+
+msgid "Received"
+msgstr "Ontvangen"
+
+msgid "Subject"
+msgstr "Onderwerp"
+
+msgid "Content"
+msgstr "Inhoud"
+
+msgid "Send message"
+msgstr ""
+
+msgid "Your inbox is empty."
+msgstr ""
+
+msgid "MUC administration"
+msgstr "MUC beheer"
+
+msgid "You administrate this room"
+msgstr ""
+
+msgid "Enter new subject"
+msgstr ""
+
+msgid "Configuration"
+msgstr "Configuratie"
+
+msgid "Authorizations"
+msgstr ""
+
+msgid "Member list"
+msgstr ""
+
+msgid "Owner list"
+msgstr ""
+
+msgid "Administrator list"
+msgstr ""
+
+msgid "Outcast list"
+msgstr ""
+
+msgid "Add an input"
+msgstr ""
+
+msgid "Destroy this MUC"
+msgstr "Verwijder deze MUC"
+
+msgid "Yes, let's do it!"
+msgstr "Ja, laten we het doen!"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr ""
+
+msgid "Your friend is writing a message..."
+msgstr "Je vriend schrijft een bericht..."
+
+msgid "Your friend stopped writing a message."
+msgstr "Je vriend is gestopt met het schrijven van een bericht."
+
+msgid "Your friend is doing something else."
+msgstr "Je vriend is wat anders aan het doen."
+
+msgid "Your friend closed the chat."
+msgstr ""
+
+msgid "Requesting this service..."
+msgstr ""
+
+msgid "Loading"
+msgstr "Laden"
+
+msgid "joined the chat room"
+msgstr ""
+
+msgid "left the chat room"
+msgstr ""
+
+msgid "no status"
+msgstr ""
+
+msgid "has been kicked"
+msgstr ""
+
+msgid "has been banned"
+msgstr ""
+
+msgid "no reason"
+msgstr ""
+
+msgid "Communicate with the entire world!"
+msgstr ""
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr ""
+
+msgid "Hi there!"
+msgstr "Hallo!"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr ""
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr ""
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr ""
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr ""
+
+msgid "Previous"
+msgstr "Vorige"
+
+msgid "General"
+msgstr "Algemeen"
+
+msgid "Advanced"
+msgstr "Geavanceerd"
+
+msgid "Resource"
+msgstr ""
+
+msgid "Priority"
+msgstr "Prioriteit"
+
+msgid "Low"
+msgstr "Laag"
+
+msgid "Medium"
+msgstr "Middelmatig"
+
+msgid "High"
+msgstr "Hoog"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr ""
+
+msgid "login page"
+msgstr "Login pagina"
+
+msgid "Share this link with your friends:"
+msgstr "Deel deze link met je vrienden:"
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr ""
+
+msgid "Required"
+msgstr "Verplicht"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr "Je bent geregistreerd, hier is je XMPP adres:"
+
+msgid "Manager"
+msgstr "Manager"
+
+msgid "Project"
+msgstr "Project"
+
+msgid "Encrypted"
+msgstr "Versleuteld"
+
+msgid "Unencrypted"
+msgstr ""
+
+msgid "Where are you?"
+msgstr "Waar ben je?"
+
+msgid "What's up with you?"
+msgstr "Hoe gaat het met je?"
+
+msgid "Fetching the social channel..."
+msgstr "Binnenhalen van het kanaal..."
+
+msgid "You are synchronized with your network."
+msgstr "Je bent gesynchroniseerd met het netwerk"
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr "Kan niets verzenden: je kunt alleen berichten ontvangen!"
+
+msgid "Media viewer"
+msgstr ""
+
+msgid "Browse"
+msgstr "Blader"
+
+msgid "Command"
+msgstr "Commando"
+
+msgid "Subscribe"
+msgstr "Inschrijven"
+
+msgid "Join"
+msgstr "Aanmelden"
+
+msgid "Automatic"
+msgstr "Automatisch"
+
+msgid "Search"
+msgstr "Zoek"
+
+msgid "No result!"
+msgstr "Geen resultaat!"
+
+msgid "No notifications."
+msgstr "Geen meldingen"
+
+msgid "would like to add you as a friend."
+msgstr "zou je graag als vriend toevoegen."
+
+msgid "would like you to join this chatroom:"
+msgstr "wil naar je chatroom komen."
+
+msgid "Do you accept?"
+msgstr "Ben je het ermee eens?"
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Nee"
+
+msgid "would like to get authorization."
+msgstr "wil geauthoriseerd worden."
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr ""
+
+msgid "Submit"
+msgstr "Verzend"
+
+msgid "Client"
+msgstr "Client"
+
+msgid "System"
+msgstr "Systeem"
+
+msgid "Local time"
+msgstr "Lokale tijd"
+
+msgid "Comments"
+msgstr "Commentaar"
+
+msgid "User profile"
+msgstr "Gebruikers profiel"
+
+msgid "See his/her position on the globe"
+msgstr "Bekijk zijn/haar positie op de wereld"
+
+msgid "Confirm"
+msgstr "Bevestig"
+
+msgid "anonymous mode"
+msgstr "anonieme modus"
+
+msgid "Groups"
+msgstr "Groepen"
+
+msgid "Unclassified"
+msgstr "Ongeklassificeerd"
+
+msgid "Authorize"
+msgstr "Autoriseer"
+
+msgid "Ask for authorization"
+msgstr "Vraag om een authorisatie"
+
+msgid "Unblock"
+msgstr ""
+
+msgid "Prohibit"
+msgstr "Toegestaan"
+
+msgid "Block"
+msgstr "Blokkeren"
+
+msgid "Chat"
+msgstr "Gesprek"
+
+msgid "Groupchat"
+msgstr "Groepsgesprek"
+
+msgid "Jappix Mobile"
+msgstr "Jappix Mobiel"
+
+msgid "Desktop"
+msgstr "Desktop"
+
+msgid "Mobile"
+msgstr "Mobiel"
+
+msgid "Please wait..."
+msgstr "Even geduld aub ..."
+
+msgid "Please enable JavaScript"
+msgstr "Activeer Javascript"
+
+msgid "Your channel"
+msgstr "Jouw kanaal"
+
+msgid "Channel of"
+msgstr "Kanaal van"
+
+msgid "More notices..."
+msgstr "Meer mededelingen..."
+
+msgid "Attach a file"
+msgstr "Toevoegen van bestand"
+
+msgid "Send"
+msgstr "Verzenden"
+
+msgid "Unattach the file"
+msgstr ""
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr ""
+
+msgid "Authorization failed"
+msgstr ""
+
+msgid "Registration failed, please choose a different username"
+msgstr ""
+
+msgid "Service unavailable"
+msgstr ""
+
+msgid "Internal server error, try later"
+msgstr "Interne server fout, probeer het later"
+
+msgid "Your form has been sent."
+msgstr ""
+
+msgid "Application"
+msgstr "Applicatie"
+
+msgid "XMPP links"
+msgstr "XMPP links"
+
+msgid "Open XMPP links with Jappix"
+msgstr "Open XMPP links met Jappix"
+
+msgid "changed the subject to:"
+msgstr ""
+
+msgid "Welcome!"
+msgstr "Welkom!"
+
+msgid "Friends"
+msgstr "Vrienden"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr ""
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr ""
+
+msgid "Enable notification sounds"
+msgstr ""
+
+msgid "Share your position on the globe"
+msgstr ""
+
+msgid "Offline friends"
+msgstr ""
+
+msgid "Don't hide offline friends"
+msgstr ""
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr ""
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr ""
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr ""
+
+msgid "Share Jappix on %s"
+msgstr ""
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr ""
+
+msgid "Unknown name"
+msgstr "Onbekende naam"
+
+msgid "Unknown country"
+msgstr "Onbekend land"
+
+msgid "Click to enable"
+msgstr ""
+
+msgid "Click to disable"
+msgstr ""
+
+msgid "Installation"
+msgstr ""
+
+msgid "Jappix installation"
+msgstr ""
+
+msgid "Welcome to the Jappix installation!"
+msgstr ""
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr ""
+
+msgid "Let's have a look at the installation steps:"
+msgstr ""
+
+msgid "Welcome"
+msgstr ""
+
+msgid "Storage configuration"
+msgstr ""
+
+msgid "Administrator account"
+msgstr ""
+
+msgid "Main configuration"
+msgstr ""
+
+msgid "Hosts configuration"
+msgstr ""
+
+msgid "Services installation"
+msgstr ""
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr ""
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr ""
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr ""
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr ""
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr ""
+
+msgid "The folder is writable, you can continue!"
+msgstr ""
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr ""
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr ""
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr ""
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr ""
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr ""
+
+msgid "User"
+msgstr ""
+
+msgid "Service"
+msgstr ""
+
+msgid "Service name"
+msgstr ""
+
+msgid "Service description"
+msgstr ""
+
+msgid "Connection"
+msgstr ""
+
+msgid "Lock the host"
+msgstr ""
+
+msgid "Anonymous mode"
+msgstr ""
+
+msgid "Registration allowed"
+msgstr ""
+
+msgid "Use a proxy"
+msgstr ""
+
+msgid "Encryption"
+msgstr ""
+
+msgid "HTTPS storage"
+msgstr ""
+
+msgid "Force HTTPS"
+msgstr ""
+
+msgid "Compression"
+msgstr ""
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr ""
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr ""
+
+msgid "Main host"
+msgstr ""
+
+msgid "Groupchat host"
+msgstr ""
+
+msgid "Anonymous host"
+msgstr ""
+
+msgid "Directory host"
+msgstr ""
+
+msgid "BOSH host"
+msgstr ""
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr ""
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr ""
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr ""
+
+msgid "Thanks for using Jappix!"
+msgstr ""
+
+msgid "Next"
+msgstr ""
+
+msgid "Finish"
+msgstr ""
+
+msgid "Check again"
+msgstr ""
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr ""
+
+msgid "%s is installed on your system."
+msgstr ""
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr ""
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr ""
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr ""
+
+msgid "Jappix manager"
+msgstr ""
+
+msgid "Manager access"
+msgstr ""
+
+msgid "Statistics"
+msgstr ""
+
+msgid "Hosts"
+msgstr ""
+
+msgid "Design"
+msgstr ""
+
+msgid "Repeat"
+msgstr ""
+
+msgid "All"
+msgstr ""
+
+msgid "Horizontal"
+msgstr ""
+
+msgid "Vertical"
+msgstr ""
+
+msgid "Center"
+msgstr ""
+
+msgid "Left"
+msgstr ""
+
+msgid "Right"
+msgstr ""
+
+msgid "Top"
+msgstr ""
+
+msgid "Bottom"
+msgstr ""
+
+msgid "Adapt"
+msgstr ""
+
+msgid "Color"
+msgstr ""
+
+msgid "Users"
+msgstr ""
+
+msgid "Updates"
+msgstr ""
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr ""
+
+msgid "Please use the form below to login to the administration panel."
+msgstr ""
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr ""
+
+msgid "Credentials"
+msgstr ""
+
+msgid "You have been logged out. Goodbye!"
+msgstr ""
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr ""
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr ""
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr ""
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr ""
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr ""
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr ""
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr ""
+
+msgid "The image could not be received, would you mind retry?"
+msgstr ""
+
+msgid "Your image was added to the list!"
+msgstr ""
+
+msgid "Changes saved!"
+msgstr ""
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr ""
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr ""
+
+msgid "Access statistics"
+msgstr ""
+
+msgid "Share statistics"
+msgstr ""
+
+msgid "Other statistics"
+msgstr ""
+
+msgid "January"
+msgstr ""
+
+msgid "February"
+msgstr ""
+
+msgid "March"
+msgstr ""
+
+msgid "April"
+msgstr ""
+
+msgid "May"
+msgstr ""
+
+msgid "June"
+msgstr ""
+
+msgid "July"
+msgstr ""
+
+msgid "August"
+msgstr ""
+
+msgid "September"
+msgstr ""
+
+msgid "October"
+msgstr ""
+
+msgid "November"
+msgstr ""
+
+msgid "December"
+msgstr ""
+
+msgid "Monday"
+msgstr ""
+
+msgid "Tuesday"
+msgstr ""
+
+msgid "Wednesday"
+msgstr ""
+
+msgid "Thursday"
+msgstr ""
+
+msgid "Friday"
+msgstr ""
+
+msgid "Saturday"
+msgstr ""
+
+msgid "Sunday"
+msgstr ""
+
+msgid "Total"
+msgstr ""
+
+msgid "Cache"
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Music"
+msgstr ""
+
+msgid "Backgrounds"
+msgstr ""
+
+msgid "Share"
+msgstr ""
+
+msgid "Background"
+msgstr ""
+
+msgid "Notice"
+msgstr ""
+
+msgid "Your design preferences have been saved!"
+msgstr ""
+
+msgid "Please check your inputs: something is missing!"
+msgstr ""
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr ""
+
+msgid "Use default background"
+msgstr ""
+
+msgid "Use your own image"
+msgstr ""
+
+msgid "Select a background to use and change the display options."
+msgstr ""
+
+msgid "Use your own color"
+msgstr ""
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr ""
+
+msgid "Manage backgrounds"
+msgstr ""
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr ""
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr ""
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr ""
+
+msgid "Simple notice"
+msgstr ""
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr ""
+
+msgid "Advanced notice"
+msgstr ""
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr ""
+
+msgid "Available updates"
+msgstr ""
+
+msgid "What's new?"
+msgstr ""
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr ""
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr ""
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr ""
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr ""
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr ""
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr ""
+
+msgid "Check for updates"
+msgstr ""
+
+msgid "Update in progress"
+msgstr ""
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr ""
+
+msgid "The update has failed! Please try again later."
+msgstr ""
+
+msgid "Downloading package..."
+msgstr ""
+
+msgid "Removing current Jappix system files..."
+msgstr ""
+
+msgid "Extracting package..."
+msgstr ""
+
+msgid "Regenerating storage folder tree..."
+msgstr ""
+
+msgid "Jappix is now up to date!"
+msgstr ""
+
+msgid "Aborted: socket error!"
+msgstr ""
+
+msgid "Aborted: buffer error!"
+msgstr ""
+
+msgid "Aborted: everything is not writable!"
+msgstr ""
+
+msgid "Aborted: could not extract the package!"
+msgstr ""
+
+msgid "Visits"
+msgstr ""
+
+msgid "Daily"
+msgstr ""
+
+msgid "Weekly"
+msgstr ""
+
+msgid "Monthly"
+msgstr ""
+
+msgid "Yearly"
+msgstr ""
+
+msgid "Size"
+msgstr ""
+
+msgid "Clean everything"
+msgstr ""
+
+msgid "Purge cache"
+msgstr ""
+
+msgid "Purge logs"
+msgstr ""
+
+msgid "Purge updates"
+msgstr ""
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr ""
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr ""
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr ""
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr ""
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr ""
+
+msgid "Title"
+msgstr ""
+
+msgid "Artist"
+msgstr ""
+
+msgid "Album"
+msgstr ""
+
+msgid "File"
+msgstr ""
+
+msgid "Upload"
+msgstr ""
+
+msgid "The folder is empty."
+msgstr ""
+
+msgid "The music could not be received, please retry!"
+msgstr ""
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr ""
+
+msgid "Your music has been added!"
+msgstr ""
+
+msgid "The selected elements have been removed."
+msgstr ""
+
+msgid "You must select elements to remove!"
+msgstr ""
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr ""
+
+msgid "Manage"
+msgstr ""
+
+msgid "List"
+msgstr ""
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr ""
+
+msgid "The user has been added!"
+msgstr ""
+
+msgid "The chosen users have been removed."
+msgstr ""
+
+msgid "You must select one or more users to be removed!"
+msgstr ""
+
+msgid "Yesterday"
+msgstr ""
+
+msgid "%s days ago"
+msgstr ""
+
+msgid "User currently active"
+msgstr ""
+
+msgid "Last seen: %s"
+msgstr ""
+
+msgid "Inactive since: %s"
+msgstr ""
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr ""
+
+msgid "Static content server"
+msgstr ""
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Suggested friends"
+msgstr ""
+
+msgid "Check all"
+msgstr ""
+
+msgid "Uncheck all"
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "List name"
+msgstr ""
+
+msgid "Allow"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
+msgid "Group"
+msgstr ""
+
+msgid "Subscription"
+msgstr ""
+
+msgid "Both"
+msgstr ""
+
+msgid "From"
+msgstr ""
+
+msgid "Everybody"
+msgstr ""
+
+msgid "Send messages"
+msgstr ""
+
+msgid "Send queries"
+msgstr ""
+
+msgid "See my status"
+msgstr ""
+
+msgid "Send his/her status"
+msgstr ""
+
+msgid "Everything"
+msgstr ""
+
+msgid "Item"
+msgstr ""
+
+msgid "Order"
+msgstr ""
+
+msgid "Active for this session"
+msgstr ""
+
+msgid "Always active"
+msgstr ""
+
+msgid "User directory"
+msgstr ""
+
+msgid "Search a friend"
+msgstr ""
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr ""
+
+msgid "This is a repeat from %s"
+msgstr ""
+
+msgid "Loading comments..."
+msgstr ""
+
+msgid "Type your comment here..."
+msgstr ""
+
+msgid "Could not get the comments!"
+msgstr ""
+
+msgid "Show comments"
+msgstr ""
+
+msgid "Send him/her a message"
+msgstr ""
+
+msgid "Start a chat with him/her"
+msgstr ""
+
+msgid "Media integration"
+msgstr ""
+
+msgid "Comments locked!"
+msgstr ""
+
+msgid "Type something you want to share with your friends..."
+msgstr ""
+
+msgid "changed his/her nickname to %s"
+msgstr ""
+
+msgid "commented an item you follow: ā%sā."
+msgstr ""
+
+msgid "Hide"
+msgstr ""
+
+msgid "liked your post: ā%sā."
+msgstr ""
+
+msgid "quoted you somewhere: ā%sā."
+msgstr ""
+
+msgid "published on your wall: ā%sā."
+msgstr ""
+
+msgid "tagged you in a photo (%s)."
+msgstr ""
+
+msgid "tagged you in a video (%s)."
+msgstr ""
+
+msgid "Show"
+msgstr ""
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr ""
+
+msgid "Pubsub host"
+msgstr ""
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr ""
+
+msgid "Manager link"
+msgstr ""
+
+msgid "User uploads server"
+msgstr ""
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Logo"
+msgstr ""
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr ""
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr ""
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr ""
+
+msgid "Your service logo has been successfully changed!"
+msgstr ""
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr ""
+
+msgid "Remove this logo"
+msgstr ""
+
+msgid "View this logo"
+msgstr ""
+
+msgid "Send a file"
+msgstr ""
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr ""
+
+msgid "Groupchats to join"
+msgstr ""
+
+msgid "Purge sent files"
+msgstr ""
+
+msgid "would like to send you a file: ā%sā."
+msgstr ""
+
+msgid "has accepted to received your file: ā%sā."
+msgstr ""
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr ""
+
+msgid "could not receive your file: ā%sā."
+msgstr ""
+
+msgid "has received a file exchange request: ā%sā."
+msgstr ""
+
+msgid "Available shortcuts:"
+msgstr ""
+
+msgid "%s removes the chat logs"
+msgstr ""
+
+msgid "%s joins a groupchat"
+msgstr ""
+
+msgid "%s closes the chat"
+msgstr ""
+
+msgid "%s shows the user profile"
+msgstr ""
+
+msgid "%s sends a message to the room"
+msgstr ""
+
+msgid "%s changes your nickname"
+msgstr ""
+
+msgid "%s sends a message to someone in the room"
+msgstr ""
+
+msgid "%s changes the room topic"
+msgstr ""
+
+msgid "%s kicks an user of the room"
+msgstr ""
+
+msgid "%s bans an user of the room"
+msgstr ""
+
+msgid "%s invites someone to join the room"
+msgstr ""
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr ""
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# Occitan translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:25+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "JavaScript es pas dins vĆ²stre navigator, podretz pas far foncionar Jappix ! CorregĆs aquĆ², si vos plai."
+
+msgid "An open social network"
+msgstr "Un malhum sociau dubert"
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "Jappix es estat arrestat per un problema de malhum, un bug o de meschants identificants (de verificar). Fasetz-nos excusa. "
+
+msgid "The element list on this server could not be obtained!"
+msgstr "La lista daus elements presents sus queu servidor es pas estada obtenguda !"
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "VĆ²stre senhau es estat chamnhat, aura vos podetz connectar a vĆ²stre compte emb vĆ²stres noveus identificants. "
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "VĆ²stre compte XMPP es estat esfaƧat, au reveire !"
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "Setz estat desconnetat de vĆ²stre compte XMPP, bona jornada !"
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "Lo charrador qu'avetz jongut existĆs pas. Zo podetz crear !"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "Lo charrador es estat esfaƧat, aura quauqu'un mai zo podrĆ tornar crear."
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "L'utilizaire que voletz jĆŗnher es pas present dins lo charrador. "
+
+msgid "Please enter the group chat address to join."
+msgstr "Picatz l'adreƧa dau charrador de jĆŗnher, si vos plai."
+
+msgid "Please enter your nickname to join %s."
+msgstr "Picatz vĆ²stre chafre per jĆŗnher %s."
+
+msgid "This room (%s) is protected with a password."
+msgstr "Lo charrador (%s) es protegit per un senhau."
+
+msgid "Your browser is out of date!"
+msgstr "VĆ²stre navigator es pas a jorn !"
+
+msgid "Last %s version is better!"
+msgstr "La darriera version de %s es melhor !"
+
+msgid "Login"
+msgstr "Dubrir una session"
+
+msgid "Register"
+msgstr "Se marcar"
+
+msgid "Here we go!"
+msgstr "Anem, Ć²c !"
+
+msgid "Server"
+msgstr "Servidor"
+
+msgid "Password"
+msgstr "Senhau"
+
+msgid "Remember me"
+msgstr "Se sovenir de me"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "Queu gatge es estat desactivat, lo podetz pas utilizar !"
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "Per causa d'un problema de malhum, setz estat desconnectat. Que voletz far aura ?"
+
+msgid "Reconnect"
+msgstr "Tornar connectar"
+
+msgid "Messages"
+msgstr "Messatges"
+
+msgid "Profile"
+msgstr "Perfil"
+
+msgid "Options"
+msgstr "PreferƩncias"
+
+msgid "Disconnect"
+msgstr "Barrar la session"
+
+msgid "Filter"
+msgstr "Filtrar"
+
+msgid "Add a friend"
+msgstr "Apondre un amic"
+
+msgid "Your groupchats"
+msgstr "VĆ²stres charradors"
+
+msgid "Manage your favorite groupchats"
+msgstr "Gerir vĆ²stres charradors preferits"
+
+msgid "More stuff"
+msgstr "Mai de chausas"
+
+msgid "Show all friends"
+msgstr "Mostrar tots los amics"
+
+msgid "Only show connected friends"
+msgstr "Mostrar nonmĆ s los amics en linha"
+
+msgid "Message archives"
+msgstr "Archius de messatges"
+
+msgid "Date"
+msgstr "Data"
+
+msgid "Please select a friend to view the chat history."
+msgstr "Si vos plai, seleccionatz un amic per veire l'istoric de la charrada."
+
+msgid "Nothing found for: %s"
+msgstr "Se trobet pas ren per : %s"
+
+msgid "A short message?"
+msgstr "Un pitit messatge ?"
+
+msgid "How are you?"
+msgstr "Coma quĆ² vai ?"
+
+msgid "What are you doing?"
+msgstr "Que fasetz ?"
+
+msgid "Join a chat"
+msgstr "JĆŗnher una charrada"
+
+msgid "Status"
+msgstr "Estat"
+
+msgid "Available"
+msgstr "Disponible/a"
+
+msgid "Talkative"
+msgstr "Platussaire/a"
+
+msgid "Away"
+msgstr "Absent(a)"
+
+msgid "Not available"
+msgstr "Pas disponible"
+
+msgid "Busy"
+msgstr "Ocupat"
+
+msgid "Mood"
+msgstr "Umor"
+
+msgid "None"
+msgstr "Pas ren"
+
+msgid "Crazy"
+msgstr "Franc fadard(a)"
+
+msgid "Excited"
+msgstr "Excitat/ada"
+
+msgid "Playful"
+msgstr "JoiĆ³s/osa"
+
+msgid "Happy"
+msgstr "AĆ¼rĆ³s/osa"
+
+msgid "Shocked"
+msgstr "Impressionat/ada"
+
+msgid "Hot"
+msgstr "Chaud(a)"
+
+msgid "Sad"
+msgstr "Triste/a"
+
+msgid "Amorous"
+msgstr "AmorĆ³s/osa"
+
+msgid "Confident"
+msgstr "FisanĆ§Ć³s/osa"
+
+msgid "Activity"
+msgstr "Activitat"
+
+msgid "Chores"
+msgstr "Corvadas"
+
+msgid "Drinking"
+msgstr "Beu"
+
+msgid "Eating"
+msgstr "Minja"
+
+msgid "Exercising"
+msgstr "EntraĆÆnament"
+
+msgid "Grooming"
+msgstr "Se toaleta"
+
+msgid "Appointment"
+msgstr "Rendez-vos"
+
+msgid "Inactive"
+msgstr "Inactiu/iva"
+
+msgid "Relaxing"
+msgstr "Banturla"
+
+msgid "Talking"
+msgstr "Platussa"
+
+msgid "Traveling"
+msgstr "En viatge"
+
+msgid "Working"
+msgstr "Trabalha"
+
+msgid "View profile"
+msgstr "Veire lo perfil"
+
+msgid "Repeat this notice"
+msgstr "Repetir quel avĆs "
+
+msgid "Remove this notice"
+msgstr "EsfaƧar quel avĆs "
+
+msgid "Your profile"
+msgstr "VĆ²stre perfil"
+
+msgid "Identity"
+msgstr "Identitat"
+
+msgid "Profile image"
+msgstr "Imatge de perfil"
+
+msgid "Others"
+msgstr "Autres"
+
+msgid "Personal"
+msgstr "Personau"
+
+msgid "Complete name"
+msgstr "Nom complet"
+
+msgid "Nickname"
+msgstr "Chafre"
+
+msgid "First name"
+msgstr "Pitit nom"
+
+msgid "Last name"
+msgstr "Nom"
+
+msgid "Date of birth"
+msgstr "Data de naissenƧa"
+
+msgid "Contact"
+msgstr "Contacte"
+
+msgid "E-mail"
+msgstr "AdreƧa electronica"
+
+msgid "Phone"
+msgstr "TelefĆ²n"
+
+msgid "Website"
+msgstr "Sit web"
+
+msgid "Current"
+msgstr "Actuau"
+
+msgid "Delete"
+msgstr "Suprimir"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "De que ? Avetz pas d'imatge de perfil definida sus vĆ²stra carta d'identitat !"
+
+msgid "Address"
+msgstr "AdreƧa"
+
+msgid "Street"
+msgstr "Rua"
+
+msgid "City"
+msgstr "Vila"
+
+msgid "Postal code"
+msgstr "CĆ²di postau"
+
+msgid "Country"
+msgstr "PaĆs"
+
+msgid "Biography"
+msgstr "Biografia"
+
+msgid "Important notice"
+msgstr "Important"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr "Siatz prudents emb las informacions qu'escrivetz sus vĆ²stre perfil. Son accesiblas a tot lo monde quitament a los que voletz pas."
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr "Tot es pas privat sus XMPP, per exemple vĆ²stre perfil (vCard)."
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr "Qu'es recomandat de charjar un imatge de perfil (%s maximum), coma una fĆ²to de vosautres, per que vĆ²stres amics vos pueschan conĆ©isser."
+
+msgid "Save"
+msgstr "Sauvar"
+
+msgid "Cancel"
+msgstr ""
+
+msgid "Edit options"
+msgstr "Editar las opcions"
+
+msgid "Channel"
+msgstr "Canau"
+
+msgid "Commands"
+msgstr "Ćrdres"
+
+msgid "Sounds"
+msgstr "Sons"
+
+msgid "Privacy"
+msgstr "Vita privada"
+
+msgid "Message archiving"
+msgstr "Archivatge daus messatges"
+
+msgid "Store a history of your chats"
+msgstr "Gardar un istoric de vĆ²stras charradas"
+
+msgid "Geolocation"
+msgstr "Geolocalizacion"
+
+msgid "Empty"
+msgstr "Voidar"
+
+msgid "Empty channel"
+msgstr "Voidar lo canau"
+
+msgid "Persistent"
+msgstr "Persistent"
+
+msgid "Maximum notices"
+msgstr "Maximum d'avĆs"
+
+msgid "Account"
+msgstr "Compte"
+
+msgid "Change password"
+msgstr "Chamnhar de senhau"
+
+msgid "Delete account"
+msgstr "Suprimir lo compte"
+
+msgid "Old"
+msgstr "Ancian"
+
+msgid "New (2 times)"
+msgstr "NuĆ²u (2 cĆ²ps)"
+
+msgid "Continue"
+msgstr "Contunhar"
+
+msgid "To"
+msgstr "A"
+
+msgid "Close"
+msgstr "Barrar"
+
+msgid "unknown"
+msgstr "inconegut/uda"
+
+msgid "Unavailable"
+msgstr "Desconnectat/ada"
+
+msgid "is now"
+msgstr "es aura"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr "Esperatz dau temps que vĆ²stre avatar se charja..."
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "VeiquĆ ! Un brave imatge de perfil tot nuĆ²u !"
+
+msgid "The image file is not supported or has a bad size."
+msgstr ""
+
+msgid "Reply"
+msgstr "Respondre"
+
+msgid "Error"
+msgstr "Error"
+
+msgid "Click here to solve the error"
+msgstr "Clicar aicĆ per corregir l'error"
+
+msgid "You"
+msgstr "Vosautres/as"
+
+msgid "Remove"
+msgstr ""
+
+msgid "Rename"
+msgstr "Renomenar "
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "Adiu ! Sei %s, vos voldriĆ” apondre coma amic."
+
+msgid "Smiley insertion"
+msgstr "Insercion d'emoticĆ²na"
+
+msgid "Change style"
+msgstr "Chamnhar l'aparƩncia"
+
+msgid "Text in bold"
+msgstr "Texte en gras"
+
+msgid "Text in italic"
+msgstr "Texte en italic"
+
+msgid "Underlined text"
+msgstr "Texte joslinhat"
+
+msgid "Save chat"
+msgstr "Enregistrar la charrada"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr "Clicatz sus lo liam per aver l'istoric de la charrada. Puei tornatz clicar per lo recuperar."
+
+msgid "This chat is empty!"
+msgstr "Quela charrada es voida !"
+
+msgid "Generate file!"
+msgstr "Generar lo fichier !"
+
+msgid "Download file!"
+msgstr "Descharjar lo fichier !"
+
+msgid "Clean current chat"
+msgstr "Netiar la charrada "
+
+msgid "View chat history"
+msgstr "Veire l'istoric de la charrada"
+
+msgid "Show user profile"
+msgstr "Mostrar lo perfil de l'utilizaire"
+
+msgid "Add this contact to your friends"
+msgstr "Apondre queu contacte a vĆ²stres amics"
+
+msgid "Add this groupchat to your favorites"
+msgstr "Apondre queu charrador a vĆ²stres preferits"
+
+msgid "All tabs"
+msgstr "Tots los onglets"
+
+msgid "Close this tab"
+msgstr "Barrar quel onglet"
+
+msgid "no subject defined for this room."
+msgstr "p'un subjĆØcte definit per queu charrador."
+
+msgid "Administration panel for this room"
+msgstr ""
+
+msgid "Moderators"
+msgstr "Moderador(a)s"
+
+msgid "Participants"
+msgstr "Participant(a)s"
+
+msgid "Visitors"
+msgstr "Visitaires/as"
+
+msgid "Manage favorite rooms"
+msgstr "Gerir los charradors preferits"
+
+msgid "Change favorites"
+msgstr "Modificar los preferits"
+
+msgid "Search a room"
+msgstr "Cerchar un charrador"
+
+msgid "Select a favorite"
+msgstr "Seleccionatz un preferit"
+
+msgid "Getting the name..."
+msgstr "Obtencion dau nom..."
+
+msgid "Gateway"
+msgstr "PassarĆØla"
+
+msgid "Name"
+msgstr "Nom"
+
+msgid "Room"
+msgstr "Charrador"
+
+msgid "Add"
+msgstr "Apondre"
+
+msgid "Edit"
+msgstr "Editar"
+
+msgid "Search a room on"
+msgstr ""
+
+msgid "No room found on this server."
+msgstr ""
+
+msgid "Service discovery"
+msgstr ""
+
+msgid "Server to query"
+msgstr ""
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr ""
+
+msgid "Accounts"
+msgstr "Comptes"
+
+msgid "Authentications"
+msgstr "Autentificacion ļ»æ "
+
+msgid "Automation"
+msgstr "Automatizacion"
+
+msgid "Clients"
+msgstr "Clients"
+
+msgid "Collaboration"
+msgstr "Collaboracion"
+
+msgid "Components"
+msgstr "Compausants"
+
+msgid "Rooms"
+msgstr "Charradors"
+
+msgid "Directories"
+msgstr "RepertĆ²ris"
+
+msgid "Gateways"
+msgstr "PassarĆØlas"
+
+msgid "News"
+msgstr "Actualitats"
+
+msgid "Hierarchy"
+msgstr "Ierarchia"
+
+msgid "Proxies"
+msgstr "Proxies"
+
+msgid "Publication/Subscription"
+msgstr ""
+
+msgid "Storage"
+msgstr "Emmagazinatge"
+
+msgid "Service offline or broken"
+msgstr ""
+
+msgid "Your inbox"
+msgstr "VĆ²stra boitia d'arribada"
+
+msgid "Available actions"
+msgstr ""
+
+msgid "Clean"
+msgstr "Voidar"
+
+msgid "New"
+msgstr "Noveu"
+
+msgid "Received"
+msgstr "ReƧaugut"
+
+msgid "Subject"
+msgstr "SubjĆØcte"
+
+msgid "Content"
+msgstr "Contengut"
+
+msgid "Send message"
+msgstr "Enviar lo messatge"
+
+msgid "Your inbox is empty."
+msgstr "VĆ²stra boitia d'arribada es voida"
+
+msgid "MUC administration"
+msgstr ""
+
+msgid "You administrate this room"
+msgstr ""
+
+msgid "Enter new subject"
+msgstr ""
+
+msgid "Configuration"
+msgstr "Configuracion"
+
+msgid "Authorizations"
+msgstr "Autorizacions"
+
+msgid "Member list"
+msgstr ""
+
+msgid "Owner list"
+msgstr ""
+
+msgid "Administrator list"
+msgstr ""
+
+msgid "Outcast list"
+msgstr ""
+
+msgid "Add an input"
+msgstr ""
+
+msgid "Destroy this MUC"
+msgstr ""
+
+msgid "Yes, let's do it!"
+msgstr ""
+
+msgid "Your friend is paying attention to the conversation."
+msgstr ""
+
+msgid "Your friend is writing a message..."
+msgstr "VĆ²stre amic es a escriure un messatge..."
+
+msgid "Your friend stopped writing a message."
+msgstr ""
+
+msgid "Your friend is doing something else."
+msgstr ""
+
+msgid "Your friend closed the chat."
+msgstr ""
+
+msgid "Requesting this service..."
+msgstr ""
+
+msgid "Loading"
+msgstr "Charja"
+
+msgid "joined the chat room"
+msgstr ""
+
+msgid "left the chat room"
+msgstr ""
+
+msgid "no status"
+msgstr ""
+
+msgid "has been kicked"
+msgstr ""
+
+msgid "has been banned"
+msgstr ""
+
+msgid "no reason"
+msgstr ""
+
+msgid "Communicate with the entire world!"
+msgstr ""
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr ""
+
+msgid "Hi there!"
+msgstr "Adiu !"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr "Benvengut/uda sus %1s, ā%2sā."
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr ""
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr ""
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr ""
+
+msgid "Previous"
+msgstr "Precedent"
+
+msgid "General"
+msgstr "Generau"
+
+msgid "Advanced"
+msgstr "AvanƧat"
+
+msgid "Resource"
+msgstr ""
+
+msgid "Priority"
+msgstr "Prioritat"
+
+msgid "Low"
+msgstr "Bassa"
+
+msgid "Medium"
+msgstr "Mejana"
+
+msgid "High"
+msgstr "Nauta"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr "Picatz lo nom dau charrador que voletz junher e vĆ²stre chafre. Podetz tanben tornar a la %s. "
+
+msgid "login page"
+msgstr ""
+
+msgid "Share this link with your friends:"
+msgstr ""
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr ""
+
+msgid "Required"
+msgstr ""
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr ""
+
+msgid "Manager"
+msgstr ""
+
+msgid "Project"
+msgstr ""
+
+msgid "Encrypted"
+msgstr ""
+
+msgid "Unencrypted"
+msgstr ""
+
+msgid "Where are you?"
+msgstr "Ente setz ?"
+
+msgid "What's up with you?"
+msgstr ""
+
+msgid "Fetching the social channel..."
+msgstr ""
+
+msgid "You are synchronized with your network."
+msgstr ""
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr ""
+
+msgid "Media viewer"
+msgstr ""
+
+msgid "Browse"
+msgstr ""
+
+msgid "Command"
+msgstr ""
+
+msgid "Subscribe"
+msgstr ""
+
+msgid "Join"
+msgstr ""
+
+msgid "Automatic"
+msgstr ""
+
+msgid "Search"
+msgstr ""
+
+msgid "No result!"
+msgstr ""
+
+msgid "No notifications."
+msgstr ""
+
+msgid "would like to add you as a friend."
+msgstr ""
+
+msgid "would like you to join this chatroom:"
+msgstr ""
+
+msgid "Do you accept?"
+msgstr ""
+
+msgid "Yes"
+msgstr ""
+
+msgid "No"
+msgstr ""
+
+msgid "would like to get authorization."
+msgstr ""
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
+msgid "Client"
+msgstr ""
+
+msgid "System"
+msgstr ""
+
+msgid "Local time"
+msgstr ""
+
+msgid "Comments"
+msgstr ""
+
+msgid "User profile"
+msgstr ""
+
+msgid "See his/her position on the globe"
+msgstr ""
+
+msgid "Confirm"
+msgstr ""
+
+msgid "anonymous mode"
+msgstr ""
+
+msgid "Groups"
+msgstr ""
+
+msgid "Unclassified"
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Ask for authorization"
+msgstr ""
+
+msgid "Unblock"
+msgstr ""
+
+msgid "Prohibit"
+msgstr ""
+
+msgid "Block"
+msgstr ""
+
+msgid "Chat"
+msgstr ""
+
+msgid "Groupchat"
+msgstr ""
+
+msgid "Jappix Mobile"
+msgstr ""
+
+msgid "Desktop"
+msgstr ""
+
+msgid "Mobile"
+msgstr ""
+
+msgid "Please wait..."
+msgstr ""
+
+msgid "Please enable JavaScript"
+msgstr ""
+
+msgid "Your channel"
+msgstr ""
+
+msgid "Channel of"
+msgstr ""
+
+msgid "More notices..."
+msgstr ""
+
+msgid "Attach a file"
+msgstr ""
+
+msgid "Send"
+msgstr ""
+
+msgid "Unattach the file"
+msgstr ""
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr ""
+
+msgid "Authorization failed"
+msgstr ""
+
+msgid "Registration failed, please choose a different username"
+msgstr ""
+
+msgid "Service unavailable"
+msgstr ""
+
+msgid "Internal server error, try later"
+msgstr ""
+
+msgid "Your form has been sent."
+msgstr ""
+
+msgid "Application"
+msgstr ""
+
+msgid "XMPP links"
+msgstr ""
+
+msgid "Open XMPP links with Jappix"
+msgstr ""
+
+msgid "changed the subject to:"
+msgstr ""
+
+msgid "Welcome!"
+msgstr ""
+
+msgid "Friends"
+msgstr "Amics"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr ""
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr ""
+
+msgid "Enable notification sounds"
+msgstr ""
+
+msgid "Share your position on the globe"
+msgstr ""
+
+msgid "Offline friends"
+msgstr "Amics fĆ²ra linha"
+
+msgid "Don't hide offline friends"
+msgstr ""
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr ""
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr ""
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr ""
+
+msgid "Share Jappix on %s"
+msgstr ""
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr ""
+
+msgid "Unknown name"
+msgstr ""
+
+msgid "Unknown country"
+msgstr ""
+
+msgid "Click to enable"
+msgstr ""
+
+msgid "Click to disable"
+msgstr ""
+
+msgid "Installation"
+msgstr ""
+
+msgid "Jappix installation"
+msgstr ""
+
+msgid "Welcome to the Jappix installation!"
+msgstr ""
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr ""
+
+msgid "Let's have a look at the installation steps:"
+msgstr ""
+
+msgid "Welcome"
+msgstr ""
+
+msgid "Storage configuration"
+msgstr ""
+
+msgid "Administrator account"
+msgstr ""
+
+msgid "Main configuration"
+msgstr ""
+
+msgid "Hosts configuration"
+msgstr ""
+
+msgid "Services installation"
+msgstr ""
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr ""
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr ""
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr ""
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr ""
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr ""
+
+msgid "The folder is writable, you can continue!"
+msgstr ""
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr ""
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr ""
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr ""
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr ""
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr ""
+
+msgid "User"
+msgstr "Utilizaire"
+
+msgid "Service"
+msgstr ""
+
+msgid "Service name"
+msgstr ""
+
+msgid "Service description"
+msgstr ""
+
+msgid "Connection"
+msgstr ""
+
+msgid "Lock the host"
+msgstr ""
+
+msgid "Anonymous mode"
+msgstr ""
+
+msgid "Registration allowed"
+msgstr ""
+
+msgid "Use a proxy"
+msgstr ""
+
+msgid "Encryption"
+msgstr ""
+
+msgid "HTTPS storage"
+msgstr ""
+
+msgid "Force HTTPS"
+msgstr ""
+
+msgid "Compression"
+msgstr ""
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr ""
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr ""
+
+msgid "Main host"
+msgstr ""
+
+msgid "Groupchat host"
+msgstr ""
+
+msgid "Anonymous host"
+msgstr ""
+
+msgid "Directory host"
+msgstr ""
+
+msgid "BOSH host"
+msgstr ""
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr ""
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr ""
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr ""
+
+msgid "Thanks for using Jappix!"
+msgstr ""
+
+msgid "Next"
+msgstr ""
+
+msgid "Finish"
+msgstr ""
+
+msgid "Check again"
+msgstr ""
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr ""
+
+msgid "%s is installed on your system."
+msgstr ""
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr ""
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr ""
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr ""
+
+msgid "Jappix manager"
+msgstr ""
+
+msgid "Manager access"
+msgstr ""
+
+msgid "Statistics"
+msgstr ""
+
+msgid "Hosts"
+msgstr ""
+
+msgid "Design"
+msgstr ""
+
+msgid "Repeat"
+msgstr ""
+
+msgid "All"
+msgstr ""
+
+msgid "Horizontal"
+msgstr ""
+
+msgid "Vertical"
+msgstr ""
+
+msgid "Center"
+msgstr ""
+
+msgid "Left"
+msgstr ""
+
+msgid "Right"
+msgstr ""
+
+msgid "Top"
+msgstr ""
+
+msgid "Bottom"
+msgstr ""
+
+msgid "Adapt"
+msgstr ""
+
+msgid "Color"
+msgstr ""
+
+msgid "Users"
+msgstr ""
+
+msgid "Updates"
+msgstr ""
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr ""
+
+msgid "Please use the form below to login to the administration panel."
+msgstr ""
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr ""
+
+msgid "Credentials"
+msgstr ""
+
+msgid "You have been logged out. Goodbye!"
+msgstr ""
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr ""
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr ""
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr ""
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr ""
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr ""
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr ""
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr ""
+
+msgid "The image could not be received, would you mind retry?"
+msgstr ""
+
+msgid "Your image was added to the list!"
+msgstr ""
+
+msgid "Changes saved!"
+msgstr ""
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr ""
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr ""
+
+msgid "Access statistics"
+msgstr ""
+
+msgid "Share statistics"
+msgstr ""
+
+msgid "Other statistics"
+msgstr ""
+
+msgid "January"
+msgstr "Genier"
+
+msgid "February"
+msgstr "Feurier"
+
+msgid "March"
+msgstr "MarƧ"
+
+msgid "April"
+msgstr "Abriu"
+
+msgid "May"
+msgstr "Mai"
+
+msgid "June"
+msgstr "Junh"
+
+msgid "July"
+msgstr "Julhet"
+
+msgid "August"
+msgstr "Aust"
+
+msgid "September"
+msgstr "Septembre"
+
+msgid "October"
+msgstr "OctĆ²bre"
+
+msgid "November"
+msgstr "Novembre"
+
+msgid "December"
+msgstr "Decembre"
+
+msgid "Monday"
+msgstr "Diluns"
+
+msgid "Tuesday"
+msgstr "Dimars"
+
+msgid "Wednesday"
+msgstr "Dimecres"
+
+msgid "Thursday"
+msgstr "DijĆ²us"
+
+msgid "Friday"
+msgstr "Divendres"
+
+msgid "Saturday"
+msgstr "Dissabde"
+
+msgid "Sunday"
+msgstr "Diumenc"
+
+msgid "Total"
+msgstr ""
+
+msgid "Cache"
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Music"
+msgstr "Musica"
+
+msgid "Backgrounds"
+msgstr ""
+
+msgid "Share"
+msgstr ""
+
+msgid "Background"
+msgstr ""
+
+msgid "Notice"
+msgstr ""
+
+msgid "Your design preferences have been saved!"
+msgstr ""
+
+msgid "Please check your inputs: something is missing!"
+msgstr ""
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr ""
+
+msgid "Use default background"
+msgstr ""
+
+msgid "Use your own image"
+msgstr ""
+
+msgid "Select a background to use and change the display options."
+msgstr ""
+
+msgid "Use your own color"
+msgstr ""
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr ""
+
+msgid "Manage backgrounds"
+msgstr ""
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr ""
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr ""
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr ""
+
+msgid "Simple notice"
+msgstr ""
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr ""
+
+msgid "Advanced notice"
+msgstr ""
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr ""
+
+msgid "Available updates"
+msgstr ""
+
+msgid "What's new?"
+msgstr ""
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr ""
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr ""
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr ""
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr ""
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr ""
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr ""
+
+msgid "Check for updates"
+msgstr ""
+
+msgid "Update in progress"
+msgstr ""
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr ""
+
+msgid "The update has failed! Please try again later."
+msgstr ""
+
+msgid "Downloading package..."
+msgstr ""
+
+msgid "Removing current Jappix system files..."
+msgstr ""
+
+msgid "Extracting package..."
+msgstr ""
+
+msgid "Regenerating storage folder tree..."
+msgstr ""
+
+msgid "Jappix is now up to date!"
+msgstr ""
+
+msgid "Aborted: socket error!"
+msgstr ""
+
+msgid "Aborted: buffer error!"
+msgstr ""
+
+msgid "Aborted: everything is not writable!"
+msgstr ""
+
+msgid "Aborted: could not extract the package!"
+msgstr ""
+
+msgid "Visits"
+msgstr ""
+
+msgid "Daily"
+msgstr ""
+
+msgid "Weekly"
+msgstr ""
+
+msgid "Monthly"
+msgstr ""
+
+msgid "Yearly"
+msgstr ""
+
+msgid "Size"
+msgstr ""
+
+msgid "Clean everything"
+msgstr ""
+
+msgid "Purge cache"
+msgstr ""
+
+msgid "Purge logs"
+msgstr ""
+
+msgid "Purge updates"
+msgstr ""
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr ""
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr ""
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr ""
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr ""
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr ""
+
+msgid "Title"
+msgstr ""
+
+msgid "Artist"
+msgstr ""
+
+msgid "Album"
+msgstr ""
+
+msgid "File"
+msgstr ""
+
+msgid "Upload"
+msgstr ""
+
+msgid "The folder is empty."
+msgstr ""
+
+msgid "The music could not be received, please retry!"
+msgstr ""
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr ""
+
+msgid "Your music has been added!"
+msgstr ""
+
+msgid "The selected elements have been removed."
+msgstr ""
+
+msgid "You must select elements to remove!"
+msgstr ""
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr ""
+
+msgid "Manage"
+msgstr ""
+
+msgid "List"
+msgstr ""
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr ""
+
+msgid "The user has been added!"
+msgstr ""
+
+msgid "The chosen users have been removed."
+msgstr ""
+
+msgid "You must select one or more users to be removed!"
+msgstr ""
+
+msgid "Yesterday"
+msgstr ""
+
+msgid "%s days ago"
+msgstr ""
+
+msgid "User currently active"
+msgstr ""
+
+msgid "Last seen: %s"
+msgstr ""
+
+msgid "Inactive since: %s"
+msgstr ""
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr ""
+
+msgid "Static content server"
+msgstr ""
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Suggested friends"
+msgstr ""
+
+msgid "Check all"
+msgstr ""
+
+msgid "Uncheck all"
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "List name"
+msgstr ""
+
+msgid "Allow"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
+msgid "Group"
+msgstr ""
+
+msgid "Subscription"
+msgstr ""
+
+msgid "Both"
+msgstr ""
+
+msgid "From"
+msgstr ""
+
+msgid "Everybody"
+msgstr ""
+
+msgid "Send messages"
+msgstr ""
+
+msgid "Send queries"
+msgstr ""
+
+msgid "See my status"
+msgstr ""
+
+msgid "Send his/her status"
+msgstr ""
+
+msgid "Everything"
+msgstr ""
+
+msgid "Item"
+msgstr ""
+
+msgid "Order"
+msgstr ""
+
+msgid "Active for this session"
+msgstr ""
+
+msgid "Always active"
+msgstr ""
+
+msgid "User directory"
+msgstr ""
+
+msgid "Search a friend"
+msgstr ""
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr ""
+
+msgid "This is a repeat from %s"
+msgstr ""
+
+msgid "Loading comments..."
+msgstr ""
+
+msgid "Type your comment here..."
+msgstr ""
+
+msgid "Could not get the comments!"
+msgstr ""
+
+msgid "Show comments"
+msgstr ""
+
+msgid "Send him/her a message"
+msgstr ""
+
+msgid "Start a chat with him/her"
+msgstr ""
+
+msgid "Media integration"
+msgstr ""
+
+msgid "Comments locked!"
+msgstr ""
+
+msgid "Type something you want to share with your friends..."
+msgstr ""
+
+msgid "changed his/her nickname to %s"
+msgstr ""
+
+msgid "commented an item you follow: ā%sā."
+msgstr ""
+
+msgid "Hide"
+msgstr ""
+
+msgid "liked your post: ā%sā."
+msgstr ""
+
+msgid "quoted you somewhere: ā%sā."
+msgstr ""
+
+msgid "published on your wall: ā%sā."
+msgstr ""
+
+msgid "tagged you in a photo (%s)."
+msgstr ""
+
+msgid "tagged you in a video (%s)."
+msgstr ""
+
+msgid "Show"
+msgstr ""
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr ""
+
+msgid "Pubsub host"
+msgstr ""
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr ""
+
+msgid "Manager link"
+msgstr ""
+
+msgid "User uploads server"
+msgstr ""
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Logo"
+msgstr ""
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr ""
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr ""
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr ""
+
+msgid "Your service logo has been successfully changed!"
+msgstr ""
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr ""
+
+msgid "Remove this logo"
+msgstr ""
+
+msgid "View this logo"
+msgstr ""
+
+msgid "Send a file"
+msgstr ""
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr ""
+
+msgid "Groupchats to join"
+msgstr ""
+
+msgid "Purge sent files"
+msgstr ""
+
+msgid "would like to send you a file: ā%sā."
+msgstr ""
+
+msgid "has accepted to received your file: ā%sā."
+msgstr ""
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr ""
+
+msgid "could not receive your file: ā%sā."
+msgstr ""
+
+msgid "has received a file exchange request: ā%sā."
+msgstr ""
+
+msgid "Available shortcuts:"
+msgstr ""
+
+msgid "%s removes the chat logs"
+msgstr ""
+
+msgid "%s joins a groupchat"
+msgstr ""
+
+msgid "%s closes the chat"
+msgstr ""
+
+msgid "%s shows the user profile"
+msgstr ""
+
+msgid "%s sends a message to the room"
+msgstr ""
+
+msgid "%s changes your nickname"
+msgstr ""
+
+msgid "%s sends a message to someone in the room"
+msgstr ""
+
+msgid "%s changes the room topic"
+msgstr ""
+
+msgid "%s kicks an user of the room"
+msgstr ""
+
+msgid "%s bans an user of the room"
+msgstr ""
+
+msgid "%s invites someone to join the room"
+msgstr ""
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr ""
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# Polish translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:26+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "ObsÅuga JavaScript jest wyÅÄ
czona przez co uruchomienie Jappix-a jest niemożliwe! Prosimy o aktywowanie obsÅugi JavaScript i sprĆ³bowanie ponownie."
+
+msgid "An open social network"
+msgstr "Otwarta sieÄ spoÅecznoÅciowa"
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "DziaÅanie Jappix zostaÅo przerwane przez problem sieciowy, bÅÄ
d programu bÄ
dÅŗ zÅe dane logowania (sprawdÅŗ, czy podaÅeÅ prawidÅowe dane dostÄpowe). Za usterkÄ przepraszamy."
+
+msgid "The element list on this server could not be obtained!"
+msgstr ""
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "HasÅo zostaÅo zmienione. Możesz poÅÄ
czyÄ siÄ do swojego konta używajÄ
c nowego hasÅa."
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "Twoje konto XMPP zostaÅo usuniÄte, żegnaj!"
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "Wylogowywanie zakoÅczone pomyÅlnie, życzymy miÅego dnia!"
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "PokĆ³j do ktĆ³rego doÅÄ
czyÅeÅ nie istnieje. PowinieneÅ go stworzyÄ!"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "PokĆ³j rozmĆ³w zostaÅ usuniÄty, teraz ktoÅ inny bÄdzie mĆ³gÅ go stworzyÄ."
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "Użytkownik z ktĆ³rym chciaÅeÅ siÄ skontaktowaÄ nie jest obecny w pokoju."
+
+msgid "Please enter the group chat address to join."
+msgstr "WprowadÅŗ adres pokoju czatowego aby do niego doÅÄ
czyÄ."
+
+msgid "Please enter your nickname to join %s."
+msgstr "WprowadÅŗ swĆ³j nick aby doÅÄ
czyÄ do %s."
+
+msgid "This room (%s) is protected with a password."
+msgstr "Ten pokĆ³j (%s) jest chroniony hasÅem."
+
+msgid "Your browser is out of date!"
+msgstr "Twoja przeglÄ
darka jest nieaktualna!"
+
+msgid "Last %s version is better!"
+msgstr "Ostatnia wersja %s jest lepsza!"
+
+msgid "Login"
+msgstr "Login"
+
+msgid "Register"
+msgstr "Rejestracja"
+
+msgid "Here we go!"
+msgstr "Do dzieÅa!"
+
+msgid "Server"
+msgstr "Serwer"
+
+msgid "Password"
+msgstr "HasÅo"
+
+msgid "Remember me"
+msgstr "ZapamiÄtaj mnie"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "To narzÄdzie zostaÅo wyÅÄ
czone, nie możesz z niego skorzystaÄ!"
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "Z powodu bÅÄdu sieci poÅÄ
czenie zostaÅo zerwane. Co chcesz teraz zrobiÄ?"
+
+msgid "Reconnect"
+msgstr "PoÅÄ
cz ponownie"
+
+msgid "Messages"
+msgstr "WiadomoÅci"
+
+msgid "Profile"
+msgstr "Profil"
+
+msgid "Options"
+msgstr "Opcje"
+
+msgid "Disconnect"
+msgstr "Wyloguj"
+
+msgid "Filter"
+msgstr "Filtr"
+
+msgid "Add a friend"
+msgstr "Dodaj znajomego"
+
+msgid "Your groupchats"
+msgstr "Twoje rozmowy grupowe"
+
+msgid "Manage your favorite groupchats"
+msgstr "ZarzÄ
dzaj ulubionymi pokojami rozmĆ³w"
+
+msgid "More stuff"
+msgstr "WiÄcej"
+
+msgid "Show all friends"
+msgstr "Pokaż wszystkich znajomych"
+
+msgid "Only show connected friends"
+msgstr "Pokazuj tylko poÅÄ
czonych znajomych"
+
+msgid "Message archives"
+msgstr "Archiwum wiadomoÅci"
+
+msgid "Date"
+msgstr "Data"
+
+msgid "Please select a friend to view the chat history."
+msgstr "Wybierz znajomego aby zobaczyÄ archiwum."
+
+msgid "Nothing found for: %s"
+msgstr "Nic nieznaleziono dla: %s"
+
+msgid "A short message?"
+msgstr "KrĆ³tka wiadomoÅÄ?"
+
+msgid "How are you?"
+msgstr "Jak siÄ masz?"
+
+msgid "What are you doing?"
+msgstr "Co robisz?"
+
+msgid "Join a chat"
+msgstr "DoÅÄ
cz do rozmowy"
+
+msgid "Status"
+msgstr "Status"
+
+msgid "Available"
+msgstr "DostÄpny"
+
+msgid "Talkative"
+msgstr "ChÄtny do rozmowy"
+
+msgid "Away"
+msgstr "Nieobecny"
+
+msgid "Not available"
+msgstr "NiedostÄpny"
+
+msgid "Busy"
+msgstr "ZajÄty"
+
+msgid "Mood"
+msgstr "NastrĆ³j"
+
+msgid "None"
+msgstr "Żaden"
+
+msgid "Crazy"
+msgstr "Zwariowany"
+
+msgid "Excited"
+msgstr "Podekscytowany"
+
+msgid "Playful"
+msgstr "Rozbawiony"
+
+msgid "Happy"
+msgstr "WesoÅy"
+
+msgid "Shocked"
+msgstr "Zszokowany"
+
+msgid "Hot"
+msgstr "GorÄ
cy"
+
+msgid "Sad"
+msgstr "Smutny"
+
+msgid "Amorous"
+msgstr "Rozkochany"
+
+msgid "Confident"
+msgstr "Pewny siebie"
+
+msgid "Activity"
+msgstr "AktywnoÅÄ"
+
+msgid "Chores"
+msgstr "Prace domowe"
+
+msgid "Drinking"
+msgstr "Picie"
+
+msgid "Eating"
+msgstr "Jedzenie"
+
+msgid "Exercising"
+msgstr "Äwiczenia"
+
+msgid "Grooming"
+msgstr "Higiena"
+
+msgid "Appointment"
+msgstr "Spotkanie"
+
+msgid "Inactive"
+msgstr "Nieaktywne"
+
+msgid "Relaxing"
+msgstr "Relaksowanie"
+
+msgid "Talking"
+msgstr "Rozmowa"
+
+msgid "Traveling"
+msgstr "PodrĆ³Å¼owanie"
+
+msgid "Working"
+msgstr "Praca"
+
+msgid "View profile"
+msgstr "Zobacz profil"
+
+msgid "Repeat this notice"
+msgstr "PowtĆ³rz tÄ
informacjÄ"
+
+msgid "Remove this notice"
+msgstr "UsuÅ tÄ
informacjÄ"
+
+msgid "Your profile"
+msgstr "TwĆ³j profil"
+
+msgid "Identity"
+msgstr "TożsamoÅÄ"
+
+msgid "Profile image"
+msgstr "Awatar"
+
+msgid "Others"
+msgstr "Inne"
+
+msgid "Personal"
+msgstr "Personalne"
+
+msgid "Complete name"
+msgstr "ImiÄ i nazwisko"
+
+msgid "Nickname"
+msgstr "Pseudonim"
+
+msgid "First name"
+msgstr "ImiÄ"
+
+msgid "Last name"
+msgstr "Nazwisko"
+
+msgid "Date of birth"
+msgstr "Data urodzenia"
+
+msgid "Contact"
+msgstr "Kontakt"
+
+msgid "E-mail"
+msgstr "E-mail"
+
+msgid "Phone"
+msgstr "Telefon"
+
+msgid "Website"
+msgstr "Strona internetowa"
+
+msgid "Current"
+msgstr "Aktualny"
+
+msgid "Delete"
+msgstr "UsuÅ"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "Jaka szkoda! Nie masz ustawionego awatara!"
+
+msgid "Address"
+msgstr "Adres"
+
+msgid "Street"
+msgstr "Ulica"
+
+msgid "City"
+msgstr "MiejscowoÅÄ"
+
+msgid "Postal code"
+msgstr "Kod pocztowy"
+
+msgid "Country"
+msgstr "Kraj"
+
+msgid "Biography"
+msgstr "Biografia"
+
+msgid "Important notice"
+msgstr "Ważna uwaga"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr "Uważaj jakie informacjÄ wpisujesz w swoim profilu ponieważ każdy może je zobaczyÄ (nawet ktoÅ niepożÄ
dany)"
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr "W XMPP nie wszystko jest prywatne; to jedna z takich rzeczy, TwĆ³j publiczny profil (vCard)."
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr "Zaleca siÄ, aby przesÅaÄ obrazek profilowy (maksymalnie %s), w formie zdjÄcia siebie samego, bo sprawi, że bÄdziesz Åatwo rozpoznawalny przez znajomych."
+
+msgid "Save"
+msgstr "Zapisz"
+
+msgid "Cancel"
+msgstr "Anuluj"
+
+msgid "Edit options"
+msgstr "Edytuj opcje"
+
+msgid "Channel"
+msgstr "KanaÅ"
+
+msgid "Commands"
+msgstr "Komendy"
+
+msgid "Sounds"
+msgstr "DÅŗwiÄki"
+
+msgid "Privacy"
+msgstr "PrywatnoÅÄ"
+
+msgid "Message archiving"
+msgstr "Archiwizacja wiadomoÅci"
+
+msgid "Store a history of your chats"
+msgstr "Przechowuj historiÄ rozmĆ³w"
+
+msgid "Geolocation"
+msgstr "Geolokalizacja"
+
+msgid "Empty"
+msgstr "Pusty"
+
+msgid "Empty channel"
+msgstr "Pusty kanaÅ"
+
+msgid "Persistent"
+msgstr "TrwaÅe"
+
+msgid "Maximum notices"
+msgstr "Maksymalnie powiadomieÅ"
+
+msgid "Account"
+msgstr "Konto"
+
+msgid "Change password"
+msgstr "ZmieÅ hasÅo"
+
+msgid "Delete account"
+msgstr "UsuÅ konto"
+
+msgid "Old"
+msgstr "Stary"
+
+msgid "New (2 times)"
+msgstr "Nowe (dwa razy)"
+
+msgid "Continue"
+msgstr "Kontynuuj"
+
+msgid "To"
+msgstr "Do"
+
+msgid "Close"
+msgstr "Zamknij"
+
+msgid "unknown"
+msgstr "nieznany"
+
+msgid "Unavailable"
+msgstr "NiedostÄpny"
+
+msgid "is now"
+msgstr "jest teraz"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr "ProszÄ czekaÄ, TwĆ³j awatar jest Åadowany..."
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "Oto i on! PiÄkny awatar!"
+
+msgid "The image file is not supported or has a bad size."
+msgstr "Format obrazka jest niepoprawny lub obrazek ma zÅy rozmiar."
+
+msgid "Reply"
+msgstr "Odpowiedz"
+
+msgid "Error"
+msgstr "BÅÄ
d"
+
+msgid "Click here to solve the error"
+msgstr "Kliknij tutaj aby rozwiÄ
zaÄ problem"
+
+msgid "You"
+msgstr "Ty"
+
+msgid "Remove"
+msgstr "UsuÅ"
+
+msgid "Rename"
+msgstr "ZmieÅ nazwÄ"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "CzeÅÄ, jestem %s, chciaÅbym abyÅ dodaÅ mnie do swoich znajomych."
+
+msgid "Smiley insertion"
+msgstr "Wstaw emotikonÄ"
+
+msgid "Change style"
+msgstr "ZmieÅ styl"
+
+msgid "Text in bold"
+msgstr "Pogrubiony tekst"
+
+msgid "Text in italic"
+msgstr "PochyÅy tekst"
+
+msgid "Underlined text"
+msgstr "PodkreÅlony tekst"
+
+msgid "Save chat"
+msgstr "Zapisz rozmowÄ"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr "Kliknij poniższy link aby utworzyÄ zapis rozmowy i poczekaj. PĆ³Åŗniej kliknij ponownie aby pobraÄ plik."
+
+msgid "This chat is empty!"
+msgstr "Ten czat jest pusty!"
+
+msgid "Generate file!"
+msgstr "Wygeneruj plik!"
+
+msgid "Download file!"
+msgstr "Pobierz plik!"
+
+msgid "Clean current chat"
+msgstr "WyczyÅÄ okno rozmowy"
+
+msgid "View chat history"
+msgstr "Zobacz historiÄ rozmĆ³w"
+
+msgid "Show user profile"
+msgstr "Pokaż profil użytkownika"
+
+msgid "Add this contact to your friends"
+msgstr "Dodaj kontakt do znajomych"
+
+msgid "Add this groupchat to your favorites"
+msgstr "Dodaj ten pokĆ³j do ulubionych"
+
+msgid "All tabs"
+msgstr "Wszystkie zakÅadki"
+
+msgid "Close this tab"
+msgstr "Zamknij tÄ
zakÅadkÄ"
+
+msgid "no subject defined for this room."
+msgstr "nie okreÅlono tematu dla tego pokoju."
+
+msgid "Administration panel for this room"
+msgstr "Panel administratora tego pokoju"
+
+msgid "Moderators"
+msgstr "Moderatorzy"
+
+msgid "Participants"
+msgstr "Uczestnicy"
+
+msgid "Visitors"
+msgstr "OdwiedzajÄ
cy"
+
+msgid "Manage favorite rooms"
+msgstr "ZarzÄ
dzaj ulubionymi pokojami"
+
+msgid "Change favorites"
+msgstr "ZmieÅ ulubione"
+
+msgid "Search a room"
+msgstr "Wyszukaj pokĆ³j"
+
+msgid "Select a favorite"
+msgstr "Wybierz ulubiony"
+
+msgid "Getting the name..."
+msgstr "Pobieranie nazwy..."
+
+msgid "Gateway"
+msgstr "Brama"
+
+msgid "Name"
+msgstr "Nazwa"
+
+msgid "Room"
+msgstr "PokĆ³j"
+
+msgid "Add"
+msgstr "Dodaj"
+
+msgid "Edit"
+msgstr "Edytuj"
+
+msgid "Search a room on"
+msgstr "Szukaj pokoju na"
+
+msgid "No room found on this server."
+msgstr "Nie znaleziono pokoju na tym serwerze."
+
+msgid "Service discovery"
+msgstr "PrzeglÄ
darka usÅug"
+
+msgid "Server to query"
+msgstr "Serwer do odpytania"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr ""
+
+msgid "Accounts"
+msgstr "Konta"
+
+msgid "Authentications"
+msgstr "Autentykacja"
+
+msgid "Automation"
+msgstr "Automatyzacja"
+
+msgid "Clients"
+msgstr "Klienci"
+
+msgid "Collaboration"
+msgstr "WspĆ³Åpraca"
+
+msgid "Components"
+msgstr "Komponenty"
+
+msgid "Rooms"
+msgstr "Pokoje"
+
+msgid "Directories"
+msgstr "Katalogi"
+
+msgid "Gateways"
+msgstr "Bramki"
+
+msgid "News"
+msgstr "WiadomoÅci"
+
+msgid "Hierarchy"
+msgstr "Hierarchia"
+
+msgid "Proxies"
+msgstr "PoÅrednicy"
+
+msgid "Publication/Subscription"
+msgstr "Publikacje/subskrypcje"
+
+msgid "Storage"
+msgstr "Magazynowanie"
+
+msgid "Service offline or broken"
+msgstr "UsÅuga niedostÄpna bÄ
dÅŗ uszkodzona"
+
+msgid "Your inbox"
+msgstr "Twoja skrzynka odbiorcza"
+
+msgid "Available actions"
+msgstr "DostÄpne dziaÅania"
+
+msgid "Clean"
+msgstr "WyczyÅÄ"
+
+msgid "New"
+msgstr "Nowy"
+
+msgid "Received"
+msgstr "Odebrane"
+
+msgid "Subject"
+msgstr "Temat"
+
+msgid "Content"
+msgstr "TreÅÄ"
+
+msgid "Send message"
+msgstr "WyÅlij wiadomoÅÄ"
+
+msgid "Your inbox is empty."
+msgstr "Twoja skrzynka odbiorcza jest pusta."
+
+msgid "MUC administration"
+msgstr "Administracja MUC"
+
+msgid "You administrate this room"
+msgstr "Administrujesz tym pokojem"
+
+msgid "Enter new subject"
+msgstr "Podaj nowy temat"
+
+msgid "Configuration"
+msgstr "Konfiguracja"
+
+msgid "Authorizations"
+msgstr "Autoryzacja"
+
+msgid "Member list"
+msgstr "Lista czÅonkĆ³w"
+
+msgid "Owner list"
+msgstr "Lista wÅaÅcicieli"
+
+msgid "Administrator list"
+msgstr "Lista administratorĆ³w"
+
+msgid "Outcast list"
+msgstr "Lista wykluczonych"
+
+msgid "Add an input"
+msgstr "Dodaj wpis"
+
+msgid "Destroy this MUC"
+msgstr "UsuÅ ten MUC"
+
+msgid "Yes, let's do it!"
+msgstr "Tak, zrĆ³bmy to!"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr "TwĆ³j znajomy przyglÄ
da siÄ rozmowie."
+
+msgid "Your friend is writing a message..."
+msgstr "TwĆ³j znajomy pisze wiadomoÅÄ..."
+
+msgid "Your friend stopped writing a message."
+msgstr "TwĆ³j znajomy przestaÅ pisaÄ."
+
+msgid "Your friend is doing something else."
+msgstr "TwĆ³j znajomy robi coÅ innego."
+
+msgid "Your friend closed the chat."
+msgstr "TwĆ³j znajomy zamknÄ
Å rozmowÄ."
+
+msgid "Requesting this service..."
+msgstr "Å»Ä
danie usÅugi..."
+
+msgid "Loading"
+msgstr "Åadowanie"
+
+msgid "joined the chat room"
+msgstr "doÅÄ
czyÅ(a) do czatu"
+
+msgid "left the chat room"
+msgstr "opuÅciÅ(a) czat"
+
+msgid "no status"
+msgstr "brak statusu"
+
+msgid "has been kicked"
+msgstr "zostaÅ(a) wyrzucony"
+
+msgid "has been banned"
+msgstr "zostaÅ(a) zbanowany"
+
+msgid "no reason"
+msgstr "brak powodu"
+
+msgid "Communicate with the entire world!"
+msgstr "Rozmawiaj z caÅym Åwiatem!"
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr "Pozwala Ci byÄ w kontakcie z milionami użytkownikĆ³w, ktĆ³rzy używajÄ
obecnie sieci XMPP, tak jak Ty obecnie ÅÄ
czysz siÄ doÅ przez Jappixa. DoÅÄ
cz do spoÅecznoÅci i staÅ siÄ wolny!"
+
+msgid "Hi there!"
+msgstr "CzeÅÄ wam!"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr "Witamy na %1s, ā%2sā."
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr "Zaloguj siÄ do swojego konta XMPP lub stwĆ³rz nowe - za darmo!"
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr "Jappix to projekt open-source od PostPro - organizacja non-profit ktĆ³ra sÅuży wspaniaÅÄ
pomocÄ
."
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr "Zaloguj siÄ do twojego istniejÄ
cego konta XMPP. Możesz rĆ³wnież użyÄ %s aby doÅÄ
czyÄ do pokojĆ³w czatowych."
+
+msgid "Previous"
+msgstr "Poprzedni"
+
+msgid "General"
+msgstr "OgĆ³lny"
+
+msgid "Advanced"
+msgstr "Zaawansowane"
+
+msgid "Resource"
+msgstr "ZasĆ³b"
+
+msgid "Priority"
+msgstr "Priorytet"
+
+msgid "Low"
+msgstr "Niski"
+
+msgid "Medium"
+msgstr "Åredni"
+
+msgid "High"
+msgstr "Wysoki"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr "DoÅÄ
cz do dowolnego czatu z nickiem, ktĆ³ry chcesz mieÄ. Możesz też wrĆ³ciÄ do %s."
+
+msgid "login page"
+msgstr "strona logowania"
+
+msgid "Share this link with your friends:"
+msgstr "Podziel siÄ linkiem z przyjaciĆ³Åmi:"
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr "ZaÅĆ³Å¼ nowe konto XMPP by doÅÄ
czyÄ do twoich przyjaciĆ³Å w twojej wÅasnej spoÅecznoÅci. To proste!"
+
+msgid "Required"
+msgstr "Wymagane"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr "Rejestracja przebiegÅa pomyÅlnie! Oto TwĆ³j adres XMPP:"
+
+msgid "Manager"
+msgstr "Menedżer"
+
+msgid "Project"
+msgstr "Projekt"
+
+msgid "Encrypted"
+msgstr "Szyfrowane"
+
+msgid "Unencrypted"
+msgstr "Nieszyfrowane"
+
+msgid "Where are you?"
+msgstr "Gdzie jesteÅ?"
+
+msgid "What's up with you?"
+msgstr "Co u Ciebie sÅychaÄ?"
+
+msgid "Fetching the social channel..."
+msgstr "Pobieranie kanaÅu publicznego..."
+
+msgid "You are synchronized with your network."
+msgstr "JesteÅ poÅÄ
czony ze swojÄ
sieciÄ
."
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr "Nie można nic wysÅaÄ: możesz jedynie otrzymywaÄ powiadomienia!"
+
+msgid "Media viewer"
+msgstr "Odtwarzacz multimediĆ³w"
+
+msgid "Browse"
+msgstr "PrzeglÄ
daj"
+
+msgid "Command"
+msgstr "Komenda"
+
+msgid "Subscribe"
+msgstr "Subskrybuj"
+
+msgid "Join"
+msgstr "DoÅÄ
cz"
+
+msgid "Automatic"
+msgstr "Automatycznie"
+
+msgid "Search"
+msgstr "Szukaj"
+
+msgid "No result!"
+msgstr "Brak wynikĆ³w!"
+
+msgid "No notifications."
+msgstr "Brak powiadomieÅ."
+
+msgid "would like to add you as a friend."
+msgstr "chciaÅby dodaÄ CiÄ jako znajomego."
+
+msgid "would like you to join this chatroom:"
+msgstr "chciaÅby prosiÄ CiÄ o doÅÄ
czenie do tego pokoju: "
+
+msgid "Do you accept?"
+msgstr "Czy siÄ zgadzasz?"
+
+msgid "Yes"
+msgstr "Tak"
+
+msgid "No"
+msgstr "Nie"
+
+msgid "would like to get authorization."
+msgstr "prosi o autoryzacjÄ."
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr ""
+
+msgid "Submit"
+msgstr "WyÅlij"
+
+msgid "Client"
+msgstr "Klient"
+
+msgid "System"
+msgstr "System"
+
+msgid "Local time"
+msgstr "Czas lokalny"
+
+msgid "Comments"
+msgstr "Komentarze"
+
+msgid "User profile"
+msgstr "Profil użytkownika"
+
+msgid "See his/her position on the globe"
+msgstr "Zobacz jej/jego poÅożenie geograficzne"
+
+msgid "Confirm"
+msgstr "PotwierdÅŗ"
+
+msgid "anonymous mode"
+msgstr "tryb anonimowy"
+
+msgid "Groups"
+msgstr "Grupy"
+
+msgid "Unclassified"
+msgstr "Nieklasyfikowane"
+
+msgid "Authorize"
+msgstr "Autoryzuj"
+
+msgid "Ask for authorization"
+msgstr "Zapytaj o autoryzacjÄ"
+
+msgid "Unblock"
+msgstr "Odblokuj"
+
+msgid "Prohibit"
+msgstr "ZabroÅ"
+
+msgid "Block"
+msgstr "Blokuj"
+
+msgid "Chat"
+msgstr "Rozmowa"
+
+msgid "Groupchat"
+msgstr "Rozmowa grupowa"
+
+msgid "Jappix Mobile"
+msgstr "Jappix Mobile"
+
+msgid "Desktop"
+msgstr "Desktop"
+
+msgid "Mobile"
+msgstr "Mobilny"
+
+msgid "Please wait..."
+msgstr "ProszÄ czekaÄ..."
+
+msgid "Please enable JavaScript"
+msgstr "ProszÄ wÅÄ
czyÄ JavaScript"
+
+msgid "Your channel"
+msgstr "TwĆ³j kanaÅ"
+
+msgid "Channel of"
+msgstr "KanaÅ"
+
+msgid "More notices..."
+msgstr "WiÄcej powiadomieÅ..."
+
+msgid "Attach a file"
+msgstr "ZaÅÄ
cz plik"
+
+msgid "Send"
+msgstr "WyÅlij"
+
+msgid "Unattach the file"
+msgstr "OdÅÄ
cz plik"
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr "WystÄ
piÅ bÅÄ
d podczas wysyÅania pliku: możliwe że jest zbyt duży (maksymalnie %s) bÄ
dÅŗ zablokowany!"
+
+msgid "Authorization failed"
+msgstr "Autoryzacja nie powiodÅa siÄ"
+
+msgid "Registration failed, please choose a different username"
+msgstr "Rejestracja nie powiodÅa siÄ, proszÄ wybraÄ innÄ
nazwÄ użytkownika"
+
+msgid "Service unavailable"
+msgstr "UsÅuga niedostÄpna"
+
+msgid "Internal server error, try later"
+msgstr "WewnÄtrzny bÅÄ
d serwera, proszÄ sprĆ³bowaÄ pĆ³Åŗniej."
+
+msgid "Your form has been sent."
+msgstr "TwĆ³j formularz zostaÅ wysÅany."
+
+msgid "Application"
+msgstr "Aplikacja"
+
+msgid "XMPP links"
+msgstr "linki XMPP"
+
+msgid "Open XMPP links with Jappix"
+msgstr "Otwieraj linki XMPP w Jappix"
+
+msgid "changed the subject to:"
+msgstr "zmieÅ temat na:"
+
+msgid "Welcome!"
+msgstr "Witamy!"
+
+msgid "Friends"
+msgstr "Znajomi"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr "Witaj w Jappix-ie, Twojej wÅasnej socjalnej chmurze!"
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr "Zanim zaczniesz tego używaÄ, musisz zmieniÄ niektĆ³re ustawienia, znaleÅŗÄ znajomych i uzupeÅniÄ swĆ³j profil."
+
+msgid "Enable notification sounds"
+msgstr "WÅÄ
cz powiadomienia dÅŗwiÄkowe"
+
+msgid "Share your position on the globe"
+msgstr "Dziel siÄ swojÄ
aktualnÄ
pozycjÄ
"
+
+msgid "Offline friends"
+msgstr "RozÅÄ
czeni znajomi"
+
+msgid "Don't hide offline friends"
+msgstr "Nie ukrywaj rozÅÄ
czonych znajomych"
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr "Użyj tego narzÄdzia do znalezienia Twoich znajomych na serwerze, ktĆ³rego używasz, lub dodaj ich pĆ³Åŗniej."
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr ""
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr ""
+
+msgid "Share Jappix on %s"
+msgstr ""
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr ""
+
+msgid "Unknown name"
+msgstr "Nazwa nieznana"
+
+msgid "Unknown country"
+msgstr "Kraj nieznany"
+
+msgid "Click to enable"
+msgstr "Kliknij by wÅÄ
czyÄ"
+
+msgid "Click to disable"
+msgstr "Kliknij by wyÅÄ
czyÄ"
+
+msgid "Installation"
+msgstr "Instalacja"
+
+msgid "Jappix installation"
+msgstr "Instalacja Jappixa"
+
+msgid "Welcome to the Jappix installation!"
+msgstr "Witaj w instalacji Jappix!"
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr "To narzÄdzie pomoże Ci szybko zainstalowaÄ Jappix-a, pierwszÄ
platformÄ spoÅecznoÅciowÄ
opartÄ
o protokĆ³Å XMPP."
+
+msgid "Let's have a look at the installation steps:"
+msgstr "Zobaczmy kroki instalacji:"
+
+msgid "Welcome"
+msgstr "Witamy"
+
+msgid "Storage configuration"
+msgstr "Konfiguracja folderĆ³w"
+
+msgid "Administrator account"
+msgstr "Konto administratora"
+
+msgid "Main configuration"
+msgstr "Konfiguracja gÅĆ³wna"
+
+msgid "Hosts configuration"
+msgstr "Konfiguracja hostĆ³w"
+
+msgid "Services installation"
+msgstr "Instalacja usÅug"
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr "JeÅli aktualny jÄzyk Ci nie pasujÄ (%1s), możesz zmieniÄ go na %2s."
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr "JeÅli potrzebujesz wiÄcej informacji dotyczÄ
cych instalacji i konfiguracji Jappixa, możesz użyÄ dokumentacji dostÄpnej pod adresem:"
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr "Już pora zbudowaÄ twojÄ
wÅasnÄ
socjalnÄ
chmĆ³rÄ: przejdÅŗ do nastÄpnego kroku!"
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr "Jappix przechowuje staÅe dane (takie jak publikowane pliki, archiwa rozmĆ³w, pliki dÅŗwiÄkowe wraz z konfiguracjÄ
) w jednym zabezpieczonym folderze."
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr "Jappix musi mieÄ możliwoÅÄ zapisu w tym folderze aby mĆ³c stworzyÄ w nim pod-foldery. JeÅli nie, musisz ustawiÄ prawa na %1s lub zmieniÄ wÅaÅciciela folderu na %2s (w zależnoÅci od konfiguracji)"
+
+msgid "The folder is writable, you can continue!"
+msgstr "Można zapisywaÄ w folderze, możesz kontynuowaÄ!"
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix oferuje Ci możliwoÅÄ zarzÄ
dzania konfiguracjÄ
, instalacji nowych pluginĆ³w lub sprawdzania aktualizacji. To wÅaÅnie dlatego musisz stworzyÄ konto administratora."
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr "Kiedy Jappix bÄdzie już zainstalowany, kliknij w link Menedżer na stronie gÅĆ³wnej."
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr "Ups! coÅ pominiÄto lub hasÅa nie pasujÄ
do siebie!"
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr "Jappix wymaga wprowadzenia niektĆ³rych danych. ProszÄ poprawiÄ nastÄpujÄ
ce dane (lub pozostaw domyÅlne wartoÅci, ktĆ³re sÄ
wystarczajÄ
ce dla wiÄkszoÅci ludzi)."
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr "JeÅli nie wypeÅnisz wymaganego pola, zostanie ono automatycznie wypeÅnione domyÅlnÄ
wartoÅciÄ
."
+
+msgid "User"
+msgstr "Użytkownik"
+
+msgid "Service"
+msgstr "UsÅuga"
+
+msgid "Service name"
+msgstr "Nazwa usÅugi"
+
+msgid "Service description"
+msgstr "Opis usÅugi"
+
+msgid "Connection"
+msgstr "PoÅÄ
czenie"
+
+msgid "Lock the host"
+msgstr "Zablokuj hosta"
+
+msgid "Anonymous mode"
+msgstr "Tryb anonimowy"
+
+msgid "Registration allowed"
+msgstr "Rejestracja wÅÄ
czona"
+
+msgid "Use a proxy"
+msgstr "Użyj serwera proxy"
+
+msgid "Encryption"
+msgstr "Szyfrowanie"
+
+msgid "HTTPS storage"
+msgstr "Magazyn HTTPS"
+
+msgid "Force HTTPS"
+msgstr "WymuÅ HTTPS"
+
+msgid "Compression"
+msgstr "Kompresja"
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr "Ta strona pomoże Ci ustawiÄ domyÅlne hosty, do ktĆ³rych Jappix bÄdzie siÄ ÅÄ
czyÄ. Możesz zostawiÄ to tak jak jest i kontynuowaÄ jeÅli chcesz korzystaÄ z oficjalnych hostĆ³w."
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr "ByÄ może nie wiesz czym jest serwer BOSH? Jest to swoisty most ÅÄ
czÄ
cy klienta Jappix-a i serwer XMPP. Jest on niezbÄdny ze wzglÄdĆ³w technicznych."
+
+msgid "Main host"
+msgstr "Host gÅĆ³wny"
+
+msgid "Groupchat host"
+msgstr "Host rozmĆ³w grupowych"
+
+msgid "Anonymous host"
+msgstr "Host anonimowy"
+
+msgid "Directory host"
+msgstr ""
+
+msgid "BOSH host"
+msgstr "host BOSH"
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr "Możesz zainstalowaÄ dodatkowe oprogramowanie na serwerze, ktĆ³re wzbogaci możliwoÅci Jappix-a. Inne może byÄ zmodyfikowane ze wzglÄdu na domyÅlne ustawienia prywatnoÅci."
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr "Aby to wykonaÄ, musisz mieÄ dostÄp do shella na swoim serwerze i byÄ zalogowanym jako root. PamiÄtaj, że jest to opcjonalne, Jappix bÄdzie dziaÅaÄ bez tych moduÅĆ³w ale niektĆ³re z jego możliwoÅci bÄdÄ
niedostÄpne."
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr "Po skonfigurowaniu, Jappix wygeneruje pliki cache. Może to dÅugo potrwaÄ, poczekaj aż aplikacja bÄdzie pokazana i nie wciskaj żadnego klawisza."
+
+msgid "Thanks for using Jappix!"
+msgstr "DziÄkujemy za używanie Jappix!"
+
+msgid "Next"
+msgstr "Dalej"
+
+msgid "Finish"
+msgstr "Koniec"
+
+msgid "Check again"
+msgstr "SprawdÅŗ ponownie"
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr "Folder nie jest zapisywalny, ustaw odpowiednie uprawienia dla folderu %s."
+
+msgid "%s is installed on your system."
+msgstr "%s jest zainstalowane w Twoim systemie."
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr "%1s nie jest zainstalowane w Twoim systemie."
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr "Maksymalny rozmiar wysyÅanego pliku ustawiony dla PHP jest wystarczajÄ
cy (%s)"
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr "Maksymalny rozmiar wysyÅanego pliku ustawiony dla PHP jest niewystarczajÄ
cy (%1s), powinieneÅ ustawiÄ go na %2s w %3s."
+
+msgid "Jappix manager"
+msgstr "Menedżer Jappix"
+
+msgid "Manager access"
+msgstr "DostÄp menadżera"
+
+msgid "Statistics"
+msgstr "Statystyki"
+
+msgid "Hosts"
+msgstr "Hosty"
+
+msgid "Design"
+msgstr "WyglÄ
d"
+
+msgid "Repeat"
+msgstr "Powtarzanie"
+
+msgid "All"
+msgstr "Wszystko"
+
+msgid "Horizontal"
+msgstr "Poziomo"
+
+msgid "Vertical"
+msgstr "Pionowo"
+
+msgid "Center"
+msgstr "Årodek"
+
+msgid "Left"
+msgstr "Lewa"
+
+msgid "Right"
+msgstr "Prawa"
+
+msgid "Top"
+msgstr "GĆ³ra"
+
+msgid "Bottom"
+msgstr "DĆ³Å"
+
+msgid "Adapt"
+msgstr "Przystosuj"
+
+msgid "Color"
+msgstr "Kolor"
+
+msgid "Users"
+msgstr "Użytkownicy"
+
+msgid "Updates"
+msgstr "Akrualizacje"
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr "Strefa zamkniÄta: tylko autoryzowani użytkownicy mogÄ
zarzÄ
dzaÄ ustawieniami instalacji Jappix-a."
+
+msgid "Please use the form below to login to the administration panel."
+msgstr "Użyj poniższego formularza aby zalogowaÄ siÄ do panelu administracyjnego."
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr "W celu zwiÄkszenia bezpieczeÅstwa, sesje sÄ
ograniczone czasowo - kiedy wyÅÄ
czysz przeglÄ
darke, zostaniesz wylogowany."
+
+msgid "Credentials"
+msgstr "Uprawnienia"
+
+msgid "You have been logged out. Goodbye!"
+msgstr "ZostaÅeÅ wylogowany. Å»egnaj!"
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr "Ups. Nie zostaÅeÅ rozpoznany jako administrator, SprawdÅŗ swoje uprawnienia!"
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr "Poniżej znajdziesz podstawowe statystyki instalacji Jappix-a."
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr "Za pomocÄ
tego narzÄdzia możesz zmieniÄ ustawienia instalacji Jappix-a."
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr "ZmieÅ hosty XMPP, z ktĆ³rymi ma wspĆ³ÅpracowaÄ ta instalacja Jappix-a."
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr "Za pomocÄ
tego narzÄdzia możesz zarzÄ
dzaÄ wszystkimi zgromadzonymi przez Jappix-a plikami: proszÄ wybraÄ pod-folder i rozpoczÄ
Ä edycjÄ zawartoÅci!"
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr "Jappix jest w peÅni dostosowywalny: tu możesz zmieniÄ jego wyglÄ
d."
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr "To nie jest poprawny obrazek, proszÄ użyÄ PNG, GIF lub JPG!"
+
+msgid "The image could not be received, would you mind retry?"
+msgstr "Obrazek nie zostaÅ pobrany, czy mĆ³gÅ byÅ sprĆ³bowaÄ ponownie?"
+
+msgid "Your image was added to the list!"
+msgstr "TwĆ³j obrazek zostaÅ dodany do listy!"
+
+msgid "Changes saved!"
+msgstr "Zmiany zapisane!"
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr "Możesz ustawiÄ wiÄcej niż jednego administratora dla tej instalacji Jappix-a. Z pomocÄ
tego narzÄdzia możesz też zmieniÄ hasÅo."
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr "Za pomocÄ
tego narzÄdzia możesz zaktualizowaÄ swojÄ
instalacje Jappix-a lub sprawdziÄ, czy dostÄpne sÄ
nowe wersje."
+
+msgid "Access statistics"
+msgstr "Statystyki odwiedzin"
+
+msgid "Share statistics"
+msgstr "Statystyki udostÄpniania"
+
+msgid "Other statistics"
+msgstr "Inne statystyki"
+
+msgid "January"
+msgstr "StyczeÅ"
+
+msgid "February"
+msgstr "Luty"
+
+msgid "March"
+msgstr "Marzec"
+
+msgid "April"
+msgstr "KwiecieÅ"
+
+msgid "May"
+msgstr "Maj"
+
+msgid "June"
+msgstr "Czerwiec"
+
+msgid "July"
+msgstr "Lipiec"
+
+msgid "August"
+msgstr "SierpieÅ"
+
+msgid "September"
+msgstr "WrzesieÅ"
+
+msgid "October"
+msgstr "PaÅŗdziernik"
+
+msgid "November"
+msgstr "Listopad"
+
+msgid "December"
+msgstr "GrudzieÅ"
+
+msgid "Monday"
+msgstr "PoniedziaÅek"
+
+msgid "Tuesday"
+msgstr "Wtorek"
+
+msgid "Wednesday"
+msgstr "Åroda"
+
+msgid "Thursday"
+msgstr "Czwartek"
+
+msgid "Friday"
+msgstr "PiÄ
tek"
+
+msgid "Saturday"
+msgstr "Sobota"
+
+msgid "Sunday"
+msgstr "Niedziela"
+
+msgid "Total"
+msgstr "ÅÄ
cznie"
+
+msgid "Cache"
+msgstr "Cache"
+
+msgid "Logs"
+msgstr "Logi"
+
+msgid "Music"
+msgstr "Muzyka"
+
+msgid "Backgrounds"
+msgstr "TÅa"
+
+msgid "Share"
+msgstr "Podziel siÄ"
+
+msgid "Background"
+msgstr "TÅo"
+
+msgid "Notice"
+msgstr "Informacja"
+
+msgid "Your design preferences have been saved!"
+msgstr "Ustawienia wyglÄ
du zostaÅy zapisane!"
+
+msgid "Please check your inputs: something is missing!"
+msgstr "ProszÄ sprawdziÄ wprowadzone dane: coÅ jest nie tak!"
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr "Za pomocÄ
tego narzÄdznia zmienisz tÅo w swojej instalacji Jappix-a. Możesz albo ustawiÄ kolor albo wgraÄ obrazek. "
+
+msgid "Use default background"
+msgstr "Użyj domyÅlnego tÅa"
+
+msgid "Use your own image"
+msgstr "Użyj wÅasnego obrazka"
+
+msgid "Select a background to use and change the display options."
+msgstr "Wybierz tÅo i zmieÅ ustawienia wyÅwietlania."
+
+msgid "Use your own color"
+msgstr "Użyj wÅasnego koloru."
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr "Podaj wartoÅÄ hex koloru, ktĆ³ry chcesz użyÄ jako tÅo."
+
+msgid "Manage backgrounds"
+msgstr "ZarzÄ
dzaj obrazkami tÅa"
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr "Za pomocÄ
tego narzÄdzia możesz dodaÄ nowe tÅo do listy. ProszÄ wysÅaÄ poprawny obrazek."
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr "JeÅli chcesz usunÄ
Ä niektĆ³re tÅa, użyj poniższej przeglÄ
darki."
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr "Ustaw wiadomoÅÄ powitalnÄ
dla wszystkich swoich użytkownikĆ³w. Np. ostrzeżenie, ważna aktualizacja czy reklama."
+
+msgid "Simple notice"
+msgstr "ZwykÅe powiadomienie"
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr "To powiadomienie potrzebuje tylko zwykÅego tekstu, kod nie jest dozwolony!"
+
+msgid "Advanced notice"
+msgstr "Zaawansowane powiadomienie"
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr "Możesz dostosowaÄ powiadomienie za pomocÄ
HTML, CSS i JavaScript ale musisz zakodowaÄ wyglÄ
d."
+
+msgid "Available updates"
+msgstr "DostÄpne aktualizacje"
+
+msgid "What's new?"
+msgstr "Co nowego?"
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr ""
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr ""
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr ""
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr "Nowa wersja Jappix-a jest dostÄpna! SprawdÅŗ co nowego i uruchom aktualizator!"
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr "Twoja wersja jest nieaktualna. Zaktualizuj jÄ
do %s kilkajÄ
c tu!"
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr "WyglÄ
da na to, że Twoja wersja jest aktualna ale możesz sprawdziÄ jÄ
rÄcznie klikajÄ
c tutaj."
+
+msgid "Check for updates"
+msgstr "SprawdÅŗ aktualizacje"
+
+msgid "Update in progress"
+msgstr "Aktualizacja w toku."
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr "Jappix zostaÅ zaktualizowany: teraz używasz najnowszej wersji. MiÅej zabawy!"
+
+msgid "The update has failed! Please try again later."
+msgstr "Aktualizacja nie powiodÅa siÄ! ProszÄ sprĆ³bowaÄ pĆ³Åŗniej."
+
+msgid "Downloading package..."
+msgstr "ÅciÄ
ganie paczki..."
+
+msgid "Removing current Jappix system files..."
+msgstr "Usuwanie plikĆ³w systemowych Jappix-a..."
+
+msgid "Extracting package..."
+msgstr "Rozpakowywanie paczki..."
+
+msgid "Regenerating storage folder tree..."
+msgstr "Wygeneruj ponownie drzewo folderu magazynujÄ
cego..."
+
+msgid "Jappix is now up to date!"
+msgstr "Jappix jest teraz zaktualizowany!"
+
+msgid "Aborted: socket error!"
+msgstr "Przerwano: bÅÄ
d socket-a!"
+
+msgid "Aborted: buffer error!"
+msgstr "Przerwano: bÅÄ
d bufora!"
+
+msgid "Aborted: everything is not writable!"
+msgstr "Przerwano: nie wszystko jest zapisywalne!"
+
+msgid "Aborted: could not extract the package!"
+msgstr "Przerwano: nie można rozpakowaÄ paczki!"
+
+msgid "Visits"
+msgstr "Wizyty"
+
+msgid "Daily"
+msgstr "Dziennie"
+
+msgid "Weekly"
+msgstr "Tygodniowo"
+
+msgid "Monthly"
+msgstr "MiesiÄcznie"
+
+msgid "Yearly"
+msgstr "Rocznie"
+
+msgid "Size"
+msgstr "Rozmiar"
+
+msgid "Clean everything"
+msgstr "WyczyÅÄ wszystko"
+
+msgid "Purge cache"
+msgstr "WyczyÅÄ cache"
+
+msgid "Purge logs"
+msgstr "WyczyÅÄ logi"
+
+msgid "Purge updates"
+msgstr "WyczyÅÄ aktualizacje"
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr "Folder, ktĆ³ry chciano wyczyÅciÄ jest teraz pusty!"
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr "Utrzymuj swojÄ
instalacjÄ Jappix-a Åwieżego i szybkiego, czyÅÄ foldery foldery 'store' regularnie!"
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr "WyÅlij swojÄ
muzykÄ (Ogg Vorbis, MP3 lub WAV) i sÅuchaj jej w Jappix-ie!"
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr "Plik, ktĆ³ry chcesz wysÅaÄ, musi byÄ mniejszy niż %s."
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr "BÄ
dÅŗ na bieżÄ
co z tym, co Twoi użytkownicy przechowujÄ
na serwerze i za pomocÄ
tego urzÄ
dzenia usuwaj niepożÄ
dane treÅci."
+
+msgid "Title"
+msgstr "TytuÅ"
+
+msgid "Artist"
+msgstr "Wykonawca"
+
+msgid "Album"
+msgstr "Album"
+
+msgid "File"
+msgstr "Plik"
+
+msgid "Upload"
+msgstr "Upload"
+
+msgid "The folder is empty."
+msgstr "Folder jest pusty,"
+
+msgid "The music could not be received, please retry!"
+msgstr "Muzyka nie zostaÅa wczytana, proszÄ sprĆ³bowaÄ ponownie!"
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr "To nie jest poprawny plik muzyczny, proszÄ wysÅaÄ plik Ogg Vorbis, MP3 lub WAV!"
+
+msgid "Your music has been added!"
+msgstr "Twoja muzyja zostaÅa dodana!"
+
+msgid "The selected elements have been removed."
+msgstr "Zaznaczone elementy zostaÅy usuniÄte."
+
+msgid "You must select elements to remove!"
+msgstr "Musisz zaznaczyÄ elementy do usuniÄcia!"
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr "Za pomocÄ
tego narzÄdzia dodasz nowego użytkownika lub zmienisz hasÅo (wpisz istniejÄ
cÄ
nazwÄ użytkownika). PamiÄtaj, żeby wybraÄ mocne hasÅo!"
+
+msgid "Manage"
+msgstr "ZarzÄ
dzaj"
+
+msgid "List"
+msgstr "Lista"
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr "Za pomocÄ
tego narzÄdzia usuniesz użytkownikĆ³w. PamiÄtaj, że nie możesz usunÄ
Ä użytkownika jeÅli jest on jedynym pozostaÅym."
+
+msgid "The user has been added!"
+msgstr "Użytkownik zostaŠdodany!"
+
+msgid "The chosen users have been removed."
+msgstr "Wybrani użytkownicy zostali usuniÄci."
+
+msgid "You must select one or more users to be removed!"
+msgstr "Musisz wybraÄ jednego lub kilku użytkownikĆ³w do usuniÄcia!"
+
+msgid "Yesterday"
+msgstr "Wczoraj"
+
+msgid "%s days ago"
+msgstr "%s dni temu"
+
+msgid "User currently active"
+msgstr "User jest aktualnie aktywny"
+
+msgid "Last seen: %s"
+msgstr "Ostatnio widziany: %s"
+
+msgid "Inactive since: %s"
+msgstr "Nieaktywny od: %s"
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr ""
+
+msgid "Static content server"
+msgstr ""
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Suggested friends"
+msgstr ""
+
+msgid "Check all"
+msgstr "Zaznacz wszystkie"
+
+msgid "Uncheck all"
+msgstr "Odznacz wszystkie"
+
+msgid "Choose"
+msgstr "Wybierz"
+
+msgid "List name"
+msgstr "Nazwa listy"
+
+msgid "Allow"
+msgstr "ZezwĆ³l"
+
+msgid "Deny"
+msgstr "ZabroÅ"
+
+msgid "Group"
+msgstr ""
+
+msgid "Subscription"
+msgstr ""
+
+msgid "Both"
+msgstr ""
+
+msgid "From"
+msgstr ""
+
+msgid "Everybody"
+msgstr ""
+
+msgid "Send messages"
+msgstr ""
+
+msgid "Send queries"
+msgstr ""
+
+msgid "See my status"
+msgstr ""
+
+msgid "Send his/her status"
+msgstr ""
+
+msgid "Everything"
+msgstr ""
+
+msgid "Item"
+msgstr ""
+
+msgid "Order"
+msgstr ""
+
+msgid "Active for this session"
+msgstr ""
+
+msgid "Always active"
+msgstr ""
+
+msgid "User directory"
+msgstr ""
+
+msgid "Search a friend"
+msgstr ""
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr ""
+
+msgid "This is a repeat from %s"
+msgstr ""
+
+msgid "Loading comments..."
+msgstr ""
+
+msgid "Type your comment here..."
+msgstr ""
+
+msgid "Could not get the comments!"
+msgstr ""
+
+msgid "Show comments"
+msgstr ""
+
+msgid "Send him/her a message"
+msgstr ""
+
+msgid "Start a chat with him/her"
+msgstr ""
+
+msgid "Media integration"
+msgstr ""
+
+msgid "Comments locked!"
+msgstr ""
+
+msgid "Type something you want to share with your friends..."
+msgstr ""
+
+msgid "changed his/her nickname to %s"
+msgstr ""
+
+msgid "commented an item you follow: ā%sā."
+msgstr ""
+
+msgid "Hide"
+msgstr ""
+
+msgid "liked your post: ā%sā."
+msgstr ""
+
+msgid "quoted you somewhere: ā%sā."
+msgstr ""
+
+msgid "published on your wall: ā%sā."
+msgstr ""
+
+msgid "tagged you in a photo (%s)."
+msgstr ""
+
+msgid "tagged you in a video (%s)."
+msgstr ""
+
+msgid "Show"
+msgstr ""
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr ""
+
+msgid "Pubsub host"
+msgstr ""
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr ""
+
+msgid "Manager link"
+msgstr ""
+
+msgid "User uploads server"
+msgstr ""
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Logo"
+msgstr ""
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr ""
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr ""
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr ""
+
+msgid "Your service logo has been successfully changed!"
+msgstr ""
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr ""
+
+msgid "Remove this logo"
+msgstr ""
+
+msgid "View this logo"
+msgstr ""
+
+msgid "Send a file"
+msgstr ""
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr ""
+
+msgid "Groupchats to join"
+msgstr ""
+
+msgid "Purge sent files"
+msgstr ""
+
+msgid "would like to send you a file: ā%sā."
+msgstr ""
+
+msgid "has accepted to received your file: ā%sā."
+msgstr ""
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr ""
+
+msgid "could not receive your file: ā%sā."
+msgstr ""
+
+msgid "has received a file exchange request: ā%sā."
+msgstr ""
+
+msgid "Available shortcuts:"
+msgstr ""
+
+msgid "%s removes the chat logs"
+msgstr ""
+
+msgid "%s joins a groupchat"
+msgstr ""
+
+msgid "%s closes the chat"
+msgstr ""
+
+msgid "%s shows the user profile"
+msgstr ""
+
+msgid "%s sends a message to the room"
+msgstr ""
+
+msgid "%s changes your nickname"
+msgstr ""
+
+msgid "%s sends a message to someone in the room"
+msgstr ""
+
+msgid "%s changes the room topic"
+msgstr ""
+
+msgid "%s kicks an user of the room"
+msgstr ""
+
+msgid "%s bans an user of the room"
+msgstr ""
+
+msgid "%s invites someone to join the room"
+msgstr ""
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr "Jappix jest spoÅecznoÅciowÄ
platrofmÄ
non-profit, za pomocÄ
ktĆ³rej możesz komunikowaÄ siÄ z kim chcesz, kiedy chcesz i skÄ
d chcesz."
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# Brazilian Portuguese translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:44+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "JavaScript estĆ” faltando no seu navegador web, de modo que vocĆŖ nĆ£o serĆ” capaz de lanƧar Jappix! Corrija isso."
+
+msgid "An open social network"
+msgstr "Uma rede social aberta"
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "Jappix foi interrompido por um problema de rede, um login errado (verifique se vocĆŖ inseriu as credenciais correta), Desculpe pelo transtorno."
+
+msgid "The element list on this server could not be obtained!"
+msgstr "A lista de elementos sobre esse servidor nĆ£o pĆ“de ser obtida!"
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "Sua senha foi mudada, agora vocĆŖ pode se conectar a sua conta com os seus dados de login nova."
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "Sua conta XMPP foi removida, tchau!"
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "VocĆŖ foi deslogado da sua conta XMPP, tenha um bom dia!"
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "A sala em que vocĆŖ entrou parece nĆ£o existir. VocĆŖ deve cria-la!"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "O grupo de chat foi removido, agor alguƩm terƔ que recria-lo"
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "O usuĆ”rio com quem quer se comunicar nĆ£o estĆ” presente na sala."
+
+msgid "Please enter the group chat address to join."
+msgstr "Por favor insira o endereƧo do grupo de chat para entrar."
+
+msgid "Please enter your nickname to join %s."
+msgstr "Por favor, digite um nome para se conectar em"
+
+msgid "This room (%s) is protected with a password."
+msgstr "Esta sala estĆ” protegida por uma senha."
+
+msgid "Your browser is out of date!"
+msgstr "Seu navegador esta desatualizado"
+
+msgid "Last %s version is better!"
+msgstr ""
+
+msgid "Login"
+msgstr "Logar"
+
+msgid "Register"
+msgstr "Registrar"
+
+msgid "Here we go!"
+msgstr "E lĆ” vamos nĆ³s!"
+
+msgid "Server"
+msgstr "Servidor"
+
+msgid "Password"
+msgstr "Senha"
+
+msgid "Remember me"
+msgstr "Me lembrar"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "Esta ferramenta foi desativada. VocĆŖ nĆ£o pode usĆ”-la!"
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "Devido Ć problemas de rede, vocĆŖ foi desconectado. O que vocĆŖ quer fazer agora?"
+
+msgid "Reconnect"
+msgstr "Reconectar"
+
+msgid "Messages"
+msgstr "Mensagens"
+
+msgid "Profile"
+msgstr "Perfil"
+
+msgid "Options"
+msgstr "OpƧƵes"
+
+msgid "Disconnect"
+msgstr "Desconectar"
+
+msgid "Filter"
+msgstr "Filtrar"
+
+msgid "Add a friend"
+msgstr "Adicionar um amigo"
+
+msgid "Your groupchats"
+msgstr "Suas salas"
+
+msgid "Manage your favorite groupchats"
+msgstr "Administrar suas salas favoritas"
+
+msgid "More stuff"
+msgstr "Mais coisas"
+
+msgid "Show all friends"
+msgstr "Mostrar todos os amigos"
+
+msgid "Only show connected friends"
+msgstr "Mostrar apenas os amigos conectados"
+
+msgid "Message archives"
+msgstr "Arquivo de mensagens"
+
+msgid "Date"
+msgstr "Data"
+
+msgid "Please select a friend to view the chat history."
+msgstr "Selecione o amigo que desejar ver o histĆ³rico"
+
+msgid "Nothing found for: %s"
+msgstr "NĆ£o encontrado para:"
+
+msgid "A short message?"
+msgstr "Uma mensagem curta?"
+
+msgid "How are you?"
+msgstr "Como vai vocĆŖ?"
+
+msgid "What are you doing?"
+msgstr "O que vocĆŖ tem feito?"
+
+msgid "Join a chat"
+msgstr "Entrar na sala"
+
+msgid "Status"
+msgstr "Status"
+
+msgid "Available"
+msgstr "DisponĆvel"
+
+msgid "Talkative"
+msgstr "Em conversa"
+
+msgid "Away"
+msgstr "Ausente"
+
+msgid "Not available"
+msgstr "NĆ£o disponĆvel"
+
+msgid "Busy"
+msgstr "Ocupado"
+
+msgid "Mood"
+msgstr "Humor"
+
+msgid "None"
+msgstr "Nada"
+
+msgid "Crazy"
+msgstr "Louco"
+
+msgid "Excited"
+msgstr "Animado"
+
+msgid "Playful"
+msgstr "BrincalhĆ£o"
+
+msgid "Happy"
+msgstr "Feliz"
+
+msgid "Shocked"
+msgstr "Chocado"
+
+msgid "Hot"
+msgstr "Quente"
+
+msgid "Sad"
+msgstr "Triste"
+
+msgid "Amorous"
+msgstr "Amoroso"
+
+msgid "Confident"
+msgstr "Confiante"
+
+msgid "Activity"
+msgstr "Atividade"
+
+msgid "Chores"
+msgstr "Tarefas"
+
+msgid "Drinking"
+msgstr "Bebendo"
+
+msgid "Eating"
+msgstr "Comendo"
+
+msgid "Exercising"
+msgstr "Se exercitando"
+
+msgid "Grooming"
+msgstr "AparĆŖncia"
+
+msgid "Appointment"
+msgstr "nomeaĆ§Ć£o"
+
+msgid "Inactive"
+msgstr "Inativo"
+
+msgid "Relaxing"
+msgstr "Relaxante"
+
+msgid "Talking"
+msgstr "Falando"
+
+msgid "Traveling"
+msgstr "Viajando"
+
+msgid "Working"
+msgstr "Trabalhando"
+
+msgid "View profile"
+msgstr "Ver Perfil"
+
+msgid "Repeat this notice"
+msgstr "Repetir a notĆcia"
+
+msgid "Remove this notice"
+msgstr "Remover esta notĆcia"
+
+msgid "Your profile"
+msgstr "Seu perfil"
+
+msgid "Identity"
+msgstr "Identidade"
+
+msgid "Profile image"
+msgstr "Imagem do perfil"
+
+msgid "Others"
+msgstr "Outros"
+
+msgid "Personal"
+msgstr "Pessoal"
+
+msgid "Complete name"
+msgstr "Nome completo"
+
+msgid "Nickname"
+msgstr "Apelido"
+
+msgid "First name"
+msgstr "Primeiro nome"
+
+msgid "Last name"
+msgstr "Sobrenome"
+
+msgid "Date of birth"
+msgstr "Data de aniversƔrio"
+
+msgid "Contact"
+msgstr "Contato"
+
+msgid "E-mail"
+msgstr "E-mail"
+
+msgid "Phone"
+msgstr "Telefone"
+
+msgid "Website"
+msgstr "Site"
+
+msgid "Current"
+msgstr "Atual"
+
+msgid "Delete"
+msgstr "Deletar"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "Que pena! VocĆŖ nĆ£o possui imagem de perfil definida no seu cartĆ£o de identidade!"
+
+msgid "Address"
+msgstr "EndereƧo"
+
+msgid "Street"
+msgstr "Rua"
+
+msgid "City"
+msgstr "Cidade"
+
+msgid "Postal code"
+msgstr "CĆ³digo Posta"
+
+msgid "Country"
+msgstr "PaĆs"
+
+msgid "Biography"
+msgstr "Biografia"
+
+msgid "Important notice"
+msgstr "Aviso importante"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr ""
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr ""
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr "Ć recomendĆ”vel o envio de uma imagem de perfil (%s mĆ”ximo), como uma foto sua, isso facilita seu reconhecimento"
+
+msgid "Save"
+msgstr "Salvar"
+
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgid "Edit options"
+msgstr "Editar opƧƵes"
+
+msgid "Channel"
+msgstr "Canal"
+
+msgid "Commands"
+msgstr "Comandos"
+
+msgid "Sounds"
+msgstr "sons"
+
+msgid "Privacy"
+msgstr "Privacidade"
+
+msgid "Message archiving"
+msgstr "Arquivo de mensagens"
+
+msgid "Store a history of your chats"
+msgstr "Gravar o histĆ³rico das conversas"
+
+msgid "Geolocation"
+msgstr "LocalizaĆ§Ć£o geogrĆ”fica"
+
+msgid "Empty"
+msgstr "Vazio"
+
+msgid "Empty channel"
+msgstr "Canal vazio"
+
+msgid "Persistent"
+msgstr "Persistente"
+
+msgid "Maximum notices"
+msgstr "MƔximo de avisos"
+
+msgid "Account"
+msgstr "Conta"
+
+msgid "Change password"
+msgstr "Mudar senha"
+
+msgid "Delete account"
+msgstr "Deletar conta"
+
+msgid "Old"
+msgstr "Velho"
+
+msgid "New (2 times)"
+msgstr "Novo (2 vezes)"
+
+msgid "Continue"
+msgstr "Continue"
+
+msgid "To"
+msgstr "Para"
+
+msgid "Close"
+msgstr "Fechar"
+
+msgid "unknown"
+msgstr "desconhecido"
+
+msgid "Unavailable"
+msgstr "IndisponĆvel"
+
+msgid "is now"
+msgstr "Ć agora"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr "Por favor aguarde enquanto seu avatar Ć© enviado..."
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "Aqui estĆ”! Uma linda imagem nova de perfil!"
+
+msgid "The image file is not supported or has a bad size."
+msgstr "O arquivo da imagem nĆ£o Ć© suportado ou o tamanho Ć© invĆ”lido."
+
+msgid "Reply"
+msgstr "Responder"
+
+msgid "Error"
+msgstr "Erro"
+
+msgid "Click here to solve the error"
+msgstr "Clique aqui para solucionar o erro"
+
+msgid "You"
+msgstr "VocĆŖ"
+
+msgid "Remove"
+msgstr "Remover"
+
+msgid "Rename"
+msgstr "Renomear"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "OlĆ”, eu sou %s, eu gostaria de te adicionar como meu amigo."
+
+msgid "Smiley insertion"
+msgstr "Inserir emoticom"
+
+msgid "Change style"
+msgstr "Alterar estilo"
+
+msgid "Text in bold"
+msgstr "Texto em negrito"
+
+msgid "Text in italic"
+msgstr "Texto em itƔlico"
+
+msgid "Underlined text"
+msgstr "Texto sublinhado"
+
+msgid "Save chat"
+msgstr "Salvar conversa"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr "Clique no link a seguir para acessar o log da conversa. ApĆ³s um tempo, clique novamente para pegar o arquivo."
+
+msgid "This chat is empty!"
+msgstr "Esse chat estĆ” vazio!"
+
+msgid "Generate file!"
+msgstr "Gerar arquivo!"
+
+msgid "Download file!"
+msgstr "Ba"
+
+msgid "Clean current chat"
+msgstr "Apagar esta conversa"
+
+msgid "View chat history"
+msgstr "Visualizar histĆ³rico da conversa"
+
+msgid "Show user profile"
+msgstr "Mostrar perfil do usuƔrio"
+
+msgid "Add this contact to your friends"
+msgstr "Adicionar este contato aos seus amigos"
+
+msgid "Add this groupchat to your favorites"
+msgstr "Adicionar este grupo de chat aos seus favoritos"
+
+msgid "All tabs"
+msgstr "Todas as abas"
+
+msgid "Close this tab"
+msgstr "Fechar esta aba"
+
+msgid "no subject defined for this room."
+msgstr "nenhum assunto definido para esta sala."
+
+msgid "Administration panel for this room"
+msgstr "Painel de administraĆ§Ć£o desta sala"
+
+msgid "Moderators"
+msgstr "Moderadores"
+
+msgid "Participants"
+msgstr "Participantes"
+
+msgid "Visitors"
+msgstr "Visitantes"
+
+msgid "Manage favorite rooms"
+msgstr "Gerenciar salas favoritas"
+
+msgid "Change favorites"
+msgstr "Alterar favoritos"
+
+msgid "Search a room"
+msgstr "Procurar uma sala"
+
+msgid "Select a favorite"
+msgstr "Selecionar um favorito"
+
+msgid "Getting the name..."
+msgstr "Buscando o nome..."
+
+msgid "Gateway"
+msgstr "Gateway"
+
+msgid "Name"
+msgstr "Nome"
+
+msgid "Room"
+msgstr "Sala"
+
+msgid "Add"
+msgstr "Adicionar"
+
+msgid "Edit"
+msgstr "Editar"
+
+msgid "Search a room on"
+msgstr "Procurar uma sala em"
+
+msgid "No room found on this server."
+msgstr "Nenhuma sala encontrada nesse servidor."
+
+msgid "Service discovery"
+msgstr "Descobrir serviƧos"
+
+msgid "Server to query"
+msgstr "Servidor para pesquisa"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr "Desculpa, mas a entidade nĆ£o retornou nenhum resultado!"
+
+msgid "Accounts"
+msgstr "Contas"
+
+msgid "Authentications"
+msgstr "AutenticaƧƵes"
+
+msgid "Automation"
+msgstr "AutomatizaĆ§Ć£o"
+
+msgid "Clients"
+msgstr "Clientes"
+
+msgid "Collaboration"
+msgstr "ColaboraĆ§Ć£o"
+
+msgid "Components"
+msgstr "Componentes"
+
+msgid "Rooms"
+msgstr "Salas"
+
+msgid "Directories"
+msgstr "DiretĆ³rios"
+
+msgid "Gateways"
+msgstr "Gateways"
+
+msgid "News"
+msgstr "NotĆcias"
+
+msgid "Hierarchy"
+msgstr "Hierarquia"
+
+msgid "Proxies"
+msgstr "Proxies"
+
+msgid "Publication/Subscription"
+msgstr "PublicaĆ§Ć£o/SubscriĆ§Ć£o"
+
+msgid "Storage"
+msgstr "Armazenamento"
+
+msgid "Service offline or broken"
+msgstr "ServiƧo offline ou indisponĆvel"
+
+msgid "Your inbox"
+msgstr "Sua caixa de entrada"
+
+msgid "Available actions"
+msgstr "AƧƵes disponĆveis"
+
+msgid "Clean"
+msgstr "Limpar"
+
+msgid "New"
+msgstr "Novo"
+
+msgid "Received"
+msgstr "Recebidos"
+
+msgid "Subject"
+msgstr "Assunto"
+
+msgid "Content"
+msgstr "ConteĆŗdo"
+
+msgid "Send message"
+msgstr "Enviar mensagem"
+
+msgid "Your inbox is empty."
+msgstr "Sua caixa de entrada estĆ” vazia."
+
+msgid "MUC administration"
+msgstr "AdministraĆ§Ć£o MUC"
+
+msgid "You administrate this room"
+msgstr "VocĆŖ administra esta sala"
+
+msgid "Enter new subject"
+msgstr "Inserir novo assunto"
+
+msgid "Configuration"
+msgstr "ConfiguraĆ§Ć£o"
+
+msgid "Authorizations"
+msgstr "AutorizaƧƵes"
+
+msgid "Member list"
+msgstr "Lista de membros"
+
+msgid "Owner list"
+msgstr "Lista de proprietƔrios"
+
+msgid "Administrator list"
+msgstr "Lista de administradores"
+
+msgid "Outcast list"
+msgstr "Lista de banidos"
+
+msgid "Add an input"
+msgstr "Adicionar uma entrada"
+
+msgid "Destroy this MUC"
+msgstr "Destruir esse MUC"
+
+msgid "Yes, let's do it!"
+msgstr "Sim, vamos lĆ”!"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr "Seu amigo estĆ” prestando atenĆ§Ć£o na conversa."
+
+msgid "Your friend is writing a message..."
+msgstr "Seu amigo estĆ” digitando uma mensagem..."
+
+msgid "Your friend stopped writing a message."
+msgstr "Seu amigo parou de escrever uma mensagem."
+
+msgid "Your friend is doing something else."
+msgstr "Seu amigo estĆ” fazendo outra coisa."
+
+msgid "Your friend closed the chat."
+msgstr "Seu amigo fechou o chat."
+
+msgid "Requesting this service..."
+msgstr "Requisitando esse serviƧo..."
+
+msgid "Loading"
+msgstr "Carregando"
+
+msgid "joined the chat room"
+msgstr "entrou na sala de chat"
+
+msgid "left the chat room"
+msgstr "saiu da sala de chat"
+
+msgid "no status"
+msgstr "sem status"
+
+msgid "has been kicked"
+msgstr "foi chutado"
+
+msgid "has been banned"
+msgstr "foi banido"
+
+msgid "no reason"
+msgstr "nenhum motivo"
+
+msgid "Communicate with the entire world!"
+msgstr "Comunique-se com o mundo inteiro!"
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr "Permite que vocĆŖ entre em contato com milhƵes de usuĆ”rios que utilizam uma rede XMPP como vocĆŖ faz com o Jappix. Entre na comunidade e fique livre."
+
+msgid "Hi there!"
+msgstr "OlĆ”!"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr ""
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr "Acesse sua conta XMPP existente ou crie uma nova de graƧa!"
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr "Jappix Ć© um projeto open-source da PostPro, uma organizaĆ§Ć£o sem fins lucrativos que nos oferece uma grande ajuda."
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr "Acesse com sua conta XMPP. VocĆŖ tambĆ©m pode usar o %s para acessar um grupo de chat."
+
+msgid "Previous"
+msgstr "Anterior"
+
+msgid "General"
+msgstr "Geral"
+
+msgid "Advanced"
+msgstr "AvanƧado"
+
+msgid "Resource"
+msgstr "Recurso"
+
+msgid "Priority"
+msgstr "Prioridade"
+
+msgid "Low"
+msgstr "Baixa"
+
+msgid "Medium"
+msgstr "MĆ©dia"
+
+msgid "High"
+msgstr "Alta"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr "Insira o grupo de chat desejado e o seu apelido. VocĆŖ tambĆ©m pode voltar para o %s."
+
+msgid "login page"
+msgstr "PƔgina de login"
+
+msgid "Share this link with your friends:"
+msgstr "Compartilhe este link com seus amigos:"
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr "Registre uma nova conta XMPP para acessar seus amigos em sua prĆ³pria rede social. Ć simples!"
+
+msgid "Required"
+msgstr "Requerido"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr "VocĆŖ foi registrado, aqui estĆ” seu endereƧo XMPP:"
+
+msgid "Manager"
+msgstr "Gerenciador"
+
+msgid "Project"
+msgstr "Projeto"
+
+msgid "Encrypted"
+msgstr "Encriptado"
+
+msgid "Unencrypted"
+msgstr "Desencriptado"
+
+msgid "Where are you?"
+msgstr "Onde vocĆŖ estĆ”?"
+
+msgid "What's up with you?"
+msgstr "O que vocĆŖ estĆ” pensando?"
+
+msgid "Fetching the social channel..."
+msgstr "Buscando o canal social..."
+
+msgid "You are synchronized with your network."
+msgstr "VocĆŖ estĆ” sincronizado com sua rede."
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr "NĆ£o Ć© possĆvel enviar: vocĆŖ sĆ³ pode receber avisos!"
+
+msgid "Media viewer"
+msgstr "Visualizador de media"
+
+msgid "Browse"
+msgstr "Navegar"
+
+msgid "Command"
+msgstr "Comando"
+
+msgid "Subscribe"
+msgstr "Assinar"
+
+msgid "Join"
+msgstr "Entrar"
+
+msgid "Automatic"
+msgstr "AutomƔtico"
+
+msgid "Search"
+msgstr "Procurar"
+
+msgid "No result!"
+msgstr "Nenhum resultado!"
+
+msgid "No notifications."
+msgstr "Nenhuma notificaĆ§Ć£o."
+
+msgid "would like to add you as a friend."
+msgstr "gostaria de te adicionar como amigo."
+
+msgid "would like you to join this chatroom:"
+msgstr "gostaria de entrar nesta sala de chat:"
+
+msgid "Do you accept?"
+msgstr "VocĆŖ aceita?"
+
+msgid "Yes"
+msgstr "Sim"
+
+msgid "No"
+msgstr "NĆ£o"
+
+msgid "would like to get authorization."
+msgstr "gostaria de pegar autorizaĆ§Ć£o."
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr "Gostaria de ver os amigos %s sugerem vocĆŖ?"
+
+msgid "Submit"
+msgstr "Enviar"
+
+msgid "Client"
+msgstr "Cliente"
+
+msgid "System"
+msgstr "Sistema"
+
+msgid "Local time"
+msgstr "Hora local"
+
+msgid "Comments"
+msgstr "ComentƔrios"
+
+msgid "User profile"
+msgstr "Perfil do usuƔrio"
+
+msgid "See his/her position on the globe"
+msgstr "Visualizar a localizaĆ§Ć£o dele/dela"
+
+msgid "Confirm"
+msgstr "Confirmar"
+
+msgid "anonymous mode"
+msgstr "Modo anƓnimo"
+
+msgid "Groups"
+msgstr "Grupos"
+
+msgid "Unclassified"
+msgstr "NĆ£o classificado"
+
+msgid "Authorize"
+msgstr "Autorizar"
+
+msgid "Ask for authorization"
+msgstr "Solicitar autorizaĆ§Ć£o"
+
+msgid "Unblock"
+msgstr "Desbloquear"
+
+msgid "Prohibit"
+msgstr "Proibir"
+
+msgid "Block"
+msgstr "Bloquear"
+
+msgid "Chat"
+msgstr "Chat"
+
+msgid "Groupchat"
+msgstr "Grupo de chat"
+
+msgid "Jappix Mobile"
+msgstr "Jappix mĆ³vel"
+
+msgid "Desktop"
+msgstr "Desktop"
+
+msgid "Mobile"
+msgstr "Mobile"
+
+msgid "Please wait..."
+msgstr "Aguarde..."
+
+msgid "Please enable JavaScript"
+msgstr "Por favor, habilite JavaScript"
+
+msgid "Your channel"
+msgstr "Seu canal"
+
+msgid "Channel of"
+msgstr "Canal de"
+
+msgid "More notices..."
+msgstr "Mais avisos..."
+
+msgid "Attach a file"
+msgstr "Anexar um arquivo"
+
+msgid "Send"
+msgstr "Enviar"
+
+msgid "Unattach the file"
+msgstr "Desanexar o arquivo"
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr "Um erro ocorreu durante o envio do arquivo: talvez seja grande demais (%s mĆ”ximo) ou nĆ£o permitido."
+
+msgid "Authorization failed"
+msgstr "AutorizaĆ§Ć£o falhou"
+
+msgid "Registration failed, please choose a different username"
+msgstr "Registro falhou, escolhe um nome de usuƔrio diferente"
+
+msgid "Service unavailable"
+msgstr "ServiƧo indisponĆvel"
+
+msgid "Internal server error, try later"
+msgstr "Erro interno do servidor, tente mais tarde"
+
+msgid "Your form has been sent."
+msgstr "Seu formulƔrio foi enviado."
+
+msgid "Application"
+msgstr "AplicaĆ§Ć£o"
+
+msgid "XMPP links"
+msgstr "Links XMPP"
+
+msgid "Open XMPP links with Jappix"
+msgstr "Abrir links XMPP com o Jappix"
+
+msgid "changed the subject to:"
+msgstr "Assunto alterado para:"
+
+msgid "Welcome!"
+msgstr "Bem vindo!"
+
+msgid "Friends"
+msgstr "Amigos"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr "Bem vindo ao Jappix, seu prĆ³pria rede social!"
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr "Antes de comeƧar a utilizar, vocĆŖ terĆ” que alterar algumas configuraƧƵes, procure por amigos e complete seu perfil."
+
+msgid "Enable notification sounds"
+msgstr "Habilitar som de notificaĆ§Ć£o"
+
+msgid "Share your position on the globe"
+msgstr "Compartilhar sua localizaĆ§Ć£o"
+
+msgid "Offline friends"
+msgstr "Amigos offline"
+
+msgid "Don't hide offline friends"
+msgstr "NĆ£o esconder amigos offline"
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr "Use esta ferramenta para encontrar seus amigos no servidor que vocĆŖ estĆ” utilizando, ou adicione-os mais tarde."
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr "Bom trabalho! Agora vocĆŖ pode compartilhar o Jappix com seus amigos!"
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr "Quando vocĆŖ apertar o botĆ£o de salvar, o editor de perfil serĆ” aberto. Boa socializaĆ§Ć£o!"
+
+msgid "Share Jappix on %s"
+msgstr "Compartilhe o Jappix em %s:"
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr "Usando Jappix, uma plataforma social aberta. Eu sou %s!"
+
+msgid "Unknown name"
+msgstr "Nome desconhecido"
+
+msgid "Unknown country"
+msgstr "PaĆs desconhecido"
+
+msgid "Click to enable"
+msgstr "Clique para habilitar"
+
+msgid "Click to disable"
+msgstr "Clique para desabilitar"
+
+msgid "Installation"
+msgstr "InstalaĆ§Ć£o"
+
+msgid "Jappix installation"
+msgstr "InstalaĆ§Ć£o do Jappix"
+
+msgid "Welcome to the Jappix installation!"
+msgstr "Bem vindo Ć instalaĆ§Ć£o do Jappix!"
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr "Essa ferramenta ajudarĆ” a agilizar a instalaĆ§Ć£o do Jappix. A primeira plataforma social completa em seu servidor. VocĆŖ nem precisa conhecimento tĆ©cnico."
+
+msgid "Let's have a look at the installation steps:"
+msgstr "Vamos dar uma olhada nos passos de instalaĆ§Ć£o:"
+
+msgid "Welcome"
+msgstr "Bem vindo"
+
+msgid "Storage configuration"
+msgstr "ConfiguraĆ§Ć£o de armazenamento"
+
+msgid "Administrator account"
+msgstr "Conta de administrador"
+
+msgid "Main configuration"
+msgstr "ConfiguraĆ§Ć£o principal"
+
+msgid "Hosts configuration"
+msgstr "ConfiguraĆ§Ć£o de hosts"
+
+msgid "Services installation"
+msgstr "InstalaĆ§Ć£o de serviƧos"
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr "Se o idioma nĆ£o bate com sua (%1s), vocĆŖ pode fazer o Jappix falar %2s e ficarĆ” salvo."
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr "Se vocĆŖ quer alguma ajuda sobre a configuraĆ§Ć£o e instalaĆ§Ć£o do Jappix, vocĆŖ pode usar toda nossa documentaĆ§Ć£o disponĆvel em:"
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr "Ć hora de criar sua prĆ³pria rede social: vĆ” para o prĆ³ximo passo!"
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr "Jappix armazena dados constantemente (como arquivos compartilhados, logs de conversa, mĆŗsicas e de configuraĆ§Ć£o) em uma Ćŗnica pasta segura."
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr "Jappix precisa permissĆ£o para escrita nessa pasta. Se nĆ£o, vocĆŖ precisa ajustar as permissƵes para %1s ou alterar o proprietĆ”rio para %2s (dependendo da sua configuraĆ§Ć£o)."
+
+msgid "The folder is writable, you can continue!"
+msgstr "Esta pasta possui permissĆ£o de escrita, pode continuar!"
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix oferece a vocĆŖ a possibilidade de gerenciar suas configuraƧƵes, instalar novos plugins ou procurar por atulizaƧƵes. Por isso vocĆŖ deve criar um usuĆ”rio de administraĆ§Ć£o para acessar o gerenciador."
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr "Quando o Jappix for instalado, clique no link do gerenciador, em sua pƔgina inicial, para acessƔ-lo."
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr "Oops, vocĆŖ esqueceu algo ou as duas senhas nĆ£o conferem."
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr "Jappix precisa que vocĆŖ especifique alguns valores para funcionar. Corrija as seguintes entradas (ou mantenha as configuraƧƵes padrƵes, o que Ć© suficiente para a maioria das pessoas)."
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr "Note que, se vocĆŖ nĆ£o especificar um valor obrigatĆ³rio, ele serĆ” automaticamente preenchido com valores padrĆ£o."
+
+msgid "User"
+msgstr "UsuƔrio"
+
+msgid "Service"
+msgstr "ServiƧo"
+
+msgid "Service name"
+msgstr "Nome do serviƧo"
+
+msgid "Service description"
+msgstr "DescriĆ§Ć£o do serviƧo"
+
+msgid "Connection"
+msgstr "ConexĆ£o"
+
+msgid "Lock the host"
+msgstr "Veja o endereƧo"
+
+msgid "Anonymous mode"
+msgstr "Modo anƓnimo"
+
+msgid "Registration allowed"
+msgstr "Registro permitido"
+
+msgid "Use a proxy"
+msgstr "Usar um proxy"
+
+msgid "Encryption"
+msgstr "EncriptaĆ§Ć£o"
+
+msgid "HTTPS storage"
+msgstr "Armazenamento HTTPS"
+
+msgid "Force HTTPS"
+msgstr "ForƧar HTTPS"
+
+msgid "Compression"
+msgstr "CompressĆ£o"
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr "Essa pĆ”gina ajuda vocĆŖ a especificar os endereƧos no qual o Jappix conectarĆ”. VocĆŖ pode deixa-los assim e continuar caso queira usar os endereƧos dos serviƧos oficiais."
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr "Talvez vocĆŖ nĆ£o saiba o que Ć© um servidor BOSH! Na verdade Ć© um transmissor, entre o cliente (Jappix) e um servidor XMPP, necessĆ”rio devido a limitaƧƵes tĆ©cnicas."
+
+msgid "Main host"
+msgstr "EndereƧo principal"
+
+msgid "Groupchat host"
+msgstr "EndereƧo dos grupos de chat"
+
+msgid "Anonymous host"
+msgstr "EndereƧo do modo anƓnimo"
+
+msgid "Directory host"
+msgstr "EndereƧo do diretĆ³rio"
+
+msgid "BOSH host"
+msgstr "EndereƧo do BOSH"
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr "VocĆŖ pode instalar programas extras em seu servidor para estender as funcionalidades do Jappix. Outros podem ser modificados por causa de restriƧƵes de seguranƧa definidas por padrĆ£o."
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr "Para executar isso, vocĆŖ precisa ter acesso shell ao servidor e logar como root. Lembre-se, esta opƧƵes Ć© facultativa. Jappix funcionarĆ” sem esses mĆ³dulos, mas algumas de suas funƧƵes ficarĆ£o indisponĆveis."
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr "ApĆ³s terminar a instalaĆ§Ć£o, Jappix vai gerar os arquivos de cache. Isso pode demorar um pouco. Espere atĆ© que a aplicaĆ§Ć£o termine."
+
+msgid "Thanks for using Jappix!"
+msgstr "Obrigado por utilizar Jappix!"
+
+msgid "Next"
+msgstr "PrĆ³ximo"
+
+msgid "Finish"
+msgstr "Terminar"
+
+msgid "Check again"
+msgstr "Checar novamente"
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr "A pasta nĆ£o tem permissĆ£o de escrita, aplique as permissƵes corretas Ć pasta %s."
+
+msgid "%s is installed on your system."
+msgstr "%s estĆ” instalado no seu sistema."
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr "%1s nĆ£o estĆ” instalado em seu sistema, vocĆŖ deve instalar %2s."
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr "PHP - maximum_upload_size Ć© suficiente (%s)."
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr "PHP - maximum_upload_size nĆ£o Ć© suficiente (%1s), vocĆŖ deve alterar para %2s em %3s."
+
+msgid "Jappix manager"
+msgstr "Gerenciador do Jappix"
+
+msgid "Manager access"
+msgstr "Acesso ao gerenciador"
+
+msgid "Statistics"
+msgstr "EstatĆsticas"
+
+msgid "Hosts"
+msgstr "EndereƧos"
+
+msgid "Design"
+msgstr "Design"
+
+msgid "Repeat"
+msgstr "Repetir"
+
+msgid "All"
+msgstr "Todos"
+
+msgid "Horizontal"
+msgstr "Horizontal"
+
+msgid "Vertical"
+msgstr "Vertical"
+
+msgid "Center"
+msgstr "Centralizado"
+
+msgid "Left"
+msgstr "Esquerda"
+
+msgid "Right"
+msgstr "Direita"
+
+msgid "Top"
+msgstr "Topo"
+
+msgid "Bottom"
+msgstr "Fundo"
+
+msgid "Adapt"
+msgstr "Adaptar"
+
+msgid "Color"
+msgstr "Cor"
+
+msgid "Users"
+msgstr "UsuƔrios"
+
+msgid "Updates"
+msgstr "AtualizaƧƵes"
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr "Esta Ʃ uma Ɣrea restrita: apenas usuƔrios autorizados podem gerenciar este Jappix."
+
+msgid "Please use the form below to login to the administration panel."
+msgstr "Utilize o formulĆ”rio abaixo para acessar o painel de administraĆ§Ć£o."
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr "Para melhorar a seguranƧa, as seƧƵes sĆ£o limitadas em tempo, e, quando seu navegador for fechado, vocĆŖ serĆ” desconectado."
+
+msgid "Credentials"
+msgstr "Credenciais"
+
+msgid "You have been logged out. Goodbye!"
+msgstr "VocĆŖ foi desconectado. Tchau!"
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr "Opps, vocĆŖ nĆ£o foi reconhecido como um administrador vĆ”lido. Verifique suas credenciais!"
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr "EstatĆsticas bĆ”sicas sobre coisas importantes sĆ£o processadas pelo Jappix, vocĆŖ pode encontra-las abaixo."
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr "Altere as configuraƧƵes do Jappix com esta ferramenta."
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr "Altere os endereƧos XMPP que este Jappix fornece com esta ferramenta."
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr "Todos os arquivos armazenados por esse Jappix podem ser gerenciados com esta ferramenta: selecione uma sub-pasta e comece a editar seu conteĆŗdo!"
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr "Jappix Ć© totalmente customizĆ”vel: vocĆŖ pode alterar seu design bem aqui."
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr "Esta nĆ£o Ć© uma imagem vĆ”lida, use somente PNG, GIF ou JPG!"
+
+msgid "The image could not be received, would you mind retry?"
+msgstr "A imagem nĆ£o pĆ“de ser recebida, se importa de enviar novamente?"
+
+msgid "Your image was added to the list!"
+msgstr "A sua imagem foi adicionada Ć lista!"
+
+msgid "Changes saved!"
+msgstr "AlteraƧƵes salvas!"
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr "VocĆŖ pode definir mais de um administrador para este Jappix. VocĆŖ tambĆ©m pode alterar uma senha com essa ferramenta. "
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr "Atualize seu Jappix com essa ferramenta ou cheque se hĆ” atualizaƧƵes. InformaƧƵes sobre novas versƵes serĆ£o mostradas (em inglĆŖs)."
+
+msgid "Access statistics"
+msgstr "EstatĆsticas de acesso"
+
+msgid "Share statistics"
+msgstr "EstatĆsticas de compartilhamento"
+
+msgid "Other statistics"
+msgstr "Outras estatĆsticas"
+
+msgid "January"
+msgstr "Janeiro"
+
+msgid "February"
+msgstr "Fevereiro"
+
+msgid "March"
+msgstr "MarƧo"
+
+msgid "April"
+msgstr "Abril"
+
+msgid "May"
+msgstr "Maio"
+
+msgid "June"
+msgstr "Junho"
+
+msgid "July"
+msgstr "Julho"
+
+msgid "August"
+msgstr "Agosto"
+
+msgid "September"
+msgstr "Setembro"
+
+msgid "October"
+msgstr "Outubro"
+
+msgid "November"
+msgstr "Novembro"
+
+msgid "December"
+msgstr "Dezembro"
+
+msgid "Monday"
+msgstr "Segunda-feira"
+
+msgid "Tuesday"
+msgstr "TerƧa-feira"
+
+msgid "Wednesday"
+msgstr "Quarta-feira"
+
+msgid "Thursday"
+msgstr "Quinta-feira"
+
+msgid "Friday"
+msgstr "Sexta-feira"
+
+msgid "Saturday"
+msgstr "SƔbado"
+
+msgid "Sunday"
+msgstr "Domingo"
+
+msgid "Total"
+msgstr "Total"
+
+msgid "Cache"
+msgstr "Cache"
+
+msgid "Logs"
+msgstr "Logs"
+
+msgid "Music"
+msgstr "MĆŗsica"
+
+msgid "Backgrounds"
+msgstr "PapƩis de parede"
+
+msgid "Share"
+msgstr "Compartilhar"
+
+msgid "Background"
+msgstr "Papel de parede"
+
+msgid "Notice"
+msgstr "Aviso"
+
+msgid "Your design preferences have been saved!"
+msgstr "Suas preferĆŖncias de design foram salvas!"
+
+msgid "Please check your inputs: something is missing!"
+msgstr "Cheque suas entradas: alguma coisa estĆ” faltando!"
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr "Altere o papel de parede do seu Jappix. VocĆŖ tambĆ©m pode inserir uma cor ou enviar uma imagem. Deixe sua criatividade fluir!"
+
+msgid "Use default background"
+msgstr "Usar papel de parede padrĆ£o"
+
+msgid "Use your own image"
+msgstr "Usar sua prĆ³pria imagem"
+
+msgid "Select a background to use and change the display options."
+msgstr "Selecione um papel de parede e altere as opƧƵes de exibiĆ§Ć£o."
+
+msgid "Use your own color"
+msgstr "Usar sua prĆ³pria cor"
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr "Digite cĆ³digo hexadecimal da cor deseja para usar como papel de parede."
+
+msgid "Manage backgrounds"
+msgstr "Gerenciar papƩis de parede"
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr "VocĆŖ pode adicionar um novo papel de parede para a lista com essa ferramenta. Envie uma imagem vĆ”lida."
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr "Se vocĆŖ quiser remover alguma imagem, use o navegador abaixo."
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr "Defina um aviso na tela inicial para todos os usuĆ”rios, como uma mensagem importante ou uma advertĆŖncia."
+
+msgid "Simple notice"
+msgstr "Aviso simples"
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr "Esse aviso precisa apenas de texto simple para aparecer, nenhum cĆ³digo Ć© permitido!"
+
+msgid "Advanced notice"
+msgstr "Aviso avanƧado"
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr "VocĆŖ pode customizar seu aviso com cĆ³digo HTML, CSS e Javascript."
+
+msgid "Available updates"
+msgstr "AtualizaƧƵes disponĆveis."
+
+msgid "What's new?"
+msgstr "O que hĆ” de novo?"
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr "Suas pastas de armazenamento nĆ£o estĆ£o com permissĆ£o de escrita, aplique as permissƵes!"
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr "%1s pode estar causando problemas com o proxy, aumente o valor de %2s para %3s!"
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr "VocĆŖ estĆ” utilizando uma versĆ£o de desenvolvimento do Jappix. Atualize-a atravĆ©s do nosso repositĆ³rio executando: %s."
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr "Uma nova atualizaĆ§Ć£o do Jappix estĆ” disponĆvel! Cheque o que hĆ” de novo e execute a atualizaĆ§Ć£o!"
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr "Sua versĆ£o estĆ” desatualizada. Atualiza agora para %s clicando aqui!"
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr "Sua versĆ£o parece estar atualizada, mas vocĆŖ pode checar atualizaƧƵes manualmente clicando aqui."
+
+msgid "Check for updates"
+msgstr "Checar por atualizaƧƵes"
+
+msgid "Update in progress"
+msgstr "AtualizaĆ§Ć£o em progresso"
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr "Jappix foi atualizado: vocĆŖ agora estĆ” rodando a Ćŗltima versĆ£o. Aproveite!"
+
+msgid "The update has failed! Please try again later."
+msgstr "A atualizaĆ§Ć£o falhou! Tente novamente depois."
+
+msgid "Downloading package..."
+msgstr "Baixando pacote..."
+
+msgid "Removing current Jappix system files..."
+msgstr "Removendo atuais arquivos de sistema do Jappix..."
+
+msgid "Extracting package..."
+msgstr "Extraindo pacote..."
+
+msgid "Regenerating storage folder tree..."
+msgstr "Regerando Ɣrvore de pastas de armazenamento..."
+
+msgid "Jappix is now up to date!"
+msgstr "Jappix agora estĆ” atualizado!"
+
+msgid "Aborted: socket error!"
+msgstr "Abortado: erro de soquete!"
+
+msgid "Aborted: buffer error!"
+msgstr "Abortado: erro de buffer!"
+
+msgid "Aborted: everything is not writable!"
+msgstr "Abortado: tudo sem permissĆ£o de escrita!"
+
+msgid "Aborted: could not extract the package!"
+msgstr "Abortado: nĆ£o foi possĆvel extrair o pacote!"
+
+msgid "Visits"
+msgstr "Visitas"
+
+msgid "Daily"
+msgstr "Diariamente"
+
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgid "Monthly"
+msgstr "Mensalmente"
+
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgid "Size"
+msgstr "Tamanho"
+
+msgid "Clean everything"
+msgstr "Apagar tudo"
+
+msgid "Purge cache"
+msgstr "Eliminar cache"
+
+msgid "Purge logs"
+msgstr "Eliminar logs"
+
+msgid "Purge updates"
+msgstr "Eliminar atualizaƧƵes"
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr "A pasta de armazenamento foi esvaziada!"
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr "Mantenha seu Jappix limpo e rƔpido, apague as pastas de armazenamento regularmente!"
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr "Envie suas mĆŗsicas (Ogg Vorbis, MP3 ou WAV) para ouvi-las no Jappix!"
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr "O arquivo que vocĆŖ quer enviar deve ser menor do que %s."
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr "Fique sabendo o que os seus usuĆ”rios armazenam em seu servidor e remova os conteĆŗdos indesejados."
+
+msgid "Title"
+msgstr "TĆtulo"
+
+msgid "Artist"
+msgstr "Artistas"
+
+msgid "Album"
+msgstr "Ćlbum"
+
+msgid "File"
+msgstr "Arquivo"
+
+msgid "Upload"
+msgstr "Envio"
+
+msgid "The folder is empty."
+msgstr "A pasta estĆ” vazia."
+
+msgid "The music could not be received, please retry!"
+msgstr "A mĆŗsica nĆ£o pĆ“de ser recebida, tente novamente!"
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr "Esse nĆ£o Ć© um arquivo de mĆŗsica vĆ”lido, envie apenas Ogg Vorbis, MP3 ou WAV!"
+
+msgid "Your music has been added!"
+msgstr "Sua mĆŗsica foi adicionada!"
+
+msgid "The selected elements have been removed."
+msgstr "Os elementos selecionados foram removidos."
+
+msgid "You must select elements to remove!"
+msgstr "VocĆŖ precisa selecionar os elementos para remover!"
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr "Adicione um novo usuĆ”rio ou troque uma senha (digite o nome de um usuĆ”rio), com esta ferramenta. Envie uma senha difĆcil!"
+
+msgid "Manage"
+msgstr "Gerenciar"
+
+msgid "List"
+msgstr "Lista"
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr "Remova usuĆ”rios com esta ferramenta. VocĆŖ nĆ£o pode remover um usuĆ”rio caso ele seja o Ćŗnico."
+
+msgid "The user has been added!"
+msgstr "O usuƔrio foi adicionado!"
+
+msgid "The chosen users have been removed."
+msgstr "O usuƔrio selecionado foi removido."
+
+msgid "You must select one or more users to be removed!"
+msgstr "VocĆŖ precisa selecionar um ou mais usuĆ”rios para remover!"
+
+msgid "Yesterday"
+msgstr "Ontem"
+
+msgid "%s days ago"
+msgstr "%s dias atrƔs"
+
+msgid "User currently active"
+msgstr "UsuƔrio ativo"
+
+msgid "Last seen: %s"
+msgstr "Visto em: %s"
+
+msgid "Inactive since: %s"
+msgstr "Inativo desde: %s"
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr "Seu amigo parece nĆ£o ter recebido sua(s) mensagem(ns)!"
+
+msgid "Static content server"
+msgstr "Servidor de conteĆŗdo estĆ”tico"
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr "Esse Ć© o servidor de conteĆŗdo estĆ”tico para %1s, ā%2sā."
+
+msgid "Suggested friends"
+msgstr "Amigos sugeridos"
+
+msgid "Check all"
+msgstr "Marcar todos"
+
+msgid "Uncheck all"
+msgstr "Desmarcar todos"
+
+msgid "Choose"
+msgstr "Escolher"
+
+msgid "List name"
+msgstr "Nome da lista"
+
+msgid "Allow"
+msgstr "Permitir"
+
+msgid "Deny"
+msgstr "Recusar"
+
+msgid "Group"
+msgstr "Grupo"
+
+msgid "Subscription"
+msgstr "SubscriĆ§Ć£o"
+
+msgid "Both"
+msgstr "Ambos"
+
+msgid "From"
+msgstr "De"
+
+msgid "Everybody"
+msgstr "Todo mundo"
+
+msgid "Send messages"
+msgstr "Enviar mensagens"
+
+msgid "Send queries"
+msgstr "Enviar consultas"
+
+msgid "See my status"
+msgstr "Ver meu status"
+
+msgid "Send his/her status"
+msgstr "Enviar status dele/dela"
+
+msgid "Everything"
+msgstr "Tudo"
+
+msgid "Item"
+msgstr "Item"
+
+msgid "Order"
+msgstr "Ordem"
+
+msgid "Active for this session"
+msgstr "Ativos nessa sessĆ£o"
+
+msgid "Always active"
+msgstr "Sempre ativo"
+
+msgid "User directory"
+msgstr "DiretĆ³rio de usuĆ”rio"
+
+msgid "Search a friend"
+msgstr "Procurar um amigo"
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr "A ferramenta solicitada nĆ£o estĆ” implementada pelo servidor e por isso nĆ£o pode ser processada."
+
+msgid "This is a repeat from %s"
+msgstr "Essa Ć© uma repetiĆ§Ć£o de %s"
+
+msgid "Loading comments..."
+msgstr "Carregando comentƔrios..."
+
+msgid "Type your comment here..."
+msgstr "Escreva seu comentƔrio aqui..."
+
+msgid "Could not get the comments!"
+msgstr "NĆ£o foi possĆvel buscar os comentĆ”rios!"
+
+msgid "Show comments"
+msgstr "Mostrar comentƔrios"
+
+msgid "Send him/her a message"
+msgstr "Envie uma mensagem para ele/ela"
+
+msgid "Start a chat with him/her"
+msgstr "Comece um chat com ele/ela"
+
+msgid "Media integration"
+msgstr "IntegraĆ§Ć£o de media"
+
+msgid "Comments locked!"
+msgstr "ComentƔrios bloqueados!"
+
+msgid "Type something you want to share with your friends..."
+msgstr "Escreva algo que vocĆŖ queira compartilhar com seus amigos..."
+
+msgid "changed his/her nickname to %s"
+msgstr "Alterado o apelido dele/dela para %s"
+
+msgid "commented an item you follow: ā%sā."
+msgstr "Comentado um Ćtem que vocĆŖ segue: ā%sā."
+
+msgid "Hide"
+msgstr "Esconder"
+
+msgid "liked your post: ā%sā."
+msgstr "Gostou do seu post: ā%sā."
+
+msgid "quoted you somewhere: ā%sā."
+msgstr "Mencionou vocĆŖ em algum lugar: ā%sā."
+
+msgid "published on your wall: ā%sā."
+msgstr "publicou em seu mural: ā%sā."
+
+msgid "tagged you in a photo (%s)."
+msgstr "marcou vocĆŖ numa foto (%s)."
+
+msgid "tagged you in a video (%s)."
+msgstr "marcou vocĆŖ em um vĆdeo (%s)."
+
+msgid "Show"
+msgstr "Mostrar"
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr "Precisa de ajuda? Ć melhor vocĆŖ ler nossa pĆ”gina de documentaĆ§Ć£o sobre como preencher este formulĆ”rio!"
+
+msgid "Pubsub host"
+msgstr "EndereƧo Pubsub"
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr "Jappix Ć© uma Ć³tima plataforma social que vocĆŖ pode acessar de onde estiver, quando quiser e comunicar-se com quem quiser."
+
+msgid "Manager link"
+msgstr "Link do gerenciador"
+
+msgid "User uploads server"
+msgstr "Servidor de envio dos usuƔrios"
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr "Esse Ć© o servidor de envio dos usuĆ”rios para %1s, ā%2sā."
+
+msgid "Logo"
+msgstr "Logo"
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr "VocĆŖ pode definir sua prĆ³pria logo no lugar da padrĆ£o. Tome cuidado com o tamanho e as cores de cada logo!"
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr "Envie cada logo do tamanho de pixels recomendado."
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr "Esta nĆ£o Ć© uma imagem vĆ”lida, envie somente no formato PNG!"
+
+msgid "Your service logo has been successfully changed!"
+msgstr "Sua logo foi alterada com sucesso!"
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr "O formato da sua logo deve ser PNG. Deixe o campo em branco que a logo nĆ£o serĆ” alterada."
+
+msgid "Remove this logo"
+msgstr "Remover essa logo"
+
+msgid "View this logo"
+msgstr "Visualizar essa logo"
+
+msgid "Send a file"
+msgstr "Enviar um arquivo"
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr "Quando enviado seu amigo serĆ” avisado para baixar o arquivo."
+
+msgid "Groupchats to join"
+msgstr "Grupos de chat para entrar"
+
+msgid "Purge sent files"
+msgstr "Eliminar arquivos enviados"
+
+msgid "would like to send you a file: ā%sā."
+msgstr "gostaria de te enviar um arquivo: ā%sā."
+
+msgid "has accepted to received your file: ā%sā."
+msgstr "aceitou receber seu arquivo: ā%sā."
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr "negou receber seu arquivo: ā%sā."
+
+msgid "could not receive your file: ā%sā."
+msgstr "nĆ£o conseguiu receber seu arquivo: ā%sā."
+
+msgid "has received a file exchange request: ā%sā."
+msgstr "recebeu uma solicitaĆ§Ć£o de troca de arquivos: ā%sā."
+
+msgid "Available shortcuts:"
+msgstr "Atalhos disponĆveis"
+
+msgid "%s removes the chat logs"
+msgstr "%s remove os logs de chat"
+
+msgid "%s joins a groupchat"
+msgstr "%s entra em um grupo de chat"
+
+msgid "%s closes the chat"
+msgstr "%s fecha o chat"
+
+msgid "%s shows the user profile"
+msgstr "%s mostra o perfil do usuƔrio"
+
+msgid "%s sends a message to the room"
+msgstr "%s envia uma mensagem para a sala"
+
+msgid "%s changes your nickname"
+msgstr "%s altera seu apelido"
+
+msgid "%s sends a message to someone in the room"
+msgstr "%s envia uma mensagem para alguƩm na sala"
+
+msgid "%s changes the room topic"
+msgstr "%s altera o tĆ³pico da sala"
+
+msgid "%s kicks an user of the room"
+msgstr "%s chuta um usuƔrio da sala"
+
+msgid "%s bans an user of the room"
+msgstr "%s bane um usuƔrio da sala"
+
+msgid "%s invites someone to join the room"
+msgstr "%s convida alguƩm para entrar na sala"
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr ""
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# Russian translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:47+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "JavaScript Š¾ŃŠŗŠ»ŃŃŠµŠ½ Š² Š²Š°ŃŠµŠ¼ Š±ŃŠ°ŃŠ·ŠµŃŠµ, Š±ŠµŠ· Š½ŠµŠ³Š¾ Jappix Š½Šµ Š¼Š¾Š¶ŠµŃ ŃŠ°Š±Š¾ŃŠ°ŃŃ!"
+
+msgid "An open social network"
+msgstr "ŠŃŠŗŃŃŃŠ°Ń ŃŠ¾ŃŠøŠ°Š»ŃŠ½Š°Ń ŃŠµŃŃ"
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "Š Š°Š±Š¾ŃŠ° Ń Jappix ŠæŃŠµŃŠ²Š°Š½Š° ŠøŠ·-Š·Š° ŠæŃŠ¾Š±Š»ŠµŠ¼ ŃŠ¾ ŃŠ²ŃŠ·ŃŃ, Š¾ŃŠøŠ±ŠŗŠø ŠøŠ»Šø Š½ŠµŠ²ŠµŃŠ½ŃŃ
ŃŠµŠ³ŠøŃŃŃŠ°ŃŠøŠ¾Š½Š½ŃŃ
Š“Š°Š½Š½ŃŃ
(ŠæŃŠ¾Š²ŠµŃŃŃŠµ ŠøŠ¼Ń Šø ŠæŠ°ŃŠ¾Š»Ń), ŠæŃŠ¾ŃŠøŠ¼ ŠæŃŠ¾ŃŠµŠ½ŠøŃ Š·Š° Š½ŠµŃŠ“Š¾Š±ŃŃŠ²Š°."
+
+msgid "The element list on this server could not be obtained!"
+msgstr "ŠŠµŠ²Š¾Š·Š¼Š¾Š¶Š½Š¾ ŠæŠ¾Š»ŃŃŠøŃŃ ŃŠæŠøŃŠŗŠ¾Šŗ ŃŠ¾Š“ŠµŃŠ¶ŠøŠ¼Š¾Š³Š¾ ŃŃŠ¾Š³Š¾ ŃŠµŃŠ²ŠµŃŠ°."
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "ŠŠ°ŃŠ¾Š»Ń ŠøŠ·Š¼ŠµŠ½ŠµŠ½. ŠŃ Š¼Š¾Š¶ŠµŃŠµ Š²Š¾Š¹ŃŠø Ń Š½Š¾Š²ŃŠ¼ ŠæŠ°ŃŠ¾Š»ŠµŠ¼."
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "ŠŠ°Ń XMPP Š°ŠŗŠŗŠ°ŃŠ½Ń Š±ŃŠ» ŃŠ“Š°Š»ŠµŠ½, Š“Š¾ ŃŠŗŠ¾ŃŠ¾Š¹ Š²ŃŃŃŠµŃŠø!"
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "ŠŃ ŠæŠ¾ŠŗŠøŠ½ŃŠ»Šø ŃŠ²Š¾Ń ŃŃŠµŃŠ½ŃŃ Š·Š°ŠæŠøŃŃ XMPP, ŃŠ“Š°ŃŠ½Š¾Š³Š¾ Š“Š½Ń!"
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "ŠŃ ŠæŃŃŠ°ŠµŃŠµŃŃ Š²Š¾Š¹ŃŠø Š² Š½ŠµŃŃŃŠµŃŃŠ²ŃŃŃŃŃ ŠŗŠ¾Š¼Š½Š°ŃŃ. ŠŠ¾Š¶Š½Š¾ ŠæŠ¾ŠæŃŃŠ°ŃŃŃŃ ŃŠ¾Š·Š“Š°ŃŃ ŠµŃ!"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "ŠŠ¾Š¼Š½Š°ŃŠ° Š±ŃŠ»Š° ŃŠ“Š°Š»ŠµŠ½Š°, ŃŠµŠæŠµŃŃ ŠŗŃŠ¾-ŃŠ¾ Š“ŃŃŠ³Š¾Š¹ ŃŠ¼Š¾Š¶ŠµŃ ŃŠ¾Š·Š“Š°ŃŃ ŠµŃ ŠµŃŃ ŃŠ°Š·."
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "ŠŃŠ¶Š½Š¾Š³Š¾ Š²Š°Š¼ ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń Š·Š“ŠµŃŃ Š½ŠµŃ."
+
+msgid "Please enter the group chat address to join."
+msgstr "ŠŠ¾Š¶Š°Š»ŃŠ¹ŃŃŠ°, Š²Š²ŠµŠ“ŠøŃŠµ Š°Š“ŃŠµŃ Š³ŃŃŠæŠæŠ¾Š²Š¾Š³Š¾ ŃŠ°ŃŠ° ŃŃŠ¾Š± ŠæŃŠøŃŠ¾ŠµŠ“ŠøŠ½ŠøŃŃŃŃ."
+
+msgid "Please enter your nickname to join %s."
+msgstr "ŠŠ²ŠµŠ“ŠøŃŠµ ŃŠ²Š¾Šµ ŠæŃŠ¾Š·Š²ŠøŃŠµ, ŃŃŠ¾Š±Ń ŠæŃŠøŃŠ¾ŠµŠ“ŠøŠ½ŠøŃŃŃŃ Šŗ %s."
+
+msgid "This room (%s) is protected with a password."
+msgstr "ŠŠ¾Š¼Š½Š°ŃŠ° (%s) Š·Š°ŃŠøŃŠµŠ½Š° ŠæŠ°ŃŠ¾Š»ŠµŠ¼."
+
+msgid "Your browser is out of date!"
+msgstr "ŠŠ°Ń Š±ŃŠ°ŃŠ·ŠµŃ ŃŃŃŠ°ŃŠµŠ», ŠæŠ¾Š¶Š°Š»ŃŠ¹ŃŃŠ° Š¾Š±Š½Š¾Š²ŠøŃŠµ!"
+
+msgid "Last %s version is better!"
+msgstr "Š”Š²ŠµŠ¶Š°Ń Š²ŠµŃŃŠøŃ %s - Š»ŃŃŃŠµ!"
+
+msgid "Login"
+msgstr "ŠŠ¾Š¹ŃŠø"
+
+msgid "Register"
+msgstr "Š ŠµŠ³ŠøŃŃŃŠ°ŃŠøŃ"
+
+msgid "Here we go!"
+msgstr "ŠŠ¾ŠµŃ
Š°Š»Šø!"
+
+msgid "Server"
+msgstr "Š”ŠµŃŠ²ŠµŃ"
+
+msgid "Password"
+msgstr "ŠŠ°ŃŠ¾Š»Ń"
+
+msgid "Remember me"
+msgstr "ŠŠ°ŠæŠ¾Š¼Š½ŠøŃŃ Š¼ŠµŠ½Ń"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "ŠŃŠ¾Ń ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½Ń Š±ŃŠ» Š·Š°Š±Š»Š¾ŠŗŠøŃŠ¾Š²Š°Š½, Š²Ń Š½Šµ Š¼Š¾Š¶ŠµŃŠµ ŠµŠ³Š¾ ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŃ!"
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "ŠŠ·-Š·Š° Š½ŠµŠæŠ¾Š»Š°Š“Š¾Šŗ Š² ŃŠµŃŠø Š²Ń ŃŠ°Š·ŃŠµŠ“ŠøŠ½ŠøŠ»ŠøŃŃ. Š§ŃŠ¾ ŃŠµŠæŠµŃŃ Ń
Š¾ŃŠøŃŠµ ŃŠ“ŠµŠ»Š°ŃŃ?"
+
+msgid "Reconnect"
+msgstr "ŠŠµŃŠµŠæŠ¾Š“ŠŗŠ»ŃŃŠµŠ½ŠøŠµ"
+
+msgid "Messages"
+msgstr "Š”Š¾Š¾Š±ŃŠµŠ½ŠøŃ"
+
+msgid "Profile"
+msgstr "ŠŃŠ¾ŃŠøŠ»Ń"
+
+msgid "Options"
+msgstr "ŠŠ°ŃŃŃŠ¾Š¹ŠŗŠø"
+
+msgid "Disconnect"
+msgstr "ŠŃŃ
Š¾Š“"
+
+msgid "Filter"
+msgstr "Š¤ŠøŠ»ŃŃŃ"
+
+msgid "Add a friend"
+msgstr "ŠŠ¾Š±Š°Š²ŠøŃŃ Š“ŃŃŠ³Š°"
+
+msgid "Your groupchats"
+msgstr "ŠŠ°ŃŠ° Š³ŃŃŠæŠæŠ°"
+
+msgid "Manage your favorite groupchats"
+msgstr "Š£ŠæŃŠ°Š²Š»ŃŃŃ ŃŠæŠøŃŠŗŠ¾Š¼ ŠŠ°ŃŠøŃ
Š»ŃŠ±ŠøŠ¼ŃŃ
ŠŗŠ¾Š¼Š½Š°Ń."
+
+msgid "More stuff"
+msgstr "ŠŠ¾ŠæŠ¾Š»Š½ŠøŃŠµŠ»ŃŠ½Š¾"
+
+msgid "Show all friends"
+msgstr "ŠŠ¾ŠŗŠ°Š·Š°ŃŃ Š²ŃŠµŃ
"
+
+msgid "Only show connected friends"
+msgstr "ŠŠ¾ŠŗŠ°Š·Š°ŃŃ Š»ŠøŃŃ ŠæŠ¾Š“ŠŗŠ»ŃŃŠµŠ½Š½ŃŃ
"
+
+msgid "Message archives"
+msgstr "ŠŃŃ
ŠøŠ² ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŠ¹"
+
+msgid "Date"
+msgstr "ŠŠ°ŃŠ°"
+
+msgid "Please select a friend to view the chat history."
+msgstr "ŠŃŠ±ŠµŃŠøŃŠµ ŠøŃŃŠ¾ŃŠøŃ Š¾Š±ŃŠµŠ½ŠøŃ Ń ŠŗŠµŠ¼ Ń
Š¾ŃŠøŃŠµ ŃŠ²ŠøŠ“ŠµŃŃ."
+
+msgid "Nothing found for: %s"
+msgstr "ŠŠ»Ń %s Š½ŠøŃŠµŠ³Š¾ Š½Šµ Š½Š°Š¹Š“ŠµŠ½Š¾"
+
+msgid "A short message?"
+msgstr "Š”ŃŠ°ŃŃŃŠ½Š¾Šµ ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŠµ?"
+
+msgid "How are you?"
+msgstr "ŠŠ°Šŗ Š“ŠµŠ»Š°?"
+
+msgid "What are you doing?"
+msgstr "Š§ŠµŠ¼ Š²Ń ŃŠµŠ¹ŃŠ°Ń Š·Š°Š½ŃŃŃ?"
+
+msgid "Join a chat"
+msgstr "ŠŠ¾Š³Š¾Š²Š¾ŃŠøŃŃ"
+
+msgid "Status"
+msgstr "Š”Š¾ŃŃŠ¾ŃŠ½ŠøŠµ"
+
+msgid "Available"
+msgstr "ŠŠ¾ŃŃŃŠæŠµŠ½"
+
+msgid "Talkative"
+msgstr "ŠŠ¾ŃŠ¾Š² ŠæŠ¾Š±Š¾Š»ŃŠ°ŃŃ"
+
+msgid "Away"
+msgstr "ŠŃŠ¾ŃŠµŠ»"
+
+msgid "Not available"
+msgstr "ŠŠµŠ“Š¾ŃŃŃŠæŠµŠ½"
+
+msgid "Busy"
+msgstr "ŠŠ°Š½ŃŃ"
+
+msgid "Mood"
+msgstr "ŠŠ°ŃŃŃŠ¾ŠµŠ½ŠøŠµ"
+
+msgid "None"
+msgstr "ŠŠøŃŠµŠ³Š¾"
+
+msgid "Crazy"
+msgstr "Š”ŃŠ¼Š°ŃŃŠµŠ“ŃŠøŠ¹"
+
+msgid "Excited"
+msgstr "ŠŠ·Š²Š¾Š»Š½Š¾Š²Š°Š½Š½ŃŠ¹"
+
+msgid "Playful"
+msgstr "ŠŠ³ŃŠøŠ²ŃŠ¹"
+
+msgid "Happy"
+msgstr "Š”ŃŠ°ŃŃŠ»ŠøŠ²ŃŠ¹"
+
+msgid "Shocked"
+msgstr "ŠØŠ¾ŠŗŠøŃŠ¾Š²Š°Š½"
+
+msgid "Hot"
+msgstr "Š”ŃŃŠ°ŃŃŠ½ŃŠ¹"
+
+msgid "Sad"
+msgstr "ŠŃŃŃŃŠ½ŃŠ¹"
+
+msgid "Amorous"
+msgstr "ŠŠ»ŃŠ±Š»ŃŠ½Š½ŃŠ¹"
+
+msgid "Confident"
+msgstr "Š”Š°Š¼Š¾ŃŠ²ŠµŃŠµŠ½Š½ŃŠ¹"
+
+msgid "Activity"
+msgstr "ŠŠµŃŃŠµŠ»ŃŠ½Š¾ŃŃŃ"
+
+msgid "Chores"
+msgstr "ŠŠµŠ»Š° Š“Š¾Š¼Š°ŃŠ½ŠøŠµ"
+
+msgid "Drinking"
+msgstr "ŠŃŃ"
+
+msgid "Eating"
+msgstr "ŠŃŃŠ°Ń"
+
+msgid "Exercising"
+msgstr "ŠŃŃŃŠµŃŃŠ²Š»ŠµŠ½ŠøŠµ"
+
+msgid "Grooming"
+msgstr "ŠŠ°Š±Š¾ŃŠ°"
+
+msgid "Appointment"
+msgstr "ŠŠ¾Š»Š¶Š½Š¾ŃŃŃ"
+
+msgid "Inactive"
+msgstr "ŠŠµŠ°ŠŗŃŠøŠ²Š½ŃŠ¹"
+
+msgid "Relaxing"
+msgstr "Š Š°ŃŃŠ»Š°Š±Š»ŃŃŃŃ"
+
+msgid "Talking"
+msgstr "ŠŠ¾Š»ŃŠ°Ń"
+
+msgid "Traveling"
+msgstr "ŠŃŃŠµŃŠµŃŃŠ²ŃŃ"
+
+msgid "Working"
+msgstr "Š Š°Š±Š¾ŃŠ°Ń"
+
+msgid "View profile"
+msgstr "ŠŠ¾ŠŗŠ°Š·Š°ŃŃ ŠæŃŠ¾ŃŠøŠ»Ń"
+
+msgid "Repeat this notice"
+msgstr "ŠŠ¾Š²ŃŠ¾ŃŠøŃŃ ŃŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŠµ"
+
+msgid "Remove this notice"
+msgstr "Š£Š“Š°Š»ŠøŃŃ ŃŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŠµ"
+
+msgid "Your profile"
+msgstr "ŠŠ°Ń ŠæŃŠ¾ŃŠøŠ»Ń"
+
+msgid "Identity"
+msgstr "ŠŠ¾Š“Š»ŠøŠ½Š½Š¾ŃŃŃ"
+
+msgid "Profile image"
+msgstr "ŠŠ²Š°ŃŠ°Ń"
+
+msgid "Others"
+msgstr "ŠŃŃŠ³ŠøŠµ"
+
+msgid "Personal"
+msgstr "ŠŠµŃŃŠ¾Š½Š°Š»ŃŠ½ŃŠµ Š“Š°Š½Š½ŃŠµ"
+
+msgid "Complete name"
+msgstr "ŠŠ¾Š»Š½Š¾Šµ ŠøŠ¼Ń"
+
+msgid "Nickname"
+msgstr "ŠŃŠµŠ²Š“Š¾Š½ŠøŠ¼"
+
+msgid "First name"
+msgstr "ŠŠ¼Ń"
+
+msgid "Last name"
+msgstr "Š¤Š°Š¼ŠøŠ»ŠøŃ"
+
+msgid "Date of birth"
+msgstr "ŠŠ°ŃŠ° ŃŠ¾Š¶Š“ŠµŠ½ŠøŃ"
+
+msgid "Contact"
+msgstr "ŠŠ¾Š½ŃŠ°ŠŗŃ"
+
+msgid "E-mail"
+msgstr "E-mail"
+
+msgid "Phone"
+msgstr "Š¢ŠµŠ»ŠµŃŠ¾Š½"
+
+msgid "Website"
+msgstr "ŠŠµŠ±-ŃŠ°Š¹Ń"
+
+msgid "Current"
+msgstr "Š¢ŠµŠŗŃŃŠøŠ¹"
+
+msgid "Delete"
+msgstr "Š£Š“Š°Š»ŠøŃŃ"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "ŠŠ°ŠŗŠ°Ń Š¶Š°Š»Š¾ŃŃŃ! Š£ Š²Š°Ń Š½ŠµŃ Š°Š²Š°ŃŠ°ŃŠ°"
+
+msgid "Address"
+msgstr "ŠŠ“ŃŠµŃ"
+
+msgid "Street"
+msgstr "Š£Š»ŠøŃŠ°"
+
+msgid "City"
+msgstr "ŠŠ¾ŃŠ¾Š“"
+
+msgid "Postal code"
+msgstr "ŠŠ½Š“ŠµŠŗŃ"
+
+msgid "Country"
+msgstr "Š”ŃŃŠ°Š½Š°"
+
+msgid "Biography"
+msgstr "ŠŠøŠ¾Š³ŃŠ°ŃŠøŃ"
+
+msgid "Important notice"
+msgstr "ŠŠ°Š¶Š½Š¾Šµ ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŠµ"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr "ŠŃŠ“ŃŃŠµ Š¾ŃŃŠ¾ŃŠ¾Š¶Š½Ń Ń ŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŠµŠ¹ ŠŗŠ¾ŃŠ¾ŃŃŃ Š²Ń ŠæŠøŃŠµŃŠµ Š² Š²Š°ŃŠµŠ¼ ŠæŃŠ¾ŃŠøŠ»Šµ, ŠæŠ¾ŃŠ¾Š¼Ń ŃŃŠ¾ ŃŃŠ¾ Š“Š¾ŃŃŃŠæŠ½Š¾ ŠŗŠ°Š¶Š“Š¾Š¼Ń."
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr "ŠŠµ Š²ŃŃ ŠøŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŃ ŠæŃŠøŠ²Š°ŃŠ½Š° Š½Š° XMPP, Š¾Š“Š½Š° ŠøŠ· ŃŠµŃ
Š²ŠµŃŠµŠ¹ - Š²Š°Ń ŠæŃŠ¾ŃŠøŠ»Ń."
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr ""
+
+msgid "Save"
+msgstr "Š”Š¾Ń
ŃŠ°Š½ŠøŃŃ"
+
+msgid "Cancel"
+msgstr "ŠŃŠ¼ŠµŠ½Š°"
+
+msgid "Edit options"
+msgstr "Š ŠµŠ“Š°ŠŗŃŠøŃŠ¾Š²Š°ŃŃ Š½Š°ŃŃŃŠ¾Š¹ŠŗŠø"
+
+msgid "Channel"
+msgstr "ŠŠ°Š½Š°Š»"
+
+msgid "Commands"
+msgstr "ŠŠ¾Š¼Š¼Š°Š½Š“Ń"
+
+msgid "Sounds"
+msgstr "ŠŠ²ŃŠŗŠø"
+
+msgid "Privacy"
+msgstr "ŠŃŠøŠ²Š°ŃŠ½Š¾ŃŃŃ"
+
+msgid "Message archiving"
+msgstr "ŠŃŃ
ŠøŠ² ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŠ¹"
+
+msgid "Store a history of your chats"
+msgstr "Š”Š¾Ń
ŃŠ°Š½ŃŃŃ ŠøŃŃŠ¾ŃŠøŃ ŃŠ°Š·Š³Š¾Š²Š¾ŃŠ¾Š²"
+
+msgid "Geolocation"
+msgstr "ŠŠµŃŃŠ¾ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµ"
+
+msgid "Empty"
+msgstr "ŠŃŠ²Š¾Š±Š¾Š“ŠøŃŃ"
+
+msgid "Empty channel"
+msgstr "ŠŃŃŃŠ°Ń ŠŗŠ¾Š½ŃŠµŃŠµŠ½ŃŠøŃ"
+
+msgid "Persistent"
+msgstr "ŠŠ¾ŃŃŠ¾ŃŠ½Š½ŃŠ¹"
+
+msgid "Maximum notices"
+msgstr "ŠŠ°ŠŗŃŠøŠ¼Š°Š»ŃŠ½Š¾Šµ ŃŠøŃŠ»Š¾ ŃŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŠ¹"
+
+msgid "Account"
+msgstr "Š£ŃŠµŃŠ½Š°Ń Š·Š°ŠæŠøŃŃ"
+
+msgid "Change password"
+msgstr "ŠŠ·Š¼ŠµŠ½ŠøŃŃ ŠæŠ°ŃŠ¾Š»Ń"
+
+msgid "Delete account"
+msgstr "Š£Š“Š°Š»ŠøŃŃ Š°ŠŗŠ°ŃŠ½Ń"
+
+msgid "Old"
+msgstr "Š”ŃŠ°ŃŃŠ¹"
+
+msgid "New (2 times)"
+msgstr "ŠŠ¾Š²ŃŠ¹"
+
+msgid "Continue"
+msgstr "ŠŃŠ¾Š“Š¾Š»Š¶ŠøŃŃ"
+
+msgid "To"
+msgstr "Š"
+
+msgid "Close"
+msgstr "ŠŠ°ŠŗŃŃŃŃ"
+
+msgid "unknown"
+msgstr "Š½ŠµŠøŠ·Š²ŠµŃŃŠ½Š¾"
+
+msgid "Unavailable"
+msgstr "ŠŠµŠ“Š¾ŃŃŃŠæŠµŠ½"
+
+msgid "is now"
+msgstr "Š² Š½Š°ŃŃŠ¾ŃŃŠµŠµ Š²ŃŠµŠ¼Ń"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr "ŠŠ¾Š“Š¾Š¶Š“ŠøŃŠµ, Š°Š²Š°ŃŠ°Ń Š·Š°Š³ŃŃŠ¶Š°ŠµŃŃŃ..."
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "ŠŠ¾Ń Š¾Š½! ŠŠ¾Š²ŃŠ¹ Š°Š²Š°ŃŠ°Ń."
+
+msgid "The image file is not supported or has a bad size."
+msgstr "ŠŃŠ¾Ń ŃŠ°Š¹Š» Š½Šµ ŠæŠ¾Š“Š“ŠµŃŠ¶ŠøŠ²Š°ŠµŃŃŃ ŠøŠ»Šø ŠøŠ¼ŠµŠµŃ ŠæŠ»Š¾Ń
Š¾Š¹ ŃŠ°Š·Š¼ŠµŃ."
+
+msgid "Reply"
+msgstr "ŠŃŠ²ŠµŃŠøŃŃ"
+
+msgid "Error"
+msgstr "ŠŃŠøŠ±ŠŗŠ°"
+
+msgid "Click here to solve the error"
+msgstr "ŠŠ»ŠøŠŗŠ½Šø, ŃŃŠ¾Š± ŃŃŃŃŠ°Š½ŠøŃŃ Š¾ŃŠøŠ±ŠŗŃ"
+
+msgid "You"
+msgstr "Š¢Ń"
+
+msgid "Remove"
+msgstr "Š£Š“Š°Š»ŠøŃŃ"
+
+msgid "Rename"
+msgstr "ŠŠµŃŠµŠøŠ¼ŠµŠ½Š¾Š²Š°ŃŃ"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "ŠŃŠøŠ²ŠµŃ, Ń %s. Š„Š¾ŃŃ Š“Š¾Š±Š°Š²ŠøŃŃ ŃŠµŠ±Ń Š² Š“ŃŃŠ·ŃŃ."
+
+msgid "Smiley insertion"
+msgstr "ŠŠ¾Š±Š°Š²ŠøŃŃ ŃŠ¼Š°Š¹Š»ŠøŠŗ"
+
+msgid "Change style"
+msgstr "ŠŠ·Š¼ŠµŠ½ŠøŃŃ ŃŃŠøŠ»Ń"
+
+msgid "Text in bold"
+msgstr "ŠŠøŃŠ½ŃŠ¹"
+
+msgid "Text in italic"
+msgstr "ŠŃŃŃŠøŠ²"
+
+msgid "Underlined text"
+msgstr "ŠŠ¾Š“ŃŠµŃŠŗŠ½ŃŃŠ¾"
+
+msgid "Save chat"
+msgstr "Š”Š¾Ń
ŃŠ°Š½ŠøŃŃ Š±ŠµŃŠµŠ“Ń"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr "Š©ŠµŠ»ŠŗŠ½ŠøŃŠµ Š½Š° ŃŠ»ŠµŠ“ŃŃŃŠµŠ¹ ŃŃŃŠ»ŠŗŠµ ŃŃŠ¾Š±Ń ŠæŠ¾Š»ŃŃŠøŃŃ Š¶ŃŃŠ½Š°Š» ŃŠ°Š·Š³Š¾Š²Š¾ŃŠ° Šø ŠæŠ¾Š“Š¾Š¶Š“ŠøŃŠµ. ŠŠ¾ŃŠ¾Š¼ Š¾ŠæŃŃŃ ŃŠµŠ»ŠŗŠ½ŠøŃŠµ Š“Š»Ń ŠæŠ¾Š»ŃŃŠµŠ½ŠøŃ ŃŠ°Š¹Š»Š°."
+
+msgid "This chat is empty!"
+msgstr "ŠŃŠ¾Ń ŃŠ°Ń ŠæŃŃŃ!"
+
+msgid "Generate file!"
+msgstr "Š”Š¾Š·Š“Š°ŃŃ ŃŠ°Š¹Š»!"
+
+msgid "Download file!"
+msgstr "Š”ŠŗŠ°ŃŠ°ŃŃ ŃŠ°Š¹Š»!"
+
+msgid "Clean current chat"
+msgstr "ŠŃŠøŃŃŠøŃŃ ŃŠµŠŗŃŃŠøŠ¹ ŃŠ°Ń"
+
+msgid "View chat history"
+msgstr "ŠŃŠ¾ŃŠ¼Š¾ŃŃ ŠøŃŃŠ¾ŃŠøŠø ŃŠ°Š·Š³Š¾Š²Š¾ŃŠ°"
+
+msgid "Show user profile"
+msgstr "ŠŠ¾ŠŗŠ°Š·Š°ŃŃ ŠæŃŠ¾ŃŠøŠ»Ń ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń"
+
+msgid "Add this contact to your friends"
+msgstr "ŠŠ¾Š±Š°Š²ŠøŃŃ ŃŃŠ¾Š³Š¾ ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń Š² Š“ŃŃŠ·ŃŃ"
+
+msgid "Add this groupchat to your favorites"
+msgstr "ŠŠ¾Š±Š°Š²ŠøŃŃ ŃŃŃ ŠŗŠ¾Š½ŃŠµŃŠµŠ½ŃŠøŃ Š² ŠøŠ·Š±ŃŠ°Š½Š½ŃŠµ"
+
+msgid "All tabs"
+msgstr "ŠŃŠµ Š²ŠŗŠ»Š°Š“ŠŗŠø"
+
+msgid "Close this tab"
+msgstr "ŠŠ°ŠŗŃŠøŃŃ ŃŃŃ Š²ŠŗŠ»Š°Š“ŠŗŃ"
+
+msgid "no subject defined for this room."
+msgstr "Š“Š»Ń Š“Š°Š½Š½Š¾Š¹ ŠŗŠ¾Š¼Š½Š°ŃŃ ŃŠµŠ¼Š° Š½Šµ Š±ŃŠ»Š° ŃŃŃŠ°Š½Š¾Š²Š»ŠµŠ½Š°."
+
+msgid "Administration panel for this room"
+msgstr "ŠŠ°Š½ŠµŠ»Ń Š°Š“Š¼ŠøŠ½ŠøŃŃŃŠøŃŠ¾Š²Š°Š½ŠøŃ Š“Š»Ń ŠµŃŠ¾Š¹ ŠŗŠ¾Š¼Š½Š°ŃŃ"
+
+msgid "Moderators"
+msgstr "ŠŠ¾Š“ŠµŃŠ°ŃŠ¾ŃŃ"
+
+msgid "Participants"
+msgstr "Š£ŃŠ°ŃŃŠ½ŠøŠŗŠø"
+
+msgid "Visitors"
+msgstr "ŠŠ¾ŃŠµŃŠøŃŠµŠ»Šø"
+
+msgid "Manage favorite rooms"
+msgstr "Š£ŠæŃŠ°Š²Š»ŠµŠ½ŠøŠµ ŠøŠ·Š±ŃŠ°Š½Š½Šø ŠŗŠ¾Š¼Š½Š°ŃŠ°Š¼Šø"
+
+msgid "Change favorites"
+msgstr "ŠøŠ·Š¼ŠµŠ½ŠøŃŃ ŠøŠ·Š±ŃŠ°Š½Š½ŠøŠµ"
+
+msgid "Search a room"
+msgstr "ŠŠ°Š¹ŃŠø ŠŗŠ¾Š¼Š½Š°ŃŃ"
+
+msgid "Select a favorite"
+msgstr "ŠŠ¾Š±Š°Š²ŠøŃŃ Š² ŠøŠ·Š±ŃŠ°Š½Š½Š½Š¾Šµ"
+
+msgid "Getting the name..."
+msgstr "ŠŠ¾Š»ŃŃŠµŠ½ŠøŠµ ŠøŠ¼ŠµŠ½Šø..."
+
+msgid "Gateway"
+msgstr "ŠŠ°ŃŃŃŃŃŠøŠ·Š°ŃŠ¾Ń"
+
+msgid "Name"
+msgstr "ŠŠ¼Ń"
+
+msgid "Room"
+msgstr "ŠŠ¾Š¼Š½Š°ŃŠ°"
+
+msgid "Add"
+msgstr "ŠŠ¾Š±Š°Š²ŠøŃŃ"
+
+msgid "Edit"
+msgstr "ŠŠ·Š¼ŠµŠ½ŠøŃŃ"
+
+msgid "Search a room on"
+msgstr "ŠŠ°Š¹ŃŠø ŠŗŠ¾Š¼Š½Š°ŃŃ Š½Š°"
+
+msgid "No room found on this server."
+msgstr "ŠŠ¾Š¼Š½Š°Ń Š½Š° ŃŠµŃŠ²ŠµŃŠµ Š½Šµ Š½Š°Š¹Š“ŠµŠ½Š¾."
+
+msgid "Service discovery"
+msgstr "ŠŠ±Š·Š¾Ń ŃŠµŃŠ²ŠøŃŠ¾Š²"
+
+msgid "Server to query"
+msgstr "ŠŠ°ŠæŃŠ¾Ń Šŗ ŃŠµŃŠ²ŠµŃŃ"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr "Š”Š¾Š¶Š°Š»ŠµŃ, Š½Š¾ Š¾Š±ŃŠµŠŗŃ Š½Šµ Š¾ŃŠ²ŠµŃŠøŠ» Š½Š° Š·Š°ŠæŃŠ¾Ń!"
+
+msgid "Accounts"
+msgstr "Š£ŃŠµŃŠ½ŃŠµ Š·Š°ŠæŠøŃŠø"
+
+msgid "Authentications"
+msgstr "ŠŃŃŠµŠ½ŃŠøŃŠøŠŗŠ°ŃŠøŃ"
+
+msgid "Automation"
+msgstr "ŠŠ²ŃŠ¾Š¼Š°ŃŠøŠ·Š°ŃŠøŃ"
+
+msgid "Clients"
+msgstr "ŠŠ»ŠøŠµŠ½ŃŃ"
+
+msgid "Collaboration"
+msgstr "Š”Š¾ŃŃŃŠ“Š½ŠøŃŠµŃŃŠ²Š¾"
+
+msgid "Components"
+msgstr "ŠŠ¾Š¼ŠæŠ¾Š½ŠµŠ½ŃŃ"
+
+msgid "Rooms"
+msgstr "ŠŠ¾Š¼Š½Š°ŃŃ"
+
+msgid "Directories"
+msgstr "ŠŠøŃŠµŠŗŃŠ¾ŃŠøŠø"
+
+msgid "Gateways"
+msgstr "ŠØŠ»ŃŠ·Ń"
+
+msgid "News"
+msgstr "ŠŠ¾Š²Š¾ŃŃŠø"
+
+msgid "Hierarchy"
+msgstr "ŠŠµŃŠ°ŃŃ
ŠøŃ"
+
+msgid "Proxies"
+msgstr "ŠŃŠ¾ŠŗŃŠø"
+
+msgid "Publication/Subscription"
+msgstr "ŠŃŠ±Š»ŠøŠŗŠ°ŃŠøŃ/ŠŠ¾Š“ŠæŠøŃŠŗŠ°"
+
+msgid "Storage"
+msgstr "Š„ŃŠ°Š½ŠøŠ»ŠøŃŠµ"
+
+msgid "Service offline or broken"
+msgstr "Š”ŠµŃŠ²ŠøŃ Š½ŠµŠ“Š¾ŃŃŃŠæŠµŠ½"
+
+msgid "Your inbox"
+msgstr "ŠŃ
Š¾Š“ŃŃŠøŠµ"
+
+msgid "Available actions"
+msgstr "ŠŠ¾ŃŃŃŠæŠ½ŃŠµ Š“ŠµŠ¹ŃŃŠ²ŠøŃ"
+
+msgid "Clean"
+msgstr "ŠŃŠøŃŃŠøŃŃ"
+
+msgid "New"
+msgstr "ŠŠ¾Š²ŃŠ¹"
+
+msgid "Received"
+msgstr "ŠŃŠøŠ½ŃŃŃŠ¹"
+
+msgid "Subject"
+msgstr "Š¢ŠµŠ¼Š°"
+
+msgid "Content"
+msgstr "Š”Š¾Š“ŠµŃŠ¶ŠøŠ¼Š¾Šµ"
+
+msgid "Send message"
+msgstr "ŠŃŠæŃŠ°Š²ŠøŃ ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŠµ"
+
+msgid "Your inbox is empty."
+msgstr "Š£ Š²Š°Ń Š½ŠµŃ ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŠ¹"
+
+msgid "MUC administration"
+msgstr "ŠŠ“Š¼ŠøŠ½ŠøŃŃŃŠøŃŠ¾Š²Š°Š½ŠøŠµ Š¼Š½Š¾Š³Š¾ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»ŃŃŠŗŠ¾Š¹ ŠŗŠ¾Š½ŃŠµŃŠµŠ½ŃŠøŠø"
+
+msgid "You administrate this room"
+msgstr "ŠŃ Š°Š“Š¼ŠøŠ½ŠøŃŃŃŠ°ŃŠ¾Ń ŃŃŠ¾Š¹ ŠŗŠ¾Š¼Š½Š°ŃŃ"
+
+msgid "Enter new subject"
+msgstr "ŠŠ²ŠµŠ“ŠøŃŠµ ŃŠµŠ¼Ń"
+
+msgid "Configuration"
+msgstr "Š£ŃŃŠ°Š½Š¾Š²ŠŗŠø"
+
+msgid "Authorizations"
+msgstr "ŠŠ²ŃŠ¾ŃŠøŠ·Š°ŃŠøŃ"
+
+msgid "Member list"
+msgstr "Š£ŃŠ°ŃŃŠ½ŠøŠŗŠø"
+
+msgid "Owner list"
+msgstr "Š”ŠæŠøŃŠ¾Šŗ Š²Š»Š°Š“ŠµŠ»ŃŃŠµŠ²"
+
+msgid "Administrator list"
+msgstr "Š”ŠæŠøŃŠ¾Šŗ Š°Š“Š¼ŠøŠ½ŠøŃŃŃŠ°ŃŠ¾ŃŠ¾Š²"
+
+msgid "Outcast list"
+msgstr "ŠŃŠŗŠ»Š¾Š½ŃŠ½Š½ŃŠµ"
+
+msgid "Add an input"
+msgstr "ŠŠ¾Š±Š°Š²ŠøŃŃ Š²Ń
Š¾Š“"
+
+msgid "Destroy this MUC"
+msgstr "Š£Š½ŠøŃŃŠ¾Š¶ŠøŃŃ ŃŃŃ ŠŗŠ¾Š¼Š½Š°ŃŃ"
+
+msgid "Yes, let's do it!"
+msgstr "ŠŠ°, Š“Š°Š²Š°Š¹ŃŠµ ŃŠ“ŠµŠ»Š°ŠµŠ¼ ŃŃŠ¾!"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr "ŠŠ°Ń Š“ŃŃŠ³ Š¾Š±ŃŠ°ŃŠ°ŠµŃ Š²Š½ŠøŠ¼Š°Š½ŠøŠµ Š½Š° Š±ŠµŃŠµŠ“Ń."
+
+msgid "Your friend is writing a message..."
+msgstr "ŠŠ°Ń Š“ŃŃŠ³ ŠæŠøŃŠµŃ ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŠµ..."
+
+msgid "Your friend stopped writing a message."
+msgstr "ŠŠ°Ń Š“ŃŃŠ³ ŠæŃŠµŠŗŃŠ°ŃŠøŠ» Š½Š°ŠæŠøŃŠ°Š½ŠøŠµ ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŃ."
+
+msgid "Your friend is doing something else."
+msgstr "ŠŠ°Ń Š“ŃŃŠ³ Š“ŠµŠ»Š°ŠµŃ ŃŃŠ¾-ŃŠ¾ ŠµŃŃ."
+
+msgid "Your friend closed the chat."
+msgstr "ŠŠ°Ń Š“ŃŃŠ³ Š·Š°ŠŗŃŃŠ» Š¾ŠŗŠ½Š¾ ŃŠ°ŃŠ°."
+
+msgid "Requesting this service..."
+msgstr "ŠŠ°ŠæŃŠ¾Ń ŃŠµŃŠ²ŠøŃŠ°..."
+
+msgid "Loading"
+msgstr "ŠŠ°Š³ŃŃŠ·ŠŗŠ°"
+
+msgid "joined the chat room"
+msgstr "ŠæŃŠøŃŠ¾ŠµŠ“ŠøŠ½ŠøŃŃŃ Šŗ ŠŗŠ¾Š¼Š½Š°ŃŠµ"
+
+msgid "left the chat room"
+msgstr "ŠæŠ¾ŠŗŠøŠ½ŃŠ» ŠŗŠ¾Š¼Š½Š°ŃŃ"
+
+msgid "no status"
+msgstr "Š½ŠµŃ ŃŃŠ°ŃŃŃŠ°"
+
+msgid "has been kicked"
+msgstr "Š±ŃŠ» Š²ŃŃŃŠ°Š²Š»ŠµŠ½"
+
+msgid "has been banned"
+msgstr "Š±ŃŠ» Š·Š°Š±Š°Š½ŠµŠ½"
+
+msgid "no reason"
+msgstr "Š½ŠµŃ ŠæŃŠøŃŠøŠ½Ń"
+
+msgid "Communicate with the entire world!"
+msgstr "ŠŠ±ŃŠ°Š¹ŃŃ ŃŠ¾ Š²ŃŠµŠ¼ Š¼ŠøŃŠ¾Š¼!"
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr "ŠŃŠ¾ ŠæŠ¾Š·Š²Š¾Š»ŠøŃ Š¾Š±ŃŠ°ŃŃŃŃ Ń Š¼ŠøŠ»Š»ŠøŠ¾Š½Š°Š¼Šø ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»ŠµŠ¹ Jappix, ŠŗŠ°Šŗ Šø Š²Ń, ŠøŃŠæŠ¾Š»ŃŠ·ŃŃŃŠøŃ
XMPP. ŠŠ¾Š¹Š“Šø Š² ŃŠ¾Š¾Š±ŃŠµŃŃŠ²Š¾ Šø ŠæŠ¾ŃŃŠ²ŃŃŠ²ŃŠ¹ ŃŠ²Š¾Š±Š¾Š“Ń!"
+
+msgid "Hi there!"
+msgstr "ŠŃŠøŠ²ŠµŃŃŃŠ²ŃŠµŠ¼ Š·Š“ŠµŃŃ!"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr "ŠŠ¾Š±ŃŠ¾ ŠæŠ¾Š¶Š°Š»Š¾Š²Š°ŃŃ Š² %1s, ā%2sā."
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr "ŠŠ²Š¾Š¹Š“ŠøŃŠµ Š² Š²Š°Ń XMPP Š°ŠŗŠŗŠ°ŃŠ½Ń ŠøŠ»Šø ŃŠ¾Š·Š“Š°Š¹ŃŠµ Š½Š¾Š²ŃŠ¹ Š±ŠµŃŠæŠ»Š°ŃŠ½Š¾!"
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr "Jappix - ŃŃŠ¾ Š¾ŃŠŗŃŃŃŃŠ¹ ŠæŃŠ¾ŠµŠŗŃ Š¾Ń PostPro, Š½ŠµŠŗŠ¾Š¼Š¼ŠµŃŃŠµŃŠŗŠ¾Š¹ Š¾ŃŠ³Š°Š½ŠøŠ·Š°ŃŠøŠø, Š¾Š±ŠµŃŠæŠµŃŠøŠ²Š°ŃŃŠµŠ¹ Š½Š°Š¼ Š¾ŃŠ»ŠøŃŠ½ŃŃ ŠæŠ¾Š“Š“ŠµŃŠ¶Ń"
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr "ŠŠ²Š¾Š¹Š“ŠøŃŠµ Š² Š²Š°Ń XMPP Š°ŠŗŠŗŠ°ŃŠ½Ń. Š¢Š°ŠŗŠ¶Šµ Š¼Š¾Š¶ŠµŃŠµ ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŃ %s Š“Š»Ń ŠæŃŠøŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃ Šŗ Š¾Š±ŃŠµŠ¹ Š±ŠµŃŠµŠ“Šµ."
+
+msgid "Previous"
+msgstr "ŠŃŠµŠ“ŃŠ“ŃŃŠøŠ¹"
+
+msgid "General"
+msgstr "ŠŃŠ½Š¾Š²Š½ŃŠµ"
+
+msgid "Advanced"
+msgstr "ŠŠ¾ŠæŠ¾Š»Š½ŠøŃŠµŠ»ŃŠ½Š¾"
+
+msgid "Resource"
+msgstr "Š ŠµŃŃŃŃ"
+
+msgid "Priority"
+msgstr "ŠŃŠøŠ¾ŃŠøŃŠµŃ"
+
+msgid "Low"
+msgstr "ŠŠøŠ·ŠŗŠøŠ¹"
+
+msgid "Medium"
+msgstr "Š”ŃŠµŠ“Š½ŠøŠ¹"
+
+msgid "High"
+msgstr "ŠŃŃŠ¾ŠŗŠøŠ¹"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr "ŠŠ²ŠµŠ“ŠøŃŠµ Š½Š°Š·Š²Š°Š½ŠøŠµ ŠŗŠ¾Š½ŃŠµŃŠµŠ½ŃŠøŠø Šø Š½ŠøŠŗ. (ŠŃ Š¼Š¾Š¶ŠµŃŠµ Š²ŠµŃŠ½ŃŃŃŃŃ Šŗ %s)."
+
+msgid "login page"
+msgstr "Š”ŃŃŠ°Š½ŠøŃŠ° Š²Ń
Š¾Š“Š°"
+
+msgid "Share this link with your friends:"
+msgstr "ŠŠ¾Š“ŠµŠ»ŠøŃŠµŃŃ ŃŃŃŠ»ŠŗŠ¾Š¹ Ń Š“ŃŃŠ·ŃŃŠ¼Šø:"
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr "ŠŠ°ŃŠµŠ³ŠøŃŃŃŠøŃŃŠ¹ŃŠµ Š½Š¾Š²ŃŠ¹ XMPP-Š°ŠŗŠŗŠ°ŃŠ½Ń ŃŃŠ¾Š±Ń ŠæŠ¾Š“ŠŗŠ»ŃŃŠøŃŃŃŃ Šŗ ŃŠµŃŠø Š“ŃŃŠ·ŠµŠ¹. ŠŃŠ¾ ŠæŃŠ¾ŃŃŠ¾!"
+
+msgid "Required"
+msgstr "ŠŠ±ŃŠ·Š°ŃŠµŠ»ŃŠ½ŃŠ¹"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr "ŠŃ Š±ŃŠ»Šø Š·Š°ŃŠµŠ³ŠøŃŃŃŠøŃŠ¾Š²Š°Š½Ń, Š²Š°Ń XMPP-Š°Š“ŃŠµŃ:"
+
+msgid "Manager"
+msgstr "ŠŠµŠ½ŠµŠ“Š¶ŠµŃ"
+
+msgid "Project"
+msgstr "ŠŃŠ¾ŠµŠŗŃ"
+
+msgid "Encrypted"
+msgstr "ŠŠ°ŃŠøŃŃŠ¾Š²Š°Š½Š½ŃŠ¹"
+
+msgid "Unencrypted"
+msgstr ""
+
+msgid "Where are you?"
+msgstr "ŠŠ“Šµ ŃŃ?"
+
+msgid "What's up with you?"
+msgstr "Š§ŃŠ¾ Ń ŃŠ¾Š±Š¾Š¹?"
+
+msgid "Fetching the social channel..."
+msgstr "ŠŃ
Š¾Š“ Š² ŃŠ¾ŃŠøŠ°Š»ŃŠ½ŃŠ¹ ŠŗŠ°Š½Š°Š»..."
+
+msgid "You are synchronized with your network."
+msgstr "ŠŃ ŃŠøŠ½Ń
ŃŠ¾Š½ŠøŠ·ŠøŃŠ¾Š²Š°Š½Ń Ń ŃŠµŃŃŃ."
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr "ŠŠµ Š¼Š¾Š¶ŠµŃ Š±ŃŃŃ Š¾ŃŠæŃŠ°Š²Š»ŠµŠ½Š¾: Š²Ń Š¼Š¾Š¶ŠµŃŠµ ŃŠ¾Š»ŃŠŗŠ¾ ŠæŠ¾Š»ŃŃŠ°ŃŃ ŃŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŃ!"
+
+msgid "Media viewer"
+msgstr "ŠŠµŠ“ŠøŠ° Š¼ŠµŠ½ŠµŠ“Š¶ŠµŃ"
+
+msgid "Browse"
+msgstr "ŠŃŠ¾ŃŠ¼Š¾ŃŃ"
+
+msgid "Command"
+msgstr "ŠŠ¾Š¼Š°Š½Š“Š°"
+
+msgid "Subscribe"
+msgstr "ŠŠ¾Š“ŠæŠøŃŠ°ŃŃŃŃ"
+
+msgid "Join"
+msgstr "ŠŠ¾Š¹ŃŠø"
+
+msgid "Automatic"
+msgstr "ŠŠ²ŃŠ¾Š¼Š°ŃŠøŃŠµŃŠŗŠø"
+
+msgid "Search"
+msgstr "ŠŠ¾ŠøŃŠŗ"
+
+msgid "No result!"
+msgstr "ŠŠµŃ ŃŠµŠ·ŃŠ»ŃŃŠ°ŃŠ°!"
+
+msgid "No notifications."
+msgstr "ŠŠµŃ ŃŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŠ¹."
+
+msgid "would like to add you as a friend."
+msgstr "Š“Š¾Š±Š°Š²ŠøŃŃ ŃŠµŠ±Ń ŠŗŠ°Šŗ Š“ŃŃŠ³Š°."
+
+msgid "would like you to join this chatroom:"
+msgstr "Ń
Š¾ŃŠµŠ»Šø Š±Ń ŠæŃŠøŃŠ¾ŠµŠ“ŠøŠ½ŠøŃŃŃŃ Šŗ ŃŠ°ŃŃ:"
+
+msgid "Do you accept?"
+msgstr "ŠŃ ŠæŃŠøŠ½ŠøŠ¼Š°ŠµŃŠµ?"
+
+msgid "Yes"
+msgstr "ŠŠ°"
+
+msgid "No"
+msgstr "ŠŠµŃ"
+
+msgid "would like to get authorization."
+msgstr "Ń
Š¾ŃŠµŃ ŠæŠ¾Š»ŃŃŠøŃ Š°Š²ŃŠ¾ŃŠøŠ·Š°ŃŠøŃ"
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr "Š„Š¾ŃŠøŃŠµ Š»Šø Š²ŠøŠ“ŠµŃŃ ŠæŃŠµŠ“Š»Š¾Š¶ŠµŠ½Š½ŃŃ
Š²Š°Š¼ %s Š“ŃŃŠ·ŠµŠ¹?"
+
+msgid "Submit"
+msgstr "ŠŃŠæŃŠ°Š²ŠøŃŃ"
+
+msgid "Client"
+msgstr "ŠŠ»ŠøŠµŠ½Ń"
+
+msgid "System"
+msgstr "Š”ŠøŃŃŠµŠ¼Š°"
+
+msgid "Local time"
+msgstr "ŠŠµŃŃŠ½Š¾Šµ Š²ŃŠµŠ¼Ń"
+
+msgid "Comments"
+msgstr "ŠŠ¾Š¼Š¼ŠµŠ½ŃŠ°ŃŠøŠø"
+
+msgid "User profile"
+msgstr "ŠŃŠ¾ŃŠøŠ»Ń ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń"
+
+msgid "See his/her position on the globe"
+msgstr "ŠŠ¾ŃŠ¼Š¾ŃŃŠµŃŃ Š³ŠµŠ¾Š³ŃŠ°ŃŠøŃŠµŃŠŗŠ¾Šµ ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµ"
+
+msgid "Confirm"
+msgstr "ŠŠ¾Š“ŃŠ²ŠµŃŠ“ŠøŃŃ"
+
+msgid "anonymous mode"
+msgstr "Š°Š½Š¾Š½ŠøŠ¼Š½ŃŠ¹ ŃŠµŠ¶ŠøŠ¼"
+
+msgid "Groups"
+msgstr "ŠŃŃŠæŠæŃ"
+
+msgid "Unclassified"
+msgstr "ŠŠµŠøŠ·Š²ŠµŃŃŠ½Š¾"
+
+msgid "Authorize"
+msgstr "ŠŠ²ŃŠ¾ŃŠøŠ·Š¾Š²Š°ŃŃ"
+
+msgid "Ask for authorization"
+msgstr "ŠŠ°ŠæŃŠ¾ŃŠøŃŃ ŠæŠ¾Š“ŠæŠøŃŠŗŃ"
+
+msgid "Unblock"
+msgstr "Š Š°Š·Š±Š»Š¾ŠŗŠøŃŠ¾Š²Š°ŃŃ"
+
+msgid "Prohibit"
+msgstr "ŠŠ°ŠæŃŠµŃŠøŃŃ"
+
+msgid "Block"
+msgstr "ŠŠ»Š¾ŠŗŠøŃŠ¾Š²Š°ŃŃ"
+
+msgid "Chat"
+msgstr "Š§Š°Ń"
+
+msgid "Groupchat"
+msgstr "Š§Š°Ń"
+
+msgid "Jappix Mobile"
+msgstr "ŠŠ¾Š±ŠøŠ»ŃŠ½ŃŠ¹ Jappix"
+
+msgid "Desktop"
+msgstr "ŠŠ¾Š»Š½Š°Ń Š²ŠµŃŃŠøŃ"
+
+msgid "Mobile"
+msgstr "ŠŠ¾Š±ŠøŠ»ŃŠ½ŃŠ¹"
+
+msgid "Please wait..."
+msgstr "ŠŠ¾Š¶Š°Š»ŃŠ¹ŃŃŠ°, ŠæŠ¾Š“Š¾Š¶Š“ŠøŃŠµ..."
+
+msgid "Please enable JavaScript"
+msgstr "ŠŠ¾Š¶Š°Š»ŃŠ¹ŃŃŠ°, Š²ŠŗŠ»ŃŃŠøŃŠµ JavaScript"
+
+msgid "Your channel"
+msgstr "ŠŠ°Ń ŠŗŠ°Š½Š°Š»"
+
+msgid "Channel of"
+msgstr "ŠŠ°Š½Š°Š»"
+
+msgid "More notices..."
+msgstr "ŠŃŃŠ³ŠøŠµ ŃŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŃ..."
+
+msgid "Attach a file"
+msgstr "ŠŃŠøŃŠ¾ŠµŠ“ŠøŠ½ŠøŃŃ ŃŠ°Š¹Š»"
+
+msgid "Send"
+msgstr "ŠŃŠæŃŠ°Š²ŠøŃŃ"
+
+msgid "Unattach the file"
+msgstr "Š£Š“Š°Š»ŠøŃŃ ŃŠ°Š¹Š»"
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr "ŠŃŠø Š²ŃŠ³ŃŃŠ·ŠŗŠµ Š²Š°ŃŠµŠ³Š¾ ŃŠ°Š¹Š»Š° ŠæŃŠ¾ŠøŠ·Š¾ŃŠ»Š° Š¾ŃŠøŠ±ŠŗŠ°: Š¼Š¾Š¶ŠµŃ Š¾Š½ ŃŠ»ŠøŃŠŗŠ¾Š¼ Š²ŠµŠ»ŠøŠŗ (%s maximum) ŠøŠ»Šø ŠµŠ³Š¾ ŃŠ¾ŃŠ¼Š°Ń Š·Š°ŠæŃŠµŃŠµŠ½!"
+
+msgid "Authorization failed"
+msgstr "ŠŃŠøŠ±ŠŗŠ° Š°ŃŃŠµŠ½ŃŠøŃŠøŠŗŠ°ŃŠøŠø"
+
+msgid "Registration failed, please choose a different username"
+msgstr "ŠŃŠøŠ±ŠŗŠ° ŃŠµŠ³ŠøŃŃŃŠ°ŃŠøŠø. ŠŠ¾Š¶Š°Š»ŃŠ¹ŃŃŠ°, Š²ŃŠ±ŠµŃŠøŃŠµ Š“ŃŃŠ³Š¾Šµ ŠøŠ¼Ń ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń"
+
+msgid "Service unavailable"
+msgstr "Š”ŠµŃŠ²ŠøŃ Š½ŠµŠ“Š¾ŃŃŃŠæŠµŠ½"
+
+msgid "Internal server error, try later"
+msgstr "ŠŠ½ŃŃŃŠµŠ½Š½ŃŃ Š¾ŃŠøŠ±ŠŗŠ° ŃŠµŃŠ²ŠµŃŠ°. ŠŠ¾ŠæŃŠ¾Š±ŃŠ¹ŃŠµ Š·Š°Š¹ŃŠø ŠæŠ¾Š·Š¶Šµ"
+
+msgid "Your form has been sent."
+msgstr "ŠŠ°ŃŠ° ŃŠ¾ŃŠ¼Š° Š±ŃŠ»Š° Š¾ŃŠæŃŠ°Š²Š»ŠµŠ½Š°."
+
+msgid "Application"
+msgstr "ŠŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŠµ"
+
+msgid "XMPP links"
+msgstr "XMPP ŃŃŃŠ»ŠŗŠø"
+
+msgid "Open XMPP links with Jappix"
+msgstr "ŠŃŠŗŃŃŠ²Š°ŃŃ XMPP ŃŃŃŠ»ŠŗŠø Š² Jappix"
+
+msgid "changed the subject to:"
+msgstr "ŠøŠ·Š¼ŠµŠ½ŠøŠ» ŃŠµŠ¼Ń Š½Š°:"
+
+msgid "Welcome!"
+msgstr "ŠŠ¾Š±ŃŠ¾ ŠæŠ¾Š¶Š°Š»Š¾Š²Š°ŃŃ!"
+
+msgid "Friends"
+msgstr "ŠŃŃŠ·ŃŃ"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr "ŠŠ¾Š±ŃŠ¾ ŠæŠ¾Š¶Š°Š»Š¾Š²Š°ŃŃ Š² Jappix, ŠŠ°ŃŃ ŃŠ¾ŃŠøŠ°Š»ŃŠ½ŃŃ ŃŠµŃŃ!"
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr "ŠŠ¾ Š½Š°ŃŠ°Š»Š° ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŃ Š²Š°Š¼ Š½Š°Š“Š¾ ŠøŠ·Š¼ŠµŠ½ŠøŃŃ Š½ŠµŠŗŠ¾ŃŠ¾ŃŃŠµ ŃŃŃŠ°Š½Š¾Š²ŠŗŠø, Š½Š°Š¹ŃŠø Š“ŃŃŠ·ŠµŠ¹ Šø Š·Š°ŠæŠ¾Š»Š½ŠøŃŃ ŠæŃŠ¾ŃŠøŠ»Ń."
+
+msgid "Enable notification sounds"
+msgstr "ŠŠŗŠ»ŃŃŠøŃŃ Š·Š²ŃŠŗŠ¾Š²ŃŠµ ŃŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŃ"
+
+msgid "Share your position on the globe"
+msgstr "ŠŠ¾Š“ŠµŠ»ŠøŃŃŃ ŃŠ²Š¾ŠøŠ¼ Š¼ŠµŠ¼ŃŠ¾ŠæŠ¾Š»Š¾Š¶ŠµŠ½ŠøŠµŠ¼"
+
+msgid "Offline friends"
+msgstr "ŠŃŃŠ·ŃŃ Š¾ŃŃŠ»Š°Š¹Š½"
+
+msgid "Don't hide offline friends"
+msgstr "ŠŠµ ŃŠŗŃŃŠ²Š°ŃŃ Š“ŃŃŠ·ŠµŠ¹ Š¾ŃŃŠ»Š°Š¹Š½"
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr "ŠŃŠæŠ¾Š»ŃŠ·ŃŠ¹ŃŠµ ŃŃŠ¾ Š“Š»Ń ŠæŠ¾ŠøŃŠŗŠ° Š“ŃŃŠ·ŠµŠ¹, ŠøŠ»Šø Š“Š¾Š±Š°Š²ŃŃŠµ ŠøŃ
ŠæŠ¾Š·Š¶Šµ"
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr "ŠŃŠµŠŗŃŠ°ŃŠ½Š°Ń ŃŠ°Š±Š¾ŃŠ°! ŠŃŠ°Šŗ, Š¼Š¾Š¶ŠµŃŠµ ŠæŠ¾Š“ŠµŠ»ŠøŃŃŃŃ Jappix Ń Š“ŃŃŠ·ŃŃŠ¼Šø!"
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr "ŠŠ°Š¶Š°ŃŠøŠµ Š½Š° ŠŗŠ½Š¾ŠæŠŗŃ ŃŠ¾Ń
ŃŠ°Š½ŠµŠ½ŠøŃ Š¾ŃŠŗŃŃŠ²Š°ŠµŃ ŃŠµŠ“Š°ŠŗŃŠ¾Ń ŠæŃŠ¾ŃŠøŠ»Ń. Š£Š“Š°ŃŠ½Š¾Š³Š¾ Š¾Š±ŃŠµŠ½ŠøŃ!"
+
+msgid "Share Jappix on %s"
+msgstr "Š Š°ŃŃŠŗŠ°Š·Š°ŃŃ ŠæŃŠ¾ Jappix Š² %s"
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr "ŠŃŠæŠ¾Š»ŃŠ·ŃŃ Š“Š»Ń Š¾Š±ŃŠµŠ½ŠøŃ Jabber-ŃŠµŃŃ Jappix. ŠÆ - %s!"
+
+msgid "Unknown name"
+msgstr "ŠŠµŠøŠ·Š²ŠµŃŃŠ½Š¾Šµ ŠøŠ¼Ń"
+
+msgid "Unknown country"
+msgstr "ŠŠµŠøŠ·Š²ŠµŃŃŠ½Š°Ń ŃŃŃŠ°Š½Š°"
+
+msgid "Click to enable"
+msgstr "ŠŠŗŠ»ŃŃŠøŃŃ"
+
+msgid "Click to disable"
+msgstr "ŠŃŠŗŠ»ŃŃŠøŃŃ"
+
+msgid "Installation"
+msgstr "Š£ŃŃŠ°Š½Š¾Š²ŠŗŠ°"
+
+msgid "Jappix installation"
+msgstr "Š£ŃŃŠ°Š½Š¾Š²ŠŗŠ° Jappix"
+
+msgid "Welcome to the Jappix installation!"
+msgstr "ŠŠ¾Š±ŃŠ¾ ŠæŠ¾Š¶Š°Š»Š¾Š²Š°ŃŃ Š² ŃŃŃŠ°Š½Š¾Š²ŠŗŃ Jappix!"
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr "ŠŃŠ¾Ń Š¼Š°ŃŃŠµŃ ŠæŠ¾Š¼Š¾Š¶ŠµŃ Š²Š°Š¼ Š±ŃŃŃŃŠ¾ ŃŃŃŠ°Š½Š¾Š²ŠøŃŃ Jappix, ŠæŠµŃŠ²ŃŃ ŠæŠ¾Š»Š½Š¾ŃŠµŠ½Š½ŃŃ ŃŠ¾ŃŠøŠ°Š»ŃŠ½ŃŃ ŠæŠ»Š°ŃŃŠ¾ŃŠ¼Ń Š½Š° XMPP-ŠæŃŠ¾ŃŠ¾ŠŗŠ¾Š»Šµ. ŠŠ»Ń ŃŃŃŠ°Š½Š¾Š²ŠŗŠø Š½Šµ ŃŃŠµŠ±ŃŠµŃŃŃ Š¾ŃŠ¾Š±ŃŃ
ŃŠµŃ
Š½ŠøŃŠµŃŠŗŠøŃ
Š½Š°Š²ŃŠŗŠ¾Š²."
+
+msgid "Let's have a look at the installation steps:"
+msgstr ""
+
+msgid "Welcome"
+msgstr "ŠŠ¾Š±ŃŠ¾ ŠæŠ¾Š¶Š°Š»Š¾Š²Š°ŃŃ"
+
+msgid "Storage configuration"
+msgstr "ŠŠ°ŃŃŃŠ¾Š¹ŠŗŠ° Ń
ŃŠ°Š½ŠøŠ»ŠøŃŠ°"
+
+msgid "Administrator account"
+msgstr "ŠŠ“Š¼ŠøŠ½ŠøŃŃŃŠ°ŃŠ¾ŃŃŠøŠŗŠøŠ¹ Š°ŠŗŠ°ŃŠ½Ń"
+
+msgid "Main configuration"
+msgstr "ŠŃŠ½Š¾Š²Š½ŃŠµ Š½Š°ŃŃŃŠ¾Š¹ŠŗŠø"
+
+msgid "Hosts configuration"
+msgstr "ŠŠ¾Š½ŃŠøŠ³ŃŃŠ°ŃŠøŃ Ń
Š¾ŃŃŠ¾Š²"
+
+msgid "Services installation"
+msgstr "Š£ŃŃŠ°Š½Š¾Š²ŠŗŠ° ŃŠµŃŠ²ŠøŃŠ°"
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr "ŠŃŠ»Šø ŃŠµŠŗŃŃŠøŠ¹ ŃŠ·ŃŠŗ Š½Šµ ŃŠ¾Š²ŠæŠ°Š“Š°ŠµŃ Ń Š²Š°ŃŠøŠ¼ (%1s), Š²Ń Š¼Š¾Š¶ŠµŃŠµ Š½Š°ŃŃŃŠ¾ŠøŃŃ Jabbix Š½Š° %2s."
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr "ŠŃŠ»Šø Ń
Š¾ŃŠøŃŠµ ŠæŠ¾Š»ŃŃŠøŃŃ ŠŗŠ°ŠŗŃŃ-Š»ŠøŠ±Š¾ ŠæŠ¾Š¼Š¾ŃŃ ŠæŠ¾ ŃŃŃŠ°Š½Š¾Š²ŠŗŠµ Šø Š½Š°ŃŃŃŠ¾Š¹ŠŗŠµ Jappix, Š¼Š¾Š¶ŠµŃŠµ ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŃ ŠæŠ¾Š»Š½ŃŃ Š“Š¾ŠŗŃŠ¼ŠµŠ½ŃŠ°ŃŠøŃ, Š“Š¾ŃŃŃŠæŠ½ŃŃ Š½Š°:"
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr "ŠŃŠøŃŠ»Š¾ Š²ŃŠµŠ¼Ń ŃŠ¾Š·Š“Š°ŃŃ ŃŠ²Š¾Šµ ŃŠ¾ŃŠøŠ°Š»ŃŠ½Š¾Šµ Š¾Š±Š»Š°ŠŗŠ¾: ŠæŠµŃŠµŃ
Š¾Š“ŠøŃŠµ Šŗ ŃŠ»ŠµŠ“ŃŃŃŠµŠ¼Ń ŃŠ°Š³Ń!"
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr "Jappix ŃŠ¾Ń
ŃŠ°Š½ŃŠµŃ ŠæŠ¾ŃŃŠ¾ŃŠ½Š½ŃŠµ Š“Š°Š½Š½ŃŠµ (ŃŠ°ŠŗŠøŠµ, ŠŗŠ°Šŗ Š¾Š±ŃŠøŠµ ŃŠ°Š¹Š»Ń, Š»Š¾Š³Šø ŠæŠµŃŠµŠæŠøŃŠŗŠø, Š²Š°ŃŃ Š¼ŃŠ·ŃŠŗŃ Šø ŃŠ¾Š±ŃŃŠ²ŠµŠ½Š½ŃŠµ Š½Š°ŃŃŃŠ¾Š¹ŠŗŠø) Š² ŠµŠ“ŠøŠ½Š¾Š¹ Š·Š°ŃŠøŃŠµŠ½Š½Š¾Š¹ ŠæŠ°ŠæŠŗŠµ."
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr "Jappix Š“Š¾Š»Š¶ŠµŠ½ ŠøŠ¼ŠµŃŃ Š²Š¾Š·Š¼Š¾Š¶Š½Š¾ŃŃŃ Š·Š°ŠæŠøŃŃŠ²Š°ŃŃ Š² ŃŃŃ ŠæŠ°ŠæŠŗŃ, ŃŃŠ¾Š±Ń ŃŠ¾Š·Š“Š°Š²Š°ŃŃ Š² Š½ŠµŠ¹ ŠæŠ¾Š“-Š“ŠøŃŠµŠŗŃŠ¾ŃŠøŠø. ŠŃ Š“Š¾Š»Š¶Š½Ń ŃŃŃŠ°Š½Š¾Š²ŠøŃŃ ŠæŃŠ°Š²Š° Š½Š° %1s ŠøŠ»Šø ŃŠ¼ŠµŠ½ŠøŃŃ Š²Š»Š°Š“ŠµŠ»ŃŃŠ° ŠæŠ°ŠæŠŗŠø Š½Š° %2s (Š² Š·Š°Š²ŠøŃŠøŠ¼Š¾ŃŃŠø Š¾Ń ŠŗŠ¾Š½ŃŠøŠ³ŃŃŠ°ŃŠøŠø)."
+
+msgid "The folder is writable, you can continue!"
+msgstr "ŠŠ°ŠæŠŗŠ° Š“Š¾ŃŃŃŠæŠ½Š° Š“Š»Ń Š·Š°ŠæŠøŃŠø, Š¼Š¾Š¶Š½Š¾ ŠæŃŠ¾Š“Š¾Š»Š¶Š°ŃŃ!"
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jabbix ŠæŠ¾Š·Š²Š¾Š»ŃŠµŃ Š²Š°Š¼ ŃŠæŃŠ°Š²Š»ŃŃŃ ŠŗŠ¾Š½ŃŠøŠ³ŃŃŠ°ŃŠøŠµŠ¹, ŃŃŃŠ°Š½Š°Š²Š»ŠøŠ²Š°ŃŃ Š½Š¾Š²ŃŠµ ŠæŠ»Š°Š³ŠøŠ½Ń ŠøŠ»Šø ŠæŃŠ¾Š²ŠµŃŃŃŃ Š¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŃ. ŠŠ»Ń Š“Š¾ŃŃŃŠæŠ° Šŗ ŠæŠ°Š½ŠµŠ»Šø ŃŠæŃŠ°Š²Š»ŠµŠ½ŠøŃ ŃŃŠµŠ±ŃŠµŃŃŃ ŃŠ¾Š·Š“Š°ŃŃ ŃŃŠµŃŠ½ŃŃ Š·Š°ŠæŠøŃŃ Š°Š“Š¼ŠøŠ½ŠøŃŃŃŠ°ŃŠ¾ŃŠ°."
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr ""
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr "ŠŠæŠ°! ŠŃ Š²Ń ŃŃŠ¾-ŃŠ¾ Š·Š°Š±ŃŠ»Šø, ŠøŠ»Šø Š“Š²Š° ŠæŠ°ŃŠ¾Š»Ń Š½Šµ ŃŠ¾Š²ŠæŠ°Š»Šø!"
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr "Jappix ŃŃŠµŠ±ŃŃŃŃŃ Š½ŠµŠŗŠ¾ŃŠ¾ŃŃŠµ Š·Š½Š°ŃŠµŠ½ŠøŃ Š“Š»Ń ŃŠ°Š±Š¾ŃŃ. ŠŠ¾Š¶Š°Š»ŃŠ¹ŃŃŠ° ŠøŃŠæŃŠ°Š²ŃŃŠµ ŃŠ»ŠµŠ“ŃŃŃŠøŠµ ŃŃŃŠ¾ŠŗŠø (ŠøŠ»Šø Š¾ŃŃŠ°Š²ŃŃŠµ ŠæŠ¾ ŃŠ¼Š¾Š»ŃŠ°Š½ŠøŃ, Š¾Š½Šø ŠæŠ¾Š“Ń
Š¾Š“ŃŃ Š±Š¾Š»ŃŃŠøŠ½ŃŃŠ²Ń ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»ŠµŠ¹)"
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr "ŠŃŠøŠ¼ŠµŃŠ°Š½ŠøŠµ: ŠµŃŠ»Šø Š²Ń Š½Šµ Š·Š°ŠæŠ¾Š»Š½ŠøŃŠµ Š½ŠµŠ¾Š±Ń
Š¾Š“ŠøŠ¼Š¾Šµ Š·Š½Š°ŃŠµŠ½ŠøŠµ, Š¾Š½Š¾ Š±ŃŠ“ŠµŃ Š°Š²ŃŠ¾Š¼Š°ŃŠøŃŠµŃŠŗŠø Š·Š°ŠæŠ¾Š»Š½ŠµŠ½Š¾ Š·Š½Š°ŃŠµŠ½ŠøŠµŠ¼ ŠæŠ¾ ŃŠ¼Š¾Š»ŃŠ°Š½ŠøŃ."
+
+msgid "User"
+msgstr "ŠŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń"
+
+msgid "Service"
+msgstr "Š”ŠµŃŠ²ŠøŃ"
+
+msgid "Service name"
+msgstr "ŠŠ¼Ń ŃŠµŃŠ²ŠøŃŠ°"
+
+msgid "Service description"
+msgstr "ŠŠæŠøŃŠ°Š½ŠøŠµ ŃŠµŃŠ²ŠøŃŠ°"
+
+msgid "Connection"
+msgstr "Š”ŠµŠ“ŠøŠ½ŠµŠ½ŠøŠµ"
+
+msgid "Lock the host"
+msgstr "ŠŠ°Š±Š»Š¾ŠŗŠøŃŠ¾Š²Š°ŃŃ Ń
Š¾ŃŃ"
+
+msgid "Anonymous mode"
+msgstr "ŠŠ½Š¾Š½ŠøŠ¼Š½Ń ŃŠµŠ¶ŠøŠ¼"
+
+msgid "Registration allowed"
+msgstr "Š ŠµŠ³ŠøŃŃŃŠ°ŃŠøŃ Š“Š¾Š·Š²Š¾Š»ŠµŠ½Š°"
+
+msgid "Use a proxy"
+msgstr "ŠŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŃ proxy"
+
+msgid "Encryption"
+msgstr "ŠØŠøŃŃŠ¾Š²Š°Š½ŠøŠµ"
+
+msgid "HTTPS storage"
+msgstr "HTTPS Ń
ŃŠ°Š½ŠøŠ»ŠøŃŠµ"
+
+msgid "Force HTTPS"
+msgstr "ŠŃŠøŠ½ŃŠ“ŠøŃŠµŠ»ŃŠ½Š¾ ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŃ HTTPS"
+
+msgid "Compression"
+msgstr "Š”Š¶Š°ŃŠøŠµ"
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr "ŠŠ° ŃŃŠ¾Š¹ ŃŃŃŠ°Š½ŠøŃŠµ Š¼Š¾Š¶Š½Š¾ Š·Š°Š“Š°ŃŃ ŃŠµŃŠ²ŠµŃ, Ń ŠŗŠ¾ŃŠ¾ŃŃŠ¼ Jappix Š±ŃŠ“ŠµŃ ŃŠ¾ŠµŠ“ŠøŠ½ŃŃŃŃŃ ŠæŠ¾ ŃŠ¼Š¾Š»ŃŠ°Š½ŠøŃ. ŠŃ Š¼Š¾Š¶ŠµŃŠµ Š¾ŃŃŠ°Š²ŠøŃŃ ŠµŠ³Š¾ ŠŗŠ°Šŗ ŠµŃŃŃ, ŠµŃŠ»Šø Ń
Š¾ŃŠøŃŠµ ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŃ Š¾ŃŠøŃŠøŠ°Š»ŃŠ½ŃŠµ ŃŠµŃŠ²ŠµŃŃ."
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr "ŠŠ¾Š·Š¼Š¾Š¶Š½Š¾ Š²Ń Š½Šµ Š·Š½Š°ŠµŃŠµ, ŃŃŠ¾ ŃŠ°ŠŗŠ¾Šµ BOSH ŃŠµŃŠ²ŠµŃ? Š¤Š°ŠŗŃŠøŃŠµŃŠŗŠø ŃŃŠ¾ ŠæŠµŃŠµŃ
Š¾Š“Š½ŠøŠŗ Š¼ŠµŠ¶Š“Ń Jappix-ŠŗŠ»ŠøŠµŠ½ŃŠ¾Š¼ Šø XMPP-ŃŠµŃŠ²ŠµŃŠ¾Š¼, Š½ŠµŠ¾Š±Ń
Š¾Š“ŠøŠ¼ŃŠ¹ Š² ŃŠøŠ»Ń ŃŠµŃ
Š½ŠøŃŠµŃŠŗŠøŃ
Š¾Š³ŃŠ°Š½ŠøŃŠµŠ½ŠøŠ¹."
+
+msgid "Main host"
+msgstr "ŠŃŠ½Š¾Š²Š½Š¾Š¹ Ń
Š¾ŃŃ"
+
+msgid "Groupchat host"
+msgstr "Š„Š¾ŃŃ ŠŗŠ¾Š½ŃŠµŃŠµŠ½ŃŠøŠ¹"
+
+msgid "Anonymous host"
+msgstr "ŠŠ½Š¾Š½ŠøŠ¼Š½ŃŠ¹ Ń
Š¾ŃŃ"
+
+msgid "Directory host"
+msgstr "Š„Š¾ŃŃ Š“ŠøŃŠµŠŗŃŠ¾ŃŠøŠ¹"
+
+msgid "BOSH host"
+msgstr "BOSH Ń
Š¾ŃŃ"
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr "ŠŃ Š¼Š¾Š¶ŠµŃŠµ ŃŃŃŠ°Š½Š¾Š²ŠøŃŃ Š“Š¾ŠæŠ¾Š»Š½ŠøŃŠµŠ»ŃŠ½Š¾Šµ ŠŠ Š½Š° Š²Š°ŃŠµŠ¼ ŃŠµŃŠ²ŠµŃŠµ Š“Š»Ń ŃŠ°ŃŃŠøŃŠµŠ½ŠøŃ ŃŃŠ½ŠŗŃŠøŠ¾Š½Š°Š»Š°. ŠŠµŠŗŠ¾ŃŠ¾ŃŃŠµ Š¼Š¾Š³ŃŃ Š±ŃŃŃ ŠøŠ·Š¼ŠµŠ½ŠµŠ½Ń, ŠøŠ·-Š·Š° Š¾Š³ŃŠ°Š½ŠøŃŠµŠ½ŠøŠ¹ Š±ŠµŠ·Š¾ŠæŠ°ŃŠ½Š¾ŃŃŠø ŃŃŃŠ°Š½Š°Š²Š»ŠøŠ²Š°ŠµŠ¼ŃŃ
ŠæŠ¾ ŃŠ¼Š¾Š»ŃŠ°Š½ŠøŃ. "
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr "ŠŠ»Ń ŃŃŠ¾Š³Š¾ Š²Š°Š¼ Š½ŠµŠ¾Š±Ń
Š¾Š“ŠøŠ¼Š¾ ŠøŠ¼ŠµŃŃ root-Š“Š¾ŃŃŃŠæ Šŗ ŠŗŠ¾Š½ŃŠ¾Š»Šø Š²Š°ŃŠµŠ³Š¾ ŃŠµŃŠ²ŠµŃŠ°. ŠŠ¾Š¼Š½ŠøŃŠµ - ŃŃŠ¾ Š½ŠµŠ¾Š±ŃŠ·Š°ŃŠµŠ»ŃŠ½ŃŠµ Š¼Š¾Š“ŃŠ»Šø, Jappix Š±ŃŠ“ŠµŃ ŃŠ°Š±Š¾ŃŠ°ŃŃ Šø Š±ŠµŠ· Š½ŠøŃ
, Š½Š¾ Š½ŠµŠŗŠ¾ŃŠ¾ŃŃŠµ Š²Š¾Š·Š¼Š¾Š¶Š½Š¾ŃŃŠø Š±ŃŠ“ŃŃ Š½ŠµŠ“Š¾ŃŃŃŠæŠ½Ń."
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr "ŠŠ¾ŃŠ»Šµ Š¾ŠŗŠ¾Š½ŃŠ°Š½ŠøŃ ŃŃŃŠ°Š½Š¾Š²ŠŗŠø, Jappix ŃŠ³ŠµŠ½ŠµŃŠøŃŃŠµŃ ŃŠ°Š¹Š»Ń ŠŗŠµŃŠ°. ŠŃŠ¾ŃŠµŃŃ Š¼Š¾Š¶ŠµŃ Š·Š°Š½ŃŃŃ Š½ŠµŠŗŠ¾ŃŠ¾ŃŠ¾Šµ Š²ŃŠµŠ¼Ń, Š½Šµ Š½Š°Š¶ŠøŠ¼Š°Š¹ŃŠµ Š½Š° ŠŗŠ½Š¾ŠæŠŗŠø Šø ŠæŠ¾Š“Š¾Š¶Š“ŠøŃŠµ, ŠæŠ¾ŠŗŠ° Š½Šµ Š¾ŃŠ¾Š±ŃŠ°Š·ŠøŃŃŃ Š¾ŠŗŠ½Š¾ ŠæŃŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ."
+
+msgid "Thanks for using Jappix!"
+msgstr "Š”ŠæŠ°ŃŠøŠ±Š¾ Š·Š° ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµ Jappix"
+
+msgid "Next"
+msgstr "Š”Š»ŠµŠ“ŃŃŃŠøŠ¹"
+
+msgid "Finish"
+msgstr "ŠŠ¾ŃŠ¾Š²Š¾"
+
+msgid "Check again"
+msgstr "ŠŃŠ¾Š²ŠµŃŃŃŠµ ŃŠ½Š¾Š²Š°"
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr "ŠŠ°ŠæŠŗŠ° Š·Š°ŃŠøŃŠµŠ½Š° Š¾Ń Š·Š°ŠæŠøŃŠø, ŃŃŃŠ°Š½Š¾Š²ŠøŃŠµ ŠæŃŠ°Š²Š° Š½Š° Š·Š°ŠæŠøŃŃ Š“Š»Ń Š“ŠøŃŠµŠŗŃŠ¾ŃŠøŠø %s."
+
+msgid "%s is installed on your system."
+msgstr "%s ŃŃŃŠ°Š½Š¾Š²Š»ŠµŠ½ Š½Š° Š²Š°ŃŠµŠ¹ ŃŠøŃŃŠµŠ¼Šµ."
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr "%1s Š½Šµ ŃŃŃŠ°Š½Š¾Š²Š»ŠµŠ½ Š² Š²Š°ŃŠµŠ¹ ŃŠøŃŃŠµŠ¼Šµ, Š²Š°Š¼ Š½ŠµŠ¾Š±Ń
Š¾Š“ŠøŠ¼Š¾ ŃŃŃŠ°Š½Š¾Š²ŠøŃŃ %2s. "
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr "ŠŠ°ŠŗŃŠøŠ¼Š°Š»ŃŠ½ŃŠ¹ Š·Š°Š³ŃŃŠ¶Š°ŠµŠ¼ŃŠ¹ ŃŠ°Š¹Š» Š² PHP %s."
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr "Š¢ŠµŠŗŃŃŠµŠ³Š¾ PHP maximum upload size Š½ŠµŠ“Š¾ŃŃŠ°ŃŠ¾ŃŠ½Š¾ (%1s). ŠŃ Š“Š¾Š»Š¶Š½Ń Š¾ŠæŃŠµŠ“ŠµŠ»ŠøŃŃ Š“Š¾ŠæŃŃŃŠøŠ¼ŃŠ¹ ŃŠ°Š·Š¼ŠµŃ Š½Š° %2s Š² %3s."
+
+msgid "Jappix manager"
+msgstr "ŠŠµŠ½ŠµŠ“Š¶ŠµŃ Jappix"
+
+msgid "Manager access"
+msgstr "ŠŠµŠ½ŠµŠ“Š¶ŠµŃ Š“Š¾ŃŃŃŠæŠ°"
+
+msgid "Statistics"
+msgstr "Š”ŃŠ°ŃŠøŃŃŠøŠŗŠ°"
+
+msgid "Hosts"
+msgstr "Š„Š¾ŃŃŃ"
+
+msgid "Design"
+msgstr "ŠŠøŠ·Š°Š¹Š½"
+
+msgid "Repeat"
+msgstr "ŠŠ¾Š²ŃŠ¾Ń"
+
+msgid "All"
+msgstr "ŠŃŠµ"
+
+msgid "Horizontal"
+msgstr "ŠŠ¾ŃŠøŠ·Š¾Š½ŃŠ°Š»ŃŠ½ŃŠ¹"
+
+msgid "Vertical"
+msgstr "ŠŠµŃŃŠøŠŗŠ°Š»ŃŠ½ŃŠ¹"
+
+msgid "Center"
+msgstr "Š”ŠµŃŠµŠ“ŠøŠ½Š°"
+
+msgid "Left"
+msgstr "ŠŠµŠ²ŃŠ¹"
+
+msgid "Right"
+msgstr "ŠŃŠ°Š²ŃŠ¹"
+
+msgid "Top"
+msgstr "ŠŠµŃŃ
"
+
+msgid "Bottom"
+msgstr "ŠŠøŠ·"
+
+msgid "Adapt"
+msgstr "ŠŃŠøŠ½ŃŃŃ"
+
+msgid "Color"
+msgstr "Š¦Š²ŠµŃ"
+
+msgid "Users"
+msgstr "ŠŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Šø"
+
+msgid "Updates"
+msgstr "ŠŠ±Š½Š¾Š²Š»ŠµŠ½ŠøŃ"
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr "ŠŠ°ŠæŃŠµŃŠ½Š°Ń Š¾Š±Š»Š°ŃŃŃ: Š»ŠøŃŃ ŃŃŠ²ŠµŃŠ¶Š“ŠµŠ½Š½ŃŠµ ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Šø Š¼Š¾Š³ŃŃ ŠæŃŠ°Š²ŠøŃŃ ŃŃŠ¾Ń ŃŠ·ŠµŠ» Jappix."
+
+msgid "Please use the form below to login to the administration panel."
+msgstr "ŠŃŠæŠ¾Š»ŃŠ·ŃŠ¹ŃŠµ Š½ŠøŠ¶ŠµŠæŃŠøŠ²ŠµŠ“ŠµŠ½Š½ŃŃ ŃŠ¾ŃŠ¼Ń Š“Š»Ń Š“Š¾ŃŃŃŠæŠ° Šŗ ŠæŠ°Š½ŠµŠ»Šø Š°Š“Š¼ŠøŠ½ŠøŃŃŃŠøŃŠ¾Š²Š°Š½ŠøŃ."
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr "Š ŃŠµŠ»ŃŃ
Š±ŠµŠ·Š¾ŠæŠ°ŃŠ½Š¾ŃŃŠø ŃŠµŃŃŠøŃ Š¾Š³ŃŠ°Š½ŠøŃŠµŠ½Š° ŠæŠ¾ Š²ŃŠµŠ¼ŠµŠ½Šø, Šø, ŠŗŠ¾Š³Š“Š° Š²Š°Ń Š±ŃŠ°ŃŠ·ŠµŃ Š±ŃŠ“ŠµŃ Š·Š°ŠŗŃŃŃ, Š²Ń ŃŠ°ŠŗŠ¶Šµ Š²ŃŠ¹Š“ŠµŃŠµ ŠøŠ· Š½ŠµŠµ."
+
+msgid "Credentials"
+msgstr "ŠŠ¾Š»Š½Š¾Š¼Š¾ŃŠøŃ"
+
+msgid "You have been logged out. Goodbye!"
+msgstr "ŠŃ Š²ŃŃŠ»Šø ŠøŠ· ŃŠøŃŃŠµŠ¼Ń. ŠŠ¾ ŃŠ²ŠøŠ“Š°Š½ŠøŃ!"
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr "ŠŠæŠ°! ŠŃ Š½Šµ ŠæŃŠøŠ·Š½Š°Š½Ń Š“ŠµŠ¹ŃŃŠ²ŃŃŃŠøŠ¼ Š°Š“Š¼ŠøŠ½ŠøŃŃŃŠ°ŃŠ¾ŃŠ¾Š¼. ŠŃŠ¾Š²ŠµŃŃŃŠµ Š²Š°ŃŠø ŠæŠ¾Š»Š½Š¾Š¼Š¾ŃŠøŃ!"
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr "ŠŃŠ½Š¾Š²Š½ŃŠµ ŃŃŠ°ŃŠøŃŃŠøŃŠµŃŠŗŠøŠµ Š“Š°Š½Š½ŃŠµ Š¾ Š²Š°Š¶Š½ŃŃ
ŃŠ¾Š±ŃŃŠøŃŃ
, Š¾Š±ŃŠ°Š±Š¾ŃŠ°Š½Š½ŃŠµ Jappix, Š²Ń Š¼Š¾Š¶ŠµŃŠµ Š½Š°Š¹ŃŠø Š½ŠøŠ¶Šµ."
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr "ŠŠ·Š¼ŠµŠ½ŠøŃŠµ ŠŗŠ¾Š½ŃŠøŠ³ŃŃŠ°ŃŠøŃ ŃŠ·Š»Š° Jappix, ŃŃŠøŠ¼ ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½ŃŠ¾Š¼."
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr "ŠŠ·Š¼ŠµŠ½ŠøŃŠµ XMPP Ń
Š¾ŃŃŃ, Š¾Š±ŃŠ»ŃŠ¶ŠøŠ²Š°ŠµŠ¼ŃŠµ ŃŃŠøŠ¼ Jappix ŃŠ·Š»Š¾Š¼, ŃŃŠøŠ¼ ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½ŃŠ¾Š¼."
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr "ŠŃŠµŠ¼Šø Ń
ŃŠ°Š½ŃŃŠøŠ¼ŠøŃŃ Š½Š° ŃŃŠ¾Š¼ Jappix ŃŠ·Š»Š¾Šµ ŃŠ°Š¹Š»Š°Š¼Šø, Š¼Š¾Š¶Š½Š¾ ŃŠæŃŠ°Š²Š»ŃŃŃ Ń ŠæŠ¾Š¼Š¾ŃŃŃ ŃŃŠ¾Š³Š¾ ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½ŃŠ°: ŠŠ¾Š¶Š°Š»ŃŠ¹ŃŃŠ°, Š²ŃŠ±ŠµŃŠøŃŠµ ŠæŠ¾Š“-Š“ŠøŃŠµŠŗŃŠ¾ŃŠøŃ Šø Š½Š°ŃŠ½ŠøŃŠµ ŃŠµŠ“Š°ŠŗŃŠøŃŠ¾Š²Š°ŃŃ ŠµŠµ ŃŠ¾Š“ŠµŃŠ¶ŠøŠ¼Š¾Šµ!"
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr "Jappix ŠæŠ¾Š»Š½Š¾ŃŃŃŃ Š½Š°ŃŃŃŠ°ŠøŠ²Š°ŠµŠ¼ŃŠ¹: Š²Ń Š¼Š¾Š¶ŠµŃŠµ ŠøŠ·Š¼ŠµŠ½ŠøŃŃ ŠµŠ³Š¾ Š“ŠøŠ·Š°Š¹Š½ ŠæŃŃŠ¼Š¾ Š·Š“ŠµŃŃ."
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr "ŠŃŠ¾ Š½ŠµŠ“Š¾ŠæŃŃŃŠøŠ¼ŃŠ¹ ŃŠ¾ŃŠ¼Š°Ń ŠøŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃ, ŠæŠ¾Š¶Š°Š»ŃŠ¹ŃŃŠ° ŠøŃŠæŠ¾Š»ŃŠ·ŃŠ¹ŃŠµ PNG, GIF ŠøŠ»Šø JPG!"
+
+msgid "The image could not be received, would you mind retry?"
+msgstr "ŠŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµ Š½Šµ Š¼Š¾Š¶ŠµŃ Š±ŃŃŃ ŠæŠ¾Š»ŃŃŠµŠ½Š¾. ŠŠµ Ń
Š¾ŃŠøŃŠµ ŠæŠ¾ŠæŃŠ¾Š±Š¾Š²Š°ŃŃ ŃŠ½Š¾Š²Š°?"
+
+msgid "Your image was added to the list!"
+msgstr "ŠŠ°Ń ŃŠøŃŃŠ½Š¾Šŗ Š±ŃŠ» Š“Š¾Š±Š°Š²Š»ŠµŠ½ Šŗ ŃŠæŠøŃŠŗŃ!"
+
+msgid "Changes saved!"
+msgstr "ŠŠ·Š¼ŠµŠ½ŠµŠ½ŠøŃ ŃŠ¾Ń
ŃŠ°Š½ŠµŠ½Ń!"
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr "ŠŃ Š¼Š¾Š¶ŠµŃŠµ Š¾ŠæŃŠµŠ“ŠµŠ»ŠøŃŃ Š±Š¾Š»ŠµŠµ Š¾Š“Š½Š¾Š³Š¾ Š°Š“Š¼ŠøŠ½ŠøŃŃŃŠ°ŃŠ¾ŃŠ° Š“Š»Ń ŃŃŠ¾Š³Š¾ Jappix ŃŠ·Š»Š°. Š¢Š°ŠŗŠ¶Šµ Š¼Š¾Š¶Š½Š¾ ŃŠ¼ŠµŠ½ŠøŃŃ ŠæŠ°ŃŠ¾Š»Ń, Ń ŠæŠ¾Š¼Š¾ŃŃŃ ŃŃŠ¾Š³Š¾ ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½ŃŠ°."
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr "ŠŠ±Š½Š¾Š²ŠøŃŠµ Jappix ŃŠ·ŠµŠ» ŃŃŠøŠ¼ ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½ŃŠ¾Š¼, ŠøŠ»Šø ŠæŃŠ¾Š²ŠµŃŃŃŠµ, Š½Šµ Š“Š¾ŃŃŃŠæŠµŠ½ Š»Šø Š½Š¾Š²ŃŠ¹. ŠŠ½ŃŠ¾ŃŠ¼Š°ŃŠøŃ Š¾ ŠæŠ¾ŃŠ»ŠµŠ“Š½ŠµŠ¹ Š²ŠµŃŃŠøŠø ŃŠ¾Š¶Šµ Š¾ŃŠ¾Š±ŃŠ°Š¶Š°ŠµŃŃŃ (Š½Š° Š°Š½Š³Š»ŠøŠ¹ŃŠŗŠ¾Š¼)"
+
+msgid "Access statistics"
+msgstr "ŠŠ¾ŃŃŃŠæ Šŗ ŃŃŠ°ŃŠøŃŃŠøŠŗŠµ"
+
+msgid "Share statistics"
+msgstr "ŠŠ¾Š“ŠµŠ»ŠøŃŃŃ ŃŃŠ°ŃŠøŃŃŠøŠŗŠ¾Š¹"
+
+msgid "Other statistics"
+msgstr "ŠŃŃŠ³Š°Ń ŃŃŠ°ŃŠøŃŃŠøŠŗŠ°"
+
+msgid "January"
+msgstr "ŠÆŠ½Š²Š°ŃŃ"
+
+msgid "February"
+msgstr "Š¤ŠµŠ²ŃŠ°Š»Ń"
+
+msgid "March"
+msgstr "ŠŠ°ŃŃ"
+
+msgid "April"
+msgstr "ŠŠæŃŠµŠ»Ń"
+
+msgid "May"
+msgstr "ŠŠ°Š¹"
+
+msgid "June"
+msgstr "ŠŃŠ½Ń"
+
+msgid "July"
+msgstr "ŠŃŠ»Ń"
+
+msgid "August"
+msgstr "ŠŠ²Š³ŃŃŃ"
+
+msgid "September"
+msgstr "Š”ŠµŠ½ŃŃŠ±ŃŃ"
+
+msgid "October"
+msgstr "ŠŠŗŃŃŠ±ŃŃ"
+
+msgid "November"
+msgstr "ŠŠ¾ŃŠ±ŃŃ"
+
+msgid "December"
+msgstr "ŠŠµŠŗŠ°Š±ŃŃ"
+
+msgid "Monday"
+msgstr "ŠŠ¾Š½ŠµŠ“ŠµŠ»ŃŠ½ŠøŠŗ"
+
+msgid "Tuesday"
+msgstr "ŠŃŠ¾ŃŠ½ŠøŠŗ"
+
+msgid "Wednesday"
+msgstr "Š”ŃŠµŠ“Š°"
+
+msgid "Thursday"
+msgstr "Š§ŠµŃŠ²ŠµŃŠ³"
+
+msgid "Friday"
+msgstr "ŠŃŃŠ½ŠøŃŠ°"
+
+msgid "Saturday"
+msgstr "Š”ŃŠ±Š±Š¾ŃŠ°"
+
+msgid "Sunday"
+msgstr "ŠŠ¾ŃŠŗŃŠµŃŠµŠ½ŃŠµ"
+
+msgid "Total"
+msgstr "ŠŃŠµŠ³Š¾"
+
+msgid "Cache"
+msgstr "ŠŠµŃ"
+
+msgid "Logs"
+msgstr "ŠŃŃŠ¾ŃŠøŃ"
+
+msgid "Music"
+msgstr "ŠŃŠ·ŃŠŗŠ°"
+
+msgid "Backgrounds"
+msgstr "Š¤Š¾Š½"
+
+msgid "Share"
+msgstr "ŠŠ¾Š“ŠµŠ»ŠøŃŃŃŃ"
+
+msgid "Background"
+msgstr "Š¤Š¾Š½"
+
+msgid "Notice"
+msgstr "Š£Š²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŠµ"
+
+msgid "Your design preferences have been saved!"
+msgstr "ŠŠ°ŃŠø Š½Š°ŃŃŃŠ¾Š¹ŠŗŠø Š“ŠøŠ·Š°Š¹Š½Š° Š±ŃŠ»Šø ŃŠ¾Ń
ŃŠ°Š½ŠµŠ½Ń!"
+
+msgid "Please check your inputs: something is missing!"
+msgstr "ŠŠ¾Š¶Š°Š»ŃŠ¹ŃŃŠ° ŠæŃŠ¾Š²ŠµŃŃŃŠµ Š²Š²Š¾Š“: ŃŠµŠ³Š¾-ŃŠ¾ Š½Šµ Ń
Š²Š°ŃŠ°ŠµŃ!"
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr "ŠŠ·Š¼ŠµŠ½ŠøŃŠµ ŃŠ¾Š½ Š²Š°ŃŠµŠ³Š¾ Jappix ŃŠ·Š»Š° ŃŃŠøŠ¼ ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½ŃŠ¾Š¼. ŠŃ Š¼Š¾Š¶ŠµŃŠµ ŃŃŃŠ°Š½Š¾Š²ŠøŃŃ ŃŠ²Š¾Š¹ ŃŠ²ŠµŃ ŠøŠ»Šø Š·Š°Š³ŃŃŠ·ŠøŃŃ ŠøŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµ. ŠŠ°Š¹ŃŠµ Š²Š¾Š»Ń ŃŠ°Š½ŃŠ°Š·ŠøŠø!"
+
+msgid "Use default background"
+msgstr "ŠŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŃ ŃŠ¾Š½ ŠæŠ¾ ŃŠ¼Š¾Š»ŃŠ°Š½ŠøŃ."
+
+msgid "Use your own image"
+msgstr "ŠŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŃ ŃŠ¾Š±ŃŃŠ²ŠµŠ½Š½ŃŃ ŠŗŠ°ŃŃŠøŠ½ŠŗŃ"
+
+msgid "Select a background to use and change the display options."
+msgstr "ŠŃŠ±ŠµŃŠøŃŠµ ŃŠ¾Š½ Šø ŃŠ¼ŠµŠ½ŠøŃŠµ ŠæŠ°ŃŠ°Š¼ŠµŃŃŃ Š¾ŃŠ¾ŃŠ°Š¶ŠµŠ½ŠøŃ."
+
+msgid "Use your own color"
+msgstr "ŠŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŃ ŃŠ¾Š±ŃŃŠ²ŠµŠ½Š½ŠøŠ¹ ŃŠ²ŠµŃ"
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr "ŠŠ²ŠµŠ“ŠøŃŠµ ŃŠµŃŠ½Š°Š“ŃŠ°ŃŠøŃŠøŃŠ½Š¾Šµ Š·Š½Š°ŃŠµŠ½ŠøŠµ ŃŠ²ŠµŃŠ°, ŠŗŠ¾ŃŠ¾ŃŃŠ¹ Š²Ń Ń
Š¾ŃŠøŃŠµ ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŃ Š“Š»Ń ŃŠ¾Š½Š°."
+
+msgid "Manage backgrounds"
+msgstr "Š£ŠæŃŠ°Š²Š»ŠµŠ½ŠøŠµ ŃŠ¾Š½Š¾Š¼"
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr "ŠŃ Š¼Š¾Š¶ŠµŃŠµ Š“Š¾Š±Š°Š²ŠøŃŃ Š½Š¾Š²ŃŠ¹ ŃŠ¾Š½ Š² ŃŠæŠøŃŠ¾Šŗ, ŃŃŠøŠ¼ ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½ŃŠ¾Š¼. ŠŠ¾Š¶Š°Š»ŃŠ¹ŃŃŠ°, Š“Š¾Š±Š°Š²ŃŃŠµ ŠæŠ¾Š“Š“ŠµŃŠ¶ŠøŠ²Š°ŠµŠ¼Š¾Šµ ŠøŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµ."
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr "ŠŃŠ»Šø Š²Ń Ń
Š¾ŃŠøŃŠµ ŃŠ“Š°Š»ŠøŃŃ ŃŠ¾Š½Š¾Š²ŃŠµ ŠŗŠ°ŃŃŠøŠ½ŠŗŠø, ŠøŃŠæŠ¾Š»ŃŠ·ŃŠ¹ŃŠµ Š±ŃŠ°ŃŠ·ŠµŃ Š½ŠøŠ¶Šµ."
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr "ŠŃ Š¼Š¾Š¶ŠµŃŠµ ŃŃŃŠ°Š½Š¾Š²ŠøŃŃ ŠæŃŠµŠ“ŃŠæŃŠµŠ¶Š“ŠµŠ½ŠøŃ Šø ŃŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŃ Š½Š° Š³Š»Š°Š²Š½Š¾Š¹ ŃŃŃŠ°Š½ŠøŃŠµ Ń ŠæŠ¾Š¼Š¾ŃŃŃ ŃŃŠ¾Š³Š¾ ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½ŃŠ°."
+
+msgid "Simple notice"
+msgstr "ŠŃŠ¾ŃŃŠ¾Šµ ŃŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŠµ"
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr "ŠŃŠ¾ ŃŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŠµ Š“Š¾Š»Š¶Š½Š¾ Š±ŃŃŃ Š¾Š±ŃŃŠ½ŃŠ¼ ŃŠµŠŗŃŃŠ¾Š¼, ŠŗŠ¾Š“ Š½Šµ Š“Š¾ŠæŃŃŃŠøŠ¼!"
+
+msgid "Advanced notice"
+msgstr "Š Š°ŃŃŠøŃŠµŠ½Š½Š¾Šµ ŃŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŠµ"
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr "ŠŃ Š¼Š¾Š¶ŠµŃŠµ Š½Š°ŃŃŃŠ¾ŠøŃŃ Š²ŠøŠ“ ŃŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŃ Ń ŠæŠ¾Š¼Š¾ŃŃŃ HTML, CSS Šø JavaScript, Š½Š¾ Š²Š°Š¼ Š½ŃŠ¶Š½Š¾ Š½Š°ŠæŠøŃŠ°ŃŃ ŃŃŠøŠ»Ń."
+
+msgid "Available updates"
+msgstr "ŠŠ¾ŃŃŃŠæŠ½ŃŠµ Š¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŃ"
+
+msgid "What's new?"
+msgstr "Š§ŃŠ¾ Š½Š¾Š²Š¾Š³Š¾?"
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr "ŠŠ°ŃŠø ŠæŠ°ŠæŠŗŠø Ń
ŃŠ°Š½ŠµŠ½ŠøŃ Š·Š°ŃŠøŃŠµŠ½Ń Š¾Ń Š·Š°ŠæŠøŃŠø. ŠŠ¾Š¶Š°Š»ŃŠ¹ŃŃŠ°, ŃŃŃŠ°Š½Š¾Š²ŠøŃŠµ ŃŠ¾Š¾ŃŠ²ŠµŃŃŃŠ²ŃŃŃŠøŠµ ŠæŃŠ°Š²Š°!"
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr "%1s Š¼Š¾Š¶ŠµŃ Š²ŃŠ·Š²Š°ŃŃ ŠæŃŠ¾Š±Š»ŠµŠ¼Ń Ń proxy, ŠæŠ¾Š¶Š°Š»ŃŠ¹ŃŃŠ° ŃŠ²ŠµŠ»ŠøŃŃŠµ Š·Š½Š°ŃŠµŠ½ŠøŠµ %2s Š“Š¾ %3s!"
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr "ŠŃ ŠøŃŠæŠ¾Š»ŃŠ·ŃŠµŃŠµ Š²ŠµŃŃŠøŃ ŃŠ°Š·ŃŠ°Š±Š¾ŃŃŠøŠŗŠ° Š“Š»Ń Jappix. ŠŠ±Š½Š¾Š²ŠøŃŠµ ŠµŠµ ŠøŠ· Š½Š°ŃŠµŠ³Š¾ ŃŠµŠæŠ¾Š·ŠøŃŠ¾ŃŠøŃ Š²ŃŠæŠ¾Š»Š½ŠøŠ²: %s."
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr "ŠŠ¾ŃŃŃŠæŠ½Š° Š½Š¾Š²Š°Ń Š²ŠµŃŃŠøŃ Jappix! ŠŃŠ¾Š²ŠµŃŃŃŠµ ŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŃ Šø Š·Š°ŠæŃŃŃŠøŃŠµ Š¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŠµ!"
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr "ŠŠ°ŃŠ° Š²ŠµŃŃŠøŃ ŃŃŃŠ°ŃŠµŠ»Š°. ŠŠ±Š½Š¾Š²ŠøŃŠµ ŠµŠµ Š“Š¾ %s, ŠŗŠ»ŠøŠŗŠ½ŃŠ² Š·Š“ŠµŃŃ!"
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr "ŠŠ°ŃŃ Š²ŠµŃŃŠøŃ Š½ŠµŠæŠ»Š¾Ń
Š¾ Š±Ń Š¾Š±Š½Š¾Š²ŠøŃŃ, Š½Š¾ Š²Ń Š¼Š¾Š¶ŠµŃŠµ Š²ŃŠ±ŃŠ°ŃŃ Š¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŠµ ŃŠ¾Š±ŃŃŠ²ŠµŠ½Š½Š¾ŃŃŃŠ½Š¾ ŠŗŠ»ŠøŠŗŠ½ŃŠ² Š·Š“ŠµŃŃ."
+
+msgid "Check for updates"
+msgstr "ŠŃŠ¾Š²ŠµŃŠøŃŃ Š¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŃ"
+
+msgid "Update in progress"
+msgstr "ŠŠ±Š½Š¾Š²Š»ŠµŠ½ŠøŠµ..."
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr "Jappix Š±ŃŠ» Š¾Š±Š½Š¾Š²Š»ŠµŠ½: ŃŠµŠæŠµŃŃ Ń Š²Š°Ń Š·Š°ŠæŃŃŠµŠ½Š° ŃŠ²ŠµŠ¶Š°Š¹ŃŠ°Ń Š²ŠµŃŃŠøŃ. ŠŠ°ŃŠ»Š°Š¶Š“Š°Š¹ŃŠµŃŃ!"
+
+msgid "The update has failed! Please try again later."
+msgstr "ŠŃŠøŠ±ŠŗŠ° ŠæŃŠø Š¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŠø! ŠŠ¾ŠæŃŠ¾Š±ŃŠ¹ŃŠµ ŠµŃŠµ ŃŠ°Š·."
+
+msgid "Downloading package..."
+msgstr "ŠŠ°Š³ŃŃŠ·ŠŗŠ° ŠæŠ°ŠŗŠµŃŠ°..."
+
+msgid "Removing current Jappix system files..."
+msgstr "Š£Š“Š°Š»ŠµŠ½ŠøŠµ ŃŠµŠŗŃŃŠøŃ
ŃŠøŃŃŠµŠ¼Š½ŃŃ
ŃŠ°Š¹Š»Š¾Š² Jappix..."
+
+msgid "Extracting package..."
+msgstr "ŠŠ·Š²Š»ŠµŃŠµŠ½ŠøŠµ ŠæŠ°ŠŗŠµŃŠ°..."
+
+msgid "Regenerating storage folder tree..."
+msgstr "ŠŠ¾ŃŃŃŠ°Š½Š¾Š²Š»ŠµŠ½ŠøŠµ Š“ŠµŃŠµŠ²Š° ŠŗŠ°ŃŠ°Š»Š¾Š³Š°..."
+
+msgid "Jappix is now up to date!"
+msgstr "Jappix Š¾Š±Š½Š¾Š²Š»ŠµŠ½!"
+
+msgid "Aborted: socket error!"
+msgstr "ŠŃŠµŃŠ²Š°Š½Š¾: Š¾ŃŠøŠ±ŠŗŠ° ŃŠ¾ŠŗŠµŃŠ°!"
+
+msgid "Aborted: buffer error!"
+msgstr "ŠŃŠµŃŠ²Š°Š½Š¾: Š¾ŃŠøŠ±ŠŗŠ° Š±ŃŃŠµŃŠ°!"
+
+msgid "Aborted: everything is not writable!"
+msgstr "ŠŃŠµŃŠ²Š°Š½Š¾: Š²ŃŠµ Š·Š°ŃŠøŃŠµŠ½Š¾ Š¾Ń Š·Š°ŠæŠøŃŠø!"
+
+msgid "Aborted: could not extract the package!"
+msgstr "ŠŃŠµŃŠ²Š°Š½Š¾: Š½ŠµŠ²Š¾Š·Š¼Š¾Š¶Š½Š¾ ŠøŠ·Š²Š»ŠµŃŃ ŠæŠ°ŠŗŠµŃ!"
+
+msgid "Visits"
+msgstr "ŠŠ¾ŃŠµŃŠµŠ½ŠøŃ"
+
+msgid "Daily"
+msgstr "ŠŠ¶ŠµŠ“Š½ŠµŠ²Š½Š¾"
+
+msgid "Weekly"
+msgstr "ŠŠ¶ŠµŠ½ŠµŠ“ŠµŠ»ŃŠ½Š¾"
+
+msgid "Monthly"
+msgstr "ŠŠ¶ŠµŠ¼ŠµŃŃŃŠ½Š¾"
+
+msgid "Yearly"
+msgstr "ŠŠ¶ŠµŠ³Š¾Š“Š½Š¾"
+
+msgid "Size"
+msgstr "Š Š°Š·Š¼ŠµŃ"
+
+msgid "Clean everything"
+msgstr "ŠŃŠøŃŃŠøŃŃ Š²ŃŠµ"
+
+msgid "Purge cache"
+msgstr "ŠŃŠøŃŃŠøŃŃ ŠŗŠµŃ"
+
+msgid "Purge logs"
+msgstr "ŠŃŠøŃŃŠøŃŃ ŠøŃŃŠ¾ŃŠøŃ"
+
+msgid "Purge updates"
+msgstr "Š£Š“Š°Š»ŠøŃŃ Š¾Š±Š½Š¾Š²Š»ŠµŠ½ŠøŃ"
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr "ŠŠ°ŠæŠŗŠ° ŠŗŠ¾ŃŠ¾ŃŃŃ Š²Ń Ń
Š¾ŃŠøŃŠµ Š¾ŃŠøŃŃŠøŃŃ, ŠæŃŃŃŠ°."
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr "Š„ŃŠ°Š½ŠøŃŠµ ŃŠ²Š¾Š¹ Jappix ŃŠ·ŠµŠ» Š² ŃŠøŃŃŠ¾ŃŠµ Šø ŠæŠ¾ŃŃŠ“ŠŗŠµ, ŃŠµŠ³ŃŠ»ŃŃŠ½Š¾ Š¾ŃŠøŃŠ°Š¹ŃŠµ ŠæŠ°ŠæŠŗŠø Ń
ŃŠ°Š½ŠµŠ½ŠøŃ!"
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr "ŠŃŠ³ŃŃŠ·ŠøŃŠµ Š²Š°ŃŃ Š¼ŃŠ·ŃŠŗŃ (Ogg Vorbis, MP3 ŠøŠ»Šø WAV), ŃŃŠ¾Š±Ń ŃŠ»ŃŃŠ°ŃŃ ŠµŠµ Š² Jappix!"
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr "Š¤Š°Š¹Š» ŠŗŠ¾ŃŠ¾ŃŃŠ¹ Š²Ń Ń
Š¾ŃŠøŃŠµ Š·Š°Š³ŃŃŠ·ŠøŃŃ Š“Š¾Š»Š¶ŠµŠ½ Š±ŃŃŃ Š¼ŠµŠ½ŃŃŠµ %s."
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr "ŠŃŠ“ŃŃŠµ Š² ŠŗŃŃŃŠµ ŃŠ¾Š³Š¾, ŃŃŠ¾ Ń
ŃŠ°Š½ŃŃ Š²Š°ŃŠø ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Šø Š½Š° Š²Š°ŃŠµŠ¼ ŃŠµŃŠ²ŠµŃŠµ, Šø ŃŠ“Š°Š»ŃŠ¹ŃŠµ Š½ŠµŠ¶ŠµŠ»Š°ŃŠµŠ»ŃŠ½ŃŠ¹ ŠŗŠ¾Š½ŃŠµŠ½Ń ŃŃŠøŠ¼ ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½ŃŠ¾Š¼."
+
+msgid "Title"
+msgstr "ŠŠ°Š·Š²Š°Š½ŠøŠµ"
+
+msgid "Artist"
+msgstr "ŠŃŃŠøŃŃ"
+
+msgid "Album"
+msgstr "ŠŠ»ŃŠ±Š¾Š¼"
+
+msgid "File"
+msgstr "Š¤Š°Š¹Š»"
+
+msgid "Upload"
+msgstr "ŠŠ°Š³ŃŃŠ·ŠøŃŃ"
+
+msgid "The folder is empty."
+msgstr "ŠŃŠ° ŠæŠ°ŠæŠŗŠ° ŠæŃŃŃŠ°."
+
+msgid "The music could not be received, please retry!"
+msgstr "ŠŠµ ŃŠ“Š°Š»Š¾ŃŃ ŠæŠ¾Š»ŃŃŠøŃŃ Š¼ŃŠ·ŃŠŗŃ, ŠæŠ¾Š¶Š°Š»ŃŠ¹ŃŃŠ° ŠæŠ¾ŠæŃŠ¾Š±ŃŠ¹ŃŠµ ŃŠ½Š¾Š²Š°!"
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr "ŠŃŠ¾ Š½ŠµŠ“Š¾ŠæŃŃŃŠøŠ¼ŃŠ¹ Š°ŃŠ“ŠøŠ¾ ŃŠ°Š¹Š», ŠæŠ¾Š¶Š°Š»ŃŠ¹ŃŃŠ°, ŠøŃŠæŠ¾Š»ŃŠ·ŃŠ¹ŃŠµ Ogg Vorbis, MP3 ŠøŠ»Šø WAV!"
+
+msgid "Your music has been added!"
+msgstr "ŠŠ°ŃŠ° Š¼ŃŠ·ŃŠŗŠ° Š“Š¾Š±Š°Š²Š»ŠµŠ½Š°!"
+
+msgid "The selected elements have been removed."
+msgstr "ŠŃŠ±ŃŠ°Š½Š½ŃŠ¹ ŃŠ»ŠµŠ¼ŠµŠ½Ń Š±ŠøŠ» ŃŠ“Š°Š»ŠµŠ½."
+
+msgid "You must select elements to remove!"
+msgstr "ŠŃŠ±ŠµŃŠøŃŠµ ŃŠ“Š°Š»ŃŠµŠ¼ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ!"
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr "ŠŠ¾Š±Š°Š²ŠøŃŃ Š½Š¾Š²Š¾Š³Š¾ ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń ŠøŠ»Šø ŠøŠ·Š¼ŠµŠ½ŠøŃŃ ŠæŠ°ŃŠ¾Š»Ń (Š²Š²ŠµŃŃŠø ŃŃŃŠµŃŃŠ²ŃŃŃŠµŠµ ŠøŠ¼Ń). ŠŃŠæŠ¾Š»ŃŠ·ŃŠ¹ŃŠµ ŃŠ»Š¾Š¶Š½ŃŠ¹ ŠæŠ°ŃŠ¾Š»Ń!"
+
+msgid "Manage"
+msgstr "Š£ŠæŃŠ°Š²Š»ŠµŠ½ŠøŠµ"
+
+msgid "List"
+msgstr "Š”ŠæŠøŃŠ¾Šŗ"
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr "ŠŃ Š¼Š¾Š¶ŠµŃŠµ ŃŠ“Š°Š»ŃŃŃ ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»ŠµŠ¹ Ń ŠæŠ¾Š¼Š¾ŃŃŃ ŃŃŠ¾Š³Š¾ ŠøŠ½ŃŃŃŃŠ¼ŠµŠ½ŃŠ°. ŠŠ¼ŠµŠ¹ŃŠµ Š² Š²ŠøŠ“Ń, ŃŃŠ¾ Š½ŠµŠ»ŃŠ·Ń ŃŠ“Š°Š»ŠøŃŃ ŠæŠ¾ŃŠ»ŠµŠ“Š½ŠµŠ³Š¾ Š¾ŃŃŠ°Š²ŃŠµŠ³Š¾ŃŃ ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń."
+
+msgid "The user has been added!"
+msgstr "ŠŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń Š“Š¾Š±Š°Š²Š»ŠµŠ½!"
+
+msgid "The chosen users have been removed."
+msgstr "ŠŃŠ±ŃŠ°Š½Š½ŃŠµ ŠæŠ¾Š»ŃŠ·Š·Š¾Š²Š°ŃŠµŠ»Šø ŃŠ“Š°Š»ŠµŠ½Ń."
+
+msgid "You must select one or more users to be removed!"
+msgstr "ŠŃŠ±ŠµŃŠøŃŠµ Š¾Š“Š½Š¾Š³Š¾ ŠøŠ»Šø Š±Š¾Š»ŠµŠµ Š“Š»Ń ŃŠ“Š°Š»ŠµŠ½ŠøŃ!"
+
+msgid "Yesterday"
+msgstr "ŠŃŠµŃŠ°"
+
+msgid "%s days ago"
+msgstr "%s Š“Š½ŠµŠ¹ Š½Š°Š·Š°Š“"
+
+msgid "User currently active"
+msgstr "Š”ŠµŠ¹ŃŠ°Ń Š°ŠŗŃŠøŠ²ŠµŠ½"
+
+msgid "Last seen: %s"
+msgstr "ŠŠ¾ŃŠ»ŠµŠ“Š½ŠøŠ¹ ŃŠ°Š· Š±ŃŠ»: %s"
+
+msgid "Inactive since: %s"
+msgstr "ŠŠµŠ·Š“ŠµŠ¹ŃŃŠ²ŃŠµŃ Ń %s"
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr "ŠŠ¾Ń
Š¾Š¶Šµ Š²Š°ŃŠø Š“ŃŃŠ·ŃŃ Š½Šµ ŠæŠ¾Š»ŃŃŠ°ŃŃ ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŠ¹!"
+
+msgid "Static content server"
+msgstr "Š”ŠµŃŠ²ŠµŃ ŃŃŠ°ŃŠøŃŠµŃŠŗŠ¾Š³Š¾ ŠŗŠ¾Š½ŃŠµŠ½ŃŠ°"
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr "ŠŃŠ¾ ŃŠµŃŠ²ŠµŃ ŃŃŠ°ŃŠøŃŠµŃŠŗŠ¾Š³Š¾ ŠŗŠ¾Š½ŃŠµŠ½ŃŠ° Š“Š»Ń %1, ā%2sā."
+
+msgid "Suggested friends"
+msgstr "Š ŠµŠŗŠ¾Š¼ŠµŠ½Š“Š¾Š²Š°Š½ŃŠµ Š“ŃŃŠ·ŃŃ"
+
+msgid "Check all"
+msgstr "ŠŃŠ¼ŠµŃŠøŃŃ Š²ŃŠµ"
+
+msgid "Uncheck all"
+msgstr "ŠŃŠ¼ŠµŠ½ŠøŃŃ Š²ŃŠ±Š¾Ń"
+
+msgid "Choose"
+msgstr "ŠŃŠ±ŠµŃŠøŃŠµ"
+
+msgid "List name"
+msgstr "Š¤Š°Š¼ŠøŠ»ŠøŃ"
+
+msgid "Allow"
+msgstr "ŠŠ°Š·ŃŠµŃŠøŃŃ"
+
+msgid "Deny"
+msgstr "ŠŃŠŗŠ°Š·Š°ŃŃ"
+
+msgid "Group"
+msgstr "ŠŃŃŠæŠæŠ°"
+
+msgid "Subscription"
+msgstr "ŠŠ¾Š“ŠæŠøŃŠŗŠ°"
+
+msgid "Both"
+msgstr "ŠŠ±Š°"
+
+msgid "From"
+msgstr "ŠŃ"
+
+msgid "Everybody"
+msgstr "ŠŃŠµ"
+
+msgid "Send messages"
+msgstr "ŠŠ¾ŃŠ»Š°ŃŃ ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŠµ"
+
+msgid "Send queries"
+msgstr "ŠŠ¾ŃŠ»Š°ŃŃ Š·Š°ŠæŃŠ¾Ń"
+
+msgid "See my status"
+msgstr "Š”Š¼Š¾ŃŃŠø Š¼Š¾Š¹ ŃŃŠ°ŃŃŃ"
+
+msgid "Send his/her status"
+msgstr "ŠŃŠæŃŠ°Š²Š»ŃŃŃ ŃŃŠ°ŃŃŃ"
+
+msgid "Everything"
+msgstr "ŠŃŠµ"
+
+msgid "Item"
+msgstr "ŠŃŠµŠ“Š¼ŠµŃ"
+
+msgid "Order"
+msgstr "ŠŠ°ŠæŃŠ¾Ń"
+
+msgid "Active for this session"
+msgstr "ŠŠŗŃŠøŠ²Š½ŃŠ¹ Š½Š° ŃŠµŃŃŠøŃ"
+
+msgid "Always active"
+msgstr "ŠŃŠµŠ³Š“Š° Š°ŠŗŃŠøŠ²Š½ŃŠ¹"
+
+msgid "User directory"
+msgstr "ŠŠ°ŃŠ°Š»Š¾Š³ ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń"
+
+msgid "Search a friend"
+msgstr "ŠŠ¾ŠøŃŠŗ Š“ŃŃŠ³Š°"
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr "ŠŠ°ŠæŃŠ¾ŃŠµŠ½Š½Š°Ń ŃŃŠ½ŠŗŃŠøŃ Š½Šµ Š²ŃŠæŠ¾Š»Š½ŠµŠ½Š° ŠæŠ¾Š»ŃŃŠ°ŃŠµŠ»ŠµŠ¼ ŠøŠ»Šø ŃŠµŃŠ²ŠµŃŠ¾Š¼, ŠæŠ¾ŃŃŠ¾Š¼Ń Š½Šµ Š¼Š¾Š¶ŠµŃ Š±ŃŃŃ Š¾Š±ŃŠ°Š±Š¾ŃŠ°Š½Š°."
+
+msgid "This is a repeat from %s"
+msgstr "ŠŃŠ¾ ŠæŠ¾Š²ŃŠ¾Ń Š¾Ń %s"
+
+msgid "Loading comments..."
+msgstr "ŠŠ°Š³ŃŃŠ·ŠŗŠ° ŠŗŠ¾Š¼Š¼ŠµŠ½ŃŠ°ŃŠøŠµŠ²..."
+
+msgid "Type your comment here..."
+msgstr "ŠŠ²ŠµŠ“ŠøŃŠµ ŃŠ²Š¾Š¹ ŠŗŠ¾Š¼Š¼ŠµŠ½ŃŠ°ŃŠøŠ¹..."
+
+msgid "Could not get the comments!"
+msgstr "ŠŠµ ŃŠ“Š°Š»Š¾ŃŃ ŠæŠ¾Š»ŃŃŠøŃŃ ŠŗŠ¾Š¼Š¼ŠµŠ½ŃŠ°ŃŠøŠø!"
+
+msgid "Show comments"
+msgstr "ŠŠ¾ŠŗŠ°Š·Š°ŃŃ ŠŗŠ¾Š¼Š¼ŠµŠ½ŃŠ°ŃŠøŠø"
+
+msgid "Send him/her a message"
+msgstr "ŠŃŠæŃŠ°Š²ŠøŃŃ ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŠµ"
+
+msgid "Start a chat with him/her"
+msgstr "ŠŠ°ŃŠ°ŃŃ Š±ŠµŃŠµŠ“Ń"
+
+msgid "Media integration"
+msgstr "ŠŠµŠ“ŠøŠ°-ŠøŠ½ŃŠµŠ³ŃŠ°ŃŠøŃ"
+
+msgid "Comments locked!"
+msgstr "ŠŠ¾Š¼Š¼ŠµŠ½ŃŠ°ŃŠøŠø Š·Š°Š±Š»Š¾ŠŗŠøŃŠ¾Š²Š°Š½Ń!"
+
+msgid "Type something you want to share with your friends..."
+msgstr "ŠŠ°ŠæŠøŃŠøŃŠµ ŃŠ¾, ŃŠµŠ¼ Š²Ń Ń
Š¾ŃŠøŃŠµ ŠæŠ¾Š“ŠµŠ»ŠøŃŃŃŃ Ń Š“ŃŃŠ·ŃŃŠ¼Šø..."
+
+msgid "changed his/her nickname to %s"
+msgstr "ŃŠ¼ŠµŠ½ŠøŠ» Š½ŠøŠŗ Š½Š° %s"
+
+msgid "commented an item you follow: ā%sā."
+msgstr "ŠæŃŠ¾ŠŗŠ¾Š¼Š¼ŠµŠ½ŃŠøŃŠ¾Š²Š°Š» ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŠµ Š·Š° ŠŗŠ¾ŃŠ¾ŃŃŠ¼ Š²Ń ŃŠ»ŠµŠ“ŠøŃŠµ: ā%sā."
+
+msgid "Hide"
+msgstr "Š”ŠŗŃŃŃŃ"
+
+msgid "liked your post: ā%sā."
+msgstr "ŠæŠ¾Š½ŃŠ°Š²ŠøŠ»Š¾ŃŃ Š²Š°ŃŠµ ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŠµ: ā%sā."
+
+msgid "quoted you somewhere: ā%sā."
+msgstr "ŃŠøŃŠøŃŠ¾Š²Š°Š» Š²Š°Ń Š³Š“Šµ-ŃŠ¾: ā%sā."
+
+msgid "published on your wall: ā%sā."
+msgstr "Š¾ŠæŃŠ±Š»ŠøŠŗŠ¾Š²Š°Š» Š½Š° Š²Š°ŃŠµŠ¹ ŃŃŠµŠ½Šµ: ā%sā."
+
+msgid "tagged you in a photo (%s)."
+msgstr "Š¾ŃŠ¼ŠµŃŠøŠ» Š²Š°Ń Š½Š° ŃŠ¾ŃŠ¾ (%s)."
+
+msgid "tagged you in a video (%s)."
+msgstr "Š¾ŃŠ¼ŠµŃŠøŠ» Š²Š°Ń Š½Š° Š²ŠøŠ“ŠµŠ¾ (%s)."
+
+msgid "Show"
+msgstr "ŠŠ¾ŠŗŠ°Š·Š°ŃŃ"
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr "ŠŃŠ¶Š½Š° ŠæŠ¾Š¼Š¾ŃŃ? ŠŠ°Š¼ Š»ŃŃŃŠµ ŠæŃŠ¾ŃŠøŃŠ°ŃŃ ŃŃŃŠ°Š½ŠøŃŃ Š“Š¾ŠŗŃŠ¼ŠµŠ½ŃŠ°ŃŠøŠø, Š¾ ŃŠ¾Š¼, ŠŗŠ°Šŗ Š·Š°ŠæŠ¾Š»Š½ŃŃŃ ŃŃŃ ŃŠ¾ŃŠ¼Ń!"
+
+msgid "Pubsub host"
+msgstr "Š„Š¾ŃŃ Pubsub"
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr "Jappix ŃŃŠ¾ Š²ŠµŠ»ŠøŠŗŠ¾Š»ŠµŠæŠ½Š°Ń ŃŠ¾ŃŠøŠ°Š»ŃŠ½Š°Ń ŠæŠ»Š°ŃŃŠ¾ŃŠ¼Š°, Š² ŠŗŠ¾ŃŠ¾ŃŠ¾Š¹ ŃŃ Š¼Š¾Š¶ŠµŃŃ Š¾Š±ŃŠ°ŃŃŃŃ Ń ŠŗŠµŠ¼ Šø ŠŗŠ¾Š³Š“Š° ŃŠ³Š¾Š“Š½Š¾."
+
+msgid "Manager link"
+msgstr "ŠŠµŠ½ŠµŠ“Š¶ŠµŃ ŃŃŃŠ»Š¾Šŗ"
+
+msgid "User uploads server"
+msgstr "Š”ŠµŃŠ²ŠµŃ Š·Š°Š³ŃŃŠ·Š¾Šŗ ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń"
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr "ŠŃŠ¾ ŃŠµŃŠ²ŠµŃ ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»ŃŃŠŗŠøŃ
Š·Š°Š³ŃŃŠ·Š¾Šŗ Š“Š»Ń %1s, ā%2sā."
+
+msgid "Logo"
+msgstr "ŠŠ¾Š³Š¾ŃŠøŠæ"
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr "ŠŃ Š¼Š¾Š¶ŠµŃŠµ ŃŃŃŠ°Š½Š¾Š²ŠøŃŃ ŃŠ¾Š±ŃŃŠ²ŠµŠ½Š½ŃŠ¹ Š»Š¾Š³Š¾ŃŠøŠæ. Š£Š“ŠµŠ»ŠøŃŠµ Š²Š½ŠøŠ¼Š°Š½ŠøŠµ ŃŠ°Š·Š¼ŠµŃŃ Šø ŃŠ²ŠµŃŃ ŠŗŠ°Š¶Š“Š¾Š³Š¾ Š»Š¾Š³Š¾ŃŠøŠæŠ°!"
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr "ŠŃŠ³ŃŃŠ·ŠøŃŠµ ŠŗŠ°Š¶Š“ŃŠ¹ Š»Š¾Š³Š¾ŃŠøŠæ Ń ŃŠµŠŗŠ¾Š¼ŠµŠ½Š“Š¾Š²Š°Š½Š½ŃŠ¼ Š¼Š°ŠŗŃŠøŠ¼Š°Š»ŃŠ½ŃŠ¼ ŃŠ°Š·Š¼ŠµŃŠ¾Š¼ Š² ŠæŠøŠŗŃŠµŠ»ŃŃ
."
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr "ŠŠµŠæŠ¾Š“Š“ŠµŃŠ¶ŠøŠ²Š°ŠµŠ¼ŃŠ¹ Š³ŃŠ°ŃŠøŃŠµŃŠŗŠøŠ¹ ŃŠ¾ŃŠ¼Š°Ń, ŠæŠ¾Š¶Š°Š»ŃŠ¹ŃŃŠ° ŠøŃŠæŠ¾Š»ŃŠ·ŃŠ¹ŃŠµ ŃŠ¾ŃŠ¼Š°Ń PNG!"
+
+msgid "Your service logo has been successfully changed!"
+msgstr "ŠŠ°Ń Š»Š¾Š³Š¾ŃŠøŠæ Š±ŃŠ» ŃŃŠæŠµŃŠ½Š¾ Š·Š°Š¼ŠµŠ½ŠµŠ½!"
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr "Š¤Š¾ŃŠ¼Š°Ń Š»Š¾Š³Š¾ŃŠøŠæŠ° Š“Š¾Š»Š¶ŠµŠ½ Š±ŃŃŃ PNG. ŠŃŃŠ°Š²ŃŃŠµ ŠæŠ¾Š»Šµ ŠæŃŃŃŃŠ¼, ŃŃŠ¾Š±Ń Š½Šµ ŠøŠ·Š¼ŠµŠ½ŃŃŃ."
+
+msgid "Remove this logo"
+msgstr "Š£Š“Š°Š»ŠøŃŃ Š»Š¾Š³Š¾ŃŠøŠæ"
+
+msgid "View this logo"
+msgstr "ŠŠ¾ŃŠ¼Š¾ŃŃŠµŃŃ Š»Š¾Š³Š¾ŃŠøŠæ"
+
+msgid "Send a file"
+msgstr "ŠŃŠæŃŠ°Š²ŠøŃŃ ŃŠ°Š¹Š»"
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr "ŠŠ¾ŃŠ»Šµ Š²ŃŠ³ŃŃŠ·ŠŗŠø, Š²Š°Ń Š“ŃŃŠ³ ŠæŠ¾Š»ŃŃŠøŃ Š·Š°ŠæŃŠ¾Ń Š½Š° Š·Š°Š³ŃŃŠ·ŠŗŃ Š¾ŃŠæŃŠ°Š²Š»ŠµŠ½Š½Š¾Š³Š¾ Š²Š°Š¼Šø ŃŠ°Š¹Š»Š°,"
+
+msgid "Groupchats to join"
+msgstr "ŠŠ¾Š½ŃŠµŃŠµŠ½ŃŠøŠø Š“Š»Ń Š²ŃŃŃŠæŠ»ŠµŠ½ŠøŃ"
+
+msgid "Purge sent files"
+msgstr "Š£Š“Š°Š»ŠøŃŃ Š¾ŃŠæŃŠ°Š²Š»ŠµŠ½Š½ŃŠµ ŃŠ°Š¹Š»Ń"
+
+msgid "would like to send you a file: ā%sā."
+msgstr "Ń
Š¾ŃŠµŃ Š²ŃŃŠ»Š°ŃŃ Š²Š°Š¼ ŃŠ°Š¹Š»: ā%sā."
+
+msgid "has accepted to received your file: ā%sā."
+msgstr "ŃŠ¾Š³Š»Š°ŃŠøŠ»ŃŃ Š½Š° ŠæŠ¾Š»ŃŃŠµŠ½ŠøŠµ Š²Š°ŃŠµŠ³Š¾ ŃŠ°Š¹Š»Š°: ā%sā."
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr "Š¾ŃŠŗŠ¾Š»Š½ŠøŠ» ŠæŠ¾Š»ŃŃŠµŠ½ŠøŠµ Š²Š°ŃŠµŠ³Š¾ ŃŠ°Š¹Š»Š°: ā%sā."
+
+msgid "could not receive your file: ā%sā."
+msgstr "Š½Šµ Š¼Š¾Š¶ŠµŃ ŠæŠ¾Š»ŃŃŠøŃŃ Š²Š°Ń ŃŠ°Š¹Š»: ā%sā."
+
+msgid "has received a file exchange request: ā%sā."
+msgstr "ŠæŠ¾Š»ŃŃŠøŠ» Š·Š°ŠæŃŠ¾Ń Š½Š° Š¾Š±Š¼ŠµŠ½ ŃŠ°Š¹Š»Š°Š¼Šø: ā%sā."
+
+msgid "Available shortcuts:"
+msgstr "ŠŠ¾ŃŃŃŠæŠ½ŃŠµ ŃŃŠ»ŃŠŗŠø:"
+
+msgid "%s removes the chat logs"
+msgstr "%s ŃŠ“Š°Š»ŃŠµŃ Š»Š¾Š³Šø ŃŠ°ŃŠ¾Š²"
+
+msgid "%s joins a groupchat"
+msgstr "%s ŠæŃŠøŃŠ¾ŠµŠ“ŠøŠ½ŃŠµŃ Šŗ ŠŗŠ¾Š½ŃŠµŃŠµŠ½ŃŠøŠø"
+
+msgid "%s closes the chat"
+msgstr "%s Š·Š°ŠŗŃŃŠ²Š°ŠµŃ ŃŠ°Ń"
+
+msgid "%s shows the user profile"
+msgstr "%s Š¾ŃŠ¾Š±ŃŠ°Š¶Š°ŠµŃ ŠæŃŠ¾ŃŠøŠ»Ń ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń"
+
+msgid "%s sends a message to the room"
+msgstr "%s Š¾ŃŠæŃŠ°Š²Š»ŃŠµŃ ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŠµ Š² ŠŗŠ¾Š¼Š½Š°ŃŃ"
+
+msgid "%s changes your nickname"
+msgstr "%s ŠøŠ·Š¼ŠµŠ½ŃŠµŃ Š²Š°Ń Š½ŠøŠŗ"
+
+msgid "%s sends a message to someone in the room"
+msgstr "%s Š¾ŃŠæŃŠ°Š²Š»ŃŠµŃ ŃŠ¾Š¾Š±ŃŠµŠ½ŠøŠµ ŠŗŠ¾Š¼Ń-ŃŠ¾ ŠøŠ· ŠŗŠ¾Š¼Š½Š°ŃŃ"
+
+msgid "%s changes the room topic"
+msgstr "%s ŠøŠ·Š¼ŠµŠ½ŃŠµŃ ŃŠµŠ¼Ń ŠŗŠ¾Š¼Š½Š°ŃŃ"
+
+msgid "%s kicks an user of the room"
+msgstr "%s Š²ŃŃŃŠ°Š²Š»ŃŠµŃ ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń ŠøŠ· ŠŗŠ¾Š¼Š½Š°ŃŃ"
+
+msgid "%s bans an user of the room"
+msgstr "%s Š±Š»Š¾ŠŗŠøŃŃŠµŃ ŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŠµŠ»Ń Š² ŠŗŠ¾Š¼Š½Š°ŃŠµ"
+
+msgid "%s invites someone to join the room"
+msgstr "%s ŠæŃŠøŠ³Š»Š°ŃŠ°ŠµŃ ŠŗŠ¾Š³Š¾-ŃŠ¾ Š²Š¾Š¹ŃŠø Š² ŠŗŠ¾Š¼Š½Š°ŃŃ"
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr "Jappix ŃŃŠ¾ Š½ŠµŠŗŠ¾Š¼Š¼ŠµŃŃŠµŃŠŗŠ°Ń Š¾Š±ŃŠµŃŃŠ²ŠµŠ½Š½Š°Ń ŠæŠ»Š°ŃŃŠ¾ŃŠ¼Š°, Š“Š¾ŃŃŃŠæŠ½Š°Ń Š¾ŃŠŗŃŠ“Š° Š±Ń Š½Šø Š±ŃŠ»Š¾, ŠŗŠ¾Š³Š“Š° Š±Ń Š½Šø ŠæŠ¾Š¶ŠµŠ»Š°ŠµŃŠµ Šø Ń ŠŗŠµŠ¼ Š±Ń Š½Šø ŃŠµŃŠøŠ»Šø ŠæŠ¾Š¾Š±ŃŠ°ŃŃŃŃ."
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# Slovak translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:26+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "Vo vaÅ”om prehliadaÄi chĆ½ba JavaScript, takže nebude možnĆ© spustiÅ„ Jappix! ProsĆm napravte to."
+
+msgid "An open social network"
+msgstr "OtvorenĆ” sociĆ”lna sieÅ„"
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "Jappix bol preruÅ”enĆ½ problĆ©mom so sieÅ„ou, chybou alebo nesprĆ”vnym prihlĆ”senĆm (skontrolujte Äi sĆŗ zadanĆ© Ćŗdaje sprĆ”vne). OspravedlÅujeme sa za neprĆjemnosti."
+
+msgid "The element list on this server could not be obtained!"
+msgstr "Zoznam komponentov na tomto serveri nie je možnĆ© zĆskaÅ„!"
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "VaÅ”e heslo bolo zmenenĆ©, teraz sa mĆ“Å¾ete prihlĆ”siÅ„ k vĆ”Å”mu ĆŗÄtu s novĆ½mi prihlasovacĆmi Ćŗdajmi."
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "VĆ”Å” XMPP ĆŗÄet bol zmazanĆ½, dovidenia!"
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "Boli ste odhlĆ”senĆ½ z vĆ”Å”ho XMPP ĆŗÄtu, prajem peknĆ½ deÅ!"
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "ZdĆ” sa, že miestnosÅ„ do ktorej ste vstĆŗpili neexistuje, VytvĆ”rate ju!"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "SkupinovĆ½ rozhovor bol odstrĆ”nenĆ½, teraz ho bude mĆ“cÅ„ vytvoriÅ„ niekto inĆ½."
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "UžĆvateľ, ktorĆ©ho chcete zastihnĆŗÅ„ sa v tejto miestnosti nenachĆ”dza"
+
+msgid "Please enter the group chat address to join."
+msgstr "ProsĆm, vyplÅte adresu skupinovĆ©ho rozhovoru ku ktorĆ©mu sa chcete pripojiÅ„"
+
+msgid "Please enter your nickname to join %s."
+msgstr "ProsĆm, vyplÅte prezĆ½vku pre pripojenie do %s."
+
+msgid "This room (%s) is protected with a password."
+msgstr "TĆ”to miestnosÅ„ (%s) je chrĆ”nenĆ” heslom."
+
+msgid "Your browser is out of date!"
+msgstr "VĆ”Å” prehliadaÄ je zastaralĆ½"
+
+msgid "Last %s version is better!"
+msgstr "PoslednĆ” %s verzia je lepÅ”ia!"
+
+msgid "Login"
+msgstr "PrihlƔsenie"
+
+msgid "Register"
+msgstr "RegistrƔcia"
+
+msgid "Here we go!"
+msgstr "PoÄme na to!"
+
+msgid "Server"
+msgstr "Server"
+
+msgid "Password"
+msgstr "Heslo"
+
+msgid "Remember me"
+msgstr "ZapamƤtaj si ma"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "TĆ”to možnosÅ„ bola zakĆ”zanĆ”, nemĆ“Å¾ete ju použiÅ„!"
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "Pre problĆ©my so sieÅ„ou ste boli odhlĆ”senĆ½, Äo chcete robiÅ„?"
+
+msgid "Reconnect"
+msgstr "Znovu pripojiń"
+
+msgid "Messages"
+msgstr "SprƔvy"
+
+msgid "Profile"
+msgstr "Profil"
+
+msgid "Options"
+msgstr "Možnosti"
+
+msgid "Disconnect"
+msgstr "Odpojiń"
+
+msgid "Filter"
+msgstr "Filter"
+
+msgid "Add a friend"
+msgstr "Pridań priateľa"
+
+msgid "Your groupchats"
+msgstr "VaÅ”e skupinovĆ© rozhovory"
+
+msgid "Manage your favorite groupchats"
+msgstr "SpravovaÅ„ vaÅ”e obľĆŗbenĆ© skupinovĆ© rozhovory"
+
+msgid "More stuff"
+msgstr "ÄalÅ”ie možnosti"
+
+msgid "Show all friends"
+msgstr "ZobraziÅ„ vÅ”etkĆ½ch priateľov"
+
+msgid "Only show connected friends"
+msgstr "ZobraziÅ„ iba pripojenĆ½ch priateľov"
+
+msgid "Message archives"
+msgstr "ArchĆv sprĆ”v"
+
+msgid "Date"
+msgstr "DƔtum"
+
+msgid "Please select a friend to view the chat history."
+msgstr "Vyberte priateľa pre zobrazenie histĆ³rie rozhovoru."
+
+msgid "Nothing found for: %s"
+msgstr "Žiaden vĆ½sledok pre: %s"
+
+msgid "A short message?"
+msgstr "KrƔtka sprƔva?"
+
+msgid "How are you?"
+msgstr "Ako sa mĆ”Å”?"
+
+msgid "What are you doing?"
+msgstr "Äo robĆÅ”?"
+
+msgid "Join a chat"
+msgstr "ZaÄaÅ„ rozhovor"
+
+msgid "Status"
+msgstr "Status"
+
+msgid "Available"
+msgstr "PrihlĆ”senĆ½"
+
+msgid "Talkative"
+msgstr "ZhovorÄivĆ½"
+
+msgid "Away"
+msgstr "NeprĆtomnĆ½"
+
+msgid "Not available"
+msgstr "NeprihlĆ”senĆ½"
+
+msgid "Busy"
+msgstr "ZaneprĆ”zdnenĆ½"
+
+msgid "Mood"
+msgstr "NƔlada"
+
+msgid "None"
+msgstr "NiÄ"
+
+msgid "Crazy"
+msgstr "BlƔznivƔ"
+
+msgid "Excited"
+msgstr "VzruŔenie"
+
+msgid "Playful"
+msgstr "HravĆ”"
+
+msgid "Happy"
+msgstr "Å Å„astnĆ½"
+
+msgid "Shocked"
+msgstr "Å okovanĆ½"
+
+msgid "Hot"
+msgstr "NažhavenĆ½"
+
+msgid "Sad"
+msgstr "SmutnĆ½"
+
+msgid "Amorous"
+msgstr "ZamilovanĆ½"
+
+msgid "Confident"
+msgstr "DĆ“verÄivĆ½"
+
+msgid "Activity"
+msgstr "Aktivita"
+
+msgid "Chores"
+msgstr "FuŔka"
+
+msgid "Drinking"
+msgstr "Pije"
+
+msgid "Eating"
+msgstr "Jedenie"
+
+msgid "Exercising"
+msgstr "VzdelƔvanie"
+
+msgid "Grooming"
+msgstr "Starostlivosń"
+
+msgid "Appointment"
+msgstr "Stretnutie"
+
+msgid "Inactive"
+msgstr "NeaktĆvny"
+
+msgid "Relaxing"
+msgstr "Relax"
+
+msgid "Talking"
+msgstr "Rozhovor"
+
+msgid "Traveling"
+msgstr "Cestovanie"
+
+msgid "Working"
+msgstr "PrƔca"
+
+msgid "View profile"
+msgstr "Zobraziń profil"
+
+msgid "Repeat this notice"
+msgstr "Zopakovań toto upozornenie"
+
+msgid "Remove this notice"
+msgstr "OdstrĆ”niÅ„ toto upozornenie"
+
+msgid "Your profile"
+msgstr "VĆ”Å” profil"
+
+msgid "Identity"
+msgstr "Identita"
+
+msgid "Profile image"
+msgstr "ProfilovĆ” fotka"
+
+msgid "Others"
+msgstr "InƩ"
+
+msgid "Personal"
+msgstr "OsobnƩ"
+
+msgid "Complete name"
+msgstr "CelƩ meno"
+
+msgid "Nickname"
+msgstr "PrezĆ½vka"
+
+msgid "First name"
+msgstr "Meno"
+
+msgid "Last name"
+msgstr "Priezvisko"
+
+msgid "Date of birth"
+msgstr "DƔtum narodenia"
+
+msgid "Contact"
+msgstr "Kontakt"
+
+msgid "E-mail"
+msgstr "E-mail"
+
+msgid "Phone"
+msgstr "TelefĆ³n"
+
+msgid "Website"
+msgstr "WebstrƔnka"
+
+msgid "Current"
+msgstr "MomentƔlne"
+
+msgid "Delete"
+msgstr "Zmazań"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "AkĆ” Å”koda! NemĆ”te nastavenĆŗ profilovĆŗ fotku vo vaÅ”ej vizitke!"
+
+msgid "Address"
+msgstr "Adresa"
+
+msgid "Street"
+msgstr "Ulica"
+
+msgid "City"
+msgstr "Mesto"
+
+msgid "Postal code"
+msgstr "PSÄ"
+
+msgid "Country"
+msgstr "Krajina"
+
+msgid "Biography"
+msgstr "Biografia"
+
+msgid "Important notice"
+msgstr "DĆ“ležitĆ½ oznam"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr "BuÄte opatrnĆ, informĆ”cie ktorĆ© vyplnĆte v profile sĆŗ prĆstupnĆ© každĆ©mu (aj niekomu, koho si neželĆ”te)."
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr "Nie vÅ”etko je sĆŗkromnĆ© v XMPP; toto je jedna z tĆ½chto vecĆ, vĆ”Å” verejnĆ½ profil (vCard)"
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr "OdporĆŗÄame nahraÅ„ profilovku (%s maximum), naprĆklad vaÅ”u fotku, aby vĆ”s priatelia ľahÅ”ie rozpoznali."
+
+msgid "Save"
+msgstr "Uložiń"
+
+msgid "Cancel"
+msgstr "ZruŔiń"
+
+msgid "Edit options"
+msgstr "Upraviń možnosti"
+
+msgid "Channel"
+msgstr "KanƔl"
+
+msgid "Commands"
+msgstr "PrĆkazy"
+
+msgid "Sounds"
+msgstr "Zvuky"
+
+msgid "Privacy"
+msgstr "SĆŗkromie"
+
+msgid "Message archiving"
+msgstr "ArchivƔcia sprƔv"
+
+msgid "Store a history of your chats"
+msgstr "UkladaÅ„ histĆ³riu vaÅ”ich rozhovorov"
+
+msgid "Geolocation"
+msgstr "GeolokƔcia"
+
+msgid "Empty"
+msgstr "Vymazanie"
+
+msgid "Empty channel"
+msgstr "VymazaÅ„ kanĆ”l"
+
+msgid "Persistent"
+msgstr "Natrvalo"
+
+msgid "Maximum notices"
+msgstr "Maximum upozornenĆ"
+
+msgid "Account"
+msgstr "ĆÄet"
+
+msgid "Change password"
+msgstr "Zmeniń heslo"
+
+msgid "Delete account"
+msgstr "ZmazaÅ„ ĆŗÄet"
+
+msgid "Old"
+msgstr "StarƩ"
+
+msgid "New (2 times)"
+msgstr "NovƩ (2 krƔt)"
+
+msgid "Continue"
+msgstr "PokraÄuj"
+
+msgid "To"
+msgstr "Komu"
+
+msgid "Close"
+msgstr "Zavrień"
+
+msgid "unknown"
+msgstr "neznƔme"
+
+msgid "Unavailable"
+msgstr "Nie je k dispozĆcii"
+
+msgid "is now"
+msgstr "je teraz"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr "ProsĆm poÄkajte pokiaľ sa nahrĆ” vĆ”Å” avatar.."
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "Tu je! NovƔ krƔsna profilovƔ fotka!"
+
+msgid "The image file is not supported or has a bad size."
+msgstr "SĆŗbor s obrĆ”zkom nie je podporovanĆ½ alebo mĆ” nesprĆ”vnu veľkosÅ„"
+
+msgid "Reply"
+msgstr "Odpovedań"
+
+msgid "Error"
+msgstr "Chyba"
+
+msgid "Click here to solve the error"
+msgstr "Kliknite sem pre rieÅ”enie problĆ©mu"
+
+msgid "You"
+msgstr "Ty"
+
+msgid "Remove"
+msgstr "OdstrĆ”niÅ„"
+
+msgid "Rename"
+msgstr "Premenovań"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "Ahoj, Ja som %s, chcem si ńa pridań ako priateľa"
+
+msgid "Smiley insertion"
+msgstr "SmajlĆci"
+
+msgid "Change style"
+msgstr "ZmeÅ Å”tĆ½l"
+
+msgid "Text in bold"
+msgstr "TuÄnĆ©"
+
+msgid "Text in italic"
+msgstr "Italic"
+
+msgid "Underlined text"
+msgstr "PodÄiarknutĆ©"
+
+msgid "Save chat"
+msgstr "Uložiń rozhovor"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr "Klikni na nasledujĆŗci link pre vytvorenie logu a poÄkaj. Potom klikni znova pre prevzatie sĆŗboru."
+
+msgid "This chat is empty!"
+msgstr "Tento rozhovor je prƔzdny"
+
+msgid "Generate file!"
+msgstr "Vygeneruj sĆŗbor!"
+
+msgid "Download file!"
+msgstr "Stiahni sĆŗbor!"
+
+msgid "Clean current chat"
+msgstr "VyÄisti prebiehajĆŗci rozhovor"
+
+msgid "View chat history"
+msgstr "UkĆ”Å¾ histĆ³riu rozhovoru"
+
+msgid "Show user profile"
+msgstr "UkĆ”Å¾ použĆvateľov profil"
+
+msgid "Add this contact to your friends"
+msgstr "Pridaj tento kontakt medzi priateľov"
+
+msgid "Add this groupchat to your favorites"
+msgstr "PridaÅ„ tento skupinovĆ½ rozhovor k obľĆŗbenĆ½m"
+
+msgid "All tabs"
+msgstr "VŔetky karty"
+
+msgid "Close this tab"
+msgstr "ZavrieÅ„ tĆŗto kartu"
+
+msgid "no subject defined for this room."
+msgstr "Nebol nastavenĆ½ predmet pre tĆŗto miestnosÅ„"
+
+msgid "Administration panel for this room"
+msgstr "Panel administrĆ”cie pre tĆŗto miestnosÅ„"
+
+msgid "Moderators"
+msgstr "ModerƔtori"
+
+msgid "Participants"
+msgstr "Älenovia"
+
+msgid "Visitors"
+msgstr "NĆ”vÅ”tevnĆci"
+
+msgid "Manage favorite rooms"
+msgstr "SpravovaÅ„ obľĆŗbenĆ© skupinovĆ© rozhovory"
+
+msgid "Change favorites"
+msgstr "ZmeniÅ„ obľĆŗbenĆ©"
+
+msgid "Search a room"
+msgstr "Prehľadań miestnosń"
+
+msgid "Select a favorite"
+msgstr "Vyber obľĆŗbenĆ©"
+
+msgid "Getting the name..."
+msgstr "ZĆskavam meno..."
+
+msgid "Gateway"
+msgstr "BrƔna"
+
+msgid "Name"
+msgstr "Meno"
+
+msgid "Room"
+msgstr "Miestnosń"
+
+msgid "Add"
+msgstr "Pridań"
+
+msgid "Edit"
+msgstr "Upraviń"
+
+msgid "Search a room on"
+msgstr "Hľadań miestnosń na"
+
+msgid "No room found on this server."
+msgstr "Žiadna miestnosń sa nenaŔla na tomto serveri"
+
+msgid "Service discovery"
+msgstr "VyhľadĆ”vanie služieb"
+
+msgid "Server to query"
+msgstr "Server na prehľadanie"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr "OspravedÅujeme sa, ale vĆ½raz nevrĆ”til žiaden vĆ½sledok"
+
+msgid "Accounts"
+msgstr "ĆÄty"
+
+msgid "Authentications"
+msgstr "AutentifikƔcia"
+
+msgid "Automation"
+msgstr "AutomatizƔcia"
+
+msgid "Clients"
+msgstr "Klienti"
+
+msgid "Collaboration"
+msgstr "SpoluprƔca"
+
+msgid "Components"
+msgstr "Komponenty"
+
+msgid "Rooms"
+msgstr "Miestnosti"
+
+msgid "Directories"
+msgstr "AdresƔre"
+
+msgid "Gateways"
+msgstr "BrƔny"
+
+msgid "News"
+msgstr "Novinky"
+
+msgid "Hierarchy"
+msgstr "Hierarchia"
+
+msgid "Proxies"
+msgstr "Proxy servery"
+
+msgid "Publication/Subscription"
+msgstr "Publikovanie/Odoberanie"
+
+msgid "Storage"
+msgstr "Ćložisko"
+
+msgid "Service offline or broken"
+msgstr "Služba je vypnutĆ” alebo nefunkÄnĆ”"
+
+msgid "Your inbox"
+msgstr "VaÅ”e prijatĆ© sprĆ”vy"
+
+msgid "Available actions"
+msgstr "DostupnƩ akcie"
+
+msgid "Clean"
+msgstr "VyÄistiÅ„"
+
+msgid "New"
+msgstr "NovĆ”"
+
+msgid "Received"
+msgstr "PrijatƩ"
+
+msgid "Subject"
+msgstr "Predmet"
+
+msgid "Content"
+msgstr "Obsah"
+
+msgid "Send message"
+msgstr "PoslaÅ„ sprĆ”vu"
+
+msgid "Your inbox is empty."
+msgstr "VaÅ”a schrĆ”nka prijatĆ½ch sprĆ”v je prĆ”zdna"
+
+msgid "MUC administration"
+msgstr "MUC administrƔcia"
+
+msgid "You administrate this room"
+msgstr "Spravujete tĆŗto miestnosÅ„"
+
+msgid "Enter new subject"
+msgstr "Vložte novĆ½ predmet"
+
+msgid "Configuration"
+msgstr "KonfigurƔcia"
+
+msgid "Authorizations"
+msgstr "AutorizƔcia"
+
+msgid "Member list"
+msgstr "Zoznam Älenov"
+
+msgid "Owner list"
+msgstr "Zoznam vlastnĆkov"
+
+msgid "Administrator list"
+msgstr "Zoznam administrƔtorov"
+
+msgid "Outcast list"
+msgstr "Zoznam neželanĆ½ch"
+
+msgid "Add an input"
+msgstr "Pridaj Älena"
+
+msgid "Destroy this MUC"
+msgstr "ZniÄ toto MUC"
+
+msgid "Yes, let's do it!"
+msgstr "Ćno, do toho!"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr "VĆ”Å” priateľ sleduje konverzĆ”ciu"
+
+msgid "Your friend is writing a message..."
+msgstr "VĆ”Å” priateľ pĆÅ”e..."
+
+msgid "Your friend stopped writing a message."
+msgstr "VĆ”Å” priateľ prestal pĆsaÅ„."
+
+msgid "Your friend is doing something else."
+msgstr "VĆ”Å” priateľ robĆ nieÄo inĆ©."
+
+msgid "Your friend closed the chat."
+msgstr "VĆ”Å” priateľ zavrel rozhovor"
+
+msgid "Requesting this service..."
+msgstr "Požaduje tĆŗto službu.."
+
+msgid "Loading"
+msgstr "NaÄĆtava"
+
+msgid "joined the chat room"
+msgstr "vstĆŗpil do miestnosti"
+
+msgid "left the chat room"
+msgstr "opustil miestnosń"
+
+msgid "no status"
+msgstr "bez statusu"
+
+msgid "has been kicked"
+msgstr "bol vykopnutĆ½"
+
+msgid "has been banned"
+msgstr "bol zabanovanĆ½"
+
+msgid "no reason"
+msgstr "neudanĆ½ dĆ“vod"
+
+msgid "Communicate with the entire world!"
+msgstr "Komunikujte s celĆ½m svetom!"
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr "UmožnĆ vĆ”m byÅ„ v kontakte s miliĆ³nmi užĆvateľov, ktorĆ prĆ”ve využĆvajĆŗ XMPP sieÅ„ ako vy s Jappix. Pridajte sa ku komunite a zostaÅte voľnĆ½!"
+
+msgid "Hi there!"
+msgstr "Ahoj!"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr "Vitajte na %1s, ā%2sā."
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr "PrihlĆ”s sa do svojho existujĆŗceho XMPP ĆŗÄtu alebo vytvor novĆ½ zadarmo!"
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr "Jappix je open-source projekt od PostPro, neziskovej organizĆ”cie ktorĆ” nĆ”m poskytuje veľkĆŗ podporu."
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr "PrihlĆ”s sa do svojho existujĆŗceho XMPP ĆŗÄtu. Taktiež možeÅ” použiÅ„ %s pre pripojenie ku skupinovĆ©mu rozhovoru"
+
+msgid "Previous"
+msgstr "PredchĆ”dzajĆŗce"
+
+msgid "General"
+msgstr "VÅ”eobecnĆ©"
+
+msgid "Advanced"
+msgstr "PokroÄilĆ©"
+
+msgid "Resource"
+msgstr "Zdroj"
+
+msgid "Priority"
+msgstr "Priorita"
+
+msgid "Low"
+msgstr "NĆzka"
+
+msgid "Medium"
+msgstr "StrednĆ”"
+
+msgid "High"
+msgstr "VysokĆ”"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr "Zadajte nĆ”zov skupinovĆ©ho rozhovoru ku ktorĆ©mu sa chcete pridaÅ„ a prezĆ½vku akĆŗ chcete. Alebo sa mĆ“Å¾ete vrĆ”tiÅ„ na %s."
+
+msgid "login page"
+msgstr "prihlƔsenie"
+
+msgid "Share this link with your friends:"
+msgstr "Zdieľaj tento odkaz s priateľmi:"
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr "Zaregistruj novĆ½ XMPP ĆŗÄet a spoj sa s priateľmi vo svojej vlastnej socialnej sieti. Je to ednoduchĆ©!"
+
+msgid "Required"
+msgstr "PovinnƩ"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr "Boli ste zaregistrovanĆ½, tu je vaÅ”a XMPP adresa:"
+
+msgid "Manager"
+msgstr "SprƔvca"
+
+msgid "Project"
+msgstr "Projekt"
+
+msgid "Encrypted"
+msgstr "Å ifrovane"
+
+msgid "Unencrypted"
+msgstr "NeÅ”ifrovanĆ©"
+
+msgid "Where are you?"
+msgstr "Kde ste?"
+
+msgid "What's up with you?"
+msgstr "Äo je s vami?"
+
+msgid "Fetching the social channel..."
+msgstr "Preberanie kanƔlu..."
+
+msgid "You are synchronized with your network."
+msgstr "Ste synchronizovanĆ½ s vaÅ”ou sieÅ„ou"
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr "NemĆ“Å¾ete niÄ odoslaÅ„: mĆ“Å¾ete iba prĆjmaÅ„ sprĆ”vy!"
+
+msgid "Media viewer"
+msgstr "PrehliadaÄ mĆ©dii"
+
+msgid "Browse"
+msgstr "Prehľadań"
+
+msgid "Command"
+msgstr "PrĆkaz"
+
+msgid "Subscribe"
+msgstr "Odoberań"
+
+msgid "Join"
+msgstr "Pridań sa"
+
+msgid "Automatic"
+msgstr "Automaticky"
+
+msgid "Search"
+msgstr "Hľadań"
+
+msgid "No result!"
+msgstr "Žiadne vĆ½sledky!"
+
+msgid "No notifications."
+msgstr "Žiadne upozornenia"
+
+msgid "would like to add you as a friend."
+msgstr "si vĆ”s chce pridaÅ„ ako priateľa"
+
+msgid "would like you to join this chatroom:"
+msgstr "chce aby ste vstĆŗpili do miestnosti:"
+
+msgid "Do you accept?"
+msgstr "SĆŗhlasĆte?"
+
+msgid "Yes"
+msgstr "Ćno"
+
+msgid "No"
+msgstr "Nie"
+
+msgid "would like to get authorization."
+msgstr "žiada o povolenie."
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr "Chcete vidieÅ„ priateľov, ktorĆ½ch vĆ”m %s navrhuje? "
+
+msgid "Submit"
+msgstr "Povoliń"
+
+msgid "Client"
+msgstr "Klient"
+
+msgid "System"
+msgstr "SystƩm"
+
+msgid "Local time"
+msgstr "LokĆ”lny Äas"
+
+msgid "Comments"
+msgstr "KomentƔre"
+
+msgid "User profile"
+msgstr "UžĆvateľov profil"
+
+msgid "See his/her position on the globe"
+msgstr "Zobraz jeho/jej pozĆciu na zemeguli"
+
+msgid "Confirm"
+msgstr "Potvrdiń"
+
+msgid "anonymous mode"
+msgstr "anonymnĆ½ mĆ³d"
+
+msgid "Groups"
+msgstr "Skupiny"
+
+msgid "Unclassified"
+msgstr "NezaradenƩ"
+
+msgid "Authorize"
+msgstr "Povoliń"
+
+msgid "Ask for authorization"
+msgstr "Požiadaj o povolenie"
+
+msgid "Unblock"
+msgstr "Odblokovań"
+
+msgid "Prohibit"
+msgstr "ZakĆ”zaÅ„"
+
+msgid "Block"
+msgstr "Blokovań"
+
+msgid "Chat"
+msgstr "Rozhovor"
+
+msgid "Groupchat"
+msgstr "SkupinovĆ½ rozhovor"
+
+msgid "Jappix Mobile"
+msgstr "Jappix Mobile"
+
+msgid "Desktop"
+msgstr "PoÄĆtaÄ"
+
+msgid "Mobile"
+msgstr "Mobil"
+
+msgid "Please wait..."
+msgstr "Äakajte prosĆm..."
+
+msgid "Please enable JavaScript"
+msgstr "Povoľte JavaScript prosĆm"
+
+msgid "Your channel"
+msgstr "VĆ”Å” kanĆ”l"
+
+msgid "Channel of"
+msgstr "KanĆ”l užĆvateľa"
+
+msgid "More notices..."
+msgstr "ÄaľŔie upozornenia..."
+
+msgid "Attach a file"
+msgstr "PripojiÅ„ sĆŗbor"
+
+msgid "Send"
+msgstr "Odoslań"
+
+msgid "Unattach the file"
+msgstr "OdpojiÅ„ sĆŗbor"
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr "Stala sa chyba poÄas nahrĆ”vania vĆ”Å”ho sĆŗboru: možno je prĆliÅ” veľkĆ½ ($s maximum) alebo zakĆ”zanĆ½!"
+
+msgid "Authorization failed"
+msgstr "Overenie zlyhalo"
+
+msgid "Registration failed, please choose a different username"
+msgstr "RegistrĆ”cia zlyhala, zvoľte prosĆm inĆ© užĆvateľskĆ© meno"
+
+msgid "Service unavailable"
+msgstr "Služba je nedostupnĆ”"
+
+msgid "Internal server error, try later"
+msgstr "Internal server error, skĆŗste neskĆ“r"
+
+msgid "Your form has been sent."
+msgstr "VĆ”Å” formulĆ”r bol odoslanĆ½"
+
+msgid "Application"
+msgstr "AplikƔcia"
+
+msgid "XMPP links"
+msgstr "XMPP odkaz"
+
+msgid "Open XMPP links with Jappix"
+msgstr "Otvoriń XMPP odkazy pomocou Jappix"
+
+msgid "changed the subject to:"
+msgstr "zmenil predmet na"
+
+msgid "Welcome!"
+msgstr "Vitajte!"
+
+msgid "Friends"
+msgstr "Priatelia"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr "Vitajte na Jappix, vaÅ”ej vlastnej sociĆ”lnej sieti!"
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr "SkĆ“r než ju zaÄnete použĆvaÅ„, mali by ste zmeniÅ„ niektorĆ© nastavenia, vyhľadaÅ„ priateľov a vyplniÅ„ svoj profil."
+
+msgid "Enable notification sounds"
+msgstr "PovoliÅ„ zvuk upozornenĆ"
+
+msgid "Share your position on the globe"
+msgstr "Zdieľań svoju polohu na zemeguli"
+
+msgid "Offline friends"
+msgstr "OdpojenĆ priatelia"
+
+msgid "Don't hide offline friends"
+msgstr "NeskrĆ½vaÅ„ odpojenĆ½ch priateľov"
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr "Použite tento nĆ”stroj na vyhľadanie vaÅ”ich priateľov na serveri, ktorĆ½ použĆvate, alebo ich pridajte neskĆ“r."
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr "VĆ½borne! Teraz mĆ“Å¾te zdielaÅ„ Jappix s priateľmi!"
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr ""
+
+msgid "Share Jappix on %s"
+msgstr "Zdieľań Jappix na %s"
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr "PoužĆvam Jappix, otvorenĆŗ socialnu platformu. Ja som %s!"
+
+msgid "Unknown name"
+msgstr "NeznƔme meno"
+
+msgid "Unknown country"
+msgstr "NeznƔma krajina"
+
+msgid "Click to enable"
+msgstr "Klikni pre zapnutie"
+
+msgid "Click to disable"
+msgstr "Klikni pre vypnutie"
+
+msgid "Installation"
+msgstr "InÅ”talĆ”cia"
+
+msgid "Jappix installation"
+msgstr "Jappix inÅ”talĆ”cia"
+
+msgid "Welcome to the Jappix installation!"
+msgstr "Vitajte v Jappix inÅ”talĆ”cii"
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr "Tento nĆ”stroj vĆ”m pomĆ“Å¾e rĆ½chlo nainÅ”talovaÅ„ Jappix, prvĆŗ plnohodnotnĆŗ sociĆ”lnu platformu založenĆŗ na XMPP, na vĆ”Å” server. Nebudete dokonca potrebovaÅ„ žiadne technickĆ© znalosti.( takmer :) ))"
+
+msgid "Let's have a look at the installation steps:"
+msgstr "PoÄme sa pozrieÅ„ na inÅ”talaÄnĆ© kroky:"
+
+msgid "Welcome"
+msgstr "Vitajte"
+
+msgid "Storage configuration"
+msgstr "Nastavenie Ćŗložiska"
+
+msgid "Administrator account"
+msgstr "AdministraÄnĆ½ ĆŗÄet"
+
+msgid "Main configuration"
+msgstr "HlavnƔ konfigurƔcia"
+
+msgid "Hosts configuration"
+msgstr "Hosts configuration"
+
+msgid "Services installation"
+msgstr "InÅ”talĆ”cia služieb"
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr "Pokiaľ sa tento jazyk nezhoduje s vaÅ”im (%1s), mĆ“Å¾ete nechaÅ„ Jappix hovoriÅ„ %2s.Voľba bude uloženĆ”."
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr "Pokiaľ potrebujete pomoc ohľadom inÅ”talĆ”cie a konfigurĆ”cie Jappix, mĆ“Å¾ete použiÅ„ dokumentĆ”ciu, dostupnĆŗ na:"
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr "Nastal Äas vybudovaÅ„ vaÅ”u vlastnĆŗ socialnu sieÅ„: staÄĆ prejsÅ„ do daľŔieho kroku!"
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr "Jappix ukladĆ” natrvalo dĆ”ta (ako sĆŗ zdieľanĆ© sĆŗbory,vaÅ”a vlastnĆ” hudba a svoju konfigurĆ”ciu) do jedinej zabezpeÄenej zložky"
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr "Jappix musĆ maÅ„ prĆ”vo zapisovaÅ„ v tejto zložke pre vytvorenie svojich podzložiek. Ak nie, musĆte nastaviÅ„ oprĆ”vnenia na %1s alebo zmeniÅ„ vlastnĆka zložky na %2s (zĆ”visĆ od vaÅ”ej konfigurĆ”cie))"
+
+msgid "The folder is writable, you can continue!"
+msgstr "Do zložky je možnĆ© zapisovaÅ„, mĆ“Å¾ete pokraÄovaÅ„!"
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix vĆ”m ponĆŗka možnosÅ„ spravovaÅ„ vaÅ”e konfigurĆ”ciu, inÅ”talovaÅ„ novĆ© pluginy alebo vyhľadaÅ„ aktualizĆ”cie. Preto si musĆte vytvoriÅ„ administraÄnĆ½ ĆŗÄet pre prĆstup k SprĆ”vcovi."
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr "Po nainÅ”talovanĆ Jappix, staÄĆ kliknĆŗÅ„ na odkaz SprĆ”vca na domovskej strĆ”nke pre prĆstup."
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr "Ups, nieÄo ste prehliadli alebo heslĆ” nesĆŗhlasia!"
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr "Jappix vyžaduje nastavenie niekoľkĆ½ch hodnĆ“t. ProsĆm, upravte nasledujĆŗce hodnoty (alebo ponechajte predvolenĆ©, ktorĆ© vyhovujĆŗ vƤÄÅ”ine užĆvatelov). )"
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr "Ak nenastavĆte povinnĆ© Ćŗdaje, budĆŗ nastavenĆ© na predvolenĆ© hodnoty"
+
+msgid "User"
+msgstr "UžĆvateľ"
+
+msgid "Service"
+msgstr "Služba"
+
+msgid "Service name"
+msgstr "Meno služby"
+
+msgid "Service description"
+msgstr "Popis služby"
+
+msgid "Connection"
+msgstr "Pripojenie"
+
+msgid "Lock the host"
+msgstr "UzamknĆŗÅ„ host"
+
+msgid "Anonymous mode"
+msgstr "AnonymnĆ½ mĆ³d"
+
+msgid "Registration allowed"
+msgstr "RegistrƔcia povolenƔ"
+
+msgid "Use a proxy"
+msgstr "Použiń proxy"
+
+msgid "Encryption"
+msgstr "Å ifrovanie"
+
+msgid "HTTPS storage"
+msgstr "HTTPS Ćŗložisko"
+
+msgid "Force HTTPS"
+msgstr "VynĆŗtiÅ„ HTTPS"
+
+msgid "Compression"
+msgstr "Kompresia"
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr "TĆ”to strĆ”nka vĆ”m pomĆ“Å¾e nastaviÅ„ predvolenĆ©ho Hostiteľa. Použite predvolenĆ© ak chcete využĆvaÅ„ oficialnu službu Hostiteľa"
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr "BOSH server je v podstate spojenie medzi Jappix klientom a XMPP serverom, ktorĆ© je nevyhnutnĆ© z dĆ“vodu technickĆ½ch obmedzenĆ"
+
+msgid "Main host"
+msgstr "HlavnĆ½ hostiteľ (Main host)"
+
+msgid "Groupchat host"
+msgstr "Hostiteľ SkupinovĆ½ch rozhovorov (Groupchat host)"
+
+msgid "Anonymous host"
+msgstr "Anonymous host"
+
+msgid "Directory host"
+msgstr "Directory host"
+
+msgid "BOSH host"
+msgstr "BOSH host"
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr "MĆ“Å¾ete nainÅ”talovaÅ„ doplnky pre rozÅ”Ćrenie funkcionality Jappix. NiektorĆ© mĆ“Å¾ete dodatoÄne upraviÅ„, najmƤ z dĆ“vodu bezpeÄnostnĆ½ch obmedzenĆ, ktorĆ© sĆŗ nastavenĆ© ako predvolenĆ©."
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr "Pre vykonanie musĆte maÅ„ prĆstup k terminĆ”lu serveru a byÅ„ prihlĆ”senĆ½ ako root. Jappix bude pracovaÅ„ aj bez tĆ½chto modulov ale niektorĆ© z funkcii budĆŗ nedostupnĆ©"
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr "KeÄ skonÄĆte nastavovanie, Jappix vygeneruje cache sĆŗbory. MĆ“Å¾e to chvĆľu trvaÅ„, poÄkajte pokiaľ sa nezobrazĆ aplikĆ”cia a nestlĆ”Äajte žiadne tlaÄidlo."
+
+msgid "Thanks for using Jappix!"
+msgstr "Äakujeme za použĆvanie Jappix-u!"
+
+msgid "Next"
+msgstr "Äalej"
+
+msgid "Finish"
+msgstr "DokonÄiÅ„"
+
+msgid "Check again"
+msgstr "Opakovań"
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr "V zložke sa nedĆ” zapisovaÅ„, nastavte prĆ”va pre zložku %s."
+
+msgid "%s is installed on your system."
+msgstr "%s je nainÅ”talovanĆ½ vo vaÅ”om systĆ©me"
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr "%1s nie je nainÅ”talovanĆ½ vo vaÅ”om systĆ©me, nainÅ”talujte %2s."
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr "PHP maximum upload size je dostatoÄnĆ” (%s)"
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr "PHP maximum upload size nie je dostatoÄnĆ” (%1s), mali by ste ju nastaviÅ„ na%2s v %3s."
+
+msgid "Jappix manager"
+msgstr "Jappix sprƔvca"
+
+msgid "Manager access"
+msgstr "AdministrƔcia"
+
+msgid "Statistics"
+msgstr "Å tatistika"
+
+msgid "Hosts"
+msgstr "Hosts"
+
+msgid "Design"
+msgstr "Dizajn"
+
+msgid "Repeat"
+msgstr "Opakovań"
+
+msgid "All"
+msgstr "VŔetko"
+
+msgid "Horizontal"
+msgstr "HorizontƔlne"
+
+msgid "Vertical"
+msgstr "VertikƔlne"
+
+msgid "Center"
+msgstr "Stred"
+
+msgid "Left"
+msgstr "Vľavo"
+
+msgid "Right"
+msgstr "Vpravo"
+
+msgid "Top"
+msgstr "Hore"
+
+msgid "Bottom"
+msgstr "Dole"
+
+msgid "Adapt"
+msgstr "PrispĆ“sobiÅ„"
+
+msgid "Color"
+msgstr "Farba"
+
+msgid "Users"
+msgstr "UžĆvatelia"
+
+msgid "Updates"
+msgstr "AktualizƔcie"
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr "Iba autorizovanĆ užĆvatelia mĆ“Å¾u spravovaÅ„ tento Jappix uzol. "
+
+msgid "Please use the form below to login to the administration panel."
+msgstr "Použite nasledujĆŗci formulĆ”r pre prihlĆ”senie do AdministraÄnej sekcie."
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr "Pre zvĆ½Å”enie bezpeÄnosti je prihlĆ”senie Äasovo obmedzenĆ© a po zatvorenĆ prehliadaÄa budete odhlĆ”senĆ½."
+
+msgid "Credentials"
+msgstr "Overenie"
+
+msgid "You have been logged out. Goodbye!"
+msgstr "Boli ste odhlĆ”senĆ½, Dovidenia!"
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr "Ups, neboli ste rozpoznanĆ½ ako administrĆ”tor. Skontrolujte prihlasovacie Ćŗdaje!"
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr "Å tatistiky aplikĆ”cie Jappix"
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr "Zmena konfigurƔcie uzla Jappix"
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr "Zmena nastavenĆ XMPP hostiteľov pre tento Jappix uzol"
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr "VÅ”etky sĆŗbory na tomto Jappix uzle mĆ“Å¾ete spravovaÅ„ pomocou tohto nĆ”stroja: vyberte podzložku a mĆ“Å¾ete editovaÅ„ jej obsah."
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr "Jappix je plne prispĆ“sobiteľnĆ½: jeho dizajn mĆ“Å¾ete zmeniÅ„ prĆ”ve tu."
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr "Toto nie je platnĆ½ obrĆ”zok, použite PNG,GIF alebo JPG "
+
+msgid "The image could not be received, would you mind retry?"
+msgstr "ObrĆ”zok nebol prijatĆ½, prajete si zopakovaÅ„?"
+
+msgid "Your image was added to the list!"
+msgstr "VĆ”Å” obrĆ”zok bol pridanĆ½ do zoznamu!"
+
+msgid "Changes saved!"
+msgstr "Zmeny uloženĆ©!"
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr "Na tomto Jappix uzli mĆ“Å¾te definovaÅ„ viac ako jednĆ©ho administrĆ”tora. Taktiež mĆ“Å¾te zmeniÅ„ heslo."
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr "Aktualizuj Jappix uzol alebo skontroluj Äi je dostupnĆ” novĆ” verzia. Zobrazia sa informĆ”cie o poslednej verzii (v angliÄtine)"
+
+msgid "Access statistics"
+msgstr "Å tatistiky prĆstupu"
+
+msgid "Share statistics"
+msgstr "Štatistiky zdieľania"
+
+msgid "Other statistics"
+msgstr "OstatnĆ© Å”tatistiky"
+
+msgid "January"
+msgstr "JanuƔr"
+
+msgid "February"
+msgstr "FebruƔr"
+
+msgid "March"
+msgstr "Marec"
+
+msgid "April"
+msgstr "AprĆl"
+
+msgid "May"
+msgstr "MƔj"
+
+msgid "June"
+msgstr "JĆŗn"
+
+msgid "July"
+msgstr "JĆŗl"
+
+msgid "August"
+msgstr "August"
+
+msgid "September"
+msgstr "September"
+
+msgid "October"
+msgstr "OktĆ³ber"
+
+msgid "November"
+msgstr "November"
+
+msgid "December"
+msgstr "December"
+
+msgid "Monday"
+msgstr "Pondelok"
+
+msgid "Tuesday"
+msgstr "Utorok"
+
+msgid "Wednesday"
+msgstr "Streda"
+
+msgid "Thursday"
+msgstr "Å tvrtok"
+
+msgid "Friday"
+msgstr "Piatok"
+
+msgid "Saturday"
+msgstr "Sobota"
+
+msgid "Sunday"
+msgstr "Nedeľa"
+
+msgid "Total"
+msgstr "Celkom"
+
+msgid "Cache"
+msgstr "Cache"
+
+msgid "Logs"
+msgstr "Logy"
+
+msgid "Music"
+msgstr "Hudba"
+
+msgid "Backgrounds"
+msgstr "Pozadia"
+
+msgid "Share"
+msgstr "Zdieľanie"
+
+msgid "Background"
+msgstr "Pozadie"
+
+msgid "Notice"
+msgstr "Upozornenie"
+
+msgid "Your design preferences have been saved!"
+msgstr "VaÅ”e nastavenie dizajnu bolo uloženĆ©"
+
+msgid "Please check your inputs: something is missing!"
+msgstr "Skontrolujte Ćŗdaje, nieÄo chĆ½ba!"
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr "ZmeÅte pozadie vĆ”Å”ho JAppix uzla.mĆ“Å¾te si zvoliÅ„ farbu alebo uloženĆ½ obrĆ”zok.Let your creativity flow!"
+
+msgid "Use default background"
+msgstr "Použit predvolenĆ© pozadie"
+
+msgid "Use your own image"
+msgstr "PoužiÅ„ vlastnĆ½ obrĆ”zok"
+
+msgid "Select a background to use and change the display options."
+msgstr "Vyberte pozadie ktorĆ© bude použitĆ© a meÅte nastavenia zobrazenia"
+
+msgid "Use your own color"
+msgstr "PoužiÅ„ vlastnĆŗ farbu"
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr "Zadajte hexadecimĆ”lnu farbu pre vaÅ”e pozadie"
+
+msgid "Manage backgrounds"
+msgstr "Spravovań pozadia"
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr "Pridajte novĆ© pozadie to zoznamu. PoÅ”lite platnĆ½ obrĆ”zok"
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr "Ak chcete odobraÅ„ neakĆ© pozadia, použite nasledujĆŗci prehliadaÄ "
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr "Nastavte upozornenie domovskej strĆ”nky pre vÅ”etkĆ½ch užĆvateľov, naprĆklad varovanie, dĆ“ležitĆ½ oznam alebo reklamu."
+
+msgid "Simple notice"
+msgstr "JednoduchƩ upozornenie"
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr "Toto oznĆ”menie vyžaduje iba jednoduchĆ½ text, a žiaden kĆ³d nie je povolenĆ½"
+
+msgid "Advanced notice"
+msgstr "PokroÄilĆ© oznĆ”menie"
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr "VaÅ”e upozornenie mĆ“Å¾ete upraviÅ„ pomocou embedded HTML, CSS a JavaScriptom, ale musĆte nakĆ³dovaÅ„ stĆ½l."
+
+msgid "Available updates"
+msgstr "DostupnƩ aktualizƔcie"
+
+msgid "What's new?"
+msgstr "Äo je novĆ©?"
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr "VaÅ”a zložka na ukladanie nemĆ” povolenĆ½ zĆ”pis, upravte oprĆ”vnenia"
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr "%1s mĆ“Å¾e spĆ“sobiÅ„ problĆ©my s proxy, zvĆ½Å”te hodnotu %2s na %3s!"
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr "PrĆ”ve použĆvate vĆ½vojovĆŗ verziu. Aktualizujte ju prostrednĆctvom nĆ”Å”ho repozitĆ”ru spustenĆm: %s."
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr "DostupnĆ” novĆ” verzia Jappix! Skontrolujte Äo je novĆ© a spustite update!"
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr "VaÅ”a verzia je neaktuĆ”lna. Aktualizujte ju na %s kliknutĆm sem!"
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr "VaÅ”a verzia sa zdĆ” byÅ„ aktuĆ”lna, ale mĆ“Å¾ete skontrolovaÅ„ aktualizĆ”cie kliknutĆm sem."
+
+msgid "Check for updates"
+msgstr "SkontrolovaÅ„ aktualizĆ”cie"
+
+msgid "Update in progress"
+msgstr "Prebieha aktualizƔcia"
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr "Jappix bol aktualizovanĆ½: prĆ”ve použĆvate najnovÅ”iu verziu. Bavte sa!"
+
+msgid "The update has failed! Please try again later."
+msgstr "AktualizĆ”cia zlyhala! SkĆŗste to neskĆ“r prosĆm."
+
+msgid "Downloading package..."
+msgstr "Preberanie balĆku.."
+
+msgid "Removing current Jappix system files..."
+msgstr "OdstraÅovanie sĆŗÄastnĆ½ch systĆ©movĆ½ch sĆŗborov Jappixu.."
+
+msgid "Extracting package..."
+msgstr "Rozbaľovanie balĆku..."
+
+msgid "Regenerating storage folder tree..."
+msgstr "Regenerovanie storage folder tree..."
+
+msgid "Jappix is now up to date!"
+msgstr "Jappix je aktualizovanĆ½!"
+
+msgid "Aborted: socket error!"
+msgstr "PreruÅ”enĆ©: socket error!"
+
+msgid "Aborted: buffer error!"
+msgstr "PreruÅ”enĆ©: buffer error!"
+
+msgid "Aborted: everything is not writable!"
+msgstr "PreruÅ”enĆ©: everything is not writable!"
+
+msgid "Aborted: could not extract the package!"
+msgstr "PreruÅ”enĆ©: nedĆ” sa rozbaliÅ„ balĆk!"
+
+msgid "Visits"
+msgstr "NĆ”vÅ”tevnosÅ„"
+
+msgid "Daily"
+msgstr "Denne"
+
+msgid "Weekly"
+msgstr "TĆ½Å¾denne"
+
+msgid "Monthly"
+msgstr "MesaÄne"
+
+msgid "Yearly"
+msgstr "RoÄne"
+
+msgid "Size"
+msgstr "Veľkosń"
+
+msgid "Clean everything"
+msgstr "VyÄisti vÅ”etko"
+
+msgid "Purge cache"
+msgstr "Zbaviń sa cache"
+
+msgid "Purge logs"
+msgstr "Zbaviń sa logov"
+
+msgid "Purge updates"
+msgstr "ZbaviÅ„ sa aktualizĆ”cii"
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr "OdkladacĆ priestor, ktorĆ½ ste chceli vyÄistiÅ„ je teraz prĆ”zdny!"
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr "Udržujte vĆ”Å” Jappix uzol ÄerstvĆ½ a rĆ½chly, Äistite pravidelne odkladacĆ priestor!"
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr "Nahrajte svoju hudbu (Ogg Vorbis, MP3 alebo WAV) a mĆ“Å¾te ju poÄĆŗvaÅ„ v Jappixe!"
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr "SĆŗbor, ktorĆ½ chcete nahraÅ„ musĆ byÅ„ menÅ”Ć ako %s."
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr "ZostaÅte v obraze o tom Äo vaÅ”i užĆvatelia ukladajĆŗ na vĆ”Å” server a odstrĆ”Åte neželanĆ½ obsah pomocou tohto nĆ”stroja"
+
+msgid "Title"
+msgstr "Titul"
+
+msgid "Artist"
+msgstr "Umelec"
+
+msgid "Album"
+msgstr "Album"
+
+msgid "File"
+msgstr "SĆŗbor"
+
+msgid "Upload"
+msgstr "Nahrań"
+
+msgid "The folder is empty."
+msgstr "Zložka je prĆ”zdna"
+
+msgid "The music could not be received, please retry!"
+msgstr "Hudbu sa nepodarilo prevziaÅ„, prosĆm skĆŗste znova!"
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr "Toto nie je platnĆ½ hudobnĆ½ sĆŗbor. konvertujte ho na Ogg Vorbis, MP3 alebo WAV!"
+
+msgid "Your music has been added!"
+msgstr "VaÅ”a hudba bola pridanĆ”!"
+
+msgid "The selected elements have been removed."
+msgstr "VybranĆ© položky budĆŗ odstrĆ”nenĆ©."
+
+msgid "You must select elements to remove!"
+msgstr "MusĆte vybraÅ„ položky na odstrĆ”nenie!"
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr "Pridaj užĆvateľa alebo zmeÅ heslo (zadaj existujuce užĆvateľskĆ© meno). Zvoľte silnĆ© heslo!"
+
+msgid "Manage"
+msgstr "Spravovań"
+
+msgid "List"
+msgstr "Zoznam"
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr "OdstrĆ”Å užĆvateľa, PamƤtajte že nemĆ“Å¾ete odstrĆ”niÅ„ užĆvateľa ak je poslednĆ½."
+
+msgid "The user has been added!"
+msgstr "UžĆvateľ bol pridanĆ½"
+
+msgid "The chosen users have been removed."
+msgstr "VybranĆ½ užĆvateľ bol odstrĆ”nenĆ½."
+
+msgid "You must select one or more users to be removed!"
+msgstr "MusĆte vybraÅ„ jednĆ©ho alebo viacerĆ½ch užĆvateľov pre odstrĆ”nenie!"
+
+msgid "Yesterday"
+msgstr "VÄera"
+
+msgid "%s days ago"
+msgstr "Pred %s dÅami"
+
+msgid "User currently active"
+msgstr "UžĆvateľ je aktĆvny"
+
+msgid "Last seen: %s"
+msgstr "Naposledy videnĆ½: %s"
+
+msgid "Inactive since: %s"
+msgstr "NeaktĆvny od: %s"
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr "ZdĆ” sa že vĆ”Å” priateľ nedostal nedostal vaÅ”u sprĆ”vu(y)!"
+
+msgid "Static content server"
+msgstr "Static content server"
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr "Toto je statickĆ½ obsah serveru pre %1s, ā%2sā."
+
+msgid "Suggested friends"
+msgstr "NavrhovanĆ priatelia"
+
+msgid "Check all"
+msgstr "OznaÄit vÅ”etko"
+
+msgid "Uncheck all"
+msgstr "OdznaÄit vÅ”etko"
+
+msgid "Choose"
+msgstr "Zvoliń"
+
+msgid "List name"
+msgstr "Meno zoznamu"
+
+msgid "Allow"
+msgstr "Povoliń"
+
+msgid "Deny"
+msgstr "Zamietnuń"
+
+msgid "Group"
+msgstr "Skupina"
+
+msgid "Subscription"
+msgstr "Odoberanie"
+
+msgid "Both"
+msgstr "Obe"
+
+msgid "From"
+msgstr "Od"
+
+msgid "Everybody"
+msgstr "VŔetci"
+
+msgid "Send messages"
+msgstr "PoslaÅ„ sprĆ”vu"
+
+msgid "Send queries"
+msgstr "Send queries"
+
+msgid "See my status"
+msgstr "ZobraziÅ„ mĆ“j status"
+
+msgid "Send his/her status"
+msgstr "Odoslań jeho-jej status"
+
+msgid "Everything"
+msgstr "VŔetko"
+
+msgid "Item"
+msgstr "Položka"
+
+msgid "Order"
+msgstr "Poradie"
+
+msgid "Active for this session"
+msgstr "AktĆvny pre toto sedenie"
+
+msgid "Always active"
+msgstr "Vždy aktĆvny"
+
+msgid "User directory"
+msgstr ""
+
+msgid "Search a friend"
+msgstr "Vyhľadań priateľa"
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr ""
+
+msgid "This is a repeat from %s"
+msgstr ""
+
+msgid "Loading comments..."
+msgstr ""
+
+msgid "Type your comment here..."
+msgstr ""
+
+msgid "Could not get the comments!"
+msgstr ""
+
+msgid "Show comments"
+msgstr ""
+
+msgid "Send him/her a message"
+msgstr ""
+
+msgid "Start a chat with him/her"
+msgstr ""
+
+msgid "Media integration"
+msgstr ""
+
+msgid "Comments locked!"
+msgstr ""
+
+msgid "Type something you want to share with your friends..."
+msgstr ""
+
+msgid "changed his/her nickname to %s"
+msgstr ""
+
+msgid "commented an item you follow: ā%sā."
+msgstr ""
+
+msgid "Hide"
+msgstr ""
+
+msgid "liked your post: ā%sā."
+msgstr ""
+
+msgid "quoted you somewhere: ā%sā."
+msgstr ""
+
+msgid "published on your wall: ā%sā."
+msgstr ""
+
+msgid "tagged you in a photo (%s)."
+msgstr ""
+
+msgid "tagged you in a video (%s)."
+msgstr ""
+
+msgid "Show"
+msgstr ""
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr ""
+
+msgid "Pubsub host"
+msgstr ""
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr ""
+
+msgid "Manager link"
+msgstr ""
+
+msgid "User uploads server"
+msgstr ""
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Logo"
+msgstr ""
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr ""
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr ""
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr ""
+
+msgid "Your service logo has been successfully changed!"
+msgstr ""
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr ""
+
+msgid "Remove this logo"
+msgstr ""
+
+msgid "View this logo"
+msgstr ""
+
+msgid "Send a file"
+msgstr ""
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr ""
+
+msgid "Groupchats to join"
+msgstr ""
+
+msgid "Purge sent files"
+msgstr ""
+
+msgid "would like to send you a file: ā%sā."
+msgstr ""
+
+msgid "has accepted to received your file: ā%sā."
+msgstr ""
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr ""
+
+msgid "could not receive your file: ā%sā."
+msgstr ""
+
+msgid "has received a file exchange request: ā%sā."
+msgstr ""
+
+msgid "Available shortcuts:"
+msgstr ""
+
+msgid "%s removes the chat logs"
+msgstr ""
+
+msgid "%s joins a groupchat"
+msgstr ""
+
+msgid "%s closes the chat"
+msgstr ""
+
+msgid "%s shows the user profile"
+msgstr ""
+
+msgid "%s sends a message to the room"
+msgstr ""
+
+msgid "%s changes your nickname"
+msgstr ""
+
+msgid "%s sends a message to someone in the room"
+msgstr ""
+
+msgid "%s changes the room topic"
+msgstr ""
+
+msgid "%s kicks an user of the room"
+msgstr ""
+
+msgid "%s bans an user of the room"
+msgstr ""
+
+msgid "%s invites someone to join the room"
+msgstr ""
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr "Jappix je neziskovĆ” sociĆ”lna platforma, ku ktorej mĆ”te prĆstup kdekoľvek, kedykoľvek chcete a s kĆ½mkoľvek chcete komunikovaÅ„"
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# Swedish translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:25+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "Jappix krƤver Javascript fƶr att fungera, men det saknas eller Ƥr avstƤngt i din webblƤsare."
+
+msgid "An open social network"
+msgstr "Ett ƶppet socialt nƤtverk."
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "Jappix har blivit avbryten av ett nƤtverksproblem, en bugg eller felaktiga loginuppgifter (se till att du har skrivit rƤtt uppgifter), Vi ber om ursƤkt fƶr besvƤret."
+
+msgid "The element list on this server could not be obtained!"
+msgstr "Elementlistan pƄ denna server kunde inte hƤmtas!"
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "Ditt lƶsenord har Ƥndrats, du kan nu logga in med det."
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "Ditt XMPP konto har blivit borttaget. HejdƄ!"
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "Du har blivit utloggad frƄn ditt XMPP konto. Ha en bra dag!"
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "Rummet du har gƄtt med i verkar inte existera. Skapa det!"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "Gruppchatten har blivit borttagen. Nu kan nƄgon annan Ƅterskapa den."
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "AnvƤndaren som du vill nƄ Ƥr inte nƤrvarande i detta rum."
+
+msgid "Please enter the group chat address to join."
+msgstr "Var god skriv in gruppchat adressen du vill gƄ med i."
+
+msgid "Please enter your nickname to join %s."
+msgstr "Var god skriv in ditt anvƤndarnamn fƶr att gƄ med i %s."
+
+msgid "This room (%s) is protected with a password."
+msgstr "Rummet (%s) Ƥr lƶsenordskyddat."
+
+msgid "Your browser is out of date!"
+msgstr "Din webblƤsare Ƥr fƶr gammal!"
+
+msgid "Last %s version is better!"
+msgstr "Versionen &s Ƥr bƤttre!"
+
+msgid "Login"
+msgstr "Logga in"
+
+msgid "Register"
+msgstr "Registrera"
+
+msgid "Here we go!"
+msgstr "SƤtt igƄng!"
+
+msgid "Server"
+msgstr "Server"
+
+msgid "Password"
+msgstr "Lƶsenord"
+
+msgid "Remember me"
+msgstr "Kom ihƄg mig"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "Detta verktyg Ƥr inaktiverat, du kan inte anvƤnda det!"
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "PƄ grund av ett nƤtverksproblem sƄ har du blivit frƄnkopplad. Vad vill du gƶra nu?"
+
+msgid "Reconnect"
+msgstr "Ć
teranslut"
+
+msgid "Messages"
+msgstr "Meddelanden"
+
+msgid "Profile"
+msgstr "Profil"
+
+msgid "Options"
+msgstr "InstƤllningar"
+
+msgid "Disconnect"
+msgstr "Koppla ner"
+
+msgid "Filter"
+msgstr "Filtrera"
+
+msgid "Add a friend"
+msgstr "LƤgg till en vƤn"
+
+msgid "Your groupchats"
+msgstr "Dina gruppchatter"
+
+msgid "Manage your favorite groupchats"
+msgstr "Hantera dina favorit gruppchatter"
+
+msgid "More stuff"
+msgstr "Fler verktyg"
+
+msgid "Show all friends"
+msgstr "Visa alla vƤnner"
+
+msgid "Only show connected friends"
+msgstr "Visa bara anslutna vƤnner"
+
+msgid "Message archives"
+msgstr "Meddelandearkiv"
+
+msgid "Date"
+msgstr "Datum"
+
+msgid "Please select a friend to view the chat history."
+msgstr "Var god vƤlj en vƤn fƶr att se chathistoriken."
+
+msgid "Nothing found for: %s"
+msgstr "Inget hittades med: %s"
+
+msgid "A short message?"
+msgstr "Kort meddelande?"
+
+msgid "How are you?"
+msgstr "Hur mƄr du?"
+
+msgid "What are you doing?"
+msgstr "Vad gƶr du?"
+
+msgid "Join a chat"
+msgstr "GĆ„ med i en chat"
+
+msgid "Status"
+msgstr "TillstƄnd"
+
+msgid "Available"
+msgstr "TillgƤnglig"
+
+msgid "Talkative"
+msgstr "Pratsam"
+
+msgid "Away"
+msgstr "Borta"
+
+msgid "Not available"
+msgstr "Ej tillgƤnglig"
+
+msgid "Busy"
+msgstr "Uppagen"
+
+msgid "Mood"
+msgstr "Humƶr"
+
+msgid "None"
+msgstr "Inget"
+
+msgid "Crazy"
+msgstr "Galen"
+
+msgid "Excited"
+msgstr "Upphetsad"
+
+msgid "Playful"
+msgstr "Lekfull"
+
+msgid "Happy"
+msgstr "Glad"
+
+msgid "Shocked"
+msgstr "Chockad"
+
+msgid "Hot"
+msgstr "Het"
+
+msgid "Sad"
+msgstr "Ledsen"
+
+msgid "Amorous"
+msgstr "FƶrƤlskad"
+
+msgid "Confident"
+msgstr "SjƤlvsƤker"
+
+msgid "Activity"
+msgstr "Aktivitet"
+
+msgid "Chores"
+msgstr "Sysslor"
+
+msgid "Drinking"
+msgstr "Dricker"
+
+msgid "Eating"
+msgstr "Ćter"
+
+msgid "Exercising"
+msgstr "TrƤnar"
+
+msgid "Grooming"
+msgstr "Fƶrbereder"
+
+msgid "Appointment"
+msgstr "PƄ mƶte"
+
+msgid "Inactive"
+msgstr "Inaktiv"
+
+msgid "Relaxing"
+msgstr "Slappnar av"
+
+msgid "Talking"
+msgstr "Pratar"
+
+msgid "Traveling"
+msgstr "Reser"
+
+msgid "Working"
+msgstr "Jobbar"
+
+msgid "View profile"
+msgstr "Visa profil"
+
+msgid "Repeat this notice"
+msgstr "Repetera notis"
+
+msgid "Remove this notice"
+msgstr "Radera notis"
+
+msgid "Your profile"
+msgstr "Din profil"
+
+msgid "Identity"
+msgstr "Identitet"
+
+msgid "Profile image"
+msgstr "Profilbild"
+
+msgid "Others"
+msgstr "Andra"
+
+msgid "Personal"
+msgstr "Personliga"
+
+msgid "Complete name"
+msgstr "FullstƤndigt namn"
+
+msgid "Nickname"
+msgstr "Smeknamn"
+
+msgid "First name"
+msgstr "Fƶrnamn"
+
+msgid "Last name"
+msgstr "Efternamn"
+
+msgid "Date of birth"
+msgstr "Fƶdelsedatum"
+
+msgid "Contact"
+msgstr "Kontakt"
+
+msgid "E-mail"
+msgstr "E-post"
+
+msgid "Phone"
+msgstr "Telefon nummer"
+
+msgid "Website"
+msgstr "Hemsida"
+
+msgid "Current"
+msgstr "Nuvarande"
+
+msgid "Delete"
+msgstr "Radera"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "Vad synd! Du har ingen profilbild fƶr ditt identitetskort!"
+
+msgid "Address"
+msgstr "Address"
+
+msgid "Street"
+msgstr "Gata"
+
+msgid "City"
+msgstr "Stad"
+
+msgid "Postal code"
+msgstr "Postnummer"
+
+msgid "Country"
+msgstr "Land"
+
+msgid "Biography"
+msgstr "Biografi"
+
+msgid "Important notice"
+msgstr "Viktigt meddelande"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr "Var fƶrsiktig med informationen du skriver in i din profil, det kan lƤsas av alla (till och med nƄgon du inte vill ska se)."
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr "Allting Ƥr inte privat pƄ XMPP, detta Ƥr en av sakerna. Din offentliga profil (vCard)."
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr "Det Ƥr rekommenderat att ladda upp en profilbild (max %s), som en bild pƄ dig sjƤlv. Det gƶr det lƤtt att identifieras av dina vƤnner."
+
+msgid "Save"
+msgstr "Spara"
+
+msgid "Cancel"
+msgstr "Avbryt"
+
+msgid "Edit options"
+msgstr "Ćndra instƤllningar"
+
+msgid "Channel"
+msgstr "Kanal"
+
+msgid "Commands"
+msgstr "Kommandon"
+
+msgid "Sounds"
+msgstr "Ljud"
+
+msgid "Privacy"
+msgstr "Integritet"
+
+msgid "Message archiving"
+msgstr "Meddelande arkivering"
+
+msgid "Store a history of your chats"
+msgstr "Spara en historik av dina chatter"
+
+msgid "Geolocation"
+msgstr "Geolocation"
+
+msgid "Empty"
+msgstr "Tom"
+
+msgid "Empty channel"
+msgstr "Tom kanal"
+
+msgid "Persistent"
+msgstr "BestƤndig"
+
+msgid "Maximum notices"
+msgstr "Maximalt antal notiser"
+
+msgid "Account"
+msgstr "Konto"
+
+msgid "Change password"
+msgstr "Ćndra lƶsenord"
+
+msgid "Delete account"
+msgstr "Ta bort konto"
+
+msgid "Old"
+msgstr "Gammal"
+
+msgid "New (2 times)"
+msgstr "Ny"
+
+msgid "Continue"
+msgstr "FortsƤtt"
+
+msgid "To"
+msgstr "Till"
+
+msgid "Close"
+msgstr "StƤng"
+
+msgid "unknown"
+msgstr "okƤnd"
+
+msgid "Unavailable"
+msgstr "OtillgƤnglig"
+
+msgid "is now"
+msgstr "Ƥr nu"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr "Var god vƤnta medans din profilbild uppladdas..."
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "DƤr Ƥr den! En ny vacker profilbild!"
+
+msgid "The image file is not supported or has a bad size."
+msgstr "Bildfilen stƶdjs ej eller har en ogiltlig storlek."
+
+msgid "Reply"
+msgstr "Svara"
+
+msgid "Error"
+msgstr "Fel"
+
+msgid "Click here to solve the error"
+msgstr "Klicka hƤr fƶr att lƶsa problemet"
+
+msgid "You"
+msgstr "Du"
+
+msgid "Remove"
+msgstr "Ta bort"
+
+msgid "Rename"
+msgstr "Byt namn"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "Hej, Jag Ƥr %s och jag skulle vilja lƤgga till dig som min vƤn."
+
+msgid "Smiley insertion"
+msgstr "Smiley inlƤggning"
+
+msgid "Change style"
+msgstr "Ćndra stil"
+
+msgid "Text in bold"
+msgstr "Bred text"
+
+msgid "Text in italic"
+msgstr "Kursiv text"
+
+msgid "Underlined text"
+msgstr "Understruken text"
+
+msgid "Save chat"
+msgstr "Spara chat"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr "Trycka pƄ denna lƤnk fƶr att fƄ chatloggen och vƤnta. Tryck sedan igen fƶr att fƄ filen."
+
+msgid "This chat is empty!"
+msgstr "Denna chat Ƥr tom!"
+
+msgid "Generate file!"
+msgstr "Generera fil!"
+
+msgid "Download file!"
+msgstr "Ladda ner fil!"
+
+msgid "Clean current chat"
+msgstr "Rensa nuvarande chat"
+
+msgid "View chat history"
+msgstr "Visa chathistorik"
+
+msgid "Show user profile"
+msgstr "Visa anvƤndarprofil"
+
+msgid "Add this contact to your friends"
+msgstr "LƤgg till denna kontakt till dina vƤnner"
+
+msgid "Add this groupchat to your favorites"
+msgstr "LƤgg till denna gruppchat till dina favoriter"
+
+msgid "All tabs"
+msgstr "Alla flikar"
+
+msgid "Close this tab"
+msgstr "StƤng denna flik"
+
+msgid "no subject defined for this room."
+msgstr "inget Ƥmne satt i detta rum."
+
+msgid "Administration panel for this room"
+msgstr "Administrationspanel fƶr detta rum"
+
+msgid "Moderators"
+msgstr "Moderatorer"
+
+msgid "Participants"
+msgstr "Deltagare"
+
+msgid "Visitors"
+msgstr "Besƶkare"
+
+msgid "Manage favorite rooms"
+msgstr "Hantera favoritrum"
+
+msgid "Change favorites"
+msgstr "Ćndra favoriter"
+
+msgid "Search a room"
+msgstr "Sƶk efter ett rum"
+
+msgid "Select a favorite"
+msgstr "VƤlj en favorit"
+
+msgid "Getting the name..."
+msgstr "FĆ„ tag i namn..."
+
+msgid "Gateway"
+msgstr "Gateway"
+
+msgid "Name"
+msgstr "Namn"
+
+msgid "Room"
+msgstr "Rum"
+
+msgid "Add"
+msgstr "LƤgg till"
+
+msgid "Edit"
+msgstr "Ćndra"
+
+msgid "Search a room on"
+msgstr "Sƶk efter ett rum pƄ"
+
+msgid "No room found on this server."
+msgstr "Inget rum hittat pƄ denna server."
+
+msgid "Service discovery"
+msgstr "TjƤnst upptƤckande"
+
+msgid "Server to query"
+msgstr "Server att ifrƄgesƤtta"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr "UrsƤkta, men fƶremƄlet lƤmnade inga resultat!"
+
+msgid "Accounts"
+msgstr "Konton"
+
+msgid "Authentications"
+msgstr "Autentiseringar"
+
+msgid "Automation"
+msgstr "Automatik"
+
+msgid "Clients"
+msgstr "Klienter"
+
+msgid "Collaboration"
+msgstr "Kollaboration"
+
+msgid "Components"
+msgstr "Komponenter"
+
+msgid "Rooms"
+msgstr "Rum"
+
+msgid "Directories"
+msgstr "Kataloger"
+
+msgid "Gateways"
+msgstr ""
+
+msgid "News"
+msgstr "Nyheter"
+
+msgid "Hierarchy"
+msgstr "Hierarki"
+
+msgid "Proxies"
+msgstr ""
+
+msgid "Publication/Subscription"
+msgstr "Publicering/Prenumeration"
+
+msgid "Storage"
+msgstr "Lagring"
+
+msgid "Service offline or broken"
+msgstr "TjƤnsten Ƥr ur funktion"
+
+msgid "Your inbox"
+msgstr "Din inkorg"
+
+msgid "Available actions"
+msgstr ""
+
+msgid "Clean"
+msgstr "Rensa"
+
+msgid "New"
+msgstr "Ny"
+
+msgid "Received"
+msgstr "Mottagen"
+
+msgid "Subject"
+msgstr "Ćmne"
+
+msgid "Content"
+msgstr "InnehƄll"
+
+msgid "Send message"
+msgstr "Skicka meddelande"
+
+msgid "Your inbox is empty."
+msgstr "Din inkorg Ƥr tom."
+
+msgid "MUC administration"
+msgstr ""
+
+msgid "You administrate this room"
+msgstr "Du administrerar detta rum"
+
+msgid "Enter new subject"
+msgstr "Ange nytt Ƥmne"
+
+msgid "Configuration"
+msgstr "InstƤllningar"
+
+msgid "Authorizations"
+msgstr "TillƄtelser"
+
+msgid "Member list"
+msgstr "Medlemslista"
+
+msgid "Owner list"
+msgstr "Ćgarlista"
+
+msgid "Administrator list"
+msgstr "Administratƶrslista"
+
+msgid "Outcast list"
+msgstr "Lista pƄ uteslutna"
+
+msgid "Add an input"
+msgstr ""
+
+msgid "Destroy this MUC"
+msgstr ""
+
+msgid "Yes, let's do it!"
+msgstr "Ja, kƶr pƄ!"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr ""
+
+msgid "Your friend is writing a message..."
+msgstr "Din vƤn skriver..."
+
+msgid "Your friend stopped writing a message."
+msgstr "Din vƤn slutade skriva."
+
+msgid "Your friend is doing something else."
+msgstr ""
+
+msgid "Your friend closed the chat."
+msgstr ""
+
+msgid "Requesting this service..."
+msgstr ""
+
+msgid "Loading"
+msgstr "Startar"
+
+msgid "joined the chat room"
+msgstr "kom in i rummet"
+
+msgid "left the chat room"
+msgstr "lƤmnade rummet"
+
+msgid "no status"
+msgstr "ingen status"
+
+msgid "has been kicked"
+msgstr "har sparkats ut"
+
+msgid "has been banned"
+msgstr "har utestƤngts"
+
+msgid "no reason"
+msgstr "ingen anledning"
+
+msgid "Communicate with the entire world!"
+msgstr "Kommunicera med hela vƤrlden!"
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr ""
+
+msgid "Hi there!"
+msgstr "Hej dƤr!"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr "VƤlkommen till %1s, ā%2sā."
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr ""
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr ""
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr ""
+
+msgid "Previous"
+msgstr "FƶregƄende"
+
+msgid "General"
+msgstr "AllmƤnt"
+
+msgid "Advanced"
+msgstr "Avancerat"
+
+msgid "Resource"
+msgstr "Resurs"
+
+msgid "Priority"
+msgstr "Prioritet"
+
+msgid "Low"
+msgstr "LĆ„g"
+
+msgid "Medium"
+msgstr "Medium"
+
+msgid "High"
+msgstr "Hƶg"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr ""
+
+msgid "login page"
+msgstr "inloggningssida"
+
+msgid "Share this link with your friends:"
+msgstr "Skicka denna lƤnk till dina vƤnner:"
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr ""
+
+msgid "Required"
+msgstr "Obligatorisk"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr "Du har registrertats. Din XMPP-adress Ƥr:"
+
+msgid "Manager"
+msgstr ""
+
+msgid "Project"
+msgstr "Projekt"
+
+msgid "Encrypted"
+msgstr "Krypterad"
+
+msgid "Unencrypted"
+msgstr "Okrypterad"
+
+msgid "Where are you?"
+msgstr "Var Ƥr du?"
+
+msgid "What's up with you?"
+msgstr "Hur Ƥr lƤget?"
+
+msgid "Fetching the social channel..."
+msgstr "HƤmtar den sociala kanalen..."
+
+msgid "You are synchronized with your network."
+msgstr ""
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr ""
+
+msgid "Media viewer"
+msgstr "Mediavisare"
+
+msgid "Browse"
+msgstr "BlƤddra"
+
+msgid "Command"
+msgstr "Kommando"
+
+msgid "Subscribe"
+msgstr "Prenumerera"
+
+msgid "Join"
+msgstr "GĆ„ med"
+
+msgid "Automatic"
+msgstr "Automatiskt"
+
+msgid "Search"
+msgstr "Sƶk"
+
+msgid "No result!"
+msgstr "Inget resultat!"
+
+msgid "No notifications."
+msgstr ""
+
+msgid "would like to add you as a friend."
+msgstr "vill lƤgga til dig som en vƤn."
+
+msgid "would like you to join this chatroom:"
+msgstr "vill att du gƄr med i detta chattrum:"
+
+msgid "Do you accept?"
+msgstr "Vill du acceptera inbjudan?"
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Nej"
+
+msgid "would like to get authorization."
+msgstr "vill fƄ tillƄtelse."
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr ""
+
+msgid "Submit"
+msgstr "Skicka"
+
+msgid "Client"
+msgstr "Klient"
+
+msgid "System"
+msgstr "System"
+
+msgid "Local time"
+msgstr "Lokal tid"
+
+msgid "Comments"
+msgstr "Kommentarer"
+
+msgid "User profile"
+msgstr "AnvƤndarprofil"
+
+msgid "See his/her position on the globe"
+msgstr "Se hans/hennes position pƄ jordklotet"
+
+msgid "Confirm"
+msgstr "BekrƤfta"
+
+msgid "anonymous mode"
+msgstr "anonymt lƤge"
+
+msgid "Groups"
+msgstr "Grupper"
+
+msgid "Unclassified"
+msgstr "Oklassificerad"
+
+msgid "Authorize"
+msgstr "TillƄtelse"
+
+msgid "Ask for authorization"
+msgstr "Be om tillƄtelse"
+
+msgid "Unblock"
+msgstr "Avblockera"
+
+msgid "Prohibit"
+msgstr "Fƶrhindra"
+
+msgid "Block"
+msgstr "Blockera"
+
+msgid "Chat"
+msgstr "Chatt"
+
+msgid "Groupchat"
+msgstr "Gruppchatt"
+
+msgid "Jappix Mobile"
+msgstr "Jappix Mobilt"
+
+msgid "Desktop"
+msgstr "Skrivbord"
+
+msgid "Mobile"
+msgstr "Mobilt"
+
+msgid "Please wait..."
+msgstr "Var god vƤnta..."
+
+msgid "Please enable JavaScript"
+msgstr "VƤnligen aktivera JavaScript"
+
+msgid "Your channel"
+msgstr "Din kanal"
+
+msgid "Channel of"
+msgstr ""
+
+msgid "More notices..."
+msgstr "Fler notiser..."
+
+msgid "Attach a file"
+msgstr "Bifoga en fil"
+
+msgid "Send"
+msgstr "Skicka"
+
+msgid "Unattach the file"
+msgstr "Ta bort bifogad fil"
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr "Ett fel uppstod vid uppladdning. Kanske filen Ƥr stƶrre Ƥn %s eller av blockerad av nƄgon anledning."
+
+msgid "Authorization failed"
+msgstr "TillƄtelsekontroll misslyckades"
+
+msgid "Registration failed, please choose a different username"
+msgstr "Registrering misslyckades. VƤnligen vƤlj ett annat anvƤndarnamn"
+
+msgid "Service unavailable"
+msgstr "TjƤnsten ej tillgƤnglig"
+
+msgid "Internal server error, try later"
+msgstr "Internt serverfel. Fƶrsƶk gƤrna senare"
+
+msgid "Your form has been sent."
+msgstr "Ditt formulƤr har skickats."
+
+msgid "Application"
+msgstr ""
+
+msgid "XMPP links"
+msgstr "XMPP-lƤnkar"
+
+msgid "Open XMPP links with Jappix"
+msgstr "Ćppna XMPP-lƤnkar med Jappix"
+
+msgid "changed the subject to:"
+msgstr "Ƥndrade Ƥmnet till:"
+
+msgid "Welcome!"
+msgstr "VƤlkommen!"
+
+msgid "Friends"
+msgstr "VƤnner"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr ""
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr ""
+
+msgid "Enable notification sounds"
+msgstr "Aktivera ljudeffekter"
+
+msgid "Share your position on the globe"
+msgstr ""
+
+msgid "Offline friends"
+msgstr "Ej inloggade vƤnner"
+
+msgid "Don't hide offline friends"
+msgstr "Visa Ƥven ej inloggade vƤnner"
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr ""
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr ""
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr ""
+
+msgid "Share Jappix on %s"
+msgstr ""
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr "AnvƤnder Jappix, en ƶppen social plattform. Jag Ƥr %s!"
+
+msgid "Unknown name"
+msgstr "OkƤnt namn"
+
+msgid "Unknown country"
+msgstr "OkƤnt land"
+
+msgid "Click to enable"
+msgstr "Klicka fƶr att aktivera"
+
+msgid "Click to disable"
+msgstr "Klicka fƶr att deaktivera"
+
+msgid "Installation"
+msgstr "Installation"
+
+msgid "Jappix installation"
+msgstr "Installera Jappix"
+
+msgid "Welcome to the Jappix installation!"
+msgstr "VƤlkommen till installationen av Jappix!"
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr ""
+
+msgid "Let's have a look at the installation steps:"
+msgstr ""
+
+msgid "Welcome"
+msgstr "VƤlkommen"
+
+msgid "Storage configuration"
+msgstr "Konfigurera lagring"
+
+msgid "Administrator account"
+msgstr "Administratƶrskonto"
+
+msgid "Main configuration"
+msgstr ""
+
+msgid "Hosts configuration"
+msgstr "InstƤllningar fƶr vƤrdar"
+
+msgid "Services installation"
+msgstr "Installation av tjƤnster"
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr ""
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr ""
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr ""
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr ""
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr ""
+
+msgid "The folder is writable, you can continue!"
+msgstr "Mappen Ƥr skrivbar -- du kan nu fortsƤtta!"
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr ""
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr ""
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr "Oops, nƄgot saknas, eller sƄ matchar inte de tvƄ lƶsenorden!"
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr ""
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr ""
+
+msgid "User"
+msgstr "AnvƤndare"
+
+msgid "Service"
+msgstr "TjƤnst"
+
+msgid "Service name"
+msgstr "TjƤnstnamn"
+
+msgid "Service description"
+msgstr "TjƤnstbeskrivning"
+
+msgid "Connection"
+msgstr "Anslutning"
+
+msgid "Lock the host"
+msgstr "LƄs vƤrd"
+
+msgid "Anonymous mode"
+msgstr "Anonymt lƤge"
+
+msgid "Registration allowed"
+msgstr "Registrering tillƄten"
+
+msgid "Use a proxy"
+msgstr "AnvƤnd en proxy"
+
+msgid "Encryption"
+msgstr "Kryptering"
+
+msgid "HTTPS storage"
+msgstr "Lagring HTTPS"
+
+msgid "Force HTTPS"
+msgstr "KrƤv HTTPS"
+
+msgid "Compression"
+msgstr "Komprimering"
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr ""
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr ""
+
+msgid "Main host"
+msgstr "HuvudvƤrd"
+
+msgid "Groupchat host"
+msgstr "VƤrd fƶr gruppchatt"
+
+msgid "Anonymous host"
+msgstr "Anonym vƤrd"
+
+msgid "Directory host"
+msgstr "KatalogvƤrd"
+
+msgid "BOSH host"
+msgstr "BOSH vƤrd"
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr ""
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr ""
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr ""
+
+msgid "Thanks for using Jappix!"
+msgstr "Tack fƶr att du anvƤnder Jappix!"
+
+msgid "Next"
+msgstr "NƤsta"
+
+msgid "Finish"
+msgstr "Slutfƶr"
+
+msgid "Check again"
+msgstr "Kontrollera igen"
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr "Mappen Ƥr ej skrivbar. Korrigera rƤttigheterna fƶr mappen %s"
+
+msgid "%s is installed on your system."
+msgstr "%s har installerats pƄ ditt system."
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr "%1s har ej installerats pƄ ditt system. Du borde installera %2s."
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr "MaxgrƤnsen fƶr uppladdning via PHP Ƥr tillrƤcklig (%s)."
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr "MaxgrƤnsen fƶr uppladdning via PHP Ƥr ej tillrƤcklig (%1s). Du bƶr ange grƤnsen till %2s i %3s."
+
+msgid "Jappix manager"
+msgstr ""
+
+msgid "Manager access"
+msgstr ""
+
+msgid "Statistics"
+msgstr "Statistik"
+
+msgid "Hosts"
+msgstr "VƤrdar"
+
+msgid "Design"
+msgstr "Utseende"
+
+msgid "Repeat"
+msgstr "Repetera"
+
+msgid "All"
+msgstr "Alla"
+
+msgid "Horizontal"
+msgstr "Sidled"
+
+msgid "Vertical"
+msgstr "Hƶjdled"
+
+msgid "Center"
+msgstr "Mitten"
+
+msgid "Left"
+msgstr "VƤnster"
+
+msgid "Right"
+msgstr "Hƶger"
+
+msgid "Top"
+msgstr "Toppen"
+
+msgid "Bottom"
+msgstr "Botten"
+
+msgid "Adapt"
+msgstr "Anpassa"
+
+msgid "Color"
+msgstr "FƤrg"
+
+msgid "Users"
+msgstr "AnvƤndare"
+
+msgid "Updates"
+msgstr "Uppdateringar"
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr ""
+
+msgid "Please use the form below to login to the administration panel."
+msgstr "VƤnligen anvƤnd formulƤret nedan fƶr att logga in pƄ administratƶrsbilden."
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr ""
+
+msgid "Credentials"
+msgstr "RƤttigheter"
+
+msgid "You have been logged out. Goodbye!"
+msgstr "Du har nu loggats ut. Hej dƄ!"
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr "Oops, du verkar inte ha administratƶrsrƤttigheter. Kontrollera dina rƤttigheter."
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr ""
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr ""
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr ""
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr ""
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr ""
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr "Ej giltig bild. VƤnligen anvƤnd enbart bilder i format PNG, GIF eller JPG."
+
+msgid "The image could not be received, would you mind retry?"
+msgstr "Bilden kunde inte tas emot. Det kanske hjƤlper att fƶrsƶka igen."
+
+msgid "Your image was added to the list!"
+msgstr "Din bild lades till i listan!"
+
+msgid "Changes saved!"
+msgstr "Ćndringar sparade!"
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr ""
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr ""
+
+msgid "Access statistics"
+msgstr ""
+
+msgid "Share statistics"
+msgstr ""
+
+msgid "Other statistics"
+msgstr ""
+
+msgid "January"
+msgstr "Januari"
+
+msgid "February"
+msgstr "Februari"
+
+msgid "March"
+msgstr "Mars"
+
+msgid "April"
+msgstr "April"
+
+msgid "May"
+msgstr "Maj"
+
+msgid "June"
+msgstr "Juni"
+
+msgid "July"
+msgstr "Juli"
+
+msgid "August"
+msgstr "Augusti"
+
+msgid "September"
+msgstr "September"
+
+msgid "October"
+msgstr "Oktober"
+
+msgid "November"
+msgstr "November"
+
+msgid "December"
+msgstr "December"
+
+msgid "Monday"
+msgstr "MĆ„ndag"
+
+msgid "Tuesday"
+msgstr "Tisdag"
+
+msgid "Wednesday"
+msgstr "Onsdag"
+
+msgid "Thursday"
+msgstr "Torsdag"
+
+msgid "Friday"
+msgstr "Fredag"
+
+msgid "Saturday"
+msgstr "Lƶrdag"
+
+msgid "Sunday"
+msgstr "Sƶndag"
+
+msgid "Total"
+msgstr "Totalt"
+
+msgid "Cache"
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Music"
+msgstr "Musik"
+
+msgid "Backgrounds"
+msgstr "Bakgrunder"
+
+msgid "Share"
+msgstr ""
+
+msgid "Background"
+msgstr "Bakgrund"
+
+msgid "Notice"
+msgstr "Notis"
+
+msgid "Your design preferences have been saved!"
+msgstr "Dina instƤllningar fƶr utseendet har sparats!"
+
+msgid "Please check your inputs: something is missing!"
+msgstr "VƤnligen kontrollera indata -- nƄgonting saknas!"
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr ""
+
+msgid "Use default background"
+msgstr "AnvƤnd standardbakgrunden"
+
+msgid "Use your own image"
+msgstr "AnvƤnd egen bild"
+
+msgid "Select a background to use and change the display options."
+msgstr "VƤlj en bakgrund och Ƥndra instƤllningar fƶr utseendet."
+
+msgid "Use your own color"
+msgstr "AnvƤnd egen fƤrg"
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr "Ange det hexadecimala vƤrdet (webbfƤrgvƤrdet) fƶr den fƤrg du vill anvƤnda som bakgrund."
+
+msgid "Manage backgrounds"
+msgstr "Anpassa bakgrunder"
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr ""
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr ""
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr ""
+
+msgid "Simple notice"
+msgstr ""
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr ""
+
+msgid "Advanced notice"
+msgstr ""
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr ""
+
+msgid "Available updates"
+msgstr "TillgƤngliga uppdateringar"
+
+msgid "What's new?"
+msgstr "Vad Ƥr nytt?"
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr ""
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr ""
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr "Du anvƤnder utvecklingsversionen av Jappix. Den uppdateras genom vƄrt repo genom att kƶra: %s."
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr "En ny version av Jappix finns tillgƤnglig! Kontrollera vad som Ƥr nytt och starta uppdateringen."
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr "Din version Ƥr gammal. Uppdatera till %s nu genom att klicka hƤr!"
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr "Din version verkar vara aktuell, men du kan kontrollera uppdateringar manuellt genom att klicka hƤr."
+
+msgid "Check for updates"
+msgstr "Sƶk efter uppdateringar"
+
+msgid "Update in progress"
+msgstr "Uppdaterar"
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr "Jappix har uppdaterats. Du anvƤnder nu den senaste versionen. VarsƄgod!"
+
+msgid "The update has failed! Please try again later."
+msgstr "Uppdateringen misslyckades. VƤnligen fƶrsƶk igen senare."
+
+msgid "Downloading package..."
+msgstr "Laddar ned.."
+
+msgid "Removing current Jappix system files..."
+msgstr ""
+
+msgid "Extracting package..."
+msgstr ""
+
+msgid "Regenerating storage folder tree..."
+msgstr ""
+
+msgid "Jappix is now up to date!"
+msgstr "Jappix Ƥr nu uppdaterad!"
+
+msgid "Aborted: socket error!"
+msgstr ""
+
+msgid "Aborted: buffer error!"
+msgstr ""
+
+msgid "Aborted: everything is not writable!"
+msgstr ""
+
+msgid "Aborted: could not extract the package!"
+msgstr ""
+
+msgid "Visits"
+msgstr "Besƶk"
+
+msgid "Daily"
+msgstr "Dagligen"
+
+msgid "Weekly"
+msgstr "Veckovis"
+
+msgid "Monthly"
+msgstr "MĆ„natligen"
+
+msgid "Yearly"
+msgstr "Ć
rsvis"
+
+msgid "Size"
+msgstr "Storlek"
+
+msgid "Clean everything"
+msgstr "Rensa allt"
+
+msgid "Purge cache"
+msgstr "Rensa cache"
+
+msgid "Purge logs"
+msgstr "Rensa loggar"
+
+msgid "Purge updates"
+msgstr "Rensa uppdateringar"
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr ""
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr ""
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr ""
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr ""
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr ""
+
+msgid "Title"
+msgstr "Titel"
+
+msgid "Artist"
+msgstr "Artist"
+
+msgid "Album"
+msgstr "Album"
+
+msgid "File"
+msgstr "Fil"
+
+msgid "Upload"
+msgstr "Ladda upp"
+
+msgid "The folder is empty."
+msgstr "Mappen Ƥr tom."
+
+msgid "The music could not be received, please retry!"
+msgstr ""
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr ""
+
+msgid "Your music has been added!"
+msgstr ""
+
+msgid "The selected elements have been removed."
+msgstr ""
+
+msgid "You must select elements to remove!"
+msgstr ""
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr ""
+
+msgid "Manage"
+msgstr "Hantera"
+
+msgid "List"
+msgstr "Lista"
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr ""
+
+msgid "The user has been added!"
+msgstr "AnvƤndaren har lagts till!"
+
+msgid "The chosen users have been removed."
+msgstr "De valda anvƤndarna har tagits bort."
+
+msgid "You must select one or more users to be removed!"
+msgstr "VƤlj en eller flera anvƤndare som ska tas bort!"
+
+msgid "Yesterday"
+msgstr "IgƄr"
+
+msgid "%s days ago"
+msgstr "%s dagar sedan"
+
+msgid "User currently active"
+msgstr ""
+
+msgid "Last seen: %s"
+msgstr ""
+
+msgid "Inactive since: %s"
+msgstr ""
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr ""
+
+msgid "Static content server"
+msgstr ""
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Suggested friends"
+msgstr ""
+
+msgid "Check all"
+msgstr "Markera alla"
+
+msgid "Uncheck all"
+msgstr "Avmarkera alla"
+
+msgid "Choose"
+msgstr "VƤlj"
+
+msgid "List name"
+msgstr ""
+
+msgid "Allow"
+msgstr "TillƄt"
+
+msgid "Deny"
+msgstr "Fƶrbjud"
+
+msgid "Group"
+msgstr "Grupp"
+
+msgid "Subscription"
+msgstr "Prenumeration"
+
+msgid "Both"
+msgstr "BĆ„da"
+
+msgid "From"
+msgstr "FrƄn"
+
+msgid "Everybody"
+msgstr "Alla"
+
+msgid "Send messages"
+msgstr "Skicka meddelanden"
+
+msgid "Send queries"
+msgstr "Skicka frƄgor"
+
+msgid "See my status"
+msgstr "Se min status"
+
+msgid "Send his/her status"
+msgstr "Skicka hans/hennes status"
+
+msgid "Everything"
+msgstr "Allt"
+
+msgid "Item"
+msgstr ""
+
+msgid "Order"
+msgstr "Ordning"
+
+msgid "Active for this session"
+msgstr "Aktiv fƶr denna session"
+
+msgid "Always active"
+msgstr "Alltid aktiv"
+
+msgid "User directory"
+msgstr "Deltagarkatalog"
+
+msgid "Search a friend"
+msgstr "Sƶk en vƤn"
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr ""
+
+msgid "This is a repeat from %s"
+msgstr ""
+
+msgid "Loading comments..."
+msgstr "Laddar kommentarer..."
+
+msgid "Type your comment here..."
+msgstr "Skriv hƤr..."
+
+msgid "Could not get the comments!"
+msgstr "Kunde ej hƤmta kommentarer!"
+
+msgid "Show comments"
+msgstr "Visa kommentarer"
+
+msgid "Send him/her a message"
+msgstr "Skicka honom/henne ett meddelande"
+
+msgid "Start a chat with him/her"
+msgstr "Ćppna en chatt med honom/henne"
+
+msgid "Media integration"
+msgstr ""
+
+msgid "Comments locked!"
+msgstr ""
+
+msgid "Type something you want to share with your friends..."
+msgstr ""
+
+msgid "changed his/her nickname to %s"
+msgstr ""
+
+msgid "commented an item you follow: ā%sā."
+msgstr ""
+
+msgid "Hide"
+msgstr ""
+
+msgid "liked your post: ā%sā."
+msgstr ""
+
+msgid "quoted you somewhere: ā%sā."
+msgstr ""
+
+msgid "published on your wall: ā%sā."
+msgstr ""
+
+msgid "tagged you in a photo (%s)."
+msgstr ""
+
+msgid "tagged you in a video (%s)."
+msgstr ""
+
+msgid "Show"
+msgstr "Visa"
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr ""
+
+msgid "Pubsub host"
+msgstr "VƤrd fƶr pubsub"
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr ""
+
+msgid "Manager link"
+msgstr ""
+
+msgid "User uploads server"
+msgstr ""
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Logo"
+msgstr "Logotyp"
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr ""
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr ""
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr "Detta Ƥr ej en giltig bild. VƤnligen anvƤnd bildformatet PNG."
+
+msgid "Your service logo has been successfully changed!"
+msgstr ""
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr "Bildformatet fƶr logotypen mƄste vara PNG. Om nƄgot fƤlt lƤmnas tomt kommer loggan ej att Ƥndras."
+
+msgid "Remove this logo"
+msgstr "Ta bort denna logotyp."
+
+msgid "View this logo"
+msgstr "Se denna logotyp"
+
+msgid "Send a file"
+msgstr ""
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr ""
+
+msgid "Groupchats to join"
+msgstr ""
+
+msgid "Purge sent files"
+msgstr ""
+
+msgid "would like to send you a file: ā%sā."
+msgstr ""
+
+msgid "has accepted to received your file: ā%sā."
+msgstr ""
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr ""
+
+msgid "could not receive your file: ā%sā."
+msgstr "kunde ej ta emot din fil ā%sā."
+
+msgid "has received a file exchange request: ā%sā."
+msgstr ""
+
+msgid "Available shortcuts:"
+msgstr "TillgƤngliga genvƤgar:"
+
+msgid "%s removes the chat logs"
+msgstr "%s tar bort chattloggar"
+
+msgid "%s joins a groupchat"
+msgstr "%s gƄr med i en gruppchatt"
+
+msgid "%s closes the chat"
+msgstr "%s stƤnger chatten"
+
+msgid "%s shows the user profile"
+msgstr "%s visar anvƤndarprofil"
+
+msgid "%s sends a message to the room"
+msgstr "%s skickar ett meddelande till (alla i) rummet"
+
+msgid "%s changes your nickname"
+msgstr "%s Ƥndrar ditt chattnamn"
+
+msgid "%s sends a message to someone in the room"
+msgstr "%s skickar ett meddelande till nƄgon i rummet"
+
+msgid "%s changes the room topic"
+msgstr "%s Ƥndrar rummets Ƥmnestext"
+
+msgid "%s kicks an user of the room"
+msgstr "%s sparkar ut en anvƤndare frƄn rummet"
+
+msgid "%s bans an user of the room"
+msgstr "%s utesluter en anvƤndare frƄn rummet"
+
+msgid "%s invites someone to join the room"
+msgstr "%s bjuder in nƄgon att gƄ med i rummet"
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr ""
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# Ukrainian translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:25+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "Š£ Š²Š°ŃŠ¾Š¼Ń Š±ŃŠ°ŃŠ·ŠµŃŃ Š½Šµ Š°ŠŗŃŠøŠ²Š¾Š²Š°Š½Š¾ Š²ŠøŠŗŠ¾Š½Š°Š½Š½Ń JavaScript, ŃŠ¾Š¼Ń ŠŠø Š½Šµ Š·Š¼Š¾Š¶ŠµŃŠµ Š²ŠøŠŗŠ¾ŃŠøŃŃŠ¾Š²ŃŠ²Š°ŃŠø Jappix. ŠŃŠ“Ń Š»Š°ŃŠŗŠ°, Š°ŠŗŃŠøŠ²ŃŠ¹ŃŠµ Š²ŠøŠŗŠ¾Š½Š°Š½Š½Ń JavaScript."
+
+msgid "An open social network"
+msgstr "ŠŃŠ“ŠŗŃŠøŃŠ° ŃŠ¾ŃŃŠ°Š»ŃŠ½Š° Š¼ŠµŃŠµŠ¶Š°"
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "Š Š¾Š±Š¾ŃŠ° Jappix Š±ŃŠ»Š° ŠæŠµŃŠµŃŠ²Š°Š½Š° ŃŠµŃŠµŠ· ŠæŃŠ¾Š±Š»ŠµŠ¼Šø Š·Ń Š·Š²'ŃŠ·ŠŗŠ¾Š¼, ŠæŠ¾Š¼ŠøŠ»ŠŗŃ ŃŠø Š½ŠµŠ²ŃŃŠ½Ń Š“Š°Š½Ń ŠŗŠ¾ŃŠøŃŃŃŠ²Š°ŃŠ° (ŠæŠµŃŠµŠ²ŃŃŃŠµ Š»Š¾Š³ŃŠ½ ŃŠ° ŠæŠ°ŃŠ¾Š»Ń), ŠæŃŠ¾ŃŠøŠ¼Š¾ Š²ŠøŠ±Š°ŃŠµŠ½Š½Ń Š·Š° Š½ŠµŠ·ŃŃŃŠ½Š¾ŃŃŃ."
+
+msgid "The element list on this server could not be obtained!"
+msgstr ""
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "ŠŠ°Ń ŠæŠ°ŃŠ¾Š»Ń Š±ŃŠ»Š¾ Š·Š¼ŃŠ½ŠµŠ½Š¾, ŃŠµŠæŠµŃ ŠŠø Š¼Š¾Š¶ŠµŃŠµ ŃŠ²ŃŠ¹ŃŠø, Š²ŠøŠŗŠ¾ŃŠøŃŃŠ¾Š²ŃŃŃŠø Š½Š¾Š²ŠøŠ¹ ŠæŠ°ŃŠ¾Š»Ń."
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "ŠŠ°Ń Š°ŠŗŠ°ŃŠ½Ń Š±ŃŠ»Š¾ Š²ŠøŠ“Š°Š»ŠµŠ½Š¾."
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr ""
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "ŠŃŠ¼Š½Š°ŃŠø, Š“Š¾ ŃŠŗŠ¾Ń Š²Šø ŠæŃŠøŃŠ“Š½Š°Š»ŠøŃŃ, Š½Šµ ŃŃŠ½ŃŃ. ŠŠø ŠæŠ¾Š²ŠøŠ½Š½Ń ŃŃŠ²Š¾ŃŠøŃŠø ŃŃ."
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr ""
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "ŠŠ¾ŃŠøŃŃŃŠ²Š°Ń, Š· ŃŠŗŠøŠ¼ ŠŠø Š½Š°Š¼Š°Š³Š°ŃŃŠµŃŃ Š·Š²āŃŠ·Š°ŃŠøŃŃ, Š²ŃŠ“ŃŃŃŠ½ŃŠ¹ Ń ŠŗŃŠ¼Š½Š°ŃŃ."
+
+msgid "Please enter the group chat address to join."
+msgstr "ŠŃŠ“ŃŠ»Š°ŃŠŗŠ° Š²Š²ŠµŠ“ŃŃŃ Š°Š“ŃŠµŃŃ ŃŠ°ŃŃ."
+
+msgid "Please enter your nickname to join %s."
+msgstr "ŠŃŠ“Ń Š»Š°ŃŠŗŠ°, Š²Š²ŠµŠ“ŃŃŃ Š²Š°Ń ŠæŃŠµŠ²Š“Š¾Š½ŃŠ¼ ŃŠ¾Š± ŠæŃŠøŃŠ“Š½Š°ŃŠøŃŃ Š“Š¾ %s."
+
+msgid "This room (%s) is protected with a password."
+msgstr "ŠŃŠ¼Š½Š°ŃŠ° %s Š·Š°Ń
ŠøŃŠµŠ½Š° ŠæŠ°ŃŠ¾Š»ŠµŠ¼."
+
+msgid "Your browser is out of date!"
+msgstr "ŠŠ°Ń Š±ŃŠ°ŃŠ·ŠµŃ Š·Š°ŃŃŠ°ŃŃŠ²!"
+
+msgid "Last %s version is better!"
+msgstr ""
+
+msgid "Login"
+msgstr "ŠŃ
ŃŠ“"
+
+msgid "Register"
+msgstr "Š ŠµŃŃŃŃŠ°ŃŃŃ"
+
+msgid "Here we go!"
+msgstr "ŠŠ¾ŃŃ
Š°Š»Šø!"
+
+msgid "Server"
+msgstr "Š”ŠµŃŠ²ŠµŃ"
+
+msgid "Password"
+msgstr "ŠŠ°ŃŠ¾Š»Ń"
+
+msgid "Remember me"
+msgstr "ŠŠ°ŠæŠ°Š¼āŃŃŠ°ŃŠø Š¼ŠµŠ½Šµ"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "Š¦ŠµŠ¹ ŃŠ½ŃŃŃŃŠ¼ŠµŠ½Ń Š±ŃŠ² Š²ŠøŠ¼ŠŗŠ½ŠµŠ½ŠøŠ¹, Š²Šø Š½Šµ Š¼Š¾Š¶ŠµŃŠµ Š²ŠøŠŗŠ¾ŃŠøŃŃŠ¾Š²ŃŠ²Š°ŃŠø Š¹Š¾Š³Š¾!"
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "ŠŠ°Ń Š±ŃŠ»Š¾ Š²ŃŠ“āŃŠ“Š½Š°Š½Š¾ ŃŠµŃŠµŠ· ŠæŃŠ¾Š±Š»ŠµŠ¼Šø Š· Š¼ŠµŃŠµŠ¶ŠµŃ. Š©Š¾ ŠŠø Ń
Š¾ŃŠµŃŠµ Š·ŃŠ¾Š±ŠøŃŠø ŃŠµŠæŠµŃ?"
+
+msgid "Reconnect"
+msgstr "ŠŠµŃŠµŠæŃŠ“ŠŗŠ»ŃŃŠøŃŠøŃŃ"
+
+msgid "Messages"
+msgstr "ŠŠ¾Š²ŃŠ“Š¾Š¼Š»ŠµŠ½Š½Ń"
+
+msgid "Profile"
+msgstr "ŠŃŠ¾ŃŃŠ»Ń"
+
+msgid "Options"
+msgstr "ŠŠ°Š»Š°ŃŃŃŠ²Š°Š½Š½Ń"
+
+msgid "Disconnect"
+msgstr "ŠŃŠ“āŃŠ“Š½Š°ŃŠøŃŃ"
+
+msgid "Filter"
+msgstr "Š¤ŃŠ»ŃŃŃ"
+
+msgid "Add a friend"
+msgstr "ŠŠ¾Š“Š°ŃŠø Š“ŃŃŠ³Š°"
+
+msgid "Your groupchats"
+msgstr "ŠŠ°ŃŠ° ŠŗŠ¾Š½ŃŠµŃŠµŠ½ŃŃŃ"
+
+msgid "Manage your favorite groupchats"
+msgstr "ŠŠµŃŃŠ²Š°Š½Š½Ń Š²Š°ŃŠøŠ¼Šø ŃŠ»ŃŠ±Š»ŠµŠ½ŠøŠ¼Šø ŠŗŠ¾Š½ŃŠµŃŠµŠ½ŃŃŃŠ¼Šø"
+
+msgid "More stuff"
+msgstr "ŠŃŠ»ŃŃŠµ "
+
+msgid "Show all friends"
+msgstr "ŠŠ¾ŠŗŠ°Š·ŃŠ²Š°ŃŠø Š²ŃŃŃ
Š“ŃŃŠ·ŃŠ²"
+
+msgid "Only show connected friends"
+msgstr "ŠŠ¾ŠŗŠ°Š·ŃŠ²Š°ŃŠø ŃŃŠ»ŃŠŗŠø ŠæŃŠ“āŃŠ“Š½Š°Š½ŠøŃ
Š“ŃŃŠ·ŃŠ²"
+
+msgid "Message archives"
+msgstr "ŠŃŃ
ŃŠ² ŠæŠ¾Š²ŃŠ“Š¾Š¼Š»ŠµŠ½Ń"
+
+msgid "Date"
+msgstr "ŠŠ°ŃŠ°"
+
+msgid "Please select a friend to view the chat history."
+msgstr "ŠŃŠ“Ń Š»Š°ŃŠŗŠ°, Š²ŠøŠ±ŠµŃŃŃŃ Š“ŃŃŠ³Š° Š“Š»Ń ŠæŠµŃŠµŠ³Š»ŃŠ“Ń ŃŃŃŠ¾ŃŃŃ ŠæŠµŃŠµŠæŠøŃŠŗŠø."
+
+msgid "Nothing found for: %s"
+msgstr "ŠŃŃŠ¾Š³Š¾ Š½Šµ Š·Š½Š°Š¹Š“ŠµŠ½Š¾ ŠæŃŠ¾ %s"
+
+msgid "A short message?"
+msgstr "ŠŠ¾ŃŠ¾ŃŠŗŠµ ŠæŠ¾Š²ŃŠ“Š¾Š¼Š»ŠµŠ½Š½Ń?"
+
+msgid "How are you?"
+msgstr "ŠÆŠŗ ŃŠø?"
+
+msgid "What are you doing?"
+msgstr "Š©Š¾ ŃŠø ŃŠ¾Š±ŠøŃ?"
+
+msgid "Join a chat"
+msgstr "ŠŃŠøŃŠ“Š½Š°ŃŠøŃŃ Š“Š¾ ŃŠ°ŃŃ"
+
+msgid "Status"
+msgstr "Š”ŃŠ°ŃŃŃ"
+
+msgid "Available"
+msgstr "ŠŠ¾ŃŃŃŠæŠ½ŠøŠ¹"
+
+msgid "Talkative"
+msgstr "ŠŠ¾Š²ŃŃŠŗŠøŠ¹"
+
+msgid "Away"
+msgstr "ŠŃŠ“ŃŠ¹ŃŠ¾Š²"
+
+msgid "Not available"
+msgstr "ŠŠµ Š“Š¾ŃŃŃŠæŠ½ŠøŠ¹"
+
+msgid "Busy"
+msgstr "ŠŠ°Š¹Š½ŃŃŠøŠ¹"
+
+msgid "Mood"
+msgstr "ŠŠ°ŃŃŃŃŠ¹"
+
+msgid "None"
+msgstr "ŠŠµŠ¼Š°"
+
+msgid "Crazy"
+msgstr "ŠŠ¾Š¶ŠµŠ²ŃŠ»ŃŠ½ŠøŠ¹"
+
+msgid "Excited"
+msgstr "ŠŠ°ŃŃŠŗŠ°Š²Š»ŠµŠ½ŠøŠ¹"
+
+msgid "Playful"
+msgstr "ŠŃŠ°Š¹Š»ŠøŠ²ŠøŠ¹"
+
+msgid "Happy"
+msgstr "ŠŠµŃŠµŠ»ŠøŠ¹"
+
+msgid "Shocked"
+msgstr "ŠØŠ¾ŠŗŠ¾Š²Š°Š½ŠøŠ¹"
+
+msgid "Hot"
+msgstr "ŠŠ°ŃŃŃŠøŠ¹"
+
+msgid "Sad"
+msgstr "Š”ŃŠ¼Š½ŠøŠ¹"
+
+msgid "Amorous"
+msgstr "ŠŠ°ŠŗŠ¾Ń
Š°Š½ŠøŠ¹"
+
+msgid "Confident"
+msgstr "ŠŠæŠµŠ²Š½ŠµŠ½ŠøŠ¹"
+
+msgid "Activity"
+msgstr "ŠŃŃŠ»ŃŠ½ŃŃŃŃ"
+
+msgid "Chores"
+msgstr "ŠŠ¾ŃŠæŠ¾Š“Š°ŃŃŃŠŗŃ ŃŠ¾Š±Š¾ŃŠø"
+
+msgid "Drinking"
+msgstr "Š'Ń"
+
+msgid "Eating"
+msgstr "ŠŠ¼"
+
+msgid "Exercising"
+msgstr "ŠŠøŠŗŠ¾Š½ŃŃ Š²ŠæŃŠ°Š²Šø"
+
+msgid "Grooming"
+msgstr "Š§ŠµŠæŃŃŃŃŃ"
+
+msgid "Appointment"
+msgstr ""
+
+msgid "Inactive"
+msgstr "ŠŠµŠ°ŠŗŃŠøŠ²Š½ŠøŠ¹"
+
+msgid "Relaxing"
+msgstr "ŠŃŠ“ŠæŠ¾ŃŠøŠ²Š°Ń"
+
+msgid "Talking"
+msgstr "Š Š¾Š·Š¼Š¾Š²Š»ŃŃ"
+
+msgid "Traveling"
+msgstr "ŠŠ¾Š“Š¾ŃŠ¾Š¶ŃŃ"
+
+msgid "Working"
+msgstr "ŠŃŠ°ŃŃŃ"
+
+msgid "View profile"
+msgstr "ŠŠ¾ŠŗŠ°Š·Š°ŃŠø ŠæŃŠ¾ŃŃŠ»Ń"
+
+msgid "Repeat this notice"
+msgstr "ŠŠ¾Š²ŃŠ¾ŃŠøŃŠø Š½Š°Š³Š°Š“ŃŠ²Š°Š½Š½Ń"
+
+msgid "Remove this notice"
+msgstr "ŠŠøŠ“Š°Š»ŠøŃŠø Š½Š°Š³Š°Š“ŃŠ²Š°Š½Š½Ń"
+
+msgid "Your profile"
+msgstr "Š¢Š²ŃŠ¹ ŠæŃŠ¾ŃŃŠ»Ń"
+
+msgid "Identity"
+msgstr ""
+
+msgid "Profile image"
+msgstr "ŠŠ²Š°ŃŠ°Ń"
+
+msgid "Others"
+msgstr "ŠŠ½ŃŃ"
+
+msgid "Personal"
+msgstr "ŠŠµŃŃŠ¾Š½Š°Š»ŃŠ½Ń Š“Š°Š½Ń"
+
+msgid "Complete name"
+msgstr "ŠŠ¾Š²Š½Šµ ŃŠ¼'Ń"
+
+msgid "Nickname"
+msgstr "ŠŃŠµŠ²Š“Š¾Š½ŃŠ¼"
+
+msgid "First name"
+msgstr "ŠŠ¼'Ń"
+
+msgid "Last name"
+msgstr "ŠŃŃŠ·Š²ŠøŃŠµ"
+
+msgid "Date of birth"
+msgstr "ŠŠ°ŃŠ° Š½Š°ŃŠ¾Š“Š¶ŠµŠ½Š½Ń"
+
+msgid "Contact"
+msgstr "ŠŠ¾Š½ŃŠ°ŠŗŃ"
+
+msgid "E-mail"
+msgstr ""
+
+msgid "Phone"
+msgstr "Š¢ŠµŠ»ŠµŃŠ¾Š½"
+
+msgid "Website"
+msgstr "ŠŠµŠ± ŃŠ°Š¹Ń"
+
+msgid "Current"
+msgstr "ŠŠ¾ŃŠ¾ŃŠ½Ń"
+
+msgid "Delete"
+msgstr "ŠŠøŠ“Š°Š»ŠøŃŠø"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "ŠŠø Š½Šµ Š²ŠŗŠ°Š·Š°Š»Šø Š°Š²Š°ŃŠ°Ń Š² Š²Š°ŃŠ¾Š¼Ń ŠæŃŠ¾ŃŃŠ»Ń."
+
+msgid "Address"
+msgstr "ŠŠ“ŃŠµŃŠ°"
+
+msgid "Street"
+msgstr "ŠŃŠ»ŠøŃŃ"
+
+msgid "City"
+msgstr "ŠŃŃŃŠ¾"
+
+msgid "Postal code"
+msgstr "ŠŠ½Š“ŠµŠŗŃ"
+
+msgid "Country"
+msgstr "ŠŃŠ°ŃŠ½Š°"
+
+msgid "Biography"
+msgstr "ŠŃŠ¾Š³ŃŠ°ŃŃŃ"
+
+msgid "Important notice"
+msgstr "ŠŠ°Š¶Š»ŠøŠ²Ń Š½Š°Š³Š°Š“ŃŠ²Š°Š½Š½Ń"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr "ŠŃŠ“ŃŃŠµ Š¾Š±ŠµŃŠµŠ¶Š½Ń, ŃŠ½ŃŠ¾ŃŠ¼Š°ŃŃŃ Š² Š²Š°ŃŠ¾Š¼Ń ŠæŃŠ¾ŃŃŠ»Ń Š“Š¾ŃŃŃŠæŠ½Š° Š²ŃŃŠ¼."
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr "ŠŠµ Š²ŃŃ ŃŠ½ŃŠ¾ŃŠ¼Š°ŃŃŃ ŠæŃŠøŠ²Š°ŃŠ½Š° Š² XMPP; ŠŠ°Ń ŠæŃŠ¾ŃŃŠ»Ń - Š¾Š“Š½Š° Š· ŃŠøŃ
ŃŠµŃŠµŠ¹."
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr ""
+
+msgid "Save"
+msgstr "ŠŠ±ŠµŃŠµŠ³ŃŠø"
+
+msgid "Cancel"
+msgstr "ŠŃŠ“Š¼ŃŠ½ŠøŃŠø"
+
+msgid "Edit options"
+msgstr "Š ŠµŠ“Š°Š³ŃŠ²Š°ŃŠø Š½Š°Š»Š°ŃŃŃŠ²Š°Š½Š½Ń"
+
+msgid "Channel"
+msgstr "ŠŠ°Š½Š°Š»"
+
+msgid "Commands"
+msgstr ""
+
+msgid "Sounds"
+msgstr "ŠŃŠ·ŠøŠŗŠ°"
+
+msgid "Privacy"
+msgstr "ŠŃŠøŠ²Š°ŃŠ½ŃŃŃŃ"
+
+msgid "Message archiving"
+msgstr "ŠŃŃ
ŃŠ² ŠæŠ¾Š²ŃŠ“Š¾Š¼Š»ŠµŠ½Ń"
+
+msgid "Store a history of your chats"
+msgstr "Š·Š±ŠµŃŃŠ³Š°ŃŠø ŃŃŃŠ¾ŃŃŃ Š²Š°ŃŠøŃ
ŃŠ¾Š·Š¼Š¾Š²"
+
+msgid "Geolocation"
+msgstr "ŠŠµŠ¾Š³ŃŠ°ŃŃŃŠ½Šµ ŠæŠ¾Š»Š¾Š¶ŠµŠ½Š½Ń"
+
+msgid "Empty"
+msgstr "ŠŠ¾ŃŠ¾Š¶Š½ŃŠ¹"
+
+msgid "Empty channel"
+msgstr "ŠŠ¾ŃŠ¾Š¶Š½ŃŠ¹ ŠŗŠ°Š½Š°Š»"
+
+msgid "Persistent"
+msgstr "ŠŠ°ŠæŠ¾Š»ŠµŠ³Š»ŠøŠ²ŠøŠ¹"
+
+msgid "Maximum notices"
+msgstr "ŠŠ°ŠŗŃŠøŠ¼Š°Š»ŃŠ½Š° ŠŗŃŠ»ŃŠŗŃŃŃŃ Š½Š°Š³Š°Š“ŃŠ²Š°Š½Ń"
+
+msgid "Account"
+msgstr "ŠŠŗŠ°ŃŠ½Ń"
+
+msgid "Change password"
+msgstr "ŠŠ¼ŃŠ½ŠøŃŠø ŠæŠ°ŃŠ¾Š»Ń"
+
+msgid "Delete account"
+msgstr "ŠŠøŠ“Š°Š»ŠøŃŠø Š°ŠŗŠ°ŃŠ½Ń"
+
+msgid "Old"
+msgstr "Š”ŃŠ°ŃŠøŠ¹"
+
+msgid "New (2 times)"
+msgstr "ŠŠ¾Š²ŠøŠ¹ (2 ŃŠ°Š·Šø)"
+
+msgid "Continue"
+msgstr "ŠŃŠ¾Š“Š¾Š²Š¶ŠøŃŠø"
+
+msgid "To"
+msgstr "ŠŠ¾"
+
+msgid "Close"
+msgstr "ŠŠ°ŃŠøŠ½ŠøŃŠø"
+
+msgid "unknown"
+msgstr "Š½ŠµŠ²ŃŠ“Š¾Š¼ŠøŠ¹"
+
+msgid "Unavailable"
+msgstr "ŠŠµ Š“Š¾ŃŃŃŠæŠ½ŠøŠ¹"
+
+msgid "is now"
+msgstr "Š Š“Š°Š½ŠøŠ¹ ŃŠ°Ń"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr ""
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "ŠŃŃ Š²Š¾Š½ŃŠ½! ŠŠ¾Š²ŠøŠ¹ ŠŗŃŠ°ŃŠøŠ²ŠøŠ¹ Š°Š²Š°ŃŠ°Ń!"
+
+msgid "The image file is not supported or has a bad size."
+msgstr "Š¤Š°Š¹Š» Š·Š¾Š±ŃŠ°Š¶ŠµŠ½Š½Ń Š½Šµ ŠæŃŠ“ŃŃŠøŠ¼ŃŃŃŃŃŃ, Š°Š±Š¾ Š¼Š°Ń Š½ŠµŠæŃŠ°Š²ŠøŠ»ŃŠ½ŠøŠ¹ ŃŠ¾Š·Š¼ŃŃ."
+
+msgid "Reply"
+msgstr "ŠŃŠ“ŠæŠ¾Š²ŃŃŃŠø"
+
+msgid "Error"
+msgstr "ŠŠ¾Š¼ŠøŠ»ŠŗŠ°"
+
+msgid "Click here to solve the error"
+msgstr ""
+
+msgid "You"
+msgstr "Š¢Šø"
+
+msgid "Remove"
+msgstr "ŠŠøŠ“Š°Š»ŠøŃŠø"
+
+msgid "Rename"
+msgstr "ŠŠµŃŠµŠ¹Š¼ŠµŠ½ŃŠ²Š°ŃŠø"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "ŠŃŠøŠ²ŃŃ Ń %s, Ń
Š¾ŃŃ Š“Š¾Š“Š°ŃŠø ŃŠµŠ±Šµ Š“Š¾ ŃŠæŠøŃŠŗŃ Š“ŃŃŠ·ŃŠ²."
+
+msgid "Smiley insertion"
+msgstr "ŠŃŃŠ°Š²ŠøŃŠø ŃŠ¼Š°Š¹Š»"
+
+msgid "Change style"
+msgstr "ŠŠ¼ŃŠ½ŠøŃŠø ŃŃŠøŠ»Ń"
+
+msgid "Text in bold"
+msgstr "Š¶ŠøŃŠ½ŠøŠ¹"
+
+msgid "Text in italic"
+msgstr "ŠŗŃŃŃŠøŠ²Š½ŠøŠ¹"
+
+msgid "Underlined text"
+msgstr "ŠæŃŠ“ŠŗŃŠµŃŠ»ŠµŠ½ŠøŠ¹"
+
+msgid "Save chat"
+msgstr "ŠŠ±ŠµŃŠµŠ³ŃŠø Š±ŠµŃŃŠ“Ń"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr ""
+
+msgid "This chat is empty!"
+msgstr "Š¦Ń Š±ŠµŃŃŠ“Š° ŠæŠ¾ŃŠ¾Š¶Š½Ń!"
+
+msgid "Generate file!"
+msgstr "Š”ŃŠ²Š¾ŃŠøŃŠø ŃŠ°Š¹Š»!"
+
+msgid "Download file!"
+msgstr "ŠŠ°Š²Š°Š½ŃŠ°Š¶ŠøŃŠø ŃŠ°Š¹Š»!"
+
+msgid "Clean current chat"
+msgstr "ŠŃŠøŃŃŠøŃŠø Š±ŠµŃŃŠ“Ń"
+
+msgid "View chat history"
+msgstr ""
+
+msgid "Show user profile"
+msgstr "ŠŠ¾ŠŗŠ°Š·Š°ŃŠø ŠæŃŠ¾ŃŃŠ»Ń ŠŗŠ¾ŃŠøŃŃŃŠ²Š°ŃŠ°"
+
+msgid "Add this contact to your friends"
+msgstr "ŠŠ¾Š“Š°ŃŠø ŃŠµŠ¹ ŠŗŠ¾Š½ŃŠ°ŠŗŃ Š² Š“ŃŃŠ·Ń"
+
+msgid "Add this groupchat to your favorites"
+msgstr "ŠŠ¾Š“Š°ŃŠø ŠŗŠ¾Š½ŃŠµŃŠµŠ½ŃŃŃ Š² ŃŠ»ŃŠ±Š»ŠµŠ½Ń"
+
+msgid "All tabs"
+msgstr "ŠŃŃ Š²ŠŗŠ»Š°Š“ŠŗŠø"
+
+msgid "Close this tab"
+msgstr "ŠŠ°ŠŗŃŠøŃŠø ŃŃ Š²ŠŗŠ»Š°Š“ŠŗŃ"
+
+msgid "no subject defined for this room."
+msgstr "ŠŠµ Š²ŠŗŠ°Š·Š°Š½Š° ŃŠµŠ¼Š° Š“Š»Ń ŠŗŃŠ¼Š½Š°ŃŠø."
+
+msgid "Administration panel for this room"
+msgstr "ŠŠ°Š½ŠµŠ»Ń Š°Š“Š¼ŃŠ½ŃŃŃŃŃŠ²Š°Š½Š½Ń Š“Š»Ń ŠŗŃŠ¼Š½Š°ŃŠø"
+
+msgid "Moderators"
+msgstr "ŠŠ¾Š“ŠµŃŠ°ŃŠ¾ŃŠø"
+
+msgid "Participants"
+msgstr "Š£ŃŠ°ŃŠ½ŠøŠŗŠø"
+
+msgid "Visitors"
+msgstr "ŠŃŠ“Š²ŃŠ“ŃŠ²Š°ŃŃ"
+
+msgid "Manage favorite rooms"
+msgstr "ŠŠµŃŃŠ²Š°Š½Š½Ń ŃŠ»ŃŠ±Š»ŠµŠ½ŠøŠ¼Šø ŠŗŃŠ¼Š½Š°ŃŠ°Š¼Šø"
+
+msgid "Change favorites"
+msgstr "ŠŠ¼ŃŠ½ŠøŃŠø ŃŠ»ŃŠ±Š»ŠµŠ½Ń"
+
+msgid "Search a room"
+msgstr "ŠŠ¾ŃŃŠŗ ŠŗŃŠ¼Š½Š°Ń"
+
+msgid "Select a favorite"
+msgstr "ŠŠ±ŠµŃŃŃŃ ŃŠ»ŃŠ±Š»ŠµŠ½Ń"
+
+msgid "Getting the name..."
+msgstr "ŠŃŃŠøŠ¼Š°Š½Š½Ń ŃŠ¼ŠµŠ½Ń"
+
+msgid "Gateway"
+msgstr "ŠŠ°ŃŃŃŃŃŠøŠ·Š°ŃŠ¾Ń"
+
+msgid "Name"
+msgstr "ŠŠ¼'Ń"
+
+msgid "Room"
+msgstr "ŠŃŠ¼Š½Š°ŃŠ°"
+
+msgid "Add"
+msgstr "ŠŠ¾Š“Š°ŃŠø"
+
+msgid "Edit"
+msgstr "Š ŠµŠ“Š°Š³ŃŠ²Š°ŃŠø"
+
+msgid "Search a room on"
+msgstr "ŠŠ¾ŃŃŠŗ ŠŗŃŠ¼Š½Š°ŃŠø Š½Š°"
+
+msgid "No room found on this server."
+msgstr "ŠŠµ Š·Š½Š°Š¹Š“ŠµŠ½Š¾ ŠŗŃŠ¼Š½Š°Ń Š½Š° ŃŃŠ¾Š¼Ń ŃŠµŃŠ²ŠµŃŃ."
+
+msgid "Service discovery"
+msgstr "ŠŠ¾ŃŃŠŗ ŃŠµŃŠ²ŃŃŃŠ²"
+
+msgid "Server to query"
+msgstr "Š·Š°ŠæŠøŃ Š½Š° ŃŠµŃŠ²ŠµŃ"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr ""
+
+msgid "Accounts"
+msgstr "ŠŠŗŠ°ŃŠ½ŃŠø"
+
+msgid "Authentications"
+msgstr "ŠŠ²ŃŠµŠ½ŃŠøŃŃŠŗŠ°ŃŃŃ"
+
+msgid "Automation"
+msgstr "ŠŠ²ŃŠ¾Š¼Š°ŃŠøŠ·Š°ŃŃŃ"
+
+msgid "Clients"
+msgstr "ŠŠ»ŃŃŠ½ŃŠø"
+
+msgid "Collaboration"
+msgstr "Š”ŠæŃŠ²ŃŠ¾Š±ŃŃŠ½ŠøŃŃŠ²Š¾"
+
+msgid "Components"
+msgstr "ŠŠ¾Š¼ŠæŠ¾Š½ŠµŠ½ŃŠø"
+
+msgid "Rooms"
+msgstr "ŠŃŠ¼Š½Š°ŃŠø"
+
+msgid "Directories"
+msgstr "ŠŠøŃŠµŠŗŃŠ¾ŃŃŃ"
+
+msgid "Gateways"
+msgstr "ŠŠ°ŃŃŃŃŃŠøŠ·Š°ŃŠ¾ŃŠø"
+
+msgid "News"
+msgstr "ŠŠ¾Š²ŠøŠ½Šø"
+
+msgid "Hierarchy"
+msgstr "ŠŃŃŠ°ŃŃ
ŃŃ"
+
+msgid "Proxies"
+msgstr "ŠŃŠ¾ŠŗŃŃ"
+
+msgid "Publication/Subscription"
+msgstr "ŠŃŠ±Š»ŃŠŗŠ°ŃŃŃ / ŠŃŠ“ŠæŠøŃŠŗŠ°"
+
+msgid "Storage"
+msgstr ""
+
+msgid "Service offline or broken"
+msgstr "Š”ŠµŃŠ²ŃŃ Š½Šµ Š² Š¼ŠµŃŠµŠ¶Ń Š°Š±Š¾ Š·Š»Š°Š¼Š°Š½ŠøŠ¹"
+
+msgid "Your inbox"
+msgstr "ŠŃ
ŃŠ“Š½Ń"
+
+msgid "Available actions"
+msgstr "ŠŠ¾ŃŃŃŠæŠ½Ń Š“ŃŃ"
+
+msgid "Clean"
+msgstr "ŠŃŠøŃŃŠøŃŠø"
+
+msgid "New"
+msgstr "ŠŠ¾Š²Ń"
+
+msgid "Received"
+msgstr "ŠŃŃŠøŠ¼Š°Š½Ń"
+
+msgid "Subject"
+msgstr "Š¢ŠµŠ¼Š°"
+
+msgid "Content"
+msgstr "ŠŠ¼ŃŃŃ"
+
+msgid "Send message"
+msgstr "ŠŠ°Š“ŃŃŠ»Š°ŃŠø ŠæŠ¾Š²ŃŠ“Š¾Š¼Š»ŠµŠ½Š½Ń"
+
+msgid "Your inbox is empty."
+msgstr "ŠŠµŠ¼Š°Ń Š½Š¾Š²ŠøŃ
ŠæŠ¾Š²ŃŠ“Š¾Š¼Š»ŠµŠ½Ń"
+
+msgid "MUC administration"
+msgstr ""
+
+msgid "You administrate this room"
+msgstr "ŠŠø Š°Š“Š¼ŃŠ½ŃŃŃŃŃŃŃŠµ ŃŃ ŠŗŃŠ¼Š½Š°ŃŃ"
+
+msgid "Enter new subject"
+msgstr "ŠŠ²ŠµŠ“ŃŃŃ Š½Š¾Š²Ń ŃŠµŠ¼Ń"
+
+msgid "Configuration"
+msgstr "ŠŠ°Š»Š°ŃŃŃŠ²Š°Š½Š½Ń"
+
+msgid "Authorizations"
+msgstr "ŠŠ²ŃŠ¾ŃŠøŠ·Š°ŃŃŃ"
+
+msgid "Member list"
+msgstr "Š”ŠæŠøŃŠ¾Šŗ ŠŗŠ¾ŃŠøŃŃŃŠ²Š°ŃŃŠ²"
+
+msgid "Owner list"
+msgstr "Š”ŠæŠøŃŠ¾Šŗ Š²Š»Š°ŃŠ½ŠøŠŗŃŠ²"
+
+msgid "Administrator list"
+msgstr "Š”ŠæŠøŃŠ¾Šŗ Š°Š“Š¼ŃŠ½ŃŃŃŃŠ°ŃŠ¾ŃŃŠ²"
+
+msgid "Outcast list"
+msgstr ""
+
+msgid "Add an input"
+msgstr ""
+
+msgid "Destroy this MUC"
+msgstr "ŠŠ½ŠøŃŠøŃŠø ŠŗŠ¾Š½ŃŠµŃŠµŠ½ŃŃŃ"
+
+msgid "Yes, let's do it!"
+msgstr "Š¢Š°Šŗ!"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr "ŠŠ°Ń Š“ŃŃŠ³ Š·Š²ŠµŃŠ½ŃŠ² ŃŠ²Š°Š³Ń Š½Š° Š±ŠµŃŃŠ“Ń."
+
+msgid "Your friend is writing a message..."
+msgstr "ŠŠ°Ń Š“ŃŃŠ³ ŠæŠøŃŠµ ŠæŠ¾Š²ŃŠ“Š¾Š¼Š»ŠµŠ½Š½Ń..."
+
+msgid "Your friend stopped writing a message."
+msgstr "ŠŠ°Ń Š“ŃŃŠ³ ŠæŃŠøŠæŠøŠ½ŠøŠ² ŠæŠøŃŠ°ŃŠø ŠæŠ¾Š²ŃŠ“Š¾Š¼Š»ŠµŠ½Š½Ń."
+
+msgid "Your friend is doing something else."
+msgstr "ŠŠ°Ń Š“ŃŃŠ³ ŃŠ¾Š±ŠøŃŃ ŃŠ¾ŃŃ ŃŠ½ŃŠµ."
+
+msgid "Your friend closed the chat."
+msgstr "ŠŠ°Ń Š“ŃŃŠ³ Š·Š°ŠŗŃŠøŠ² ŃŠ°Ń."
+
+msgid "Requesting this service..."
+msgstr "ŠŠ°ŠæŠøŃ ŃŠµŃŠ²ŃŃŃ..."
+
+msgid "Loading"
+msgstr "ŠŠ°Š²Š°Š½ŃŠ°Š¶ŠµŠ½Š½Ń"
+
+msgid "joined the chat room"
+msgstr "ŃŠ²ŃŠ¹ŃŠ¾Š² Š“Š¾ ŠŗŃŠ¼Š½Š°ŃŠø"
+
+msgid "left the chat room"
+msgstr "Š²ŠøŠ¹ŃŠ¾Š² Š· ŠŗŃŠ¼Š½Š°ŃŠø"
+
+msgid "no status"
+msgstr "Š½ŠµŠ¼Š° ŃŃŠ°ŃŃŃŃ"
+
+msgid "has been kicked"
+msgstr "Š±ŃŠ»Š¾ Š²ŠøŠ³ŃŠ°Š½Š¾"
+
+msgid "has been banned"
+msgstr "Š±ŃŠ»Š¾ Š·Š°Š±Š°Š½ŠµŠ½Š¾"
+
+msgid "no reason"
+msgstr "Š½ŠµŠ¼Š° ŠæŃŠøŃŠøŠ½Šø"
+
+msgid "Communicate with the entire world!"
+msgstr ""
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr ""
+
+msgid "Hi there!"
+msgstr "ŠŃŠøŠ²ŃŃ!"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr ""
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr ""
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr ""
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr ""
+
+msgid "Previous"
+msgstr "ŠŠ¾ŠæŠµŃŠµŠ“Š½ŃŠ¹"
+
+msgid "General"
+msgstr "ŠŃŠ½Š¾Š²Š½Ń"
+
+msgid "Advanced"
+msgstr "Š Š¾Š·ŃŠøŃŠµŠ½Ń"
+
+msgid "Resource"
+msgstr "Š ŠµŃŃŃŃ"
+
+msgid "Priority"
+msgstr "ŠŃŠøŠ¾ŃŃŃŠµŃ"
+
+msgid "Low"
+msgstr "ŠŠøŠ·ŃŠŗŠøŠ¹"
+
+msgid "Medium"
+msgstr "Š”ŠµŃŠµŠ“Š½ŃŠ¹"
+
+msgid "High"
+msgstr "ŠŠøŃŠ¾ŠŗŠøŠ¹"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr ""
+
+msgid "login page"
+msgstr "Š”ŃŠ¾ŃŃŠ½ŠŗŠ° Š²Ń
Š¾Š“Ń"
+
+msgid "Share this link with your friends:"
+msgstr "ŠŠ¾Š“ŃŠ»ŠøŃŠøŃŃ ŃŠøŠ¼ ŠæŠ¾ŃŠøŠ»Š°Š½Š½ŃŠ¼ Š· Š“ŃŃŠ³Š¾Š¼."
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr ""
+
+msgid "Required"
+msgstr "ŠŠ¾ŃŃŠµŠ±ŃŃ"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr ""
+
+msgid "Manager"
+msgstr "ŠŠµŃŃŠ²Š½ŠøŠŗ"
+
+msgid "Project"
+msgstr "ŠŃŠ¾ŠµŠŗŃ"
+
+msgid "Encrypted"
+msgstr "ŠŠ°ŃŠøŃŃŠ¾Š²Š°Š½Š¾"
+
+msgid "Unencrypted"
+msgstr ""
+
+msgid "Where are you?"
+msgstr "ŠŠµ ŃŠø?"
+
+msgid "What's up with you?"
+msgstr "Š©Š¾ Š· ŃŠ¾Š±Š¾Ń?"
+
+msgid "Fetching the social channel..."
+msgstr "ŠŃŃŠøŠ¼Š°Š½Š½Ń ŃŠ¾ŃŃŠ°Š»ŃŠ½Š¾Š³Š¾ ŠŗŠ°Š½Š°Š»Ń..."
+
+msgid "You are synchronized with your network."
+msgstr "ŠŠø ŃŠøŠ½Ń
ŃŠ¾Š½ŃŠ·Š¾Š²Š°Š½Ń Š· Š²Š°ŃŠ¾Ń Š¼ŠµŃŠµŠ¶ŠµŃ."
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr "ŠŠµ Š¼Š¾Š¶Š½Š° Š½ŃŃŠ¾Š³Š¾ Š²ŃŠ“ŠæŃŠ°Š²ŠøŃŠø: Š²Šø Š¼Š¾Š¶ŠµŃŠµ ŃŃŠ»ŃŠŗŠø ŠæŃŠøŠ¹Š¼Š°ŃŠø ŠæŠ¾Š²ŃŠ“Š¾Š¼Š»ŠµŠ½Š½Ń!"
+
+msgid "Media viewer"
+msgstr ""
+
+msgid "Browse"
+msgstr "ŠŃŠ°ŃŠ·ŠµŃ"
+
+msgid "Command"
+msgstr "ŠŠ¾Š¼Š°Š½Š“Šø"
+
+msgid "Subscribe"
+msgstr "ŠŃŠ“ŠæŠøŃŠŗŠ°"
+
+msgid "Join"
+msgstr "ŠŃŠøŃŠ“Š½Š°ŃŠøŃŃ"
+
+msgid "Automatic"
+msgstr "ŠŠ²ŃŠ¾Š¼Š°ŃŠøŃŠ½Š¾"
+
+msgid "Search"
+msgstr "ŠŠ¾ŃŃŠŗ"
+
+msgid "No result!"
+msgstr "ŠŠµŠ¼Š° ŃŠµŠ·ŃŠ»ŃŃŠ°ŃŃŠ²!"
+
+msgid "No notifications."
+msgstr "ŠŠµŠ¼Š° Š½Š°Š³Š°Š“ŃŠ²Š°Š½Ń."
+
+msgid "would like to add you as a friend."
+msgstr "Ń
Š¾ŃŠµ Š“Š¾Š“Š°ŃŠø Š²Š°Ń ŃŠŗ Š“ŃŃŠ³Š°."
+
+msgid "would like you to join this chatroom:"
+msgstr "Š„Š¾ŃŠµ ŠæŃŠøŃŠ“Š½Š°ŃŠøŃŃ Š“Š¾ ŠŗŃŠ¼Š½Š°ŃŠø:"
+
+msgid "Do you accept?"
+msgstr "ŠŠø ŠæŃŠøŠ¹Š¼Š°ŃŃŠµ?"
+
+msgid "Yes"
+msgstr "Š¢Š°Šŗ"
+
+msgid "No"
+msgstr "ŠŃ"
+
+msgid "would like to get authorization."
+msgstr "Ń
Š¾ŃŠµ Š¾ŃŃŠøŠ¼Š°ŃŠø Š°Š²ŃŠ¾ŃŠøŠ·Š°ŃŃŃ."
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr ""
+
+msgid "Submit"
+msgstr "ŠŠ°Š“ŃŃŠ»Š°ŃŠø"
+
+msgid "Client"
+msgstr "ŠŠ»ŃŃŠ½Ń"
+
+msgid "System"
+msgstr "Š”ŠøŃŃŠµŠ¼Š°"
+
+msgid "Local time"
+msgstr "ŠŠ¾ŠŗŠ°Š»ŃŠ½ŠøŠ¹ ŃŠ°Ń"
+
+msgid "Comments"
+msgstr "ŠŠ¾Š¼ŠµŠ½ŃŠ°ŃŃ"
+
+msgid "User profile"
+msgstr "ŠŃŠ¾ŃŃŠ»Ń ŠŗŠ¾ŃŠøŃŃŃŠ²Š°ŃŠ°"
+
+msgid "See his/her position on the globe"
+msgstr "ŠŠ°ŃŠøŃŠø Š¹Š¾Š³Š¾/ŃŃ Š¼ŃŃŃŠµŠ·Š½Š°Ń
Š¾Š“Š¶ŠµŠ½Š½Ń"
+
+msgid "Confirm"
+msgstr "ŠŃŠ“ŃŠ²ŠµŃŠ“ŠøŃŠø"
+
+msgid "anonymous mode"
+msgstr "Š°Š½Š¾Š½ŃŠ¼Š½ŠøŠ¹ ŃŠµŠ¶ŠøŠ¼"
+
+msgid "Groups"
+msgstr "ŠŃŃŠæŠø"
+
+msgid "Unclassified"
+msgstr "ŠŠµŠ¼Š°Ń Š³ŃŃŠæŠø"
+
+msgid "Authorize"
+msgstr "ŠŠ²ŃŠ¾ŃŠøŠ·Š¾Š²Š°Š½ŠøŠ¹"
+
+msgid "Ask for authorization"
+msgstr "ŠŠ°Š“ŃŃŠ»Š°ŃŠø Š·Š°ŠæŠøŃ Š°Š²ŃŠ¾ŃŠøŠ·Š°ŃŃŃ"
+
+msgid "Unblock"
+msgstr ""
+
+msgid "Prohibit"
+msgstr "ŠŠ°Š±Š¾ŃŠ¾Š½ŠøŃŠø"
+
+msgid "Block"
+msgstr "ŠŠ°Š±Š»Š¾ŠŗŃŠ²Š°ŃŠø"
+
+msgid "Chat"
+msgstr "ŠŠµŃŃŠ“Š°"
+
+msgid "Groupchat"
+msgstr "ŠŠ¾Š½ŃŠµŃŠµŠ½ŃŃŃ"
+
+msgid "Jappix Mobile"
+msgstr "Š¼Š¾Š±ŃŠ»ŃŠ½ŠøŠ¹ Jappix "
+
+msgid "Desktop"
+msgstr "ŠŠ¾Š²Š½Š° Š²ŠµŃŃŃŃ"
+
+msgid "Mobile"
+msgstr "ŠŠ¾Š±ŃŠ»ŃŠ½ŠøŠ¹"
+
+msgid "Please wait..."
+msgstr "ŠŃŠ“Ń Š»Š°ŃŠŗŠ°, Š·Š°ŃŠµŠŗŠ°Š¹ŃŠµ..."
+
+msgid "Please enable JavaScript"
+msgstr "ŠŃŠ“Ń Š»Š°ŃŠŗŠ°, Š“Š¾Š·Š²Š¾Š»ŃŃŠµ Š²ŠøŠŗŠ¾Š½Š°Š½Š½Ń JavaScript"
+
+msgid "Your channel"
+msgstr "ŠŠ°Ń ŠŗŠ°Š½Š°Š»"
+
+msgid "Channel of"
+msgstr ""
+
+msgid "More notices..."
+msgstr ""
+
+msgid "Attach a file"
+msgstr "ŠŃŠøŃŠ“Š½Š°ŃŠø ŃŠ°Š¹Š»"
+
+msgid "Send"
+msgstr "ŠŠ°Š“ŃŃŠ»Š°ŃŠø"
+
+msgid "Unattach the file"
+msgstr "ŠŠøŠ“Š°Š»ŠøŃŠø ŃŠ°Š¹Š»"
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr ""
+
+msgid "Authorization failed"
+msgstr "ŠŠ¾Š¼ŠøŠ»ŠŗŠ° Š°Š²ŃŠ¾ŃŠøŠ·Š°ŃŃŃ"
+
+msgid "Registration failed, please choose a different username"
+msgstr ""
+
+msgid "Service unavailable"
+msgstr "Š”ŠµŃŠ²ŃŃ Š½ŠµŠ“Š¾ŃŃŃŠæŠ½ŠøŠ¹"
+
+msgid "Internal server error, try later"
+msgstr ""
+
+msgid "Your form has been sent."
+msgstr ""
+
+msgid "Application"
+msgstr ""
+
+msgid "XMPP links"
+msgstr ""
+
+msgid "Open XMPP links with Jappix"
+msgstr ""
+
+msgid "changed the subject to:"
+msgstr ""
+
+msgid "Welcome!"
+msgstr ""
+
+msgid "Friends"
+msgstr "ŠŃŃŠ·Ń"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr ""
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr ""
+
+msgid "Enable notification sounds"
+msgstr ""
+
+msgid "Share your position on the globe"
+msgstr ""
+
+msgid "Offline friends"
+msgstr ""
+
+msgid "Don't hide offline friends"
+msgstr ""
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr ""
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr ""
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr ""
+
+msgid "Share Jappix on %s"
+msgstr ""
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr ""
+
+msgid "Unknown name"
+msgstr ""
+
+msgid "Unknown country"
+msgstr ""
+
+msgid "Click to enable"
+msgstr ""
+
+msgid "Click to disable"
+msgstr ""
+
+msgid "Installation"
+msgstr ""
+
+msgid "Jappix installation"
+msgstr ""
+
+msgid "Welcome to the Jappix installation!"
+msgstr ""
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr ""
+
+msgid "Let's have a look at the installation steps:"
+msgstr ""
+
+msgid "Welcome"
+msgstr ""
+
+msgid "Storage configuration"
+msgstr ""
+
+msgid "Administrator account"
+msgstr ""
+
+msgid "Main configuration"
+msgstr ""
+
+msgid "Hosts configuration"
+msgstr ""
+
+msgid "Services installation"
+msgstr ""
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr ""
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr ""
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr ""
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr ""
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr ""
+
+msgid "The folder is writable, you can continue!"
+msgstr ""
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr ""
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr ""
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr ""
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr ""
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr ""
+
+msgid "User"
+msgstr ""
+
+msgid "Service"
+msgstr ""
+
+msgid "Service name"
+msgstr ""
+
+msgid "Service description"
+msgstr ""
+
+msgid "Connection"
+msgstr ""
+
+msgid "Lock the host"
+msgstr ""
+
+msgid "Anonymous mode"
+msgstr ""
+
+msgid "Registration allowed"
+msgstr ""
+
+msgid "Use a proxy"
+msgstr ""
+
+msgid "Encryption"
+msgstr ""
+
+msgid "HTTPS storage"
+msgstr ""
+
+msgid "Force HTTPS"
+msgstr ""
+
+msgid "Compression"
+msgstr ""
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr ""
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr ""
+
+msgid "Main host"
+msgstr ""
+
+msgid "Groupchat host"
+msgstr ""
+
+msgid "Anonymous host"
+msgstr ""
+
+msgid "Directory host"
+msgstr ""
+
+msgid "BOSH host"
+msgstr ""
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr ""
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr ""
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr ""
+
+msgid "Thanks for using Jappix!"
+msgstr ""
+
+msgid "Next"
+msgstr ""
+
+msgid "Finish"
+msgstr ""
+
+msgid "Check again"
+msgstr ""
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr ""
+
+msgid "%s is installed on your system."
+msgstr ""
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr ""
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr ""
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr ""
+
+msgid "Jappix manager"
+msgstr ""
+
+msgid "Manager access"
+msgstr ""
+
+msgid "Statistics"
+msgstr ""
+
+msgid "Hosts"
+msgstr ""
+
+msgid "Design"
+msgstr ""
+
+msgid "Repeat"
+msgstr ""
+
+msgid "All"
+msgstr ""
+
+msgid "Horizontal"
+msgstr ""
+
+msgid "Vertical"
+msgstr ""
+
+msgid "Center"
+msgstr ""
+
+msgid "Left"
+msgstr ""
+
+msgid "Right"
+msgstr ""
+
+msgid "Top"
+msgstr ""
+
+msgid "Bottom"
+msgstr ""
+
+msgid "Adapt"
+msgstr ""
+
+msgid "Color"
+msgstr ""
+
+msgid "Users"
+msgstr ""
+
+msgid "Updates"
+msgstr ""
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr ""
+
+msgid "Please use the form below to login to the administration panel."
+msgstr ""
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr ""
+
+msgid "Credentials"
+msgstr ""
+
+msgid "You have been logged out. Goodbye!"
+msgstr ""
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr ""
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr ""
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr ""
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr ""
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr ""
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr ""
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr ""
+
+msgid "The image could not be received, would you mind retry?"
+msgstr ""
+
+msgid "Your image was added to the list!"
+msgstr ""
+
+msgid "Changes saved!"
+msgstr ""
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr ""
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr ""
+
+msgid "Access statistics"
+msgstr ""
+
+msgid "Share statistics"
+msgstr ""
+
+msgid "Other statistics"
+msgstr ""
+
+msgid "January"
+msgstr ""
+
+msgid "February"
+msgstr ""
+
+msgid "March"
+msgstr ""
+
+msgid "April"
+msgstr ""
+
+msgid "May"
+msgstr ""
+
+msgid "June"
+msgstr ""
+
+msgid "July"
+msgstr ""
+
+msgid "August"
+msgstr ""
+
+msgid "September"
+msgstr ""
+
+msgid "October"
+msgstr ""
+
+msgid "November"
+msgstr ""
+
+msgid "December"
+msgstr ""
+
+msgid "Monday"
+msgstr ""
+
+msgid "Tuesday"
+msgstr ""
+
+msgid "Wednesday"
+msgstr ""
+
+msgid "Thursday"
+msgstr ""
+
+msgid "Friday"
+msgstr ""
+
+msgid "Saturday"
+msgstr ""
+
+msgid "Sunday"
+msgstr ""
+
+msgid "Total"
+msgstr ""
+
+msgid "Cache"
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Music"
+msgstr ""
+
+msgid "Backgrounds"
+msgstr ""
+
+msgid "Share"
+msgstr ""
+
+msgid "Background"
+msgstr ""
+
+msgid "Notice"
+msgstr ""
+
+msgid "Your design preferences have been saved!"
+msgstr ""
+
+msgid "Please check your inputs: something is missing!"
+msgstr ""
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr ""
+
+msgid "Use default background"
+msgstr ""
+
+msgid "Use your own image"
+msgstr ""
+
+msgid "Select a background to use and change the display options."
+msgstr ""
+
+msgid "Use your own color"
+msgstr ""
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr ""
+
+msgid "Manage backgrounds"
+msgstr ""
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr ""
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr ""
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr ""
+
+msgid "Simple notice"
+msgstr ""
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr ""
+
+msgid "Advanced notice"
+msgstr ""
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr ""
+
+msgid "Available updates"
+msgstr ""
+
+msgid "What's new?"
+msgstr ""
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr ""
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr ""
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr ""
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr ""
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr ""
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr ""
+
+msgid "Check for updates"
+msgstr ""
+
+msgid "Update in progress"
+msgstr ""
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr ""
+
+msgid "The update has failed! Please try again later."
+msgstr ""
+
+msgid "Downloading package..."
+msgstr ""
+
+msgid "Removing current Jappix system files..."
+msgstr ""
+
+msgid "Extracting package..."
+msgstr ""
+
+msgid "Regenerating storage folder tree..."
+msgstr ""
+
+msgid "Jappix is now up to date!"
+msgstr ""
+
+msgid "Aborted: socket error!"
+msgstr ""
+
+msgid "Aborted: buffer error!"
+msgstr ""
+
+msgid "Aborted: everything is not writable!"
+msgstr ""
+
+msgid "Aborted: could not extract the package!"
+msgstr ""
+
+msgid "Visits"
+msgstr ""
+
+msgid "Daily"
+msgstr ""
+
+msgid "Weekly"
+msgstr ""
+
+msgid "Monthly"
+msgstr ""
+
+msgid "Yearly"
+msgstr ""
+
+msgid "Size"
+msgstr ""
+
+msgid "Clean everything"
+msgstr ""
+
+msgid "Purge cache"
+msgstr ""
+
+msgid "Purge logs"
+msgstr ""
+
+msgid "Purge updates"
+msgstr ""
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr ""
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr ""
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr ""
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr ""
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr ""
+
+msgid "Title"
+msgstr ""
+
+msgid "Artist"
+msgstr ""
+
+msgid "Album"
+msgstr ""
+
+msgid "File"
+msgstr ""
+
+msgid "Upload"
+msgstr ""
+
+msgid "The folder is empty."
+msgstr ""
+
+msgid "The music could not be received, please retry!"
+msgstr ""
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr ""
+
+msgid "Your music has been added!"
+msgstr ""
+
+msgid "The selected elements have been removed."
+msgstr ""
+
+msgid "You must select elements to remove!"
+msgstr ""
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr ""
+
+msgid "Manage"
+msgstr ""
+
+msgid "List"
+msgstr ""
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr ""
+
+msgid "The user has been added!"
+msgstr ""
+
+msgid "The chosen users have been removed."
+msgstr ""
+
+msgid "You must select one or more users to be removed!"
+msgstr ""
+
+msgid "Yesterday"
+msgstr ""
+
+msgid "%s days ago"
+msgstr ""
+
+msgid "User currently active"
+msgstr ""
+
+msgid "Last seen: %s"
+msgstr ""
+
+msgid "Inactive since: %s"
+msgstr ""
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr ""
+
+msgid "Static content server"
+msgstr ""
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Suggested friends"
+msgstr ""
+
+msgid "Check all"
+msgstr ""
+
+msgid "Uncheck all"
+msgstr ""
+
+msgid "Choose"
+msgstr ""
+
+msgid "List name"
+msgstr ""
+
+msgid "Allow"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
+msgid "Group"
+msgstr ""
+
+msgid "Subscription"
+msgstr ""
+
+msgid "Both"
+msgstr ""
+
+msgid "From"
+msgstr ""
+
+msgid "Everybody"
+msgstr ""
+
+msgid "Send messages"
+msgstr ""
+
+msgid "Send queries"
+msgstr ""
+
+msgid "See my status"
+msgstr ""
+
+msgid "Send his/her status"
+msgstr ""
+
+msgid "Everything"
+msgstr ""
+
+msgid "Item"
+msgstr ""
+
+msgid "Order"
+msgstr ""
+
+msgid "Active for this session"
+msgstr ""
+
+msgid "Always active"
+msgstr ""
+
+msgid "User directory"
+msgstr ""
+
+msgid "Search a friend"
+msgstr ""
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr ""
+
+msgid "This is a repeat from %s"
+msgstr ""
+
+msgid "Loading comments..."
+msgstr ""
+
+msgid "Type your comment here..."
+msgstr ""
+
+msgid "Could not get the comments!"
+msgstr ""
+
+msgid "Show comments"
+msgstr ""
+
+msgid "Send him/her a message"
+msgstr ""
+
+msgid "Start a chat with him/her"
+msgstr ""
+
+msgid "Media integration"
+msgstr ""
+
+msgid "Comments locked!"
+msgstr ""
+
+msgid "Type something you want to share with your friends..."
+msgstr ""
+
+msgid "changed his/her nickname to %s"
+msgstr ""
+
+msgid "commented an item you follow: ā%sā."
+msgstr ""
+
+msgid "Hide"
+msgstr ""
+
+msgid "liked your post: ā%sā."
+msgstr ""
+
+msgid "quoted you somewhere: ā%sā."
+msgstr ""
+
+msgid "published on your wall: ā%sā."
+msgstr ""
+
+msgid "tagged you in a photo (%s)."
+msgstr ""
+
+msgid "tagged you in a video (%s)."
+msgstr ""
+
+msgid "Show"
+msgstr ""
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr ""
+
+msgid "Pubsub host"
+msgstr ""
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr ""
+
+msgid "Manager link"
+msgstr ""
+
+msgid "User uploads server"
+msgstr ""
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Logo"
+msgstr ""
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr ""
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr ""
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr ""
+
+msgid "Your service logo has been successfully changed!"
+msgstr ""
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr ""
+
+msgid "Remove this logo"
+msgstr ""
+
+msgid "View this logo"
+msgstr ""
+
+msgid "Send a file"
+msgstr ""
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr ""
+
+msgid "Groupchats to join"
+msgstr ""
+
+msgid "Purge sent files"
+msgstr ""
+
+msgid "would like to send you a file: ā%sā."
+msgstr ""
+
+msgid "has accepted to received your file: ā%sā."
+msgstr ""
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr ""
+
+msgid "could not receive your file: ā%sā."
+msgstr ""
+
+msgid "has received a file exchange request: ā%sā."
+msgstr ""
+
+msgid "Available shortcuts:"
+msgstr ""
+
+msgid "%s removes the chat logs"
+msgstr ""
+
+msgid "%s joins a groupchat"
+msgstr ""
+
+msgid "%s closes the chat"
+msgstr ""
+
+msgid "%s shows the user profile"
+msgstr ""
+
+msgid "%s sends a message to the room"
+msgstr ""
+
+msgid "%s changes your nickname"
+msgstr ""
+
+msgid "%s sends a message to someone in the room"
+msgstr ""
+
+msgid "%s changes the room topic"
+msgstr ""
+
+msgid "%s kicks an user of the room"
+msgstr ""
+
+msgid "%s bans an user of the room"
+msgstr ""
+
+msgid "%s invites someone to join the room"
+msgstr ""
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr ""
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+# Chinese translations for Jappix package.
+# This file is distributed under the same license as the Jappix package.
+# This file was translated from CodingTeam at <http://codingteam.net/>.
+msgid ""
+msgstr ""
+"Project-Id-Version: Jappix\n"
+"PO-Revision-Date: 2012-01-16 21:26+0100\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+msgid "JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."
+msgstr "åØä½ ēē¶²é ēč¦½åØę¾äøå° JavaScriptļ¼ęä»„ä½ ē”ę³åå Jappixļ¼č«äæ®ę£ć"
+
+msgid "An open social network"
+msgstr "éę¾ē¤¾äŗ¤ē¶²č·Æ"
+
+msgid "Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."
+msgstr "Jappix å·²ē¶å ēŗē¶²č·Æåé”ćbug ęē»å
„éÆčŖ¤ļ¼ęŖ¢ę„ä½ č¼øå
„äŗę£ē¢ŗēčŗ«ä»½čęļ¼čč¢«äøę·ļ¼ę±ęé ęäøä¾æć"
+
+msgid "The element list on this server could not be obtained!"
+msgstr "ę¤ä¼ŗęåØēå
ē“ ęø
å®ē”ę³åå¾ļ¼"
+
+msgid "Your password has been changed, now you can connect to your account with your new login data."
+msgstr "ä½ ēåÆē¢¼å·²č¢«č®ę“ļ¼ē¾åØä½ åÆ仄ēØę°ēē»å
„č³ęé£å°ä½ ēåø³čć"
+
+msgid "Your XMPP account has been removed, bye!"
+msgstr "ä½ ē XMPP åø³čå·²č¢«åŖé¤ļ¼åč¦ļ¼"
+
+msgid "You have been logged out of your XMPP account, have a nice day!"
+msgstr "ä½ å·²ē¶ē»åŗä½ ē XMPP åø³čļ¼ē„ä½ ä»å¤©ęåæ«ļ¼"
+
+msgid "The room you joined seems not to exist. You should create it!"
+msgstr "ä½ å å
„ēęæéä¼¼ä¹äøååØćä½ ęč©²å»ŗē«å®ļ¼"
+
+msgid "The groupchat has been removed, now someone else will be able to recreate it."
+msgstr "ē¾¤ēµč天已ē¶č¢«åŖé¤ļ¼ē¾åØå
¶ä»äŗŗęč©²åÆ仄éę°å»ŗē«å®ć"
+
+msgid "The user that you want to reach is not present in the room."
+msgstr "ä½ ę³čÆē¹«ēä½æēØč
äøåØęæéå
§ć"
+
+msgid "Please enter the group chat address to join."
+msgstr "č«č¼øå
„č¦å å
„ēē¾¤ēµč天å°åć"
+
+msgid "Please enter your nickname to join %s."
+msgstr "č«č¼øå
„č¦å å
„ %s ēØēę±ēرć"
+
+msgid "This room (%s) is protected with a password."
+msgstr "ę¤ęæéļ¼%sļ¼ęåÆē¢¼äæč·ć"
+
+msgid "Your browser is out of date!"
+msgstr "ä½ ēēč¦½åØå·²ē¶éęļ¼"
+
+msgid "Last %s version is better!"
+msgstr "ęØéä½æēØęę°ēę¬ %sļ¼"
+
+msgid "Login"
+msgstr "ē»å
„"
+
+msgid "Register"
+msgstr "čØ»å"
+
+msgid "Here we go!"
+msgstr "éå§åļ¼"
+
+msgid "Server"
+msgstr "ä¼ŗęåØ"
+
+msgid "Password"
+msgstr "åÆē¢¼"
+
+msgid "Remember me"
+msgstr "čØä½ę"
+
+msgid "This tool has been disabled, you cannot use it!"
+msgstr "ę¤å·„å
·å·²č¢«åēØļ¼ä½ äøč½ä½æēØå®ļ¼"
+
+msgid "Due to a network issue, you were disconnected. What do you want to do now?"
+msgstr "å ēŗē¶²č·Æåé”ļ¼ä½ å·²č¢«ę·ē·ćä½ ē¾åØę³åä»éŗ¼ļ¼"
+
+msgid "Reconnect"
+msgstr "éę°é£ē·"
+
+msgid "Messages"
+msgstr "čØęÆ"
+
+msgid "Profile"
+msgstr "åäŗŗč³ę"
+
+msgid "Options"
+msgstr "éøé
"
+
+msgid "Disconnect"
+msgstr "ę·ē·"
+
+msgid "Filter"
+msgstr "éęæ¾"
+
+msgid "Add a friend"
+msgstr "ę°å¢å„½å"
+
+msgid "Your groupchats"
+msgstr "ä½ ēē¾¤ēµč天"
+
+msgid "Manage your favorite groupchats"
+msgstr "ē®”ēä½ ęęēē¾¤ēµč天"
+
+msgid "More stuff"
+msgstr "ę“å¤ę±č„æ"
+
+msgid "Show all friends"
+msgstr "é”Æē¤ŗęę儽å"
+
+msgid "Only show connected friends"
+msgstr "åŖé”Æē¤ŗå·²é£ē·ē儽å"
+
+msgid "Message archives"
+msgstr "čØęÆåęŖ"
+
+msgid "Date"
+msgstr "ę„ę"
+
+msgid "Please select a friend to view the chat history."
+msgstr "č«éøåč¦ęŖ¢č¦č天čØéēęåć"
+
+msgid "Nothing found for: %s"
+msgstr "ę¾äøå°ļ¼%s"
+
+msgid "A short message?"
+msgstr "ēčØęÆļ¼"
+
+msgid "How are you?"
+msgstr "ä½ å„½åļ¼"
+
+msgid "What are you doing?"
+msgstr "ä½ åØåä»éŗ¼ļ¼"
+
+msgid "Join a chat"
+msgstr "å å
„č天"
+
+msgid "Status"
+msgstr "ēę
"
+
+msgid "Available"
+msgstr "ęē©ŗ"
+
+msgid "Talkative"
+msgstr "å¤č©±"
+
+msgid "Away"
+msgstr "é¢é"
+
+msgid "Not available"
+msgstr "ę²ē©ŗ"
+
+msgid "Busy"
+msgstr "åæē¢"
+
+msgid "Mood"
+msgstr "åæę
"
+
+msgid "None"
+msgstr "ē”"
+
+msgid "Crazy"
+msgstr "ęē"
+
+msgid "Excited"
+msgstr "čå„®"
+
+msgid "Playful"
+msgstr "åæ«ę“»"
+
+msgid "Happy"
+msgstr "åæ«ęØ"
+
+msgid "Shocked"
+msgstr "éé©"
+
+msgid "Hot"
+msgstr "ęæå"
+
+msgid "Sad"
+msgstr "ę²å·"
+
+msgid "Amorous"
+msgstr "ęę
"
+
+msgid "Confident"
+msgstr "大č½"
+
+msgid "Activity"
+msgstr "ę“»å"
+
+msgid "Chores"
+msgstr "éäŗ"
+
+msgid "Drinking"
+msgstr "å"
+
+msgid "Eating"
+msgstr "å"
+
+msgid "Exercising"
+msgstr "éå"
+
+msgid "Grooming"
+msgstr "čØē·“"
+
+msgid "Appointment"
+msgstr "é ē“"
+
+msgid "Inactive"
+msgstr "ē”ę"
+
+msgid "Relaxing"
+msgstr "ę¾é¬"
+
+msgid "Talking"
+msgstr "å°č©±"
+
+msgid "Traveling"
+msgstr "ę
č”"
+
+msgid "Working"
+msgstr "å·„ä½"
+
+msgid "View profile"
+msgstr "ęŖ¢č¦åäŗŗč³ę"
+
+msgid "Repeat this notice"
+msgstr "éč¦ę¤éē„"
+
+msgid "Remove this notice"
+msgstr "åŖé¤ę¤éē„"
+
+msgid "Your profile"
+msgstr "ä½ ēåäŗŗč³ę"
+
+msgid "Identity"
+msgstr "čŗ«åčę"
+
+msgid "Profile image"
+msgstr "大é č²¼"
+
+msgid "Others"
+msgstr "å
¶ä»"
+
+msgid "Personal"
+msgstr "åäŗŗ"
+
+msgid "Complete name"
+msgstr "å
Øå"
+
+msgid "Nickname"
+msgstr "ę±ēر"
+
+msgid "First name"
+msgstr "å"
+
+msgid "Last name"
+msgstr "å§"
+
+msgid "Date of birth"
+msgstr "ēę„"
+
+msgid "Contact"
+msgstr "é£ēµ”äŗŗ"
+
+msgid "E-mail"
+msgstr "é»åéµä»¶"
+
+msgid "Phone"
+msgstr "é»č©±"
+
+msgid "Website"
+msgstr "ē¶²ē«"
+
+msgid "Current"
+msgstr "ē®å"
+
+msgid "Delete"
+msgstr "åŖé¤"
+
+msgid "What a pity! You have no profile image defined in your identity card!"
+msgstr "åÆęļ¼ä½ ę²ęåØä½ ēčŗ«ä»½čäøčØå®å¤§é č²¼ļ¼"
+
+msgid "Address"
+msgstr "å°å"
+
+msgid "Street"
+msgstr "č”"
+
+msgid "City"
+msgstr "åø"
+
+msgid "Postal code"
+msgstr "éµéåč"
+
+msgid "Country"
+msgstr "å家"
+
+msgid "Biography"
+msgstr "čŖå³"
+
+msgid "Important notice"
+msgstr "éč¦éē„"
+
+msgid "Be careful of the information you write into your profile, because it could be accessed by everyone (even someone you don't want to)."
+msgstr "å°åæä½ åÆ«å
„åäŗŗč³ęēč³čØļ¼å ēŗå®åÆč¢«ęÆåäŗŗåå¾ļ¼ēč³ä½ äøč¦ēäŗŗļ¼ć"
+
+msgid "Not everything is private on XMPP; this is one of those things, your public profile (vCard)."
+msgstr "åØ XMPP äøäøęÆęÆęØ£ę±č„æęÆē§ęēļ¼éęÆå
¶äøäø件ļ¼ä½ ēå
¬éåäŗŗč³ęļ¼vCardļ¼ć"
+
+msgid "It is strongly recommended to upload a profile image (%s maximum), like a picture of yourself, because that makes you easily recognizable by your friends."
+msgstr "å¼·ēå»ŗč°äøå³å¤§é ē
§ļ¼ę大 %sļ¼ļ¼åęÆä½ čŖå·±ēēøēļ¼å ēŗé£ęä½æä½ ēęåę“容ęčŖå¾ä½ ć"
+
+msgid "Save"
+msgstr "å²å"
+
+msgid "Cancel"
+msgstr "åę¶"
+
+msgid "Edit options"
+msgstr "ē·Øč¼Æéøé
"
+
+msgid "Channel"
+msgstr "é »é"
+
+msgid "Commands"
+msgstr "å½ä»¤"
+
+msgid "Sounds"
+msgstr "č²é³"
+
+msgid "Privacy"
+msgstr "é±ē§"
+
+msgid "Message archiving"
+msgstr "čØęÆåęŖ"
+
+msgid "Store a history of your chats"
+msgstr "å²åä½ ēč天čØé"
+
+msgid "Geolocation"
+msgstr "å°ēä½ē½®"
+
+msgid "Empty"
+msgstr "ē©ŗ"
+
+msgid "Empty channel"
+msgstr "ē©ŗēé »é"
+
+msgid "Persistent"
+msgstr "ęēŗ"
+
+msgid "Maximum notices"
+msgstr "éē„ēę大ęø"
+
+msgid "Account"
+msgstr "åø³č"
+
+msgid "Change password"
+msgstr "č®ę“åÆē¢¼"
+
+msgid "Delete account"
+msgstr "åŖé¤åø³č"
+
+msgid "Old"
+msgstr "č"
+
+msgid "New (2 times)"
+msgstr "ę°ļ¼2 ꬔļ¼"
+
+msgid "Continue"
+msgstr "ē¹¼ēŗ"
+
+msgid "To"
+msgstr "č³"
+
+msgid "Close"
+msgstr "éé"
+
+msgid "unknown"
+msgstr "äøę"
+
+msgid "Unavailable"
+msgstr "ē”ę³ä½æēØ"
+
+msgid "is now"
+msgstr "ē¾åØęÆ"
+
+msgid "Please wait while your avatar is uploaded..."
+msgstr "č«ēØå¾
ļ¼avatar ę£č¢«č¼å
„..."
+
+msgid "Here it is! A new beautiful profile image!"
+msgstr "åØę¤ļ¼ē¾éŗēę°å¤§é č²¼ļ¼"
+
+msgid "The image file is not supported or has a bad size."
+msgstr "å½±åęŖäøč¢«ęÆę“ę大å°éÆčŖ¤ć"
+
+msgid "Reply"
+msgstr "åč¦"
+
+msgid "Error"
+msgstr "éÆčŖ¤"
+
+msgid "Click here to solve the error"
+msgstr "åØę¤é»äøäøä»„č§£ę±ŗéÆčŖ¤"
+
+msgid "You"
+msgstr "ä½ "
+
+msgid "Remove"
+msgstr "åŖé¤"
+
+msgid "Rename"
+msgstr "ę“å"
+
+msgid "Hi, I am %s, I would like to add you as my friend."
+msgstr "åØļ¼ęęÆ %sļ¼ęę³ęä½ å å
„ēŗęē儽åć"
+
+msgid "Smiley insertion"
+msgstr "ęæå
„å¾®ē¬ē¬¦č"
+
+msgid "Change style"
+msgstr "č®ę“é¢Øę ¼"
+
+msgid "Text in bold"
+msgstr "ē²é«å"
+
+msgid "Text in italic"
+msgstr "ęé«å"
+
+msgid "Underlined text"
+msgstr "åŗē·å"
+
+msgid "Save chat"
+msgstr "å²åč天"
+
+msgid "Click on the following link to get the chat log, and wait. Then click again to get the file."
+msgstr "åØ仄äøé£ēµé»äøäø仄åå¾č天čØéļ¼äøēØå¾
ćē¶å¾åé»äøäøåå¾ęŖę”ć"
+
+msgid "This chat is empty!"
+msgstr "ę¤č天ęÆē©ŗēļ¼"
+
+msgid "Generate file!"
+msgstr "ē¢ēęŖę”ļ¼"
+
+msgid "Download file!"
+msgstr "äøč¼ęŖę”ļ¼"
+
+msgid "Clean current chat"
+msgstr "ęø
é¤ē®åēč天"
+
+msgid "View chat history"
+msgstr "ęŖ¢č¦č天čØé"
+
+msgid "Show user profile"
+msgstr "é”Æē¤ŗä½æēØč
åäŗŗč³ę"
+
+msgid "Add this contact to your friends"
+msgstr "å å
„ę¤é£ēµ”äŗŗč³ä½ ē儽å"
+
+msgid "Add this groupchat to your favorites"
+msgstr "å å
„ę¤ē¾¤ēµč天č³ä½ ēęę"
+
+msgid "All tabs"
+msgstr "å
ØéØé ē±¤"
+
+msgid "Close this tab"
+msgstr "ééę¤é ē±¤"
+
+msgid "no subject defined for this room."
+msgstr "ę¤ęæéęŖčØå®äø»ęØć"
+
+msgid "Administration panel for this room"
+msgstr "ę¤ęæéēē®”ēé¢ęæ"
+
+msgid "Moderators"
+msgstr "äø»ęäŗŗ"
+
+msgid "Participants"
+msgstr "åčč
"
+
+msgid "Visitors"
+msgstr "čØŖ客"
+
+msgid "Manage favorite rooms"
+msgstr "ē®”ēęęēęæé"
+
+msgid "Change favorites"
+msgstr "č®ę“ęēęę"
+
+msgid "Search a room"
+msgstr "ęå°ęæé"
+
+msgid "Select a favorite"
+msgstr "éøåęēęę"
+
+msgid "Getting the name..."
+msgstr "ę£åØåå¾åēر..."
+
+msgid "Gateway"
+msgstr "éé"
+
+msgid "Name"
+msgstr "åēر"
+
+msgid "Room"
+msgstr "ęæé"
+
+msgid "Add"
+msgstr "å¢å "
+
+msgid "Edit"
+msgstr "ē·Øč¼Æ"
+
+msgid "Search a room on"
+msgstr "ęå°ęæéę¼"
+
+msgid "No room found on this server."
+msgstr "åØę¤ä¼ŗęåØäøę¾äøå°ęæéć"
+
+msgid "Service discovery"
+msgstr "ęåę¢ē“¢"
+
+msgid "Server to query"
+msgstr "ę„č©¢ēä¼ŗęåØ"
+
+msgid "Sorry, but the entity didn't return any result!"
+msgstr "ę±ęļ¼ä½ęÆé£åƦé«ęŖå³åä»»ä½ēµęļ¼"
+
+msgid "Accounts"
+msgstr "åø³č"
+
+msgid "Authentications"
+msgstr "ęę¬"
+
+msgid "Automation"
+msgstr "čŖå"
+
+msgid "Clients"
+msgstr "客ę¶ē«Æ"
+
+msgid "Collaboration"
+msgstr "åå"
+
+msgid "Components"
+msgstr "å
件"
+
+msgid "Rooms"
+msgstr "ęæé"
+
+msgid "Directories"
+msgstr "ē®é"
+
+msgid "Gateways"
+msgstr "éé"
+
+msgid "News"
+msgstr "ę°č"
+
+msgid "Hierarchy"
+msgstr "é層"
+
+msgid "Proxies"
+msgstr "代ēä¼ŗęåØ"
+
+msgid "Publication/Subscription"
+msgstr "å
¬é/čØé±"
+
+msgid "Storage"
+msgstr "å²åē©ŗé"
+
+msgid "Service offline or broken"
+msgstr "ęåé¢ē·ęę
é"
+
+msgid "Your inbox"
+msgstr "ä½ ēę¶ä»¶å£"
+
+msgid "Available actions"
+msgstr "åÆēØēåä½"
+
+msgid "Clean"
+msgstr "ęø
é¤"
+
+msgid "New"
+msgstr "ę°å¢"
+
+msgid "Received"
+msgstr "å·²ę„ę¶"
+
+msgid "Subject"
+msgstr "äø»ęØ"
+
+msgid "Content"
+msgstr "å
容"
+
+msgid "Send message"
+msgstr "å³éčØęÆ"
+
+msgid "Your inbox is empty."
+msgstr "ä½ ēę¶ä»¶å£ęÆē©ŗēć"
+
+msgid "MUC administration"
+msgstr "MUC ē®”ē"
+
+msgid "You administrate this room"
+msgstr "ä½ ē®”ēę¤ęæé"
+
+msgid "Enter new subject"
+msgstr "č¼øå
„ę°ēäø»ęØ"
+
+msgid "Configuration"
+msgstr "čØå®"
+
+msgid "Authorizations"
+msgstr "ęę¬"
+
+msgid "Member list"
+msgstr "ęå”ęø
å®"
+
+msgid "Owner list"
+msgstr "ęęč
ęø
å®"
+
+msgid "Administrator list"
+msgstr "ē®”ēå”ęø
å®"
+
+msgid "Outcast list"
+msgstr "č¢«ę¾éč
ęø
å®"
+
+msgid "Add an input"
+msgstr "å¢å č¼øå
„"
+
+msgid "Destroy this MUC"
+msgstr "é·ęÆę¤ MUC"
+
+msgid "Yes, let's do it!"
+msgstr "ęÆļ¼åå§ļ¼"
+
+msgid "Your friend is paying attention to the conversation."
+msgstr "ä½ ē儽åę£åØę³Øęę話ć"
+
+msgid "Your friend is writing a message..."
+msgstr "ä½ ē儽åę£åØåÆ«čØęÆ..."
+
+msgid "Your friend stopped writing a message."
+msgstr "ä½ ē儽ååę¢åÆ«čØęÆć"
+
+msgid "Your friend is doing something else."
+msgstr "ä½ ē儽åę£åØåå
¶ä»äŗć"
+
+msgid "Your friend closed the chat."
+msgstr "ä½ ē儽åééäŗč天ć"
+
+msgid "Requesting this service..."
+msgstr "ę£åØč¦ę±ę¤ęå..."
+
+msgid "Loading"
+msgstr "č¼å
„äø"
+
+msgid "joined the chat room"
+msgstr "å å
„č天室"
+
+msgid "left the chat room"
+msgstr "é¢éč天室"
+
+msgid "no status"
+msgstr "ē”ēę
"
+
+msgid "has been kicked"
+msgstr "å·²č¢«čø¢ę"
+
+msgid "has been banned"
+msgstr "å·²č¢«ē¦ę¢"
+
+msgid "no reason"
+msgstr "ē”ēē±"
+
+msgid "Communicate with the entire world!"
+msgstr "čå
Øäøēęŗéļ¼"
+
+msgid "It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"
+msgstr "å®å
čØ±ä½ čå¹¾ē¾č¬č·ä½ äøęØ£ę£åØå©ēØ Jappix ēä½æēØč
čÆē¹«ćčŖē±å°å å
„ē¤¾ē¾¤å§ļ¼"
+
+msgid "Hi there!"
+msgstr "ä½ å„½ļ¼"
+
+msgid "Welcome on %1s, ā%2sā."
+msgstr "ę”čæä¾å° %1sļ¼ā%2sāć"
+
+msgid "Login to your existing XMPP account or create a new one for free!"
+msgstr "ē»å
„ä½ å·²ęē XMPP åø³čęå
č²»å»ŗē«ę°åø³čļ¼"
+
+msgid "Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help."
+msgstr "Jappix ęÆä¾čŖ PostPro ēéę¾åå§ē¢¼å°ę”ļ¼äøåęä¾ęåčرå¤å¹«å©ēéēå©åé«ć"
+
+msgid "Login to your existing XMPP account. You can also use the %s to join a groupchat."
+msgstr "ē»å
„ä½ å·²ęē XMPP åø³čćä½ ä¹åÆ仄ä½æēØ %s å å
„ē¾¤ēµč天ć"
+
+msgid "Previous"
+msgstr "äøäøé "
+
+msgid "General"
+msgstr "äøč¬"
+
+msgid "Advanced"
+msgstr "é²é"
+
+msgid "Resource"
+msgstr "č³ęŗ"
+
+msgid "Priority"
+msgstr "åŖå
ę¬"
+
+msgid "Low"
+msgstr "ä½"
+
+msgid "Medium"
+msgstr "äø"
+
+msgid "High"
+msgstr "é«"
+
+msgid "Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."
+msgstr "č¼øå
„ä½ ę³å å
„ēč天ē¾¤ēµčä½ ę³č¦ēę±ēرćä½ ä¹åÆ仄åå° %sć"
+
+msgid "login page"
+msgstr "ē»å
„é "
+
+msgid "Share this link with your friends:"
+msgstr "č儽ååäŗ«ę¤é£ēµļ¼"
+
+msgid "Register a new XMPP account to join your friends on your own social cloud. That's simple!"
+msgstr "čØ»åäøåę°ē XMPP åø³č仄ä¾æåØä½ čŖå·±ēē¤¾äŗ¤é²ē«Æäøå å
„ä½ ē儽åćé£ęÆē°”å®ēļ¼"
+
+msgid "Required"
+msgstr "č¦ę±"
+
+msgid "You have been registered, here is your XMPP address:"
+msgstr "ä½ å·²ē¶čØ»åäŗļ¼éęÆä½ ē XMPP å°åļ¼"
+
+msgid "Manager"
+msgstr "ē®”ēå”"
+
+msgid "Project"
+msgstr "å°ę”"
+
+msgid "Encrypted"
+msgstr "å åÆ"
+
+msgid "Unencrypted"
+msgstr "ęŖå åÆ"
+
+msgid "Where are you?"
+msgstr "ä½ åØåŖč£”ļ¼"
+
+msgid "What's up with you?"
+msgstr "ä½ ęéŗ¼äŗļ¼"
+
+msgid "Fetching the social channel..."
+msgstr "åå¾ē¤¾äŗ¤é »é..."
+
+msgid "You are synchronized with your network."
+msgstr "ä½ å·²čä½ ēē¶²č·Æåę„ć"
+
+msgid "Cannot send anything: you can only receive notices!"
+msgstr "ē”ę³å³éä»»ä½ę±č„æļ¼ä½ åŖč½ę„ę¶éē„ļ¼"
+
+msgid "Media viewer"
+msgstr "åŖé«ęę¾ę©"
+
+msgid "Browse"
+msgstr "ēč¦½"
+
+msgid "Command"
+msgstr "å½ä»¤"
+
+msgid "Subscribe"
+msgstr "čØé±"
+
+msgid "Join"
+msgstr "å å
„"
+
+msgid "Automatic"
+msgstr "čŖå"
+
+msgid "Search"
+msgstr "ęå°"
+
+msgid "No result!"
+msgstr "ē”ēµęļ¼"
+
+msgid "No notifications."
+msgstr "ē”éē„ć"
+
+msgid "would like to add you as a friend."
+msgstr "ę³č¦å å
„ä½ ēŗ儽åć"
+
+msgid "would like you to join this chatroom:"
+msgstr "ę³č¦ä½ å å
„ę¤č天室ļ¼"
+
+msgid "Do you accept?"
+msgstr "ä½ ę„ååļ¼"
+
+msgid "Yes"
+msgstr "ęÆ"
+
+msgid "No"
+msgstr "å¦"
+
+msgid "would like to get authorization."
+msgstr "ę³č¦å¾å°ęę¬ć"
+
+msgid "Do you want to see the friends %s suggests you?"
+msgstr "ä½ č¦ē儽å %s å»ŗč°ä½ ļ¼"
+
+msgid "Submit"
+msgstr "éäæ”"
+
+msgid "Client"
+msgstr "客ę¶ē«Æ"
+
+msgid "System"
+msgstr "ē³»ēµ±"
+
+msgid "Local time"
+msgstr "ę¬å°ęé"
+
+msgid "Comments"
+msgstr "č©č«"
+
+msgid "User profile"
+msgstr "ä½æēØč
ę
å ±"
+
+msgid "See his/her position on the globe"
+msgstr "ēä»åØå°ēäøēä½ē½®"
+
+msgid "Confirm"
+msgstr "ē¢ŗčŖ"
+
+msgid "anonymous mode"
+msgstr "åæåęØ”å¼"
+
+msgid "Groups"
+msgstr "ē¾¤ēµ"
+
+msgid "Unclassified"
+msgstr "ęŖåé”"
+
+msgid "Authorize"
+msgstr "ęę¬"
+
+msgid "Ask for authorization"
+msgstr "č¦ę±ęę¬"
+
+msgid "Unblock"
+msgstr "č§£é¤éå®"
+
+msgid "Prohibit"
+msgstr "ē¦ę¢"
+
+msgid "Block"
+msgstr "é»ę"
+
+msgid "Chat"
+msgstr "č天"
+
+msgid "Groupchat"
+msgstr "ē¾¤ēµč天"
+
+msgid "Jappix Mobile"
+msgstr "Jappix č”å"
+
+msgid "Desktop"
+msgstr "ę”é¢"
+
+msgid "Mobile"
+msgstr "č”å"
+
+msgid "Please wait..."
+msgstr "č«ēØå¾
..."
+
+msgid "Please enable JavaScript"
+msgstr "č«åēØ JavaScript"
+
+msgid "Your channel"
+msgstr "ä½ ēé »é"
+
+msgid "Channel of"
+msgstr "é »é: "
+
+msgid "More notices..."
+msgstr "ę“å¤éē„..."
+
+msgid "Attach a file"
+msgstr "éå ęŖę”"
+
+msgid "Send"
+msgstr "å³é"
+
+msgid "Unattach the file"
+msgstr "åę¶éå ęŖę”"
+
+msgid "An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"
+msgstr "ē¶äøå³ä½ ēęŖę”ęē¼ēéÆčŖ¤ļ¼ä¹čرå®å¤Ŗ大ļ¼ę大 %sļ¼ęč¢«ē¦ę¢ļ¼"
+
+msgid "Authorization failed"
+msgstr "ęę¬å¤±ę"
+
+msgid "Registration failed, please choose a different username"
+msgstr "čØ»å失ęļ¼č«ęéøå¦äøåä½æēØč
åēر"
+
+msgid "Service unavailable"
+msgstr "ęåē”ę³ä½æēØ"
+
+msgid "Internal server error, try later"
+msgstr "å
éØä¼ŗęåØéÆčŖ¤ļ¼ēØå¾å試"
+
+msgid "Your form has been sent."
+msgstr "ä½ ēč”Øå®å·²č¢«éåŗć"
+
+msgid "Application"
+msgstr "ęēØēØå¼"
+
+msgid "XMPP links"
+msgstr "XMPP é£ēµ"
+
+msgid "Open XMPP links with Jappix"
+msgstr "ēØ Jappix éå XMPP é£ēµ"
+
+msgid "changed the subject to:"
+msgstr "č®ę“äø»ęØēŗļ¼"
+
+msgid "Welcome!"
+msgstr "ę”čæļ¼"
+
+msgid "Friends"
+msgstr "儽å"
+
+msgid "Welcome on Jappix, your own social cloud!"
+msgstr "ę”čæä¾å° Jappixļ¼ä½ čŖå·±ēē¤¾äŗ¤é²ē«Æļ¼"
+
+msgid "Before you start using it, you will have to change some settings, search for friends and complete your profile."
+msgstr "åØä½ éä½æä½æēØå®ä¹åļ¼ä½ åæ
é č®ę“äøäŗčØå®ļ¼ęå°ęåäø¦å®ęä½ ēåäŗŗč³čØć"
+
+msgid "Enable notification sounds"
+msgstr "åēØéē„é³ę"
+
+msgid "Share your position on the globe"
+msgstr "åäŗ«ä½ åØå°ēäøēä½ē½®"
+
+msgid "Offline friends"
+msgstr "é¢ē·å„½å"
+
+msgid "Don't hide offline friends"
+msgstr "äøč¦é±čé¢ē·å„½å"
+
+msgid "Use this tool to find your friends on the server you are using right now, or add them later."
+msgstr "ä½æēØę¤å·„å
·åØä½ ę£åØä½æēØēä¼ŗęåØäøę¾å°ä½ ēęåļ¼ęēØå¾å å
„ä»åć"
+
+msgid "Great work! Now, you can share Jappix with your friends!"
+msgstr ""
+
+msgid "When you will press the save button, the profile editor will be opened. Happy socializing!"
+msgstr ""
+
+msgid "Share Jappix on %s"
+msgstr "åØ %s äøåäŗ« Jappix"
+
+msgid "Using Jappix, an open social platform. I am %s!"
+msgstr "ä½æēØ Jappixļ¼äøåéę¾ē¤¾äŗ¤å¹³å°ćęęÆ %sļ¼"
+
+msgid "Unknown name"
+msgstr "äøęēåēر"
+
+msgid "Unknown country"
+msgstr "äøęēå家"
+
+msgid "Click to enable"
+msgstr "é»äøäø仄åēØ"
+
+msgid "Click to disable"
+msgstr "é»äøäø仄åēØ"
+
+msgid "Installation"
+msgstr "å®č£"
+
+msgid "Jappix installation"
+msgstr "Jappix å®č£"
+
+msgid "Welcome to the Jappix installation!"
+msgstr "ę”čæä¾å° Jappix å®č£ļ¼"
+
+msgid "This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."
+msgstr "ę¤å·„å
·å°å¹«ä½ åæ«éå°å®č£ Jappixļ¼ē¬¬äøåå
Øåč½ä»„ XMPP ēŗåŗē¤ēē¤¾äŗ¤å¹³å°ćä½ ēč³äøéč¦ä»»ä½ęč”ē„čć"
+
+msgid "Let's have a look at the installation steps:"
+msgstr "č®ęåēäøäøå®č£ę„é©ļ¼"
+
+msgid "Welcome"
+msgstr "ę”čæ"
+
+msgid "Storage configuration"
+msgstr "å²åē©ŗéčØå®"
+
+msgid "Administrator account"
+msgstr "ē®”ēå”åø³č"
+
+msgid "Main configuration"
+msgstr "äø»č¦čØå®"
+
+msgid "Hosts configuration"
+msgstr "äø»ę©čØå®"
+
+msgid "Services installation"
+msgstr "ęåå®č£"
+
+msgid "If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."
+msgstr "å¦ęē®åēčŖčØčä½ ēäøē¬¦ļ¼%1sļ¼ļ¼ä½ åÆä»„č® Jappix čŖŖ %2s å®å°č¢«å²åć"
+
+msgid "If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"
+msgstr ""
+
+msgid "It's time to build your own social cloud: just go to the next step!"
+msgstr ""
+
+msgid "Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."
+msgstr ""
+
+msgid "Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."
+msgstr ""
+
+msgid "The folder is writable, you can continue!"
+msgstr "č³ę夾åÆåÆ«å
„ļ¼ä½ åÆ仄ē¹¼ēŗļ¼"
+
+msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgstr ""
+
+msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
+msgstr "ē¶ Jappix å®č£å®ęå¾ļ¼åŖč¦é»äøäøé¦é äøēē®”ēå”é£ēµå°±åÆ仄é²å
„ć"
+
+msgid "Oops, you missed something or the two passwords do not match!"
+msgstr "ē³ē³ļ¼ä½ ę¼äŗęäŗę±č„æęå
©ååÆē¢¼äøäøč“ļ¼"
+
+msgid "Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."
+msgstr "Jappix éč¦ä½ ęå®ęäŗå¼ęč½éå§å·„ä½ćč«ē¢ŗčŖäøåč¼øå
„ļ¼ęäæēé čØå¼ļ¼å°å¤§å¤ęøäŗŗä¾čŖŖęÆč¶³å¤ ēļ¼ć"
+
+msgid "Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."
+msgstr ""
+
+msgid "User"
+msgstr "ä½æēØč
"
+
+msgid "Service"
+msgstr "ęå"
+
+msgid "Service name"
+msgstr "ęååēر"
+
+msgid "Service description"
+msgstr "ęåčŖ¬ę"
+
+msgid "Connection"
+msgstr "é£ē·"
+
+msgid "Lock the host"
+msgstr "éå®äø»ę©"
+
+msgid "Anonymous mode"
+msgstr "åæåęØ”å¼"
+
+msgid "Registration allowed"
+msgstr "å
čرčØ»å"
+
+msgid "Use a proxy"
+msgstr "ä½æēØ代ēä¼ŗęåØ"
+
+msgid "Encryption"
+msgstr "å åÆ"
+
+msgid "HTTPS storage"
+msgstr "HTTPS å²åē©ŗé"
+
+msgid "Force HTTPS"
+msgstr "å¼·å¶ä½æēØ HTTPS"
+
+msgid "Compression"
+msgstr "å£ēø®"
+
+msgid "This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."
+msgstr ""
+
+msgid "Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."
+msgstr ""
+
+msgid "Main host"
+msgstr "äø»č¦äø»ę©"
+
+msgid "Groupchat host"
+msgstr "ē¾¤ēµč天äø»ę©"
+
+msgid "Anonymous host"
+msgstr "åæåäø»ę©"
+
+msgid "Directory host"
+msgstr "ē®éäø»ę©"
+
+msgid "BOSH host"
+msgstr "BOSH äø»ę©"
+
+msgid "You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."
+msgstr ""
+
+msgid "To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."
+msgstr ""
+
+msgid "After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."
+msgstr "åØä½ å®ęčØå®å¾ļ¼Jappix å°ē¢ēäøäŗåæ«åęŖę”ćå®ä¹čرęč²»ęļ¼åŖč½ēå°ęēØēØå¼é”Æē¤ŗäøäøč¦ęä»»ä½ęéć"
+
+msgid "Thanks for using Jappix!"
+msgstr "ęč¬ä½æēØ Jappixļ¼"
+
+msgid "Next"
+msgstr "äøäøé "
+
+msgid "Finish"
+msgstr "å®ę"
+
+msgid "Check again"
+msgstr "åęŖ¢ę„"
+
+msgid "The folder is not writable, set the right permissions to the %s directory."
+msgstr "č³ę夾äøåÆåÆ«å
„ļ¼čØå®ę£ē¢ŗę¬éč³ %s ē®éć"
+
+msgid "%s is installed on your system."
+msgstr "%s å·²ē¶å®č£åØä½ ēē³»ēµ±ć"
+
+msgid "%1s is not installed on your system, you should install %2s."
+msgstr "%1s ęŖå®č£åØä½ ēē³»ēµ±ļ¼ä½ éč¦å®č£ %2sć"
+
+msgid "PHP maximum upload size is sufficient (%s)."
+msgstr "PHP ę大äøå³å·²č¶³å¤ ļ¼%sļ¼ć"
+
+msgid "PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."
+msgstr "PHP ę大äøå³äøč¶³å¤ ļ¼%1sļ¼ļ¼ä½ åæ
é å®ē¾©å®ēŗ %2s åØ %3s äøć"
+
+msgid "Jappix manager"
+msgstr "Jappix ē®”ēå”"
+
+msgid "Manager access"
+msgstr "ē®”ēå”å
㌣"
+
+msgid "Statistics"
+msgstr "ēµ±čØ"
+
+msgid "Hosts"
+msgstr "äø»ę©"
+
+msgid "Design"
+msgstr "čØčØ"
+
+msgid "Repeat"
+msgstr "å ±å"
+
+msgid "All"
+msgstr "å
ØéØ"
+
+msgid "Horizontal"
+msgstr "ę°“å¹³"
+
+msgid "Vertical"
+msgstr "åē“"
+
+msgid "Center"
+msgstr "äø"
+
+msgid "Left"
+msgstr "å·¦"
+
+msgid "Right"
+msgstr "å³"
+
+msgid "Top"
+msgstr "äø"
+
+msgid "Bottom"
+msgstr "äø"
+
+msgid "Adapt"
+msgstr "é©ēØ"
+
+msgid "Color"
+msgstr "č²å½©"
+
+msgid "Users"
+msgstr "ä½æēØč
"
+
+msgid "Updates"
+msgstr "ę“ę°"
+
+msgid "This is a restricted area: only the authorized users can manage this Jappix node."
+msgstr "éęÆéå¶ååļ¼åŖęå¾å°ęę¬ēä½æēØč
åÆ仄ē®”ēę¤ Jappix ēÆé»ć"
+
+msgid "Please use the form below to login to the administration panel."
+msgstr "č«ä½æēØäøé¢ēč”Øå®ē»å
„ē®”ēé¢ęæć"
+
+msgid "To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."
+msgstr ""
+
+msgid "Credentials"
+msgstr "čŗ«ä»½čę"
+
+msgid "You have been logged out. Goodbye!"
+msgstr "ä½ å·²ē¶č¢«ē»åŗćåč¦ļ¼"
+
+msgid "Oops, you could not be recognized as a valid administrator. Check your credentials!"
+msgstr "ē³ē³ļ¼ä½ ē”ę³č¢«čŖēŗęÆęęēē®”ēå”ćęŖ¢ę„ä½ ēčŗ«ä»½čęļ¼"
+
+msgid "Basic statistics are processed by Jappix about some important things, you can find them below."
+msgstr "åŗę¬ēµ±čØęÆē± Jappix čēéę¼äøäŗéč¦äŗē©ļ¼ä½ åÆ仄åØäøé¢ę¾å°å®åć"
+
+msgid "Change your Jappix node configuration with this tool."
+msgstr "å©ēØę¤å·„å
·č®ę“ä½ ē Jappix ēÆé»čØå®ć"
+
+msgid "Change the XMPP hosts that this Jappix node serve with this tool."
+msgstr "å©ēØę¤å·„å
·č®ę“ę¤ Jappix ēÆé»ęåē XMPP äø»ę©ć"
+
+msgid "All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"
+msgstr "ęęę¤ Jappix ēÆé»å²åēęŖę”åÆå©ēØę¤å·„å
·ē®”ēļ¼č«éøååč³ę夾äøéå§ē·Øč¼Æå®ēå
§å®¹ļ¼"
+
+msgid "Jappix is fully customisable: you can change its design right here."
+msgstr "Jappix åÆå®å
ØčŖčØļ¼ä½ åÆ仄åØééč®ę“å®ēčØčØć"
+
+msgid "This is not a valid image, please use PNG, GIF or JPG!"
+msgstr "éäøęÆęęēå½±åļ¼č«ä½æēØ PNGćGIF ę JPGļ¼"
+
+msgid "The image could not be received, would you mind retry?"
+msgstr "å½±åē”ę³č¢«ę¶å°ļ¼ä½ ä»ęé試åļ¼"
+
+msgid "Your image was added to the list!"
+msgstr "ä½ ēå½±åå·²č¢«å å
„å°ęø
å®ļ¼"
+
+msgid "Changes saved!"
+msgstr "č®ę“å·²č¢«å²åļ¼"
+
+msgid "You can define more than one administrator for this Jappix node. You can also change a password with this tool."
+msgstr "ä½ åÆ仄ēŗę¤ Jappix ēÆé»å®ē¾©å¤ä½ē®”ēå”ćä½ ä¹åÆ仄å©ēØę¤å·„å
·č®ę“åÆē¢¼ć"
+
+msgid "Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."
+msgstr "å©ēØę¤å·„å
·ę“ę°ä½ ē Jappix ēÆé»ļ¼ęęŖ¢ę„ęÆå¦ęę°ēåÆēØćéę¼ęę°ēę¬ēč³čØä¹ęč¢«é”Æē¤ŗć"
+
+msgid "Access statistics"
+msgstr "ååēµ±čØ"
+
+msgid "Share statistics"
+msgstr "åäŗ«ēµ±čØ"
+
+msgid "Other statistics"
+msgstr "å
¶ä»ēµ±čØ"
+
+msgid "January"
+msgstr "1ę"
+
+msgid "February"
+msgstr "2ę"
+
+msgid "March"
+msgstr "3ę"
+
+msgid "April"
+msgstr "4ę"
+
+msgid "May"
+msgstr "5ę"
+
+msgid "June"
+msgstr "6ę"
+
+msgid "July"
+msgstr "7ę"
+
+msgid "August"
+msgstr "8ę"
+
+msgid "September"
+msgstr "9ę"
+
+msgid "October"
+msgstr "10ę"
+
+msgid "November"
+msgstr "11ę"
+
+msgid "December"
+msgstr "12ę"
+
+msgid "Monday"
+msgstr "ęęäø"
+
+msgid "Tuesday"
+msgstr "ęęäŗ"
+
+msgid "Wednesday"
+msgstr "ęęäø"
+
+msgid "Thursday"
+msgstr "ęęå"
+
+msgid "Friday"
+msgstr "ęęäŗ"
+
+msgid "Saturday"
+msgstr "ęęå
"
+
+msgid "Sunday"
+msgstr "ęęę„"
+
+msgid "Total"
+msgstr "åčØ"
+
+msgid "Cache"
+msgstr "åæ«å"
+
+msgid "Logs"
+msgstr "čØé"
+
+msgid "Music"
+msgstr "é³ęØ"
+
+msgid "Backgrounds"
+msgstr "čęÆ"
+
+msgid "Share"
+msgstr "åäŗ«"
+
+msgid "Background"
+msgstr "čęÆ"
+
+msgid "Notice"
+msgstr "éē„"
+
+msgid "Your design preferences have been saved!"
+msgstr "ä½ ēčØčØåå„½å·²č¢«å²åļ¼"
+
+msgid "Please check your inputs: something is missing!"
+msgstr "č«ęŖ¢ę„ä½ ēč¼øå
„ļ¼ę¼äŗęäŗę±č„æļ¼"
+
+msgid "Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"
+msgstr "å©ēØę¤å·„å
·č®ę“ä½ ē Jappix ēÆé»čęÆćä½ åÆ仄čØå®čŖčØč²å½©ęäøå³ēå½±åćéåŗä½ ēåµé åļ¼"
+
+msgid "Use default background"
+msgstr "ä½æēØé čØēčęÆ"
+
+msgid "Use your own image"
+msgstr "ä½æēØä½ čŖå·±ēå½±å"
+
+msgid "Select a background to use and change the display options."
+msgstr "éøåč¦ä½æēØēčęÆäø¦č®ę“é”Æē¤ŗéøé
ć"
+
+msgid "Use your own color"
+msgstr "ä½æēØä½ čŖå·±ēé”č²"
+
+msgid "Type the hexadecimal color value you want to use as a background."
+msgstr "č¼øå
„ä½ č¦ēØä¾ē¶ä½čęÆē 16 é²ä½č²å½©å¼ć"
+
+msgid "Manage backgrounds"
+msgstr "ē®”ēčęÆ"
+
+msgid "You can add a new background to the list with this tool. Please send a valid image."
+msgstr ""
+
+msgid "If you want to remove some backgrounds, use the browser below."
+msgstr ""
+
+msgid "Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."
+msgstr ""
+
+msgid "Simple notice"
+msgstr "ē°”å®éē„"
+
+msgid "This notice only needs simple text to be displayed, but no code is allowed!"
+msgstr ""
+
+msgid "Advanced notice"
+msgstr "é²ééē„"
+
+msgid "You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."
+msgstr ""
+
+msgid "Available updates"
+msgstr "åÆēØēę“ę°"
+
+msgid "What's new?"
+msgstr "ęä»éŗ¼ę°é®®ēļ¼"
+
+msgid "Your storage folders are not writable, please apply the good rights!"
+msgstr "ä½ ēå²åē©ŗéč³ę夾ē”ę³åÆ«å
„ļ¼č«å„ēØę£ē¢ŗę¬éļ¼"
+
+msgid "%1s may cause problems to the proxy, please increase %2s value up to %3s!"
+msgstr ""
+
+msgid "You are using a development version of Jappix. Update it through our repository by executing: %s."
+msgstr "ä½ ę£åØä½æēØéē¼ēę¬ē Jappixćå¾ęåēåę¾åę“ę°å®č«å·č”ļ¼%sć"
+
+msgid "A new Jappix version is available! Check what is new and launch the update!"
+msgstr "ęę°ēę¬ē Jappix åÆēØļ¼ęŖ¢ę„ęä»éŗ¼ę°ēäø¦ååę“ę°ļ¼"
+
+msgid "Your version is out to date. Update it now to %s by clicking here!"
+msgstr "ä½ ēēę¬å·²ē¶éęćåØę¤é»äøäø仄ä¾æē«å»ę“ę°ļ¼"
+
+msgid "Your version seems to be up to date, but you can check updates manually by clicking here."
+msgstr "ä½ ēēę¬ä¼¼ä¹ęÆęę°ēļ¼ä½ęÆä½ åÆ仄åØę¤é»äøäø仄ä¾æęåęŖ¢ę„ę“ę°ć"
+
+msgid "Check for updates"
+msgstr "ęŖ¢ę„ę“ę°"
+
+msgid "Update in progress"
+msgstr "ę“ę°ę£åØé²č”"
+
+msgid "Jappix has been updated: you are now running the latest version. Have fun!"
+msgstr "Jappix å·²ę“ę°ļ¼ä½ ē¾åØä½æēØēęÆęę°ēę¬ćē„ä½ ē©å¾ęåæ«ļ¼"
+
+msgid "The update has failed! Please try again later."
+msgstr "ę“ę°å¤±ęļ¼č«ēØå¾é試ć"
+
+msgid "Downloading package..."
+msgstr "ę£åØäøč¼å„件..."
+
+msgid "Removing current Jappix system files..."
+msgstr "åŖé¤ē®åē Jappix ē³»ēµ±ęŖę”..."
+
+msgid "Extracting package..."
+msgstr "ę£åØååŗå„件..."
+
+msgid "Regenerating storage folder tree..."
+msgstr "éę°ē¢ēå²åē©ŗéč³ę夾..."
+
+msgid "Jappix is now up to date!"
+msgstr "Jappix ē¾åØęÆęę°ēļ¼"
+
+msgid "Aborted: socket error!"
+msgstr "äøę¢ļ¼socket éÆčŖ¤ļ¼"
+
+msgid "Aborted: buffer error!"
+msgstr "äøę¢ļ¼ē·©č”åØéÆčŖ¤ļ¼"
+
+msgid "Aborted: everything is not writable!"
+msgstr "äøę¢ļ¼å
ØéØé½ē”ę³åÆ«å
„ļ¼"
+
+msgid "Aborted: could not extract the package!"
+msgstr "äøę¢ļ¼ē”ę³ååŗå„件ļ¼"
+
+msgid "Visits"
+msgstr "čØŖå"
+
+msgid "Daily"
+msgstr "ę„"
+
+msgid "Weekly"
+msgstr "é±"
+
+msgid "Monthly"
+msgstr "ę"
+
+msgid "Yearly"
+msgstr "幓"
+
+msgid "Size"
+msgstr "大å°"
+
+msgid "Clean everything"
+msgstr "å
ØéØęø
é¤"
+
+msgid "Purge cache"
+msgstr "ęø
é¤åæ«å"
+
+msgid "Purge logs"
+msgstr "ęø
é¤čØé"
+
+msgid "Purge updates"
+msgstr "ęø
é¤ę“ę°"
+
+msgid "The storage folder you wanted to clean is now empty!"
+msgstr "ä½ č¦ęø
é¤ēå²åē©ŗéč³ę夾ęÆē©ŗēļ¼"
+
+msgid "Keep your Jappix node fresh and fast, clean the storage folders regularly!"
+msgstr "äæęä½ ē Jappix ēÆé»ęø
ę°čåæ«éļ¼å®ęęø
é¤å²åē©ŗéč³ę夾ļ¼"
+
+msgid "Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"
+msgstr "äøå³ä½ ēé³ęØļ¼Ogg VorbisćMP3 ę WAVļ¼ä»„ä¾æåÆ仄åØ Jappix čč½ļ¼"
+
+msgid "The file you want to upload must be smaller than %s."
+msgstr "ä½ č¦äøå³ēęŖę”åæ
é å°ę¼ %sć"
+
+msgid "Stay tuned in what your users store on your server and remove undesired content with this tool."
+msgstr ""
+
+msgid "Title"
+msgstr "ęØé”"
+
+msgid "Artist"
+msgstr "čäŗŗ"
+
+msgid "Album"
+msgstr "å°č¼Æ"
+
+msgid "File"
+msgstr "ęŖę”"
+
+msgid "Upload"
+msgstr "äøå³"
+
+msgid "The folder is empty."
+msgstr "č³ę夾ęÆē©ŗēć"
+
+msgid "The music could not be received, please retry!"
+msgstr "é³ęØē”ę³č¢«ę¶å°ļ¼č«é試ļ¼"
+
+msgid "This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"
+msgstr "éäøęÆęęēé³ęØęŖę”ļ¼č«ēØ Ogg VorbisćMP3 ę WAV ē·Øē¢¼ļ¼"
+
+msgid "Your music has been added!"
+msgstr "ä½ ēé³ęØå·²č¢«å å
„ļ¼"
+
+msgid "The selected elements have been removed."
+msgstr "éøåēå
ē“ å·²č¢«åŖé¤ć"
+
+msgid "You must select elements to remove!"
+msgstr "ä½ åæ
é éøåč¦åŖé¤ēå
ē“ ļ¼"
+
+msgid "Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"
+msgstr "å©ēØę¤å·„å
·å å
„ę°ēä½æēØč
ļ¼ęč®ę“åÆē¢¼ļ¼č¼øå
„å·²ååØēä½æēØč
åēرļ¼ćč«č¼øå
„å®å
ØēåÆē¢¼ļ¼"
+
+msgid "Manage"
+msgstr "ē®”ē"
+
+msgid "List"
+msgstr "ęø
å®"
+
+msgid "Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."
+msgstr "å©ēØę¤å·„å
·åŖé¤ä½æēØč
ćę³Øęä½ äøč½åŖé¤å
åēé£äøä½ä½æēØč
ć"
+
+msgid "The user has been added!"
+msgstr "ä½æēØč
å·²č¢«å å
„ļ¼"
+
+msgid "The chosen users have been removed."
+msgstr "éøåēä½æēØč
å·²ē¶č¢«åŖé¤ć"
+
+msgid "You must select one or more users to be removed!"
+msgstr "ä½ åæ
é éøåäøęå¤ä½ä½æēØč
仄ä¾æåŖé¤ļ¼"
+
+msgid "Yesterday"
+msgstr "ęØę„"
+
+msgid "%s days ago"
+msgstr "%s ę„å"
+
+msgid "User currently active"
+msgstr "ä½æēØč
ē®åę“»åäø"
+
+msgid "Last seen: %s"
+msgstr "äøꬔč¦å°ļ¼%s"
+
+msgid "Inactive since: %s"
+msgstr "äøę“»åčŖļ¼%s"
+
+msgid "Your friend seems not to have received your message(s)!"
+msgstr "ä½ ē儽åä¼¼ä¹ę²ę¶å°ä½ ēčØęÆļ¼"
+
+msgid "Static content server"
+msgstr "éę
å
§å®¹ä¼ŗęåØ"
+
+msgid "This is the static content server for %1s, ā%2sā."
+msgstr "éęÆ %1s ēØēéę
å
§å®¹ä¼ŗęåØļ¼ā%2sāć"
+
+msgid "Suggested friends"
+msgstr "å»ŗč°ē儽å"
+
+msgid "Check all"
+msgstr "å
Øéø"
+
+msgid "Uncheck all"
+msgstr "åę¶å
Øéø"
+
+msgid "Choose"
+msgstr "éøå"
+
+msgid "List name"
+msgstr ""
+
+msgid "Allow"
+msgstr "å
čر"
+
+msgid "Deny"
+msgstr "ęēµ"
+
+msgid "Group"
+msgstr "ē¾¤ēµ"
+
+msgid "Subscription"
+msgstr "čØé±"
+
+msgid "Both"
+msgstr ""
+
+msgid "From"
+msgstr ""
+
+msgid "Everybody"
+msgstr "ęÆäøä½"
+
+msgid "Send messages"
+msgstr "å³éčØęÆ"
+
+msgid "Send queries"
+msgstr "å³éę„č©¢"
+
+msgid "See my status"
+msgstr "ēęēēę
"
+
+msgid "Send his/her status"
+msgstr "å³éä»ēēę
"
+
+msgid "Everything"
+msgstr ""
+
+msgid "Item"
+msgstr "é
ē®"
+
+msgid "Order"
+msgstr ""
+
+msgid "Active for this session"
+msgstr ""
+
+msgid "Always active"
+msgstr ""
+
+msgid "User directory"
+msgstr "ä½æēØč
ē®é"
+
+msgid "Search a friend"
+msgstr "ęå°å„½å"
+
+msgid "The feature requested is not implemented by the recipient or server and therefore cannot be processed."
+msgstr ""
+
+msgid "This is a repeat from %s"
+msgstr ""
+
+msgid "Loading comments..."
+msgstr "č¼å
„č©č«..."
+
+msgid "Type your comment here..."
+msgstr "åØę¤č¼øå
„ä½ ēč©č«..."
+
+msgid "Could not get the comments!"
+msgstr "ē”ę³åå¾č©č«ļ¼"
+
+msgid "Show comments"
+msgstr "é”Æē¤ŗč©č«"
+
+msgid "Send him/her a message"
+msgstr "å³éčØęÆēµ¦ä»"
+
+msgid "Start a chat with him/her"
+msgstr "éå§čä»č天"
+
+msgid "Media integration"
+msgstr ""
+
+msgid "Comments locked!"
+msgstr ""
+
+msgid "Type something you want to share with your friends..."
+msgstr ""
+
+msgid "changed his/her nickname to %s"
+msgstr ""
+
+msgid "commented an item you follow: ā%sā."
+msgstr ""
+
+msgid "Hide"
+msgstr ""
+
+msgid "liked your post: ā%sā."
+msgstr ""
+
+msgid "quoted you somewhere: ā%sā."
+msgstr ""
+
+msgid "published on your wall: ā%sā."
+msgstr ""
+
+msgid "tagged you in a photo (%s)."
+msgstr ""
+
+msgid "tagged you in a video (%s)."
+msgstr ""
+
+msgid "Show"
+msgstr ""
+
+msgid "Need help? You'd better read our documentation page about how to fill this form!"
+msgstr ""
+
+msgid "Pubsub host"
+msgstr ""
+
+msgid "Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+msgstr ""
+
+msgid "Manager link"
+msgstr ""
+
+msgid "User uploads server"
+msgstr ""
+
+msgid "This is the user uploads server for %1s, ā%2sā."
+msgstr ""
+
+msgid "Logo"
+msgstr ""
+
+msgid "You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"
+msgstr ""
+
+msgid "Upload each logo with the recommended maximum pixel size."
+msgstr ""
+
+msgid "This is not a valid image, please use the PNG format!"
+msgstr ""
+
+msgid "Your service logo has been successfully changed!"
+msgstr ""
+
+msgid "Your logo format must be PNG. Leave a field empty and the logo will not be changed."
+msgstr ""
+
+msgid "Remove this logo"
+msgstr ""
+
+msgid "View this logo"
+msgstr ""
+
+msgid "Send a file"
+msgstr ""
+
+msgid "Once uploaded, your friend will be prompted to download the file you sent."
+msgstr ""
+
+msgid "Groupchats to join"
+msgstr ""
+
+msgid "Purge sent files"
+msgstr ""
+
+msgid "would like to send you a file: ā%sā."
+msgstr ""
+
+msgid "has accepted to received your file: ā%sā."
+msgstr ""
+
+msgid "has rejected to receive your file: ā%sā."
+msgstr ""
+
+msgid "could not receive your file: ā%sā."
+msgstr ""
+
+msgid "has received a file exchange request: ā%sā."
+msgstr ""
+
+msgid "Available shortcuts:"
+msgstr ""
+
+msgid "%s removes the chat logs"
+msgstr ""
+
+msgid "%s joins a groupchat"
+msgstr ""
+
+msgid "%s closes the chat"
+msgstr ""
+
+msgid "%s shows the user profile"
+msgstr ""
+
+msgid "%s sends a message to the room"
+msgstr ""
+
+msgid "%s changes your nickname"
+msgstr ""
+
+msgid "%s sends a message to someone in the room"
+msgstr ""
+
+msgid "%s changes the room topic"
+msgstr ""
+
+msgid "%s kicks an user of the room"
+msgstr ""
+
+msgid "%s bans an user of the room"
+msgstr ""
+
+msgid "%s invites someone to join the room"
+msgstr ""
+
+msgid "Social channel, chat and more."
+msgstr ""
+
+msgid "Create your public profile."
+msgstr ""
+
+msgid "A mini-chat for your website."
+msgstr ""
+
+msgid "Get Jappix, get support."
+msgstr ""
+
+msgid "Statistics around Jappix."
+msgstr ""
+
+msgid "Download Jappix for free."
+msgstr ""
+
+msgid "Find a public Jappix node."
+msgstr ""
+
+msgid "Public profile"
+msgstr ""
+
+msgid "Your profile anywhere on the Web."
+msgstr ""
+
+msgid "%s is a Jappix.com service which makes your XMPP profile public. It is easier to share it. No XMPP account is required to view your social channel, your current position and your contact details."
+msgstr ""
+
+msgid "Furthermore, every picture you post in your social channel is added to a beautiful picture timeline. You can now view the pictures you shared year by year."
+msgstr ""
+
+msgid "You can also use your XMPP avatar as a single avatar for every website, blog and forum you use. When you change it on XMPP, the new avatar appears everywhere. What a genious improvement!"
+msgstr ""
+
+msgid "Yay, let's create my public profile!"
+msgstr ""
+
+msgid "Enable my public profile"
+msgstr ""
+
+#~ msgid "Jappix is a non-profit social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."
+#~ msgstr ""
+
+#~ msgid "See"
+#~ msgstr ""
+
+#~ msgid "Use default logo"
+#~ msgstr ""
+
+#~ msgid "Use your own logo"
+#~ msgstr ""
+
+#~ msgid "The recommended image format is PNG. Leave a field empty and the logo will not be changed."
+#~ msgstr ""
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the avatar upload PHP script for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 27/05/11
+
+*/
+
+// PHP base
+define('JAPPIX_BASE', '..');
+
+// Get the needed files
+require_once('./functions.php');
+require_once('./read-main.php');
+require_once('./read-hosts.php');
+
+// Optimize the page rendering
+hideErrors();
+compressThis();
+
+// Not allowed for a special node
+if(isStatic() || isUpload())
+ exit;
+
+// Set a special XML header
+header('Content-Type: text/xml; charset=utf-8');
+
+// No file uploaded?
+if((!isset($_FILES['file']) || empty($_FILES['file'])) || (!isset($_POST['id']) || empty($_POST['id'])))
+ exit(
+'<jappix xmlns=\'jappix:avatar:post\' id=\'0\'>
+ <error>bad-request</error>
+</jappix>'
+ );
+
+// Get the POST vars
+$id = $_POST['id'];
+$tmp_filename = $_FILES['file']['tmp_name'];
+$old_filename = $_FILES['file']['name'];
+
+// Get the file extension
+$ext = getFileExt($old_filename);
+
+// Hash it!
+$filename = md5($old_filename.time()).$ext;
+
+// Define some vars
+$path = JAPPIX_BASE.'/store/avatars/'.$filename;
+
+// Define MIME type
+if($ext == 'jpg')
+ $ext = 'jpeg';
+
+$mime = 'image/'.$ext;
+
+// Unsupported file extension?
+if(!preg_match('/^(jpeg|png|gif)$/i', $ext))
+ exit(
+'<jappix xmlns=\'jappix:avatar:post\' id=\''.$id.'\'>
+ <error>forbidden-type</error>
+</jappix>'
+ );
+
+// File upload error?
+if(!is_uploaded_file($tmp_filename) || !move_uploaded_file($tmp_filename, $path))
+ exit(
+'<jappix xmlns=\'jappix:file:post\' id=\''.$id.'\'>
+ <error>move-error</error>
+</jappix>'
+ );
+
+// Resize the image?
+if(!function_exists('gd_info') || resizeImage($path, $ext, 96, 96)) {
+ try {
+ // Encode the file
+ $binval = base64_encode(file_get_contents($path));
+
+ // Remove the file
+ unlink($path);
+
+ exit(
+'<jappix xmlns=\'jappix:file:post\' id=\''.$id.'\'>
+ <type>'.$mime.'</type>
+ <binval>'.$binval.'</binval>
+</jappix>'
+ );
+ }
+
+ catch(Exception $e) {
+ // Remove the file
+ unlink($path);
+
+ exit(
+'<jappix xmlns=\'jappix:file:post\' id=\''.$id.'\'>
+ <error>server-error</error>
+</jappix>'
+ );
+ }
+}
+
+// Remove the file
+unlink($path);
+
+// Something went wrong!
+exit(
+'<jappix xmlns=\'jappix:file:post\' id=\''.$id.'\'>
+ <error>service-unavailable</error>
+</jappix>'
+);
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the PHP BOSH proxy
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 15/01/12
+
+*/
+
+// PHP base
+define('JAPPIX_BASE', '..');
+
+// Get the configuration
+require_once('./functions.php');
+require_once('./read-main.php');
+require_once('./read-hosts.php');
+
+// Optimize the page rendering
+hideErrors();
+compressThis();
+
+// Not allowed?
+if(!BOSHProxy()) {
+ header('Status: 403 Forbidden', true, 403);
+ exit('HTTP/1.1 403 Forbidden');
+}
+
+// OPTIONS method?
+if($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
+ // CORS headers
+ header('Access-Control-Allow-Origin: *');
+ header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
+ header('Access-Control-Allow-Headers: Content-Type');
+ header('Access-Control-Max-Age: 31536000');
+
+ exit;
+}
+
+// Read POST content
+$data = file_get_contents('php://input');
+
+// POST method?
+if($data) {
+ // CORS headers
+ header('Access-Control-Allow-Origin: *');
+ header('Access-Control-Allow-Headers: Content-Type');
+
+ $method = 'POST';
+}
+
+// GET method?
+else if(isset($_GET['data']) && $_GET['data'] && isset($_GET['callback']) && $_GET['callback']) {
+ $method = 'GET';
+ $data = $_GET['data'];
+ $callback = $_GET['callback'];
+}
+
+// Invalid method?
+else {
+ header('Status: 400 Bad Request', true, 400);
+ exit('HTTP/1.1 400 Bad Request');
+}
+
+// HTTP headers
+$headers = array('User-Agent: Jappix (BOSH PHP Proxy)', 'Connection: close', 'Content-Type: text/xml; charset=utf-8', 'Content-Length: '.strlen($data));
+
+// CURL is better if available
+if(function_exists('curl_init'))
+ $use_curl = true;
+else
+ $use_curl = false;
+
+// CURL stream functions
+if($use_curl) {
+ // Initialize CURL
+ $connection = curl_init(HOST_BOSH);
+
+ // Set the CURL settings
+ curl_setopt($connection, CURLOPT_HEADER, 0);
+ curl_setopt($connection, CURLOPT_POST, 1);
+ curl_setopt($connection, CURLOPT_POSTFIELDS, $data);
+ curl_setopt($connection, CURLOPT_FOLLOWLOCATION, true);
+ curl_setopt($connection, CURLOPT_HTTPHEADER, $headers);
+ curl_setopt($connection, CURLOPT_VERBOSE, 0);
+ curl_setopt($connection, CURLOPT_CONNECTTIMEOUT, 30);
+ curl_setopt($connection, CURLOPT_TIMEOUT, 30);
+ curl_setopt($connection, CURLOPT_SSL_VERIFYHOST, 0);
+ curl_setopt($connection, CURLOPT_SSL_VERIFYPEER, 0);
+ curl_setopt($connection, CURLOPT_RETURNTRANSFER, 1);
+
+ // Get the CURL output
+ $output = curl_exec($connection);
+}
+
+// Built-in stream functions
+else {
+ // HTTP parameters
+ $parameters = array('http' => array(
+ 'method' => 'POST',
+ 'content' => $data
+ )
+ );
+
+ $parameters['http']['header'] = $headers;
+
+ // Change default timeout
+ ini_set('default_socket_timeout', 30);
+
+ // Create the connection
+ $stream = @stream_context_create($parameters);
+ $connection = @fopen(HOST_BOSH, 'rb', false, $stream);
+
+ // Failed to connect!
+ if($connection == false) {
+ header('Status: 502 Proxy Error', true, 502);
+ exit('HTTP/1.1 502 Proxy Error');
+ }
+
+ // Allow stream blocking to handle incoming BOSH data
+ @stream_set_blocking($connection, true);
+
+ // Get the output content
+ $output = @stream_get_contents($connection);
+}
+
+// Cache headers
+header('Cache-Control: no-cache, must-revalidate');
+header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
+
+// POST output
+if($method == 'POST') {
+ // XML header
+ header('Content-Type: text/xml; charset=utf-8');
+
+ if(!$output)
+ echo('<body xmlns=\'http://jabber.org/protocol/httpbind\' type=\'terminate\'/>');
+ else
+ echo($output);
+}
+
+// GET output
+if($method == 'GET') {
+ // JSON header
+ header('Content-type: application/json');
+
+ // Encode output to JSON
+ $json_output = json_encode($output);
+
+ if(($output == false) || ($output == '') || ($json_output == 'null'))
+ echo($callback.'({"reply":"<body xmlns=\'http:\/\/jabber.org\/protocol\/httpbind\' type=\'terminate\'\/>"});');
+ else
+ echo($callback.'({"reply":'.$json_output.'});');
+}
+
+// Close the connection
+if($use_curl)
+ curl_close($connection);
+else
+ @fclose($connection);
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the Jappix Desktop PHP/HTML code
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 16/01/12
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+?>
+<!DOCTYPE html>
+<?php htmlTag($locale); ?>
+
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+ <title><?php echo htmlspecialchars(SERVICE_NAME); ?> • <?php _e("An open social network"); ?></title>
+ <link rel="shortcut icon" href="./favicon.ico" />
+
+ <?php echoGetFiles($hash, '', 'css', 'desktop.xml', ''); echo "\n"; ?>
+ <!--[if lt IE 9]><?php echoGetFiles($hash, '', 'css', '', 'ie.css'); ?><![endif]-->
+
+ <?php echoGetFiles($hash, $locale, 'js', 'desktop.xml', ''); echo "\n";
+
+ if(anonymousMode()) {
+ echo "\n\t";
+ echoGetFiles($hash, '', 'css', 'anonymous.xml', '');
+ echo "\n\t";
+ echoGetFiles($hash, $locale, 'js', 'anonymous.xml', '');
+ echo "\n";
+ } ?>
+</head>
+
+<body class="body-images">
+
+<?php
+
+// Homepage?
+if(!anonymousMode()) { ?>
+ <!-- BEGIN HOMEPAGE -->
+ <div id="home">
+ <div class="home-images plane"></div>
+
+ <div class="main">
+ <div class="left">
+ <div class="home-images logo"></div>
+ <p class="upper"><?php _e("Communicate with the entire world!"); ?></p>
+ <p class="secondary"><?php _e("Jappix is a great social platform, that you can access wherever you are, whenever you want and communicate with whovever you want."); ?></p>
+ <p class="secondary"><?php _e("It allows you to get in touch with the millions of users who currently use the XMPP network like you do with Jappix. Join the community and stay free!"); ?></p>
+ </div>
+
+ <div class="right">
+ <h1 class="top default"><?php _e("Hi there!"); ?></h1>
+
+ <div class="default homediv">
+ <p><?php printf(T_("Welcome on %1s, ā%2sā."), htmlspecialchars(SERVICE_NAME), htmlspecialchars(SERVICE_DESC)); ?></p>
+
+ <p><?php _e("Login to your existing XMPP account or create a new one for free!"); ?></p>
+
+ <button class="login buttons-images">
+ <span class="home-images"></span>
+ <span class="text"><?php _e("Login"); ?></span>
+ </button>
+
+ <button class="register buttons-images">
+ <span class="home-images"></span>
+ <span class="text"><?php _e("Register"); ?></span>
+ </button>
+
+ <p class="notice"><?php echo str_replace("PostPro", "<a href='http://www.post-pro.fr/'>PostPro</a>", T_("Jappix is an open-source project from PostPro, a non-profit organization which provides us a great help.")); ?></p>
+ </div>
+
+ <div class="navigation">
+ <?php
+
+ // Keep get var
+ $keep_get = keepGet('m', false);
+
+ ?>
+ <a class="home-images mobile" href="./?m=mobile<?php echo $keep_get; ?>"><?php _e("Mobile"); ?></a>
+ <?php if(showManagerLink()) { ?>
+ <a class="home-images manager" href="./?m=manager<?php echo $keep_get; ?>"><?php _e("Manager"); ?></a>
+ <?php } ?>
+ <a class="home-images project" href="https://project.jappix.com/"><?php _e("Project"); ?></a>
+ <?php if(sslCheck() && !httpsForce()) echo sslLink(); ?>
+ </div>
+ </div>
+ </div>
+
+ <div class="home-images corporation">
+ <div class="corp_network">
+ <h2 class="nomargin">Jappix.com</h2>
+ <div class="tabulate">
+ <a href="https://www.jappix.com/">
+ <span class="name">Jappix</span>
+ <span class="desc"><?php _e("Social channel, chat and more."); ?></span>
+ </a>
+ <a href="https://me.jappix.com/">
+ <span class="name">Jappix Me</span>
+ <span class="desc"><?php _e("Create your public profile."); ?></span>
+ </a>
+ <a href="https://mini.jappix.com/">
+ <span class="name">Jappix Mini</span>
+ <span class="desc"><?php _e("A mini-chat for your website."); ?></span>
+ </a>
+ <a href="https://project.jappix.com/">
+ <span class="name">Jappix Project</span>
+ <span class="desc"><?php _e("Get Jappix, get support."); ?></span>
+ </a>
+ <a href="https://stats.jappix.com/">
+ <span class="name">Jappix Stats</span>
+ <span class="desc"><?php _e("Statistics around Jappix."); ?></span>
+ </a>
+ </div>
+
+ <h2>Jappix.org</h2>
+ <div class="tabulate">
+ <a href="http://jappix.org/">
+ <span class="name">Jappix Download</span>
+ <span class="desc"><?php _e("Download Jappix for free."); ?></span>
+ </a>
+ </div>
+
+ <h2>Jappix.net</h2>
+ <div class="tabulate">
+ <a href="http://jappix.net/">
+ <span class="name">Jappix Network</span>
+ <span class="desc"><?php _e("Find a public Jappix node."); ?></span>
+ </a>
+ </div>
+ </div>
+ </div>
+
+ <div class="locale" data-keepget="<?php echo(keepGet('l', false)); ?>">
+ <div class="current">
+ <div class="current_align"><?php echo(getLanguageName($locale)); ?></div>
+ </div>
+ </div>
+
+ <?php
+
+ // Add the notice
+ $conf_notice = readNotice();
+ $type_notice = $conf_notice['type'];
+ $text_notice = $conf_notice['notice'];
+
+ // Simple notice
+ if(($type_notice == 'simple') || ($type_notice == 'advanced')) {
+ // We must encode special HTML characters
+ if($type_notice == 'simple')
+ $text_notice = '<span class="title home-images">'.T_("Notice").'</span><span class="text">'.htmlentities($text_notice).'</span>';
+
+ // Echo the notice
+ echo('<div class="notice '.$type_notice.'">'.$text_notice.'</div>');
+ }
+
+ ?>
+ </div>
+ <!-- END HOMEPAGE -->
+<?php } ?>
+
+<!-- BEGIN BOARD -->
+<div id="board">
+ <noscript class="one-board info visible"><?php _e("JavaScript is missing in your web browser, so that you will not be able to launch Jappix! Please fix this."); ?></noscript>
+</div>
+<!-- END BOARD -->
+
+</body>
+
+</html>
+
+<!-- Jappix <?php echo $version; ?> - An open social platform -->
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the PHP script used to download a chat log
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 27/05/11
+
+*/
+
+// PHP base
+define('JAPPIX_BASE', '..');
+
+// Get the needed files
+require_once('./functions.php');
+require_once('./read-main.php');
+require_once('./read-hosts.php');
+
+// Optimize the page rendering
+hideErrors();
+compressThis();
+
+// Not allowed for a special node
+if(isStatic() || isUpload())
+ exit;
+
+// Send the HTML file to be downloaded
+if(isset($_GET['id']) && !empty($_GET['id']) && isSafe($_GET['id'])) {
+ // We define the variables
+ $filename = $_GET['id'];
+ $content_dir = '../store/logs/';
+ $filepath = $content_dir.$filename.'.html';
+
+ // We set special headers
+ header("Content-disposition: attachment; filename=\"$filename.html\"");
+ header("Content-Type: application/force-download");
+ header("Content-Transfer-Encoding: text/html\n");
+ header("Content-Length: ".filesize($filepath));
+ header("Pragma: no-cache");
+ header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
+ header("Expires: 0");
+ readfile($filepath);
+
+ // We delete the stored log file
+ unlink($filepath);
+}
+
+?>
--- /dev/null
+<?php
+
+// Extracted from CodingTeam for the Jappix project.
+
+// This file is a part of CodingTeam. Take a look at <http://codingteam.org>.
+// Copyright Ā© 2007-2010 Erwan Briand <erwan@codingteam.net>
+//
+// This program is free software: you can redistribute it and/or modify it
+// under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, version 3 only.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
+// License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * @file
+ * This file contains the DrawSVGChart class.
+ */
+
+/**
+ * DrawSVGChart class
+ */
+class DrawSVGChart {
+ private $datas, $legend, $link, $xml_object, $svg,
+ $xml_elements, $evolution;
+ public $has_errors;
+
+ function createChart($datas=array(), $legend=array(), $link,
+ $evolution=FALSE, $type='others')
+ {
+ $this->has_errors = FALSE;
+ $max = 0;
+
+ // One or two data arrays
+ if (isset($datas[0]) && is_array($datas[0]))
+ {
+ $datas_number = count($datas[0]);
+
+ if ($datas_number >= 1)
+ $max = max($datas[0]);
+ else
+ $this->has_errors = TRUE;
+ }
+ else
+ {
+ $datas_number = count($datas);
+
+ if ($datas_number >= 1)
+ $max = max($datas);
+ else
+ $this->has_errors = TRUE;
+ }
+
+ // Set the width of the chart
+ if ($datas_number * 55 > 400)
+ $width = $datas_number * 55;
+ else
+ $width = 400;
+
+ $height = 250;
+ $this->datas = $datas;
+ $this->legend = $legend;
+ $this->link = $link;
+ $this->evolution = $evolution;
+ $this->type = $type;
+ $this->xml_elements = array();
+
+ // Scale
+ if ($max <= 20)
+ {
+ $scale[4] = 20;
+ $scale[3] = 15;
+ $scale[2] = 10;
+ $scale[1] = 5;
+ }
+ else
+ {
+ $scale[4] = ceil($max / 20) * 20;
+ $scale[3] = $scale[4] * 3/4;
+ $scale[2] = $scale[4] * 2/4;
+ $scale[1] = $scale[4] * 1/4;
+ }
+
+ if ($scale[4] == 0 || $max == 0)
+ $this->has_errors = TRUE;
+
+ if ($this->has_errors)
+ return TRUE;
+
+ $this->xml_object = new DOMDocument('1.0', 'utf-8');
+
+ // Process the static file host prefix
+ $static_prefix = '.';
+
+ if(hasStatic())
+ $static_prefix = HOST_STATIC.'/php';
+
+ // Add the stylesheet
+ $style = $this->xml_object->createProcessingInstruction("xml-stylesheet",
+ "type='text/css' href='".getFiles(genHash(getVersion()), '', 'css', '', 'stats-svg.css')."'");
+ $this->xml_object->appendChild($style);
+
+ // Create the root SVG element
+ $this->svg = $this->xml_object->createElement('svg');
+ $this->svg->setAttribute('xmlns:svg', 'http://www.w3.org/2000/svg');
+ $this->svg->setAttribute('xmlns', 'http://www.w3.org/2000/svg');
+ $this->svg->setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');
+ $this->svg->setAttribute('version', '1.1');
+ $this->svg->setAttribute('width', $width);
+ $this->svg->setAttribute('height', $height);
+ $this->svg->setAttribute('id', 'svg');
+ $this->xml_object->appendChild($this->svg);
+
+ // Create a definition
+ $this->xml_elements['basic_defs'] = $this->xml_object->createElement('defs');
+ $path = $this->xml_object->createElement('path');
+ $path->setAttribute('id', 'mark');
+ $path->setAttribute('d', 'M 0,234 v 4 ');
+ $path->setAttribute('stroke', '#596171');
+ $path->setAttribute('stroke-width', '2px');
+ $this->xml_elements['basic_defs']->appendChild($path);
+
+ // Create the static background
+ $this->xml_elements['static_background'] = $this->xml_object->createElement('g');
+ $this->xml_elements['static_background']->setAttribute('class', 'static-background');
+
+ // Draw the legend
+ $this->drawLegend();
+
+ // Draw the table
+ $this->drawTable($scale, $width);
+
+ // Draw the chart
+ $this->drawChart($scale, $width);
+ }
+
+ function drawLegend()
+ {
+ $pstart = 3;
+ $tstart = 7;
+
+ foreach ($this->legend as $item)
+ {
+ $val_path = $pstart + 11;
+ $val_text = $tstart + 10;
+
+ // Create the legend line
+ $path = $this->xml_object->createElement('path');
+ $path->setAttribute('d', 'M 40, '.$val_path.' L 55, '.$val_path);
+ $path->setAttribute('id', 'legendline');
+ $path->setAttribute('stroke', $item[0]);
+ $path->setAttribute('stroke-width', '2px');
+
+ // Create the legend text
+ $text = $this->xml_object->createElement('text', $item[1]);
+ $text->setAttribute('x', 57);
+ $text->setAttribute('y', $val_text);
+ $text->setAttribute('text-anchor', 'start');
+ $text->setAttribute('id', 'reftext');
+ $text->setAttribute('fill', $item[0]);
+ $text->setAttribute('font-size', '11px');
+ $text->setAttribute('font-family', "'DejaVu sans', Verdana, sans-serif");
+
+ // Append elemets
+ $this->xml_elements['static_background']->appendChild($path);
+ $this->xml_elements['static_background']->appendChild($text);
+
+ $pstart = $val_path;
+ $tstart = $val_text;
+ }
+ }
+
+ function drawTable($scale, $width)
+ {
+ // Create left scale
+ $top = TRUE;
+ $start = -17;
+
+ foreach ($scale as $level)
+ {
+ $type = $this->type;
+
+ if(($type == 'share') || ($type == 'others'))
+ $level = formatBytes($level);
+
+ if ($top)
+ $color = '#CED0D5';
+ else
+ $color = '#EAEAEA';
+
+ $m = $start + 50;
+
+ $path = $this->xml_object->createElement('path');
+ $path->setAttribute('d', 'M 38, '.$m.' L '.$width.', '.$m);
+ $path->setAttribute('stroke', $color);
+ $path->setAttribute('stroke-width', '1px');
+
+ $text = $this->xml_object->createElement('text', $level);
+ $text->setAttribute('x', 34);
+ $text->setAttribute('y', ($m + 3));
+ $text->setAttribute('text-anchor', 'end');
+ $text->setAttribute('class', 'refleft');
+
+ $this->xml_elements['static_background']->appendChild($path);
+ $this->xml_elements['static_background']->appendChild($text);
+
+ $top = FALSE;
+ $start = $m;
+ }
+
+ // Add zero
+ $text = $this->xml_object->createElement('text', 0);
+ $text->setAttribute('x', 34);
+ $text->setAttribute('y', 236);
+ $text->setAttribute('text-anchor', 'end');
+ $text->setAttribute('class', 'refleft');
+
+ $this->xml_elements['static_background']->appendChild($text);
+ }
+
+ function drawChart($scale, $width)
+ {
+ if (isset($this->datas[0]) && is_array($this->datas[0]))
+ {
+ $foreached_datas = $this->datas[0];
+ $onlykeys_datas = array_keys($this->datas[0]);
+ $secondary_datas = array_keys($this->datas[1]);
+ }
+ else
+ {
+ $foreached_datas = $this->datas;
+ $onlykeys_datas = array_keys($this->datas);
+ $secondary_datas = FALSE;
+ }
+
+ // Create graphics data
+ $defs = $this->xml_object->createElement('defs');
+
+ $rect = $this->xml_object->createElement('rect');
+ $rect->setAttribute('id', 'focusbar');
+ $rect->setAttribute('width', 14);
+ $rect->setAttribute('height', 211);
+ $rect->setAttribute('x', -20);
+ $rect->setAttribute('y', 34);
+ $rect->setAttribute('style', 'fill: black; opacity: 0;');
+ $defs->appendChild($rect);
+
+ $path = $this->xml_object->createElement('path');
+ $path->setAttribute('id', 'bubble');
+
+ if ($this->evolution)
+ $path->setAttribute('d', 'M 4.7871575,0.5 L 39.084404,0.5 C 41.459488,0.5 43.371561,2.73 43.371561,5.5 L 43.371561,25.49999 L 43.30,31.05 L 4.7871575,30.49999 C 2.412072,30.49999 0.5,28.26999 0.5,25.49999 L 0.5,5.5 C 0.5,2.73 2.412072,0.5 4.7871575,0.5 z');
+ elseif ($secondary_datas)
+ $path->setAttribute('d', 'M 1,0 v 8 l -6,-10 c -1.5,-2 -1.5,-2 -6,-2 h -36 c -3,0 -6,-3 -6,-6 v -28 c 0,-3 3,-6 6,-6 h 43 c 3,0 6,3 6,6 z');
+ else
+ $path->setAttribute('d', 'M 4.7871575,0.5 L 39.084404,0.5 C 41.459488,0.5 43.371561,2.73 43.371561,5.5 L 43.371561,25.49999 C 43.371561,27.07677 43.83887,41.00777 42.990767,40.95796 C 42.137828,40.90787 37.97451,30.49999 36.951406,30.49999 L 4.7871575,30.49999 C 2.412072,30.49999 0.5,28.26999 0.5,25.49999 L 0.5,5.5 C 0.5,2.73 2.412072,0.5 4.7871575,0.5 z');
+
+ $path->setAttribute('fill', 'none');
+ $path->setAttribute('fill-opacity', '0.85');
+ $path->setAttribute('pointer-events', 'none');
+ $path->setAttribute('stroke-linejoin', 'round');
+ $path->setAttribute('stroke', 'none');
+ $path->setAttribute('stroke-opacity', '0.8');
+ $path->setAttribute('stroke-width', '1px');
+ $defs->appendChild($path);
+
+ $rect = $this->xml_object->createElement('rect');
+ $rect->setAttribute('id', 'graphicbar');
+ $rect->setAttribute('width', '12');
+ $rect->setAttribute('height', '200');
+ $rect->setAttribute('rx', '2');
+ $rect->setAttribute('ry', '1');
+ $rect->setAttribute('fill', '#6C84C0');
+ $rect->setAttribute('fill-opacity', '0.6');
+ $rect->setAttribute('stroke', '#5276A9');
+ $rect->setAttribute('stroke-width', '1px');
+ $defs->appendChild($rect);
+
+ $rect = $this->xml_object->createElement('rect');
+ $rect->setAttribute('style', 'fill:#8B2323');
+ $rect->setAttribute('id', 'rectpoint');
+ $rect->setAttribute('width', 4);
+ $rect->setAttribute('height', 4);
+ $defs->appendChild($rect);
+
+ $this->xml_elements['chart_defs'] = $defs;
+ $global_g = $this->xml_object->createElement('g');
+
+ // Calc
+ $x_base = 35;
+ $y_base = 20;
+ $start = 18;
+ $element = 0;
+
+ $chart_defs = '';
+ $xprevious = 38;
+ $tprevious = 233;
+
+ foreach ($foreached_datas as $key => $data)
+ {
+ $x = 27 + $x_base;
+ $y = 107 + $y_base;
+
+ $top = 233 - ceil($data / ($scale[4] / 100) * 2);
+
+ if ($top <= 50)
+ $bubble_top = 55;
+ elseif (!$secondary_datas)
+ $bubble_top = ($top - 42);
+ elseif ($secondary_datas)
+ $bubble_top = ($top - 10);
+
+ $type = $this->type;
+
+ if(($type == 'share') || ($type == 'others'))
+ $value = formatBytes($data);
+ else
+ $value = $data;
+
+ // Create the chart with datas
+ $g = $this->xml_object->createElement('g');
+ $g->setAttribute('transform', 'translate('.$x.')');
+
+ $duse = $this->xml_object->createElement('use');
+ $duse->setAttribute('xlink:href', '#mark');
+ $duse->setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');
+ $g->appendChild($duse);
+
+ $data_g = $this->xml_object->createElement('g');
+ $data_g->setAttribute('class', 'gbar');
+
+ if ($this->link)
+ {
+ $text = $this->xml_object->createElement('text');
+
+ $link = $this->xml_object->createElement('a', mb_substr(filterSpecialXML($onlykeys_datas[$element]), 0, 7));
+ $link->setAttribute('xlink:href', str_replace('{data}', filterSpecialXML($onlykeys_datas[$element]), $this->link));
+ $link->setAttribute('target', '_main');
+ $text->appendChild($link);
+ }
+ else
+ $text = $this->xml_object->createElement('text', mb_substr(filterSpecialXML($onlykeys_datas[$element]), 0, 7));
+
+ $text->setAttribute('class', 'reftext');
+ $text->setAttribute('y', 248);
+ $text->setAttribute('text-anchor', 'middle');
+
+ $data_g->appendChild($text);
+
+ $uselink = $this->xml_object->createElement('use');
+ $uselink->setAttribute('xlink:href', '#focusbar');
+ $uselink->setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');
+ $data_g->appendChild($uselink);
+
+ if (!$this->evolution)
+ {
+ $rect = $this->xml_object->createElement('rect');
+ $rect->setAttribute('class', 'bluebar');
+ $rect->setAttribute('height', (233 - $top));
+ $rect->setAttribute('width', 13);
+ $rect->setAttribute('x', -6);
+ $rect->setAttribute('y', $top);
+ $rect->setAttribute('fill', $this->legend[0][0]);
+ $rect->setAttribute('fill-opacity', '0.6');
+ $data_g->appendChild($rect);
+ }
+ else
+ {
+ $use = $this->xml_object->createElement('use');
+ $use->setAttribute('xlink:href', '#rectpoint');
+ $use->setAttribute('y', ($top - 1));
+ $use->setAttribute('x', -2);
+ $data_g->appendChild($use);
+
+ if ($x != (35 + 27))
+ $chart_defs .= 'L '.$x.' '.$top.' ';
+ else
+ $chart_defs .= 'M '.$xprevious.' '.$tprevious.' L '.$x.' '.$top.' ';
+
+ $xprevious = $x;
+ $tprevious = $top;
+ }
+
+ if ($secondary_datas && isset($secondary_datas[$element]))
+ {
+ $datalink = $secondary_datas[$element];
+ $dataval = $this->datas[1][$datalink];
+ $stop = 233 - ceil($dataval / ($scale[4] / 100) * 2);
+
+ $rect = $this->xml_object->createElement('rect');
+ $rect->setAttribute('class', 'redbar');
+ $rect->setAttribute('height', (233 - $stop));
+ $rect->setAttribute('width', 13);
+ $rect->setAttribute('x', -6);
+ $rect->setAttribute('y', $stop);
+ $rect->setAttribute('fill', $this->legend[1][0]);
+ $rect->setAttribute('fill-opacity', '0.7');
+ $data_g->appendChild($rect);
+ }
+
+ if (!$this->evolution)
+ {
+ $path = $this->xml_object->createElement('path');
+ $path->setAttribute('stroke', '#5276A9');
+ $path->setAttribute('stroke-width', '2px');
+ $path->setAttribute('fill', 'none');
+ $path->setAttribute('d', 'M -7,233 v -'.(232 - $top).' c 0,-1 1,-1 1,-1 h 12 c 1,0 2,0 2,1 v '.(232 - $top).' z');
+ $data_g->appendChild($path);
+ }
+
+ $uselink = $this->xml_object->createElement('use');
+ $uselink->setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');
+ $uselink->setAttribute('xlink:href', '#bubble');
+ $uselink->setAttribute('y', $bubble_top);
+
+ if (!$secondary_datas)
+ $uselink->setAttribute('x', -42);
+
+ $data_g->appendChild($uselink);
+
+ $text = $this->xml_object->createElement('text', $value);
+ $text->setAttribute('class', 'bubbletextblue');
+ $text->setAttribute('x', -10);
+
+ if (!$secondary_datas)
+ $text->setAttribute('y', ($bubble_top + 20));
+ else
+ $text->setAttribute('y', ($bubble_top - 27));
+
+ $text->setAttribute('fill', 'none');
+ $data_g->appendChild($text);
+
+ if ($secondary_datas && isset($secondary_datas[$element]))
+ {
+ $text = $this->xml_object->createElement('text', $dataval);
+ $text->setAttribute('class', 'bubbletextred');
+ $text->setAttribute('x', -10);
+ $text->setAttribute('y', ($bubble_top - 11));
+ $text->setAttribute('fill', 'none');
+ $data_g->appendChild($text);
+ }
+
+ $g->appendChild($data_g);
+ $global_g->appendChild($g);
+
+ $x_base = $x_base + 50;
+ $y_base = $y_base + 20;
+ $element ++;
+ }
+
+ if ($this->evolution)
+ {
+ $path = $this->xml_object->createElement('path');
+ $path->setAttribute('d', $chart_defs);
+ $path->setAttribute('stroke', $this->legend[0][0]);
+ $path->setAttribute('stroke-width', '1px');
+ $path->setAttribute('fill', 'none');
+ $this->xml_elements['evolution_path'] = $path;
+ }
+
+ $this->xml_elements['global_g'] = $global_g;
+
+ $path = $this->xml_object->createElement('path');
+ $path->setAttribute('d', 'M 38,233 h '.$width);
+ $path->setAttribute('stroke', '#2F4F77');
+ $path->setAttribute('stroke-width', '2px');
+ $path->setAttribute('pointer-events', 'none');
+ $this->xml_elements['final_path'] = $path;
+ }
+
+ function has_errors()
+ {
+ return $this->has_errors;
+ }
+
+ function getXMLOutput()
+ {
+ if (isset($this->xml_object))
+ {
+ // Add SVG elements to the DOM object
+ foreach($this->xml_elements as $element)
+ $this->svg->appendChild($element);
+
+ // Return the XML
+ $this->xml_object->formatOutput = true;
+ return $this->xml_object->saveXML();
+ }
+ }
+}
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the Jappix microblog file attaching script
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 14/01/12
+
+*/
+
+// PHP base
+define('JAPPIX_BASE', '..');
+
+// Get the needed files
+require_once('./functions.php');
+require_once('./read-main.php');
+require_once('./read-hosts.php');
+
+// Optimize the page rendering
+hideErrors();
+compressThis();
+
+// Not allowed for a special node
+if(isStatic() || isUpload())
+ exit;
+
+// Set a special XML header
+header('Content-Type: text/xml; charset=utf-8');
+
+// Everything is okay
+if((isset($_FILES['file']) && !empty($_FILES['file'])) && (isset($_POST['user']) && !empty($_POST['user'])) && (isset($_POST['location']) && !empty($_POST['location']))) {
+ // Get the user name
+ $user = $_POST['user'];
+
+ // Get the file name
+ $tmp_filename = $_FILES['file']['tmp_name'];
+ $filename = $_FILES['file']['name'];
+
+ // Get the location
+ if(HOST_UPLOAD)
+ $location = HOST_UPLOAD;
+ else
+ $location = $_POST['location'];
+
+ // Get the file new name
+ $ext = getFileExt($filename);
+ $new_name = preg_replace('/(^)(.+)(\.)(.+)($)/i', '$2', $filename);
+
+ // Define some vars
+ $content_dir = JAPPIX_BASE.'/store/share/'.$user;
+ $security_file = $content_dir.'/index.html';
+ $name = sha1(time().$filename);
+ $path = $content_dir.'/'.$name.'.'.$ext;
+ $thumb_xml = '';
+
+ // Forbidden file?
+ if(!isSafe($filename) || !isSafe($name.'.'.$ext)) {
+ exit(
+'<jappix xmlns=\'jappix:file:post\'>
+ <error>forbidden-type</error>
+</jappix>'
+ );
+ }
+
+ // Create the user directory
+ if(!is_dir($content_dir)) {
+ mkdir($content_dir, 0777, true);
+ chmod($content_dir, 0777);
+ }
+
+ // Create (or re-create) the security file
+ if(!file_exists($security_file))
+ file_put_contents($security_file, securityHTML());
+
+ // File upload error?
+ if(!is_uploaded_file($tmp_filename) || !move_uploaded_file($tmp_filename, $path)) {
+ exit(
+'<jappix xmlns=\'jappix:file:post\'>
+ <error>move-error</error>
+</jappix>'
+ );
+ }
+
+ // Resize and compress if this is a JPEG file
+ if(preg_match('/^(jpg|jpeg|png|gif)$/i', $ext)) {
+ // Resize the image
+ resizeImage($path, $ext, 1024, 1024);
+
+ // Copy the image
+ $thumb = $content_dir.'/'.$name.'_thumb.'.$ext;
+ copy($path, $thumb);
+
+ // Create the thumbnail
+ if(resizeImage($thumb, $ext, 140, 105))
+ $thumb_xml = '<thumb>'.htmlspecialchars($location.'store/share/'.$user.'/'.$name.'_thumb.'.$ext).'</thumb>';
+ }
+
+ // Return the path to the file
+ exit(
+'<jappix xmlns=\'jappix:file:post\'>
+ <href>'.htmlspecialchars($location.'store/share/'.$user.'/'.$name.'.'.$ext).'</href>
+ <title>'.htmlspecialchars($new_name).'</title>
+ <type>'.htmlspecialchars(getFileMIME($path)).'</type>
+ <length>'.htmlspecialchars(filesize($path)).'</length>
+ '.$thumb_xml.'
+</jappix>'
+ );
+}
+
+// Bad request error!
+exit(
+'<jappix xmlns=\'jappix:file:post\'>
+ <error>bad-request</error>
+</jappix>'
+);
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the hosts configuration form (install & manager)
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 11/06/11
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+?>
+<a class="info smallspace neutral" href="http://codingteam.net/project/jappix/doc/JappixApp#title-3" target="_blank"><?php _e("Need help? You'd better read our documentation page about how to fill this form!"); ?></a>
+
+<fieldset>
+ <legend><?php _e("General"); ?></legend>
+
+ <label for="host_main"><?php _e("Main host"); ?></label><input id="host_main" type="text" name="host_main" value="<?php echo $host_main; ?>" pattern="[^@/]+" />
+
+ <label for="host_muc"><?php _e("Groupchat host"); ?></label><input id="host_muc" type="text" name="host_muc" value="<?php echo $host_muc; ?>" pattern="[^@/]+" />
+
+ <label for="host_pubsub"><?php _e("Pubsub host"); ?></label><input id="host_pubsub" type="text" name="host_pubsub" value="<?php echo $host_pubsub; ?>" pattern="[^@/]+" />
+</fieldset>
+
+<fieldset>
+ <legend><?php _e("Advanced"); ?></legend>
+
+ <label for="host_anonymous"><?php _e("Anonymous host"); ?></label><input id="host_anonymous" type="text" name="host_anonymous" value="<?php echo $host_anonymous; ?>" pattern="[^@/]+" />
+
+ <label for="host_vjud"><?php _e("Directory host"); ?></label><input id="host_vjud" type="text" name="host_vjud" value="<?php echo $host_vjud; ?>" pattern="[^@/]+" />
+
+ <label for="host_bosh"><?php _e("BOSH host"); ?></label><input id="host_bosh" type="text" name="host_bosh" value="<?php echo $host_bosh; ?>" />
+
+ <input type="hidden" name="host_bosh_main" value="<?php echo $host_bosh_main; ?>" />
+
+ <input type="hidden" name="host_bosh_mini" value="<?php echo $host_bosh_mini; ?>" />
+
+ <input type="hidden" name="host_static" value="<?php echo $host_static; ?>" />
+
+ <input type="hidden" name="host_upload" value="<?php echo $host_upload; ?>" />
+</fieldset>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the main configuration form (install & manager)
+
+-------------------------------------------------
+
+License: AGPL
+Authors: Vanaryon, LinkMauve
+Last revision: 26/08/11
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+// Checks the checkboxes which are set "on"
+$checked = ' checked=""';
+
+// Host locking
+if($lock_host == 'on')
+ $check_lock_host = $checked;
+else
+ $check_lock_host = '';
+
+// Anonymous mode
+if($anonymous_mode == 'on')
+ $check_anonymous_mode = $checked;
+else
+ $check_anonymous_mode = '';
+
+// Registration
+if($registration == 'on')
+ $check_registration = $checked;
+else
+ $check_registration = '';
+
+// BOSH proxy
+if($bosh_proxy == 'on')
+ $check_bosh_proxy = $checked;
+else
+ $check_bosh_proxy = '';
+
+// Manager link
+if($manager_link == 'on')
+ $check_manager_link = $checked;
+else
+ $check_manager_link = '';
+
+// Encryption
+if($encryption == 'on')
+ $check_encryption = $checked;
+else
+ $check_encryption = '';
+
+// HTTPS storage
+if($https_storage == 'on')
+ $check_https_storage = $checked;
+else
+ $check_https_storage = '';
+
+// Force HTTPS
+if($https_force == 'on')
+ $check_https_force = $checked;
+else
+ $check_https_force = '';
+
+// Compression
+if($compression == 'on')
+ $check_compression = $checked;
+else
+ $check_compression = '';
+
+?>
+
+<a class="info smallspace neutral" href="http://codingteam.net/project/jappix/doc/JappixApp#title-2" target="_blank"><?php _e("Need help? You'd better read our documentation page about how to fill this form!"); ?></a>
+
+<fieldset>
+ <legend><?php _e("Service"); ?></legend>
+
+ <label for="service_name"><?php _e("Service name"); ?></label><input id="service_name" type="text" name="service_name" value="<?php echo $service_name; ?>" maxlength="14" />
+
+ <label for="service_desc"><?php _e("Service description"); ?></label><input id="service_desc" type="text" name="service_desc" value="<?php echo $service_desc; ?>" maxlength="30" />
+</fieldset>
+
+<fieldset>
+ <legend><?php _e("Connection"); ?></legend>
+
+ <label for="jappix_resource"><?php _e("Resource"); ?></label><input id="jappix_resource" type="text" name="jappix_resource" value="<?php echo $jappix_resource; ?>" maxlength="1023" />
+
+ <label for="lock_host"><?php _e("Lock the host"); ?></label><input id="lock_host" type="checkbox" name="lock_host"<?php echo $check_lock_host; ?> />
+
+ <label for="anonymous_mode"><?php _e("Anonymous mode"); ?></label><input id="anonymous_mode" type="checkbox" name="anonymous_mode"<?php echo $check_anonymous_mode; ?> />
+
+ <label for="registration"><?php _e("Registration allowed"); ?></label><input id="registration" type="checkbox" name="registration"<?php echo $check_registration; ?> />
+
+ <label for="bosh_proxy"><?php _e("Use a proxy"); ?></label><input id="bosh_proxy" type="checkbox" name="bosh_proxy"<?php echo $check_bosh_proxy; ?> />
+</fieldset>
+
+<fieldset>
+ <legend><?php _e("Others"); ?></legend>
+
+ <label for="manager_link"><?php _e("Manager link"); ?></label><input id="manager_link" type="checkbox" name="manager_link"<?php echo $check_manager_link; ?> />
+
+ <label for="groupchats_join"><?php _e("Groupchats to join"); ?></label><input id="groupchats_join" type="text" name="groupchats_join" value="<?php echo $groupchats_join; ?>" placeholder="postpro@muc.jappix.com, mini@muc.jappix.com" />
+</fieldset>
+
+<fieldset>
+ <legend><?php _e("Advanced"); ?></legend>
+
+ <label for="encryption"><?php _e("Encryption"); ?></label><input id="encryption" type="checkbox" name="encryption"<?php echo $check_encryption; ?> />
+
+ <label for="https_storage"><?php _e("HTTPS storage"); ?></label><input id="https_storage" type="checkbox" name="https_storage"<?php echo $check_https_storage; ?> />
+
+ <label for="https_force"><?php _e("Force HTTPS"); ?></label><input id="https_force" type="checkbox" name="https_force"<?php echo $check_https_force; ?> />
+
+ <label for="compression"><?php _e("Compression"); ?></label><input id="compression" type="checkbox" name="compression"<?php echo $check_compression; ?> />
+
+ <input type="hidden" name="multi_files" value="<?php echo $multi_files; ?>" />
+
+ <input type="hidden" name="developer" value="<?php echo $developer; ?>" />
+</fieldset>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the user add form (install & manager)
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 08/05/11
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+?>
+
+<fieldset>
+ <legend><?php _e("New"); ?></legend>
+
+ <label for="user_name"><?php _e("User"); ?></label><input id="user_name" class="icon <?php echo($form_parent); ?>-images" type="text" name="user_name" value="<?php echo(htmlspecialchars($user_name)); ?>" maxlength="30" />
+
+ <label for="user_password"><?php _e("Password"); ?></label><input id="user_password" class="icon <?php echo($form_parent); ?>-images" type="password" name="user_password" maxlength="40" />
+
+ <label for="user_repassword"><?php _e("Confirm"); ?></label><input id="user_repassword" class="icon <?php echo($form_parent); ?>-images" type="password" name="user_repassword" maxlength="40" />
+</fieldset>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+These are the PHP functions for Jappix Get API
+
+-------------------------------------------------
+
+License: AGPL
+Authors: Vanaryon, Mathieui, olivierm
+Last revision: 26/08/11
+
+*/
+
+// The function to get the cached content
+function readCache($hash) {
+ return file_get_contents(JAPPIX_BASE.'/store/cache/'.$hash.'.cache');
+}
+
+// The function to generate a cached file
+function genCache($string, $mode, $cache) {
+ if(!$mode) {
+ $cache_dir = JAPPIX_BASE.'/store/cache';
+ $file_put = $cache_dir.'/'.$cache.'.cache';
+
+ // Cache not yet wrote
+ if(is_dir($cache_dir) && !file_exists($file_put))
+ file_put_contents($file_put, $string);
+ }
+}
+
+// The function to remove the BOM from a string
+function rmBOM($string) {
+ if(substr($string, 0, 3) == pack('CCC', 0xef, 0xbb, 0xbf))
+ $string = substr($string, 3);
+
+ return $string;
+}
+
+// The function to compress the CSS
+function compressCSS($buffer) {
+ // We remove the comments
+ $buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer);
+
+ // We remove the useless spaces
+ $buffer = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $buffer);
+
+ // We remove the last useless spaces
+ $buffer = str_replace(array(' { ',' {','{ '), '{', $buffer);
+ $buffer = str_replace(array(' } ',' }','} '), '}', $buffer);
+ $buffer = str_replace(array(' : ',' :',': '), ':', $buffer);
+
+ return $buffer;
+}
+
+// The function to replace classical path to get.php paths
+function setPath($string, $hash, $host, $type, $locale) {
+ // Initialize the static server path
+ $static = '.';
+
+ // Replace the JS strings
+ if($type == 'js') {
+ // Static host defined
+ if($host && ($host != '.'))
+ $static = $host;
+
+ // Links to JS (must have a lang parameter)
+ $string = preg_replace('/((\")|(\'))(\.\/)(js)(\/)(\S+)(js)((\")|(\'))/', '$1'.$static.'/php/get.php?h='.$hash.'&l='.$locale.'&t=$5&f=$7$8$9', $string);
+
+ // Other "normal" links (no lang parameter)
+ $string = preg_replace('/((\")|(\'))(\.\/)(css|img|store|snd)(\/)(\S+)(css|png|jpg|jpeg|gif|bmp|ogg|oga)((\")|(\'))/', '$1'.$static.'/php/get.php?h='.$hash.'&t=$5&f=$7$8$9', $string);
+ }
+
+ // Replace the CSS strings
+ else if($type == 'css') {
+ // Static host defined
+ if($host && ($host != '.'))
+ $static = $host.'/php';
+
+ $string = preg_replace('/(\(\.\.\/)(css|js|img|store|snd)(\/)(\S+)(css|js|png|jpg|jpeg|gif|bmp|ogg|oga)(\))/', '('.$static.'/get.php?h='.$hash.'&t=$2&f=$4$5)', $string);
+ }
+
+ return $string;
+}
+
+// The function to set the good translation to a JS file
+function setTranslation($string) {
+ return preg_replace('/_e\("([^\"\"]+)"\)/e', "'_e(\"'.addslashes(T_gettext(stripslashes('$1'))).'\")'", $string);
+}
+
+// The function to set the good locales
+function setLocales($string, $locale) {
+ // Generate the two JS array list
+ $available_list = availableLocales($locale);
+ $available_id = '';
+ $available_names = '';
+
+ // Add the values to the arrays
+ foreach($available_list as $current_id => $current_name) {
+ $available_id .= '\''.$current_id.'\', ';
+ $available_names .= '\''.addslashes($current_name).'\', ';
+ }
+
+ // Remove the last comma
+ $regex = '/(.+), $/';
+ $available_id = preg_replace($regex, '$1', $available_id);
+ $available_names = preg_replace($regex, '$1', $available_names);
+
+ // Locales array
+ $array = array(
+ 'LOCALES_AVAILABLE_ID' => $available_id,
+ 'LOCALES_AVAILABLE_NAMES' => $available_names
+ );
+
+ // Apply it!
+ foreach($array as $array_key => $array_value)
+ $string = preg_replace('/(var '.$array_key.'(( )?=( )?)new Array\()(\);)/', '$1'.$array_value.'$5', $string);
+
+ return $string;
+}
+
+// The function to set the good configuration to a JS file
+function setConfiguration($string, $locale, $version, $max_upload) {
+ // Special BOSH URL if BOSH proxy enabled
+ if(BOSHProxy())
+ $bosh_special = staticLocation().'php/bosh.php';
+ else
+ $bosh_special = HOST_BOSH;
+
+ // Configuration array
+ $array = array(
+ // xml:lang
+ 'XML_LANG' => $locale,
+
+ // Jappix parameters
+ 'JAPPIX_STATIC' => staticLocation(),
+ 'JAPPIX_VERSION' => $version,
+ 'JAPPIX_MAX_FILE_SIZE' => $max_upload,
+ 'JAPPIX_MAX_UPLOAD' => formatBytes($max_upload),
+
+ // Main configuration
+ 'SERVICE_NAME' => SERVICE_NAME,
+ 'SERVICE_DESC' => SERVICE_DESC,
+ 'JAPPIX_RESOURCE' => JAPPIX_RESOURCE,
+ 'LOCK_HOST' => LOCK_HOST,
+ 'ANONYMOUS' => ANONYMOUS,
+ 'REGISTRATION' => REGISTRATION,
+ 'BOSH_PROXY' => BOSH_PROXY,
+ 'MANAGER_LINK' => MANAGER_LINK,
+ 'GROUPCHATS_JOIN' => GROUPCHATS_JOIN,
+ 'ENCRYPTION' => ENCRYPTION,
+ 'HTTPS_STORAGE' => HTTPS_STORAGE,
+ 'HTTPS_FORCE' => HTTPS_FORCE,
+ 'COMPRESSION' => COMPRESSION,
+ 'MULTI_FILES' => MULTI_FILES,
+ 'DEVELOPER' => DEVELOPER,
+
+ // Hosts configuration
+ 'HOST_MAIN' => HOST_MAIN,
+ 'HOST_MUC' => HOST_MUC,
+ 'HOST_PUBSUB' => HOST_PUBSUB,
+ 'HOST_VJUD' => HOST_VJUD,
+ 'HOST_ANONYMOUS' => HOST_ANONYMOUS,
+ 'HOST_BOSH' => $bosh_special,
+ 'HOST_BOSH_MAIN' => HOST_BOSH_MAIN,
+ 'HOST_BOSH_MINI' => HOST_BOSH_MINI,
+ 'HOST_STATIC' => HOST_STATIC,
+ 'HOST_UPLOAD' => HOST_UPLOAD
+ );
+
+ // Apply it!
+ foreach($array as $array_key => $array_value)
+ $string = preg_replace('/var '.$array_key.'(( )?=( )?)null;/', 'var '.$array_key.'$1\''.addslashes($array_value).'\';', $string);
+
+ return $string;
+}
+
+// The function to set the logos
+function setLogos($string, $files) {
+ // Jappix Desktop home logo?
+ if(in_array('home.css', $files) && file_exists(JAPPIX_BASE.'/store/logos/desktop_home.png')) {
+ $string .=
+'#home .left .logo {
+ background-image: url(../store/logos/desktop_home.png) !important;
+ background-position: center center !important;
+}';
+ }
+
+ // Jappix Desktop app logo?
+ if(in_array('tools.css', $files) && file_exists(JAPPIX_BASE.'/store/logos/desktop_app.png')) {
+ $string .=
+'#top-content .tools-logo {
+ background-image: url(../store/logos/desktop_app.png) !important;
+ background-position: center center !important;
+}';
+ }
+
+ // Jappix Mobile logo?
+ if(in_array('mobile.css', $files) && file_exists(JAPPIX_BASE.'/store/logos/mobile.png')) {
+ $string .=
+'.header div {
+ background-image: url(../store/logos/mobile.png) !important;
+ background-position: center center !important;
+}';
+ }
+
+ // Jappix Mini logo?
+ if(in_array('mini.css', $files) && file_exists(JAPPIX_BASE.'/store/logos/mini.png')) {
+ $string .=
+'#jappix_mini div.jm_actions a.jm_logo {
+ background-image: url(../store/logos/mini.png) !important;
+ background-position: center center !important;
+}';
+ }
+
+ return $string;
+}
+
+// The function to set the background
+function setBackground($string) {
+ // Get the default values
+ $array = defaultBackground();
+
+ // Read the background configuration
+ $xml = readXML('conf', 'background');
+
+ if($xml) {
+ $read = new SimpleXMLElement($xml);
+
+ foreach($read->children() as $child) {
+ // Any value?
+ if($child)
+ $array[$child->getName()] = $child;
+ }
+ }
+
+ $css = '';
+
+ // Generate the CSS code
+ switch($array['type']) {
+ // Image
+ case 'image':
+ $css .=
+ "\n".' background-image: url(../store/backgrounds/'.urlencode($array['image_file']).');
+ background-repeat: '.$array['image_repeat'].';
+ background-position: '.$array['image_horizontal'].' '.$array['image_vertical'].';
+ background-color: '.$array['image_color'].';'
+ ;
+
+ // Add CSS code to adapt the image?
+ if($array['image_adapt'] == 'on')
+ $css .=
+ ' background-attachment: fixed;
+ background-size: cover;
+ -moz-background-size: cover;
+ -webkit-background-size: cover;';
+
+ $css .= "\n";
+
+ break;
+
+ // Color
+ case 'color':
+ $css .= "\n".' background-color: '.$array['color_color'].';'."\n";
+
+ break;
+
+ // Default: use the filtering regex
+ default:
+ $css .= '$3';
+
+ break;
+ }
+
+ // Apply the replacement!
+ return preg_replace('/(\.body-images( )?\{)([^\{\}]+)(\})/i', '$1'.$css.'$4', $string);
+}
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+These are the PHP functions for Jappix manager
+
+-------------------------------------------------
+
+License: AGPL
+Authors: Vanaryon, Mathieui, olivierm, Vinilox
+Last revision: 15/01/12
+
+*/
+
+// The function to check an user is admin
+function isAdmin($user, $password) {
+ // Read the users.xml file
+ $array = getUsers();
+
+ // No data?
+ if(empty($array))
+ return false;
+
+ // Our user is set and valid?
+ if(isset($array[$user]) && ($array[$user] == $password))
+ return true;
+
+ // Not authorized
+ return false;
+}
+
+// Checks if a file is a valid image
+function isImage($file) {
+ // This is an image
+ if(preg_match('/^(.+)(\.)(png|jpg|jpeg|gif|bmp)$/i', $file))
+ return true;
+
+ return false;
+}
+
+// Puts a marker on the current opened manager tab
+function currentTab($current, $page) {
+ if($current == $page)
+ echo ' class="tab-active"';
+}
+
+// Checks all the storage folders are writable
+function storageWritable() {
+ // Read the directory content
+ $dir = JAPPIX_BASE.'/store/';
+ $scan = scandir($dir);
+
+ // Writable marker
+ $writable = true;
+
+ // Check that each folder is writable
+ foreach($scan as $current) {
+ // Current folder
+ $folder = $dir.$current;
+
+ // A folder is not writable?
+ if(!preg_match('/^\.(.+)/', $current) && !is_writable($folder)) {
+ // Try to change the folder rights
+ chmod($folder, 0777);
+
+ // Check it again!
+ if(!is_writable($folder))
+ $writable = false;
+ }
+ }
+
+ return $writable;
+}
+
+// Removes a given directory (with all sub-elements)
+function removeDir($dir) {
+ // Can't open the dir
+ if(!$dh = @opendir($dir))
+ return;
+
+ // Loop the current dir to remove its content
+ while(false !== ($obj = readdir($dh))) {
+ // Not a "real" directory
+ if(($obj == '.') || ($obj == '..'))
+ continue;
+
+ // Not a file, remove this dir
+ if(!@unlink($dir.'/'.$obj))
+ removeDir($dir.'/'.$obj);
+ }
+
+ // Close the dir and remove it!
+ closedir($dh);
+ @rmdir($dir);
+}
+
+// Copies a given directory (with all sub-elements)
+function copyDir($source, $destination) {
+ // This is a directory
+ if(is_dir($source)) {
+ // Create the target directory
+ @mkdir($destination);
+ $directory = dir($source);
+
+ // Append the source directory content into the target one
+ while(FALSE !== ($readdirectory = $directory->read())) {
+ if(($readdirectory == '.') || ($readdirectory == '..'))
+ continue;
+
+ $PathDir = $source.'/'.$readdirectory;
+
+ // Recursive copy
+ if(is_dir($PathDir)) {
+ copyDir($PathDir, $destination.'/'.$readdirectory);
+
+ continue;
+ }
+
+ copy($PathDir, $destination.'/'.$readdirectory);
+ }
+
+ // Close the source directory
+ $directory->close();
+ }
+
+ // This is a file
+ else
+ copy($source, $destination);
+}
+
+// Gets the total size of a directory
+function sizeDir($dir) {
+ $size = 0;
+
+ foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)) as $file)
+ $size += $file->getSize();
+
+ return $size;
+}
+
+// Set the good unity for a size in bytes
+function numericToMonth($id) {
+ $array = array(
+ 1 => T_("January"),
+ 2 => T_("February"),
+ 3 => T_("March"),
+ 4 => T_("April"),
+ 5 => T_("May"),
+ 6 => T_("June"),
+ 7 => T_("July"),
+ 8 => T_("August"),
+ 9 => T_("September"),
+ 10 => T_("October"),
+ 11 => T_("November"),
+ 12 =>T_( "December")
+ );
+
+ return $array[$id];
+}
+
+// Extracts the version number with a version ID
+function versionNumber($id) {
+ // First, extract the number string from the [X]
+ $extract = preg_replace('/^(.+)\[(\S+)\]$/', '$2', $id);
+ $dev = false;
+
+ // Second extract: ~ (when this is a special version, like ~dev)
+ if(strrpos($extract, '~') !== false) {
+ $dev = true;
+ $extract = preg_replace('/^([^~])~(.+)$/', '$1', $extract);
+ }
+
+ // Convert [X.X.X] into a full number
+ $extract = preg_replace('/[^0-9]/', '', $extract);
+
+ // Add missing items to [X.X.X]
+ $missing = 3 - strlen($extract.'');
+ if($missing > 0)
+ $extract = $extract.(str_repeat('0', $missing));
+
+ // Allows updates for dev versions
+ if($dev)
+ $extract = $extract - 1;
+
+ return intval($extract);
+}
+
+// Checks for new Jappix updates
+function newUpdates($force) {
+ // No need to check if developer mode
+ if(isDeveloper())
+ return false;
+
+ $cache_path = JAPPIX_BASE.'/store/updates/version.xml';
+
+ // No cache, obsolete one or refresh forced
+ if(!file_exists($cache_path) || (file_exists($cache_path) && (time() - (filemtime($cache_path)) >= 86400)) || $force) {
+ // Get the content
+ $last_version = read_url('http://codingteam.net/project/jappix/upload/briefcase/version.xml');
+
+ // Write the content
+ file_put_contents($cache_path, $last_version);
+ }
+
+ // Read from the cache
+ else
+ $last_version = file_get_contents($cache_path);
+
+ // Parse the XML
+ $xml = @simplexml_load_string($last_version);
+
+ // No data?
+ if($xml === FALSE)
+ return false;
+
+ // Get the version numbers
+ $current_version = getVersion();
+ $last_version = $xml->id;
+
+ // Check if we have the latest version
+ $current_version = versionNumber($current_version);
+ $last_version = versionNumber($last_version);
+
+ if($current_version < $last_version)
+ return true;
+
+ return false;
+}
+
+// Gets the Jappix update informations
+function updateInformations() {
+ // Get the XML file content
+ $data = file_get_contents(JAPPIX_BASE.'/store/updates/version.xml');
+
+ // Transform the XML content into an array
+ $array = array();
+
+ // No XML?
+ if(!$data)
+ return $array;
+
+ $xml = new SimpleXMLElement($data);
+
+ // Parse the XML to add it to the array
+ foreach($xml->children() as $this_child) {
+ // Get the node name
+ $current_name = $this_child->getName();
+
+ // Push it to the array, with a basic HTML encoding
+ $array[$current_name] = str_replace('\n', '<br />', $this_child);
+ }
+
+ // Return this array
+ return $array;
+}
+
+// Processes the Jappix update from an external package
+function processUpdate($url) {
+ // Archive path
+ $name = md5($url).'.zip';
+ $update_dir = $dir_base.'store/updates/';
+ $path = JAPPIX_BASE.'/store/updates/'.$name;
+ $extract_to = $update_dir.'jappix/';
+ $store_tree = JAPPIX_BASE.'/php/store-tree.php';
+
+ // We must get the archive from the server
+ if(!file_exists($path)) {
+ echo('<p>Ā» '.T_("Downloading package...").'</p>');
+
+ // Open the packages
+ $local = fopen($path, 'w');
+ $remote = fopen($url, 'r');
+
+ // Could not open a socket?!
+ if(!$remote) {
+ echo('<p>Ā» '.T_("Aborted: socket error!").'</p>');
+
+ // Remove the broken local archive
+ unlink($path);
+
+ return false;
+ }
+
+ // Read the file
+ while(!feof($remote)) {
+ // Get the buffer
+ $buffer = fread($remote, 1024);
+
+ // Any error?
+ if($buffer == 'Error.') {
+ echo('<p>Ā» '.T_("Aborted: buffer error!").'</p>');
+
+ // Remove the broken local archive
+ unlink($path);
+
+ return false;
+ }
+
+ // Write the buffer to the file
+ fwrite($local, $buffer);
+
+ // Flush the current buffer
+ ob_flush();
+ flush();
+ }
+
+ // Close the files
+ fclose($local);
+ fclose($remote);
+ }
+
+ // Then, we extract the archive
+ echo('<p>Ā» '.T_("Extracting package...").'</p>');
+
+ try {
+ $zip = new ZipArchive;
+ $zip_open = $zip->open($path);
+
+ if($zip_open === TRUE) {
+ $zip->extractTo($update_dir);
+ $zip->close();
+ }
+
+ else {
+ echo('<p>Ā» '.T_("Aborted: could not extract the package!").'</p>');
+
+ // Remove the broken source folder
+ removeDir($to_remove);
+
+ return false;
+ }
+ }
+
+ // PHP does not provide Zip archives support
+ catch(Exception $e) {
+ echo('<p>Ā» '.T_("Aborted: could not extract the package!").'</p>');
+
+ // Remove the broken source folder
+ removeDir($to_remove);
+
+ return false;
+ }
+
+ // Remove the ./store dir from the source directory
+ removeDir($extract_to.'store/');
+
+ // Then, we remove the Jappix system files
+ echo('<p>Ā» '.T_("Removing current Jappix system files...").'</p>');
+
+ // Open the general directory
+ $dir_base = JAPPIX_BASE.'/';
+ $scan = scandir($dir_base);
+
+ // Filter the scan array
+ $scan = array_diff($scan, array('.', '..', '.svn', 'store'));
+
+ // Check all the files are writable
+ foreach($scan as $scanned) {
+ // Element path
+ $scanned_current = $dir_base.$scanned;
+
+ // Element not writable
+ if(!is_writable($scanned_current)) {
+ // Try to change the element rights
+ chmod($scanned_current, 0777);
+
+ // Check it again!
+ if(!is_writable($scanned_current)) {
+ echo('<p>Ā» '.T_("Aborted: everything is not writable!").'</p>');
+
+ return false;
+ }
+ }
+ }
+
+ // Process the files deletion
+ foreach($scan as $current) {
+ $to_remove = $dir_base.$current;
+
+ // Remove folders
+ if(is_dir($to_remove))
+ removeDir($to_remove);
+
+ // Remove files
+ else
+ unlink($to_remove);
+ }
+
+ // Move the extracted files to the base
+ copyDir($extract_to, $dir_base);
+
+ // Remove the source directory
+ removeDir($extract_to);
+
+ // Regenerates the store tree
+ if(file_exists($store_tree)) {
+ echo('<p>Ā» '.T_("Regenerating storage folder tree...").'</p>');
+
+ // Call the special regeneration script
+ include($store_tree);
+ }
+
+ // Remove the version package
+ unlink($path);
+
+ // The new version is now installed!
+ echo('<p>Ā» '.T_("Jappix is now up to date!").'</p>');
+
+ return true;
+}
+
+// Returns an array with the biggest share folders
+function shareStats() {
+ // Define some stuffs
+ $path = JAPPIX_BASE.'/store/share/';
+ $array = array();
+
+ // Open the directory
+ $scan = scandir($path);
+
+ // Loop the share files
+ foreach($scan as $current) {
+ if(is_dir($path.$current) && !preg_match('/^(\.(.+)?)$/i', $current))
+ array_push($array, $current);
+ }
+
+ return $array;
+}
+
+// Returns the largest share folders
+function largestShare($array, $number) {
+ // Define some stuffs
+ $path = JAPPIX_BASE.'/store/share/';
+ $size_array = array();
+
+ // Push the results in an array
+ foreach($array as $current)
+ $size_array[$current] = sizeDir($path.$current);
+
+ // Sort this array
+ arsort($size_array);
+
+ // Select the first biggest values
+ $size_array = array_slice($size_array, 0, $number);
+
+ return $size_array;
+}
+
+// Returns the others statistics array
+function otherStats() {
+ // Fill the array with the values
+ $others_stats = array(
+ T_("Backgrounds") => sizeDir(JAPPIX_BASE.'/store/backgrounds/'),
+ T_("Cache") => sizeDir(JAPPIX_BASE.'/store/cache/'),
+ T_("Logs") => sizeDir(JAPPIX_BASE.'/store/logs/'),
+ T_("Music") => sizeDir(JAPPIX_BASE.'/store/music/'),
+ T_("Share") => sizeDir(JAPPIX_BASE.'/store/share/'),
+ T_("Send") => sizeDir(JAPPIX_BASE.'/store/send/'),
+ T_("Updates") => sizeDir(JAPPIX_BASE.'/store/updates/')
+ );
+
+ // Sort this array
+ arsort($others_stats);
+
+ return $others_stats;
+}
+
+// Gets the array of the visits stats
+function getVisits() {
+ // New array
+ $array = array(
+ 'total' => 0,
+ 'daily' => 0,
+ 'weekly' => 0,
+ 'monthly' => 0,
+ 'yearly' => 0
+ );
+
+ // Read the data
+ $data = readXML('access', 'total');
+
+ // Any data?
+ if($data) {
+ // Initialize the visits reading
+ $xml = new SimpleXMLElement($data);
+
+ // Get the XML values
+ $array['total'] = intval($xml->total);
+ $array['stamp'] = intval($xml->stamp);
+
+ // Get the age of the stats
+ $age = time() - $array['stamp'];
+
+ // Generate the time-dependant values
+ $timed = array(
+ 'daily' => 86400,
+ 'weekly' => 604800,
+ 'monthly' => 2678400,
+ 'yearly' => 31536000
+ );
+
+ foreach($timed as $timed_key => $timed_value) {
+ if($age >= $timed_value)
+ $array[$timed_key] = intval($array['total'] / ($age / $timed[$timed_key])).'';
+ else
+ $array[$timed_key] = $array['total'].'';
+ }
+ }
+
+ return $array;
+}
+
+// Gets the array of the monthly visits
+function getMonthlyVisits() {
+ // New array
+ $array = array();
+
+ // Read the data
+ $data = readXML('access', 'months');
+
+ // Get the XML file values
+ if($data) {
+ // Initialize the visits reading
+ $xml = new SimpleXMLElement($data);
+
+ // Loop the visit elements
+ foreach($xml->children() as $child) {
+ // Get the current month ID
+ $current_id = intval(preg_replace('/month_([0-9]+)/i', '$1', $child->getName()));
+
+ // Get the current month name
+ $current_name = numericToMonth($current_id);
+
+ // Push it!
+ $array[$current_name] = intval($child);
+ }
+ }
+
+ return $array;
+}
+
+// Purges the target folder content
+function purgeFolder($folder) {
+ // Array of the folders to purge
+ $array = array();
+
+ // We must purge all the folders?
+ if($folder == 'everything')
+ array_push($array, 'cache', 'logs', 'send', 'updates');
+ else
+ array_push($array, $folder);
+
+ // All right, now we can empty it!
+ foreach($array as $current_folder) {
+ // Scan the current directory
+ $directory = JAPPIX_BASE.'/store/'.$current_folder.'/';
+ $scan = scandir($directory);
+ $scan = array_diff($scan, array('.', '..', '.svn', 'index.html'));
+
+ // Process the files deletion
+ foreach($scan as $current) {
+ $remove_this = $directory.$current;
+
+ // Remove folders
+ if(is_dir($remove_this))
+ removeDir($remove_this);
+
+ // Remove files
+ else
+ unlink($remove_this);
+ }
+ }
+}
+
+// Returns folder browsing informations
+function browseFolder($folder, $mode) {
+ // Scan the target directory
+ $directory = JAPPIX_BASE.'/store/'.$folder;
+ $scan = scandir($directory);
+ $scan = array_diff($scan, array('.', '..', '.svn', 'index.html'));
+ $keep_get = keepGet('(s|b|k)', false);
+
+ // Odd/even marker
+ $marker = 'odd';
+
+ // Not in the root folder: show previous link
+ if(strpos($folder, '/') != false) {
+ // Filter the folder name
+ $previous_folder = substr($folder, 0, strrpos($folder, '/'));
+
+ echo('<div class="one-browse previous manager-images"><a href="./?b='.$mode.'&s='.urlencode($previous_folder).$keep_get.'">'.T_("Previous").'</a></div>');
+ }
+
+ // Empty or non-existing directory?
+ if(!count($scan) || !is_dir($directory)) {
+ echo('<div class="one-browse '.$marker.' alert manager-images">'.T_("The folder is empty.").'</div>');
+
+ return false;
+ }
+
+ // Echo the browsing HTML code
+ foreach($scan as $current) {
+ // Generate the item path$directory
+ $path = $directory.'/'.$current;
+ $file = $folder.'/'.$current;
+
+ // Directory?
+ if(is_dir($path)) {
+ $type = 'folder';
+ $href = './?b='.$mode.'&s='.urlencode($file).$keep_get;
+ $target = '';
+ }
+
+ // File?
+ else {
+ $type = getFileType(getFileExt($path));
+ $href = $path;
+ $target = ' target="_blank"';
+ }
+
+ echo('<div class="one-browse '.$marker.' '.$type.' manager-images"><a href="'.$href.'"'.$target.'>'.htmlspecialchars($current).'</a><input type="checkbox" name="element_'.md5($file).'" value="'.htmlspecialchars($file).'" /></div>');
+
+ // Change the marker
+ if($marker == 'odd')
+ $marker = 'even';
+ else
+ $marker = 'odd';
+ }
+
+ return true;
+}
+
+// Removes selected elements (files/folders)
+function removeElements() {
+ // Initialize the match
+ $elements_removed = false;
+ $elements_remove = array();
+
+ // Try to get the elements to remove
+ foreach($_POST as $post_key => $post_value) {
+ // Is a safe file?
+ if(preg_match('/^element_(.+)$/i', $post_key) && isSafe($post_value)) {
+ // Update the marker
+ $elements_removed = true;
+
+ // Get the real path
+ $post_element = JAPPIX_BASE.'/store/'.$post_value;
+
+ // Remove the current element
+ if(is_dir($post_element))
+ removeDir($post_element);
+ else if(file_exists($post_element))
+ unlink($post_element);
+ }
+ }
+
+ // Show a notification message
+ if($elements_removed)
+ echo('<p class="info smallspace success">'.T_("The selected elements have been removed.").'</p>');
+ else
+ echo('<p class="info smallspace fail">'.T_("You must select elements to remove!").'</p>');
+}
+
+// Returns users browsing informations
+function browseUsers() {
+ // Get the users
+ $array = getUsers();
+
+ // Odd/even marker
+ $marker = 'odd';
+
+ // Echo the browsing HTML code
+ foreach($array as $user => $password) {
+ // Filter the username
+ $user = htmlspecialchars($user);
+
+ // Output the code
+ echo('<div class="one-browse '.$marker.' user manager-images"><span>'.$user.'</span><input type="checkbox" name="admin_'.md5($user).'" value="'.$user.'" /><div class="clear"></div></div>');
+
+ // Change the marker
+ if($marker == 'odd')
+ $marker = 'even';
+ else
+ $marker = 'odd';
+ }
+}
+
+// Generates the logo form field
+function logoFormField($id, $name) {
+ if(file_exists(JAPPIX_BASE.'/store/logos/'.$name.'.png'))
+ echo '<span class="logo_links"><a class="remove manager-images" href="./?k='.urlencode($name).keepGet('k', false).'" title="'.T_("Remove this logo").'"></a><a class="view manager-images" href="./store/logos/'.$name.'.png" target="_blank" title="'.T_("View this logo").'"></a></span>';
+ else
+ echo '<input id="logo_own_'.$id.'_location" type="file" name="logo_own_'.$id.'_location" accept="image/*" />';
+
+ echo "\n";
+}
+
+// Reads the background configuration
+function readBackground() {
+ // Read the background configuration XML
+ $background_data = readXML('conf', 'background');
+
+ // Get the default values
+ $background_default = defaultBackground();
+
+ // Stored data array
+ $background_conf = array();
+
+ // Read the stored values
+ if($background_data) {
+ // Initialize the background configuration XML data
+ $background_xml = new SimpleXMLElement($background_data);
+
+ // Loop the notice configuration elements
+ foreach($background_xml->children() as $background_child)
+ $background_conf[$background_child->getName()] = $background_child;
+ }
+
+ // Checks no value is missing in the stored configuration
+ foreach($background_default as $background_name => $background_value) {
+ if(!isset($background_conf[$background_name]) || empty($background_conf[$background_name]))
+ $background_conf[$background_name] = $background_default[$background_name];
+ }
+
+ return $background_conf;
+}
+
+// Writes the background configuration
+function writeBackground($array) {
+ // Generate the XML data
+ $xml = '';
+
+ foreach($array as $key => $value)
+ $xml .= "\n".' <'.$key.'>'.stripslashes(htmlspecialchars($value)).'</'.$key.'>';
+
+ // Write this data
+ writeXML('conf', 'background', $xml);
+}
+
+// Generates a list of the available background images
+function getBackgrounds() {
+ // Initialize the result array
+ $array = array();
+
+ // Scan the background directory
+ $scan = scandir(JAPPIX_BASE.'/store/backgrounds/');
+
+ foreach($scan as $current) {
+ if(isImage($current))
+ array_push($array, $current);
+ }
+
+ return $array;
+}
+
+// Writes the notice configuration
+function writeNotice($type, $simple) {
+ // Generate the XML data
+ $xml =
+ '<type>'.$type.'</type>
+ <notice>'.stripslashes(htmlspecialchars($simple)).'</notice>'
+ ;
+
+ // Write this data
+ writeXML('conf', 'notice', $xml);
+}
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+These are the PHP functions for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Authors: Vanaryon, LinkMauve, Mathieui, olivierm
+Last revision: 16/01/12
+
+*/
+
+// The function to check if Jappix is already installed
+function isInstalled() {
+ if(!file_exists(JAPPIX_BASE.'/store/conf/installed.xml'))
+ return false;
+
+ return true;
+}
+
+// The function to check if a static host is defined
+function hasStatic() {
+ if(HOST_STATIC && (HOST_STATIC != '.'))
+ return true;
+
+ return false;
+}
+
+// The function to check if this is a static server
+function isStatic() {
+ if(hasStatic() && (parse_url(HOST_STATIC, PHP_URL_HOST) == $_SERVER['HTTP_HOST']))
+ return true;
+
+ return false;
+}
+
+// The function to check if this is an upload server
+function isUpload() {
+ if(HOST_UPLOAD && (parse_url(HOST_UPLOAD, PHP_URL_HOST) == $_SERVER['HTTP_HOST']))
+ return true;
+
+ return false;
+}
+
+// The function to get the users.xml file hashed name
+function usersConfName() {
+ $conf_dir = JAPPIX_BASE.'/store/conf';
+
+ // No conf folder?
+ if(!is_dir($conf_dir))
+ return '';
+
+ // Read the conf folder
+ $conf_scan = scandir($conf_dir.'/');
+ $conf_name = '';
+
+ // Loop the XML files
+ foreach($conf_scan as $current) {
+ if(preg_match('/(.+)(\.users\.xml)($)/', $current)) {
+ $conf_name = $current;
+
+ break;
+ }
+ }
+
+ // Return the users file name
+ return $conf_name;
+}
+
+// The function to write a XML file
+function writeXML($type, $xmlns, $xml) {
+ // Generate the file path
+ $conf_path = JAPPIX_BASE.'/store/'.$type.'/';
+ $conf_name = $xmlns.'.xml';
+
+ // Secured stored file?
+ if(($type == 'conf') && ($xmlns == 'users')) {
+ // Get the secured file name
+ $conf_secured = usersConfName();
+
+ // Does this file exist?
+ if($conf_secured)
+ $conf_name = $conf_secured;
+ else
+ $conf_name = hash('sha256', rand(1, 99999999).time()).'.users.xml';
+ }
+
+ // Generate the file complete path
+ $conf_file = $conf_path.$conf_name;
+
+ // Write the installed marker
+ $gen_xml = '<?xml version="1.0" encoding="utf-8" ?>
+<jappix xmlns="jappix:'.$type.':'.$xmlns.'">
+ '.trim($xml).'
+</jappix>';
+
+ file_put_contents($conf_file, $gen_xml);
+
+ return true;
+}
+
+// The function to read a XML file
+function readXML($type, $xmlns) {
+ // Generate the file path
+ $conf_path = JAPPIX_BASE.'/store/'.$type.'/';
+ $conf_name = $xmlns.'.xml';
+
+ // Secured stored file?
+ if(($type == 'conf') && ($xmlns == 'users')) {
+ // Get the secured file name
+ $conf_secured = usersConfName();
+
+ // Does this file exist?
+ if($conf_secured)
+ $conf_name = $conf_secured;
+ }
+
+ // Generate the file complete path
+ $conf_file = $conf_path.$conf_name;
+
+ if(file_exists($conf_file))
+ return file_get_contents($conf_file);
+
+ return false;
+}
+
+// The function to read remote URLs
+function read_url($url) {
+ // Any cURL?
+ if(function_exists('curl_init')) {
+ $ch = curl_init();
+ curl_setopt($ch, CURLOPT_URL, $url);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
+ $data = curl_exec($ch);
+ curl_close($ch);
+ }
+
+ // Default method
+ else
+ $data = @file_get_contents($url);
+
+ return $data;
+}
+
+// The function to get the Jappix app. current version
+function getVersion() {
+ $file = file_get_contents(JAPPIX_BASE.'/VERSION');
+ $version = trim($file);
+
+ return $version;
+}
+
+// The function to detect the user's language
+function checkLanguage() {
+ // If the user defined a language
+ if(isset($_GET['l']) && !empty($_GET['l'])) {
+ // We define some stuffs
+ $defined_lang = strtolower($_GET['l']);
+ $lang_file = JAPPIX_BASE.'/lang/'.$defined_lang.'/LC_MESSAGES/main.mo';
+
+ if($defined_lang == 'en')
+ $lang_found = true;
+ else
+ $lang_found = file_exists($lang_file);
+
+ // We check if the asked translation exists
+ if($lang_found) {
+ $lang = $defined_lang;
+
+ // Write a cookie
+ setcookie('jappix_locale', $lang, (time() + 31536000));
+
+ return $lang;
+ }
+ }
+
+ // No language has been defined, but a cookie is stored
+ if(isset($_COOKIE['jappix_locale'])) {
+ $check_cookie = $_COOKIE['jappix_locale'];
+
+ // The cookie has a value, check this value
+ if($check_cookie && (file_exists(JAPPIX_BASE.'/lang/'.$check_cookie.'/LC_MESSAGES/main.mo') || ($check_cookie == 'en')))
+ return $check_cookie;
+ }
+
+ // No cookie defined (or an unsupported value), naturally, we check the browser language
+ if(!isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
+ return 'en';
+
+ // We get the language of the browser
+ $nav_langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
+ $check_en = strtolower($nav_langs[0]);
+
+ // We check if this is not english
+ if($check_en == 'en')
+ return 'en';
+
+ $order = array();
+
+ foreach($nav_langs as $entry) {
+ $indice = explode('=', $entry);
+ $lang = strtolower(substr(trim($indice[0]), 0, 2));
+
+ if(!isset($indice[1]) || !$indice[1])
+ $indice = 1;
+ else
+ $indice = $indice[1];
+
+ $order[$lang] = $indice;
+ }
+
+ arsort($order);
+
+ foreach($order as $nav_lang => $val) {
+ $lang_found = file_exists(JAPPIX_BASE.'/lang/'.$nav_lang.'/LC_MESSAGES/main.mo');
+
+ if($lang_found)
+ return $nav_lang;
+ }
+
+ // If Jappix doen't know that language, we include the english translation
+ return 'en';
+}
+
+// The function to convert a ISO language code to its full name
+function getLanguageName($code) {
+ $code = strtolower($code);
+
+ $known = array(
+ 'aa' => 'Afaraf',
+ 'ab' => 'ŠŅ§ŃŃŠ°',
+ 'ae' => 'Avesta',
+ 'af' => 'Afrikaans',
+ 'ak' => 'Akan',
+ 'am' => 'į įįį',
+ 'an' => 'AragonƩs',
+ 'ar' => 'Ų§ŁŲ¹Ų±ŲØŁŲ©',
+ 'as' => 'ą¦
ą¦øą¦®ą§ą¦Æą¦¼ą¦¾',
+ 'av' => 'Š°Š²Š°Ń Š¼Š°ŃÓ',
+ 'ay' => 'Aymar aru',
+ 'az' => 'AzÉrbaycan dili',
+ 'ba' => 'Š±Š°ŃŅ”Š¾ŃŃ ŃŠµŠ»Šµ',
+ 'be' => 'ŠŠµŠ»Š°ŃŃŃŠŗŠ°Ń',
+ 'bg' => 'Š±ŃŠ»Š³Š°ŃŃŠŗŠø',
+ 'bh' => 'ą¤ą„ą¤ą¤Ŗą„ą¤°ą„',
+ 'bi' => 'Bislama',
+ 'bm' => 'Bamanankan',
+ 'bn' => 'ą¦¬ą¦¾ą¦ą¦²ą¦¾',
+ 'bo' => 'ą½ą½¼ą½ą¼ą½”ą½²ą½',
+ 'br' => 'Brezhoneg',
+ 'bs' => 'Bosanski jezik',
+ 'ca' => 'CatalĆ ',
+ 'ce' => 'Š½Š¾Ń
ŃŠøŠ¹Š½ Š¼Š¾ŃŃ',
+ 'ch' => 'Chamoru',
+ 'co' => 'Corsu',
+ 'cr' => 'įį¦įįįįį£',
+ 'cs' => 'Äesky',
+ 'cu' => 'Š”Š»Š¾Š²Ń£Š½ŃŃŠŗŃ',
+ 'cv' => 'ŃÓŠ²Š°Ń ŃÓŠ»Ń
Šø',
+ 'cy' => 'Cymraeg',
+ 'da' => 'Dansk',
+ 'de' => 'Deutsch',
+ 'dv' => 'ŽŽØŽŽ¬ŽŽØ',
+ 'dz' => 'ą½¢ą¾«ą½¼ą½ą¼ą½',
+ 'ee' => 'ĘŹÉgbÉ',
+ 'el' => 'ĪĪ»Ī»Ī·Ī½Ī¹ĪŗĪ¬',
+ 'en' => 'English',
+ 'eo' => 'Esperanto',
+ 'es' => 'EspaƱol',
+ 'et' => 'Eesti keel',
+ 'eu' => 'Euskara',
+ 'fa' => 'ŁŲ§Ų±Ų³Ū',
+ 'ff' => 'Fulfulde',
+ 'fi' => 'Suomen kieli',
+ 'fj' => 'Vosa Vakaviti',
+ 'fo' => 'FĆøroyskt',
+ 'fr' => 'FranƧais',
+ 'fy' => 'Frysk',
+ 'ga' => 'Gaeilge',
+ 'gd' => 'GĆ idhlig',
+ 'gl' => 'Galego',
+ 'gn' => 'AvaƱe\'įŗ½',
+ 'gu' => 'ąŖą«ąŖąŖ°ąŖ¾ąŖ¤ą«',
+ 'gv' => 'Ghaelg',
+ 'ha' => 'ŁŁŁŁŲ³Ł',
+ 'he' => '×¢××Ø××Ŗ',
+ 'hi' => 'ą¤¹ą¤æą¤Øą„ą¤¦ą„',
+ 'ho' => 'Hiri Motu',
+ 'hr' => 'Hrvatski',
+ 'ht' => 'KreyĆ²l ayisyen',
+ 'hu' => 'Magyar',
+ 'hy' => 'ÕÕ”ÕµÕ„ÖÕ„Õ¶',
+ 'hz' => 'Otjiherero',
+ 'ia' => 'Interlingua',
+ 'id' => 'Bahasa',
+ 'ie' => 'Interlingue',
+ 'ig' => 'Igbo',
+ 'ii' => 'źź',
+ 'ik' => 'IƱupiaq',
+ 'io' => 'Ido',
+ 'is' => 'Ćslenska',
+ 'it' => 'Italiano',
+ 'iu' => 'įįįįįį¦',
+ 'ja' => 'ę„ę¬čŖ',
+ 'jv' => 'Basa Jawa',
+ 'ka' => 'į„įį įį£įį',
+ 'kg' => 'KiKongo',
+ 'ki' => 'Gĩkũyũ',
+ 'kj' => 'Kuanyama',
+ 'kk' => 'ŅŠ°Š·Š°Ņ ŃŃŠ»Ń',
+ 'kl' => 'Kalaallisut',
+ 'km' => 'įį¶įį¶įįįįį',
+ 'kn' => 'ą²ą²Øą³ą²Øą²”',
+ 'ko' => 'ķ źµģ“',
+ 'kr' => 'Kanuri',
+ 'ks' => 'ą¤ą¤¶ą„ą¤®ą„ą¤°ą„',
+ 'ku' => 'KurdĆ®',
+ 'kv' => 'ŠŗŠ¾Š¼Šø ŠŗŃŠ²',
+ 'kw' => 'Kernewek',
+ 'ky' => 'ŠŗŃŃŠ³ŃŠ· ŃŠøŠ»Šø',
+ 'la' => 'Latine',
+ 'lb' => 'LĆ«tzebuergesch',
+ 'lg' => 'Luganda',
+ 'li' => 'Limburgs',
+ 'ln' => 'LingƔla',
+ 'lo' => 'ąŗąŗ²ąŗŖąŗ²ąŗ„ąŗ²ąŗ§',
+ 'lt' => 'Lietuvių kalba',
+ 'lu' => 'cilubĆ ',
+ 'lv' => 'LatvieŔu valoda',
+ 'mg' => 'Fiteny malagasy',
+ 'mh' => 'Kajin MĢ§ajeļ',
+ 'mi' => 'Te reo MÄori',
+ 'mk' => 'Š¼Š°ŠŗŠµŠ“Š¾Š½ŃŠŗŠø ŃŠ°Š·ŠøŠŗ',
+ 'ml' => 'ą“®ą“²ą“Æą“¾ą“³ą“',
+ 'mn' => 'ŠŠ¾Š½Š³Š¾Š»',
+ 'mo' => 'Š»ŠøŠ¼Š±Š° Š¼Š¾Š»Š“Š¾Š²ŠµŠ½ŃŃŠŗŃ',
+ 'mr' => 'ą¤®ą¤°ą¤¾ą¤ ą„',
+ 'ms' => 'Bahasa Melayu',
+ 'mt' => 'Malti',
+ 'my' => 'įįį¬į
į¬',
+ 'na' => 'Ekakairũ Naoero',
+ 'nb' => 'Norsk bokmƄl',
+ 'nd' => 'isiNdebele',
+ 'ne' => 'ą¤Øą„ą¤Ŗą¤¾ą¤²ą„',
+ 'ng' => 'Owambo',
+ 'nl' => 'Nederlands',
+ 'nn' => 'Norsk nynorsk',
+ 'no' => 'Norsk',
+ 'nr' => 'NdƩbƩlƩ',
+ 'nv' => 'DinƩ bizaad',
+ 'ny' => 'ChiCheŵa',
+ 'oc' => 'Occitan',
+ 'oj' => 'įįįįįÆį§įį',
+ 'om' => 'Afaan Oromoo',
+ 'or' => 'ą¬ą¬”ą¬¼ą¬æą¬',
+ 'os' => 'ŠŃŠ¾Š½ ƦŠ²Š·Š°Š³',
+ 'pa' => 'ąØŖą©°ąØąØ¾ąØ¬ą©',
+ 'pi' => 'ą¤Ŗą¤¾ą¤æą¤“',
+ 'pl' => 'Polski',
+ 'ps' => 'Ł¾ŚŲŖŁ',
+ 'pt' => 'PortuguĆŖs',
+ 'pt-br' => 'Brasileiro',
+ 'qu' => 'Runa Simi',
+ 'rm' => 'Rumantsch grischun',
+ 'rn' => 'kiRundi',
+ 'ro' => 'RomĆ¢nÄ',
+ 'ru' => 'Š ŃŃŃŠŗŠøŠ¹',
+ 'rw' => 'Kinyarwanda',
+ 'sa' => 'ą¤øą¤ą¤øą„ą¤ą„ą¤¤ą¤®ą„',
+ 'sc' => 'sardu',
+ 'sd' => 'ą¤øą¤æą¤Øą„ą¤§ą„',
+ 'se' => 'DavvisƔmegiella',
+ 'sg' => 'YĆ¢ngĆ¢ tĆ® sƤngƶ',
+ 'sh' => 'Š”ŃŠæŃŠŗŠ¾Ń
ŃŠ²Š°ŃŃŠŗŠø',
+ 'si' => 'ą·ą·ą¶ą·ą¶½',
+ 'sk' => 'SlovenÄina',
+ 'sl' => 'SlovenÅ”Äina',
+ 'sm' => 'Gagana fa\'a Samoa',
+ 'sn' => 'chiShona',
+ 'so' => 'Soomaaliga',
+ 'sq' => 'Shqip',
+ 'sr' => 'ŃŃŠæŃŠŗŠø ŃŠµŠ·ŠøŠŗ',
+ 'ss' => 'SiSwati',
+ 'st' => 'seSotho',
+ 'su' => 'Basa Sunda',
+ 'sv' => 'Svenska',
+ 'sw' => 'Kiswahili',
+ 'ta' => 'ą®¤ą®®ą®æą®“ąÆ',
+ 'te' => 'ą°¤ą±ą°²ą±ą°ą±',
+ 'tg' => 'ŃŠ¾Ņ·ŠøŠŗÓ£',
+ 'th' => 'ą¹ąøąø¢',
+ 'ti' => 'įµįįį',
+ 'tk' => 'TĆ¼rkmen',
+ 'tl' => 'Tagalog',
+ 'tn' => 'seTswana',
+ 'to' => 'faka Tonga',
+ 'tr' => 'TĆ¼rkƧe',
+ 'ts' => 'xiTsonga',
+ 'tt' => 'ŃŠ°ŃŠ°ŃŃŠ°',
+ 'tw' => 'Twi',
+ 'ty' => 'Reo MÄ`ohi',
+ 'ug' => 'UyĘ£urqÉ',
+ 'uk' => 'ŃŠŗŃŠ°ŃŠ½ŃŃŠŗŠ°',
+ 'ur' => 'Ų§Ų±ŲÆŁ',
+ 'uz' => 'O\'zbek',
+ 've' => 'tshiVenįøa',
+ 'vi' => 'Tiįŗæng Viį»t',
+ 'vo' => 'VolapĆ¼k',
+ 'wa' => 'Walon',
+ 'wo' => 'Wollof',
+ 'xh' => 'isiXhosa',
+ 'yi' => '××Ö“××ש',
+ 'yo' => 'YorĆ¹bĆ”',
+ 'za' => 'SaÉÆ cueÅĘ
',
+ 'zh' => 'äøę',
+ 'zu' => 'isiZulu'
+ );
+
+ if(isset($known[$code]))
+ return $known[$code];
+
+ return null;
+}
+
+// The function to know if a language is right-to-left
+function isRTL($code) {
+ switch($code) {
+ // RTL language
+ case 'ar':
+ case 'he':
+ case 'dv':
+ case 'ur':
+ $is_rtl = true;
+
+ break;
+
+ // LTR language
+ default:
+ $is_rtl = false;
+
+ break;
+ }
+
+ return $is_rtl;
+}
+
+// The function to set the good localized <html /> tag
+function htmlTag($locale) {
+ // Initialize the tag
+ $html = '<html xml:lang="'.$locale.'" lang="'.$locale.'" dir="';
+
+ // Set the good text direction (TODO)
+ /* if(isRTL($locale))
+ $html .= 'rtl';
+ else
+ $html .= 'ltr'; */
+
+ $html .= 'ltr';
+
+ // Close the tag
+ $html .= '">';
+
+ echo($html);
+}
+
+// The function which generates the available locales list
+function availableLocales($active_locale) {
+ // Initialize
+ $scan = scandir(JAPPIX_BASE.'/lang/');
+ $list = array();
+
+ // Loop the available languages
+ foreach($scan as $current_id) {
+ // Get the current language name
+ $current_name = getLanguageName($current_id);
+
+ // Not valid?
+ if(($current_id == $active_locale) || ($current_name == null))
+ continue;
+
+ // Add this to the list
+ $list[$current_id] = $current_name;
+ }
+
+ return $list;
+}
+
+// The function which generates the language switcher hidden part
+function languageSwitcher($active_locale) {
+ // Initialize
+ $keep_get = keepGet('l', false);
+ $list = availableLocales($active_locale);
+ $html = '';
+
+ // Generate the HTML code
+ foreach($list as $current_id => $current_name)
+ $html .= '<a href="./?l='.$current_id.$keep_get.'">'.htmlspecialchars($current_name).'</a>, ';
+
+ // Output the HTML code
+ return $html;
+}
+
+// The function to generate a strong hash
+function genStrongHash($string) {
+ // Initialize
+ $i = 0;
+
+ // Loop to generate a incredibly strong hash (can be a bit slow)
+ while($i < 10) {
+ $string = hash('sha256', $string);
+
+ $i++;
+ }
+
+ return $string;
+}
+
+// The function to generate the version hash
+function genHash($version) {
+ // Get the configuration files path
+ $conf_path = JAPPIX_BASE.'/store/conf/';
+ $conf_main = $conf_path.'main.xml';
+ $conf_hosts = $conf_path.'hosts.xml';
+ $conf_background = $conf_path.'background.xml';
+ $logos_dir = JAPPIX_BASE.'/store/logos/';
+
+ // Get the hash of the main configuration file
+ if(file_exists($conf_main))
+ $hash_main = md5_file($conf_main);
+ else
+ $hash_main = '0';
+
+ // Get the hash of the main configuration file
+ if(file_exists($conf_hosts))
+ $hash_hosts = md5_file($conf_hosts);
+ else
+ $hash_hosts = '0';
+
+ // Get the hash of the background configuration file
+ if(file_exists($conf_background))
+ $hash_background = md5_file($conf_background);
+ else
+ $hash_background = '0';
+
+ // Get the hash of the logos folder
+ $hash_logos = '';
+
+ if(is_dir($logos_dir)) {
+ $logos_scan = scandir($logos_dir.'/');
+
+ foreach($logos_scan as $logos_current) {
+ if(getFileExt($logos_current) == 'png')
+ $hash_logos .= md5_file($logos_dir.$logos_current);
+ }
+ }
+
+ return md5($version.$hash_main.$hash_hosts.$hash_background.$hash_logos);
+}
+
+// The function to hide the error messages
+function hideErrors() {
+ // Hide errors if not developer
+ if(!isDeveloper()) {
+ ini_set('display_errors', 'off');
+ ini_set('error_reporting', 0);
+ }
+
+ // Developers need to get error reports!
+ else {
+ ini_set('display_errors', 'on');
+ ini_set('error_reporting', E_ALL);
+ }
+}
+
+// The function to check BOSH proxy is enabled
+function BOSHProxy() {
+ if(BOSH_PROXY == 'on')
+ return true;
+
+ return false;
+}
+
+// The function to check compression is enabled
+function hasCompression() {
+ if(COMPRESSION != 'off')
+ return true;
+
+ return false;
+}
+
+// The function to check compression is available with the current client
+function canCompress() {
+ // Compression allowed by admin & browser?
+ if(hasCompression() && (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')))
+ return true;
+
+ return false;
+}
+
+// The function to check whether to show manager link or not
+function showManagerLink() {
+ if(MANAGER_LINK != 'off')
+ return true;
+
+ return false;
+}
+
+// The function to check HTTPS storage is allowed
+function httpsStorage() {
+ if(HTTPS_STORAGE == 'on')
+ return true;
+
+ return false;
+}
+
+// The function to check HTTPS storage must be forced
+function httpsForce() {
+ if((HTTPS_FORCE == 'on') && sslCheck())
+ return true;
+
+ return false;
+}
+
+// The function to check we use HTTPS
+function useHttps() {
+ if(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'))
+ return true;
+
+ return false;
+}
+
+// The function to compress the output pages
+function compressThis() {
+ if(canCompress() && !isDeveloper())
+ ob_start('ob_gzhandler');
+}
+
+// The function to choose one file get with get.php or a liste of resources
+function multiFiles() {
+ if(MULTI_FILES == 'on')
+ return true;
+
+ return false;
+}
+
+function getFiles($h, $l, $t, $g, $f) {
+ // Define the good path to the Get API
+ if(hasStatic())
+ $path_to = HOST_STATIC.'/';
+ else
+ $path_to = JAPPIX_BASE.'/';
+
+ if(!multiFiles()) {
+ $values = array();
+ if ($h)
+ $values[] = 'h='.$h;
+ if ($l)
+ $values[] = 'l='.$l;
+ if ($t)
+ $values[] = 't='.$t;
+ if ($g)
+ $values[] = 'g='.$g;
+ if ($f)
+ $values[] = 'f='.$f;
+
+ return $path_to.'php/get.php?'.implode('&', $values);
+ }
+
+ if($g && !empty($g) && preg_match('/^(\S+)\.xml$/', $g) && preg_match('/^(css|js)$/', $t) && isSafe($g) && file_exists('xml/'.$g)) {
+ $xml_data = file_get_contents('xml/'.$g);
+
+ // Any data?
+ if($xml_data) {
+ $xml_read = new SimpleXMLElement($xml_data);
+ $xml_parse = $xml_read->$t;
+
+ // Files were added to the list before (with file var)?
+ if($f)
+ $f .= '~'.$xml_parse;
+ else
+ $f = $xml_parse;
+ }
+ }
+
+ // Explode the f string
+ if(strpos($f, '~') != false)
+ $array = explode('~', $f);
+ else
+ $array = array($f);
+
+ $a = array();
+ foreach($array as $file)
+ $a[] = $path_to.$t.'/'.$file;
+
+ if (count($a) == 1)
+ return $a[0];
+
+ return $a;
+}
+
+function echoGetFiles($h, $l, $t, $g, $f) {
+ if ($t == 'css')
+ $pattern = '<link rel="stylesheet" href="%s" type="text/css" media="all" />';
+ else if ($t == 'js')
+ $pattern = '<script type="text/javascript" src="%s"></script>';
+
+ $files = getFiles($h, $l, $t, $g, $f);
+
+ if (is_string($files))
+ printf($pattern, $files);
+ else {
+ $c = count($files)-1;
+ for($i=0; $i<=$c; $i++) {
+ if ($i)
+ echo ' ';
+ printf($pattern, $files[$i]);
+ if ($i != $c)
+ echo "\n";
+ }
+ }
+}
+
+// The function to check if anonymous mode is authorized
+function anonymousMode() {
+ if(isset($_GET['r']) && !empty($_GET['r']) && HOST_ANONYMOUS && (ANONYMOUS == 'on'))
+ return true;
+ else
+ return false;
+}
+
+// The function to quickly translate a string
+function _e($string) {
+ echo T_gettext($string);
+}
+
+// The function to check the encrypted mode
+function sslCheck() {
+ if(ENCRYPTION == 'on')
+ return true;
+ else
+ return false;
+}
+
+// The function to return the encrypted link
+function sslLink() {
+ // Using HTTPS?
+ if(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'))
+ $link = '<a class="home-images unencrypted" href="http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'">'.T_('Unencrypted').'</a>';
+
+ // Using HTTP?
+ else
+ $link = '<a class="home-images encrypted" href="https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'">'.T_('Encrypted').'</a>';
+
+ return $link;
+}
+
+// The function to get the Jappix static URL
+function staticURL() {
+ // Check for HTTPS
+ $protocol = isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on') ? 'https' : 'http';
+
+ // Full URL
+ $url = $protocol.'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
+
+ return $url;
+}
+
+// The function to get the Jappix location (only from Get API!)
+function staticLocation() {
+ // Filter the URL
+ return preg_replace('/((.+)\/)php\/get\.php(\S)+$/', '$1', staticURL());
+}
+
+// The function to include a translation file
+function includeTranslation($locale, $domain) {
+ T_setlocale(LC_MESSAGES, $locale);
+ T_bindtextdomain($domain, JAPPIX_BASE.'/lang');
+ T_bind_textdomain_codeset($domain, 'UTF-8');
+ T_textdomain($domain);
+}
+
+// The function to check the cache presence
+function hasCache($hash) {
+ if(file_exists(JAPPIX_BASE.'/store/cache/'.$hash.'.cache'))
+ return true;
+ else
+ return false;
+}
+
+// The function to check if developer mode is enabled
+function isDeveloper() {
+ if(DEVELOPER == 'on')
+ return true;
+ else
+ return false;
+}
+
+// The function to get a file extension
+function getFileExt($name) {
+ return strtolower(preg_replace('/^(.+)(\.)([^\.]+)$/i', '$3', $name));
+}
+
+// The function to get a file type
+function getFileType($ext) {
+ switch($ext) {
+ // Images
+ case 'jpg':
+ case 'jpeg':
+ case 'png':
+ case 'bmp':
+ case 'gif':
+ case 'tif':
+ case 'svg':
+ case 'psp':
+ case 'xcf':
+ $file_type = 'image';
+
+ break;
+
+ // Videos
+ case 'ogv':
+ case 'mkv':
+ case 'avi':
+ case 'mov':
+ case 'mp4':
+ case 'm4v':
+ case 'wmv':
+ case 'asf':
+ case 'mpg':
+ case 'mpeg':
+ case 'ogm':
+ case 'rmvb':
+ case 'rmv':
+ case 'qt':
+ case 'flv':
+ case 'ram':
+ case '3gp':
+ case 'avc':
+ $file_type = 'video';
+
+ break;
+
+ // Sounds
+ case 'oga':
+ case 'ogg':
+ case 'mka':
+ case 'flac':
+ case 'mp3':
+ case 'wav':
+ case 'm4a':
+ case 'wma':
+ case 'rmab':
+ case 'rma':
+ case 'bwf':
+ case 'aiff':
+ case 'caf':
+ case 'cda':
+ case 'atrac':
+ case 'vqf':
+ case 'au':
+ case 'aac':
+ case 'm3u':
+ case 'mid':
+ case 'mp2':
+ case 'snd':
+ case 'voc':
+ $file_type = 'audio';
+
+ break;
+
+ // Documents
+ case 'pdf':
+ case 'odt':
+ case 'ott':
+ case 'sxw':
+ case 'stw':
+ case 'ots':
+ case 'sxc':
+ case 'stc':
+ case 'sxi':
+ case 'sti':
+ case 'pot':
+ case 'odp':
+ case 'ods':
+ case 'doc':
+ case 'docx':
+ case 'docm':
+ case 'xls':
+ case 'xlsx':
+ case 'xlsm':
+ case 'xlt':
+ case 'ppt':
+ case 'pptx':
+ case 'pptm':
+ case 'pps':
+ case 'odg':
+ case 'otp':
+ case 'sxd':
+ case 'std':
+ case 'std':
+ case 'rtf':
+ case 'txt':
+ case 'htm':
+ case 'html':
+ case 'shtml':
+ case 'dhtml':
+ case 'mshtml':
+ $file_type = 'document';
+
+ break;
+
+ // Packages
+ case 'tgz':
+ case 'gz':
+ case 'tar':
+ case 'ar':
+ case 'cbz':
+ case 'jar':
+ case 'tar.7z':
+ case 'tar.bz2':
+ case 'tar.gz':
+ case 'tar.lzma':
+ case 'tar.xz':
+ case 'zip':
+ case 'xz':
+ case 'rar':
+ case 'bz':
+ case 'deb':
+ case 'rpm':
+ case '7z':
+ case 'ace':
+ case 'cab':
+ case 'arj':
+ case 'msi':
+ $file_type = 'package';
+
+ break;
+
+ // Others
+ default:
+ $file_type = 'other';
+
+ break;
+ }
+
+ return $file_type;
+}
+
+// The function to get the MIME type of a file
+function getFileMIME($path) {
+ $finfo = finfo_open(FILEINFO_MIME_TYPE);
+ $cmime = finfo_file($finfo, $path);
+ finfo_close($finfo);
+
+ return $cmime;
+}
+
+// The function to keep the current GET vars
+function keepGet($current, $no_get) {
+ // Get the HTTP GET vars
+ $request = $_SERVER['REQUEST_URI'];
+
+ if(strrpos($request, '?') === false)
+ $get = '';
+
+ else {
+ $uri = explode('?', $request);
+ $get = $uri[1];
+ }
+
+ // Remove the items we don't want here
+ $proper = str_replace('&', '&', $get);
+ $proper = preg_replace('/((^)|(&))(('.$current.'=)([^&]+))/i', '', $proper);
+
+ // Nothing at the end?
+ if(!$proper)
+ return '';
+
+ // We have no defined GET var
+ if($no_get) {
+ // Remove the first "&" if it appears
+ if(preg_match('/^(&(amp;)?)/i', $proper))
+ $proper = preg_replace('/^(&(amp;)?)/i', '', $proper);
+
+ // Add the first "?"
+ $proper = '?'.$proper;
+ }
+
+ // Add a first "&" if there is no one and no defined GET var
+ else if(!$no_get && (substr($proper, 0, 1) != '&') && (substr($proper, 0, 5) != '&'))
+ $proper = '&'.$proper;
+
+ return $proper;
+}
+
+// Escapes regex special characters for in-regex usage
+function escapeRegex($string) {
+ return preg_replace('/[-[\]{}()*+?.,\\^$|#]/', '\\$&', $string);
+}
+
+// Generates the security HTML code
+function securityHTML() {
+ return '<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <title>Jappix - Forbidden</title>
+</head>
+
+<body>
+ <h1>Forbidden</h1>
+ <h4>This is a private folder</h4>
+</body>
+
+</html>';
+}
+
+// Checks if a relative server path is safe
+function isSafe($path) {
+ // Mhh, someone is about to nasty stuffs (previous folder, or executable scripts)
+ if(preg_match('/\.\.\//', $path) || preg_match('/index\.html?$/', $path) || preg_match('/(\.)((php([0-9]+)?)|(aspx?)|(cgi)|(rb)|(py)|(pl)|(jsp)|(ssjs)|(lasso)|(dna)|(tpl)|(smx)|(cfm))$/i', $path))
+ return false;
+
+ return true;
+}
+
+// Set the good unity for a size in bytes
+function formatBytes($bytes, $precision = 2) {
+ $units = array('B', 'KB', 'MB', 'GB', 'TB');
+
+ $bytes = max($bytes, 0);
+ $pow = floor(($bytes ? log($bytes) : 0) / log(1024));
+ $pow = min($pow, count($units) - 1);
+
+ $bytes /= pow(1024, $pow);
+
+ return round($bytes, $precision) . ' ' . $units[$pow];
+}
+
+// Converts a human-readable bytes value to a computer one
+function humanToBytes($string) {
+ // Values array
+ $values = array(
+ 'K' => '000',
+ 'M' => '000000',
+ 'G' => '000000000',
+ 'T' => '000000000000',
+ 'P' => '000000000000000',
+ 'E' => '000000000000000000',
+ 'Z' => '000000000000000000000',
+ 'Y' => '000000000000000000000000'
+ );
+
+ // Filter the string
+ foreach($values as $key => $zero)
+ $string = str_replace($key, $zero, $string);
+
+ // Converts the string into an integer
+ $string = intval($string);
+
+ return $string;
+}
+
+// Get the maximum file upload size
+function uploadMaxSize() {
+ // Not allowed to upload files?
+ if(ini_get('file_uploads') != 1)
+ return 0;
+
+ // Upload maximum file size
+ $upload = humanToBytes(ini_get('upload_max_filesize'));
+
+ // POST maximum size
+ $post = humanToBytes(ini_get('post_max_size'));
+
+ // Return the lowest value
+ if($upload <= $post)
+ return $upload;
+
+ return $post;
+}
+
+// Normalizes special chars
+function normalizeChars($string) {
+ $table = array(
+ 'Å '=>'S', 'Å”'=>'s', 'Ä'=>'Dj', 'Ä'=>'dj', 'Ž'=>'Z', 'ž'=>'z', 'Ä'=>'C', 'Ä'=>'c', 'Ä'=>'C', 'Ä'=>'c',
+ 'Ć'=>'A', 'Ć'=>'A', 'Ć'=>'A', 'Ć'=>'A', 'Ć'=>'A', 'Ć
'=>'A', 'Ć'=>'A', 'Ć'=>'C', 'Ć'=>'E', 'Ć'=>'E',
+ 'Ć'=>'E', 'Ć'=>'E', 'Ć'=>'I', 'Ć'=>'I', 'Ć'=>'I', 'Ć'=>'I', 'Ć'=>'N', 'Ć'=>'O', 'Ć'=>'O', 'Ć'=>'O',
+ 'Ć'=>'O', 'Ć'=>'O', 'Ć'=>'O', 'Ć'=>'U', 'Ć'=>'U', 'Ć'=>'U', 'Ć'=>'U', 'Ć'=>'Y', 'Ć'=>'B', 'Ć'=>'Ss',
+ 'Ć '=>'a', 'Ć”'=>'a', 'Ć¢'=>'a', 'Ć£'=>'a', 'Ƥ'=>'a', 'Ć„'=>'a', 'Ʀ'=>'a', 'Ƨ'=>'c', 'ĆØ'=>'e', 'Ć©'=>'e',
+ 'ĆŖ'=>'e', 'Ć«'=>'e', 'Ƭ'=>'i', 'Ć'=>'i', 'Ć®'=>'i', 'ĆÆ'=>'i', 'Ć°'=>'o', 'Ʊ'=>'n', 'Ć²'=>'o', 'Ć³'=>'o',
+ 'Ć“'=>'o', 'Ƶ'=>'o', 'ƶ'=>'o', 'Ćø'=>'o', 'Ć¹'=>'u', 'Ćŗ'=>'u', 'Ć»'=>'u', 'Ć½'=>'y', 'Ć½'=>'y', 'Ć¾'=>'b',
+ 'Ćæ'=>'y', 'Å'=>'R', 'Å'=>'r'
+ );
+
+ return strtr($string, $table);
+}
+
+// Filters the XML special chars for the SVG drawer
+function filterSpecialXML($string) {
+ // Strange thing: when $string = 'Mises Ć jour' -> bug! but 'Mise Ć jour' -> ok!
+ $string = normalizeChars($string);
+
+ // Encodes with HTML special chars
+ $string = htmlspecialchars($string);
+
+ return $string;
+}
+
+// Writes the current visit in the total file
+function writeTotalVisit() {
+ // Get the current time stamp
+ $stamp = time();
+
+ // Initialize the defaults
+ $array = array(
+ 'total' => 0,
+ 'stamp' => $stamp
+ );
+
+ // Try to read the saved data
+ $total_data = readXML('access', 'total');
+
+ // Get the XML file values
+ if($total_data) {
+ // Initialize the visits reading
+ $read_xml = new SimpleXMLElement($total_data);
+
+ // Loop the visit elements
+ foreach($read_xml->children() as $current_child)
+ $array[$current_child->getName()] = intval($current_child);
+ }
+
+ // Increment the total number of visits
+ $array['total']++;
+
+ // Generate the new XML data
+ $total_xml =
+ '<total>'.$array['total'].'</total>
+ <stamp>'.$array['stamp'].'</stamp>'
+ ;
+
+ // Re-write the new values
+ writeXML('access', 'total', $total_xml);
+}
+
+// Writes the current visit in the months file
+function writeMonthsVisit() {
+ // Get the current month
+ $month = intval(date('m'));
+
+ // Define the stats array
+ $array = array();
+
+ // January to August period
+ if($month <= 8) {
+ for($i = 1; $i <= 8; $i++)
+ $array['month_'.$i] = 0;
+ }
+
+ // August to September period
+ else {
+ $i = 8;
+ $j = 1;
+
+ while($j <= 3) {
+ // Last year months
+ if(($i >= 8) && ($i <= 12))
+ $array['month_'.$i++] = 0;
+
+ // First year months
+ else
+ $array['month_'.$j++] = 0;
+ }
+ }
+
+ // Try to read the saved data
+ $months_data = readXML('access', 'months');
+
+ // Get the XML file values
+ if($months_data) {
+ // Initialize the visits reading
+ $read_xml = new SimpleXMLElement($months_data);
+
+ // Loop the visit elements
+ foreach($read_xml->children() as $current_child) {
+ $current_month = $current_child->getName();
+
+ // Parse the current month id
+ $current_id = intval(preg_replace('/month_([0-9]+)/i', '$1', $current_month));
+
+ // Is this month still valid?
+ if((($month <= 8) && ($current_id <= $month)) || (($month >= 8) && ($current_id >= 8) && ($current_id <= $month)))
+ $array[$current_month] = intval($current_child);
+ }
+ }
+
+ // Increment the current month value
+ $array['month_'.$month]++;
+
+ // Generate the new XML data
+ $months_xml = '';
+
+ foreach($array as $array_key => $array_value)
+ $months_xml .= "\n".' <'.$array_key.'>'.$array_value.'</'.$array_key.'>';
+
+ // Re-write the new values
+ writeXML('access', 'months', $months_xml);
+}
+
+// Writes the current visit to the storage file
+function writeVisit() {
+ // Write total visits
+ writeTotalVisit();
+
+ // Write months visits
+ writeMonthsVisit();
+}
+
+// Returns the default background array
+function defaultBackground() {
+ // Define the default values
+ $background_default = array(
+ 'type' => 'default',
+ 'image_file' => '',
+ 'image_repeat' => 'repeat-x',
+ 'image_horizontal' => 'center',
+ 'image_vertical' => 'top',
+ 'image_adapt' => 'off',
+ 'image_color' => '#cae1e9',
+ 'color_color' => '#cae1e9'
+ );
+
+ return $background_default;
+}
+
+// Reads the notice configuration
+function readNotice() {
+ // Read the notice configuration XML
+ $notice_data = readXML('conf', 'notice');
+
+ // Define the default values
+ $notice_default = array(
+ 'type' => 'none',
+ 'notice' => ''
+ );
+
+ // Stored data array
+ $notice_conf = array();
+
+ // Read the stored values
+ if($notice_data) {
+ // Initialize the notice configuration XML data
+ $notice_xml = new SimpleXMLElement($notice_data);
+
+ // Loop the notice configuration elements
+ foreach($notice_xml->children() as $notice_child)
+ $notice_conf[$notice_child->getName()] = utf8_decode($notice_child);
+ }
+
+ // Checks no value is missing in the stored configuration
+ foreach($notice_default as $notice_name => $notice_value) {
+ if(!isset($notice_conf[$notice_name]) || empty($notice_conf[$notice_name]))
+ $notice_conf[$notice_name] = $notice_default[$notice_name];
+ }
+
+ return $notice_conf;
+}
+
+// The function to get the admin users
+function getUsers() {
+ // Try to read the XML file
+ $data = readXML('conf', 'users');
+ $array = array();
+
+ // Any data?
+ if($data) {
+ $read = new SimpleXMLElement($data);
+
+ // Check the submitted user exists
+ foreach($read->children() as $child) {
+ // Get the node attributes
+ $attributes = $child->attributes();
+
+ // Push the attributes to the global array (converted into strings)
+ $array[$attributes['name'].''] = $attributes['password'].'';
+ }
+ }
+
+ return $array;
+}
+
+// Manages users
+function manageUsers($action, $array) {
+ // Try to read the old XML file
+ $users_array = getUsers();
+
+ // What must we do?
+ switch($action) {
+ // Add some users
+ case 'add':
+ foreach($array as $array_user => $array_password)
+ $users_array[$array_user] = genStrongHash($array_password);
+
+ break;
+
+ // Remove some users
+ case 'remove':
+ foreach($array as $array_user) {
+ // Not the last user?
+ if(count($users_array) > 1)
+ unset($users_array[$array_user]);
+ }
+
+ break;
+ }
+
+ // Regenerate the XML
+ $users_xml = '';
+
+ foreach($users_array as $users_name => $users_password)
+ $users_xml .= "\n".' <user name="'.stripslashes(htmlspecialchars($users_name)).'" password="'.stripslashes($users_password).'" />';
+
+ // Write the main configuration
+ writeXML('conf', 'users', $users_xml);
+}
+
+// Resize an image with GD
+function resizeImage($path, $ext, $width, $height) {
+ // No GD?
+ if(!function_exists('gd_info'))
+ return false;
+
+ try {
+ // Initialize GD
+ switch($ext) {
+ case 'png':
+ $img_resize = imagecreatefrompng($path);
+
+ break;
+
+ case 'gif':
+ $img_resize = imagecreatefromgif($path);
+
+ break;
+
+ default:
+ $img_resize = imagecreatefromjpeg($path);
+ }
+
+ // Get the image size
+ $img_size = getimagesize($path);
+ $img_width = $img_size[0];
+ $img_height = $img_size[1];
+
+ // Necessary to change the image width
+ if($img_width > $width && ($img_width > $img_height)) {
+ // Process the new sizes
+ $new_width = $width;
+ $img_process = (($new_width * 100) / $img_width);
+ $new_height = (($img_height * $img_process) / 100);
+ }
+
+ // Necessary to change the image height
+ else if($img_height > $height && ($img_width < $img_height)) {
+ // Process the new sizes
+ $new_height = $height;
+ $img_process = (($new_height * 100) / $img_height);
+ $new_width = (($img_width * $img_process) / 100);
+ }
+
+ // Else, just use the old sizes
+ else {
+ $new_width = $img_width;
+ $new_height = $img_height;
+ }
+
+ // Create the new image
+ $new_img = imagecreatetruecolor($new_width, $new_height);
+
+ // Must keep alpha pixels?
+ if(($ext == 'png') || ($ext == 'gif')){
+ imagealphablending($new_img, false);
+ imagesavealpha($new_img, true);
+
+ // Set transparent pixels
+ $transparent = imagecolorallocatealpha($new_img, 255, 255, 255, 127);
+ imagefilledrectangle($new_img, 0, 0, $new_width, $new_height, $transparent);
+ }
+
+ // Copy the new image
+ imagecopyresampled($new_img, $img_resize, 0, 0, 0, 0, $new_width, $new_height, $img_size[0], $img_size[1]);
+
+ // Destroy the old data
+ imagedestroy($img_resize);
+ unlink($path);
+
+ // Write the new image
+ switch($ext) {
+ case 'png':
+ imagepng($new_img, $path);
+
+ break;
+
+ case 'gif':
+ imagegif($new_img, $path);
+
+ break;
+
+ default:
+ imagejpeg($new_img, $path, 85);
+ }
+
+ return true;
+ }
+
+ catch(Exception $e) {
+ return false;
+ }
+}
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the PHP script used to generate a chat log
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 26/08/11
+
+*/
+
+// PHP base
+define('JAPPIX_BASE', '..');
+
+// Get the needed files
+require_once('./functions.php');
+require_once('./read-main.php');
+require_once('./read-hosts.php');
+
+// Optimize the page rendering
+hideErrors();
+compressThis();
+
+// Not allowed for a special node
+if(isStatic() || isUpload())
+ exit;
+
+// Create the HTML file to be downloaded
+if(isset($_POST['content']) && isset($_POST['xid']) && !empty($_POST['xid']) && isset($_POST['nick']) && !empty($_POST['nick']) && isset($_POST['avatar']) && !empty($_POST['avatar']) && isset($_POST['date']) && !empty($_POST['date']) && isset($_POST['type']) && !empty($_POST['type'])) {
+ // Get the POST vars
+ $original = $_POST['content'];
+ $xid = $_POST['xid'];
+ $nick = $_POST['nick'];
+ $avatar = $_POST['avatar'];
+ $date = $_POST['date'];
+ $type = $_POST['type'];
+
+ // Generate the XID link
+ $xid_link = 'xmpp:'.$xid;
+
+ if($type == 'groupchat')
+ $xid_link .= '?join';
+
+ // Generates the avatar code
+ if($avatar != 'none')
+ $avatar = '<div class="avatar-container">'.$avatar.'</div>';
+ else
+ $avatar = '';
+
+ // Generates an human-readable date
+ $date = explode('T', $date);
+ $date = explode('-', $date[0]);
+ $date = $date[2].'/'.$date[1].'/'.$date[0];
+
+ // Generate some values
+ $content_dir = '../store/logs/';
+ $filename = 'chat_log-'.md5($xid.time());
+ $filepath = $content_dir.$filename.'.html';
+
+ // Generate Jappix logo Base64 code
+ $logo = base64_encode(file_get_contents(JAPPIX_BASE.'/img/sprites/logs.png'));
+
+ // Create the HTML code
+ $new_text_inter =
+'<!DOCTYPE html>
+<html>
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <title>'.$nick.' ('.$xid.')</title>
+ <style type="text/css">
+ * {
+ margin: 0;
+ padding: 0;
+ }
+
+ body {
+ background-color: #424242;
+ font-family : Verdana, Arial, Helvetica, sans-serif;
+ font-size: 0.8em;
+ text-shadow: 0 0 5px white;
+ color: white;
+ margin: 8px;
+ padding: 8px 12px;
+ }
+
+ a {
+ color: white;
+ }
+
+ #head {
+
+ }
+
+ #head .avatar-container {
+ text-align: center;
+ float: left;
+ height: 70px;
+ width: 70px;
+ margin-right: 18px;
+ }
+
+ #head .avatar {
+ max-height: 70px;
+ max-width: 70px;
+ }
+
+ #head h1 {
+ font-size: 2.2em;
+ margin: 0;
+ text-shadow: 1px 1px 1px black;
+ }
+
+ #head h3 {
+ font-size: 0.95em;
+ margin: 0;
+ }
+
+ #head h5 {
+ font-size: 0.9em;
+ margin: 8px 0 16px 0;
+ }
+
+ #head h3,
+ #head h5 {
+ text-shadow: 0 0 1px black;
+ }
+
+ #head a.logo {
+ position: absolute;
+ top: 16px;
+ right: 20px;
+ }
+
+ #content {
+ background-color: #e8f1f3;
+ color: black;
+ padding: 14px 18px;
+ border-radius: 4px;
+ clear: both;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ box-shadow: 0 0 20px #202020;
+ -moz-box-shadow: 0 0 20px #202020;
+ -webkit-box-shadow: 0 0 20px #202020;
+ }
+
+ #content a {
+ color: black;
+ }
+
+ #content .one-group {
+ border-bottom: 1px dotted #d0d0d0;
+ padding-bottom: 8px;
+ margin-bottom: 10px;
+ }
+
+ #content .one-group b.name {
+ display: block;
+ margin-bottom: 4px;
+ }
+
+ #content .one-group b.name.me {
+ color: #123a5c;
+ }
+
+ #content .one-group b.name.him {
+ color: #801e1e;
+ }
+
+ #content .one-group span.date {
+ float: right;
+ font-size: 0.9em;
+ }
+
+ #content .user-message {
+ margin-bottom: 3px;
+ }
+
+ #content .system-message {
+ color: #053805;
+ margin-bottom: 3px;
+ padding-left: 0 !important;
+ }
+
+ #content .system-message a {
+ color: #053805;
+ }
+
+ .hidden {
+ display: none !important;
+ }
+ </style>
+</head>
+
+<body>
+ <div id="head">
+ '.$avatar.'
+
+ <h1>'.$nick.'</h1>
+ <h3><a href="'.$xid_link.'">'.$xid.'</a></h3>
+ <h5>'.$date.'</h5>
+
+ <a class="logo" href="https://project.jappix.com/" target="_blank">
+ <img src="data:image/png;base64,'.$logo.'" alt="" />
+ </a>
+ </div>
+
+ <div id="content">
+ '.$original.'
+ </div>
+</body>
+</html>'
+;
+
+ $new_text = stripslashes($new_text_inter);
+
+ // Write the code into a file
+ file_put_contents($filepath, $new_text);
+
+ // Security: remove the file and stop the script if too bit (+6MiB)
+ if(filesize($filepath) > 6000000) {
+ unlink($filepath);
+ exit;
+ }
+
+ // Return to the user the generated file ID
+ exit($filename);
+}
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the Jappix geolocation script
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 15/01/12
+
+*/
+
+// PHP base
+define('JAPPIX_BASE', '..');
+
+// Get the needed files
+require_once('./functions.php');
+require_once('./read-main.php');
+require_once('./read-hosts.php');
+
+// Optimize the page rendering
+hideErrors();
+compressThis();
+
+// Not allowed for a special node
+if(isStatic() || isUpload())
+ exit;
+
+// If valid data was sent
+if((isset($_GET['latitude']) && !empty($_GET['latitude'])) && (isset($_GET['longitude']) && !empty($_GET['longitude'])) && (isset($_GET['language']) && !empty($_GET['language']))) {
+ // Set a XML header
+ header('Content-Type: text/xml; charset=utf-8');
+
+ // Get the XML content
+ $xml = read_url('http://maps.googleapis.com/maps/api/geocode/xml?latlng='.urlencode($_GET['latitude']).','.urlencode($_GET['longitude']).'&language='.urlencode($_GET['language']).'&sensor=true');
+
+ exit($xml);
+}
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the store configuration GET handler (manager)
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 26/08/11
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+// Purge requested
+if(isset($_GET['p']) && preg_match('/^((everything)|(cache)|(logs)|(send)|(updates))$/', $_GET['p'])) {
+ purgeFolder($_GET['p']);
+?>
+
+ <p class="info smallspace success"><?php _e("The storage folder you wanted to clean is now empty!"); ?></p>
+
+<?php }
+
+// Folder view?
+if(isset($_GET['b']) && isset($_GET['s'])) {
+ if($_GET['b'] == 'share')
+ $share_folder = urldecode($_GET['s']);
+ else if($_GET['b'] == 'music')
+ $music_folder = urldecode($_GET['s']);
+}
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the file get script
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 03/12/11
+
+*/
+
+// PHP base
+define('JAPPIX_BASE', '..');
+
+// We get the needed files
+require_once('./functions.php');
+require_once('./functions-get.php');
+require_once('./read-main.php');
+require_once('./read-hosts.php');
+
+// Hide PHP errors
+hideErrors();
+
+// Get some parameters
+$is_developer = isDeveloper();
+$has_compression = hasCompression();
+
+if($is_developer) {
+ header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
+ header('Cache-Control: no-store, no-cache, must-revalidate');
+ header('Cache-Control: post-check=0, pre-check=0', false);
+ header('Pragma: no-cache');
+}
+
+// Else, we put a far away cache date (1 year)
+else {
+ $expires = 31536000;
+ header('Pragma: public');
+ header('Cache-Control: maxage='.$expires);
+ header('Expires: '.gmdate('D, d M Y H:i:s', (time() + $expires)).' GMT');
+}
+
+// Initialize the vars
+$type = '';
+$file = '';
+
+// Read the type var
+if(isset($_GET['t']) && !empty($_GET['t']) && preg_match('/^(css|js|img|snd|store)$/', $_GET['t']))
+ $type = $_GET['t'];
+
+// Read the files var
+if(isset($_GET['f']) && !empty($_GET['f']) && isSafe($_GET['f']))
+ $file = $_GET['f'];
+
+// Read the group var (only for text files)
+if(isset($_GET['g']) && !empty($_GET['g']) && preg_match('/^(\S+)\.xml$/', $_GET['g']) && preg_match('/^(css|js)$/', $type) && isSafe($_GET['g']) && file_exists('../xml/'.$_GET['g'])) {
+ $xml_data = file_get_contents('../xml/'.$_GET['g']);
+
+ // Any data?
+ if($xml_data) {
+ $xml_read = new SimpleXMLElement($xml_data);
+ $xml_parse = $xml_read->$type;
+
+ // Files were added to the list before (with file var)?
+ if($file)
+ $file .= '~'.$xml_parse;
+ else
+ $file = $xml_parse;
+ }
+}
+
+// We check if the data was submitted
+if($file && $type) {
+ // We define some stuffs
+ $dir = '../'.$type.'/';
+ $path = $dir.$file;
+
+ // Define the real type if this is a "store" file
+ if($type == 'store') {
+ // Extract the file extension
+ switch(getFileExt($file)) {
+ // CSS file
+ case 'css':
+ $type = 'css';
+
+ break;
+
+ // JS file
+ case 'js':
+ $type = 'js';
+
+ break;
+
+ // Audio file
+ case 'ogg':
+ case 'oga':
+ $type = 'snd';
+
+ break;
+
+ // Image file
+ case 'png':
+ case 'jpg':
+ case 'jpeg':
+ case 'gif':
+ case 'bmp':
+ $type = 'img';
+
+ break;
+ }
+ }
+
+ // JS and CSS special stuffs
+ if(($type == 'css') || ($type == 'js')) {
+ // Compression var
+ if($has_compression)
+ $cache_encoding = 'deflate';
+ else
+ $cache_encoding = 'plain';
+
+ // Get the vars
+ $version = getVersion();
+ $hash = genHash($version);
+ $cache_hash = md5($path.$hash.staticLocation()).'_'.$cache_encoding;
+
+ // Check if the browser supports DEFLATE
+ $deflate_support = false;
+
+ if(isset($_SERVER['HTTP_ACCEPT_ENCODING']) && substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate') && hasCompression() && !$is_developer)
+ $deflate_support = true;
+
+ // Internationalization
+ if($type == 'js') {
+ if(isset($_GET['l']) && !empty($_GET['l']) && !preg_match('/\.\.\//', $_GET['l']) && is_dir('../lang/'.$_GET['l']))
+ $locale = $_GET['l'];
+ else
+ $locale = 'en';
+ }
+
+ else
+ $locale = '';
+
+ // Define the cache lang name
+ if($locale)
+ $cache_lang = $cache_hash.'_'.$locale;
+ else
+ $cache_lang = $cache_hash;
+ }
+
+ // Explode the file string
+ if(strpos($file, '~') != false)
+ $array = explode('~', $file);
+ else
+ $array = array($file);
+
+ // Define the reading vars
+ $continue = true;
+ $loop_files = true;
+
+ // Check the cache exists for text files (avoid the heavy file_exists loop!)
+ if(!$is_developer && (($type == 'css') || ($type == 'js')) && hasCache($cache_lang))
+ $loop_files = false;
+
+ // Check if the all the file(s) exist(s)
+ if($loop_files) {
+ foreach($array as $current) {
+ // Stop the loop if a file is missing
+ if(!file_exists($dir.$current)) {
+ $continue = false;
+
+ break;
+ }
+ }
+ }
+
+ // We can read the file(s)
+ if($continue) {
+ // We get the file MIME type
+ $mime = strtolower(preg_replace('/(^)(.+)(\.)(.+)($)/i', '$4', $file));
+
+ // We set up a known MIME type (and some other headers)
+ if(($type == 'css') || ($type == 'js')) {
+ // DEFLATE header
+ if($deflate_support)
+ header('Content-Encoding: deflate');
+
+ // MIME header
+ if($type == 'css')
+ header('Content-Type: text/css; charset=utf-8');
+ else if($type == 'js')
+ header('Content-Type: application/javascript; charset=utf-8');
+ }
+
+ else if($mime == 'png')
+ header('Content-Type: image/png');
+ else if($mime == 'gif')
+ header('Content-Type: image/gif');
+ else if(($mime == 'jpg') || ($mime == 'jpeg'))
+ header('Content-Type: image/jpeg');
+ else if($mime == 'bmp')
+ header('Content-Type: image/bmp');
+ else if(($mime == 'oga') || ($mime == 'ogg'))
+ header('Content-Type: audio/ogg');
+
+ // Catch the file MIME type
+ else
+ header('Content-Type: '.getFileMIME($path));
+
+ // Read the text file(s) (CSS & JS)
+ if(($type == 'css') || ($type == 'js')) {
+ // If there's a cache file, read it
+ if(hasCache($cache_lang) && !$is_developer) {
+ $cache_read = readCache($cache_lang);
+
+ if($deflate_support || !$has_compression)
+ echo $cache_read;
+ else
+ echo gzinflate($cache_read);
+ }
+
+ // Else, we generate the cache
+ else {
+ // First try to read the cache reference
+ if(hasCache($cache_hash) && !$is_developer) {
+ // Read the reference
+ $cache_reference = readCache($cache_hash);
+
+ // Filter the cache reference
+ if($has_compression)
+ $output = gzinflate($cache_reference);
+ else
+ $output = $cache_reference;
+ }
+
+ // No cache reference, we should generate it
+ else {
+ // Initialize the loop
+ $looped = '';
+
+ // Add the content of the current file
+ foreach($array as $current)
+ $looped .= rmBOM(file_get_contents($dir.$current))."\n";
+
+ // Filter the CSS
+ if($type == 'css') {
+ // Apply the CSS logos
+ $looped = setLogos($looped, $array);
+
+ // Apply the CSS background
+ $looped = setBackground($looped);
+
+ // Set the Get API paths
+ $looped = setPath($looped, $hash, HOST_STATIC, $type, '');
+ }
+
+ // Optimize the code rendering
+ if($type == 'css') {
+ // Can minify the CSS
+ if($has_compression && !$is_developer)
+ $output = compressCSS($looped);
+ else
+ $output = $looped;
+ }
+
+ else {
+ // Can minify the JS (sloooooow!)
+ if($has_compression && !$is_developer) {
+ require_once('./jsmin.php');
+ $output = JSMin::minify($looped);
+ }
+
+ else
+ $output = $looped;
+ }
+
+ // Generate the reference cache
+ if($has_compression)
+ $final = gzdeflate($output, 9);
+ else
+ $final = $output;
+
+ // Write it!
+ genCache($final, $is_developer, $cache_hash);
+ }
+
+ // Filter the JS
+ if($type == 'js') {
+ // Set the JS locales
+ $output = setLocales($output, $locale);
+
+ // Set the JS configuration
+ $output = setConfiguration($output, $locale, $version, uploadMaxSize());
+
+ // Set the Get API paths
+ $output = setPath($output, $hash, HOST_STATIC, $type, $locale);
+
+ // Translate the JS script
+ require_once('./gettext.php');
+ includeTranslation($locale, 'main');
+ $output = setTranslation($output);
+
+ // Generate the cache
+ if($has_compression)
+ $final = gzdeflate($output, 9);
+ else
+ $final = $output;
+
+ // Write it!
+ genCache($final, $is_developer, $cache_lang);
+ }
+
+ // Output a well-encoded string
+ if($deflate_support || !$has_compression)
+ echo $final;
+ else
+ echo gzinflate($final);
+ }
+ }
+
+ // Read the binary file (PNG, OGA and others)
+ else
+ readfile($path);
+
+ exit;
+ }
+
+ // The file was not found
+ header('Status: 404 Not Found', true, 404);
+ exit('HTTP/1.1 404 Not Found');
+}
+
+// The request is not correct
+header('Status: 400 Bad Request', true, 400);
+exit('HTTP/1.1 400 Bad Request');
+
+?>
--- /dev/null
+<?php
+
+/*
+ Copyright (c) 2003, 2005, 2006, 2009 Danilo Segan <danilo@kvota.net>.
+
+ This file is part of PHP-gettext.
+
+ PHP-gettext is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ PHP-gettext is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with PHP-gettext; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+*/
+
+/**
+ * MODIFIED FOR THE JAPPIX PROJECT
+ * Last revision: 10/11/10
+ */
+
+ // Simple class to wrap file streams, string streams, etc.
+ // seek is essential, and it should be byte stream
+class StreamReader {
+ // should return a string [FIXME: perhaps return array of bytes?]
+ function read($bytes) {
+ return false;
+ }
+
+ // should return new position
+ function seekto($position) {
+ return false;
+ }
+
+ // returns current position
+ function currentpos() {
+ return false;
+ }
+
+ // returns length of entire stream (limit for seekto()s)
+ function length() {
+ return false;
+ }
+};
+
+class StringReader {
+ var $_pos;
+ var $_str;
+
+ function StringReader($str='') {
+ $this->_str = $str;
+ $this->_pos = 0;
+ }
+
+ function read($bytes) {
+ $data = substr($this->_str, $this->_pos, $bytes);
+ $this->_pos += $bytes;
+ if (strlen($this->_str)<$this->_pos)
+ $this->_pos = strlen($this->_str);
+
+ return $data;
+ }
+
+ function seekto($pos) {
+ $this->_pos = $pos;
+ if (strlen($this->_str)<$this->_pos)
+ $this->_pos = strlen($this->_str);
+ return $this->_pos;
+ }
+
+ function currentpos() {
+ return $this->_pos;
+ }
+
+ function length() {
+ return strlen($this->_str);
+ }
+
+};
+
+
+class FileReader {
+ var $_pos;
+ var $_fd;
+ var $_length;
+
+ function FileReader($filename) {
+ if (file_exists($filename)) {
+
+ $this->_length=filesize($filename);
+ $this->_pos = 0;
+ $this->_fd = fopen($filename,'rb');
+ if (!$this->_fd) {
+ $this->error = 3; // Cannot read file, probably permissions
+ return false;
+ }
+ } else {
+ $this->error = 2; // File doesn't exist
+ return false;
+ }
+ }
+
+ function read($bytes) {
+ if ($bytes) {
+ fseek($this->_fd, $this->_pos);
+
+ // PHP 5.1.1 does not read more than 8192 bytes in one fread()
+ // the discussions at PHP Bugs suggest it's the intended behaviour
+ $data = '';
+ while ($bytes > 0) {
+ $chunk = fread($this->_fd, $bytes);
+ $data .= $chunk;
+ $bytes -= strlen($chunk);
+ }
+ $this->_pos = ftell($this->_fd);
+
+ return $data;
+ } else return '';
+ }
+
+ function seekto($pos) {
+ fseek($this->_fd, $pos);
+ $this->_pos = ftell($this->_fd);
+ return $this->_pos;
+ }
+
+ function currentpos() {
+ return $this->_pos;
+ }
+
+ function length() {
+ return $this->_length;
+ }
+
+ function close() {
+ fclose($this->_fd);
+ }
+
+};
+
+// Preloads entire file in memory first, then creates a StringReader
+// over it (it assumes knowledge of StringReader internals)
+class CachedFileReader extends StringReader {
+ function CachedFileReader($filename) {
+ if (file_exists($filename)) {
+
+ $length=filesize($filename);
+ $fd = fopen($filename,'rb');
+
+ if (!$fd) {
+ $this->error = 3; // Cannot read file, probably permissions
+ return false;
+ }
+ $this->_str = fread($fd, $length);
+ fclose($fd);
+
+ } else {
+ $this->error = 2; // File doesn't exist
+ return false;
+ }
+ }
+};
+
+/*
+ Copyright (c) 2003, 2009 Danilo Segan <danilo@kvota.net>.
+ Copyright (c) 2005 Nico Kaiser <nico@siriux.net>
+
+ This file is part of PHP-gettext.
+
+ PHP-gettext is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ PHP-gettext is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with PHP-gettext; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+*/
+
+/**
+ * Provides a simple gettext replacement that works independently from
+ * the system's gettext abilities.
+ * It can read MO files and use them for translating strings.
+ * The files are passed to gettext_reader as a Stream (see streams.php)
+ *
+ * This version has the ability to cache all strings and translations to
+ * speed up the string lookup.
+ * While the cache is enabled by default, it can be switched off with the
+ * second parameter in the constructor (e.g. whenusing very large MO files
+ * that you don't want to keep in memory)
+ */
+class gettext_reader {
+ //public:
+ var $error = 0; // public variable that holds error code (0 if no error)
+
+ //private:
+ var $BYTEORDER = 0; // 0: low endian, 1: big endian
+ var $STREAM = NULL;
+ var $short_circuit = false;
+ var $enable_cache = false;
+ var $originals = NULL; // offset of original table
+ var $translations = NULL; // offset of translation table
+ var $pluralheader = NULL; // cache header field for plural forms
+ var $total = 0; // total string count
+ var $table_originals = NULL; // table for original strings (offsets)
+ var $table_translations = NULL; // table for translated strings (offsets)
+ var $cache_translations = NULL; // original -> translation mapping
+
+
+ /* Methods */
+
+
+ /**
+ * Reads a 32bit Integer from the Stream
+ *
+ * @access private
+ * @return Integer from the Stream
+ */
+ function readint() {
+ if ($this->BYTEORDER == 0) {
+ // low endian
+ $input=unpack('V', $this->STREAM->read(4));
+ return array_shift($input);
+ } else {
+ // big endian
+ $input=unpack('N', $this->STREAM->read(4));
+ return array_shift($input);
+ }
+ }
+
+ function read($bytes) {
+ return $this->STREAM->read($bytes);
+ }
+
+ /**
+ * Reads an array of Integers from the Stream
+ *
+ * @param int count How many elements should be read
+ * @return Array of Integers
+ */
+ function readintarray($count) {
+ if ($this->BYTEORDER == 0) {
+ // low endian
+ return unpack('V'.$count, $this->STREAM->read(4 * $count));
+ } else {
+ // big endian
+ return unpack('N'.$count, $this->STREAM->read(4 * $count));
+ }
+ }
+
+ /**
+ * Constructor
+ *
+ * @param object Reader the StreamReader object
+ * @param boolean enable_cache Enable or disable caching of strings (default on)
+ */
+ function gettext_reader($Reader, $enable_cache = true) {
+ // If there isn't a StreamReader, turn on short circuit mode.
+ if (! $Reader || isset($Reader->error) ) {
+ $this->short_circuit = true;
+ return;
+ }
+
+ // Caching can be turned off
+ $this->enable_cache = $enable_cache;
+
+ $MAGIC1 = "\x95\x04\x12\xde";
+ $MAGIC2 = "\xde\x12\x04\x95";
+
+ $this->STREAM = $Reader;
+ $magic = $this->read(4);
+ if ($magic == $MAGIC1) {
+ $this->BYTEORDER = 1;
+ } elseif ($magic == $MAGIC2) {
+ $this->BYTEORDER = 0;
+ } else {
+ $this->error = 1; // not MO file
+ return false;
+ }
+
+ // FIXME: Do we care about revision? We should.
+ $revision = $this->readint();
+
+ $this->total = $this->readint();
+ $this->originals = $this->readint();
+ $this->translations = $this->readint();
+ }
+
+ /**
+ * Loads the translation tables from the MO file into the cache
+ * If caching is enabled, also loads all strings into a cache
+ * to speed up translation lookups
+ *
+ * @access private
+ */
+ function load_tables() {
+ if (is_array($this->cache_translations) &&
+ is_array($this->table_originals) &&
+ is_array($this->table_translations))
+ return;
+
+ /* get original and translations tables */
+ $this->STREAM->seekto($this->originals);
+ $this->table_originals = $this->readintarray($this->total * 2);
+ $this->STREAM->seekto($this->translations);
+ $this->table_translations = $this->readintarray($this->total * 2);
+
+ if ($this->enable_cache) {
+ $this->cache_translations = array ();
+ /* read all strings in the cache */
+ for ($i = 0; $i < $this->total; $i++) {
+ $this->STREAM->seekto($this->table_originals[$i * 2 + 2]);
+ $original = $this->STREAM->read($this->table_originals[$i * 2 + 1]);
+ $this->STREAM->seekto($this->table_translations[$i * 2 + 2]);
+ $translation = $this->STREAM->read($this->table_translations[$i * 2 + 1]);
+ $this->cache_translations[$original] = $translation;
+ }
+ }
+ }
+
+ /**
+ * Returns a string from the "originals" table
+ *
+ * @access private
+ * @param int num Offset number of original string
+ * @return string Requested string if found, otherwise ''
+ */
+ function get_original_string($num) {
+ $length = $this->table_originals[$num * 2 + 1];
+ $offset = $this->table_originals[$num * 2 + 2];
+ if (! $length)
+ return '';
+ $this->STREAM->seekto($offset);
+ $data = $this->STREAM->read($length);
+ return (string)$data;
+ }
+
+ /**
+ * Returns a string from the "translations" table
+ *
+ * @access private
+ * @param int num Offset number of original string
+ * @return string Requested string if found, otherwise ''
+ */
+ function get_translation_string($num) {
+ $length = $this->table_translations[$num * 2 + 1];
+ $offset = $this->table_translations[$num * 2 + 2];
+ if (! $length)
+ return '';
+ $this->STREAM->seekto($offset);
+ $data = $this->STREAM->read($length);
+ return (string)$data;
+ }
+
+ /**
+ * Binary search for string
+ *
+ * @access private
+ * @param string string
+ * @param int start (internally used in recursive function)
+ * @param int end (internally used in recursive function)
+ * @return int string number (offset in originals table)
+ */
+ function find_string($string, $start = -1, $end = -1) {
+ if (($start == -1) or ($end == -1)) {
+ // find_string is called with only one parameter, set start end end
+ $start = 0;
+ $end = $this->total;
+ }
+ if (abs($start - $end) <= 1) {
+ // We're done, now we either found the string, or it doesn't exist
+ $txt = $this->get_original_string($start);
+ if ($string == $txt)
+ return $start;
+ else
+ return -1;
+ } else if ($start > $end) {
+ // start > end -> turn around and start over
+ return $this->find_string($string, $end, $start);
+ } else {
+ // Divide table in two parts
+ $half = (int)(($start + $end) / 2);
+ $cmp = strcmp($string, $this->get_original_string($half));
+ if ($cmp == 0)
+ // string is exactly in the middle => return it
+ return $half;
+ else if ($cmp < 0)
+ // The string is in the upper half
+ return $this->find_string($string, $start, $half);
+ else
+ // The string is in the lower half
+ return $this->find_string($string, $half, $end);
+ }
+ }
+
+ /**
+ * Translates a string
+ *
+ * @access public
+ * @param string string to be translated
+ * @return string translated string (or original, if not found)
+ */
+ function translate($string) {
+ if ($this->short_circuit)
+ return $string;
+ $this->load_tables();
+
+ if ($this->enable_cache) {
+ // Caching enabled, get translated string from cache
+ if (array_key_exists($string, $this->cache_translations))
+ return $this->cache_translations[$string];
+ else
+ return $string;
+ } else {
+ // Caching not enabled, try to find string
+ $num = $this->find_string($string);
+ if ($num == -1)
+ return $string;
+ else
+ return $this->get_translation_string($num);
+ }
+ }
+
+ /**
+ * Sanitize plural form expression for use in PHP eval call.
+ *
+ * @access private
+ * @return string sanitized plural form expression
+ */
+ function sanitize_plural_expression($expr) {
+ // Get rid of disallowed characters.
+ $expr = preg_replace('@[^a-zA-Z0-9_:;\(\)\?\|\&=!<>+*/\%-]@', '', $expr);
+
+ // Add parenthesis for tertiary '?' operator.
+ $expr .= ';';
+ $res = '';
+ $p = 0;
+ for ($i = 0; $i < strlen($expr); $i++) {
+ $ch = $expr[$i];
+ switch ($ch) {
+ case '?':
+ $res .= ' ? (';
+ $p++;
+ break;
+ case ':':
+ $res .= ') : (';
+ break;
+ case ';':
+ $res .= str_repeat( ')', $p) . ';';
+ $p = 0;
+ break;
+ default:
+ $res .= $ch;
+ }
+ }
+ return $res;
+ }
+
+ /**
+ * Get possible plural forms from MO header
+ *
+ * @access private
+ * @return string plural form header
+ */
+ function get_plural_forms() {
+ // lets assume message number 0 is header
+ // this is true, right?
+ $this->load_tables();
+
+ // cache header field for plural forms
+ if (! is_string($this->pluralheader)) {
+ if ($this->enable_cache) {
+ $header = $this->cache_translations[""];
+ } else {
+ $header = $this->get_translation_string(0);
+ }
+ if (eregi("plural-forms: ([^\n]*)\n", $header, $regs))
+ $expr = $regs[1];
+ else
+ $expr = "nplurals=2; plural=n == 1 ? 0 : 1;";
+
+ $this->pluralheader = $this->sanitize_plural_expression($expr);
+ }
+ return $this->pluralheader;
+ }
+
+ /**
+ * Detects which plural form to take
+ *
+ * @access private
+ * @param n count
+ * @return int array index of the right plural form
+ */
+ function select_string($n) {
+ $string = $this->get_plural_forms();
+ $string = str_replace('nplurals',"\$total",$string);
+ $string = str_replace("n",$n,$string);
+ $string = str_replace('plural',"\$plural",$string);
+
+ $total = 0;
+ $plural = 0;
+
+ eval("$string");
+ if ($plural >= $total) $plural = $total - 1;
+ return $plural;
+ }
+
+ /**
+ * Plural version of gettext
+ *
+ * @access public
+ * @param string single
+ * @param string plural
+ * @param string number
+ * @return translated plural form
+ */
+ function ngettext($single, $plural, $number) {
+ if ($this->short_circuit) {
+ if ($number != 1)
+ return $plural;
+ else
+ return $single;
+ }
+
+ // find out the appropriate form
+ $select = $this->select_string($number);
+
+ // this should contains all strings separated by NULLs
+ $key = $single.chr(0).$plural;
+
+
+ if ($this->enable_cache) {
+ if (! array_key_exists($key, $this->cache_translations)) {
+ return ($number != 1) ? $plural : $single;
+ } else {
+ $result = $this->cache_translations[$key];
+ $list = explode(chr(0), $result);
+ return $list[$select];
+ }
+ } else {
+ $num = $this->find_string($key);
+ if ($num == -1) {
+ return ($number != 1) ? $plural : $single;
+ } else {
+ $result = $this->get_translation_string($num);
+ $list = explode(chr(0), $result);
+ return $list[$select];
+ }
+ }
+ }
+
+}
+
+/*
+ Copyright (c) 2005 Steven Armstrong <sa at c-area dot ch>
+ Copyright (c) 2009 Danilo Segan <danilo@kvota.net>
+
+ Drop in replacement for native gettext.
+
+ This file is part of PHP-gettext.
+
+ PHP-gettext is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ PHP-gettext is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with PHP-gettext; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+*/
+/*
+LC_CTYPE 0
+LC_NUMERIC 1
+LC_TIME 2
+LC_COLLATE 3
+LC_MONETARY 4
+LC_MESSAGES 5
+LC_ALL 6
+*/
+
+
+// LC_MESSAGES is not available if php-gettext is not loaded
+// while the other constants are already available from session extension.
+if (!defined('LC_MESSAGES')) {
+ define('LC_MESSAGES', 5);
+}
+
+// Variables
+
+global $text_domains, $default_domain, $LC_CATEGORIES, $EMULATEGETTEXT, $CURRENTLOCALE;
+$text_domains = array();
+$default_domain = 'messages';
+$LC_CATEGORIES = array('LC_CTYPE', 'LC_NUMERIC', 'LC_TIME', 'LC_COLLATE', 'LC_MONETARY', 'LC_MESSAGES', 'LC_ALL');
+$EMULATEGETTEXT = 0;
+$CURRENTLOCALE = '';
+
+/* Class to hold a single domain included in $text_domains. */
+class domain {
+ var $l10n;
+ var $path;
+ var $codeset;
+}
+
+// Utility functions
+
+/**
+ * Utility function to get a StreamReader for the given text domain.
+ */
+function _get_reader($domain=null, $category=5, $enable_cache=true) {
+ global $text_domains, $default_domain, $LC_CATEGORIES;
+ if (!isset($domain)) $domain = $default_domain;
+ if (!isset($text_domains[$domain]->l10n)) {
+ // get the current locale
+ $locale = _setlocale(LC_MESSAGES, 0);
+ $bound_path = isset($text_domains[$domain]->path) ?
+ $text_domains[$domain]->path : './';
+ $subpath = $LC_CATEGORIES[$category] ."/$domain.mo";
+ /* Figure out all possible locale names and start with the most
+ specific ones. I.e. for sr_CS.UTF-8@latin, look through all of
+ sr_CS.UTF-8@latin, sr_CS@latin, sr@latin, sr_CS.UTF-8, sr_CS, sr.
+ */
+ $locale_names = array();
+ if (preg_match("/([a-z]{2,3})" // language code
+ ."(_([A-Z]{2}))?" // country code
+ ."(\.([-A-Za-z0-9_]))?" // charset
+ ."(@([-A-Za-z0-9_]+))?/", // @ modifier
+ $locale, $matches)) {
+
+ $lang = '';
+ $country = '';
+ $charset = '';
+ $modifier = '';
+
+ if(isset($matches[1]))
+ $lang = $matches[1];
+ if(isset($matches[3]))
+ $country = $matches[3];
+ if(isset($matches[5]))
+ $charset = $matches[5];
+ if(isset($matches[7]))
+ $modifier = $matches[7];
+
+ if ($modifier) {
+ $locale_names = array("${lang}_$country.$charset@$modifier",
+ "${lang}_$country@$modifier",
+ "$lang@$modifier");
+ }
+ array_push($locale_names,
+ "${lang}_$country.$charset", "${lang}_$country", "$lang");
+ }
+ array_push($locale_names, $locale);
+
+ $input = null;
+ foreach ($locale_names as $locale) {
+ $full_path = $bound_path . $locale . "/" . $subpath;
+ if (file_exists($full_path)) {
+ $input = new FileReader($full_path);
+ break;
+ }
+ }
+
+ if (!array_key_exists($domain, $text_domains)) {
+ // Initialize an empty domain object.
+ $text_domains[$domain] = new domain();
+ }
+ $text_domains[$domain]->l10n = new gettext_reader($input,
+ $enable_cache);
+ }
+ return $text_domains[$domain]->l10n;
+}
+
+/**
+ * Returns whether we are using our emulated gettext API or PHP built-in one.
+ */
+function locale_emulation() {
+ global $EMULATEGETTEXT;
+ return $EMULATEGETTEXT;
+}
+
+/**
+ * Checks if the current locale is supported on this system.
+ */
+function _check_locale() {
+ global $EMULATEGETTEXT;
+ return !$EMULATEGETTEXT;
+}
+
+/**
+ * Get the codeset for the given domain.
+ */
+function _get_codeset($domain=null) {
+ global $text_domains, $default_domain, $LC_CATEGORIES;
+ if (!isset($domain)) $domain = $default_domain;
+ return (isset($text_domains[$domain]->codeset))? $text_domains[$domain]->codeset : ini_get('mbstring.internal_encoding');
+}
+
+/**
+ * Convert the given string to the encoding set by bind_textdomain_codeset.
+ */
+function _encode($text) {
+ $source_encoding = mb_detect_encoding($text);
+ $target_encoding = _get_codeset();
+ if ($source_encoding != $target_encoding) {
+ return mb_convert_encoding($text, $target_encoding, $source_encoding);
+ }
+ else {
+ return $text;
+ }
+}
+
+
+
+
+// Custom implementation of the standard gettext related functions
+
+/**
+ * Sets a requested locale, if needed emulates it.
+ */
+function _setlocale($category, $locale) {
+ global $CURRENTLOCALE, $EMULATEGETTEXT;
+ if ($locale === 0) { // use === to differentiate between string "0"
+ if ($CURRENTLOCALE != '')
+ return $CURRENTLOCALE;
+ else
+ // obey LANG variable, maybe extend to support all of LC_* vars
+ // even if we tried to read locale without setting it first
+ return _setlocale($category, $CURRENTLOCALE);
+ } else {
+ $ret = 0;
+ if (function_exists('setlocale')) // I don't know if this ever happens ;)
+ $ret = setlocale($category, $locale);
+ if (($ret and $locale == '') or ($ret == $locale)) {
+ $EMULATEGETTEXT = 0;
+ $CURRENTLOCALE = $ret;
+ } else {
+ if ($locale == '') // emulate variable support
+ $CURRENTLOCALE = getenv('LANG');
+ else
+ $CURRENTLOCALE = $locale;
+ $EMULATEGETTEXT = 1;
+ }
+ // Allow locale to be changed on the go for one translation domain.
+ global $text_domains, $default_domain;
+ unset($text_domains[$default_domain]->l10n);
+ return $CURRENTLOCALE;
+ }
+}
+
+/**
+ * Sets the path for a domain.
+ */
+function _bindtextdomain($domain, $path) {
+ global $text_domains;
+ // ensure $path ends with a slash ('/' should work for both, but lets still play nice)
+ if (substr(php_uname(), 0, 7) == "Windows") {
+ if ($path[strlen($path)-1] != '\\' and $path[strlen($path)-1] != '/')
+ $path .= '\\';
+ } else {
+ if ($path[strlen($path)-1] != '/')
+ $path .= '/';
+ }
+ if (!array_key_exists($domain, $text_domains)) {
+ // Initialize an empty domain object.
+ $text_domains[$domain] = new domain();
+ }
+ $text_domains[$domain]->path = $path;
+}
+
+/**
+ * Specify the character encoding in which the messages from the DOMAIN message catalog will be returned.
+ */
+function _bind_textdomain_codeset($domain, $codeset) {
+ global $text_domains;
+ $text_domains[$domain]->codeset = $codeset;
+}
+
+/**
+ * Sets the default domain.
+ */
+function _textdomain($domain) {
+ global $default_domain;
+ $default_domain = $domain;
+}
+
+/**
+ * Lookup a message in the current domain.
+ */
+function _gettext($msgid) {
+ $l10n = _get_reader();
+ //return $l10n->translate($msgid);
+ return _encode($l10n->translate($msgid));
+}
+/**
+ * Alias for gettext.
+ */
+function __($msgid) {
+ return _gettext($msgid);
+}
+/**
+ * Plural version of gettext.
+ */
+function _ngettext($single, $plural, $number) {
+ $l10n = _get_reader();
+ //return $l10n->ngettext($single, $plural, $number);
+ return _encode($l10n->ngettext($single, $plural, $number));
+}
+
+/**
+ * Override the current domain.
+ */
+function _dgettext($domain, $msgid) {
+ $l10n = _get_reader($domain);
+ //return $l10n->translate($msgid);
+ return _encode($l10n->translate($msgid));
+}
+/**
+ * Plural version of dgettext.
+ */
+function _dngettext($domain, $single, $plural, $number) {
+ $l10n = _get_reader($domain);
+ //return $l10n->ngettext($single, $plural, $number);
+ return _encode($l10n->ngettext($single, $plural, $number));
+}
+
+/**
+ * Overrides the domain and category for a single lookup.
+ */
+function _dcgettext($domain, $msgid, $category) {
+ $l10n = _get_reader($domain, $category);
+ //return $l10n->translate($msgid);
+ return _encode($l10n->translate($msgid));
+}
+/**
+ * Plural version of dcgettext.
+ */
+function _dcngettext($domain, $single, $plural, $number, $category) {
+ $l10n = _get_reader($domain, $category);
+ //return $l10n->ngettext($single, $plural, $number);
+ return _encode($l10n->ngettext($single, $plural, $number));
+}
+
+
+
+// Wrappers to use if the standard gettext functions are available, but the current locale is not supported by the system.
+// Use the standard impl if the current locale is supported, use the custom impl otherwise.
+
+function T_setlocale($category, $locale) {
+ return _setlocale($category, $locale);
+}
+
+function T_bindtextdomain($domain, $path) {
+ if (_check_locale()) return bindtextdomain($domain, $path);
+ else return _bindtextdomain($domain, $path);
+}
+function T_bind_textdomain_codeset($domain, $codeset) {
+ // bind_textdomain_codeset is available only in PHP 4.2.0+
+ if (_check_locale() and function_exists('bind_textdomain_codeset')) return bind_textdomain_codeset($domain, $codeset);
+ else return _bind_textdomain_codeset($domain, $codeset);
+}
+function T_textdomain($domain) {
+ if (_check_locale()) return textdomain($domain);
+ else return _textdomain($domain);
+}
+function T_gettext($msgid) {
+ if (_check_locale()) return gettext($msgid);
+ else return _gettext($msgid);
+}
+function T_($msgid) {
+ if (_check_locale()) return _($msgid);
+ return __($msgid);
+}
+function T_ngettext($single, $plural, $number) {
+ if (_check_locale()) return ngettext($single, $plural, $number);
+ else return _ngettext($single, $plural, $number);
+}
+function T_dgettext($domain, $msgid) {
+ if (_check_locale()) return dgettext($domain, $msgid);
+ else return _dgettext($domain, $msgid);
+}
+function T_dngettext($domain, $single, $plural, $number) {
+ if (_check_locale()) return dngettext($domain, $single, $plural, $number);
+ else return _dngettext($domain, $single, $plural, $number);
+}
+function T_dcgettext($domain, $msgid, $category) {
+ if (_check_locale()) return dcgettext($domain, $msgid, $category);
+ else return _dcgettext($domain, $msgid, $category);
+}
+function T_dcngettext($domain, $single, $plural, $number, $category) {
+ if (_check_locale()) return dcngettext($domain, $single, $plural, $number, $category);
+ else return _dcngettext($domain, $single, $plural, $number, $category);
+}
+
+
+
+// Wrappers used as a drop in replacement for the standard gettext functions
+
+if (!function_exists('gettext')) {
+ function bindtextdomain($domain, $path) {
+ return _bindtextdomain($domain, $path);
+ }
+ function bind_textdomain_codeset($domain, $codeset) {
+ return _bind_textdomain_codeset($domain, $codeset);
+ }
+ function textdomain($domain) {
+ return _textdomain($domain);
+ }
+ function gettext($msgid) {
+ return _gettext($msgid);
+ }
+ function _($msgid) {
+ return __($msgid);
+ }
+ function ngettext($single, $plural, $number) {
+ return _ngettext($single, $plural, $number);
+ }
+ function dgettext($domain, $msgid) {
+ return _dgettext($domain, $msgid);
+ }
+ function dngettext($domain, $single, $plural, $number) {
+ return _dngettext($domain, $single, $plural, $number);
+ }
+ function dcgettext($domain, $msgid, $category) {
+ return _dcgettext($domain, $msgid, $category);
+ }
+ function dcngettext($domain, $single, $plural, $number, $category) {
+ return _dcngettext($domain, $single, $plural, $number, $category);
+ }
+}
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the Jappix Install PHP/HTML code
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 25/08/11
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+// Define the configuration folder
+$conf_folder = JAPPIX_BASE.'/store/conf';
+
+// Initialize the step
+$step = 1;
+
+// Initialize some vars
+$form_parent = 'install';
+$user_name = '';
+$user_password = '';
+$valid_user = true;
+
+if(isset($_POST['step']) && !empty($_POST['step'])) {
+ $step = intval($_POST['step']);
+
+ switch($step) {
+ // Administrator account configuration submitted
+ case 3:
+ include(JAPPIX_BASE.'/php/post-users.php');
+ break;
+
+ // Main configuration submitted
+ case 4:
+ include(JAPPIX_BASE.'/php/post-main.php');
+ break;
+
+ // Hosts configuration submitted
+ case 5:
+ include(JAPPIX_BASE.'/php/post-hosts.php');
+ break;
+ }
+}
+
+// Not frozen on the previous step?
+if(!isset($_POST['check']) && (isset($_POST['submit']) || isset($_POST['finish']))) {
+ // Checks the current step is valid
+ if(($step >= 2) && !is_dir($conf_folder))
+ $step = 2;
+ else if(($step >= 3) && !usersConfName())
+ $step = 3;
+ else if(($step >= 4) && !file_exists($conf_folder.'/main.xml'))
+ $step = 4;
+ else if(($step >= 5) && !file_exists($conf_folder.'/hosts.xml'))
+ $step = 5;
+ else
+ $step++;
+}
+
+// These steps are not available
+if(($step > 6) || !is_int($step))
+ $step = 6;
+
+// Get the current step title
+$names = array(
+ T_("Welcome"),
+ T_("Storage configuration"),
+ T_("Administrator account"),
+ T_("Main configuration"),
+ T_("Hosts configuration"),
+ T_("Services installation")
+);
+
+// Continue marker
+$continue = true;
+
+// Form action
+if($step < 6)
+ $form_action = './?m=install'.keepGet('m', false);
+else
+ $form_action = './'.keepGet('m', true);
+
+?>
+<!DOCTYPE html>
+<?php htmlTag($locale); ?>
+
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+ <meta name="robots" content="none" />
+ <title><?php _e("Jappix installation"); ?> • <?php echo($names[$step - 1]); ?></title>
+ <link rel="shortcut icon" href="./favicon.ico" />
+ <?php echoGetFiles($hash, '', 'css', 'install.xml', ''); echo "\n"; ?>
+ <!--[if lt IE 9]><?php echoGetFiles($hash, '', 'css', '', 'ie.css'); ?><![endif]-->
+</head>
+
+<body class="body-images">
+ <form id="install" method="post" action="<?php echo $form_action; ?>">
+ <div id="install-top">
+ <div class="logo install-images"><?php _e("Installation"); ?></div>
+ <div class="step"><?php echo $step; ?> <span>/ 6</span></div>
+ <div class="clear"></div>
+
+ <input type="hidden" name="step" value="<?php echo($step); ?>" />
+ </div>
+
+ <div id="install-content">
+ <?php
+
+ // First step: welcome
+ if($step == 1) { ?>
+ <h3 class="start install-images"><?php _e("Welcome to the Jappix installation!"); ?></h3>
+
+ <p><?php _e("This tool will help you fastly install Jappix, the first full-featured XMPP-based social platform, on your server. You don't even need any technical knowledge."); ?></p>
+ <p><?php _e("Let's have a look at the installation steps:"); ?></p>
+
+ <ol>
+ <li><?php _e("Welcome"); ?></li>
+ <li><?php _e("Storage configuration"); ?></li>
+ <li><?php _e("Administrator account"); ?></li>
+ <li><?php _e("Main configuration"); ?></li>
+ <li><?php _e("Hosts configuration"); ?></li>
+ <li><?php _e("Services installation"); ?></li>
+ </ol>
+
+ <p><?php printf(T_("If the current language does not match yours (%1s), you can make Jappix speak %2s it will be saved."), getLanguageName($locale), languageSwitcher($locale)); ?></p>
+
+ <p><?php _e("If you want to get some help about the Jappix installation and configuration, you can use our whole documentation, available at:"); ?> <a href="http://codingteam.net/project/jappix/doc" target="_blank">http://codingteam.net/project/jappix/doc</a></p>
+
+ <p><?php _e("It's time to build your own social cloud: just go to the next step!"); ?></p>
+ <?php }
+
+ // Second step: storage configuration
+ else if($step == 2) { ?>
+ <h3 class="storage install-images"><?php _e("Storage configuration"); ?></h3>
+
+ <p><?php _e("Jappix stores persistent data (such as shared files, chat logs, your own music and its configuration) into a single secured storage folder."); ?></p>
+
+ <p><?php printf(T_("Jappix must be able to write in this folder to create its sub-directories. If not, you must set the rights to %1s or change the folder owner to %2s (depending of your configuration)."), '<em>777</em>', '<em>www-data</em>'); ?></p>
+
+ <?php if(is_writable(JAPPIX_BASE.'/store')) {
+ // Create the store tree
+ include(JAPPIX_BASE.'/php/store-tree.php');
+ ?>
+ <p class="info bigspace success"><?php _e("The folder is writable, you can continue!"); ?></p>
+ <?php }
+
+ else {
+ $continue = false;
+ ?>
+ <p class="info bigspace fail"><?php printf(T_("The folder is not writable, set the right permissions to the %s directory."), "<em>./store</em>"); ?></p>
+ <?php } ?>
+ <?php }
+
+ // Third step: administrator account
+ else if($step == 3) { ?>
+ <h3 class="account install-images"><?php _e("Administrator account"); ?></h3>
+
+ <p><?php _e("Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."); ?></p>
+
+ <p><?php _e("When Jappix will be installed, just click on the manager link on the home page to access it."); ?></p>
+
+ <?php
+
+ // Include the user add form
+ include(JAPPIX_BASE.'/php/form-users.php');
+
+ if(!$valid_user) { ?>
+ <p class="info bigspace fail"><?php _e("Oops, you missed something or the two passwords do not match!"); ?></p>
+ <?php }
+ }
+
+ // Fourth step: main configuration
+ else if($step == 4) { ?>
+ <h3 class="main install-images"><?php _e("Main configuration"); ?></h3>
+
+ <p><?php _e("Jappix needs that you specify some values to work. Please correct the following inputs (or keep the default values, which are sufficient for most people)."); ?></p>
+
+ <p><?php _e("Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."); ?></p>
+
+ <?php
+
+ // Define the main configuration variables
+ include(JAPPIX_BASE.'/php/vars-main.php');
+
+ // Are we using developer mode?
+ if(preg_match('/~dev/i', $version))
+ $developer = 'on';
+
+ // Include the main configuration form
+ include(JAPPIX_BASE.'/php/form-main.php');
+ }
+
+ // Fifth step: hosts configuration
+ else if($step == 5) { ?>
+ <h3 class="hosts install-images"><?php _e("Hosts configuration"); ?></h3>
+
+ <p><?php _e("This page helps you specify the default hosts Jappix will connect to. You can leave it as it is and continue if you want to use the official service hosts."); ?></p>
+
+ <p><?php _e("Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."); ?></p>
+
+ <p><?php _e("Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."); ?></p>
+
+ <?php
+
+ // Define the hosts configuration variables
+ include(JAPPIX_BASE.'/php/vars-hosts.php');
+
+ // Include the hosts configuration form
+ include(JAPPIX_BASE.'/php/form-hosts.php');
+ }
+
+ // Last step: services installation
+ else if($step == 6) { ?>
+ <h3 class="services install-images"><?php _e("Services installation"); ?></h3>
+
+ <p><?php _e("You can install some extra softwares on your server, to extend your Jappix features. Some others might be modified, because of security restrictions which are set by default."); ?></p>
+ <p><?php _e("To perform this, you must be able to access your server's shell and be logged in as root. Remember this is facultative, Jappix will work without these modules, but some of its features will be unavailable."); ?></p>
+
+ <?php
+
+ // Write the installed marker
+ writeXML('conf', 'installed', '<installed>true</installed>');
+
+ // Checks some services are installed
+ $services_functions = array('gd_info', 'curl_init');
+ $services_names = array('GD', 'cURL');
+ $services_packages = array('php5-gd', 'php5-curl');
+
+ for($i = 0; $i < count($services_names); $i++) {
+ $service_class = 'info smallspace';
+
+ // First info?
+ if($i == 0)
+ $service_class .= ' first';
+
+ // Service installed?
+ if(function_exists($services_functions[$i])) { ?>
+ <p class="<?php echo($service_class) ?> success"><?php printf(T_("%s is installed on your system."), $services_names[$i]); ?></p>
+ <?php }
+
+ // Missing service!
+ else { ?>
+ <p class="<?php echo($service_class) ?> fail"><?php printf(T_("%1s is not installed on your system, you should install %2s."), $services_names[$i], '<em>'.$services_packages[$i].'</em>'); ?></p>
+ <?php }
+ }
+
+ // Checks the upload size limit
+ $upload_max = uploadMaxSize();
+ $upload_human = formatBytes($upload_max);
+
+ if($upload_max >= 7000000) { ?>
+ <p class="info smallspace last success"><?php printf(T_("PHP maximum upload size is sufficient (%s)."), $upload_human); ?></p>
+ <?php }
+
+ else { ?>
+ <p class="info smallspace last fail"><?php printf(T_("PHP maximum upload size is not sufficient (%1s), you should define it to %2s in %3s."), $upload_human, '8M', '<em>php.ini</em>'); ?></p>
+ <?php } ?>
+
+ <p><?php _e("After you finished the setup, Jappix will generate the cache files. It might be slow, just wait until the application is displayed and do not press any button."); ?></p>
+
+ <p><?php _e("Thanks for using Jappix!"); ?></p>
+ <?php } ?>
+ </div>
+
+ <div id="install-buttons">
+ <?php if($continue && ($step < 6)) { ?>
+ <input type="submit" name="submit" value="<?php _e("Next"); ?> Ā»" />
+ <?php } if($step == 6) { ?>
+ <input type="submit" name="finish" value="<?php _e("Finish"); ?> Ā»" />
+ <?php } if(!$continue) { ?>
+ <input type="submit" name="check" value="<?php _e("Check again"); ?>" />
+ <?php } ?>
+
+ <div class="clear"></div>
+ </div>
+ </form>
+</body>
+
+</html>
+
+<!-- Jappix Install <?php echo $version; ?> - An open social platform -->
--- /dev/null
+<?php
+/**
+ * jsmin.php - PHP implementation of Douglas Crockford's JSMin.
+ *
+ * This is pretty much a direct port of jsmin.c to PHP with just a few
+ * PHP-specific performance tweaks. Also, whereas jsmin.c reads from stdin and
+ * outputs to stdout, this library accepts a string as input and returns another
+ * string as output.
+ *
+ * PHP 5 or higher is required.
+ *
+ * Permission is hereby granted to use this version of the library under the
+ * same terms as jsmin.c, which has the following license:
+ *
+ * --
+ * Copyright (c) 2002 Douglas Crockford (www.crockford.com)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is furnished to do
+ * so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * The Software shall be used for Good, not Evil.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ * --
+ *
+ * @package JSMin
+ * @author Ryan Grove <ryan@wonko.com>
+ * @copyright 2002 Douglas Crockford <douglas@crockford.com> (jsmin.c)
+ * @copyright 2008 Ryan Grove <ryan@wonko.com> (PHP port)
+ * @license http://opensource.org/licenses/mit-license.php MIT License
+ * @version 1.1.1 (2008-03-02)
+ * @link https://github.com/rgrove/jsmin-php/
+ */
+
+class JSMin {
+ const ORD_LF = 10;
+ const ORD_SPACE = 32;
+ const ACTION_KEEP_A = 1;
+ const ACTION_DELETE_A = 2;
+ const ACTION_DELETE_A_B = 3;
+
+ protected $a = '';
+ protected $b = '';
+ protected $input = '';
+ protected $inputIndex = 0;
+ protected $inputLength = 0;
+ protected $lookAhead = null;
+ protected $output = '';
+
+ // -- Public Static Methods --------------------------------------------------
+
+ /**
+ * Minify Javascript
+ *
+ * @uses __construct()
+ * @uses min()
+ * @param string $js Javascript to be minified
+ * @return string
+ */
+ public static function minify($js) {
+ $jsmin = new JSMin($js);
+ return $jsmin->min();
+ }
+
+ // -- Public Instance Methods ------------------------------------------------
+
+ /**
+ * Constructor
+ *
+ * @param string $input Javascript to be minified
+ */
+ public function __construct($input) {
+ $this->input = str_replace("\r\n", "\n", $input);
+ $this->inputLength = strlen($this->input);
+ }
+
+ // -- Protected Instance Methods ---------------------------------------------
+
+ /**
+ * Action -- do something! What to do is determined by the $command argument.
+ *
+ * action treats a string as a single character. Wow!
+ * action recognizes a regular expression if it is preceded by ( or , or =.
+ *
+ * @uses next()
+ * @uses get()
+ * @throws JSMinException If parser errors are found:
+ * - Unterminated string literal
+ * - Unterminated regular expression set in regex literal
+ * - Unterminated regular expression literal
+ * @param int $command One of class constants:
+ * ACTION_KEEP_A Output A. Copy B to A. Get the next B.
+ * ACTION_DELETE_A Copy B to A. Get the next B. (Delete A).
+ * ACTION_DELETE_A_B Get the next B. (Delete B).
+ */
+ protected function action($command) {
+ switch($command) {
+ case self::ACTION_KEEP_A:
+ $this->output .= $this->a;
+
+ case self::ACTION_DELETE_A:
+ $this->a = $this->b;
+
+ if ($this->a === "'" || $this->a === '"') {
+ for (;;) {
+ $this->output .= $this->a;
+ $this->a = $this->get();
+
+ if ($this->a === $this->b) {
+ break;
+ }
+
+ if (ord($this->a) <= self::ORD_LF) {
+ throw new JSMinException('Unterminated string literal.');
+ }
+
+ if ($this->a === '\\') {
+ $this->output .= $this->a;
+ $this->a = $this->get();
+ }
+ }
+ }
+
+ case self::ACTION_DELETE_A_B:
+ $this->b = $this->next();
+
+ if ($this->b === '/' && (
+ $this->a === '(' || $this->a === ',' || $this->a === '=' ||
+ $this->a === ':' || $this->a === '[' || $this->a === '!' ||
+ $this->a === '&' || $this->a === '|' || $this->a === '?' ||
+ $this->a === '{' || $this->a === '}' || $this->a === ';' ||
+ $this->a === "\n" )) {
+
+ $this->output .= $this->a . $this->b;
+
+ for (;;) {
+ $this->a = $this->get();
+
+ if ($this->a === '[') {
+ /*
+ inside a regex [...] set, which MAY contain a '/' itself. Example: mootools Form.Validator near line 460:
+ return Form.Validator.getValidator('IsEmpty').test(element) || (/^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]\.?){0,63}[a-z0-9!#$%&'*+/=?^_`{|}~-]@(?:(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\])$/i).test(element.get('value'));
+ */
+ for (;;) {
+ $this->output .= $this->a;
+ $this->a = $this->get();
+
+ if ($this->a === ']') {
+ break;
+ } elseif ($this->a === '\\') {
+ $this->output .= $this->a;
+ $this->a = $this->get();
+ } elseif (ord($this->a) <= self::ORD_LF) {
+ throw new JSMinException('Unterminated regular expression set in regex literal.');
+ }
+ }
+ } elseif ($this->a === '/') {
+ break;
+ } elseif ($this->a === '\\') {
+ $this->output .= $this->a;
+ $this->a = $this->get();
+ } elseif (ord($this->a) <= self::ORD_LF) {
+ throw new JSMinException('Unterminated regular expression literal.');
+ }
+
+ $this->output .= $this->a;
+ }
+
+ $this->b = $this->next();
+ }
+ }
+ }
+
+ /**
+ * Get next char. Convert ctrl char to space.
+ *
+ * @return string|null
+ */
+ protected function get() {
+ $c = $this->lookAhead;
+ $this->lookAhead = null;
+
+ if ($c === null) {
+ if ($this->inputIndex < $this->inputLength) {
+ $c = substr($this->input, $this->inputIndex, 1);
+ $this->inputIndex += 1;
+ } else {
+ $c = null;
+ }
+ }
+
+ if ($c === "\r") {
+ return "\n";
+ }
+
+ if ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) {
+ return $c;
+ }
+
+ return ' ';
+ }
+
+ /**
+ * Is $c a letter, digit, underscore, dollar sign, or non-ASCII character.
+ *
+ * @return bool
+ */
+ protected function isAlphaNum($c) {
+ return ord($c) > 126 || $c === '\\' || preg_match('/^[\w\$]$/', $c) === 1;
+ }
+
+ /**
+ * Perform minification, return result
+ *
+ * @uses action()
+ * @uses isAlphaNum()
+ * @return string
+ */
+ protected function min() {
+ $this->a = "\n";
+ $this->action(self::ACTION_DELETE_A_B);
+
+ while ($this->a !== null) {
+ switch ($this->a) {
+ case ' ':
+ if ($this->isAlphaNum($this->b)) {
+ $this->action(self::ACTION_KEEP_A);
+ } else {
+ $this->action(self::ACTION_DELETE_A);
+ }
+ break;
+
+ case "\n":
+ switch ($this->b) {
+ case '{':
+ case '[':
+ case '(':
+ case '+':
+ case '-':
+ $this->action(self::ACTION_KEEP_A);
+ break;
+
+ case ' ':
+ $this->action(self::ACTION_DELETE_A_B);
+ break;
+
+ default:
+ if ($this->isAlphaNum($this->b)) {
+ $this->action(self::ACTION_KEEP_A);
+ }
+ else {
+ $this->action(self::ACTION_DELETE_A);
+ }
+ }
+ break;
+
+ default:
+ switch ($this->b) {
+ case ' ':
+ if ($this->isAlphaNum($this->a)) {
+ $this->action(self::ACTION_KEEP_A);
+ break;
+ }
+
+ $this->action(self::ACTION_DELETE_A_B);
+ break;
+
+ case "\n":
+ switch ($this->a) {
+ case '}':
+ case ']':
+ case ')':
+ case '+':
+ case '-':
+ case '"':
+ case "'":
+ $this->action(self::ACTION_KEEP_A);
+ break;
+
+ default:
+ if ($this->isAlphaNum($this->a)) {
+ $this->action(self::ACTION_KEEP_A);
+ }
+ else {
+ $this->action(self::ACTION_DELETE_A_B);
+ }
+ }
+ break;
+
+ default:
+ $this->action(self::ACTION_KEEP_A);
+ break;
+ }
+ }
+ }
+
+ return $this->output;
+ }
+
+ /**
+ * Get the next character, skipping over comments. peek() is used to see
+ * if a '/' is followed by a '/' or '*'.
+ *
+ * @uses get()
+ * @uses peek()
+ * @throws JSMinException On unterminated comment.
+ * @return string
+ */
+ protected function next() {
+ $c = $this->get();
+
+ if ($c === '/') {
+ switch($this->peek()) {
+ case '/':
+ for (;;) {
+ $c = $this->get();
+
+ if (ord($c) <= self::ORD_LF) {
+ return $c;
+ }
+ }
+
+ case '*':
+ $this->get();
+
+ for (;;) {
+ switch($this->get()) {
+ case '*':
+ if ($this->peek() === '/') {
+ $this->get();
+ return ' ';
+ }
+ break;
+
+ case null:
+ throw new JSMinException('Unterminated comment.');
+ }
+ }
+
+ default:
+ return $c;
+ }
+ }
+
+ return $c;
+ }
+
+ /**
+ * Get next char. If is ctrl character, translate to a space or newline.
+ *
+ * @uses get()
+ * @return string|null
+ */
+ protected function peek() {
+ $this->lookAhead = $this->get();
+ return $this->lookAhead;
+ }
+}
+
+// -- Exceptions ---------------------------------------------------------------
+class JSMinException extends Exception {}
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the Jappix Manager PHP/HTML code
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 26/08/11
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+// Get the manager functions
+require_once(JAPPIX_BASE.'/php/functions-manager.php');
+
+// Session manager
+$id = 0;
+$login_fired = false;
+$logout_fired = false;
+$form_parent = 'manager';
+$user_password = '';
+$user_remember = '';
+$user = '';
+$password = '';
+$user_meta = T_("unknown");
+$user_name = '';
+$add_button = false;
+$remove_button = false;
+$save_button = false;
+$check_updates = false;
+
+// Start the session
+session_start();
+
+// Force the updates check?
+if(isset($_GET['p']) && ($_GET['p'] == 'check'))
+ $check_updates = true;
+
+// Login form is sent
+if(isset($_POST['login'])) {
+ // Form sent pointer
+ $login_fired = true;
+
+ // Extract the user name
+ if(isset($_POST['admin_name']) && !empty($_POST['admin_name']))
+ $user = trim($_POST['admin_name']);
+
+ if($user && (isset($_POST['admin_password']) && !empty($_POST['admin_password']))) {
+ // Get the password values
+ $password = genStrongHash(trim($_POST['admin_password']));
+
+ // Write the session
+ $_SESSION['jappix_user'] = $user;
+ $_SESSION['jappix_password'] = $password;
+ }
+}
+
+// Session is set
+else if((isset($_SESSION['jappix_user']) && !empty($_SESSION['jappix_user'])) && (isset($_SESSION['jappix_password']) && !empty($_SESSION['jappix_password']))) {
+ // Form sent pointer
+ $login_fired = true;
+
+ // Get the session values
+ $user = $_SESSION['jappix_user'];
+ $password = $_SESSION['jappix_password'];
+}
+
+// Validate the current session
+if($login_fired && isAdmin($user, $password))
+ $id = 1;
+
+// Any special page requested (and authorized)?
+if(($id != 0) && isset($_GET['a']) && !empty($_GET['a'])) {
+ // Extract the page name
+ $page_requested = $_GET['a'];
+
+ switch($page_requested) {
+ // Logout request
+ case 'logout':
+ // Remove the session
+ unset($_SESSION['jappix_user']);
+ unset($_SESSION['jappix_password']);
+
+ // Set a logout marker
+ $logout_fired = true;
+
+ // Page ID
+ $id = 0;
+
+ break;
+
+ // Configuration request
+ case 'configuration':
+ // Allowed buttons
+ $save_button = true;
+
+ // Page ID
+ $id = 2;
+
+ break;
+
+ // Hosts request
+ case 'hosts':
+ // Allowed buttons
+ $save_button = true;
+
+ // Page ID
+ $id = 3;
+
+ break;
+
+ // Storage request
+ case 'storage':
+ // Allowed buttons
+ $remove_button = true;
+
+ // Page ID
+ $id = 4;
+
+ break;
+
+ // Design request
+ case 'design':
+ // Allowed buttons
+ $save_button = true;
+ $remove_button = true;
+
+ // Page ID
+ $id = 5;
+
+ break;
+
+ // Users request
+ case 'users':
+ // Allowed buttons
+ $add_button = true;
+ $remove_button = true;
+
+ // Page ID
+ $id = 6;
+
+ break;
+
+ // Updates request
+ case 'updates':
+ // Page ID
+ $id = 7;
+
+ break;
+
+ // Default page when authorized (statistics)
+ default:
+ // Page ID
+ $id = 1;
+ }
+}
+
+// Page server-readable names
+$identifiers = array(
+ 'login',
+ 'statistics',
+ 'configuration',
+ 'hosts',
+ 'storage',
+ 'design',
+ 'users',
+ 'updates'
+);
+
+// Page human-readable names
+$names = array(
+ T_("Manager access"),
+ T_("Statistics"),
+ T_("Configuration"),
+ T_("Hosts"),
+ T_("Storage"),
+ T_("Design"),
+ T_("Users"),
+ T_("Updates")
+);
+
+// Any user for the meta?
+if($user && ($id != 0))
+ $user_meta = $user;
+
+// Define current page identifier & name
+$page_identifier = $identifiers[$id];
+$page_name = $names[$id];
+
+// Define the current page form action
+if($id == 0)
+ $form_action = keepGet('(m|a|p|k)', false);
+else
+ $form_action = keepGet('(m|p|k)', false);
+
+?>
+<!DOCTYPE html>
+<?php htmlTag($locale); ?>
+
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+ <meta name="robots" content="none" />
+ <title><?php _e("Jappix manager"); ?> • <?php echo($page_name); ?></title>
+ <link rel="shortcut icon" href="./favicon.ico" />
+ <?php echoGetFiles($hash, '', 'css', 'manager.xml', ''); echo "\n"; ?>
+ <!--[if lt IE 9]><?php echoGetFiles($hash, '', 'css', '', 'ie.css'); ?><![endif]-->
+</head>
+
+<body class="body-images">
+ <form id="manager" enctype="multipart/form-data" method="post" action="./?m=manager<?php echo $form_action; ?>">
+ <div id="manager-top">
+ <div class="logo manager-images"><?php _e("Manager"); ?></div>
+
+ <div class="meta">
+ <span><?php echo(htmlspecialchars($user_meta)); ?></span>
+
+ <?php if($id != 0) {
+
+ // Keep get
+ $keep_get = keepGet('(a|p|b|s|k)', false);
+
+ ?>
+ <a class="logout manager-images" href="./?a=logout<?php echo $keep_get; ?>"><?php _e("Disconnect"); ?></a>
+ <?php } ?>
+
+ <a class="close manager-images" href="./<?php echo keepGet('(m|a|p|b|s|k)', true); ?>"><?php _e("Close"); ?></a>
+ </div>
+
+ <div class="clear"></div>
+ </div>
+
+ <?php if($id != 0) { ?>
+ <div id="manager-tabs">
+ <a<?php currentTab('statistics', $page_identifier); ?> href="./?a=statistics<?php echo $keep_get; ?>"><?php _e("Statistics"); ?></a>
+ <a<?php currentTab('configuration', $page_identifier); ?> href="./?a=configuration<?php echo $keep_get; ?>"><?php _e("Configuration"); ?></a>
+ <a<?php currentTab('hosts', $page_identifier); ?> href="./?a=hosts<?php echo $keep_get; ?>"><?php _e("Hosts"); ?></a>
+ <a<?php currentTab('storage', $page_identifier); ?> href="./?a=storage<?php echo $keep_get; ?>"><?php _e("Storage"); ?></a>
+ <a<?php currentTab('design', $page_identifier); ?> href="./?a=design<?php echo $keep_get; ?>"><?php _e("Design"); ?></a>
+ <a<?php currentTab('users', $page_identifier); ?> href="./?a=users<?php echo $keep_get; ?>"><?php _e("Users"); ?></a>
+ <a<?php currentTab('updates', $page_identifier); ?> class="last" href="./?a=updates<?php echo $keep_get; ?>"><?php _e("Updates"); ?></a>
+ </div>
+ <?php } ?>
+
+ <div id="manager-content">
+ <?php
+
+ if($id != 0) {
+ if(!storageWritable()) { ?>
+ <p class="info bottomspace fail"><?php _e("Your storage folders are not writable, please apply the good rights!"); ?></p>
+ <?php }
+
+ if(BOSHProxy() && extension_loaded('suhosin') && (ini_get('suhosin.get.max_value_length') < 1000000)) { ?>
+ <p class="info bottomspace neutral"><?php printf(T_("%1s may cause problems to the proxy, please increase %2s value up to %3s!"), 'Suhosin', '<em>suhosin.get.max_value_length</em>', '1000000'); ?></p>
+ <?php }
+
+ if(newUpdates($check_updates)) { ?>
+ <a class="info bottomspace neutral" href="./?a=updates<?php echo $keep_get; ?>"><?php _e("A new Jappix version is available! Check what is new and launch the update!"); ?></a>
+ <?php }
+ }
+
+ // Authorized and statistics page requested
+ if($id == 1) { ?>
+ <h3 class="statistics manager-images"><?php _e("Statistics"); ?></h3>
+
+ <p><?php _e("Basic statistics are processed by Jappix about some important things, you can find them below."); ?></p>
+
+ <h4><?php _e("Access statistics"); ?></h4>
+
+ <?php
+
+ // Read the visits values
+ $visits = getVisits();
+
+ ?>
+
+ <ul class="stats">
+ <li class="total"><b><?php _e("Total"); ?></b><span><?php echo $visits['total']; ?></span></li>
+ <li><b><?php _e("Daily"); ?></b><span><?php echo $visits['daily']; ?></span></li>
+ <li><b><?php _e("Weekly"); ?></b><span><?php echo $visits['weekly']; ?></span></li>
+ <li><b><?php _e("Monthly"); ?></b><span><?php echo $visits['monthly']; ?></span></li>
+ <li><b><?php _e("Yearly"); ?></b><span><?php echo $visits['yearly']; ?></span></li>
+ </ul>
+
+ <object class="stats" type="image/svg+xml" data="./php/stats-svg.php?l=<?php echo $locale; ?>&g=access"></object>
+
+ <?php
+
+ // Get the share stats
+ $share_stats = shareStats();
+
+ // Any share stats to display?
+ if(count($share_stats)) { ?>
+ <h4><?php _e("Share statistics"); ?></h4>
+
+ <ol class="stats">
+ <?php
+
+ // Display the users who have the largest share folder
+ $share_users = largestShare($share_stats, 8);
+
+ foreach($share_users as $current_user => $current_value)
+ echo('<li><b><a href="xmpp:'.$current_user.'">'.$current_user.'</a></b><span>'.formatBytes($current_value).'</span></li>');
+
+ ?>
+ </ol>
+
+ <object class="stats" type="image/svg+xml" data="./php/stats-svg.php?l=<?php echo $locale; ?>&g=share"></object>
+ <?php } ?>
+
+ <h4><?php _e("Other statistics"); ?></h4>
+
+ <ul class="stats">
+ <li class="total"><b><?php _e("Total"); ?></b><span><?php echo formatBytes(sizeDir(JAPPIX_BASE.'/store/')); ?></span></li>
+
+ <?php
+
+ // Append the human-readable array values
+ $others_stats = otherStats();
+
+ foreach($others_stats as $others_name => $others_value)
+ echo('<li><b>'.$others_name.'</b><span>'.formatBytes($others_value).'</span></li>');
+
+ ?>
+ </ul>
+
+ <object class="stats" type="image/svg+xml" data="./php/stats-svg.php?l=<?php echo $locale; ?>&g=others"></object>
+ <?php }
+
+ // Authorized and configuration page requested
+ else if($id == 2) { ?>
+ <h3 class="configuration manager-images"><?php _e("Configuration"); ?></h3>
+
+ <p><?php _e("Change your Jappix node configuration with this tool."); ?></p>
+
+ <p><?php _e("Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."); ?></p>
+
+ <?php
+
+ // Define the main configuration variables
+ include(JAPPIX_BASE.'/php/vars-main.php');
+
+ // Read the main configuration POST
+ if(isset($_POST['save'])) {
+ include(JAPPIX_BASE.'/php/post-main.php');
+
+ // Show a success alert
+ ?>
+ <p class="info smallspace success"><?php _e("Changes saved!"); ?></p>
+ <?php
+ }
+
+ // Include the main configuration form
+ include(JAPPIX_BASE.'/php/form-main.php');
+ }
+
+ // Authorized and hosts page requested
+ else if($id == 3) { ?>
+ <h3 class="hosts manager-images"><?php _e("Hosts"); ?></h3>
+
+ <p><?php _e("Change the XMPP hosts that this Jappix node serve with this tool."); ?></p>
+
+ <p><?php _e("Maybe you don't know what a BOSH server is? In fact, this is a relay between a Jappix client and a XMPP server, which is necessary because of technical limitations."); ?></p>
+
+ <p><?php _e("Note that if you don't specify a value which is compulsory, it will be automatically completed with the default one."); ?></p>
+
+ <?php
+
+ // Define the hosts configuration variables
+ include(JAPPIX_BASE.'/php/vars-hosts.php');
+
+ // Read the hosts configuration POST
+ if(isset($_POST['save'])) {
+ include(JAPPIX_BASE.'/php/post-hosts.php');
+
+ // Show a success alert
+ ?>
+ <p class="info smallspace success"><?php _e("Changes saved!"); ?></p>
+ <?php
+ }
+
+ // Include the hosts configuration form
+ include(JAPPIX_BASE.'/php/form-hosts.php');
+ }
+
+ // Authorized and storage page requested
+ else if($id == 4) { ?>
+ <h3 class="storage manager-images"><?php _e("Storage"); ?></h3>
+
+ <p><?php _e("All this Jappix node stored files can be managed with this tool: please select a sub-folder and start editing its content!"); ?></p>
+
+ <?php
+
+ // Include the store configuration vars
+ include(JAPPIX_BASE.'/php/vars-store.php');
+
+ // Include the store configuration POST handler
+ include(JAPPIX_BASE.'/php/post-store.php');
+
+ // Include the store configuration GET handler
+ include(JAPPIX_BASE.'/php/get-store.php');
+
+ ?>
+
+ <h4><?php _e("Maintenance"); ?></h4>
+
+ <p><?php _e("Keep your Jappix node fresh and fast, clean the storage folders regularly!"); ?></p>
+
+ <?php
+
+ // Keep get
+ $keep_get = keepGet('p', false);
+
+ ?>
+
+ <ul>
+ <li class="total"><a href="./?p=everything<?php echo $keep_get; ?>"><?php _e("Clean everything"); ?></a></li>
+ <li><a href="./?p=cache<?php echo $keep_get; ?>"><?php _e("Purge cache"); ?></a></li>
+ <li><a href="./?p=logs<?php echo $keep_get; ?>"><?php _e("Purge logs"); ?></a></li>
+ <li><a href="./?p=send<?php echo $keep_get; ?>"><?php _e("Purge sent files"); ?></a></li>
+ <li><a href="./?p=updates<?php echo $keep_get; ?>"><?php _e("Purge updates"); ?></a></li>
+ </ul>
+
+ <h4><?php _e("Share"); ?></h4>
+
+ <p><?php _e("Stay tuned in what your users store on your server and remove undesired content with this tool."); ?></p>
+
+ <fieldset>
+ <legend><?php _e("Browse"); ?></legend>
+
+ <div class="browse">
+ <?php
+
+ // List the share files
+ browseFolder($share_folder, 'share');
+
+ ?>
+ </div>
+ </fieldset>
+
+ <h4><?php _e("Music"); ?></h4>
+
+ <p><?php _e("Upload your music (Ogg Vorbis, MP3 or WAV) to be able to listen to it in Jappix!"); ?></p>
+
+ <p><?php printf(T_("The file you want to upload must be smaller than %s."), formatBytes(uploadMaxSize()).''); ?></p>
+
+ <fieldset>
+ <legend><?php _e("New"); ?></legend>
+
+ <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo(uploadMaxSize().''); ?>">
+
+ <label for="music_title"><?php _e("Title"); ?></label><input id="music_title" class="icon manager-images" type="text" name="music_title" value="<?php echo(htmlspecialchars($music_title)); ?>" />
+
+ <label for="music_artist"><?php _e("Artist"); ?></label><input id="music_artist" class="icon manager-images" type="text" name="music_artist" value="<?php echo(htmlspecialchars($music_artist)); ?>" />
+
+ <label for="music_album"><?php _e("Album"); ?></label><input id="music_album" class="icon manager-images" type="text" name="music_album" value="<?php echo(htmlspecialchars($music_album)); ?>" />
+
+ <label for="music_file"><?php _e("File"); ?></label><input id="music_file" type="file" name="music_file" accept="audio/*" />
+ <label for="music_upload"><?php _e("Upload"); ?></label><input id="music_upload" type="submit" name="upload" value="<?php _e("Upload"); ?>" />
+ </fieldset>
+
+ <fieldset>
+ <legend><?php _e("Browse"); ?></legend>
+
+ <div class="browse">
+ <?php
+
+ // List the music files
+ browseFolder($music_folder, 'music');
+
+ ?>
+ </div>
+ </fieldset>
+ <?php }
+
+ // Authorized and design page requested
+ else if($id == 5) { ?>
+ <h3 class="design manager-images"><?php _e("Design"); ?></h3>
+
+ <p><?php _e("Jappix is fully customisable: you can change its design right here."); ?></p>
+
+ <?php
+
+ // Include the design configuration vars
+ include(JAPPIX_BASE.'/php/vars-design.php');
+
+ // Include the design configuration POST handler
+ include(JAPPIX_BASE.'/php/post-design.php');
+
+ // Include the design configuration reader
+ include(JAPPIX_BASE.'/php/read-design.php');
+
+ // Folder view?
+ if(isset($_GET['b']) && isset($_GET['s']) && ($_GET['b'] == 'backgrounds'))
+ $backgrounds_folder = urldecode($_GET['s']);
+
+ ?>
+
+ <h4><?php _e("Logo"); ?></h4>
+
+ <p><?php _e("You can set your own service logo to replace the default one. Take care of the size and the main color of each logo!"); ?></p>
+
+ <div class="sub">
+ <p><?php _e("Upload each logo with the recommended maximum pixel size."); ?></p>
+ <p><?php _e("Your logo format must be PNG. Leave a field empty and the logo will not be changed."); ?></p>
+
+ <label for="logo_own_1_location">Jappix Desktop, <em>311Ć113</em></label><?php logoFormField('1', 'desktop_home'); ?>
+ <label for="logo_own_2_location">Jappix Desktop, <em>90Ć25</em></label><?php logoFormField('2', 'desktop_app'); ?>
+ <label for="logo_own_3_location">Jappix Mobile, <em>83Ć30</em></label><?php logoFormField('3', 'mobile'); ?>
+ <label for="logo_own_4_location">Jappix Mini, <em>81Ć22</em></label><?php logoFormField('4', 'mini'); ?>
+
+ <label for="logo_own_upload"><?php _e("Upload"); ?></label><input id="logo_own_upload" type="submit" name="logo_upload" value="<?php _e("Upload"); ?>" />
+
+ <div class="clear"></div>
+ </div>
+
+ <h4><?php _e("Background"); ?></h4>
+
+ <p><?php _e("Change your Jappix node background with this tool. You can either set a custom color or an uploaded image. Let your creativity flow!"); ?></p>
+
+ <label class="master" for="background_default"><input id="background_default" type="radio" name="background_type" value="default"<?php echo($background_default); ?> /><?php _e("Use default background"); ?></label>
+
+ <?php if($backgrounds_number) { ?>
+ <label class="master" for="background_image"><input id="background_image" type="radio" name="background_type" value="image"<?php echo($background_image); ?> /><?php _e("Use your own image"); ?></label>
+
+ <div class="sub">
+ <p><?php _e("Select a background to use and change the display options."); ?></p>
+
+ <label for="background_image_file"><?php _e("Image"); ?></label><select id="background_image_file" name="background_image_file">
+ <?php
+
+ // List the background files
+ foreach($backgrounds as $backgrounds_current) {
+ // Check this is the selected background
+ if($backgrounds_current == $background['image_file'])
+ $backgrounds_selected = ' selected=""';
+ else
+ $backgrounds_selected = '';
+
+ // Encode the current background name
+ $backgrounds_current = htmlspecialchars($backgrounds_current);
+
+ echo('<option value="'.$backgrounds_current.'"'.$backgrounds_selected.'>'.$backgrounds_current.'</option>');
+ }
+
+ ?>
+ </select>
+
+ <label for="background_image_repeat"><?php _e("Repeat"); ?></label><select id="background_image_repeat" name="background_image_repeat">
+ <option value="no-repeat"<?php echo($background_image_repeat_no); ?>><?php _e("No"); ?></option>
+ <option value="repeat"<?php echo($background_image_repeat_all); ?>><?php _e("All"); ?></option>
+ <option value="repeat-x"<?php echo($background_image_repeat_x); ?>><?php _e("Horizontal"); ?></option>
+ <option value="repeat-y"<?php echo($background_image_repeat_y); ?>><?php _e("Vertical"); ?></option>
+ </select>
+
+ <label for="background_image_horizontal"><?php _e("Horizontal"); ?></label><select id="background_image_horizontal" name="background_image_horizontal">
+ <option value="center"<?php echo($background_image_horizontal_center); ?>><?php _e("Center"); ?></option>
+ <option value="left"<?php echo($background_image_horizontal_left); ?>><?php _e("Left"); ?></option>
+ <option value="right"<?php echo($background_image_horizontal_right); ?>><?php _e("Right"); ?></option>
+ </select>
+
+ <label for="background_image_vertical"><?php _e("Vertical"); ?></label><select id="background_image_vertical" name="background_image_vertical">
+ <option value="center"<?php echo($background_image_vertical_center); ?>><?php _e("Center"); ?></option>
+ <option value="top"<?php echo($background_image_vertical_top); ?>><?php _e("Top"); ?></option>
+ <option value="bottom"<?php echo($background_image_vertical_bottom); ?>><?php _e("Bottom"); ?></option>
+ </select>
+
+ <label for="background_image_adapt"><?php _e("Adapt"); ?></label><input id="background_image_adapt" type="checkbox" name="background_image_adapt"<?php echo($background_image_adapt); ?> />
+
+ <label for="background_image_color"><?php _e("Color"); ?></label><input id="background_image_color" class="icon manager-images" type="color" name="background_image_color" value="<?php echo(htmlspecialchars($background['image_color'])); ?>" />
+
+ <div class="clear"></div>
+ </div>
+ <?php } ?>
+
+ <label class="master" for="background_color"><input id="background_color" type="radio" name="background_type" value="color"<?php echo($background_color); ?> /><?php _e("Use your own color"); ?></label>
+
+ <div class="sub">
+ <p><?php _e("Type the hexadecimal color value you want to use as a background."); ?></p>
+
+ <label for="background_color_color"><?php _e("Color"); ?></label><input id="background_color_color" class="icon manager-images" type="color" name="background_color_color" value="<?php echo(htmlspecialchars($background['color_color'])); ?>" />
+
+ <div class="clear"></div>
+ </div>
+
+ <h4><?php _e("Manage backgrounds"); ?></h4>
+
+ <p><?php _e("You can add a new background to the list with this tool. Please send a valid image."); ?></p>
+
+ <div class="sub">
+ <p><?php printf(T_("The file you want to upload must be smaller than %s."), formatBytes(uploadMaxSize()).''); ?></p>
+
+ <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo(uploadMaxSize().''); ?>">
+
+ <label for="background_image_location"><?php _e("File"); ?></label><input id="background_image_location" type="file" name="background_image_upload" accept="image/*" />
+ <label for="background_image_upload"><?php _e("Upload"); ?></label><input id="background_image_upload" type="submit" name="background_upload" value="<?php _e("Upload"); ?>" />
+
+ <div class="clear"></div>
+ </div>
+
+ <p><?php _e("If you want to remove some backgrounds, use the browser below."); ?></p>
+
+ <fieldset>
+ <legend><?php _e("List"); ?></legend>
+
+ <div class="browse">
+ <?php
+
+ // List the background files
+ browseFolder($backgrounds_folder, 'backgrounds');
+
+ ?>
+ </div>
+ </fieldset>
+
+ <h4><?php _e("Notice"); ?></h4>
+
+ <p><?php _e("Define a homepage notice for all your users, such as a warn, an important message or an advert with this tool."); ?></p>
+
+ <label class="master" for="notice_none"><input id="notice_none" type="radio" name="notice_type" value="none"<?php echo($notice_none); ?> /><?php _e("None"); ?></label>
+
+ <label class="master" for="notice_simple"><input id="notice_simple" type="radio" name="notice_type" value="simple"<?php echo($notice_simple); ?> /><?php _e("Simple notice"); ?></label>
+
+ <div class="sub">
+ <p><?php _e("This notice only needs simple text to be displayed, but no code is allowed!"); ?></p>
+ </div>
+
+ <label class="master" for="notice_advanced"><input id="notice_advanced" type="radio" name="notice_type" value="advanced"<?php echo($notice_advanced); ?> /><?php _e("Advanced notice"); ?></label>
+
+ <div class="sub">
+ <p><?php _e("You can customize your notice with embedded HTML, CSS and JavaScript, but you need to code the style."); ?></p>
+ </div>
+
+ <div class="clear"></div>
+
+ <textarea class="notice-text" name="notice_text" rows="8" cols="60"><?php echo(htmlspecialchars($notice_text)); ?></textarea>
+ <?php }
+
+ // Authorized and users page requested
+ else if($id == 6) { ?>
+ <h3 class="users manager-images"><?php _e("Users"); ?></h3>
+
+ <p><?php _e("You can define more than one administrator for this Jappix node. You can also change a password with this tool."); ?></p>
+
+ <?php
+
+ // Add an user?
+ if(isset($_POST['add'])) {
+ // Include the users POST handler
+ include(JAPPIX_BASE.'/php/post-users.php');
+
+ if($valid_user) { ?>
+ <p class="info smallspace success"><?php _e("The user has been added!"); ?></p>
+ <?php }
+
+ else { ?>
+ <p class="info smallspace fail"><?php _e("Oops, you missed something or the two passwords do not match!"); ?></p>
+ <?php }
+ }
+
+ // Remove an user?
+ else if(isset($_POST['remove'])) {
+ // Initialize the match
+ $users_removed = false;
+ $users_remove = array();
+
+ // Try to get the users to remove
+ foreach($_POST as $post_key => $post_value) {
+ // Is it an admin user?
+ if(preg_match('/^admin_(.+)$/i', $post_key)) {
+ // Update the marker
+ $users_removed = true;
+
+ // Push the value to the global array
+ array_push($users_remove, $post_value);
+ }
+ }
+
+ // Somebody has been removed
+ if($users_removed) {
+
+ // Remove the users!
+ manageUsers('remove', $users_remove);
+
+ ?>
+ <p class="info smallspace success"><?php _e("The chosen users have been removed."); ?></p>
+ <?php }
+
+ // Nobody has been removed
+ else { ?>
+ <p class="info smallspace fail"><?php _e("You must select one or more users to be removed!"); ?></p>
+ <?php }
+ } ?>
+
+ <h4><?php _e("Add"); ?></h4>
+
+ <p><?php _e("Add a new user with this tool, or change a password (type an existing username). Please submit a strong password!"); ?></p>
+
+ <?php
+
+ // Include the user add form
+ include(JAPPIX_BASE.'/php/form-users.php');
+
+ ?>
+
+ <h4><?php _e("Manage"); ?></h4>
+
+ <p><?php _e("Remove users with this tool. Note that you cannot remove an user if he is the only one remaining."); ?></p>
+
+ <fieldset>
+ <legend><?php _e("List"); ?></legend>
+
+ <div class="browse">
+ <?php
+
+ // List the users
+ browseUsers();
+
+ ?>
+ </div>
+ </fieldset>
+ <?php }
+
+ // Authorized and updates page requested
+ else if($id == 7) { ?>
+ <h3 class="updates manager-images"><?php _e("Updates"); ?></h3>
+
+ <p><?php _e("Update your Jappix node with this tool, or check if a new one is available. Informations about the latest version are also displayed (in english)."); ?></p>
+
+ <?php
+
+ // Using developer mode (no need to update)?
+ if(isDeveloper()) { ?>
+ <h4><?php _e("Check for updates"); ?></h4>
+
+ <p class="info smallspace neutral"><?php printf(T_("You are using a development version of Jappix. Update it through our repository by executing: %s."), '<em>svn up</em>'); ?></p>
+ <?php }
+
+ // New updates available?
+ else if(newUpdates($check_updates)) {
+ // Get the update informations
+ $update_infos = updateInformations();
+
+ // We can launch the update!
+ if(isset($_GET['p']) && ($_GET['p'] == 'update')) { ?>
+ <h4><?php _e("Update in progress"); ?></h4>
+
+ <?php if(processUpdate($update_infos['url'])) { ?>
+ <p class="info smallspace success"><?php _e("Jappix has been updated: you are now running the latest version. Have fun!"); ?></p>
+ <?php } else { ?>
+ <p class="info smallspace fail"><?php _e("The update has failed! Please try again later."); ?></p>
+ <?php }
+ }
+
+ // We just show a notice
+ else {
+ ?>
+ <h4><?php _e("Available updates"); ?></h4>
+
+ <a class="info smallspace fail" href="./?p=update<?php echo keepGet('(p|b|s)', false); ?>"><?php printf(T_("Your version is out to date. Update it now to %s by clicking here!"), '<em>'.$update_infos['id'].'</em>'); ?></a>
+
+ <h4><?php _e("What's new?"); ?></h4>
+
+ <div><?php echo $update_infos['description']; ?></div>
+ <?php }
+
+ // No new update
+ } else { ?>
+ <h4><?php _e("Check for updates"); ?></h4>
+
+ <a class="info smallspace success" href="./?p=check<?php echo keepGet('(p|b|s)', false); ?>"><?php _e("Your version seems to be up to date, but you can check updates manually by clicking here."); ?></a>
+ <?php } ?>
+ <?php }
+
+ // Not authorized, show the login form
+ else { ?>
+ <h3 class="login manager-images"><?php _e("Manager access"); ?></h3>
+
+ <p><?php _e("This is a restricted area: only the authorized users can manage this Jappix node."); ?></p>
+ <p><?php _e("Please use the form below to login to the administration panel."); ?></p>
+ <p><?php _e("To improve security, sessions are limited in time and when your browser will be closed, you will be logged out."); ?></p>
+
+ <fieldset>
+ <legend><?php _e("Credentials"); ?></legend>
+
+ <label for="admin_name"><?php _e("User"); ?></label><input id="admin_name" class="icon manager-images" type="text" name="admin_name" value="<?php echo(htmlspecialchars($user)); ?>" required="" />
+
+ <label for="admin_password"><?php _e("Password"); ?></label><input id="admin_password" class="icon manager-images" type="password" name="admin_password" required="" />
+ </fieldset>
+
+ <?php
+
+ // Disconnected
+ if($logout_fired) { ?>
+ <p class="info bigspace success"><?php _e("You have been logged out. Goodbye!"); ?></p>
+ <?php }
+
+ // Login error
+ else if($login_fired) { ?>
+ <p class="info bigspace fail"><?php _e("Oops, you could not be recognized as a valid administrator. Check your credentials!"); ?></p>
+ <?php
+
+ // Remove the session
+ unset($_SESSION['jappix_user']);
+ unset($_SESSION['jappix_password']);
+
+ }
+ } ?>
+
+ <div class="clear"></div>
+ </div>
+
+ <div id="manager-buttons">
+ <?php if($id == 0) { ?>
+ <input type="submit" name="login" value="<?php _e("Here we go!"); ?>" />
+ <?php } else { ?>
+ <?php } if($add_button) { ?>
+ <input type="submit" name="add" value="<?php _e("Add"); ?>" />
+ <?php } if($save_button) { ?>
+ <input type="submit" name="save" value="<?php _e("Save"); ?>" />
+ <?php } if($remove_button) { ?>
+ <input type="submit" name="remove" value="<?php _e("Remove"); ?>" />
+ <?php } ?>
+
+ <div class="clear"></div>
+ </div>
+
+ </form>
+</body>
+
+</html>
+
+<!-- Jappix Manager <?php echo $version; ?> - An open social platform -->
--- /dev/null
+<?php
+
+/**
+ * Mobile Detect
+ *
+ * @license http://www.opensource.org/licenses/mit-license.php The MIT License
+ * @version SVN: $Id: Mobile_Detect.php 3 2009-05-21 13:06:28Z vic.stanciu $
+ */
+
+/**
+ * MODIFIED FOR THE JAPPIX PROJECT
+ * Last revision: 20/11/10
+ *
+ * Thanks to LinkMauve for his patch!
+ */
+
+class Mobile_Detect {
+
+ protected $accept;
+ protected $userAgent;
+
+ protected $isMobile = false;
+ protected $isAndroid = null;
+ protected $isIphone = null;
+ protected $isBlackberry = null;
+ protected $isOpera = null;
+ protected $isPalm = null;
+ protected $isWindows = null;
+ protected $isGeneric = null;
+
+ protected $devices = array(
+ "android" => "android",
+ "blackberry" => "blackberry",
+ "iphone" => "(iphone|ipod)",
+ "opera" => "opera mini",
+ "palm" => "(avantgo|blazer|elaine|hiptop|palm|plucker|xiino)",
+ "windows" => "windows ce; (iemobile|ppc|smartphone)",
+ "generic" => "(kindle|mobile|mmp|midp|o2|pda|pocket|psp|symbian|smartphone|treo|up.browser|up.link|vodafone|wap)"
+ );
+
+
+ public function __construct() {
+ $this->userAgent = $_SERVER['HTTP_USER_AGENT'];
+
+ if (isset($_SERVER['HTTP_ACCEPT']))
+ $this->accept = $_SERVER['HTTP_ACCEPT'];
+ else
+ $this->accept = '';
+
+ if (isset($_SERVER['HTTP_X_WAP_PROFILE'])|| isset($_SERVER['HTTP_PROFILE'])) {
+ $this->isMobile = true;
+ } elseif (strpos($this->accept,'text/vnd.wap.wml') > 0 || strpos($this->accept,'application/vnd.wap.xhtml+xml') > 0) {
+ $this->isMobile = true;
+ } else {
+ foreach ($this->devices as $device => $regexp) {
+ if ($this->isDevice($device)) {
+ $this->isMobile = true;
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Overloads isAndroid() | isBlackberry() | isOpera() | isPalm() | isWindows() | isGeneric() through isDevice()
+ *
+ * @param string $name
+ * @param array $arguments
+ * @return bool
+ */
+ public function __call($name, $arguments) {
+ $device = substr($name, 2);
+ if ($name == "is" . ucfirst($device)) {
+ return $this->isDevice($device);
+ } else {
+ trigger_error("Method $name not defined", E_USER_ERROR);
+ }
+ }
+
+
+ /**
+ * Returns true if any type of mobile device detected, including special ones
+ * @return bool
+ */
+ public function isMobile() {
+ return $this->isMobile;
+ }
+
+
+ protected function isDevice($device) {
+ $var = "is" . ucfirst($device);
+ $return = $this->$var === null ? (bool) preg_match("/" . $this->devices[$device] . "/i", $this->userAgent) : $this->$var;
+
+ if ($device != 'generic' && $return == true) {
+ $this->isGeneric = false;
+ }
+
+ return $return;
+ }
+}
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the Jappix Mobile PHP/HTML code
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 10/07/11
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+?>
+
+<!DOCTYPE html>
+<?php htmlTag($locale); ?>
+
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+ <meta content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" name="viewport">
+ <title><?php _e("Jappix Mobile"); ?></title>
+ <link rel="shortcut icon" href="./favicon.ico" />
+ <?php echoGetFiles($hash, '', 'css', 'mobile.xml', ''); echo "\n"; ?>
+ <?php echoGetFiles($hash, $locale, 'js', 'mobile.xml', ''); echo "\n"; ?>
+</head>
+
+<body>
+ <div id="home">
+ <div class="header">
+ <div class="mobile-images"></div>
+ </div>
+
+ <noscript>
+ <div class="notification" id="noscript">
+ <?php _e("Please enable JavaScript"); ?>
+ </div>
+ </noscript>
+
+ <div class="notification" id="error">
+ <?php _e("Error"); ?>
+ </div>
+
+ <div class="notification" id="info">
+ <?php _e("Please wait..."); ?>
+ </div>
+
+ <div class="login">
+ <?php _e("Login"); ?>
+
+ <form action="#" method="post" onsubmit="return doLogin(this);">
+ <input class="xid mobile-images" type="text" name="xid" required="" />
+ <input class="password mobile-images" type="password" id="pwd" name="pwd" required="" />
+ <?php if(REGISTRATION != 'off') { ?>
+ <label><input class="register" type="checkbox" id="reg" name="reg" /><?php _e("Register"); ?></label>
+ <?php } ?>
+ <input type="submit" name="ok" value="<?php _e("Here we go!"); ?>" />
+ </form>
+ </div>
+
+ <a href="./?m=desktop<?php echo keepGet('m', false); ?>"><?php _e("Desktop"); ?></a>
+ </div>
+</body>
+
+</html>
+
+<!-- Jappix Mobile <?php echo $version; ?> - An open social platform -->
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the Jappix music search script
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 15/01/12
+
+*/
+
+// PHP base
+define('JAPPIX_BASE', '..');
+
+// Get the needed files
+require_once('./functions.php');
+require_once('./read-main.php');
+require_once('./read-hosts.php');
+
+// Optimize the page rendering
+hideErrors();
+compressThis();
+
+// Not allowed for a special node
+if(isStatic() || isUpload())
+ exit;
+
+// If valid data was sent
+if((isset($_GET['searchquery']) && !empty($_GET['searchquery'])) && (isset($_GET['location']) && !empty($_GET['location']))) {
+ // Set a XML header
+ header('Content-Type: text/xml; charset=utf-8');
+
+ // Get the values
+ $searchquery = $_GET['searchquery'];
+ $location = $_GET['location'];
+
+ // Jamendo search?
+ if($location == 'jamendo')
+ exit(read_url('http://api.jamendo.com/get2/name+id+duration+url/track/xml/?searchquery='.urlencode($searchquery).'&order=searchweight_desc'));
+
+ // Local music search
+ $xml = '<data>';
+ $searchquery = strtolower($searchquery);
+
+ // Escape the regex special characters
+ $searchquery = escapeRegex($searchquery);
+
+ // Search in the directory
+ $repertory = '../store/music/';
+ $scan = scandir($repertory);
+
+ foreach($scan as $current) {
+ // This file match our query!
+ if(is_file($repertory.$current) && $current && preg_match('/(^|\s|\[)('.$searchquery.')(.+)?(\.(og(g|a)|mp3|wav))$/i', strtolower($current))) {
+ // Get the basic informations
+ $title = preg_replace('/^(.+)(\.)(og(g|a)|mp3|wav)$/i', '$1', $current);
+ $url = $location.'store/music/'.$current;
+ $ext = getFileExt($current);
+ $id = md5($url);
+
+ // Get the MIME type
+ if($ext == 'mp3')
+ $type = 'audio/mpeg';
+ else if($ext == 'wav')
+ $type = 'audio/x-wav';
+ else
+ $type = 'audio/ogg';
+
+ // Get the advanced informations
+ $locked_title = $title;
+ $artist = '';
+ $source = '';
+
+ $title_regex = '/^(([^-]+) - )?([^\[]+)( \[(.+))?$/i';
+ $artist_regex = '/^(.+) - (.+)$/i';
+ $source_regex = '/^(.+) \[(.+)\]$/i';
+
+ if(preg_match($title_regex, $locked_title))
+ $title = preg_replace($title_regex, '$3', $locked_title);
+
+ if(preg_match($artist_regex, $locked_title))
+ $artist = preg_replace($artist_regex, '$1', $locked_title);
+
+ if(preg_match($source_regex, $locked_title))
+ $source = preg_replace($source_regex, '$2', $locked_title);
+
+ // Generate the XML
+ $xml .= '<data><track><name>'.htmlspecialchars($title).'</name><artist>'.htmlspecialchars($artist).'</artist><source>'.htmlspecialchars($source).'</source><id>'.htmlspecialchars($id).'</id><url>'.htmlspecialchars($url).'</url><type>'.$type.'</type></track></data>';
+ }
+ }
+
+ // End
+ $xml .= '</data>';
+
+ // Return the path to the file
+ exit($xml);
+}
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the design configuration POST handler (manager)
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 25/08/11
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+// Handle the remove GET
+if(isset($_GET['k']) && !empty($_GET['k'])) {
+ $kill_logo = JAPPIX_BASE.'/store/logos/'.$_GET['k'].'.png';
+
+ if(isSafe($kill_logo) && file_exists($kill_logo)) {
+ unlink($kill_logo);
+
+ echo('<p class="info smallspace success">'.T_("The selected elements have been removed.").'</p>');
+ }
+}
+
+// Handle the remove POST
+else if(isset($_POST['remove']))
+ removeElements();
+
+// Handle the logo upload POST
+else if(isset($_POST['logo_upload'])) {
+ // Avoid errors
+ $logos_arr_1_name = $logos_arr_1_tmp = $logos_arr_2_name = $logos_arr_2_tmp = $logos_arr_3_name = $logos_arr_3_tmp = $logos_arr_4_name = $logos_arr_4_tmp = '';
+
+ if(isset($_FILES['logo_own_1_location'])) {
+ $logos_arr_1_name = $_FILES['logo_own_1_location']['name'];
+ $logos_arr_1_tmp = $_FILES['logo_own_1_location']['tmp_name'];
+ }
+
+ if(isset($_FILES['logo_own_2_location'])) {
+ $logos_arr_2_name = $_FILES['logo_own_2_location']['name'];
+ $logos_arr_2_tmp = $_FILES['logo_own_2_location']['tmp_name'];
+ }
+
+ if(isset($_FILES['logo_own_3_location'])) {
+ $logos_arr_3_name = $_FILES['logo_own_3_location']['name'];
+ $logos_arr_3_tmp = $_FILES['logo_own_3_location']['tmp_name'];
+ }
+
+ if(isset($_FILES['logo_own_4_location'])) {
+ $logos_arr_4_name = $_FILES['logo_own_4_location']['name'];
+ $logos_arr_4_tmp = $_FILES['logo_own_4_location']['tmp_name'];
+ }
+
+ // File infos array
+ $logos = array(
+ array($logos_arr_1_name, $logos_arr_1_tmp, JAPPIX_BASE.'/store/logos/desktop_home.png'),
+ array($logos_arr_2_name, $logos_arr_2_tmp, JAPPIX_BASE.'/store/logos/desktop_app.png'),
+ array($logos_arr_3_name, $logos_arr_3_tmp, JAPPIX_BASE.'/store/logos/mobile.png'),
+ array($logos_arr_4_name, $logos_arr_4_tmp, JAPPIX_BASE.'/store/logos/mini.png')
+ );
+
+ // Check for errors
+ $logo_error = false;
+ $logo_not_png = false;
+ $logo_anything = false;
+
+ foreach($logos as $sub_array) {
+ // Nothing?
+ if(!$sub_array[0] || !$sub_array[1])
+ continue;
+
+ // Not an image?
+ if(getFileExt($sub_array[0]) != 'png') {
+ $logo_not_png = true;
+
+ continue;
+ }
+
+ // Upload error?
+ if(!move_uploaded_file($sub_array[1], $sub_array[2])) {
+ $logo_error = true;
+
+ continue;
+ }
+
+ $logo_anything = true;
+ }
+
+ // Not an image?
+ if($logo_not_png) { ?>
+ <p class="info smallspace fail"><?php _e("This is not a valid image, please use the PNG format!"); ?></p>
+ <?php }
+
+ // Upload error?
+ else if($logo_error || !$logo_anything) { ?>
+ <p class="info smallspace fail"><?php _e("The image could not be received, would you mind retry?"); ?></p>
+ <?php }
+
+ // Everything went fine
+ else { ?>
+ <p class="info smallspace success"><?php _e("Your service logo has been successfully changed!"); ?></p>
+ <?php }
+}
+
+// Handle the background upload POST
+else if(isset($_POST['background_upload'])) {
+ // Get the file path
+ $name_background_image = $_FILES['background_image_upload']['name'];
+ $temp_background_image = $_FILES['background_image_upload']['tmp_name'];
+ $path_background_image = JAPPIX_BASE.'/store/backgrounds/'.$name_background_image;
+
+ // An error occured?
+ if(!isSafe($name_background_image) || $_FILES['background_image_upload']['error'] || !move_uploaded_file($temp_background_image, $path_background_image)) { ?>
+
+ <p class="info smallspace fail"><?php _e("The image could not be received, would you mind retry?"); ?></p>
+
+ <?php }
+
+ // Bad extension?
+ else if(!isImage($name_background_image)) {
+ // Remove the image file
+ if(file_exists($path_background_image))
+ unlink($path_background_image);
+ ?>
+
+ <p class="info smallspace fail"><?php _e("This is not a valid image, please use PNG, GIF or JPG!"); ?></p>
+
+ <?php }
+
+ // The file has been sent
+ else { ?>
+
+ <p class="info smallspace success"><?php _e("Your image was added to the list!"); ?></p>
+
+ <?php }
+}
+
+// Handle the save POST
+else if(isset($_POST['save'])) {
+ // Marker
+ $save_marker = true;
+
+ // Handle it for background
+ $background = array();
+
+ if(isset($_POST['background_type']))
+ $background['type'] = $_POST['background_type'];
+
+ if(isset($_POST['background_image_file']))
+ $background['image_file'] = $_POST['background_image_file'];
+
+ if(isset($_POST['background_image_repeat']))
+ $background['image_repeat'] = $_POST['background_image_repeat'];
+
+ if(isset($_POST['background_image_horizontal']))
+ $background['image_horizontal'] = $_POST['background_image_horizontal'];
+
+ if(isset($_POST['background_image_vertical']))
+ $background['image_vertical'] = $_POST['background_image_vertical'];
+
+ if(isset($_POST['background_image_adapt']))
+ $background['image_adapt'] = 'on';
+
+ if(isset($_POST['background_image_color']))
+ $background['image_color'] = $_POST['background_image_color'];
+
+ if(isset($_POST['background_color_color']))
+ $background['color_color'] = $_POST['background_color_color'];
+
+ // Write the configuration file
+ writeBackground($background);
+
+ // Handle it for notice
+ if(isset($_POST['notice_type']))
+ $notice_type = $_POST['notice_type'];
+ else
+ $notice_type = 'none';
+
+ $notice_text = '';
+
+ if(isset($_POST['notice_text']))
+ $notice_text = $_POST['notice_text'];
+
+ // Check our values
+ if(!$notice_text && ($notice_type != 'none'))
+ $save_marker = false;
+
+ // All is okay
+ if($save_marker) {
+ // Write the notice configuration
+ writeNotice($notice_type, $notice_text);
+
+ // Show a success notice
+ ?>
+
+ <p class="info smallspace success"><?php _e("Your design preferences have been saved!"); ?></p>
+
+ <?php }
+
+ // Something went wrong
+ else { ?>
+
+ <p class="info smallspace fail"><?php _e("Please check your inputs: something is missing!"); ?></p>
+
+ <?php
+ }
+}
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the hosts configuration POST handler (install & manager)
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 27/05/11
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+// Main host
+if(isset($_POST['host_main']) && !empty($_POST['host_main']))
+ $host_main = stripslashes(htmlspecialchars($_POST['host_main']));
+else
+ $host_main = stripslashes(htmlspecialchars($hosts_default['main']));
+
+// Groupchat host
+if(isset($_POST['host_muc']) && !empty($_POST['host_muc']))
+ $host_muc = stripslashes(htmlspecialchars($_POST['host_muc']));
+else
+ $host_muc = stripslashes(htmlspecialchars($hosts_default['muc']));
+
+// Pubsub host
+if(isset($_POST['host_pubsub']) && !empty($_POST['host_pubsub']))
+ $host_pubsub = stripslashes(htmlspecialchars($_POST['host_pubsub']));
+else
+ $host_pubsub = stripslashes(htmlspecialchars($hosts_default['pubsub']));
+
+// Directory host
+if(isset($_POST['host_vjud']) && !empty($_POST['host_vjud']))
+ $host_vjud = stripslashes(htmlspecialchars($_POST['host_vjud']));
+else
+ $host_vjud = stripslashes(htmlspecialchars($hosts_default['vjud']));
+
+// Anonymous host
+if(isset($_POST['host_anonymous']) && !empty($_POST['host_anonymous']))
+ $host_anonymous = stripslashes(htmlspecialchars($_POST['host_anonymous']));
+else
+ $host_anonymous = stripslashes(htmlspecialchars($hosts_default['anonymous']));
+
+// BOSH host
+if(isset($_POST['host_bosh']) && !empty($_POST['host_bosh']))
+ $host_bosh = stripslashes(htmlspecialchars($_POST['host_bosh']));
+else
+ $host_bosh = stripslashes(htmlspecialchars($hosts_default['bosh']));
+
+// Main BOSH host
+if(isset($_POST['host_bosh_main']) && !empty($_POST['host_bosh_main']))
+ $host_bosh_main = stripslashes(htmlspecialchars($_POST['host_bosh_main']));
+else
+ $host_bosh_main = stripslashes(htmlspecialchars($hosts_default['bosh_main']));
+
+// Mini BOSH host
+if(isset($_POST['host_bosh_mini']) && !empty($_POST['host_bosh_mini']))
+ $host_bosh_mini = stripslashes(htmlspecialchars($_POST['host_bosh_mini']));
+else
+ $host_bosh_mini = stripslashes(htmlspecialchars($hosts_default['bosh_mini']));
+
+// Static host
+if(isset($_POST['host_static']) && !empty($_POST['host_static']))
+ $host_static = stripslashes(htmlspecialchars($_POST['host_static']));
+else
+ $host_static = stripslashes(htmlspecialchars($hosts_default['static']));
+
+// Upload host
+if(isset($_POST['host_upload']) && !empty($_POST['host_upload']))
+ $host_upload = stripslashes(htmlspecialchars($_POST['host_upload']));
+else
+ $host_upload = stripslashes(htmlspecialchars($hosts_default['upload']));
+
+// Generate the hosts XML content
+$hosts_xml =
+ '<main>'.$host_main.'</main>
+ <muc>'.$host_muc.'</muc>
+ <pubsub>'.$host_pubsub.'</pubsub>
+ <vjud>'.$host_vjud.'</vjud>
+ <anonymous>'.$host_anonymous.'</anonymous>
+ <bosh>'.$host_bosh.'</bosh>
+ <bosh_main>'.$host_bosh_main.'</bosh_main>
+ <bosh_mini>'.$host_bosh_mini.'</bosh_mini>
+ <static>'.$host_static.'</static>
+ <upload>'.$host_upload.'</upload>'
+;
+
+// Write the main configuration
+writeXML('conf', 'hosts', $hosts_xml);
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the main configuration POST handler (install & manager)
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 26/08/11
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+// Service name
+if(isset($_POST['service_name']) && !empty($_POST['service_name']))
+ $service_name = stripslashes(htmlspecialchars($_POST['service_name']));
+else
+ $service_name = stripslashes(htmlspecialchars($main_default['name']));
+
+// Service description
+if(isset($_POST['service_desc']) && !empty($_POST['service_desc']))
+ $service_desc = stripslashes(htmlspecialchars($_POST['service_desc']));
+else
+ $service_desc = stripslashes(htmlspecialchars($main_default['desc']));
+
+// Jappix resource
+if(isset($_POST['jappix_resource']) && !empty($_POST['jappix_resource']))
+ $jappix_resource = stripslashes(htmlspecialchars($_POST['jappix_resource']));
+else
+ $jappix_resource = stripslashes(htmlspecialchars($main_default['resource']));
+
+// Lock host
+if(isset($_POST['lock_host']) && !empty($_POST['lock_host']))
+ $lock_host = 'on';
+else
+ $lock_host = 'off';
+
+// Anonymous mode
+if(isset($_POST['anonymous_mode']) && !empty($_POST['anonymous_mode']))
+ $anonymous_mode = 'on';
+else
+ $anonymous_mode = 'off';
+
+// Registration
+if(isset($_POST['registration']) && !empty($_POST['registration']))
+ $registration = 'on';
+else
+ $registration = 'off';
+
+// BOSH proxy
+if(isset($_POST['bosh_proxy']) && !empty($_POST['bosh_proxy']))
+ $bosh_proxy = 'on';
+else
+ $bosh_proxy = 'off';
+
+// Manager link
+if(isset($_POST['manager_link']) && !empty($_POST['manager_link']))
+ $manager_link = 'on';
+else
+ $manager_link = 'off';
+
+// Groupchats to join
+if(isset($_POST['groupchats_join']) && !empty($_POST['groupchats_join']))
+ $groupchats_join = stripslashes(htmlspecialchars(trim($_POST['groupchats_join'])));
+else
+ $groupchats_join = stripslashes(htmlspecialchars($main_default['groupchats_join']));
+
+// Encryption
+if(isset($_POST['encryption']) && !empty($_POST['encryption']))
+ $encryption = 'on';
+else
+ $encryption = 'off';
+
+// HTTPS storage
+if(isset($_POST['https_storage']) && !empty($_POST['https_storage']))
+ $https_storage = 'on';
+else
+ $https_storage = 'off';
+
+// Force HTTPS
+if(isset($_POST['https_force']) && !empty($_POST['https_force']))
+ $https_force = 'on';
+else
+ $https_force = 'off';
+
+// Compression
+if(isset($_POST['compression']) && !empty($_POST['compression']))
+ $compression = 'on';
+else
+ $compression = 'off';
+
+// Multiple resources
+if(isset($_POST['multi_files']) && ($_POST['multi_files'] == 'on'))
+ $multi_files = 'on';
+else
+ $multi_files = 'off';
+
+// Developer mode
+if(isset($_POST['developer']) && ($_POST['developer'] == 'on'))
+ $developer = 'on';
+else
+ $developer = 'off';
+
+// Generate the configuration XML content
+$conf_xml =
+ '<name>'.$service_name.'</name>
+ <desc>'.$service_desc.'</desc>
+ <resource>'.$jappix_resource.'</resource>
+ <lock>'.$lock_host.'</lock>
+ <anonymous>'.$anonymous_mode.'</anonymous>
+ <registration>'.$registration.'</registration>
+ <bosh_proxy>'.$bosh_proxy.'</bosh_proxy>
+ <manager_link>'.$manager_link.'</manager_link>
+ <groupchats_join>'.$groupchats_join.'</groupchats_join>
+ <encryption>'.$encryption.'</encryption>
+ <https_storage>'.$https_storage.'</https_storage>
+ <https_force>'.$https_force.'</https_force>
+ <compression>'.$compression.'</compression>
+ <multi_files>'.$multi_files.'</multi_files>
+ <developer>'.$developer.'</developer>'
+;
+
+// Write the main configuration
+writeXML('conf', 'main', $conf_xml);
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the store configuration POST handler (manager)
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 28/12/10
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+// Music upload?
+if(isset($_POST['upload'])) {
+ // Get the file path
+ $name_music = $_FILES['music_file']['name'];
+ $temp_music = $_FILES['music_file']['tmp_name'];
+
+ // Any special name submitted?
+ if(isset($_POST['music_title']) && !empty($_POST['music_title'])) {
+ // Add a form var
+ $music_title = $_POST['music_title'];
+
+ // Get the file extension
+ $ext_music = getFileExt($name_music);
+
+ // New name
+ $name_music = '';
+
+ // Add the artist name?
+ if(isset($_POST['music_artist']) && !empty($_POST['music_artist'])) {
+ // Add a form var
+ $music_artist = $_POST['music_artist'];
+
+ // Add the current POST var to the global string
+ $name_music .= $_POST['music_artist'].' - ';
+ }
+
+ // Add the music title
+ $name_music .= $_POST['music_title'];
+
+ // Add the album name?
+ if(isset($_POST['music_album']) && !empty($_POST['music_album'])) {
+ // Add a form var
+ $music_album = $_POST['music_album'];
+
+ // Add the current POST var to the global string
+ $name_music .= ' ['.$_POST['music_album'].']';
+ }
+
+ // Add the extension
+ $name_music .= '.'.$ext_music;
+ }
+
+ // Music path with new name
+ $path_music = JAPPIX_BASE.'/store/music/'.$name_music;
+
+ // An error occured?
+ if(!isSafe($name_music) || $_FILES['music_file']['error'] || !move_uploaded_file($temp_music, $path_music)) { ?>
+
+ <p class="info smallspace fail"><?php _e("The music could not be received, please retry!"); ?></p>
+
+ <?php }
+
+ // Bad extension?
+ else if(!preg_match('/^(.+)(\.(og(g|a)|mp3|wav))$/i', $name_music)) {
+ // Remove the image file
+ if(file_exists($path_music))
+ unlink($path_music);
+ ?>
+
+ <p class="info smallspace fail"><?php _e("This is not a valid music file, please encode in Ogg Vorbis, MP3 or WAV!"); ?></p>
+
+ <?php }
+
+ // The file has been sent
+ else { ?>
+
+ <p class="info smallspace success"><?php _e("Your music has been added!"); ?></p>
+
+ <?php
+ // Reset the form vars
+ $music_title = '';
+ $music_artist = '';
+ $music_album = '';
+ }
+}
+
+// File deletion?
+else if(isset($_POST['remove']))
+ removeElements();
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the user add POST handler (install & manager)
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 28/12/10
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+// Marker
+$valid_user = true;
+
+// Administrator name
+if(isset($_POST['user_name']) && !empty($_POST['user_name']))
+ $user_name = trim($_POST['user_name']);
+else
+ $valid_user = false;
+
+// Administrator password (first)
+if(isset($_POST['user_password']) && !empty($_POST['user_password']))
+ $user_password = trim($_POST['user_password']);
+else
+ $valid_user = false;
+
+// Administrator password (second)
+if(isset($_POST['user_repassword']) && ($user_password != $_POST['user_repassword']))
+ $valid_user = false;
+
+// Generate the users XML content
+if($valid_user) {
+ // Add our user
+ manageUsers('add', array($user_name => $user_password));
+
+ // Reset the user name
+ $user_name = '';
+}
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the design configuration reader
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 28/12/10
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+// Get the available backgrounds
+$backgrounds = getBackgrounds();
+$backgrounds_number = count($backgrounds);
+
+// Read the background configuration
+$background = readBackground();
+
+// Backgrounds are missing?
+if(!$backgrounds_number && ($background['type'] == 'image'))
+ $background['type'] = 'default';
+
+switch($background['type']) {
+ // Simple notice input
+ case 'image':
+ $background_image = ' checked=""';
+ $background_default = '';
+
+ break;
+
+ // Advanced notice input
+ case 'color':
+ $background_color = ' checked=""';
+ $background_default = '';
+
+ break;
+}
+
+switch($background['image_repeat']) {
+ // No repeat
+ case 'no-repeat':
+ $background_image_repeat_no = ' selected=""';
+ $background_image_repeat_x = '';
+
+ break;
+
+ // Repeat
+ case 'repeat':
+ $background_image_repeat_all = ' selected=""';
+ $background_image_repeat_x = '';
+
+ break;
+
+ // Y repeat
+ case 'repeat-y':
+ $background_image_repeat_y = ' selected=""';
+ $background_image_repeat_x = '';
+
+ break;
+}
+
+switch($background['image_horizontal']) {
+ // Left position
+ case 'left':
+ $background_image_horizontal_left = ' selected=""';
+ $background_image_horizontal_center = '';
+
+ break;
+
+ // Right position
+ case 'right':
+ $background_image_horizontal_right = ' selected=""';
+ $background_image_horizontal_center = '';
+
+ break;
+}
+
+switch($background['image_vertical']) {
+ // Left position
+ case 'top':
+ $background_image_vertical_top = ' selected=""';
+ $background_image_vertical_center = '';
+
+ break;
+
+ // Right position
+ case 'bottom':
+ $background_image_vertical_bottom = ' selected=""';
+ $background_image_vertical_center = '';
+
+ break;
+}
+
+if($background['image_adapt'] == 'on')
+ $background_image_adapt = ' checked=""';
+
+// Read the notice configuration
+$notice_conf = readNotice();
+$notice_text = $notice_conf['notice'];
+
+switch($notice_conf['type']) {
+ // Simple notice input
+ case 'simple':
+ $notice_simple = ' checked=""';
+ $notice_none = '';
+
+ break;
+
+ // Advanced notice input
+ case 'advanced':
+ $notice_advanced = ' checked=""';
+ $notice_none = '';
+
+ break;
+}
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the hosts configuration reader
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 29/05/11
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+// Get the protocol we use
+if(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'))
+ $protocol = 'https';
+else
+ $protocol = 'http';
+
+// Get the HTTP host
+$http_host = 'jappix.com';
+
+if($_SERVER['HTTP_HOST']) {
+ $http_host_split = str_replace('www.', '', $_SERVER['HTTP_HOST']);
+ $http_host_split = preg_replace('/:[0-9]+$/i', '', $http_host_split);
+
+ if($http_host_split)
+ $http_host = $http_host_split;
+}
+
+// Define the default hosts configuration values
+$hosts_conf = array(
+ 'main' => $http_host,
+ 'muc' => 'muc.'.$http_host,
+ 'pubsub' => 'pubsub.'.$http_host,
+ 'vjud' => 'vjud.'.$http_host,
+ 'anonymous' => 'anonymous.'.$http_host,
+ 'bosh' => 'http://'.$http_host.':5280/http-bind',
+ 'bosh_main' => '',
+ 'bosh_mini' => '',
+ 'static' => '',
+ 'upload' => ''
+ );
+
+// Define a default values array
+$hosts_default = $hosts_conf;
+
+// Read the hosts configuration file
+$hosts_data = readXML('conf', 'hosts');
+
+// Read the hosts configuration file
+if($hosts_data) {
+ // Initialize the hosts configuration XML data
+ $hosts_xml = new SimpleXMLElement($hosts_data);
+
+ // Loop the hosts configuration elements
+ foreach($hosts_xml->children() as $hosts_child) {
+ $hosts_value = $hosts_child->getName();
+
+ // Only push this to the array if it exists
+ if(isset($hosts_conf[$hosts_value]) && $hosts_child)
+ $hosts_conf[$hosts_value] = str_replace('{PROTOCOL}', $protocol, $hosts_child);
+ }
+}
+
+// Finally, define the hosts configuration globals
+define('HOST_MAIN', $hosts_conf['main']);
+define('HOST_MUC', $hosts_conf['muc']);
+define('HOST_PUBSUB', $hosts_conf['pubsub']);
+define('HOST_VJUD', $hosts_conf['vjud']);
+define('HOST_ANONYMOUS', $hosts_conf['anonymous']);
+define('HOST_BOSH', $hosts_conf['bosh']);
+define('HOST_BOSH_MAIN', $hosts_conf['bosh_main']);
+define('HOST_BOSH_MINI', $hosts_conf['bosh_mini']);
+define('HOST_STATIC', $hosts_conf['static']);
+define('HOST_UPLOAD', $hosts_conf['upload']);
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the main configuration reader
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 26/08/11
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+// Define the default main configuration values
+$main_conf = array(
+ 'name' => 'Jappix',
+ 'desc' => 'a free social network',
+ 'resource' => 'Jappix',
+ 'lock' => 'on',
+ 'anonymous' => 'on',
+ 'registration' => 'on',
+ 'bosh_proxy' => 'on',
+ 'manager_link' => 'on',
+ 'groupchats_join' => '',
+ 'encryption' => 'on',
+ 'https_storage' => 'off',
+ 'https_force' => 'off',
+ 'compression' => 'off',
+ 'multi_files' => 'off',
+ 'developer' => 'off'
+ );
+
+// Define a default values array
+$main_default = $main_conf;
+
+// Read the main configuration file
+$main_data = readXML('conf', 'main');
+
+// Read the main configuration file
+if($main_data) {
+ // Initialize the main configuration XML data
+ $main_xml = new SimpleXMLElement($main_data);
+
+ // Loop the main configuration elements
+ foreach($main_xml->children() as $main_child) {
+ $main_value = $main_child->getName();
+
+ // Only push this to the array if it exists
+ if(isset($main_conf[$main_value]) && $main_child)
+ $main_conf[$main_value] = $main_child;
+ }
+}
+
+// Finally, define the main configuration globals
+define('SERVICE_NAME', $main_conf['name']);
+define('SERVICE_DESC', $main_conf['desc']);
+define('JAPPIX_RESOURCE', $main_conf['resource']);
+define('LOCK_HOST', $main_conf['lock']);
+define('ANONYMOUS', $main_conf['anonymous']);
+define('REGISTRATION', $main_conf['registration']);
+define('BOSH_PROXY', $main_conf['bosh_proxy']);
+define('MANAGER_LINK', $main_conf['manager_link']);
+define('GROUPCHATS_JOIN', $main_conf['groupchats_join']);
+define('ENCRYPTION', $main_conf['encryption']);
+define('HTTPS_STORAGE', $main_conf['https_storage']);
+define('HTTPS_FORCE', $main_conf['https_force']);
+define('COMPRESSION', $main_conf['compression']);
+define('MULTI_FILES', $main_conf['multi_files']);
+define('DEVELOPER', $main_conf['developer']);
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the Jappix Out of Band file send script
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 14/01/12
+
+*/
+
+// PHP base
+define('JAPPIX_BASE', '..');
+
+// Get the needed files
+require_once('./functions.php');
+require_once('./read-main.php');
+require_once('./read-hosts.php');
+
+// Optimize the page rendering
+hideErrors();
+compressThis();
+
+// Not allowed for a special node
+if(isStatic())
+ exit;
+
+// Action on an existing file
+if(isset($_GET['id']) && !empty($_GET['id'])) {
+ $file_id = $_GET['id'];
+ $file_path = JAPPIX_BASE.'/store/send/'.$file_id;
+
+ // Get file name
+ if(isset($_GET['name']) && !empty($_GET['name']))
+ $file_name = $_GET['name'];
+ else
+ $file_name = $file_id;
+
+ // Hack?
+ if(!isSafe($file_id)) {
+ header('Status: 406 Not Acceptable', true, 406);
+ exit('HTTP/1.1 406 Not Acceptable');
+ }
+
+ // File does not exist
+ if(!file_exists($file_path)) {
+ header('Status: 404 Not Found', true, 404);
+ exit('HTTP/1.1 404 Not Found');
+ }
+
+ // Remove a file
+ if(isset($_GET['action']) && ($_GET['action'] == 'remove')) {
+ header('Status: 204 No Content', true, 204);
+ unlink($file_path);
+ }
+
+ // Receive a file
+ header("Content-disposition: attachment; filename=\"$file_name\"");
+ header("Content-Type: application/force-download");
+ header("Content-Length: ".filesize($file_path));
+ header("Pragma: no-cache");
+ header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
+ header("Expires: 0");
+ readfile($file_path);
+ unlink($file_path);
+}
+
+// Send a file
+else if((isset($_FILES['file']) && !empty($_FILES['file'])) && (isset($_POST['id']) && !empty($_POST['id'])) && (isset($_POST['location']) && !empty($_POST['location']))) {
+ header('Content-Type: text/xml; charset=utf-8');
+
+ // Get the file name
+ $tmp_filename = $_FILES['file']['tmp_name'];
+ $filename = $_FILES['file']['name'];
+
+ // Get the location
+ if(HOST_UPLOAD)
+ $location = HOST_UPLOAD;
+ else
+ $location = $_POST['location'];
+
+ // Get the file new name
+ $ext = getFileExt($filename);
+ $new_name = preg_replace('/(^)(.+)(\.)(.+)($)/i', '$2', $filename);
+
+ // Define some vars
+ $name = sha1(time().$filename);
+ $path = JAPPIX_BASE.'/store/send/'.$name.'.'.$ext;
+
+ // Forbidden file?
+ if(!isSafe($filename) || !isSafe($name.'.'.$ext)) {
+ exit(
+'<jappix xmlns=\'jappix:file:send\'>
+ <error>forbidden-type</error>
+ <id>'.htmlspecialchars($_POST['id']).'</id>
+</jappix>'
+ );
+ }
+
+ // File upload error?
+ if(!is_uploaded_file($tmp_filename) || !move_uploaded_file($tmp_filename, $path)) {
+ exit(
+'<jappix xmlns=\'jappix:file:send\'>
+ <error>move-error</error>
+ <id>'.htmlspecialchars($_POST['id']).'</id>
+</jappix>'
+ );
+ }
+
+ // Return the path to the file
+ exit(
+'<jappix xmlns=\'jappix:file:send\'>
+ <url>'.htmlspecialchars($location.'php/send.php?id='.urlencode($name).'.'.urlencode($ext).'&name='.urlencode($filename)).'</url>
+ <desc>'.htmlspecialchars($new_name).'</desc>
+ <id>'.htmlspecialchars($_POST['id']).'</id>
+</jappix>'
+ );
+}
+
+// Error?
+else {
+ header('Status: 400 Bad Request', true, 400);
+ exit('HTTP/1.1 400 Bad Request');
+}
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the Jappix Static PHP/HTML code
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 27/05/11
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+?>
+<!DOCTYPE html>
+<?php htmlTag($locale); ?>
+
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+ <title><?php echo htmlspecialchars(SERVICE_NAME); ?> • <?php _e("Static content server"); ?></title>
+ <link rel="shortcut icon" href="./favicon.ico" />
+</head>
+
+<body>
+ <h1><?php echo htmlspecialchars(SERVICE_NAME); ?> - <?php _e("Static content server"); ?></h1>
+ <p><?php printf(T_("This is the static content server for %1s, ā%2sā."), htmlspecialchars(SERVICE_NAME), htmlspecialchars(SERVICE_DESC)); ?></p>
+ <?php if(showManagerLink()) { ?>
+ <p><a href="./?m=manager<?php echo keepGet('m', false); ?>"><?php _e("Manager"); ?></a></p>
+ <?php } ?>
+</body>
+
+</html>
+
+<!-- Jappix Static <?php echo $version; ?> - An open social platform -->
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+The SVG loader for Jappix statistics
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 28/12/10
+
+*/
+
+// PHP base
+define('JAPPIX_BASE', '..');
+
+// Get the functions
+require_once('./functions.php');
+require_once('./functions-manager.php');
+
+// Get the configuration
+require_once('./read-main.php');
+require_once('./read-hosts.php');
+
+// Get the libs
+require_once('./drawsvgchart.php');
+require_once('./gettext.php');
+
+// Optimize the page rendering
+hideErrors();
+compressThis();
+
+// Start the session
+session_start();
+
+// Check if the user is authorized
+$is_admin = false;
+
+if((isset($_SESSION['jappix_user']) && !empty($_SESSION['jappix_user'])) && (isset($_SESSION['jappix_password']) && !empty($_SESSION['jappix_password']))) {
+ // Get the session values
+ $user = $_SESSION['jappix_user'];
+ $password = $_SESSION['jappix_password'];
+
+ // Checks the user is admin
+ $is_admin = isAdmin($user, $password);
+}
+
+// Not admin? Stop the script!
+if(!$is_admin)
+ exit;
+
+// Get the graph type
+if((isset($_GET['g']) && !empty($_GET['g'])))
+ $graph = $_GET['g'];
+else
+ $graph = 'others';
+
+// Get the locale
+if((isset($_GET['l']) && !empty($_GET['l'])))
+ $locale = $_GET['l'];
+else
+ $locale = 'en';
+
+// Include the translations
+includeTranslation($locale, 'main');
+
+$drawsvgchart = new DrawSVGChart;
+
+// Generation vars
+$link = FALSE;
+$evolution = FALSE;
+
+// Access graph?
+if($graph == 'access') {
+ // Values
+ $elements = getMonthlyVisits();
+ $legend = array(array('#5276A9', T_("Visits")));
+ $evolution = TRUE;
+}
+
+// Share graph?
+else if($graph == 'share') {
+ // Values
+ $elements = largestShare(shareStats(), 8);
+ $legend = array(array('#5276A9', T_("Size")));
+}
+
+// Others graph?
+else if($graph == 'others') {
+ // Values
+ $elements = otherStats();
+ $legend = array(array('#5276A9', T_("Size")));
+}
+
+// Generate the chart
+$svgchart = $drawsvgchart->createChart($elements, $legend, $link, $evolution, $graph);
+
+// No error?
+if(!$drawsvgchart->has_errors()) {
+ header('Content-Type: image/svg+xml; charset=utf-8');
+ echo $drawsvgchart->getXMLOutput();
+}
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This script (re)generates the store sub-folders (after an update)
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 26/08/11
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+// Array of the sub-folders to create
+$store_folders = array(
+ 'access',
+ 'avatars',
+ 'backgrounds',
+ 'cache',
+ 'conf',
+ 'logos',
+ 'logs',
+ 'music',
+ 'send',
+ 'share',
+ 'updates'
+);
+
+// Creates the sub-folders
+for($i = 0; $i < count($store_folders); $i++) {
+ $current = JAPPIX_BASE.'/store/'.$store_folders[$i];
+
+ // Create the folder itself
+ if(!is_dir($current))
+ mkdir($current, 0777, true);
+
+ chmod($current, 0777);
+
+ // Create the security file inside the folder
+ $security_html = securityHTML();
+
+ file_put_contents($current.'/index.html', $security_html);
+}
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+This is the Jappix Static PHP/HTML code
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 27/05/11
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+?>
+<!DOCTYPE html>
+<?php htmlTag($locale); ?>
+
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+ <title><?php echo htmlspecialchars(SERVICE_NAME); ?> • <?php _e("User uploads server"); ?></title>
+ <link rel="shortcut icon" href="./favicon.ico" />
+</head>
+
+<body>
+ <h1><?php echo htmlspecialchars(SERVICE_NAME); ?> - <?php _e("User uploads server"); ?></h1>
+ <p><?php printf(T_("This is the user uploads server for %1s, ā%2sā."), htmlspecialchars(SERVICE_NAME), htmlspecialchars(SERVICE_DESC)); ?></p>
+ <?php if(showManagerLink()) { ?>
+ <p><a href="./?m=manager<?php echo keepGet('m', false); ?>"><?php _e("Manager"); ?></a></p>
+ <?php } ?>
+</body>
+
+</html>
+
+<!-- Jappix Upload <?php echo $version; ?> - An open social platform -->
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+These are the design configuration variables
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 25/08/11
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+// Define initial logo form values
+$logo_default = ' checked=""';
+$logo_own = '';
+
+// Define initial background form values
+$background_default = ' checked=""';
+$background_image = '';
+$background_color = '';
+$background_image_repeat_no = '';
+$background_image_repeat_all = '';
+$background_image_repeat_x = ' selected=""';
+$background_image_repeat_y = '';
+$background_image_horizontal_center = ' selected=""';
+$background_image_horizontal_left = '';
+$background_image_horizontal_right = '';
+$background_image_vertical_center = ' selected=""';
+$background_image_vertical_top = '';
+$background_image_vertical_bottom = '';
+$background_image_adapt = '';
+
+// Define initial notice form values
+$notice_none = ' checked=""';
+$notice_simple = '';
+$notice_advanced = '';
+$notice_text = '';
+
+// Current background folder
+$backgrounds_folder = 'backgrounds';
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+These are the hosts configuration variables
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 27/05/11
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+// Define the vars with the hosts configuration constants
+$host_main = htmlspecialchars(HOST_MAIN);
+$host_muc = htmlspecialchars(HOST_MUC);
+$host_pubsub = htmlspecialchars(HOST_PUBSUB);
+$host_vjud = htmlspecialchars(HOST_VJUD);
+$host_anonymous = htmlspecialchars(HOST_ANONYMOUS);
+$host_bosh = htmlspecialchars(HOST_BOSH);
+$host_bosh_main = htmlspecialchars(HOST_BOSH_MAIN);
+$host_bosh_mini = htmlspecialchars(HOST_BOSH_MINI);
+$host_static = htmlspecialchars(HOST_STATIC);
+$host_upload = htmlspecialchars(HOST_UPLOAD);
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+These are the main configuration variables
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 26/08/11
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+// Define the vars with the main configuration constants
+$service_name = htmlspecialchars(SERVICE_NAME);
+$service_desc = htmlspecialchars(SERVICE_DESC);
+$jappix_resource = htmlspecialchars(JAPPIX_RESOURCE);
+$lock_host = htmlspecialchars(LOCK_HOST);
+$anonymous_mode = htmlspecialchars(ANONYMOUS);
+$registration = htmlspecialchars(REGISTRATION);
+$bosh_proxy = htmlspecialchars(BOSH_PROXY);
+$manager_link = htmlspecialchars(MANAGER_LINK);
+$groupchats_join = htmlspecialchars(GROUPCHATS_JOIN);
+$encryption = htmlspecialchars(ENCRYPTION);
+$https_storage = htmlspecialchars(HTTPS_STORAGE);
+$https_force = htmlspecialchars(HTTPS_FORCE);
+$compression = htmlspecialchars(COMPRESSION);
+$multi_files = htmlspecialchars(MULTI_FILES);
+$developer = htmlspecialchars(DEVELOPER);
+
+?>
--- /dev/null
+<?php
+
+/*
+
+Jappix - An open social platform
+These are the store configuration variables
+
+-------------------------------------------------
+
+License: AGPL
+Author: Vanaryon
+Last revision: 28/12/10
+
+*/
+
+// Someone is trying to hack us?
+if(!defined('JAPPIX_BASE'))
+ exit;
+
+// Define the initial music form values
+$music_title = '';
+$music_artist = '';
+$music_album = '';
+
+// Current store folders
+$share_folder = 'share';
+$music_folder = 'music';
+
+?>
--- /dev/null
+<?xml version="1.0" encoding="utf-8" ?>
+<jappix xmlns="jappix:file:get">
+ <css>anonymous.css</css>
+ <js>anonymous.js</js>
+</jappix>
--- /dev/null
+<?xml version="1.0" encoding="utf-8" ?>
+<jappix xmlns="jappix:file:get">
+ <css>main.css~images.css~board.css~jquery.datepicker.css~home.css~others.css~tools.css~buddylist.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~archives.css~welcome.css~me.css~rosterx.css</css>
+ <js>jquery.js~jquery.form.js~jquery.timers.js~jquery.placeholder.js~jquery.textrange.js~jquery.datepicker.js~base64.js~jsjac.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~error.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~httpauth.js~options.js~integratebox.js~pep.js~presence.js~roster.js~storage.js~common.js~utilities.js~date.js~caps.js~vcard.js~userinfos.js~search.js~autocompletion.js~archives.js~welcome.js~me.js~rosterx.js</js>
+</jappix>
--- /dev/null
+<?xml version="1.0" encoding="utf-8" ?>
+<jappix xmlns="jappix:file:get">
+ <css>main.css~install.css~images.css</css>
+ <js></js>
+</jappix>
--- /dev/null
+<?xml version="1.0" encoding="utf-8" ?>
+<jappix xmlns="jappix:file:get">
+ <css>main.css~manager.css~images.css</css>
+ <js></js>
+</jappix>
--- /dev/null
+<?xml version="1.0" encoding="utf-8" ?>
+<jappix xmlns="jappix:file:get">
+ <css>mini.css</css>
+ <js>jxhr.js~base64.js~jsjac.js~jquery.timers.js~constants.js~datastore.js~browser-detect.js~common.js~date.js~links.js~mini.js</js>
+</jappix>
--- /dev/null
+<?xml version="1.0" encoding="utf-8" ?>
+<jappix xmlns="jappix:file:get">
+ <css>mobile.css~images.css</css>
+ <js>base64.js~jsjac.js~constants.js~browser-detect.js~links.js~mobile.js</js>
+</jappix>