Merge lp:~flo-fuchs/postorius/testing into lp:postorius

Proposed by Florian Fuchs
Status: Merged
Merged at revision: 198
Proposed branch: lp:~flo-fuchs/postorius/testing
Merge into: lp:postorius
Diff against target: 24038 lines (+17385/-5858)
82 files modified
.bzrignore (+8/-3)
dev-requirements.txt (+4/-0)
setup.py (+20/-16)
src/postorius/__init__.py (+1/-1)
src/postorius/auth/decorators.py (+1/-1)
src/postorius/context_processors.py (+1/-1)
src/postorius/doc/_build/html/.buildinfo (+0/-4)
src/postorius/doc/_build/html/_sources/acknowledgements.txt (+0/-37)
src/postorius/doc/_build/html/_sources/development.txt (+0/-224)
src/postorius/doc/_build/html/_sources/index.txt (+0/-12)
src/postorius/doc/_build/html/_sources/license.txt (+0/-34)
src/postorius/doc/_build/html/_sources/news.txt (+0/-68)
src/postorius/doc/_build/html/_sources/setup.txt (+0/-177)
src/postorius/doc/_build/html/_sources/testing.txt (+0/-6)
src/postorius/doc/_build/html/_sources/using.txt (+0/-32)
src/postorius/doc/_build/html/_static/basic.css (+0/-540)
src/postorius/doc/_build/html/_static/default.css (+0/-256)
src/postorius/doc/_build/html/_static/doctools.js (+0/-247)
src/postorius/doc/_build/html/_static/jquery.js (+0/-154)
src/postorius/doc/_build/html/_static/pygments.css (+0/-62)
src/postorius/doc/_build/html/_static/searchtools.js (+0/-560)
src/postorius/doc/_build/html/_static/sidebar.js (+0/-151)
src/postorius/doc/_build/html/_static/underscore.js (+0/-23)
src/postorius/doc/_build/html/_static/websupport.js (+0/-808)
src/postorius/doc/_build/html/acknowledgements.html (+0/-158)
src/postorius/doc/_build/html/development.html (+0/-362)
src/postorius/doc/_build/html/genindex.html (+0/-123)
src/postorius/doc/_build/html/index.html (+0/-116)
src/postorius/doc/_build/html/license.html (+0/-139)
src/postorius/doc/_build/html/news.html (+0/-186)
src/postorius/doc/_build/html/objects.inv (+0/-10)
src/postorius/doc/_build/html/py-modindex.html (+0/-131)
src/postorius/doc/_build/html/search.html (+0/-105)
src/postorius/doc/_build/html/searchindex.js (+0/-1)
src/postorius/doc/_build/html/setup.html (+0/-252)
src/postorius/doc/_build/html/testing.html (+0/-155)
src/postorius/doc/_build/html/using.html (+0/-402)
src/postorius/doc/development.rst (+81/-152)
src/postorius/doc/index.rst (+8/-2)
src/postorius/doc/news.rst (+2/-2)
src/postorius/doc/settings.py (+1/-1)
src/postorius/doc/using.rst (+0/-32)
src/postorius/fieldset_forms.py (+1/-1)
src/postorius/forms.py (+1/-1)
src/postorius/management/commands/mmclient.py (+1/-1)
src/postorius/models.py (+1/-1)
src/postorius/templatetags/nav_helpers.py (+1/-1)
src/postorius/tests/__init__.py (+20/-8)
src/postorius/tests/fixtures/vcr_cassettes/list_members_access.yaml (+4283/-0)
src/postorius/tests/fixtures/vcr_cassettes/list_members_page.yaml (+1835/-0)
src/postorius/tests/fixtures/vcr_cassettes/test_list_creation.yaml (+1834/-0)
src/postorius/tests/fixtures/vcr_cassettes/test_list_index.yaml (+1375/-0)
src/postorius/tests/fixtures/vcr_cassettes/test_list_members_add_moderator.yaml (+1268/-0)
src/postorius/tests/fixtures/vcr_cassettes/test_list_members_add_owner.yaml (+1268/-0)
src/postorius/tests/fixtures/vcr_cassettes/test_list_members_add_owner_new_owner_added.yaml (+110/-0)
src/postorius/tests/fixtures/vcr_cassettes/test_list_members_new_moderator_added.yaml (+110/-0)
src/postorius/tests/fixtures/vcr_cassettes/test_list_metrics.yaml (+2482/-0)
src/postorius/tests/fixtures/vcr_cassettes/test_list_summary.yaml (+2142/-0)
src/postorius/tests/mailman_api_tests/__init__.py (+1/-32)
src/postorius/tests/mailman_api_tests/test_list_index.py (+28/-8)
src/postorius/tests/mailman_api_tests/test_list_members.py (+106/-28)
src/postorius/tests/mailman_api_tests/test_list_metrics.py (+61/-0)
src/postorius/tests/mailman_api_tests/test_list_new.py (+32/-10)
src/postorius/tests/mailman_api_tests/test_list_summary.py (+28/-7)
src/postorius/tests/test_auth_decorators.py (+1/-1)
src/postorius/tests/test_forms.py (+1/-1)
src/postorius/tests/test_utils.py (+1/-1)
src/postorius/tests/tests.py (+1/-1)
src/postorius/tests/utils.py (+1/-1)
src/postorius/urls.py (+1/-1)
src/postorius/utils.py (+1/-1)
src/postorius/views/__init__.py (+1/-1)
src/postorius/views/api.py (+1/-1)
src/postorius/views/generic.py (+1/-1)
src/postorius/views/list.py (+1/-1)
src/postorius/views/settings.py (+1/-1)
src/postorius/views/user.py (+1/-1)
src/postorius/views/views.py (+1/-1)
testing/__init__.py (+30/-0)
testing/test_mailman.cfg (+25/-0)
testing/test_settings.py (+162/-0)
tox.ini (+39/-0)
To merge this branch: bzr merge lp:~flo-fuchs/postorius/testing
Reviewer Review Type Date Requested Status
Mailman Coders Pending
Review via email: mp+249215@code.launchpad.net

This proposal supersedes a proposal from 2015-02-09.

Description of the change

This branch reworks certain parts of Postorius internal tests:

- vcrpy has been added to test those parts of Postorius that rely on a realistic
  HTTP response from Mailman's administrative API.

- A tox config to test different Python and Django versions
  (currently py27 and Django 1.5 - 1.7)

- The package contains a Django settings file for test purposes only, so it can
  be tested independently from the postorius_standalone branch.

- Better developer documentation re how to write new tests.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file '.bzrignore'
--- .bzrignore 2012-03-23 14:40:25 +0000
+++ .bzrignore 2015-02-10 16:33:20 +0000
@@ -1,3 +1,8 @@
1dev_setup/mmtest.db1.tox
2dev_setup/settings_local.py2.coverage
3src/postorius.egg-info3__pycache__
4*.egg-info
5build
6dist
7cover/
8src/postorius/doc/_build/*
49
=== added file 'dev-requirements.txt'
--- dev-requirements.txt 1970-01-01 00:00:00 +0000
+++ dev-requirements.txt 2015-02-10 16:33:20 +0000
@@ -0,0 +1,4 @@
1mock
2django-nose
3coverage==3.7.1
4vcrpy
05
=== modified file 'setup.py'
--- setup.py 2015-01-19 15:03:09 +0000
+++ setup.py 2015-02-10 16:33:20 +0000
@@ -15,27 +15,31 @@
15# You should have received a copy of the GNU Lesser General Public License15# You should have received a copy of the GNU Lesser General Public License
16# along with Postorius. If not, see <http://www.gnu.org/licenses/>.16# along with Postorius. If not, see <http://www.gnu.org/licenses/>.
1717
18import ez_setup18try:
19ez_setup.use_setuptools()19 import setuptools
20except ImportError:
21 import ez_setup
22 ez_setup.use_setuptools()
2023
21from setuptools import setup, find_packages24from setuptools import setup, find_packages
2225
26
23setup(27setup(
24 name = "postorius",28 name="postorius",
25 version = '1.0.0b1',29 version='1.0.0b1',
26 description = "A web user interface for GNU Mailman",30 description="A web user interface for GNU Mailman",
27 long_description=open('README.rst').read(),31 long_description=open('README.rst').read(),
28 maintainer = "The Mailman GSOC Coders",32 maintainer="The Mailman GSOC Coders",
29 license = 'GPLv3',33 license='GPLv3',
30 keywords = 'email mailman django',34 keywords='email mailman django',
31 url = "https://launchpad.net/postorius",35 url="https://launchpad.net/postorius",
32 classifiers = [36 classifiers=[
33 "Programming Language :: Python",37 "Programming Language :: Python",
34 ],38 ],
35 packages = find_packages('src'),39 packages=find_packages('src'),
36 package_dir = {'': 'src'},40 package_dir={'': 'src'},
37 include_package_data = True,41 include_package_data=True,
38 install_requires = ['django>=1.4',42 install_requires=['django>=1.5',
39 'django-social-auth>=0.7.8',43 'django-social-auth>=0.7.8',
40 'mailmanclient']44 'mailmanclient']
41)45)
4246
=== modified file 'src/postorius/__init__.py'
--- src/postorius/__init__.py 2014-04-22 14:34:21 +0000
+++ src/postorius/__init__.py 2015-02-10 16:33:20 +0000
@@ -1,5 +1,5 @@
1# -*- coding: utf-8 -*-1# -*- coding: utf-8 -*-
2# Copyright (C) 1998-2014 by the Free Software Foundation, Inc.2# Copyright (C) 1998-2015 by the Free Software Foundation, Inc.
3#3#
4# This file is part of Postorius.4# This file is part of Postorius.
5#5#
66
=== modified file 'src/postorius/auth/decorators.py'
--- src/postorius/auth/decorators.py 2015-01-18 19:21:23 +0000
+++ src/postorius/auth/decorators.py 2015-02-10 16:33:20 +0000
@@ -1,5 +1,5 @@
1# -*- coding: utf-8 -*-1# -*- coding: utf-8 -*-
2# Copyright (C) 1998-2014 by the Free Software Foundation, Inc.2# Copyright (C) 1998-2015 by the Free Software Foundation, Inc.
3#3#
4# This file is part of Postorius.4# This file is part of Postorius.
5#5#
66
=== modified file 'src/postorius/context_processors.py'
--- src/postorius/context_processors.py 2014-03-15 21:36:39 +0000
+++ src/postorius/context_processors.py 2015-02-10 16:33:20 +0000
@@ -1,5 +1,5 @@
1# -*- coding: utf-8 -*-1# -*- coding: utf-8 -*-
2# Copyright (C) 2012-2014 by the Free Software Foundation, Inc.2# Copyright (C) 2012-2015 by the Free Software Foundation, Inc.
3#3#
4# This file is part of Postorius.4# This file is part of Postorius.
5#5#
66
=== removed directory 'src/postorius/doc/_build/doctrees'
=== removed file 'src/postorius/doc/_build/doctrees/development.doctree'
7Binary files src/postorius/doc/_build/doctrees/development.doctree 2012-11-04 19:54:09 +0000 and src/postorius/doc/_build/doctrees/development.doctree 1970-01-01 00:00:00 +0000 differ7Binary files src/postorius/doc/_build/doctrees/development.doctree 2012-11-04 19:54:09 +0000 and src/postorius/doc/_build/doctrees/development.doctree 1970-01-01 00:00:00 +0000 differ
=== removed file 'src/postorius/doc/_build/doctrees/environment.pickle'
8Binary files src/postorius/doc/_build/doctrees/environment.pickle 2012-11-04 19:54:09 +0000 and src/postorius/doc/_build/doctrees/environment.pickle 1970-01-01 00:00:00 +0000 differ8Binary files src/postorius/doc/_build/doctrees/environment.pickle 2012-11-04 19:54:09 +0000 and src/postorius/doc/_build/doctrees/environment.pickle 1970-01-01 00:00:00 +0000 differ
=== removed file 'src/postorius/doc/_build/doctrees/index.doctree'
9Binary files src/postorius/doc/_build/doctrees/index.doctree 2012-08-21 19:58:00 +0000 and src/postorius/doc/_build/doctrees/index.doctree 1970-01-01 00:00:00 +0000 differ9Binary files src/postorius/doc/_build/doctrees/index.doctree 2012-08-21 19:58:00 +0000 and src/postorius/doc/_build/doctrees/index.doctree 1970-01-01 00:00:00 +0000 differ
=== removed file 'src/postorius/doc/_build/doctrees/license.doctree'
10Binary files src/postorius/doc/_build/doctrees/license.doctree 2012-03-23 22:54:46 +0000 and src/postorius/doc/_build/doctrees/license.doctree 1970-01-01 00:00:00 +0000 differ10Binary files src/postorius/doc/_build/doctrees/license.doctree 2012-03-23 22:54:46 +0000 and src/postorius/doc/_build/doctrees/license.doctree 1970-01-01 00:00:00 +0000 differ
=== removed file 'src/postorius/doc/_build/doctrees/news.doctree'
11Binary files src/postorius/doc/_build/doctrees/news.doctree 2012-11-04 19:54:09 +0000 and src/postorius/doc/_build/doctrees/news.doctree 1970-01-01 00:00:00 +0000 differ11Binary files src/postorius/doc/_build/doctrees/news.doctree 2012-11-04 19:54:09 +0000 and src/postorius/doc/_build/doctrees/news.doctree 1970-01-01 00:00:00 +0000 differ
=== removed file 'src/postorius/doc/_build/doctrees/setup.doctree'
12Binary files src/postorius/doc/_build/doctrees/setup.doctree 2012-08-21 19:58:00 +0000 and src/postorius/doc/_build/doctrees/setup.doctree 1970-01-01 00:00:00 +0000 differ12Binary files src/postorius/doc/_build/doctrees/setup.doctree 2012-08-21 19:58:00 +0000 and src/postorius/doc/_build/doctrees/setup.doctree 1970-01-01 00:00:00 +0000 differ
=== removed file 'src/postorius/doc/_build/doctrees/testing.doctree'
13Binary files src/postorius/doc/_build/doctrees/testing.doctree 2012-07-20 00:00:43 +0000 and src/postorius/doc/_build/doctrees/testing.doctree 1970-01-01 00:00:00 +0000 differ13Binary files src/postorius/doc/_build/doctrees/testing.doctree 2012-07-20 00:00:43 +0000 and src/postorius/doc/_build/doctrees/testing.doctree 1970-01-01 00:00:00 +0000 differ
=== removed file 'src/postorius/doc/_build/doctrees/using.doctree'
14Binary files src/postorius/doc/_build/doctrees/using.doctree 2012-07-20 00:00:43 +0000 and src/postorius/doc/_build/doctrees/using.doctree 1970-01-01 00:00:00 +0000 differ14Binary files src/postorius/doc/_build/doctrees/using.doctree 2012-07-20 00:00:43 +0000 and src/postorius/doc/_build/doctrees/using.doctree 1970-01-01 00:00:00 +0000 differ
=== removed directory 'src/postorius/doc/_build/html'
=== removed file 'src/postorius/doc/_build/html/.buildinfo'
--- src/postorius/doc/_build/html/.buildinfo 2012-05-29 06:28:56 +0000
+++ src/postorius/doc/_build/html/.buildinfo 1970-01-01 00:00:00 +0000
@@ -1,4 +0,0 @@
1# Sphinx build info version 1
2# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
3config: b7c499bf02394c05c2168ae495bae526
4tags: fbb0d17656682115ca4d033fb2f83ba1
50
=== removed directory 'src/postorius/doc/_build/html/_sources'
=== removed file 'src/postorius/doc/_build/html/_sources/acknowledgements.txt'
--- src/postorius/doc/_build/html/_sources/acknowledgements.txt 2011-08-22 11:15:03 +0000
+++ src/postorius/doc/_build/html/_sources/acknowledgements.txt 1970-01-01 00:00:00 +0000
@@ -1,37 +0,0 @@
1Acknowledgements
2================
3
4Test Server
5-----------
6
7We're proud to provide you a development server which is sponsered by XXX #Todo
8Feel free to change anything you like, we can simply rest the DB from Time to Time.
9
10Missing Functionality
11---------------------
12
13* Delete Domain
14 * missing in REST
15 * implemented in mailman3 a8
16
17* Show a List of all subscribed users
18
19ACL
20---
21
22* Middleware
23
24 We don't have the Middleware which is required to work with users and it's permissions yet. For this reason we had to tweak some functions to be a hardcoded Demo object.
25
26 * Login Check
27 At the moment we're using a hardcoded List of allowed usernames and Passwords which are all stored in Plain within the AuthBackends Source File.
28 * has_perm Decorator
29 As we don't have a middleware to check for users and it's permissions we do only use one permission at the moment. The permission site domain_admin is hardcoded to user.username == "james@example.com"
30
31
32
33Ideas
34-----
35
36* ContactPage
37*
380
=== removed file 'src/postorius/doc/_build/html/_sources/development.txt'
--- src/postorius/doc/_build/html/_sources/development.txt 2012-11-04 19:54:09 +0000
+++ src/postorius/doc/_build/html/_sources/development.txt 1970-01-01 00:00:00 +0000
@@ -1,224 +0,0 @@
1===========
2Development
3===========
4
5This is a short guide to help you get started with Postorius development.
6
7
8Directory layout
9================
10
11Postorius is a Django application, so if you have developed with Django before,
12the file structure probably looks familiar. These are the basics:
13
14::
15
16 __init__.py
17 auth/ # Custom authorization code (List owners and
18 # moderators)
19 context_processors.py # Some variables available in all templates
20 doc/ # Sphinx documentation
21 fieldset_forms.py # A custom form class to build html forms with
22 # fieldsets
23 forms.py # All kinds of classes to build and validate forms
24 management/ # Commands to use with Django's manage.py script
25 models.py # Code to connect to mailman.client and provide
26 # a Django-style model API for lists, mm-users and
27 # domains
28 static/ # Static files (CSS, JS, images)
29 templates/ # HTML Templates
30 tests/ # Postorius test files
31 urls.py # URL routes
32 utils.py # Some handy utilities
33 views/
34 views.py # View classes and functions for all views connected
35 # in urls.py
36 generic.py # Generic class-based views; Currently holds a
37 # class for views based on a single mailing list
38
39
40Development Workflow
41====================
42
43The source code is hosted on Launchpad_, which also means that we are using
44Bazaar for version control.
45
46.. _Launchpad: https://launchpad.net
47
48Changes are usually not made directly in the project's trunk branch, but in
49feature-related personal branches, which get reviewed and then merged into
50the trunk.
51
52The ideal workflow would be like this:
53
541. File a bug to suggest a new feature or report a bug (or just pick one of
55 the existing bugs).
562. Create a new branch with your code changes.
573. Make a "merge proposal" to get your code reviewed and merged.
58
59Launchpad has a nice tour_ which describes all this in detail.
60
61.. _tour: https://launchpad.net/+tour/index
62
63
64
65Writing View Code
66=================
67
68When the work on Postorius was started, the standard way to write view code in
69Django was to write a single function for each different view. Since then
70Django has introduced so-called 'class-based views' which make it much easier
71to reuse view functionality. While using simple functions is not discuraged, it
72makes sense to check if using a class-based approach could make sense.
73
74Check Postorius' ``views/views.py`` and ``views/generic.py`` for examples!
75
76
77Authentication/Authorization
78============================
79
80Three of Django's default User roles are relvant for Postorius:
81
82- Superuser: Can do everything.
83- AnonymousUser: Can view list index and info pages.
84- Authenticated users: Can view list index and info pages. Can (un)subscribe
85 from lists.
86
87Apart from these default roles, there are two others relevant in Postorius:
88
89- List owners: Can change list settings, moderate messages and delete their
90 lists.
91- List moderators: Can moderate messages.
92
93There are a number of decorators to protect views from unauthorized users.
94
95- ``@user_passes_test(lambda u: u.is_superuser)`` (redirects to login form)
96- ``@login_required`` (redirects to login form)
97- ``@list_owner_required`` (returns 403)
98- ``@list_moderator_required`` (returns 403)
99- ``@superuser_or_403`` (returns 403)
100- ``@loggedin_or_403`` (returns 403)
101- ``@basic_auth_login``
102
103Check out ``views/views.py`` or ``views/api.py`` for examples!
104
105The last one (basic_auth_login) checks the request header for HTTP Basic Auth
106credentials and uses those to authenticate against Django's session-based
107mechanism. It can be used in cases where a view is accessed from other clients
108than the web browser.
109
110Please make sure to put it outside the other auth decorators.
111
112Good:
113
114::
115
116 @basic_auth_login
117 @list_owner_required
118 def my_view_func(request):
119 ...
120
121Won't work, because list_owner_required will not recognize the user:
122
123::
124
125 @list_owner_required
126 @basic_auth_login
127 def my_view_func(request):
128 ...
129
130
131Accessing the Mailman API
132=========================
133
134Postorius uses mailman.client to connect to Mailman's REST API. In order to
135directly use the client, ``cd`` to your project folder and execute
136``python manage.py mmclient``. This will open a python shell (IPython, if
137that's available) and provide you with a client object connected to to your
138local Mailman API server (it uses the credentials from your settings.py).
139
140A quick example:
141
142::
143
144 $ python manage.py mmclient
145
146 >>> client
147 <Client (user:pwd) http://localhost:8001/3.0/>
148
149 >>> print client.system['mailman_version']
150 GNU Mailman 3.0.0b2+ (Here Again)
151
152 >>> mailman_dev = client.get_list('mailman-developers@python.org')
153 >>> print mailman_dev settings
154 {u'owner_address': u'mailman-developers@python.org',
155 u'default_nonmember_action': u'hold', ...}
156
157For detailed information how to use mailman.client, check out its documentation_.
158
159.. _documentation: http://bazaar.launchpad.net/~mailman-coders/mailman.client/trunk/view/head:/src/mailmanclient/docs/using.txt
160
161
162Testing
163=======
164
165Currently only some of the Postorius code is covered by a test. We should change that!
166
167All test modules reside in the ``postorius/src/postorius/tests`` directory
168and this is where you should put your own tests, too. To make the django test
169runner find your tests, make sure to add them to the folder's ``__init__.py``:
170
171::
172
173 from postorius.tests import test_utils
174 from postorius.tests.test_list_members import ListMembersViewTest
175 from postorius.tests.test_list_settings import ListSettingsViewTest
176 from postorius.tests.my_own_tests import MyOwnUnitTest
177
178 __test__ = {
179 "Test Utils": test_utils,
180 "List Members": ListMembersViewTest,
181 "List Settings": ListSettingsViewTest,
182 "My Own Test": MyOwnUnitTest,
183 }
184
185
186Running the tests
187-----------------
188
189To run the tests go to your project folder and run ``python manage.py test
190postorius`` from there.
191
192
193Testing mailman.client results
194------------------------------
195
196Most of Postorius' code involves some results from calls to the mailman.client
197library. mailman.client is itself covered by tests, so Postorius' own tests
198don't need to check if mailman.client returns correct results. Instead we can
199just mock them! This has the big advantage that you can run the test suite
200without having to worry about the state of the local Mailman database. It also
201makes the tests run faster, because we spare ourselves the HTTP calls to the
202local Mailman REST API.
203
204This approach has the obvious downside that the Postorius tests will not
205recognize any changes to the Mailman API. So at some point there should be some
206separate integration tests to test the whole chain. But let's not worry about
207that for now.
208
209
210Mocking mailman.client objects
211------------------------------
212
213Postorius uses Michael Foord's ``mock`` library for mocking. There are some
214shortcuts you can use to quickly create mock objects that behave a little bit
215like objects retreived from mailman.client, like:
216
217- create_mock_domain
218- create_mock_list
219- create_mock_member
220
221These ``create_mock_*`` functions are very simple tools that return MagigMock objects with the properties passed to them in a dictionary. They also set some defaults for properties that you didn't pass to its ``create_mock_*`` function. For instance, a mock list created with ``create_mock_list()`` will always have ``members``, ``moderators`` and ``owners`` properties.
222
223
224.. automodule:: postorius.tests.test_utils
2250
=== removed file 'src/postorius/doc/_build/html/_sources/index.txt'
--- src/postorius/doc/_build/html/_sources/index.txt 2012-07-20 00:00:43 +0000
+++ src/postorius/doc/_build/html/_sources/index.txt 1970-01-01 00:00:00 +0000
@@ -1,12 +0,0 @@
1Postorius - The New Mailman Web UI
2==================================
3
4Contents:
5
6.. toctree::
7 :maxdepth: 1
8
9 news.rst
10 setup.rst
11 development.rst
12
130
=== removed file 'src/postorius/doc/_build/html/_sources/license.txt'
--- src/postorius/doc/_build/html/_sources/license.txt 2011-08-18 13:47:20 +0000
+++ src/postorius/doc/_build/html/_sources/license.txt 1970-01-01 00:00:00 +0000
@@ -1,34 +0,0 @@
1Contributions:
2==============
3Mailman is licensed unter *GPL*
4-----------------------------
5Copyright (C) 1998-2010 by the Free Software Foundation, Inc.
6
7This file is part of GNU Mailman.
8
9GNU Mailman is free software: you can redistribute it and/or modify it under
10the terms of the GNU General Public License as published by the Free
11Software Foundation, either version 3 of the License, or (at your option)
12any later version.
13
14GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
15ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
17more details.
18
19You should have received a copy of the GNU General Public License along with
20GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
21
22RRZE Icon Set
23-------------
24
25**CreativeCommons Licence**
26
27The RRZE Icon Set is licenced under a Creative Commons Licence.
28Please see the website for the current licence text.
29
30More information about the Project could be found here:
31http://rrze-icon-set.berlios.de/licence.html
32
33Special thanks to:
34* Franziska Sponsel (created additional Icons specially for our Project)
350
=== removed file 'src/postorius/doc/_build/html/_sources/news.txt'
--- src/postorius/doc/_build/html/_sources/news.txt 2012-11-04 19:54:09 +0000
+++ src/postorius/doc/_build/html/_sources/news.txt 1970-01-01 00:00:00 +0000
@@ -1,68 +0,0 @@
1================
2News / Changelog
3================
4
5Copyright (C) 2012 by the Free Software Foundation, Inc.
6
7The Postorius Django app provides a web user interface to
8access GNU Mailman.
9
10Postorius is free software: you can redistribute it and/or
11modify it under the terms of the GNU Lesser General Public License as
12published by the Free Software Foundation, version 3 of the License.
13
14Postorius is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
17General Public License for more details.
18
19You should have received a copy of the GNU Lesser General Public License
20along with Postorius. If not, see <http://www.gnu.org/licenses/>.
21
22
231.0 alpha 2
24===========
25(2012-XX-XX)
26
27* dev setup fix for Django 1.4 contributed by Rohan Jain
28* missing csrf tokens in templates contributed by Richard Wackerbarth (LP: 996658)
29* moderation: fixed typo in success message call
30* installation documentation for Apache/mod_wsgi
31* moved project files to separate branch
32* show error message if connection to Mailman API fails
33* added list members view
34* added developer documentation
35* added test helper utils
36* all code now conform to PEP8
37* themes: removed obsolete MAILMAN_THEME settings from templates, contexts, file structure; contributed by Richard Wackerbarth (LP: 1043258)
38* added access control for list owners and moderators
39* added a mailmanclient shell to use as a `manage.py` command (`python manage.py mmclient`)
40* use "url from future" template tag in all templates. Contributed by Richard Wackerbarth.
41* added "new user" form. Contributed by George Chatzisofroniou.
42* added user subscription page
43* added decorator to allow login via http basic auth (to allow non-browser clients to use API views)
44* added api view for list index
45* several changes regarding style and navigation structure
46
47
481.0 alpha 1 -- "Space Farm"
49===========================
50(2012-03-23)
51
52Many thanks go out to Anna Senarclens de Grancy and Benedict Stein for
53developing the initial versions of this Django app during the Google Summer of
54Code 2010 and 2011.
55
56* add/remove/edit mailing lists
57* edit list settings
58* show all mailing lists on server
59* subscribe/unsubscribe/mass subscribe mailing lists
60* add/remove domains
61* show basic list info and metrics
62* login using django user account or using BrowserID
63* show basic user profile
64* accept/discard/reject/defer messages
65* Implementation of Django Messages contributed by Benedict Stein (LP: #920084)
66* Dependency check in setup.py contributed by Daniel Mizyrycki
67* Proper processing of acceptable aliases in list settings form contributed by
68 Daniel Mizyrycki
690
=== removed file 'src/postorius/doc/_build/html/_sources/setup.txt'
--- src/postorius/doc/_build/html/_sources/setup.txt 2012-07-20 00:00:43 +0000
+++ src/postorius/doc/_build/html/_sources/setup.txt 1970-01-01 00:00:00 +0000
@@ -1,177 +0,0 @@
1============
2Installation
3============
4
5.. note::
6 This installation guide covers Postorius, the web user interface for
7 GNU Mailman 3. To install GNU Mailman follow the instructions in the documentation:
8 http://packages.python.org/mailman/
9
10
11Install Dependencies
12====================
13
14Django:
15
16::
17
18 $ sudo pip install django
19
20mailman.client:
21
22::
23
24 $ bzr branch lp:mailman.client
25 $ cd mailman.client
26 $ sudo python setup.py install
27
28
29Install Postorius
30=================
31
32
33Latest release
34--------------
35
36If you just want to install the latest release of Postorius, install it from
37PyPi:
38
39::
40
41 $ sudo pip install postorius
42
43or:
44
45::
46
47 $ sudo easy_install postorius
48
49
50Latest dev version
51------------------
52
53If you want to always be up to date with the latest development version, you
54should install Postorius using bazaar:
55
56::
57
58 $ bzr branch lp:postorius
59 $ cd postorius
60 $ sudo python setup.py develop
61 $ cd ..
62
63You can always pull in the latest changes from the development branch:
64
65::
66
67 $ cd postorius
68 $ bzr pull
69 $ cd ..
70
71Make sure to keep mailman.client up to date as well:
72
73::
74
75 $ cd mailman.client
76 $ bzr pull lp:mailman.client
77 $ cd ..
78
79
80Setup your django project
81=========================
82
83Since you have now installed the necessary packages to run Postorius, it's
84time to setup your Django site.
85
86First, get the project directory from launchpad:
87
88::
89
90 $ bzr branch lp:~mailman-coders/postorius/postorius_standalone
91
92Second, change the database setting in ``postorius_standalone/settings.py`` to
93your preferred database. If you're OK with using sqlite, just change the path
94in line 48 to the correct location.
95
96.. note::
97 Detailed information on how to use different database engines can be found
98 in the `Django documentation`_.
99
100.. _Django documentation: https://docs.djangoproject.com/en/1.4/ref/settings/#databases
101
102Third, prepare the database:
103
104::
105
106 $ cd postorius_standalone
107 $ python manage.py syncdb
108 $ cd ..
109
110This will create the ``.db file`` (if you ar using SQLite) and will setup all the
111necessary db tables. You will also be prompted to create a superuser which
112will act as an admin account for Postorius.
113
114
115.. seealso::
116 Robert Niederreiter has provided a `buildout for GNU Mailman 3 and
117 Postorius`_.
118
119.. _buildout for GNU Mailman 3 and Postorius:
120 https://github.com/bluedynamics/mailman.buildout
121
122
123Running the development server
124==============================
125
126The quickest way to run Postorius is to just start the development server:
127
128::
129
130 $ cd postorius_standalone
131 $ python manage.py runserver
132
133
134.. warning::
135 You should use the development server only locally. While it's possible to
136 make your site publicly available using the dev server, you should never
137 do that in a production environment.
138
139
140Running Postorius on Apache with mod_wsgi
141=========================================
142
143.. note::
144 This guide assumes that you know how to setup a VirtualHost with Apache.
145 If you are using SQLite, the ``.db`` file as well as its folder need to be
146 writable by the web server.
147
148These settings need to be added to your Apache VirtualHost:
149
150::
151
152 Alias /static /path/to/postorius_standalone/static
153 <Directory "/path/to/postorius_standalone/static">
154 Order deny,allow
155 Allow from all
156 </Directory>
157
158 WSGIScriptAlias / /path/to/postorius_standalone/srv/postorius.wsgi
159 <Directory "/path/to/postorius_standalone/srv">
160 Order deny,allow
161 Allow from all
162 </Directory>
163
164The first Alias serves the static files (CSS, JS, Images, etc.). The
165WSGIScriptAlias serves the Django application. The paths need to be changed
166depending on which location you downloaded ``postorius_standalone`` to.
167
168We're almost ready. But you need to collect the static files from Postorius
169(which resides somewhere on your pythonpath) to be able to serve them from the
170site directory. All you have to do is to change into the
171``postorius_standalone`` directory and run:
172
173::
174
175 $ python manage.py collectstatic
176
177After reloading the webserver Postorius should be running!
1780
=== removed file 'src/postorius/doc/_build/html/_sources/testing.txt'
--- src/postorius/doc/_build/html/_sources/testing.txt 2012-07-20 00:00:43 +0000
+++ src/postorius/doc/_build/html/_sources/testing.txt 1970-01-01 00:00:00 +0000
@@ -1,6 +0,0 @@
1=============
2Writing tests
3=============
4
5
6.. automodule:: postorius.tests.test_utils
70
=== removed file 'src/postorius/doc/_build/html/_sources/using.txt'
--- src/postorius/doc/_build/html/_sources/using.txt 2012-07-16 21:56:47 +0000
+++ src/postorius/doc/_build/html/_sources/using.txt 1970-01-01 00:00:00 +0000
@@ -1,32 +0,0 @@
1Using the Django App - Developers Resource (outdated)
2=====================================================
3
4.. warning::
5 This user guide is outdated and needs to be updated.
6
7.. automodule:: tests.tests
8
9Running the tests explained above.
10----------------------------------
11We've added our own test-suite to the Django App which will be executed together with the Django Test. Last thing you should do is running these tests. If they fail you did something wrong, if they succeed you can enjoy the site.
12
13Run the following in the Site Directory
14
15 .. code-block:: bash
16
17 $ python manage.py test
18
19.. note::
20 Please be aware that we want to run a development instance of mailman you need to stop the stable one first and the tests will open it's own mailman temporily.
21
22Accessing the REST Client for Testing
23-------------------------------------
24
25If you want to access the Functions, which we use in the views, directly feel free to run the following block of code within a Shell which does have it's current Directory within the Django Site Directory.
26
27 .. code-block:: python
28
29 from settings import API_USER, API_PASS
30 from mailman.client import Client
31 c = Client('http://localhost:8001/3.0', API_USER, API_PASS)
32 #DEBUG: Python Session
330
=== removed directory 'src/postorius/doc/_build/html/_static'
=== removed file 'src/postorius/doc/_build/html/_static/ajax-loader.gif'
34Binary files src/postorius/doc/_build/html/_static/ajax-loader.gif 2012-05-29 06:28:56 +0000 and src/postorius/doc/_build/html/_static/ajax-loader.gif 1970-01-01 00:00:00 +0000 differ1Binary files src/postorius/doc/_build/html/_static/ajax-loader.gif 2012-05-29 06:28:56 +0000 and src/postorius/doc/_build/html/_static/ajax-loader.gif 1970-01-01 00:00:00 +0000 differ
=== removed file 'src/postorius/doc/_build/html/_static/basic.css'
--- src/postorius/doc/_build/html/_static/basic.css 2012-08-21 19:58:00 +0000
+++ src/postorius/doc/_build/html/_static/basic.css 1970-01-01 00:00:00 +0000
@@ -1,540 +0,0 @@
1/*
2 * basic.css
3 * ~~~~~~~~~
4 *
5 * Sphinx stylesheet -- basic theme.
6 *
7 * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
8 * :license: BSD, see LICENSE for details.
9 *
10 */
11
12/* -- main layout ----------------------------------------------------------- */
13
14div.clearer {
15 clear: both;
16}
17
18/* -- relbar ---------------------------------------------------------------- */
19
20div.related {
21 width: 100%;
22 font-size: 90%;
23}
24
25div.related h3 {
26 display: none;
27}
28
29div.related ul {
30 margin: 0;
31 padding: 0 0 0 10px;
32 list-style: none;
33}
34
35div.related li {
36 display: inline;
37}
38
39div.related li.right {
40 float: right;
41 margin-right: 5px;
42}
43
44/* -- sidebar --------------------------------------------------------------- */
45
46div.sphinxsidebarwrapper {
47 padding: 10px 5px 0 10px;
48}
49
50div.sphinxsidebar {
51 float: left;
52 width: 230px;
53 margin-left: -100%;
54 font-size: 90%;
55}
56
57div.sphinxsidebar ul {
58 list-style: none;
59}
60
61div.sphinxsidebar ul ul,
62div.sphinxsidebar ul.want-points {
63 margin-left: 20px;
64 list-style: square;
65}
66
67div.sphinxsidebar ul ul {
68 margin-top: 0;
69 margin-bottom: 0;
70}
71
72div.sphinxsidebar form {
73 margin-top: 10px;
74}
75
76div.sphinxsidebar input {
77 border: 1px solid #98dbcc;
78 font-family: sans-serif;
79 font-size: 1em;
80}
81
82div.sphinxsidebar input[type="text"] {
83 width: 170px;
84}
85
86div.sphinxsidebar input[type="submit"] {
87 width: 30px;
88}
89
90img {
91 border: 0;
92}
93
94/* -- search page ----------------------------------------------------------- */
95
96ul.search {
97 margin: 10px 0 0 20px;
98 padding: 0;
99}
100
101ul.search li {
102 padding: 5px 0 5px 20px;
103 background-image: url(file.png);
104 background-repeat: no-repeat;
105 background-position: 0 7px;
106}
107
108ul.search li a {
109 font-weight: bold;
110}
111
112ul.search li div.context {
113 color: #888;
114 margin: 2px 0 0 30px;
115 text-align: left;
116}
117
118ul.keywordmatches li.goodmatch a {
119 font-weight: bold;
120}
121
122/* -- index page ------------------------------------------------------------ */
123
124table.contentstable {
125 width: 90%;
126}
127
128table.contentstable p.biglink {
129 line-height: 150%;
130}
131
132a.biglink {
133 font-size: 1.3em;
134}
135
136span.linkdescr {
137 font-style: italic;
138 padding-top: 5px;
139 font-size: 90%;
140}
141
142/* -- general index --------------------------------------------------------- */
143
144table.indextable {
145 width: 100%;
146}
147
148table.indextable td {
149 text-align: left;
150 vertical-align: top;
151}
152
153table.indextable dl, table.indextable dd {
154 margin-top: 0;
155 margin-bottom: 0;
156}
157
158table.indextable tr.pcap {
159 height: 10px;
160}
161
162table.indextable tr.cap {
163 margin-top: 10px;
164 background-color: #f2f2f2;
165}
166
167img.toggler {
168 margin-right: 3px;
169 margin-top: 3px;
170 cursor: pointer;
171}
172
173div.modindex-jumpbox {
174 border-top: 1px solid #ddd;
175 border-bottom: 1px solid #ddd;
176 margin: 1em 0 1em 0;
177 padding: 0.4em;
178}
179
180div.genindex-jumpbox {
181 border-top: 1px solid #ddd;
182 border-bottom: 1px solid #ddd;
183 margin: 1em 0 1em 0;
184 padding: 0.4em;
185}
186
187/* -- general body styles --------------------------------------------------- */
188
189a.headerlink {
190 visibility: hidden;
191}
192
193h1:hover > a.headerlink,
194h2:hover > a.headerlink,
195h3:hover > a.headerlink,
196h4:hover > a.headerlink,
197h5:hover > a.headerlink,
198h6:hover > a.headerlink,
199dt:hover > a.headerlink {
200 visibility: visible;
201}
202
203div.body p.caption {
204 text-align: inherit;
205}
206
207div.body td {
208 text-align: left;
209}
210
211.field-list ul {
212 padding-left: 1em;
213}
214
215.first {
216 margin-top: 0 !important;
217}
218
219p.rubric {
220 margin-top: 30px;
221 font-weight: bold;
222}
223
224img.align-left, .figure.align-left, object.align-left {
225 clear: left;
226 float: left;
227 margin-right: 1em;
228}
229
230img.align-right, .figure.align-right, object.align-right {
231 clear: right;
232 float: right;
233 margin-left: 1em;
234}
235
236img.align-center, .figure.align-center, object.align-center {
237 display: block;
238 margin-left: auto;
239 margin-right: auto;
240}
241
242.align-left {
243 text-align: left;
244}
245
246.align-center {
247 text-align: center;
248}
249
250.align-right {
251 text-align: right;
252}
253
254/* -- sidebars -------------------------------------------------------------- */
255
256div.sidebar {
257 margin: 0 0 0.5em 1em;
258 border: 1px solid #ddb;
259 padding: 7px 7px 0 7px;
260 background-color: #ffe;
261 width: 40%;
262 float: right;
263}
264
265p.sidebar-title {
266 font-weight: bold;
267}
268
269/* -- topics ---------------------------------------------------------------- */
270
271div.topic {
272 border: 1px solid #ccc;
273 padding: 7px 7px 0 7px;
274 margin: 10px 0 10px 0;
275}
276
277p.topic-title {
278 font-size: 1.1em;
279 font-weight: bold;
280 margin-top: 10px;
281}
282
283/* -- admonitions ----------------------------------------------------------- */
284
285div.admonition {
286 margin-top: 10px;
287 margin-bottom: 10px;
288 padding: 7px;
289}
290
291div.admonition dt {
292 font-weight: bold;
293}
294
295div.admonition dl {
296 margin-bottom: 0;
297}
298
299p.admonition-title {
300 margin: 0px 10px 5px 0px;
301 font-weight: bold;
302}
303
304div.body p.centered {
305 text-align: center;
306 margin-top: 25px;
307}
308
309/* -- tables ---------------------------------------------------------------- */
310
311table.docutils {
312 border: 0;
313 border-collapse: collapse;
314}
315
316table.docutils td, table.docutils th {
317 padding: 1px 8px 1px 5px;
318 border-top: 0;
319 border-left: 0;
320 border-right: 0;
321 border-bottom: 1px solid #aaa;
322}
323
324table.field-list td, table.field-list th {
325 border: 0 !important;
326}
327
328table.footnote td, table.footnote th {
329 border: 0 !important;
330}
331
332th {
333 text-align: left;
334 padding-right: 5px;
335}
336
337table.citation {
338 border-left: solid 1px gray;
339 margin-left: 1px;
340}
341
342table.citation td {
343 border-bottom: none;
344}
345
346/* -- other body styles ----------------------------------------------------- */
347
348ol.arabic {
349 list-style: decimal;
350}
351
352ol.loweralpha {
353 list-style: lower-alpha;
354}
355
356ol.upperalpha {
357 list-style: upper-alpha;
358}
359
360ol.lowerroman {
361 list-style: lower-roman;
362}
363
364ol.upperroman {
365 list-style: upper-roman;
366}
367
368dl {
369 margin-bottom: 15px;
370}
371
372dd p {
373 margin-top: 0px;
374}
375
376dd ul, dd table {
377 margin-bottom: 10px;
378}
379
380dd {
381 margin-top: 3px;
382 margin-bottom: 10px;
383 margin-left: 30px;
384}
385
386dt:target, .highlighted {
387 background-color: #fbe54e;
388}
389
390dl.glossary dt {
391 font-weight: bold;
392 font-size: 1.1em;
393}
394
395.field-list ul {
396 margin: 0;
397 padding-left: 1em;
398}
399
400.field-list p {
401 margin: 0;
402}
403
404.refcount {
405 color: #060;
406}
407
408.optional {
409 font-size: 1.3em;
410}
411
412.versionmodified {
413 font-style: italic;
414}
415
416.system-message {
417 background-color: #fda;
418 padding: 5px;
419 border: 3px solid red;
420}
421
422.footnote:target {
423 background-color: #ffa;
424}
425
426.line-block {
427 display: block;
428 margin-top: 1em;
429 margin-bottom: 1em;
430}
431
432.line-block .line-block {
433 margin-top: 0;
434 margin-bottom: 0;
435 margin-left: 1.5em;
436}
437
438.guilabel, .menuselection {
439 font-family: sans-serif;
440}
441
442.accelerator {
443 text-decoration: underline;
444}
445
446.classifier {
447 font-style: oblique;
448}
449
450abbr, acronym {
451 border-bottom: dotted 1px;
452 cursor: help;
453}
454
455/* -- code displays --------------------------------------------------------- */
456
457pre {
458 overflow: auto;
459 overflow-y: hidden; /* fixes display issues on Chrome browsers */
460}
461
462td.linenos pre {
463 padding: 5px 0px;
464 border: 0;
465 background-color: transparent;
466 color: #aaa;
467}
468
469table.highlighttable {
470 margin-left: 0.5em;
471}
472
473table.highlighttable td {
474 padding: 0 0.5em 0 0.5em;
475}
476
477tt.descname {
478 background-color: transparent;
479 font-weight: bold;
480 font-size: 1.2em;
481}
482
483tt.descclassname {
484 background-color: transparent;
485}
486
487tt.xref, a tt {
488 background-color: transparent;
489 font-weight: bold;
490}
491
492h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
493 background-color: transparent;
494}
495
496.viewcode-link {
497 float: right;
498}
499
500.viewcode-back {
501 float: right;
502 font-family: sans-serif;
503}
504
505div.viewcode-block:target {
506 margin: -1px -10px;
507 padding: 0 10px;
508}
509
510/* -- math display ---------------------------------------------------------- */
511
512img.math {
513 vertical-align: middle;
514}
515
516div.body div.math p {
517 text-align: center;
518}
519
520span.eqno {
521 float: right;
522}
523
524/* -- printout stylesheet --------------------------------------------------- */
525
526@media print {
527 div.document,
528 div.documentwrapper,
529 div.bodywrapper {
530 margin: 0 !important;
531 width: 100%;
532 }
533
534 div.sphinxsidebar,
535 div.related,
536 div.footer,
537 #top-link {
538 display: none;
539 }
540}
541\ No newline at end of file0\ No newline at end of file
5421
=== removed file 'src/postorius/doc/_build/html/_static/comment-bright.png'
543Binary files src/postorius/doc/_build/html/_static/comment-bright.png 2012-05-29 06:28:56 +0000 and src/postorius/doc/_build/html/_static/comment-bright.png 1970-01-01 00:00:00 +0000 differ2Binary files src/postorius/doc/_build/html/_static/comment-bright.png 2012-05-29 06:28:56 +0000 and src/postorius/doc/_build/html/_static/comment-bright.png 1970-01-01 00:00:00 +0000 differ
=== removed file 'src/postorius/doc/_build/html/_static/comment-close.png'
544Binary files src/postorius/doc/_build/html/_static/comment-close.png 2012-05-29 06:28:56 +0000 and src/postorius/doc/_build/html/_static/comment-close.png 1970-01-01 00:00:00 +0000 differ3Binary files src/postorius/doc/_build/html/_static/comment-close.png 2012-05-29 06:28:56 +0000 and src/postorius/doc/_build/html/_static/comment-close.png 1970-01-01 00:00:00 +0000 differ
=== removed file 'src/postorius/doc/_build/html/_static/comment.png'
545Binary files src/postorius/doc/_build/html/_static/comment.png 2012-05-29 06:28:56 +0000 and src/postorius/doc/_build/html/_static/comment.png 1970-01-01 00:00:00 +0000 differ4Binary files src/postorius/doc/_build/html/_static/comment.png 2012-05-29 06:28:56 +0000 and src/postorius/doc/_build/html/_static/comment.png 1970-01-01 00:00:00 +0000 differ
=== removed file 'src/postorius/doc/_build/html/_static/default.css'
--- src/postorius/doc/_build/html/_static/default.css 2012-03-23 22:54:46 +0000
+++ src/postorius/doc/_build/html/_static/default.css 1970-01-01 00:00:00 +0000
@@ -1,256 +0,0 @@
1/*
2 * default.css_t
3 * ~~~~~~~~~~~~~
4 *
5 * Sphinx stylesheet -- default theme.
6 *
7 * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
8 * :license: BSD, see LICENSE for details.
9 *
10 */
11
12@import url("basic.css");
13
14/* -- page layout ----------------------------------------------------------- */
15
16body {
17 font-family: sans-serif;
18 font-size: 100%;
19 background-color: #11303d;
20 color: #000;
21 margin: 0;
22 padding: 0;
23}
24
25div.document {
26 background-color: #1c4e63;
27}
28
29div.documentwrapper {
30 float: left;
31 width: 100%;
32}
33
34div.bodywrapper {
35 margin: 0 0 0 230px;
36}
37
38div.body {
39 background-color: #ffffff;
40 color: #000000;
41 padding: 0 20px 30px 20px;
42}
43
44div.footer {
45 color: #ffffff;
46 width: 100%;
47 padding: 9px 0 9px 0;
48 text-align: center;
49 font-size: 75%;
50}
51
52div.footer a {
53 color: #ffffff;
54 text-decoration: underline;
55}
56
57div.related {
58 background-color: #133f52;
59 line-height: 30px;
60 color: #ffffff;
61}
62
63div.related a {
64 color: #ffffff;
65}
66
67div.sphinxsidebar {
68}
69
70div.sphinxsidebar h3 {
71 font-family: 'Trebuchet MS', sans-serif;
72 color: #ffffff;
73 font-size: 1.4em;
74 font-weight: normal;
75 margin: 0;
76 padding: 0;
77}
78
79div.sphinxsidebar h3 a {
80 color: #ffffff;
81}
82
83div.sphinxsidebar h4 {
84 font-family: 'Trebuchet MS', sans-serif;
85 color: #ffffff;
86 font-size: 1.3em;
87 font-weight: normal;
88 margin: 5px 0 0 0;
89 padding: 0;
90}
91
92div.sphinxsidebar p {
93 color: #ffffff;
94}
95
96div.sphinxsidebar p.topless {
97 margin: 5px 10px 10px 10px;
98}
99
100div.sphinxsidebar ul {
101 margin: 10px;
102 padding: 0;
103 color: #ffffff;
104}
105
106div.sphinxsidebar a {
107 color: #98dbcc;
108}
109
110div.sphinxsidebar input {
111 border: 1px solid #98dbcc;
112 font-family: sans-serif;
113 font-size: 1em;
114}
115
116
117
118/* -- hyperlink styles ------------------------------------------------------ */
119
120a {
121 color: #355f7c;
122 text-decoration: none;
123}
124
125a:visited {
126 color: #355f7c;
127 text-decoration: none;
128}
129
130a:hover {
131 text-decoration: underline;
132}
133
134
135
136/* -- body styles ----------------------------------------------------------- */
137
138div.body h1,
139div.body h2,
140div.body h3,
141div.body h4,
142div.body h5,
143div.body h6 {
144 font-family: 'Trebuchet MS', sans-serif;
145 background-color: #f2f2f2;
146 font-weight: normal;
147 color: #20435c;
148 border-bottom: 1px solid #ccc;
149 margin: 20px -20px 10px -20px;
150 padding: 3px 0 3px 10px;
151}
152
153div.body h1 { margin-top: 0; font-size: 200%; }
154div.body h2 { font-size: 160%; }
155div.body h3 { font-size: 140%; }
156div.body h4 { font-size: 120%; }
157div.body h5 { font-size: 110%; }
158div.body h6 { font-size: 100%; }
159
160a.headerlink {
161 color: #c60f0f;
162 font-size: 0.8em;
163 padding: 0 4px 0 4px;
164 text-decoration: none;
165}
166
167a.headerlink:hover {
168 background-color: #c60f0f;
169 color: white;
170}
171
172div.body p, div.body dd, div.body li {
173 text-align: justify;
174 line-height: 130%;
175}
176
177div.admonition p.admonition-title + p {
178 display: inline;
179}
180
181div.admonition p {
182 margin-bottom: 5px;
183}
184
185div.admonition pre {
186 margin-bottom: 5px;
187}
188
189div.admonition ul, div.admonition ol {
190 margin-bottom: 5px;
191}
192
193div.note {
194 background-color: #eee;
195 border: 1px solid #ccc;
196}
197
198div.seealso {
199 background-color: #ffc;
200 border: 1px solid #ff6;
201}
202
203div.topic {
204 background-color: #eee;
205}
206
207div.warning {
208 background-color: #ffe4e4;
209 border: 1px solid #f66;
210}
211
212p.admonition-title {
213 display: inline;
214}
215
216p.admonition-title:after {
217 content: ":";
218}
219
220pre {
221 padding: 5px;
222 background-color: #eeffcc;
223 color: #333333;
224 line-height: 120%;
225 border: 1px solid #ac9;
226 border-left: none;
227 border-right: none;
228}
229
230tt {
231 background-color: #ecf0f3;
232 padding: 0 1px 0 1px;
233 font-size: 0.95em;
234}
235
236th {
237 background-color: #ede;
238}
239
240.warning tt {
241 background: #efc2c2;
242}
243
244.note tt {
245 background: #d6d6d6;
246}
247
248.viewcode-back {
249 font-family: sans-serif;
250}
251
252div.viewcode-block:target {
253 background-color: #f4debf;
254 border-top: 1px solid #ac9;
255 border-bottom: 1px solid #ac9;
256}
257\ No newline at end of file0\ No newline at end of file
2581
=== removed file 'src/postorius/doc/_build/html/_static/doctools.js'
--- src/postorius/doc/_build/html/_static/doctools.js 2012-05-29 06:28:56 +0000
+++ src/postorius/doc/_build/html/_static/doctools.js 1970-01-01 00:00:00 +0000
@@ -1,247 +0,0 @@
1/*
2 * doctools.js
3 * ~~~~~~~~~~~
4 *
5 * Sphinx JavaScript utilities for all documentation.
6 *
7 * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
8 * :license: BSD, see LICENSE for details.
9 *
10 */
11
12/**
13 * select a different prefix for underscore
14 */
15$u = _.noConflict();
16
17/**
18 * make the code below compatible with browsers without
19 * an installed firebug like debugger
20if (!window.console || !console.firebug) {
21 var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
22 "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
23 "profile", "profileEnd"];
24 window.console = {};
25 for (var i = 0; i < names.length; ++i)
26 window.console[names[i]] = function() {};
27}
28 */
29
30/**
31 * small helper function to urldecode strings
32 */
33jQuery.urldecode = function(x) {
34 return decodeURIComponent(x).replace(/\+/g, ' ');
35}
36
37/**
38 * small helper function to urlencode strings
39 */
40jQuery.urlencode = encodeURIComponent;
41
42/**
43 * This function returns the parsed url parameters of the
44 * current request. Multiple values per key are supported,
45 * it will always return arrays of strings for the value parts.
46 */
47jQuery.getQueryParameters = function(s) {
48 if (typeof s == 'undefined')
49 s = document.location.search;
50 var parts = s.substr(s.indexOf('?') + 1).split('&');
51 var result = {};
52 for (var i = 0; i < parts.length; i++) {
53 var tmp = parts[i].split('=', 2);
54 var key = jQuery.urldecode(tmp[0]);
55 var value = jQuery.urldecode(tmp[1]);
56 if (key in result)
57 result[key].push(value);
58 else
59 result[key] = [value];
60 }
61 return result;
62};
63
64/**
65 * small function to check if an array contains
66 * a given item.
67 */
68jQuery.contains = function(arr, item) {
69 for (var i = 0; i < arr.length; i++) {
70 if (arr[i] == item)
71 return true;
72 }
73 return false;
74};
75
76/**
77 * highlight a given string on a jquery object by wrapping it in
78 * span elements with the given class name.
79 */
80jQuery.fn.highlightText = function(text, className) {
81 function highlight(node) {
82 if (node.nodeType == 3) {
83 var val = node.nodeValue;
84 var pos = val.toLowerCase().indexOf(text);
85 if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) {
86 var span = document.createElement("span");
87 span.className = className;
88 span.appendChild(document.createTextNode(val.substr(pos, text.length)));
89 node.parentNode.insertBefore(span, node.parentNode.insertBefore(
90 document.createTextNode(val.substr(pos + text.length)),
91 node.nextSibling));
92 node.nodeValue = val.substr(0, pos);
93 }
94 }
95 else if (!jQuery(node).is("button, select, textarea")) {
96 jQuery.each(node.childNodes, function() {
97 highlight(this);
98 });
99 }
100 }
101 return this.each(function() {
102 highlight(this);
103 });
104};
105
106/**
107 * Small JavaScript module for the documentation.
108 */
109var Documentation = {
110
111 init : function() {
112 this.fixFirefoxAnchorBug();
113 this.highlightSearchWords();
114 this.initIndexTable();
115 },
116
117 /**
118 * i18n support
119 */
120 TRANSLATIONS : {},
121 PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
122 LOCALE : 'unknown',
123
124 // gettext and ngettext don't access this so that the functions
125 // can safely bound to a different name (_ = Documentation.gettext)
126 gettext : function(string) {
127 var translated = Documentation.TRANSLATIONS[string];
128 if (typeof translated == 'undefined')
129 return string;
130 return (typeof translated == 'string') ? translated : translated[0];
131 },
132
133 ngettext : function(singular, plural, n) {
134 var translated = Documentation.TRANSLATIONS[singular];
135 if (typeof translated == 'undefined')
136 return (n == 1) ? singular : plural;
137 return translated[Documentation.PLURALEXPR(n)];
138 },
139
140 addTranslations : function(catalog) {
141 for (var key in catalog.messages)
142 this.TRANSLATIONS[key] = catalog.messages[key];
143 this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
144 this.LOCALE = catalog.locale;
145 },
146
147 /**
148 * add context elements like header anchor links
149 */
150 addContextElements : function() {
151 $('div[id] > :header:first').each(function() {
152 $('<a class="headerlink">\u00B6</a>').
153 attr('href', '#' + this.id).
154 attr('title', _('Permalink to this headline')).
155 appendTo(this);
156 });
157 $('dt[id]').each(function() {
158 $('<a class="headerlink">\u00B6</a>').
159 attr('href', '#' + this.id).
160 attr('title', _('Permalink to this definition')).
161 appendTo(this);
162 });
163 },
164
165 /**
166 * workaround a firefox stupidity
167 */
168 fixFirefoxAnchorBug : function() {
169 if (document.location.hash && $.browser.mozilla)
170 window.setTimeout(function() {
171 document.location.href += '';
172 }, 10);
173 },
174
175 /**
176 * highlight the search words provided in the url in the text
177 */
178 highlightSearchWords : function() {
179 var params = $.getQueryParameters();
180 var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
181 if (terms.length) {
182 var body = $('div.body');
183 window.setTimeout(function() {
184 $.each(terms, function() {
185 body.highlightText(this.toLowerCase(), 'highlighted');
186 });
187 }, 10);
188 $('<p class="highlight-link"><a href="javascript:Documentation.' +
189 'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
190 .appendTo($('#searchbox'));
191 }
192 },
193
194 /**
195 * init the domain index toggle buttons
196 */
197 initIndexTable : function() {
198 var togglers = $('img.toggler').click(function() {
199 var src = $(this).attr('src');
200 var idnum = $(this).attr('id').substr(7);
201 $('tr.cg-' + idnum).toggle();
202 if (src.substr(-9) == 'minus.png')
203 $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
204 else
205 $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
206 }).css('display', '');
207 if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
208 togglers.click();
209 }
210 },
211
212 /**
213 * helper function to hide the search marks again
214 */
215 hideSearchWords : function() {
216 $('#searchbox .highlight-link').fadeOut(300);
217 $('span.highlighted').removeClass('highlighted');
218 },
219
220 /**
221 * make the url absolute
222 */
223 makeURL : function(relativeURL) {
224 return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
225 },
226
227 /**
228 * get the current relative url
229 */
230 getCurrentURL : function() {
231 var path = document.location.pathname;
232 var parts = path.split(/\//);
233 $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
234 if (this == '..')
235 parts.pop();
236 });
237 var url = parts.join('/');
238 return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
239 }
240};
241
242// quick alias for translations
243_ = Documentation.gettext;
244
245$(document).ready(function() {
246 Documentation.init();
247});
2480
=== removed file 'src/postorius/doc/_build/html/_static/down-pressed.png'
249Binary files src/postorius/doc/_build/html/_static/down-pressed.png 2012-05-29 06:28:56 +0000 and src/postorius/doc/_build/html/_static/down-pressed.png 1970-01-01 00:00:00 +0000 differ1Binary files src/postorius/doc/_build/html/_static/down-pressed.png 2012-05-29 06:28:56 +0000 and src/postorius/doc/_build/html/_static/down-pressed.png 1970-01-01 00:00:00 +0000 differ
=== removed file 'src/postorius/doc/_build/html/_static/down.png'
250Binary files src/postorius/doc/_build/html/_static/down.png 2012-05-29 06:28:56 +0000 and src/postorius/doc/_build/html/_static/down.png 1970-01-01 00:00:00 +0000 differ2Binary files src/postorius/doc/_build/html/_static/down.png 2012-05-29 06:28:56 +0000 and src/postorius/doc/_build/html/_static/down.png 1970-01-01 00:00:00 +0000 differ
=== removed file 'src/postorius/doc/_build/html/_static/file.png'
251Binary files src/postorius/doc/_build/html/_static/file.png 2011-08-17 16:19:11 +0000 and src/postorius/doc/_build/html/_static/file.png 1970-01-01 00:00:00 +0000 differ3Binary files src/postorius/doc/_build/html/_static/file.png 2011-08-17 16:19:11 +0000 and src/postorius/doc/_build/html/_static/file.png 1970-01-01 00:00:00 +0000 differ
=== removed file 'src/postorius/doc/_build/html/_static/jquery.js'
--- src/postorius/doc/_build/html/_static/jquery.js 2012-03-23 22:54:46 +0000
+++ src/postorius/doc/_build/html/_static/jquery.js 1970-01-01 00:00:00 +0000
@@ -1,154 +0,0 @@
1/*!
2 * jQuery JavaScript Library v1.4.2
3 * http://jquery.com/
4 *
5 * Copyright 2010, John Resig
6 * Dual licensed under the MIT or GPL Version 2 licenses.
7 * http://jquery.org/license
8 *
9 * Includes Sizzle.js
10 * http://sizzlejs.com/
11 * Copyright 2010, The Dojo Foundation
12 * Released under the MIT, BSD, and GPL Licenses.
13 *
14 * Date: Sat Feb 13 22:33:48 2010 -0500
15 */
16(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
17e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
18j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
19"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
20true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
21Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
22(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
23a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
24"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
25function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
26c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
27L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
28"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
29a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
30d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
31a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
32!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
33true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
34var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
35parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
36false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
37s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
38applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
39else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
40a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
41w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
42cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
43i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
44" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
45this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
46e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
47c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
48a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
49function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
50k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
51C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
52null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
53e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
54f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
55if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
56fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
57d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
58"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
59a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
60isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
61{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
62if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
63e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
64"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
65d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
66!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
67toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
68u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
69function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
70if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
71e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
72t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
73g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
74for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
751)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
76CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
77relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
78l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
79h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
80CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
81g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
82text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
83setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
84h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
85m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
86"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
87h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
88!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
89h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
90q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
91if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
92(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
93function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
94gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
95c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
96{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
97"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
98d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
99a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
1001&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
101a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
102c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
103wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
104prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
105this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
106return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
107""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
108this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
109u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
1101?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
111return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
112""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
113c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
114c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
115function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
116Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
117"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
118a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
119a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
120"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
121serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
122function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
123global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
124e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
125"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
126false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
127false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
128c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
129d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
130g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
1311223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
132"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
133if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
134this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
135"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
136animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
137j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
138this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
139"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
140c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
141this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
142this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
143e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
144c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
145function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
146this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
147k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
148f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
149a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
150c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
151d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
152f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
153"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
154e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
1550
=== removed file 'src/postorius/doc/_build/html/_static/minus.png'
156Binary files src/postorius/doc/_build/html/_static/minus.png 2011-08-17 16:19:11 +0000 and src/postorius/doc/_build/html/_static/minus.png 1970-01-01 00:00:00 +0000 differ1Binary files src/postorius/doc/_build/html/_static/minus.png 2011-08-17 16:19:11 +0000 and src/postorius/doc/_build/html/_static/minus.png 1970-01-01 00:00:00 +0000 differ
=== removed file 'src/postorius/doc/_build/html/_static/plus.png'
157Binary files src/postorius/doc/_build/html/_static/plus.png 2011-08-17 16:19:11 +0000 and src/postorius/doc/_build/html/_static/plus.png 1970-01-01 00:00:00 +0000 differ2Binary files src/postorius/doc/_build/html/_static/plus.png 2011-08-17 16:19:11 +0000 and src/postorius/doc/_build/html/_static/plus.png 1970-01-01 00:00:00 +0000 differ
=== removed file 'src/postorius/doc/_build/html/_static/pygments.css'
--- src/postorius/doc/_build/html/_static/pygments.css 2012-03-23 22:54:46 +0000
+++ src/postorius/doc/_build/html/_static/pygments.css 1970-01-01 00:00:00 +0000
@@ -1,62 +0,0 @@
1.highlight .hll { background-color: #ffffcc }
2.highlight { background: #eeffcc; }
3.highlight .c { color: #408090; font-style: italic } /* Comment */
4.highlight .err { border: 1px solid #FF0000 } /* Error */
5.highlight .k { color: #007020; font-weight: bold } /* Keyword */
6.highlight .o { color: #666666 } /* Operator */
7.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
8.highlight .cp { color: #007020 } /* Comment.Preproc */
9.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
10.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
11.highlight .gd { color: #A00000 } /* Generic.Deleted */
12.highlight .ge { font-style: italic } /* Generic.Emph */
13.highlight .gr { color: #FF0000 } /* Generic.Error */
14.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
15.highlight .gi { color: #00A000 } /* Generic.Inserted */
16.highlight .go { color: #303030 } /* Generic.Output */
17.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
18.highlight .gs { font-weight: bold } /* Generic.Strong */
19.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
20.highlight .gt { color: #0040D0 } /* Generic.Traceback */
21.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
22.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
23.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
24.highlight .kp { color: #007020 } /* Keyword.Pseudo */
25.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
26.highlight .kt { color: #902000 } /* Keyword.Type */
27.highlight .m { color: #208050 } /* Literal.Number */
28.highlight .s { color: #4070a0 } /* Literal.String */
29.highlight .na { color: #4070a0 } /* Name.Attribute */
30.highlight .nb { color: #007020 } /* Name.Builtin */
31.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
32.highlight .no { color: #60add5 } /* Name.Constant */
33.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
34.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
35.highlight .ne { color: #007020 } /* Name.Exception */
36.highlight .nf { color: #06287e } /* Name.Function */
37.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
38.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
39.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
40.highlight .nv { color: #bb60d5 } /* Name.Variable */
41.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
42.highlight .w { color: #bbbbbb } /* Text.Whitespace */
43.highlight .mf { color: #208050 } /* Literal.Number.Float */
44.highlight .mh { color: #208050 } /* Literal.Number.Hex */
45.highlight .mi { color: #208050 } /* Literal.Number.Integer */
46.highlight .mo { color: #208050 } /* Literal.Number.Oct */
47.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
48.highlight .sc { color: #4070a0 } /* Literal.String.Char */
49.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
50.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
51.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
52.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
53.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
54.highlight .sx { color: #c65d09 } /* Literal.String.Other */
55.highlight .sr { color: #235388 } /* Literal.String.Regex */
56.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
57.highlight .ss { color: #517918 } /* Literal.String.Symbol */
58.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
59.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
60.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
61.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
62.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */
63\ No newline at end of file0\ No newline at end of file
641
=== removed file 'src/postorius/doc/_build/html/_static/searchtools.js'
--- src/postorius/doc/_build/html/_static/searchtools.js 2012-05-29 06:28:56 +0000
+++ src/postorius/doc/_build/html/_static/searchtools.js 1970-01-01 00:00:00 +0000
@@ -1,560 +0,0 @@
1/*
2 * searchtools.js_t
3 * ~~~~~~~~~~~~~~~~
4 *
5 * Sphinx JavaScript utilties for the full-text search.
6 *
7 * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
8 * :license: BSD, see LICENSE for details.
9 *
10 */
11
12/**
13 * helper function to return a node containing the
14 * search summary for a given text. keywords is a list
15 * of stemmed words, hlwords is the list of normal, unstemmed
16 * words. the first one is used to find the occurance, the
17 * latter for highlighting it.
18 */
19
20jQuery.makeSearchSummary = function(text, keywords, hlwords) {
21 var textLower = text.toLowerCase();
22 var start = 0;
23 $.each(keywords, function() {
24 var i = textLower.indexOf(this.toLowerCase());
25 if (i > -1)
26 start = i;
27 });
28 start = Math.max(start - 120, 0);
29 var excerpt = ((start > 0) ? '...' : '') +
30 $.trim(text.substr(start, 240)) +
31 ((start + 240 - text.length) ? '...' : '');
32 var rv = $('<div class="context"></div>').text(excerpt);
33 $.each(hlwords, function() {
34 rv = rv.highlightText(this, 'highlighted');
35 });
36 return rv;
37}
38
39
40/**
41 * Porter Stemmer
42 */
43var Stemmer = function() {
44
45 var step2list = {
46 ational: 'ate',
47 tional: 'tion',
48 enci: 'ence',
49 anci: 'ance',
50 izer: 'ize',
51 bli: 'ble',
52 alli: 'al',
53 entli: 'ent',
54 eli: 'e',
55 ousli: 'ous',
56 ization: 'ize',
57 ation: 'ate',
58 ator: 'ate',
59 alism: 'al',
60 iveness: 'ive',
61 fulness: 'ful',
62 ousness: 'ous',
63 aliti: 'al',
64 iviti: 'ive',
65 biliti: 'ble',
66 logi: 'log'
67 };
68
69 var step3list = {
70 icate: 'ic',
71 ative: '',
72 alize: 'al',
73 iciti: 'ic',
74 ical: 'ic',
75 ful: '',
76 ness: ''
77 };
78
79 var c = "[^aeiou]"; // consonant
80 var v = "[aeiouy]"; // vowel
81 var C = c + "[^aeiouy]*"; // consonant sequence
82 var V = v + "[aeiou]*"; // vowel sequence
83
84 var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0
85 var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1
86 var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1
87 var s_v = "^(" + C + ")?" + v; // vowel in stem
88
89 this.stemWord = function (w) {
90 var stem;
91 var suffix;
92 var firstch;
93 var origword = w;
94
95 if (w.length < 3)
96 return w;
97
98 var re;
99 var re2;
100 var re3;
101 var re4;
102
103 firstch = w.substr(0,1);
104 if (firstch == "y")
105 w = firstch.toUpperCase() + w.substr(1);
106
107 // Step 1a
108 re = /^(.+?)(ss|i)es$/;
109 re2 = /^(.+?)([^s])s$/;
110
111 if (re.test(w))
112 w = w.replace(re,"$1$2");
113 else if (re2.test(w))
114 w = w.replace(re2,"$1$2");
115
116 // Step 1b
117 re = /^(.+?)eed$/;
118 re2 = /^(.+?)(ed|ing)$/;
119 if (re.test(w)) {
120 var fp = re.exec(w);
121 re = new RegExp(mgr0);
122 if (re.test(fp[1])) {
123 re = /.$/;
124 w = w.replace(re,"");
125 }
126 }
127 else if (re2.test(w)) {
128 var fp = re2.exec(w);
129 stem = fp[1];
130 re2 = new RegExp(s_v);
131 if (re2.test(stem)) {
132 w = stem;
133 re2 = /(at|bl|iz)$/;
134 re3 = new RegExp("([^aeiouylsz])\\1$");
135 re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
136 if (re2.test(w))
137 w = w + "e";
138 else if (re3.test(w)) {
139 re = /.$/;
140 w = w.replace(re,"");
141 }
142 else if (re4.test(w))
143 w = w + "e";
144 }
145 }
146
147 // Step 1c
148 re = /^(.+?)y$/;
149 if (re.test(w)) {
150 var fp = re.exec(w);
151 stem = fp[1];
152 re = new RegExp(s_v);
153 if (re.test(stem))
154 w = stem + "i";
155 }
156
157 // Step 2
158 re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
159 if (re.test(w)) {
160 var fp = re.exec(w);
161 stem = fp[1];
162 suffix = fp[2];
163 re = new RegExp(mgr0);
164 if (re.test(stem))
165 w = stem + step2list[suffix];
166 }
167
168 // Step 3
169 re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
170 if (re.test(w)) {
171 var fp = re.exec(w);
172 stem = fp[1];
173 suffix = fp[2];
174 re = new RegExp(mgr0);
175 if (re.test(stem))
176 w = stem + step3list[suffix];
177 }
178
179 // Step 4
180 re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
181 re2 = /^(.+?)(s|t)(ion)$/;
182 if (re.test(w)) {
183 var fp = re.exec(w);
184 stem = fp[1];
185 re = new RegExp(mgr1);
186 if (re.test(stem))
187 w = stem;
188 }
189 else if (re2.test(w)) {
190 var fp = re2.exec(w);
191 stem = fp[1] + fp[2];
192 re2 = new RegExp(mgr1);
193 if (re2.test(stem))
194 w = stem;
195 }
196
197 // Step 5
198 re = /^(.+?)e$/;
199 if (re.test(w)) {
200 var fp = re.exec(w);
201 stem = fp[1];
202 re = new RegExp(mgr1);
203 re2 = new RegExp(meq1);
204 re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
205 if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
206 w = stem;
207 }
208 re = /ll$/;
209 re2 = new RegExp(mgr1);
210 if (re.test(w) && re2.test(w)) {
211 re = /.$/;
212 w = w.replace(re,"");
213 }
214
215 // and turn initial Y back to y
216 if (firstch == "y")
217 w = firstch.toLowerCase() + w.substr(1);
218 return w;
219 }
220}
221
222
223/**
224 * Search Module
225 */
226var Search = {
227
228 _index : null,
229 _queued_query : null,
230 _pulse_status : -1,
231
232 init : function() {
233 var params = $.getQueryParameters();
234 if (params.q) {
235 var query = params.q[0];
236 $('input[name="q"]')[0].value = query;
237 this.performSearch(query);
238 }
239 },
240
241 loadIndex : function(url) {
242 $.ajax({type: "GET", url: url, data: null, success: null,
243 dataType: "script", cache: true});
244 },
245
246 setIndex : function(index) {
247 var q;
248 this._index = index;
249 if ((q = this._queued_query) !== null) {
250 this._queued_query = null;
251 Search.query(q);
252 }
253 },
254
255 hasIndex : function() {
256 return this._index !== null;
257 },
258
259 deferQuery : function(query) {
260 this._queued_query = query;
261 },
262
263 stopPulse : function() {
264 this._pulse_status = 0;
265 },
266
267 startPulse : function() {
268 if (this._pulse_status >= 0)
269 return;
270 function pulse() {
271 Search._pulse_status = (Search._pulse_status + 1) % 4;
272 var dotString = '';
273 for (var i = 0; i < Search._pulse_status; i++)
274 dotString += '.';
275 Search.dots.text(dotString);
276 if (Search._pulse_status > -1)
277 window.setTimeout(pulse, 500);
278 };
279 pulse();
280 },
281
282 /**
283 * perform a search for something
284 */
285 performSearch : function(query) {
286 // create the required interface elements
287 this.out = $('#search-results');
288 this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
289 this.dots = $('<span></span>').appendTo(this.title);
290 this.status = $('<p style="display: none"></p>').appendTo(this.out);
291 this.output = $('<ul class="search"/>').appendTo(this.out);
292
293 $('#search-progress').text(_('Preparing search...'));
294 this.startPulse();
295
296 // index already loaded, the browser was quick!
297 if (this.hasIndex())
298 this.query(query);
299 else
300 this.deferQuery(query);
301 },
302
303 query : function(query) {
304 var stopwords = ["and","then","into","it","as","are","in","if","for","no","there","their","was","is","be","to","that","but","they","not","such","with","by","a","on","these","of","will","this","near","the","or","at"];
305
306 // Stem the searchterms and add them to the correct list
307 var stemmer = new Stemmer();
308 var searchterms = [];
309 var excluded = [];
310 var hlterms = [];
311 var tmp = query.split(/\s+/);
312 var objectterms = [];
313 for (var i = 0; i < tmp.length; i++) {
314 if (tmp[i] != "") {
315 objectterms.push(tmp[i].toLowerCase());
316 }
317
318 if ($u.indexOf(stopwords, tmp[i]) != -1 || tmp[i].match(/^\d+$/) ||
319 tmp[i] == "") {
320 // skip this "word"
321 continue;
322 }
323 // stem the word
324 var word = stemmer.stemWord(tmp[i]).toLowerCase();
325 // select the correct list
326 if (word[0] == '-') {
327 var toAppend = excluded;
328 word = word.substr(1);
329 }
330 else {
331 var toAppend = searchterms;
332 hlterms.push(tmp[i].toLowerCase());
333 }
334 // only add if not already in the list
335 if (!$.contains(toAppend, word))
336 toAppend.push(word);
337 };
338 var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
339
340 // console.debug('SEARCH: searching for:');
341 // console.info('required: ', searchterms);
342 // console.info('excluded: ', excluded);
343
344 // prepare search
345 var filenames = this._index.filenames;
346 var titles = this._index.titles;
347 var terms = this._index.terms;
348 var fileMap = {};
349 var files = null;
350 // different result priorities
351 var importantResults = [];
352 var objectResults = [];
353 var regularResults = [];
354 var unimportantResults = [];
355 $('#search-progress').empty();
356
357 // lookup as object
358 for (var i = 0; i < objectterms.length; i++) {
359 var others = [].concat(objectterms.slice(0,i),
360 objectterms.slice(i+1, objectterms.length))
361 var results = this.performObjectSearch(objectterms[i], others);
362 // Assume first word is most likely to be the object,
363 // other words more likely to be in description.
364 // Therefore put matches for earlier words first.
365 // (Results are eventually used in reverse order).
366 objectResults = results[0].concat(objectResults);
367 importantResults = results[1].concat(importantResults);
368 unimportantResults = results[2].concat(unimportantResults);
369 }
370
371 // perform the search on the required terms
372 for (var i = 0; i < searchterms.length; i++) {
373 var word = searchterms[i];
374 // no match but word was a required one
375 if ((files = terms[word]) == null)
376 break;
377 if (files.length == undefined) {
378 files = [files];
379 }
380 // create the mapping
381 for (var j = 0; j < files.length; j++) {
382 var file = files[j];
383 if (file in fileMap)
384 fileMap[file].push(word);
385 else
386 fileMap[file] = [word];
387 }
388 }
389
390 // now check if the files don't contain excluded terms
391 for (var file in fileMap) {
392 var valid = true;
393
394 // check if all requirements are matched
395 if (fileMap[file].length != searchterms.length)
396 continue;
397
398 // ensure that none of the excluded terms is in the
399 // search result.
400 for (var i = 0; i < excluded.length; i++) {
401 if (terms[excluded[i]] == file ||
402 $.contains(terms[excluded[i]] || [], file)) {
403 valid = false;
404 break;
405 }
406 }
407
408 // if we have still a valid result we can add it
409 // to the result list
410 if (valid)
411 regularResults.push([filenames[file], titles[file], '', null]);
412 }
413
414 // delete unused variables in order to not waste
415 // memory until list is retrieved completely
416 delete filenames, titles, terms;
417
418 // now sort the regular results descending by title
419 regularResults.sort(function(a, b) {
420 var left = a[1].toLowerCase();
421 var right = b[1].toLowerCase();
422 return (left > right) ? -1 : ((left < right) ? 1 : 0);
423 });
424
425 // combine all results
426 var results = unimportantResults.concat(regularResults)
427 .concat(objectResults).concat(importantResults);
428
429 // print the results
430 var resultCount = results.length;
431 function displayNextItem() {
432 // results left, load the summary and display it
433 if (results.length) {
434 var item = results.pop();
435 var listItem = $('<li style="display:none"></li>');
436 if (DOCUMENTATION_OPTIONS.FILE_SUFFIX == '') {
437 // dirhtml builder
438 var dirname = item[0] + '/';
439 if (dirname.match(/\/index\/$/)) {
440 dirname = dirname.substring(0, dirname.length-6);
441 } else if (dirname == 'index/') {
442 dirname = '';
443 }
444 listItem.append($('<a/>').attr('href',
445 DOCUMENTATION_OPTIONS.URL_ROOT + dirname +
446 highlightstring + item[2]).html(item[1]));
447 } else {
448 // normal html builders
449 listItem.append($('<a/>').attr('href',
450 item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
451 highlightstring + item[2]).html(item[1]));
452 }
453 if (item[3]) {
454 listItem.append($('<span> (' + item[3] + ')</span>'));
455 Search.output.append(listItem);
456 listItem.slideDown(5, function() {
457 displayNextItem();
458 });
459 } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
460 $.get(DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' +
461 item[0] + '.txt', function(data) {
462 if (data != '') {
463 listItem.append($.makeSearchSummary(data, searchterms, hlterms));
464 Search.output.append(listItem);
465 }
466 listItem.slideDown(5, function() {
467 displayNextItem();
468 });
469 }, "text");
470 } else {
471 // no source available, just display title
472 Search.output.append(listItem);
473 listItem.slideDown(5, function() {
474 displayNextItem();
475 });
476 }
477 }
478 // search finished, update title and status message
479 else {
480 Search.stopPulse();
481 Search.title.text(_('Search Results'));
482 if (!resultCount)
483 Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
484 else
485 Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
486 Search.status.fadeIn(500);
487 }
488 }
489 displayNextItem();
490 },
491
492 performObjectSearch : function(object, otherterms) {
493 var filenames = this._index.filenames;
494 var objects = this._index.objects;
495 var objnames = this._index.objnames;
496 var titles = this._index.titles;
497
498 var importantResults = [];
499 var objectResults = [];
500 var unimportantResults = [];
501
502 for (var prefix in objects) {
503 for (var name in objects[prefix]) {
504 var fullname = (prefix ? prefix + '.' : '') + name;
505 if (fullname.toLowerCase().indexOf(object) > -1) {
506 var match = objects[prefix][name];
507 var objname = objnames[match[1]][2];
508 var title = titles[match[0]];
509 // If more than one term searched for, we require other words to be
510 // found in the name/title/description
511 if (otherterms.length > 0) {
512 var haystack = (prefix + ' ' + name + ' ' +
513 objname + ' ' + title).toLowerCase();
514 var allfound = true;
515 for (var i = 0; i < otherterms.length; i++) {
516 if (haystack.indexOf(otherterms[i]) == -1) {
517 allfound = false;
518 break;
519 }
520 }
521 if (!allfound) {
522 continue;
523 }
524 }
525 var descr = objname + _(', in ') + title;
526 anchor = match[3];
527 if (anchor == '')
528 anchor = fullname;
529 else if (anchor == '-')
530 anchor = objnames[match[1]][1] + '-' + fullname;
531 result = [filenames[match[0]], fullname, '#'+anchor, descr];
532 switch (match[2]) {
533 case 1: objectResults.push(result); break;
534 case 0: importantResults.push(result); break;
535 case 2: unimportantResults.push(result); break;
536 }
537 }
538 }
539 }
540
541 // sort results descending
542 objectResults.sort(function(a, b) {
543 return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
544 });
545
546 importantResults.sort(function(a, b) {
547 return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
548 });
549
550 unimportantResults.sort(function(a, b) {
551 return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
552 });
553
554 return [importantResults, objectResults, unimportantResults]
555 }
556}
557
558$(document).ready(function() {
559 Search.init();
560});
561\ No newline at end of file0\ No newline at end of file
5621
=== removed file 'src/postorius/doc/_build/html/_static/sidebar.js'
--- src/postorius/doc/_build/html/_static/sidebar.js 2012-05-29 06:28:56 +0000
+++ src/postorius/doc/_build/html/_static/sidebar.js 1970-01-01 00:00:00 +0000
@@ -1,151 +0,0 @@
1/*
2 * sidebar.js
3 * ~~~~~~~~~~
4 *
5 * This script makes the Sphinx sidebar collapsible.
6 *
7 * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds
8 * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
9 * used to collapse and expand the sidebar.
10 *
11 * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
12 * and the width of the sidebar and the margin-left of the document
13 * are decreased. When the sidebar is expanded the opposite happens.
14 * This script saves a per-browser/per-session cookie used to
15 * remember the position of the sidebar among the pages.
16 * Once the browser is closed the cookie is deleted and the position
17 * reset to the default (expanded).
18 *
19 * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
20 * :license: BSD, see LICENSE for details.
21 *
22 */
23
24$(function() {
25 // global elements used by the functions.
26 // the 'sidebarbutton' element is defined as global after its
27 // creation, in the add_sidebar_button function
28 var bodywrapper = $('.bodywrapper');
29 var sidebar = $('.sphinxsidebar');
30 var sidebarwrapper = $('.sphinxsidebarwrapper');
31
32 // for some reason, the document has no sidebar; do not run into errors
33 if (!sidebar.length) return;
34
35 // original margin-left of the bodywrapper and width of the sidebar
36 // with the sidebar expanded
37 var bw_margin_expanded = bodywrapper.css('margin-left');
38 var ssb_width_expanded = sidebar.width();
39
40 // margin-left of the bodywrapper and width of the sidebar
41 // with the sidebar collapsed
42 var bw_margin_collapsed = '.8em';
43 var ssb_width_collapsed = '.8em';
44
45 // colors used by the current theme
46 var dark_color = $('.related').css('background-color');
47 var light_color = $('.document').css('background-color');
48
49 function sidebar_is_collapsed() {
50 return sidebarwrapper.is(':not(:visible)');
51 }
52
53 function toggle_sidebar() {
54 if (sidebar_is_collapsed())
55 expand_sidebar();
56 else
57 collapse_sidebar();
58 }
59
60 function collapse_sidebar() {
61 sidebarwrapper.hide();
62 sidebar.css('width', ssb_width_collapsed);
63 bodywrapper.css('margin-left', bw_margin_collapsed);
64 sidebarbutton.css({
65 'margin-left': '0',
66 'height': bodywrapper.height()
67 });
68 sidebarbutton.find('span').text('»');
69 sidebarbutton.attr('title', _('Expand sidebar'));
70 document.cookie = 'sidebar=collapsed';
71 }
72
73 function expand_sidebar() {
74 bodywrapper.css('margin-left', bw_margin_expanded);
75 sidebar.css('width', ssb_width_expanded);
76 sidebarwrapper.show();
77 sidebarbutton.css({
78 'margin-left': ssb_width_expanded-12,
79 'height': bodywrapper.height()
80 });
81 sidebarbutton.find('span').text('«');
82 sidebarbutton.attr('title', _('Collapse sidebar'));
83 document.cookie = 'sidebar=expanded';
84 }
85
86 function add_sidebar_button() {
87 sidebarwrapper.css({
88 'float': 'left',
89 'margin-right': '0',
90 'width': ssb_width_expanded - 28
91 });
92 // create the button
93 sidebar.append(
94 '<div id="sidebarbutton"><span>&laquo;</span></div>'
95 );
96 var sidebarbutton = $('#sidebarbutton');
97 light_color = sidebarbutton.css('background-color');
98 // find the height of the viewport to center the '<<' in the page
99 var viewport_height;
100 if (window.innerHeight)
101 viewport_height = window.innerHeight;
102 else
103 viewport_height = $(window).height();
104 sidebarbutton.find('span').css({
105 'display': 'block',
106 'margin-top': (viewport_height - sidebar.position().top - 20) / 2
107 });
108
109 sidebarbutton.click(toggle_sidebar);
110 sidebarbutton.attr('title', _('Collapse sidebar'));
111 sidebarbutton.css({
112 'color': '#FFFFFF',
113 'border-left': '1px solid ' + dark_color,
114 'font-size': '1.2em',
115 'cursor': 'pointer',
116 'height': bodywrapper.height(),
117 'padding-top': '1px',
118 'margin-left': ssb_width_expanded - 12
119 });
120
121 sidebarbutton.hover(
122 function () {
123 $(this).css('background-color', dark_color);
124 },
125 function () {
126 $(this).css('background-color', light_color);
127 }
128 );
129 }
130
131 function set_position_from_cookie() {
132 if (!document.cookie)
133 return;
134 var items = document.cookie.split(';');
135 for(var k=0; k<items.length; k++) {
136 var key_val = items[k].split('=');
137 var key = key_val[0];
138 if (key == 'sidebar') {
139 var value = key_val[1];
140 if ((value == 'collapsed') && (!sidebar_is_collapsed()))
141 collapse_sidebar();
142 else if ((value == 'expanded') && (sidebar_is_collapsed()))
143 expand_sidebar();
144 }
145 }
146 }
147
148 add_sidebar_button();
149 var sidebarbutton = $('#sidebarbutton');
150 set_position_from_cookie();
151});
1520
=== removed file 'src/postorius/doc/_build/html/_static/underscore.js'
--- src/postorius/doc/_build/html/_static/underscore.js 2012-05-29 06:28:56 +0000
+++ src/postorius/doc/_build/html/_static/underscore.js 1970-01-01 00:00:00 +0000
@@ -1,23 +0,0 @@
1// Underscore.js 0.5.5
2// (c) 2009 Jeremy Ashkenas, DocumentCloud Inc.
3// Underscore is freely distributable under the terms of the MIT license.
4// Portions of Underscore are inspired by or borrowed from Prototype.js,
5// Oliver Steele's Functional, and John Resig's Micro-Templating.
6// For all details and documentation:
7// http://documentcloud.github.com/underscore/
8(function(){var j=this,n=j._,i=function(a){this._wrapped=a},m=typeof StopIteration!=="undefined"?StopIteration:"__break__",b=j._=function(a){return new i(a)};if(typeof exports!=="undefined")exports._=b;var k=Array.prototype.slice,o=Array.prototype.unshift,p=Object.prototype.toString,q=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;b.VERSION="0.5.5";b.each=function(a,c,d){try{if(a.forEach)a.forEach(c,d);else if(b.isArray(a)||b.isArguments(a))for(var e=0,f=a.length;e<f;e++)c.call(d,
9a[e],e,a);else{var g=b.keys(a);f=g.length;for(e=0;e<f;e++)c.call(d,a[g[e]],g[e],a)}}catch(h){if(h!=m)throw h;}return a};b.map=function(a,c,d){if(a&&b.isFunction(a.map))return a.map(c,d);var e=[];b.each(a,function(f,g,h){e.push(c.call(d,f,g,h))});return e};b.reduce=function(a,c,d,e){if(a&&b.isFunction(a.reduce))return a.reduce(b.bind(d,e),c);b.each(a,function(f,g,h){c=d.call(e,c,f,g,h)});return c};b.reduceRight=function(a,c,d,e){if(a&&b.isFunction(a.reduceRight))return a.reduceRight(b.bind(d,e),c);
10var f=b.clone(b.toArray(a)).reverse();b.each(f,function(g,h){c=d.call(e,c,g,h,a)});return c};b.detect=function(a,c,d){var e;b.each(a,function(f,g,h){if(c.call(d,f,g,h)){e=f;b.breakLoop()}});return e};b.select=function(a,c,d){if(a&&b.isFunction(a.filter))return a.filter(c,d);var e=[];b.each(a,function(f,g,h){c.call(d,f,g,h)&&e.push(f)});return e};b.reject=function(a,c,d){var e=[];b.each(a,function(f,g,h){!c.call(d,f,g,h)&&e.push(f)});return e};b.all=function(a,c,d){c=c||b.identity;if(a&&b.isFunction(a.every))return a.every(c,
11d);var e=true;b.each(a,function(f,g,h){(e=e&&c.call(d,f,g,h))||b.breakLoop()});return e};b.any=function(a,c,d){c=c||b.identity;if(a&&b.isFunction(a.some))return a.some(c,d);var e=false;b.each(a,function(f,g,h){if(e=c.call(d,f,g,h))b.breakLoop()});return e};b.include=function(a,c){if(b.isArray(a))return b.indexOf(a,c)!=-1;var d=false;b.each(a,function(e){if(d=e===c)b.breakLoop()});return d};b.invoke=function(a,c){var d=b.rest(arguments,2);return b.map(a,function(e){return(c?e[c]:e).apply(e,d)})};b.pluck=
12function(a,c){return b.map(a,function(d){return d[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);var e={computed:-Infinity};b.each(a,function(f,g,h){g=c?c.call(d,f,g,h):f;g>=e.computed&&(e={value:f,computed:g})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);var e={computed:Infinity};b.each(a,function(f,g,h){g=c?c.call(d,f,g,h):f;g<e.computed&&(e={value:f,computed:g})});return e.value};b.sortBy=function(a,c,d){return b.pluck(b.map(a,
13function(e,f,g){return{value:e,criteria:c.call(d,e,f,g)}}).sort(function(e,f){e=e.criteria;f=f.criteria;return e<f?-1:e>f?1:0}),"value")};b.sortedIndex=function(a,c,d){d=d||b.identity;for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?(e=g+1):(f=g)}return e};b.toArray=function(a){if(!a)return[];if(a.toArray)return a.toArray();if(b.isArray(a))return a;if(b.isArguments(a))return k.call(a);return b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=function(a,c,d){return c&&!d?k.call(a,
140,c):a[0]};b.rest=function(a,c,d){return k.call(a,b.isUndefined(c)||d?1:c)};b.last=function(a){return a[a.length-1]};b.compact=function(a){return b.select(a,function(c){return!!c})};b.flatten=function(a){return b.reduce(a,[],function(c,d){if(b.isArray(d))return c.concat(b.flatten(d));c.push(d);return c})};b.without=function(a){var c=b.rest(arguments);return b.select(a,function(d){return!b.include(c,d)})};b.uniq=function(a,c){return b.reduce(a,[],function(d,e,f){if(0==f||(c===true?b.last(d)!=e:!b.include(d,
15e)))d.push(e);return d})};b.intersect=function(a){var c=b.rest(arguments);return b.select(b.uniq(a),function(d){return b.all(c,function(e){return b.indexOf(e,d)>=0})})};b.zip=function(){for(var a=b.toArray(arguments),c=b.max(b.pluck(a,"length")),d=new Array(c),e=0;e<c;e++)d[e]=b.pluck(a,String(e));return d};b.indexOf=function(a,c){if(a.indexOf)return a.indexOf(c);for(var d=0,e=a.length;d<e;d++)if(a[d]===c)return d;return-1};b.lastIndexOf=function(a,c){if(a.lastIndexOf)return a.lastIndexOf(c);for(var d=
16a.length;d--;)if(a[d]===c)return d;return-1};b.range=function(a,c,d){var e=b.toArray(arguments),f=e.length<=1;a=f?0:e[0];c=f?e[0]:e[1];d=e[2]||1;e=Math.ceil((c-a)/d);if(e<=0)return[];e=new Array(e);f=a;for(var g=0;1;f+=d){if((d>0?f-c:c-f)>=0)return e;e[g++]=f}};b.bind=function(a,c){var d=b.rest(arguments,2);return function(){return a.apply(c||j,d.concat(b.toArray(arguments)))}};b.bindAll=function(a){var c=b.rest(arguments);if(c.length==0)c=b.functions(a);b.each(c,function(d){a[d]=b.bind(a[d],a)});
17return a};b.delay=function(a,c){var d=b.rest(arguments,2);return setTimeout(function(){return a.apply(a,d)},c)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(b.rest(arguments)))};b.wrap=function(a,c){return function(){var d=[a].concat(b.toArray(arguments));return c.apply(c,d)}};b.compose=function(){var a=b.toArray(arguments);return function(){for(var c=b.toArray(arguments),d=a.length-1;d>=0;d--)c=[a[d].apply(this,c)];return c[0]}};b.keys=function(a){if(b.isArray(a))return b.range(0,a.length);
18var c=[];for(var d in a)q.call(a,d)&&c.push(d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=function(a){return b.select(b.keys(a),function(c){return b.isFunction(a[c])}).sort()};b.extend=function(a,c){for(var d in c)a[d]=c[d];return a};b.clone=function(a){if(b.isArray(a))return a.slice(0);return b.extend({},a)};b.tap=function(a,c){c(a);return a};b.isEqual=function(a,c){if(a===c)return true;var d=typeof a;if(d!=typeof c)return false;if(a==c)return true;if(!a&&c||a&&!c)return false;
19if(a.isEqual)return a.isEqual(c);if(b.isDate(a)&&b.isDate(c))return a.getTime()===c.getTime();if(b.isNaN(a)&&b.isNaN(c))return true;if(b.isRegExp(a)&&b.isRegExp(c))return a.source===c.source&&a.global===c.global&&a.ignoreCase===c.ignoreCase&&a.multiline===c.multiline;if(d!=="object")return false;if(a.length&&a.length!==c.length)return false;d=b.keys(a);var e=b.keys(c);if(d.length!=e.length)return false;for(var f in a)if(!b.isEqual(a[f],c[f]))return false;return true};b.isEmpty=function(a){return b.keys(a).length==
200};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=function(a){return!!(a&&a.concat&&a.unshift)};b.isArguments=function(a){return a&&b.isNumber(a.length)&&!b.isArray(a)&&!r.call(a,"length")};b.isFunction=function(a){return!!(a&&a.constructor&&a.call&&a.apply)};b.isString=function(a){return!!(a===""||a&&a.charCodeAt&&a.substr)};b.isNumber=function(a){return p.call(a)==="[object Number]"};b.isDate=function(a){return!!(a&&a.getTimezoneOffset&&a.setUTCFullYear)};b.isRegExp=function(a){return!!(a&&
21a.test&&a.exec&&(a.ignoreCase||a.ignoreCase===false))};b.isNaN=function(a){return b.isNumber(a)&&isNaN(a)};b.isNull=function(a){return a===null};b.isUndefined=function(a){return typeof a=="undefined"};b.noConflict=function(){j._=n;return this};b.identity=function(a){return a};b.breakLoop=function(){throw m;};var s=0;b.uniqueId=function(a){var c=s++;return a?a+c:c};b.template=function(a,c){a=new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+a.replace(/[\r\t\n]/g,
22" ").replace(/'(?=[^%]*%>)/g,"\t").split("'").join("\\'").split("\t").join("'").replace(/<%=(.+?)%>/g,"',$1,'").split("<%").join("');").split("%>").join("p.push('")+"');}return p.join('');");return c?a(c):a};b.forEach=b.each;b.foldl=b.inject=b.reduce;b.foldr=b.reduceRight;b.filter=b.select;b.every=b.all;b.some=b.any;b.head=b.first;b.tail=b.rest;b.methods=b.functions;var l=function(a,c){return c?b(a).chain():a};b.each(b.functions(b),function(a){var c=b[a];i.prototype[a]=function(){var d=b.toArray(arguments);
23o.call(d,this._wrapped);return l(c.apply(b,d),this._chain)}});b.each(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){c.apply(this._wrapped,arguments);return l(this._wrapped,this._chain)}});b.each(["concat","join","slice"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){return l(c.apply(this._wrapped,arguments),this._chain)}});i.prototype.chain=function(){this._chain=true;return this};i.prototype.value=function(){return this._wrapped}})();
240
=== removed file 'src/postorius/doc/_build/html/_static/up-pressed.png'
25Binary files src/postorius/doc/_build/html/_static/up-pressed.png 2012-05-29 06:28:56 +0000 and src/postorius/doc/_build/html/_static/up-pressed.png 1970-01-01 00:00:00 +0000 differ1Binary files src/postorius/doc/_build/html/_static/up-pressed.png 2012-05-29 06:28:56 +0000 and src/postorius/doc/_build/html/_static/up-pressed.png 1970-01-01 00:00:00 +0000 differ
=== removed file 'src/postorius/doc/_build/html/_static/up.png'
26Binary files src/postorius/doc/_build/html/_static/up.png 2012-05-29 06:28:56 +0000 and src/postorius/doc/_build/html/_static/up.png 1970-01-01 00:00:00 +0000 differ2Binary files src/postorius/doc/_build/html/_static/up.png 2012-05-29 06:28:56 +0000 and src/postorius/doc/_build/html/_static/up.png 1970-01-01 00:00:00 +0000 differ
=== removed file 'src/postorius/doc/_build/html/_static/websupport.js'
--- src/postorius/doc/_build/html/_static/websupport.js 2012-05-29 06:28:56 +0000
+++ src/postorius/doc/_build/html/_static/websupport.js 1970-01-01 00:00:00 +0000
@@ -1,808 +0,0 @@
1/*
2 * websupport.js
3 * ~~~~~~~~~~~~~
4 *
5 * sphinx.websupport utilties for all documentation.
6 *
7 * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
8 * :license: BSD, see LICENSE for details.
9 *
10 */
11
12(function($) {
13 $.fn.autogrow = function() {
14 return this.each(function() {
15 var textarea = this;
16
17 $.fn.autogrow.resize(textarea);
18
19 $(textarea)
20 .focus(function() {
21 textarea.interval = setInterval(function() {
22 $.fn.autogrow.resize(textarea);
23 }, 500);
24 })
25 .blur(function() {
26 clearInterval(textarea.interval);
27 });
28 });
29 };
30
31 $.fn.autogrow.resize = function(textarea) {
32 var lineHeight = parseInt($(textarea).css('line-height'), 10);
33 var lines = textarea.value.split('\n');
34 var columns = textarea.cols;
35 var lineCount = 0;
36 $.each(lines, function() {
37 lineCount += Math.ceil(this.length / columns) || 1;
38 });
39 var height = lineHeight * (lineCount + 1);
40 $(textarea).css('height', height);
41 };
42})(jQuery);
43
44(function($) {
45 var comp, by;
46
47 function init() {
48 initEvents();
49 initComparator();
50 }
51
52 function initEvents() {
53 $('a.comment-close').live("click", function(event) {
54 event.preventDefault();
55 hide($(this).attr('id').substring(2));
56 });
57 $('a.vote').live("click", function(event) {
58 event.preventDefault();
59 handleVote($(this));
60 });
61 $('a.reply').live("click", function(event) {
62 event.preventDefault();
63 openReply($(this).attr('id').substring(2));
64 });
65 $('a.close-reply').live("click", function(event) {
66 event.preventDefault();
67 closeReply($(this).attr('id').substring(2));
68 });
69 $('a.sort-option').live("click", function(event) {
70 event.preventDefault();
71 handleReSort($(this));
72 });
73 $('a.show-proposal').live("click", function(event) {
74 event.preventDefault();
75 showProposal($(this).attr('id').substring(2));
76 });
77 $('a.hide-proposal').live("click", function(event) {
78 event.preventDefault();
79 hideProposal($(this).attr('id').substring(2));
80 });
81 $('a.show-propose-change').live("click", function(event) {
82 event.preventDefault();
83 showProposeChange($(this).attr('id').substring(2));
84 });
85 $('a.hide-propose-change').live("click", function(event) {
86 event.preventDefault();
87 hideProposeChange($(this).attr('id').substring(2));
88 });
89 $('a.accept-comment').live("click", function(event) {
90 event.preventDefault();
91 acceptComment($(this).attr('id').substring(2));
92 });
93 $('a.delete-comment').live("click", function(event) {
94 event.preventDefault();
95 deleteComment($(this).attr('id').substring(2));
96 });
97 $('a.comment-markup').live("click", function(event) {
98 event.preventDefault();
99 toggleCommentMarkupBox($(this).attr('id').substring(2));
100 });
101 }
102
103 /**
104 * Set comp, which is a comparator function used for sorting and
105 * inserting comments into the list.
106 */
107 function setComparator() {
108 // If the first three letters are "asc", sort in ascending order
109 // and remove the prefix.
110 if (by.substring(0,3) == 'asc') {
111 var i = by.substring(3);
112 comp = function(a, b) { return a[i] - b[i]; };
113 } else {
114 // Otherwise sort in descending order.
115 comp = function(a, b) { return b[by] - a[by]; };
116 }
117
118 // Reset link styles and format the selected sort option.
119 $('a.sel').attr('href', '#').removeClass('sel');
120 $('a.by' + by).removeAttr('href').addClass('sel');
121 }
122
123 /**
124 * Create a comp function. If the user has preferences stored in
125 * the sortBy cookie, use those, otherwise use the default.
126 */
127 function initComparator() {
128 by = 'rating'; // Default to sort by rating.
129 // If the sortBy cookie is set, use that instead.
130 if (document.cookie.length > 0) {
131 var start = document.cookie.indexOf('sortBy=');
132 if (start != -1) {
133 start = start + 7;
134 var end = document.cookie.indexOf(";", start);
135 if (end == -1) {
136 end = document.cookie.length;
137 by = unescape(document.cookie.substring(start, end));
138 }
139 }
140 }
141 setComparator();
142 }
143
144 /**
145 * Show a comment div.
146 */
147 function show(id) {
148 $('#ao' + id).hide();
149 $('#ah' + id).show();
150 var context = $.extend({id: id}, opts);
151 var popup = $(renderTemplate(popupTemplate, context)).hide();
152 popup.find('textarea[name="proposal"]').hide();
153 popup.find('a.by' + by).addClass('sel');
154 var form = popup.find('#cf' + id);
155 form.submit(function(event) {
156 event.preventDefault();
157 addComment(form);
158 });
159 $('#s' + id).after(popup);
160 popup.slideDown('fast', function() {
161 getComments(id);
162 });
163 }
164
165 /**
166 * Hide a comment div.
167 */
168 function hide(id) {
169 $('#ah' + id).hide();
170 $('#ao' + id).show();
171 var div = $('#sc' + id);
172 div.slideUp('fast', function() {
173 div.remove();
174 });
175 }
176
177 /**
178 * Perform an ajax request to get comments for a node
179 * and insert the comments into the comments tree.
180 */
181 function getComments(id) {
182 $.ajax({
183 type: 'GET',
184 url: opts.getCommentsURL,
185 data: {node: id},
186 success: function(data, textStatus, request) {
187 var ul = $('#cl' + id);
188 var speed = 100;
189 $('#cf' + id)
190 .find('textarea[name="proposal"]')
191 .data('source', data.source);
192
193 if (data.comments.length === 0) {
194 ul.html('<li>No comments yet.</li>');
195 ul.data('empty', true);
196 } else {
197 // If there are comments, sort them and put them in the list.
198 var comments = sortComments(data.comments);
199 speed = data.comments.length * 100;
200 appendComments(comments, ul);
201 ul.data('empty', false);
202 }
203 $('#cn' + id).slideUp(speed + 200);
204 ul.slideDown(speed);
205 },
206 error: function(request, textStatus, error) {
207 showError('Oops, there was a problem retrieving the comments.');
208 },
209 dataType: 'json'
210 });
211 }
212
213 /**
214 * Add a comment via ajax and insert the comment into the comment tree.
215 */
216 function addComment(form) {
217 var node_id = form.find('input[name="node"]').val();
218 var parent_id = form.find('input[name="parent"]').val();
219 var text = form.find('textarea[name="comment"]').val();
220 var proposal = form.find('textarea[name="proposal"]').val();
221
222 if (text == '') {
223 showError('Please enter a comment.');
224 return;
225 }
226
227 // Disable the form that is being submitted.
228 form.find('textarea,input').attr('disabled', 'disabled');
229
230 // Send the comment to the server.
231 $.ajax({
232 type: "POST",
233 url: opts.addCommentURL,
234 dataType: 'json',
235 data: {
236 node: node_id,
237 parent: parent_id,
238 text: text,
239 proposal: proposal
240 },
241 success: function(data, textStatus, error) {
242 // Reset the form.
243 if (node_id) {
244 hideProposeChange(node_id);
245 }
246 form.find('textarea')
247 .val('')
248 .add(form.find('input'))
249 .removeAttr('disabled');
250 var ul = $('#cl' + (node_id || parent_id));
251 if (ul.data('empty')) {
252 $(ul).empty();
253 ul.data('empty', false);
254 }
255 insertComment(data.comment);
256 var ao = $('#ao' + node_id);
257 ao.find('img').attr({'src': opts.commentBrightImage});
258 if (node_id) {
259 // if this was a "root" comment, remove the commenting box
260 // (the user can get it back by reopening the comment popup)
261 $('#ca' + node_id).slideUp();
262 }
263 },
264 error: function(request, textStatus, error) {
265 form.find('textarea,input').removeAttr('disabled');
266 showError('Oops, there was a problem adding the comment.');
267 }
268 });
269 }
270
271 /**
272 * Recursively append comments to the main comment list and children
273 * lists, creating the comment tree.
274 */
275 function appendComments(comments, ul) {
276 $.each(comments, function() {
277 var div = createCommentDiv(this);
278 ul.append($(document.createElement('li')).html(div));
279 appendComments(this.children, div.find('ul.comment-children'));
280 // To avoid stagnating data, don't store the comments children in data.
281 this.children = null;
282 div.data('comment', this);
283 });
284 }
285
286 /**
287 * After adding a new comment, it must be inserted in the correct
288 * location in the comment tree.
289 */
290 function insertComment(comment) {
291 var div = createCommentDiv(comment);
292
293 // To avoid stagnating data, don't store the comments children in data.
294 comment.children = null;
295 div.data('comment', comment);
296
297 var ul = $('#cl' + (comment.node || comment.parent));
298 var siblings = getChildren(ul);
299
300 var li = $(document.createElement('li'));
301 li.hide();
302
303 // Determine where in the parents children list to insert this comment.
304 for(i=0; i < siblings.length; i++) {
305 if (comp(comment, siblings[i]) <= 0) {
306 $('#cd' + siblings[i].id)
307 .parent()
308 .before(li.html(div));
309 li.slideDown('fast');
310 return;
311 }
312 }
313
314 // If we get here, this comment rates lower than all the others,
315 // or it is the only comment in the list.
316 ul.append(li.html(div));
317 li.slideDown('fast');
318 }
319
320 function acceptComment(id) {
321 $.ajax({
322 type: 'POST',
323 url: opts.acceptCommentURL,
324 data: {id: id},
325 success: function(data, textStatus, request) {
326 $('#cm' + id).fadeOut('fast');
327 $('#cd' + id).removeClass('moderate');
328 },
329 error: function(request, textStatus, error) {
330 showError('Oops, there was a problem accepting the comment.');
331 }
332 });
333 }
334
335 function deleteComment(id) {
336 $.ajax({
337 type: 'POST',
338 url: opts.deleteCommentURL,
339 data: {id: id},
340 success: function(data, textStatus, request) {
341 var div = $('#cd' + id);
342 if (data == 'delete') {
343 // Moderator mode: remove the comment and all children immediately
344 div.slideUp('fast', function() {
345 div.remove();
346 });
347 return;
348 }
349 // User mode: only mark the comment as deleted
350 div
351 .find('span.user-id:first')
352 .text('[deleted]').end()
353 .find('div.comment-text:first')
354 .text('[deleted]').end()
355 .find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id +
356 ', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id)
357 .remove();
358 var comment = div.data('comment');
359 comment.username = '[deleted]';
360 comment.text = '[deleted]';
361 div.data('comment', comment);
362 },
363 error: function(request, textStatus, error) {
364 showError('Oops, there was a problem deleting the comment.');
365 }
366 });
367 }
368
369 function showProposal(id) {
370 $('#sp' + id).hide();
371 $('#hp' + id).show();
372 $('#pr' + id).slideDown('fast');
373 }
374
375 function hideProposal(id) {
376 $('#hp' + id).hide();
377 $('#sp' + id).show();
378 $('#pr' + id).slideUp('fast');
379 }
380
381 function showProposeChange(id) {
382 $('#pc' + id).hide();
383 $('#hc' + id).show();
384 var textarea = $('#pt' + id);
385 textarea.val(textarea.data('source'));
386 $.fn.autogrow.resize(textarea[0]);
387 textarea.slideDown('fast');
388 }
389
390 function hideProposeChange(id) {
391 $('#hc' + id).hide();
392 $('#pc' + id).show();
393 var textarea = $('#pt' + id);
394 textarea.val('').removeAttr('disabled');
395 textarea.slideUp('fast');
396 }
397
398 function toggleCommentMarkupBox(id) {
399 $('#mb' + id).toggle();
400 }
401
402 /** Handle when the user clicks on a sort by link. */
403 function handleReSort(link) {
404 var classes = link.attr('class').split(/\s+/);
405 for (var i=0; i<classes.length; i++) {
406 if (classes[i] != 'sort-option') {
407 by = classes[i].substring(2);
408 }
409 }
410 setComparator();
411 // Save/update the sortBy cookie.
412 var expiration = new Date();
413 expiration.setDate(expiration.getDate() + 365);
414 document.cookie= 'sortBy=' + escape(by) +
415 ';expires=' + expiration.toUTCString();
416 $('ul.comment-ul').each(function(index, ul) {
417 var comments = getChildren($(ul), true);
418 comments = sortComments(comments);
419 appendComments(comments, $(ul).empty());
420 });
421 }
422
423 /**
424 * Function to process a vote when a user clicks an arrow.
425 */
426 function handleVote(link) {
427 if (!opts.voting) {
428 showError("You'll need to login to vote.");
429 return;
430 }
431
432 var id = link.attr('id');
433 if (!id) {
434 // Didn't click on one of the voting arrows.
435 return;
436 }
437 // If it is an unvote, the new vote value is 0,
438 // Otherwise it's 1 for an upvote, or -1 for a downvote.
439 var value = 0;
440 if (id.charAt(1) != 'u') {
441 value = id.charAt(0) == 'u' ? 1 : -1;
442 }
443 // The data to be sent to the server.
444 var d = {
445 comment_id: id.substring(2),
446 value: value
447 };
448
449 // Swap the vote and unvote links.
450 link.hide();
451 $('#' + id.charAt(0) + (id.charAt(1) == 'u' ? 'v' : 'u') + d.comment_id)
452 .show();
453
454 // The div the comment is displayed in.
455 var div = $('div#cd' + d.comment_id);
456 var data = div.data('comment');
457
458 // If this is not an unvote, and the other vote arrow has
459 // already been pressed, unpress it.
460 if ((d.value !== 0) && (data.vote === d.value * -1)) {
461 $('#' + (d.value == 1 ? 'd' : 'u') + 'u' + d.comment_id).hide();
462 $('#' + (d.value == 1 ? 'd' : 'u') + 'v' + d.comment_id).show();
463 }
464
465 // Update the comments rating in the local data.
466 data.rating += (data.vote === 0) ? d.value : (d.value - data.vote);
467 data.vote = d.value;
468 div.data('comment', data);
469
470 // Change the rating text.
471 div.find('.rating:first')
472 .text(data.rating + ' point' + (data.rating == 1 ? '' : 's'));
473
474 // Send the vote information to the server.
475 $.ajax({
476 type: "POST",
477 url: opts.processVoteURL,
478 data: d,
479 error: function(request, textStatus, error) {
480 showError('Oops, there was a problem casting that vote.');
481 }
482 });
483 }
484
485 /**
486 * Open a reply form used to reply to an existing comment.
487 */
488 function openReply(id) {
489 // Swap out the reply link for the hide link
490 $('#rl' + id).hide();
491 $('#cr' + id).show();
492
493 // Add the reply li to the children ul.
494 var div = $(renderTemplate(replyTemplate, {id: id})).hide();
495 $('#cl' + id)
496 .prepend(div)
497 // Setup the submit handler for the reply form.
498 .find('#rf' + id)
499 .submit(function(event) {
500 event.preventDefault();
501 addComment($('#rf' + id));
502 closeReply(id);
503 })
504 .find('input[type=button]')
505 .click(function() {
506 closeReply(id);
507 });
508 div.slideDown('fast', function() {
509 $('#rf' + id).find('textarea').focus();
510 });
511 }
512
513 /**
514 * Close the reply form opened with openReply.
515 */
516 function closeReply(id) {
517 // Remove the reply div from the DOM.
518 $('#rd' + id).slideUp('fast', function() {
519 $(this).remove();
520 });
521
522 // Swap out the hide link for the reply link
523 $('#cr' + id).hide();
524 $('#rl' + id).show();
525 }
526
527 /**
528 * Recursively sort a tree of comments using the comp comparator.
529 */
530 function sortComments(comments) {
531 comments.sort(comp);
532 $.each(comments, function() {
533 this.children = sortComments(this.children);
534 });
535 return comments;
536 }
537
538 /**
539 * Get the children comments from a ul. If recursive is true,
540 * recursively include childrens' children.
541 */
542 function getChildren(ul, recursive) {
543 var children = [];
544 ul.children().children("[id^='cd']")
545 .each(function() {
546 var comment = $(this).data('comment');
547 if (recursive)
548 comment.children = getChildren($(this).find('#cl' + comment.id), true);
549 children.push(comment);
550 });
551 return children;
552 }
553
554 /** Create a div to display a comment in. */
555 function createCommentDiv(comment) {
556 if (!comment.displayed && !opts.moderator) {
557 return $('<div class="moderate">Thank you! Your comment will show up '
558 + 'once it is has been approved by a moderator.</div>');
559 }
560 // Prettify the comment rating.
561 comment.pretty_rating = comment.rating + ' point' +
562 (comment.rating == 1 ? '' : 's');
563 // Make a class (for displaying not yet moderated comments differently)
564 comment.css_class = comment.displayed ? '' : ' moderate';
565 // Create a div for this comment.
566 var context = $.extend({}, opts, comment);
567 var div = $(renderTemplate(commentTemplate, context));
568
569 // If the user has voted on this comment, highlight the correct arrow.
570 if (comment.vote) {
571 var direction = (comment.vote == 1) ? 'u' : 'd';
572 div.find('#' + direction + 'v' + comment.id).hide();
573 div.find('#' + direction + 'u' + comment.id).show();
574 }
575
576 if (opts.moderator || comment.text != '[deleted]') {
577 div.find('a.reply').show();
578 if (comment.proposal_diff)
579 div.find('#sp' + comment.id).show();
580 if (opts.moderator && !comment.displayed)
581 div.find('#cm' + comment.id).show();
582 if (opts.moderator || (opts.username == comment.username))
583 div.find('#dc' + comment.id).show();
584 }
585 return div;
586 }
587
588 /**
589 * A simple template renderer. Placeholders such as <%id%> are replaced
590 * by context['id'] with items being escaped. Placeholders such as <#id#>
591 * are not escaped.
592 */
593 function renderTemplate(template, context) {
594 var esc = $(document.createElement('div'));
595
596 function handle(ph, escape) {
597 var cur = context;
598 $.each(ph.split('.'), function() {
599 cur = cur[this];
600 });
601 return escape ? esc.text(cur || "").html() : cur;
602 }
603
604 return template.replace(/<([%#])([\w\.]*)\1>/g, function() {
605 return handle(arguments[2], arguments[1] == '%' ? true : false);
606 });
607 }
608
609 /** Flash an error message briefly. */
610 function showError(message) {
611 $(document.createElement('div')).attr({'class': 'popup-error'})
612 .append($(document.createElement('div'))
613 .attr({'class': 'error-message'}).text(message))
614 .appendTo('body')
615 .fadeIn("slow")
616 .delay(2000)
617 .fadeOut("slow");
618 }
619
620 /** Add a link the user uses to open the comments popup. */
621 $.fn.comment = function() {
622 return this.each(function() {
623 var id = $(this).attr('id').substring(1);
624 var count = COMMENT_METADATA[id];
625 var title = count + ' comment' + (count == 1 ? '' : 's');
626 var image = count > 0 ? opts.commentBrightImage : opts.commentImage;
627 var addcls = count == 0 ? ' nocomment' : '';
628 $(this)
629 .append(
630 $(document.createElement('a')).attr({
631 href: '#',
632 'class': 'sphinx-comment-open' + addcls,
633 id: 'ao' + id
634 })
635 .append($(document.createElement('img')).attr({
636 src: image,
637 alt: 'comment',
638 title: title
639 }))
640 .click(function(event) {
641 event.preventDefault();
642 show($(this).attr('id').substring(2));
643 })
644 )
645 .append(
646 $(document.createElement('a')).attr({
647 href: '#',
648 'class': 'sphinx-comment-close hidden',
649 id: 'ah' + id
650 })
651 .append($(document.createElement('img')).attr({
652 src: opts.closeCommentImage,
653 alt: 'close',
654 title: 'close'
655 }))
656 .click(function(event) {
657 event.preventDefault();
658 hide($(this).attr('id').substring(2));
659 })
660 );
661 });
662 };
663
664 var opts = {
665 processVoteURL: '/_process_vote',
666 addCommentURL: '/_add_comment',
667 getCommentsURL: '/_get_comments',
668 acceptCommentURL: '/_accept_comment',
669 deleteCommentURL: '/_delete_comment',
670 commentImage: '/static/_static/comment.png',
671 closeCommentImage: '/static/_static/comment-close.png',
672 loadingImage: '/static/_static/ajax-loader.gif',
673 commentBrightImage: '/static/_static/comment-bright.png',
674 upArrow: '/static/_static/up.png',
675 downArrow: '/static/_static/down.png',
676 upArrowPressed: '/static/_static/up-pressed.png',
677 downArrowPressed: '/static/_static/down-pressed.png',
678 voting: false,
679 moderator: false
680 };
681
682 if (typeof COMMENT_OPTIONS != "undefined") {
683 opts = jQuery.extend(opts, COMMENT_OPTIONS);
684 }
685
686 var popupTemplate = '\
687 <div class="sphinx-comments" id="sc<%id%>">\
688 <p class="sort-options">\
689 Sort by:\
690 <a href="#" class="sort-option byrating">best rated</a>\
691 <a href="#" class="sort-option byascage">newest</a>\
692 <a href="#" class="sort-option byage">oldest</a>\
693 </p>\
694 <div class="comment-header">Comments</div>\
695 <div class="comment-loading" id="cn<%id%>">\
696 loading comments... <img src="<%loadingImage%>" alt="" /></div>\
697 <ul id="cl<%id%>" class="comment-ul"></ul>\
698 <div id="ca<%id%>">\
699 <p class="add-a-comment">Add a comment\
700 (<a href="#" class="comment-markup" id="ab<%id%>">markup</a>):</p>\
701 <div class="comment-markup-box" id="mb<%id%>">\
702 reStructured text markup: <i>*emph*</i>, <b>**strong**</b>, \
703 <tt>``code``</tt>, \
704 code blocks: <tt>::</tt> and an indented block after blank line</div>\
705 <form method="post" id="cf<%id%>" class="comment-form" action="">\
706 <textarea name="comment" cols="80"></textarea>\
707 <p class="propose-button">\
708 <a href="#" id="pc<%id%>" class="show-propose-change">\
709 Propose a change &#9657;\
710 </a>\
711 <a href="#" id="hc<%id%>" class="hide-propose-change">\
712 Propose a change &#9663;\
713 </a>\
714 </p>\
715 <textarea name="proposal" id="pt<%id%>" cols="80"\
716 spellcheck="false"></textarea>\
717 <input type="submit" value="Add comment" />\
718 <input type="hidden" name="node" value="<%id%>" />\
719 <input type="hidden" name="parent" value="" />\
720 </form>\
721 </div>\
722 </div>';
723
724 var commentTemplate = '\
725 <div id="cd<%id%>" class="sphinx-comment<%css_class%>">\
726 <div class="vote">\
727 <div class="arrow">\
728 <a href="#" id="uv<%id%>" class="vote" title="vote up">\
729 <img src="<%upArrow%>" />\
730 </a>\
731 <a href="#" id="uu<%id%>" class="un vote" title="vote up">\
732 <img src="<%upArrowPressed%>" />\
733 </a>\
734 </div>\
735 <div class="arrow">\
736 <a href="#" id="dv<%id%>" class="vote" title="vote down">\
737 <img src="<%downArrow%>" id="da<%id%>" />\
738 </a>\
739 <a href="#" id="du<%id%>" class="un vote" title="vote down">\
740 <img src="<%downArrowPressed%>" />\
741 </a>\
742 </div>\
743 </div>\
744 <div class="comment-content">\
745 <p class="tagline comment">\
746 <span class="user-id"><%username%></span>\
747 <span class="rating"><%pretty_rating%></span>\
748 <span class="delta"><%time.delta%></span>\
749 </p>\
750 <div class="comment-text comment"><#text#></div>\
751 <p class="comment-opts comment">\
752 <a href="#" class="reply hidden" id="rl<%id%>">reply &#9657;</a>\
753 <a href="#" class="close-reply" id="cr<%id%>">reply &#9663;</a>\
754 <a href="#" id="sp<%id%>" class="show-proposal">proposal &#9657;</a>\
755 <a href="#" id="hp<%id%>" class="hide-proposal">proposal &#9663;</a>\
756 <a href="#" id="dc<%id%>" class="delete-comment hidden">delete</a>\
757 <span id="cm<%id%>" class="moderation hidden">\
758 <a href="#" id="ac<%id%>" class="accept-comment">accept</a>\
759 </span>\
760 </p>\
761 <pre class="proposal" id="pr<%id%>">\
762<#proposal_diff#>\
763 </pre>\
764 <ul class="comment-children" id="cl<%id%>"></ul>\
765 </div>\
766 <div class="clearleft"></div>\
767 </div>\
768 </div>';
769
770 var replyTemplate = '\
771 <li>\
772 <div class="reply-div" id="rd<%id%>">\
773 <form id="rf<%id%>">\
774 <textarea name="comment" cols="80"></textarea>\
775 <input type="submit" value="Add reply" />\
776 <input type="button" value="Cancel" />\
777 <input type="hidden" name="parent" value="<%id%>" />\
778 <input type="hidden" name="node" value="" />\
779 </form>\
780 </div>\
781 </li>';
782
783 $(document).ready(function() {
784 init();
785 });
786})(jQuery);
787
788$(document).ready(function() {
789 // add comment anchors for all paragraphs that are commentable
790 $('.sphinx-has-comment').comment();
791
792 // highlight search words in search results
793 $("div.context").each(function() {
794 var params = $.getQueryParameters();
795 var terms = (params.q) ? params.q[0].split(/\s+/) : [];
796 var result = $(this);
797 $.each(terms, function() {
798 result.highlightText(this.toLowerCase(), 'highlighted');
799 });
800 });
801
802 // directly open comment window if requested
803 var anchor = document.location.hash;
804 if (anchor.substring(0, 9) == '#comment-') {
805 $('#ao' + anchor.substring(9)).click();
806 document.location.hash = '#s' + anchor.substring(9);
807 }
808});
8090
=== removed file 'src/postorius/doc/_build/html/acknowledgements.html'
--- src/postorius/doc/_build/html/acknowledgements.html 2012-03-23 22:54:46 +0000
+++ src/postorius/doc/_build/html/acknowledgements.html 1970-01-01 00:00:00 +0000
@@ -1,158 +0,0 @@
1
2
3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
6<html xmlns="http://www.w3.org/1999/xhtml">
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9
10 <title>Acknowledgements &mdash; mailmanweb v0.1 documentation</title>
11 <link rel="stylesheet" href="_static/default.css" type="text/css" />
12 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
13 <script type="text/javascript">
14 var DOCUMENTATION_OPTIONS = {
15 URL_ROOT: '',
16 VERSION: '0.1',
17 COLLAPSE_INDEX: false,
18 FILE_SUFFIX: '.html',
19 HAS_SOURCE: true
20 };
21 </script>
22 <script type="text/javascript" src="_static/jquery.js"></script>
23 <script type="text/javascript" src="_static/underscore.js"></script>
24 <script type="text/javascript" src="_static/doctools.js"></script>
25 <link rel="top" title="mailmanweb v0.1 documentation" href="index.html" />
26 </head>
27 <body>
28 <div class="related">
29 <h3>Navigation</h3>
30 <ul>
31 <li class="right" style="margin-right: 10px">
32 <a href="genindex.html" title="General Index"
33 accesskey="I">index</a></li>
34 <li class="right" >
35 <a href="py-modindex.html" title="Python Module Index"
36 >modules</a> |</li>
37 <li><a href="index.html">mailmanweb v0.1 documentation</a> &raquo;</li>
38 </ul>
39 </div>
40
41 <div class="document">
42 <div class="documentwrapper">
43 <div class="bodywrapper">
44 <div class="body">
45
46 <div class="section" id="acknowledgements">
47<h1>Acknowledgements<a class="headerlink" href="#acknowledgements" title="Permalink to this headline">¶</a></h1>
48<div class="section" id="test-server">
49<h2>Test Server<a class="headerlink" href="#test-server" title="Permalink to this headline">¶</a></h2>
50<p>We&#8217;re proud to provide you a development server which is sponsered by XXX #Todo
51Feel free to change anything you like, we can simply rest the DB from Time to Time.</p>
52</div>
53<div class="section" id="missing-functionality">
54<h2>Missing Functionality<a class="headerlink" href="#missing-functionality" title="Permalink to this headline">¶</a></h2>
55<ul>
56<li><dl class="first docutils">
57<dt>Delete Domain</dt>
58<dd><ul class="first last simple">
59<li>missing in REST</li>
60<li>implemented in mailman3 a8</li>
61</ul>
62</dd>
63</dl>
64</li>
65<li><p class="first">Show a List of all subscribed users</p>
66</li>
67</ul>
68</div>
69<div class="section" id="acl">
70<h2>ACL<a class="headerlink" href="#acl" title="Permalink to this headline">¶</a></h2>
71<ul>
72<li><p class="first">Middleware</p>
73<blockquote>
74<div><p>We don&#8217;t have the Middleware which is required to work with users and it&#8217;s permissions yet. For this reason we had to tweak some functions to be a hardcoded Demo object.</p>
75<ul>
76<li><dl class="first docutils">
77<dt>Login Check</dt>
78<dd><p class="first last">At the moment we&#8217;re using a hardcoded List of allowed usernames and Passwords which are all stored in Plain within the AuthBackends Source File.</p>
79</dd>
80</dl>
81</li>
82<li><dl class="first docutils">
83<dt>has_perm Decorator</dt>
84<dd><p class="first last">As we don&#8217;t have a middleware to check for users and it&#8217;s permissions we do only use one permission at the moment. The permission site domain_admin is hardcoded to user.username == &#8220;<a class="reference external" href="mailto:james&#37;&#52;&#48;example&#46;com">james<span>&#64;</span>example<span>&#46;</span>com</a>&#8220;</p>
85</dd>
86</dl>
87</li>
88</ul>
89</div></blockquote>
90</li>
91</ul>
92</div>
93<div class="section" id="ideas">
94<h2>Ideas<a class="headerlink" href="#ideas" title="Permalink to this headline">¶</a></h2>
95<ul class="simple">
96<li>ContactPage</li>
97<li></li>
98</ul>
99</div>
100</div>
101
102
103 </div>
104 </div>
105 </div>
106 <div class="sphinxsidebar">
107 <div class="sphinxsidebarwrapper">
108 <h3><a href="index.html">Table Of Contents</a></h3>
109 <ul>
110<li><a class="reference internal" href="#">Acknowledgements</a><ul>
111<li><a class="reference internal" href="#test-server">Test Server</a></li>
112<li><a class="reference internal" href="#missing-functionality">Missing Functionality</a></li>
113<li><a class="reference internal" href="#acl">ACL</a></li>
114<li><a class="reference internal" href="#ideas">Ideas</a></li>
115</ul>
116</li>
117</ul>
118
119 <h3>This Page</h3>
120 <ul class="this-page-menu">
121 <li><a href="_sources/acknowledgements.txt"
122 rel="nofollow">Show Source</a></li>
123 </ul>
124<div id="searchbox" style="display: none">
125 <h3>Quick search</h3>
126 <form class="search" action="search.html" method="get">
127 <input type="text" name="q" size="18" />
128 <input type="submit" value="Go" />
129 <input type="hidden" name="check_keywords" value="yes" />
130 <input type="hidden" name="area" value="default" />
131 </form>
132 <p class="searchtip" style="font-size: 90%">
133 Enter search terms or a module, class or function name.
134 </p>
135</div>
136<script type="text/javascript">$('#searchbox').show(0);</script>
137 </div>
138 </div>
139 <div class="clearer"></div>
140 </div>
141 <div class="related">
142 <h3>Navigation</h3>
143 <ul>
144 <li class="right" style="margin-right: 10px">
145 <a href="genindex.html" title="General Index"
146 >index</a></li>
147 <li class="right" >
148 <a href="py-modindex.html" title="Python Module Index"
149 >modules</a> |</li>
150 <li><a href="index.html">mailmanweb v0.1 documentation</a> &raquo;</li>
151 </ul>
152 </div>
153 <div class="footer">
154 &copy; Copyright 2011, Benedict Stein.
155 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7.
156 </div>
157 </body>
158</html>
159\ No newline at end of file0\ No newline at end of file
1601
=== removed file 'src/postorius/doc/_build/html/development.html'
--- src/postorius/doc/_build/html/development.html 2012-11-04 19:54:09 +0000
+++ src/postorius/doc/_build/html/development.html 1970-01-01 00:00:00 +0000
@@ -1,362 +0,0 @@
1
2
3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
6
7<html xmlns="http://www.w3.org/1999/xhtml">
8 <head>
9 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
10
11 <title>Development &mdash; Postorius 1.0a2 documentation</title>
12
13 <link rel="stylesheet" href="_static/default.css" type="text/css" />
14 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
15
16 <script type="text/javascript">
17 var DOCUMENTATION_OPTIONS = {
18 URL_ROOT: '',
19 VERSION: '1.0a2',
20 COLLAPSE_INDEX: false,
21 FILE_SUFFIX: '.html',
22 HAS_SOURCE: true
23 };
24 </script>
25 <script type="text/javascript" src="_static/jquery.js"></script>
26 <script type="text/javascript" src="_static/underscore.js"></script>
27 <script type="text/javascript" src="_static/doctools.js"></script>
28 <link rel="top" title="Postorius 1.0a2 documentation" href="index.html" />
29 <link rel="prev" title="Installation" href="setup.html" />
30 </head>
31 <body>
32 <div class="related">
33 <h3>Navigation</h3>
34 <ul>
35 <li class="right" style="margin-right: 10px">
36 <a href="genindex.html" title="General Index"
37 accesskey="I">index</a></li>
38 <li class="right" >
39 <a href="py-modindex.html" title="Python Module Index"
40 >modules</a> |</li>
41 <li class="right" >
42 <a href="setup.html" title="Installation"
43 accesskey="P">previous</a> |</li>
44 <li><a href="index.html">Postorius 1.0a2 documentation</a> &raquo;</li>
45 </ul>
46 </div>
47
48 <div class="document">
49 <div class="documentwrapper">
50 <div class="bodywrapper">
51 <div class="body">
52
53 <div class="section" id="development">
54<h1>Development<a class="headerlink" href="#development" title="Permalink to this headline">¶</a></h1>
55<p>This is a short guide to help you get started with Postorius development.</p>
56<div class="section" id="directory-layout">
57<h2>Directory layout<a class="headerlink" href="#directory-layout" title="Permalink to this headline">¶</a></h2>
58<p>Postorius is a Django application, so if you have developed with Django before,
59the file structure probably looks familiar. These are the basics:</p>
60<div class="highlight-python"><pre>__init__.py
61auth/ # Custom authorization code (List owners and
62 # moderators)
63context_processors.py # Some variables available in all templates
64doc/ # Sphinx documentation
65fieldset_forms.py # A custom form class to build html forms with
66 # fieldsets
67forms.py # All kinds of classes to build and validate forms
68management/ # Commands to use with Django's manage.py script
69models.py # Code to connect to mailman.client and provide
70 # a Django-style model API for lists, mm-users and
71 # domains
72static/ # Static files (CSS, JS, images)
73templates/ # HTML Templates
74tests/ # Postorius test files
75urls.py # URL routes
76utils.py # Some handy utilities
77views/
78 views.py # View classes and functions for all views connected
79 # in urls.py
80 generic.py # Generic class-based views; Currently holds a
81 # class for views based on a single mailing list</pre>
82</div>
83</div>
84<div class="section" id="development-workflow">
85<h2>Development Workflow<a class="headerlink" href="#development-workflow" title="Permalink to this headline">¶</a></h2>
86<p>The source code is hosted on <a class="reference external" href="https://launchpad.net">Launchpad</a>, which also means that we are using
87Bazaar for version control.</p>
88<p>Changes are usually not made directly in the project&#8217;s trunk branch, but in
89feature-related personal branches, which get reviewed and then merged into
90the trunk.</p>
91<p>The ideal workflow would be like this:</p>
92<ol class="arabic simple">
93<li>File a bug to suggest a new feature or report a bug (or just pick one of
94the existing bugs).</li>
95<li>Create a new branch with your code changes.</li>
96<li>Make a &#8220;merge proposal&#8221; to get your code reviewed and merged.</li>
97</ol>
98<p>Launchpad has a nice <a class="reference external" href="https://launchpad.net/+tour/index">tour</a> which describes all this in detail.</p>
99</div>
100<div class="section" id="writing-view-code">
101<h2>Writing View Code<a class="headerlink" href="#writing-view-code" title="Permalink to this headline">¶</a></h2>
102<p>When the work on Postorius was started, the standard way to write view code in
103Django was to write a single function for each different view. Since then
104Django has introduced so-called &#8216;class-based views&#8217; which make it much easier
105to reuse view functionality. While using simple functions is not discuraged, it
106makes sense to check if using a class-based approach could make sense.</p>
107<p>Check Postorius&#8217; <tt class="docutils literal"><span class="pre">views/views.py</span></tt> and <tt class="docutils literal"><span class="pre">views/generic.py</span></tt> for examples!</p>
108</div>
109<div class="section" id="authentication-authorization">
110<h2>Authentication/Authorization<a class="headerlink" href="#authentication-authorization" title="Permalink to this headline">¶</a></h2>
111<p>Three of Django&#8217;s default User roles are relvant for Postorius:</p>
112<ul class="simple">
113<li>Superuser: Can do everything.</li>
114<li>AnonymousUser: Can view list index and info pages.</li>
115<li>Authenticated users: Can view list index and info pages. Can (un)subscribe
116from lists.</li>
117</ul>
118<p>Apart from these default roles, there are two others relevant in Postorius:</p>
119<ul class="simple">
120<li>List owners: Can change list settings, moderate messages and delete their
121lists.</li>
122<li>List moderators: Can moderate messages.</li>
123</ul>
124<p>There are a number of decorators to protect views from unauthorized users.</p>
125<ul class="simple">
126<li><tt class="docutils literal"><span class="pre">&#64;user_passes_test(lambda</span> <span class="pre">u:</span> <span class="pre">u.is_superuser)</span></tt> (redirects to login form)</li>
127<li><tt class="docutils literal"><span class="pre">&#64;login_required</span></tt> (redirects to login form)</li>
128<li><tt class="docutils literal"><span class="pre">&#64;list_owner_required</span></tt> (returns 403)</li>
129<li><tt class="docutils literal"><span class="pre">&#64;list_moderator_required</span></tt> (returns 403)</li>
130<li><tt class="docutils literal"><span class="pre">&#64;superuser_or_403</span></tt> (returns 403)</li>
131<li><tt class="docutils literal"><span class="pre">&#64;loggedin_or_403</span></tt> (returns 403)</li>
132<li><tt class="docutils literal"><span class="pre">&#64;basic_auth_login</span></tt></li>
133</ul>
134<p>Check out <tt class="docutils literal"><span class="pre">views/views.py</span></tt> or <tt class="docutils literal"><span class="pre">views/api.py</span></tt> for examples!</p>
135<p>The last one (basic_auth_login) checks the request header for HTTP Basic Auth
136credentials and uses those to authenticate against Django&#8217;s session-based
137mechanism. It can be used in cases where a view is accessed from other clients
138than the web browser.</p>
139<p>Please make sure to put it outside the other auth decorators.</p>
140<p>Good:</p>
141<div class="highlight-python"><div class="highlight"><pre><span class="nd">@basic_auth_login</span>
142<span class="nd">@list_owner_required</span>
143<span class="k">def</span> <span class="nf">my_view_func</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
144 <span class="o">...</span>
145</pre></div>
146</div>
147<p>Won&#8217;t work, because list_owner_required will not recognize the user:</p>
148<div class="highlight-python"><div class="highlight"><pre><span class="nd">@list_owner_required</span>
149<span class="nd">@basic_auth_login</span>
150<span class="k">def</span> <span class="nf">my_view_func</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
151 <span class="o">...</span>
152</pre></div>
153</div>
154</div>
155<div class="section" id="accessing-the-mailman-api">
156<h2>Accessing the Mailman API<a class="headerlink" href="#accessing-the-mailman-api" title="Permalink to this headline">¶</a></h2>
157<p>Postorius uses mailman.client to connect to Mailman&#8217;s REST API. In order to
158directly use the client, <tt class="docutils literal"><span class="pre">cd</span></tt> to your project folder and execute
159<tt class="docutils literal"><span class="pre">python</span> <span class="pre">manage.py</span> <span class="pre">mmclient</span></tt>. This will open a python shell (IPython, if
160that&#8217;s available) and provide you with a client object connected to to your
161local Mailman API server (it uses the credentials from your settings.py).</p>
162<p>A quick example:</p>
163<div class="highlight-python"><pre>$ python manage.py mmclient
164
165&gt;&gt;&gt; client
166&lt;Client (user:pwd) http://localhost:8001/3.0/&gt;
167
168&gt;&gt;&gt; print client.system['mailman_version']
169GNU Mailman 3.0.0b2+ (Here Again)
170
171&gt;&gt;&gt; mailman_dev = client.get_list('mailman-developers@python.org')
172&gt;&gt;&gt; print mailman_dev settings
173{u'owner_address': u'mailman-developers@python.org',
174 u'default_nonmember_action': u'hold', ...}</pre>
175</div>
176<p>For detailed information how to use mailman.client, check out its <a class="reference external" href="http://bazaar.launchpad.net/~mailman-coders/mailman.client/trunk/view/head:/src/mailmanclient/docs/using.txt">documentation</a>.</p>
177</div>
178<div class="section" id="testing">
179<h2>Testing<a class="headerlink" href="#testing" title="Permalink to this headline">¶</a></h2>
180<p>Currently only some of the Postorius code is covered by a test. We should change that!</p>
181<p>All test modules reside in the <tt class="docutils literal"><span class="pre">postorius/src/postorius/tests</span></tt> directory
182and this is where you should put your own tests, too. To make the django test
183runner find your tests, make sure to add them to the folder&#8217;s <tt class="docutils literal"><span class="pre">__init__.py</span></tt>:</p>
184<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">postorius.tests</span> <span class="kn">import</span> <span class="n">test_utils</span>
185<span class="kn">from</span> <span class="nn">postorius.tests.test_list_members</span> <span class="kn">import</span> <span class="n">ListMembersViewTest</span>
186<span class="kn">from</span> <span class="nn">postorius.tests.test_list_settings</span> <span class="kn">import</span> <span class="n">ListSettingsViewTest</span>
187<span class="kn">from</span> <span class="nn">postorius.tests.my_own_tests</span> <span class="kn">import</span> <span class="n">MyOwnUnitTest</span>
188
189<span class="n">__test__</span> <span class="o">=</span> <span class="p">{</span>
190 <span class="s">&quot;Test Utils&quot;</span><span class="p">:</span> <span class="n">test_utils</span><span class="p">,</span>
191 <span class="s">&quot;List Members&quot;</span><span class="p">:</span> <span class="n">ListMembersViewTest</span><span class="p">,</span>
192 <span class="s">&quot;List Settings&quot;</span><span class="p">:</span> <span class="n">ListSettingsViewTest</span><span class="p">,</span>
193 <span class="s">&quot;My Own Test&quot;</span><span class="p">:</span> <span class="n">MyOwnUnitTest</span><span class="p">,</span>
194<span class="p">}</span>
195</pre></div>
196</div>
197<div class="section" id="running-the-tests">
198<h3>Running the tests<a class="headerlink" href="#running-the-tests" title="Permalink to this headline">¶</a></h3>
199<p>To run the tests go to your project folder and run <tt class="docutils literal"><span class="pre">python</span> <span class="pre">manage.py</span> <span class="pre">test</span>
200<span class="pre">postorius</span></tt> from there.</p>
201</div>
202<div class="section" id="testing-mailman-client-results">
203<h3>Testing mailman.client results<a class="headerlink" href="#testing-mailman-client-results" title="Permalink to this headline">¶</a></h3>
204<p>Most of Postorius&#8217; code involves some results from calls to the mailman.client
205library. mailman.client is itself covered by tests, so Postorius&#8217; own tests
206don&#8217;t need to check if mailman.client returns correct results. Instead we can
207just mock them! This has the big advantage that you can run the test suite
208without having to worry about the state of the local Mailman database. It also
209makes the tests run faster, because we spare ourselves the HTTP calls to the
210local Mailman REST API.</p>
211<p>This approach has the obvious downside that the Postorius tests will not
212recognize any changes to the Mailman API. So at some point there should be some
213separate integration tests to test the whole chain. But let&#8217;s not worry about
214that for now.</p>
215</div>
216<div class="section" id="mocking-mailman-client-objects">
217<h3>Mocking mailman.client objects<a class="headerlink" href="#mocking-mailman-client-objects" title="Permalink to this headline">¶</a></h3>
218<p>Postorius uses Michael Foord&#8217;s <tt class="docutils literal"><span class="pre">mock</span></tt> library for mocking. There are some
219shortcuts you can use to quickly create mock objects that behave a little bit
220like objects retreived from mailman.client, like:</p>
221<ul class="simple">
222<li>create_mock_domain</li>
223<li>create_mock_list</li>
224<li>create_mock_member</li>
225</ul>
226<p>These <tt class="docutils literal"><span class="pre">create_mock_*</span></tt> functions are very simple tools that return MagigMock objects with the properties passed to them in a dictionary. They also set some defaults for properties that you didn&#8217;t pass to its <tt class="docutils literal"><span class="pre">create_mock_*</span></tt> function. For instance, a mock list created with <tt class="docutils literal"><span class="pre">create_mock_list()</span></tt> will always have <tt class="docutils literal"><span class="pre">members</span></tt>, <tt class="docutils literal"><span class="pre">moderators</span></tt> and <tt class="docutils literal"><span class="pre">owners</span></tt> properties.</p>
227<span class="target" id="module-postorius.tests.test_utils"></span><div class="section" id="domains">
228<h4>Domains<a class="headerlink" href="#domains" title="Permalink to this headline">¶</a></h4>
229<p><tt class="docutils literal"><span class="pre">postorius.tests.utils.create_mock_domain</span></tt> creates a mock domain object:</p>
230<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">properties</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">contact_address</span><span class="o">=</span><span class="s">&#39;postmaster@example.org&#39;</span><span class="p">,</span>
231<span class="gp">... </span> <span class="n">description</span><span class="o">=</span><span class="s">&#39;Example dot Org&#39;</span><span class="p">,</span>
232<span class="gp">... </span> <span class="n">mail_host</span><span class="o">=</span><span class="s">&#39;example.org&#39;</span><span class="p">,</span>
233<span class="gp">... </span> <span class="n">url_host</span><span class="o">=</span><span class="s">&#39;www.example.org&#39;</span><span class="p">)</span>
234<span class="gp">&gt;&gt;&gt; </span><span class="n">mock_domain</span> <span class="o">=</span> <span class="n">create_mock_domain</span><span class="p">(</span><span class="n">properties</span><span class="p">)</span>
235<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">mock_domain</span>
236<span class="go">&lt;MagicMock name=&#39;Domain&#39; id=&#39;...&#39;&gt;</span>
237<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">mock_domain</span><span class="o">.</span><span class="n">contact_address</span>
238<span class="go">postmaster@example.org</span>
239<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">mock_domain</span><span class="o">.</span><span class="n">description</span>
240<span class="go">Example dot Org</span>
241<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">mock_domain</span><span class="o">.</span><span class="n">mail_host</span>
242<span class="go">example.org</span>
243<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">mock_domain</span><span class="o">.</span><span class="n">url_host</span>
244<span class="go">www.example.org</span>
245</pre></div>
246</div>
247</div>
248<div class="section" id="mailing-lists">
249<h4>Mailing Lists<a class="headerlink" href="#mailing-lists" title="Permalink to this headline">¶</a></h4>
250<p><tt class="docutils literal"><span class="pre">postorius.tests.utils.create_mock_list</span></tt> creates a mock list object:</p>
251<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">properties</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">fqdn_listname</span><span class="o">=</span><span class="s">&#39;testlist@example.org&#39;</span><span class="p">,</span>
252<span class="gp">... </span> <span class="n">mail_host</span><span class="o">=</span><span class="s">&#39;example.org&#39;</span><span class="p">,</span>
253<span class="gp">... </span> <span class="n">list_name</span><span class="o">=</span><span class="s">&#39;testlist&#39;</span><span class="p">,</span>
254<span class="gp">... </span> <span class="n">display_name</span><span class="o">=</span><span class="s">&#39;Test List&#39;</span><span class="p">)</span>
255<span class="gp">&gt;&gt;&gt; </span><span class="n">mock_list</span> <span class="o">=</span> <span class="n">create_mock_list</span><span class="p">(</span><span class="n">properties</span><span class="p">)</span>
256<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">mock_list</span>
257<span class="go">&lt;MagicMock name=&#39;List&#39; id=&#39;...&#39;&gt;</span>
258<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">mock_list</span><span class="o">.</span><span class="n">fqdn_listname</span>
259<span class="go">testlist@example.org</span>
260<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">mock_list</span><span class="o">.</span><span class="n">mail_host</span>
261<span class="go">example.org</span>
262<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">mock_list</span><span class="o">.</span><span class="n">list_name</span>
263<span class="go">testlist</span>
264<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">mock_list</span><span class="o">.</span><span class="n">display_name</span>
265<span class="go">Test List</span>
266</pre></div>
267</div>
268</div>
269<div class="section" id="memberships">
270<h4>Memberships<a class="headerlink" href="#memberships" title="Permalink to this headline">¶</a></h4>
271<p><tt class="docutils literal"><span class="pre">postorius.tests.utils.create_mock_list</span></tt> creates a mock list object:</p>
272<div class="highlight-python"><div class="highlight"><pre><span class="gp">&gt;&gt;&gt; </span><span class="n">properties</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">fqdn_listname</span><span class="o">=</span><span class="s">&#39;testlist@example.org&#39;</span><span class="p">,</span>
273<span class="gp">... </span> <span class="n">address</span><span class="o">=</span><span class="s">&#39;les@example.org&#39;</span><span class="p">,)</span>
274<span class="gp">&gt;&gt;&gt; </span><span class="n">mock_member</span> <span class="o">=</span> <span class="n">create_mock_member</span><span class="p">(</span><span class="n">properties</span><span class="p">)</span>
275<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">mock_member</span>
276<span class="go">&lt;MagicMock name=&#39;Member&#39; id=&#39;...&#39;&gt;</span>
277<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">mock_member</span><span class="o">.</span><span class="n">fqdn_listname</span>
278<span class="go">testlist@example.org</span>
279<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span> <span class="n">mock_member</span><span class="o">.</span><span class="n">address</span>
280<span class="go">les@example.org</span>
281</pre></div>
282</div>
283</div>
284</div>
285</div>
286</div>
287
288
289 </div>
290 </div>
291 </div>
292 <div class="sphinxsidebar">
293 <div class="sphinxsidebarwrapper">
294 <h3><a href="index.html">Table Of Contents</a></h3>
295 <ul>
296<li><a class="reference internal" href="#">Development</a><ul>
297<li><a class="reference internal" href="#directory-layout">Directory layout</a></li>
298<li><a class="reference internal" href="#development-workflow">Development Workflow</a></li>
299<li><a class="reference internal" href="#writing-view-code">Writing View Code</a></li>
300<li><a class="reference internal" href="#authentication-authorization">Authentication/Authorization</a></li>
301<li><a class="reference internal" href="#accessing-the-mailman-api">Accessing the Mailman API</a></li>
302<li><a class="reference internal" href="#testing">Testing</a><ul>
303<li><a class="reference internal" href="#running-the-tests">Running the tests</a></li>
304<li><a class="reference internal" href="#testing-mailman-client-results">Testing mailman.client results</a></li>
305<li><a class="reference internal" href="#mocking-mailman-client-objects">Mocking mailman.client objects</a><ul>
306<li><a class="reference internal" href="#domains">Domains</a></li>
307<li><a class="reference internal" href="#mailing-lists">Mailing Lists</a></li>
308<li><a class="reference internal" href="#memberships">Memberships</a></li>
309</ul>
310</li>
311</ul>
312</li>
313</ul>
314</li>
315</ul>
316
317 <h4>Previous topic</h4>
318 <p class="topless"><a href="setup.html"
319 title="previous chapter">Installation</a></p>
320 <h3>This Page</h3>
321 <ul class="this-page-menu">
322 <li><a href="_sources/development.txt"
323 rel="nofollow">Show Source</a></li>
324 </ul>
325<div id="searchbox" style="display: none">
326 <h3>Quick search</h3>
327 <form class="search" action="search.html" method="get">
328 <input type="text" name="q" />
329 <input type="submit" value="Go" />
330 <input type="hidden" name="check_keywords" value="yes" />
331 <input type="hidden" name="area" value="default" />
332 </form>
333 <p class="searchtip" style="font-size: 90%">
334 Enter search terms or a module, class or function name.
335 </p>
336</div>
337<script type="text/javascript">$('#searchbox').show(0);</script>
338 </div>
339 </div>
340 <div class="clearer"></div>
341 </div>
342 <div class="related">
343 <h3>Navigation</h3>
344 <ul>
345 <li class="right" style="margin-right: 10px">
346 <a href="genindex.html" title="General Index"
347 >index</a></li>
348 <li class="right" >
349 <a href="py-modindex.html" title="Python Module Index"
350 >modules</a> |</li>
351 <li class="right" >
352 <a href="setup.html" title="Installation"
353 >previous</a> |</li>
354 <li><a href="index.html">Postorius 1.0a2 documentation</a> &raquo;</li>
355 </ul>
356 </div>
357 <div class="footer">
358 &copy; Copyright 2012, The Free Software Foundation.
359 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
360 </div>
361 </body>
362</html>
363\ No newline at end of file0\ No newline at end of file
3641
=== removed file 'src/postorius/doc/_build/html/genindex.html'
--- src/postorius/doc/_build/html/genindex.html 2012-10-05 15:45:38 +0000
+++ src/postorius/doc/_build/html/genindex.html 1970-01-01 00:00:00 +0000
@@ -1,123 +0,0 @@
1
2
3
4
5<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
6 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
7
8
9<html xmlns="http://www.w3.org/1999/xhtml">
10 <head>
11 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
12
13 <title>Index &mdash; Postorius 1.0a2 documentation</title>
14
15 <link rel="stylesheet" href="_static/default.css" type="text/css" />
16 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
17
18 <script type="text/javascript">
19 var DOCUMENTATION_OPTIONS = {
20 URL_ROOT: '',
21 VERSION: '1.0a2',
22 COLLAPSE_INDEX: false,
23 FILE_SUFFIX: '.html',
24 HAS_SOURCE: true
25 };
26 </script>
27 <script type="text/javascript" src="_static/jquery.js"></script>
28 <script type="text/javascript" src="_static/underscore.js"></script>
29 <script type="text/javascript" src="_static/doctools.js"></script>
30 <link rel="top" title="Postorius 1.0a2 documentation" href="index.html" />
31 </head>
32 <body>
33 <div class="related">
34 <h3>Navigation</h3>
35 <ul>
36 <li class="right" style="margin-right: 10px">
37 <a href="#" title="General Index"
38 accesskey="I">index</a></li>
39 <li class="right" >
40 <a href="py-modindex.html" title="Python Module Index"
41 >modules</a> |</li>
42 <li><a href="index.html">Postorius 1.0a2 documentation</a> &raquo;</li>
43 </ul>
44 </div>
45
46 <div class="document">
47 <div class="documentwrapper">
48 <div class="bodywrapper">
49 <div class="body">
50
51
52<h1 id="index">Index</h1>
53
54<div class="genindex-jumpbox">
55 <a href="#P"><strong>P</strong></a>
56 | <a href="#T"><strong>T</strong></a>
57
58</div>
59<h2 id="P">P</h2>
60<table style="width: 100%" class="indextable genindextable"><tr>
61 <td style="width: 33%" valign="top"><dl>
62
63 <dt><a href="development.html#module-postorius.tests.test_utils">postorius.tests.test_utils (module)</a>
64 </dt>
65
66 </dl></td>
67</tr></table>
68
69<h2 id="T">T</h2>
70<table style="width: 100%" class="indextable genindextable"><tr>
71 <td style="width: 33%" valign="top"><dl>
72
73 <dt><a href="using.html#module-tests.tests">tests.tests (module)</a>
74 </dt>
75
76 </dl></td>
77</tr></table>
78
79
80
81 </div>
82 </div>
83 </div>
84 <div class="sphinxsidebar">
85 <div class="sphinxsidebarwrapper">
86
87
88
89<div id="searchbox" style="display: none">
90 <h3>Quick search</h3>
91 <form class="search" action="search.html" method="get">
92 <input type="text" name="q" />
93 <input type="submit" value="Go" />
94 <input type="hidden" name="check_keywords" value="yes" />
95 <input type="hidden" name="area" value="default" />
96 </form>
97 <p class="searchtip" style="font-size: 90%">
98 Enter search terms or a module, class or function name.
99 </p>
100</div>
101<script type="text/javascript">$('#searchbox').show(0);</script>
102 </div>
103 </div>
104 <div class="clearer"></div>
105 </div>
106 <div class="related">
107 <h3>Navigation</h3>
108 <ul>
109 <li class="right" style="margin-right: 10px">
110 <a href="#" title="General Index"
111 >index</a></li>
112 <li class="right" >
113 <a href="py-modindex.html" title="Python Module Index"
114 >modules</a> |</li>
115 <li><a href="index.html">Postorius 1.0a2 documentation</a> &raquo;</li>
116 </ul>
117 </div>
118 <div class="footer">
119 &copy; Copyright 2012, The Free Software Foundation.
120 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
121 </div>
122 </body>
123</html>
124\ No newline at end of file0\ No newline at end of file
1251
=== removed file 'src/postorius/doc/_build/html/index.html'
--- src/postorius/doc/_build/html/index.html 2012-08-21 19:58:00 +0000
+++ src/postorius/doc/_build/html/index.html 1970-01-01 00:00:00 +0000
@@ -1,116 +0,0 @@
1
2
3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
6
7<html xmlns="http://www.w3.org/1999/xhtml">
8 <head>
9 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
10
11 <title>Postorius - The New Mailman Web UI &mdash; Postorius 1.0a2 documentation</title>
12
13 <link rel="stylesheet" href="_static/default.css" type="text/css" />
14 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
15
16 <script type="text/javascript">
17 var DOCUMENTATION_OPTIONS = {
18 URL_ROOT: '',
19 VERSION: '1.0a2',
20 COLLAPSE_INDEX: false,
21 FILE_SUFFIX: '.html',
22 HAS_SOURCE: true
23 };
24 </script>
25 <script type="text/javascript" src="_static/jquery.js"></script>
26 <script type="text/javascript" src="_static/underscore.js"></script>
27 <script type="text/javascript" src="_static/doctools.js"></script>
28 <link rel="top" title="Postorius 1.0a2 documentation" href="#" />
29 <link rel="next" title="News / Changelog" href="news.html" />
30 </head>
31 <body>
32 <div class="related">
33 <h3>Navigation</h3>
34 <ul>
35 <li class="right" style="margin-right: 10px">
36 <a href="genindex.html" title="General Index"
37 accesskey="I">index</a></li>
38 <li class="right" >
39 <a href="py-modindex.html" title="Python Module Index"
40 >modules</a> |</li>
41 <li class="right" >
42 <a href="news.html" title="News / Changelog"
43 accesskey="N">next</a> |</li>
44 <li><a href="#">Postorius 1.0a2 documentation</a> &raquo;</li>
45 </ul>
46 </div>
47
48 <div class="document">
49 <div class="documentwrapper">
50 <div class="bodywrapper">
51 <div class="body">
52
53 <div class="section" id="postorius-the-new-mailman-web-ui">
54<h1>Postorius - The New Mailman Web UI<a class="headerlink" href="#postorius-the-new-mailman-web-ui" title="Permalink to this headline">¶</a></h1>
55<p>Contents:</p>
56<div class="toctree-wrapper compound">
57<ul>
58<li class="toctree-l1"><a class="reference internal" href="news.html">News / Changelog</a></li>
59<li class="toctree-l1"><a class="reference internal" href="setup.html">Installation</a></li>
60<li class="toctree-l1"><a class="reference internal" href="development.html">Development</a></li>
61</ul>
62</div>
63</div>
64
65
66 </div>
67 </div>
68 </div>
69 <div class="sphinxsidebar">
70 <div class="sphinxsidebarwrapper">
71 <h4>Next topic</h4>
72 <p class="topless"><a href="news.html"
73 title="next chapter">News / Changelog</a></p>
74 <h3>This Page</h3>
75 <ul class="this-page-menu">
76 <li><a href="_sources/index.txt"
77 rel="nofollow">Show Source</a></li>
78 </ul>
79<div id="searchbox" style="display: none">
80 <h3>Quick search</h3>
81 <form class="search" action="search.html" method="get">
82 <input type="text" name="q" />
83 <input type="submit" value="Go" />
84 <input type="hidden" name="check_keywords" value="yes" />
85 <input type="hidden" name="area" value="default" />
86 </form>
87 <p class="searchtip" style="font-size: 90%">
88 Enter search terms or a module, class or function name.
89 </p>
90</div>
91<script type="text/javascript">$('#searchbox').show(0);</script>
92 </div>
93 </div>
94 <div class="clearer"></div>
95 </div>
96 <div class="related">
97 <h3>Navigation</h3>
98 <ul>
99 <li class="right" style="margin-right: 10px">
100 <a href="genindex.html" title="General Index"
101 >index</a></li>
102 <li class="right" >
103 <a href="py-modindex.html" title="Python Module Index"
104 >modules</a> |</li>
105 <li class="right" >
106 <a href="news.html" title="News / Changelog"
107 >next</a> |</li>
108 <li><a href="#">Postorius 1.0a2 documentation</a> &raquo;</li>
109 </ul>
110 </div>
111 <div class="footer">
112 &copy; Copyright 2012, The Free Software Foundation.
113 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
114 </div>
115 </body>
116</html>
117\ No newline at end of file0\ No newline at end of file
1181
=== removed file 'src/postorius/doc/_build/html/license.html'
--- src/postorius/doc/_build/html/license.html 2012-03-23 22:54:46 +0000
+++ src/postorius/doc/_build/html/license.html 1970-01-01 00:00:00 +0000
@@ -1,139 +0,0 @@
1
2
3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
6<html xmlns="http://www.w3.org/1999/xhtml">
7 <head>
8 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9
10 <title>Contributions: &mdash; mailmanweb v0.1 documentation</title>
11 <link rel="stylesheet" href="_static/default.css" type="text/css" />
12 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
13 <script type="text/javascript">
14 var DOCUMENTATION_OPTIONS = {
15 URL_ROOT: '',
16 VERSION: '0.1',
17 COLLAPSE_INDEX: false,
18 FILE_SUFFIX: '.html',
19 HAS_SOURCE: true
20 };
21 </script>
22 <script type="text/javascript" src="_static/jquery.js"></script>
23 <script type="text/javascript" src="_static/underscore.js"></script>
24 <script type="text/javascript" src="_static/doctools.js"></script>
25 <link rel="top" title="mailmanweb v0.1 documentation" href="index.html" />
26 <link rel="prev" title="Acknowledgements" href="acknowledgements.html" />
27 </head>
28 <body>
29 <div class="related">
30 <h3>Navigation</h3>
31 <ul>
32 <li class="right" style="margin-right: 10px">
33 <a href="genindex.html" title="General Index"
34 accesskey="I">index</a></li>
35 <li class="right" >
36 <a href="py-modindex.html" title="Python Module Index"
37 >modules</a> |</li>
38 <li class="right" >
39 <a href="acknowledgements.html" title="Acknowledgements"
40 accesskey="P">previous</a> |</li>
41 <li><a href="index.html">mailmanweb v0.1 documentation</a> &raquo;</li>
42 </ul>
43 </div>
44
45 <div class="document">
46 <div class="documentwrapper">
47 <div class="bodywrapper">
48 <div class="body">
49
50 <div class="section" id="contributions">
51<h1>Contributions:<a class="headerlink" href="#contributions" title="Permalink to this headline">¶</a></h1>
52<div class="section" id="mailman-is-licensed-unter-gpl">
53<h2>Mailman is licensed unter <em>GPL</em><a class="headerlink" href="#mailman-is-licensed-unter-gpl" title="Permalink to this headline">¶</a></h2>
54<p>Copyright (C) 1998-2010 by the Free Software Foundation, Inc.</p>
55<p>This file is part of GNU Mailman.</p>
56<p>GNU Mailman is free software: you can redistribute it and/or modify it under
57the terms of the GNU General Public License as published by the Free
58Software Foundation, either version 3 of the License, or (at your option)
59any later version.</p>
60<p>GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
61ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
62FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
63more details.</p>
64<p>You should have received a copy of the GNU General Public License along with
65GNU Mailman. If not, see &lt;<a class="reference external" href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>&gt;.</p>
66</div>
67<div class="section" id="rrze-icon-set">
68<h2>RRZE Icon Set<a class="headerlink" href="#rrze-icon-set" title="Permalink to this headline">¶</a></h2>
69<p><strong>CreativeCommons Licence</strong></p>
70<p>The RRZE Icon Set is licenced under a Creative Commons Licence.
71Please see the website for the current licence text.</p>
72<p>More information about the Project could be found here:
73<a class="reference external" href="http://rrze-icon-set.berlios.de/licence.html">http://rrze-icon-set.berlios.de/licence.html</a></p>
74<p>Special thanks to:
75* Franziska Sponsel (created additional Icons specially for our Project)</p>
76</div>
77</div>
78
79
80 </div>
81 </div>
82 </div>
83 <div class="sphinxsidebar">
84 <div class="sphinxsidebarwrapper">
85 <h3><a href="index.html">Table Of Contents</a></h3>
86 <ul>
87<li><a class="reference internal" href="#">Contributions:</a><ul>
88<li><a class="reference internal" href="#mailman-is-licensed-unter-gpl">Mailman is licensed unter <em>GPL</em></a></li>
89<li><a class="reference internal" href="#rrze-icon-set">RRZE Icon Set</a></li>
90</ul>
91</li>
92</ul>
93
94 <h4>Previous topic</h4>
95 <p class="topless"><a href="acknowledgements.html"
96 title="previous chapter">Acknowledgements</a></p>
97 <h3>This Page</h3>
98 <ul class="this-page-menu">
99 <li><a href="_sources/license.txt"
100 rel="nofollow">Show Source</a></li>
101 </ul>
102<div id="searchbox" style="display: none">
103 <h3>Quick search</h3>
104 <form class="search" action="search.html" method="get">
105 <input type="text" name="q" size="18" />
106 <input type="submit" value="Go" />
107 <input type="hidden" name="check_keywords" value="yes" />
108 <input type="hidden" name="area" value="default" />
109 </form>
110 <p class="searchtip" style="font-size: 90%">
111 Enter search terms or a module, class or function name.
112 </p>
113</div>
114<script type="text/javascript">$('#searchbox').show(0);</script>
115 </div>
116 </div>
117 <div class="clearer"></div>
118 </div>
119 <div class="related">
120 <h3>Navigation</h3>
121 <ul>
122 <li class="right" style="margin-right: 10px">
123 <a href="genindex.html" title="General Index"
124 >index</a></li>
125 <li class="right" >
126 <a href="py-modindex.html" title="Python Module Index"
127 >modules</a> |</li>
128 <li class="right" >
129 <a href="acknowledgements.html" title="Acknowledgements"
130 >previous</a> |</li>
131 <li><a href="index.html">mailmanweb v0.1 documentation</a> &raquo;</li>
132 </ul>
133 </div>
134 <div class="footer">
135 &copy; Copyright 2011, Benedict Stein.
136 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7.
137 </div>
138 </body>
139</html>
140\ No newline at end of file0\ No newline at end of file
1411
=== removed file 'src/postorius/doc/_build/html/news.html'
--- src/postorius/doc/_build/html/news.html 2012-11-04 19:54:09 +0000
+++ src/postorius/doc/_build/html/news.html 1970-01-01 00:00:00 +0000
@@ -1,186 +0,0 @@
1
2
3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
6
7<html xmlns="http://www.w3.org/1999/xhtml">
8 <head>
9 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
10
11 <title>News / Changelog &mdash; Postorius 1.0a2 documentation</title>
12
13 <link rel="stylesheet" href="_static/default.css" type="text/css" />
14 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
15
16 <script type="text/javascript">
17 var DOCUMENTATION_OPTIONS = {
18 URL_ROOT: '',
19 VERSION: '1.0a2',
20 COLLAPSE_INDEX: false,
21 FILE_SUFFIX: '.html',
22 HAS_SOURCE: true
23 };
24 </script>
25 <script type="text/javascript" src="_static/jquery.js"></script>
26 <script type="text/javascript" src="_static/underscore.js"></script>
27 <script type="text/javascript" src="_static/doctools.js"></script>
28 <link rel="top" title="Postorius 1.0a2 documentation" href="index.html" />
29 <link rel="next" title="Installation" href="setup.html" />
30 <link rel="prev" title="Postorius - The New Mailman Web UI" href="index.html" />
31 </head>
32 <body>
33 <div class="related">
34 <h3>Navigation</h3>
35 <ul>
36 <li class="right" style="margin-right: 10px">
37 <a href="genindex.html" title="General Index"
38 accesskey="I">index</a></li>
39 <li class="right" >
40 <a href="py-modindex.html" title="Python Module Index"
41 >modules</a> |</li>
42 <li class="right" >
43 <a href="setup.html" title="Installation"
44 accesskey="N">next</a> |</li>
45 <li class="right" >
46 <a href="index.html" title="Postorius - The New Mailman Web UI"
47 accesskey="P">previous</a> |</li>
48 <li><a href="index.html">Postorius 1.0a2 documentation</a> &raquo;</li>
49 </ul>
50 </div>
51
52 <div class="document">
53 <div class="documentwrapper">
54 <div class="bodywrapper">
55 <div class="body">
56
57 <div class="section" id="news-changelog">
58<h1>News / Changelog<a class="headerlink" href="#news-changelog" title="Permalink to this headline">¶</a></h1>
59<p>Copyright (C) 2012 by the Free Software Foundation, Inc.</p>
60<p>The Postorius Django app provides a web user interface to
61access GNU Mailman.</p>
62<p>Postorius is free software: you can redistribute it and/or
63modify it under the terms of the GNU Lesser General Public License as
64published by the Free Software Foundation, version 3 of the License.</p>
65<p>Postorius is distributed in the hope that it will be useful,
66but WITHOUT ANY WARRANTY; without even the implied warranty of
67MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
68General Public License for more details.</p>
69<p>You should have received a copy of the GNU Lesser General Public License
70along with Postorius. If not, see &lt;<a class="reference external" href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>&gt;.</p>
71<div class="section" id="alpha-2">
72<h2>1.0 alpha 2<a class="headerlink" href="#alpha-2" title="Permalink to this headline">¶</a></h2>
73<p>(2012-XX-XX)</p>
74<ul class="simple">
75<li>dev setup fix for Django 1.4 contributed by Rohan Jain</li>
76<li>missing csrf tokens in templates contributed by Richard Wackerbarth (LP: 996658)</li>
77<li>moderation: fixed typo in success message call</li>
78<li>installation documentation for Apache/mod_wsgi</li>
79<li>moved project files to separate branch</li>
80<li>show error message if connection to Mailman API fails</li>
81<li>added list members view</li>
82<li>added developer documentation</li>
83<li>added test helper utils</li>
84<li>all code now conform to PEP8</li>
85<li>themes: removed obsolete MAILMAN_THEME settings from templates, contexts, file structure; contributed by Richard Wackerbarth (LP: 1043258)</li>
86<li>added access control for list owners and moderators</li>
87<li>added a mailmanclient shell to use as a <cite>manage.py</cite> command (<cite>python manage.py mmclient</cite>)</li>
88<li>use &#8220;url from future&#8221; template tag in all templates. Contributed by Richard Wackerbarth.</li>
89<li>added &#8220;new user&#8221; form. Contributed by George Chatzisofroniou.</li>
90<li>added user subscription page</li>
91<li>added decorator to allow login via http basic auth (to allow non-browser clients to use API views)</li>
92<li>added api view for list index</li>
93<li>several changes regarding style and navigation structure</li>
94</ul>
95</div>
96<div class="section" id="alpha-1-space-farm">
97<h2>1.0 alpha 1 &#8211; &#8220;Space Farm&#8221;<a class="headerlink" href="#alpha-1-space-farm" title="Permalink to this headline">¶</a></h2>
98<p>(2012-03-23)</p>
99<p>Many thanks go out to Anna Senarclens de Grancy and Benedict Stein for
100developing the initial versions of this Django app during the Google Summer of
101Code 2010 and 2011.</p>
102<ul class="simple">
103<li>add/remove/edit mailing lists</li>
104<li>edit list settings</li>
105<li>show all mailing lists on server</li>
106<li>subscribe/unsubscribe/mass subscribe mailing lists</li>
107<li>add/remove domains</li>
108<li>show basic list info and metrics</li>
109<li>login using django user account or using BrowserID</li>
110<li>show basic user profile</li>
111<li>accept/discard/reject/defer messages</li>
112<li>Implementation of Django Messages contributed by Benedict Stein (LP: #920084)</li>
113<li>Dependency check in setup.py contributed by Daniel Mizyrycki</li>
114<li>Proper processing of acceptable aliases in list settings form contributed by
115Daniel Mizyrycki</li>
116</ul>
117</div>
118</div>
119
120
121 </div>
122 </div>
123 </div>
124 <div class="sphinxsidebar">
125 <div class="sphinxsidebarwrapper">
126 <h3><a href="index.html">Table Of Contents</a></h3>
127 <ul>
128<li><a class="reference internal" href="#">News / Changelog</a><ul>
129<li><a class="reference internal" href="#alpha-2">1.0 alpha 2</a></li>
130<li><a class="reference internal" href="#alpha-1-space-farm">1.0 alpha 1 &#8211; &#8220;Space Farm&#8221;</a></li>
131</ul>
132</li>
133</ul>
134
135 <h4>Previous topic</h4>
136 <p class="topless"><a href="index.html"
137 title="previous chapter">Postorius - The New Mailman Web UI</a></p>
138 <h4>Next topic</h4>
139 <p class="topless"><a href="setup.html"
140 title="next chapter">Installation</a></p>
141 <h3>This Page</h3>
142 <ul class="this-page-menu">
143 <li><a href="_sources/news.txt"
144 rel="nofollow">Show Source</a></li>
145 </ul>
146<div id="searchbox" style="display: none">
147 <h3>Quick search</h3>
148 <form class="search" action="search.html" method="get">
149 <input type="text" name="q" />
150 <input type="submit" value="Go" />
151 <input type="hidden" name="check_keywords" value="yes" />
152 <input type="hidden" name="area" value="default" />
153 </form>
154 <p class="searchtip" style="font-size: 90%">
155 Enter search terms or a module, class or function name.
156 </p>
157</div>
158<script type="text/javascript">$('#searchbox').show(0);</script>
159 </div>
160 </div>
161 <div class="clearer"></div>
162 </div>
163 <div class="related">
164 <h3>Navigation</h3>
165 <ul>
166 <li class="right" style="margin-right: 10px">
167 <a href="genindex.html" title="General Index"
168 >index</a></li>
169 <li class="right" >
170 <a href="py-modindex.html" title="Python Module Index"
171 >modules</a> |</li>
172 <li class="right" >
173 <a href="setup.html" title="Installation"
174 >next</a> |</li>
175 <li class="right" >
176 <a href="index.html" title="Postorius - The New Mailman Web UI"
177 >previous</a> |</li>
178 <li><a href="index.html">Postorius 1.0a2 documentation</a> &raquo;</li>
179 </ul>
180 </div>
181 <div class="footer">
182 &copy; Copyright 2012, The Free Software Foundation.
183 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
184 </div>
185 </body>
186</html>
187\ No newline at end of file0\ No newline at end of file
1881
=== removed file 'src/postorius/doc/_build/html/objects.inv'
--- src/postorius/doc/_build/html/objects.inv 2012-10-05 15:45:38 +0000
+++ src/postorius/doc/_build/html/objects.inv 1970-01-01 00:00:00 +0000
@@ -1,10 +0,0 @@
1# Sphinx inventory version 2
2# Project: Postorius
3# Version: 1.0a2
4# The remainder of this file is compressed using zlib.
5xÚ�ŽM
6Â0F÷9Å€nS̶7p!
7@¢Ò@þh&¢·×v"XÚ…›Y|óÞ|’qÑà0@¢Ò@þh&¢·×v"XÚ…›Y|óÞ|’qÑà
8™Þëz�
9òK†¶è
10~§dªG8N‘°7¤oÚ
11F1F
12êñ>,AÎvaà¬-2êñ>,AÎvaà¬-
13ÂB¥›çç…>pçjqÑ2ϙ܃9J£«Í˜çµ’óKÙà}Ê#­Nlªß¿›Ôºirßél}Ñ
14\ No newline at end of file3\ No newline at end of file
154
=== removed file 'src/postorius/doc/_build/html/py-modindex.html'
--- src/postorius/doc/_build/html/py-modindex.html 2012-10-05 15:45:38 +0000
+++ src/postorius/doc/_build/html/py-modindex.html 1970-01-01 00:00:00 +0000
@@ -1,131 +0,0 @@
1
2
3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
6
7<html xmlns="http://www.w3.org/1999/xhtml">
8 <head>
9 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
10
11 <title>Python Module Index &mdash; Postorius 1.0a2 documentation</title>
12
13 <link rel="stylesheet" href="_static/default.css" type="text/css" />
14 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
15
16 <script type="text/javascript">
17 var DOCUMENTATION_OPTIONS = {
18 URL_ROOT: '',
19 VERSION: '1.0a2',
20 COLLAPSE_INDEX: false,
21 FILE_SUFFIX: '.html',
22 HAS_SOURCE: true
23 };
24 </script>
25 <script type="text/javascript" src="_static/jquery.js"></script>
26 <script type="text/javascript" src="_static/underscore.js"></script>
27 <script type="text/javascript" src="_static/doctools.js"></script>
28 <link rel="top" title="Postorius 1.0a2 documentation" href="index.html" />
29
30
31
32 </head>
33 <body>
34 <div class="related">
35 <h3>Navigation</h3>
36 <ul>
37 <li class="right" style="margin-right: 10px">
38 <a href="genindex.html" title="General Index"
39 accesskey="I">index</a></li>
40 <li class="right" >
41 <a href="#" title="Python Module Index"
42 >modules</a> |</li>
43 <li><a href="index.html">Postorius 1.0a2 documentation</a> &raquo;</li>
44 </ul>
45 </div>
46
47 <div class="document">
48 <div class="documentwrapper">
49 <div class="bodywrapper">
50 <div class="body">
51
52
53 <h1>Python Module Index</h1>
54
55 <div class="modindex-jumpbox">
56 <a href="#cap-p"><strong>p</strong></a> |
57 <a href="#cap-t"><strong>t</strong></a>
58 </div>
59
60 <table class="indextable modindextable" cellspacing="0" cellpadding="2">
61 <tr class="pcap"><td></td><td>&nbsp;</td><td></td></tr>
62 <tr class="cap" id="cap-p"><td></td><td>
63 <strong>p</strong></td><td></td></tr>
64 <tr>
65 <td><img src="_static/minus.png" class="toggler"
66 id="toggle-1" style="display: none" alt="-" /></td>
67 <td>
68 <tt class="xref">postorius</tt></td><td>
69 <em></em></td></tr>
70 <tr class="cg-1">
71 <td></td>
72 <td>&nbsp;&nbsp;&nbsp;
73 <a href="development.html#module-postorius.tests.test_utils"><tt class="xref">postorius.tests.test_utils</tt></a></td><td>
74 <em></em></td></tr>
75 <tr class="pcap"><td></td><td>&nbsp;</td><td></td></tr>
76 <tr class="cap" id="cap-t"><td></td><td>
77 <strong>t</strong></td><td></td></tr>
78 <tr>
79 <td><img src="_static/minus.png" class="toggler"
80 id="toggle-2" style="display: none" alt="-" /></td>
81 <td>
82 <tt class="xref">tests</tt></td><td>
83 <em></em></td></tr>
84 <tr class="cg-2">
85 <td></td>
86 <td>&nbsp;&nbsp;&nbsp;
87 <a href="using.html#module-tests.tests"><tt class="xref">tests.tests</tt></a></td><td>
88 <em></em></td></tr>
89 </table>
90
91
92 </div>
93 </div>
94 </div>
95 <div class="sphinxsidebar">
96 <div class="sphinxsidebarwrapper">
97<div id="searchbox" style="display: none">
98 <h3>Quick search</h3>
99 <form class="search" action="search.html" method="get">
100 <input type="text" name="q" />
101 <input type="submit" value="Go" />
102 <input type="hidden" name="check_keywords" value="yes" />
103 <input type="hidden" name="area" value="default" />
104 </form>
105 <p class="searchtip" style="font-size: 90%">
106 Enter search terms or a module, class or function name.
107 </p>
108</div>
109<script type="text/javascript">$('#searchbox').show(0);</script>
110 </div>
111 </div>
112 <div class="clearer"></div>
113 </div>
114 <div class="related">
115 <h3>Navigation</h3>
116 <ul>
117 <li class="right" style="margin-right: 10px">
118 <a href="genindex.html" title="General Index"
119 >index</a></li>
120 <li class="right" >
121 <a href="#" title="Python Module Index"
122 >modules</a> |</li>
123 <li><a href="index.html">Postorius 1.0a2 documentation</a> &raquo;</li>
124 </ul>
125 </div>
126 <div class="footer">
127 &copy; Copyright 2012, The Free Software Foundation.
128 Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
129 </div>
130 </body>
131</html>
132\ No newline at end of file0\ No newline at end of file
1331
=== removed file 'src/postorius/doc/_build/html/search.html'
--- src/postorius/doc/_build/html/search.html 2012-08-21 19:58:00 +0000
+++ src/postorius/doc/_build/html/search.html 1970-01-01 00:00:00 +0000
@@ -1,105 +0,0 @@
1
2
3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
6
7<html xmlns="http://www.w3.org/1999/xhtml">
8 <head>
9 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
10
11 <title>Search &mdash; Postorius 1.0a2 documentation</title>
12
13 <link rel="stylesheet" href="_static/default.css" type="text/css" />
14 <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
15
16 <script type="text/javascript">
17 var DOCUMENTATION_OPTIONS = {
18 URL_ROOT: '',
19 VERSION: '1.0a2',
20 COLLAPSE_INDEX: false,
21 FILE_SUFFIX: '.html',
22 HAS_SOURCE: true
23 };
24 </script>
25 <script type="text/javascript" src="_static/jquery.js"></script>
26 <script type="text/javascript" src="_static/underscore.js"></script>
27 <script type="text/javascript" src="_static/doctools.js"></script>
28 <script type="text/javascript" src="_static/searchtools.js"></script>
29 <link rel="top" title="Postorius 1.0a2 documentation" href="index.html" />
30 <script type="text/javascript">
31 jQuery(function() { Search.loadIndex("searchindex.js"); });
32 </script>
33
34
35 </head>
36 <body>
37 <div class="related">
38 <h3>Navigation</h3>
39 <ul>
40 <li class="right" style="margin-right: 10px">
41 <a href="genindex.html" title="General Index"
42 accesskey="I">index</a></li>
43 <li class="right" >
44 <a href="py-modindex.html" title="Python Module Index"
45 >modules</a> |</li>
46 <li><a href="index.html">Postorius 1.0a2 documentation</a> &raquo;</li>
47 </ul>
48 </div>
49
50 <div class="document">
51 <div class="documentwrapper">
52 <div class="bodywrapper">
53 <div class="body">
54
55 <h1 id="search-documentation">Search</h1>
56 <div id="fallback" class="admonition warning">
57 <script type="text/javascript">$('#fallback').hide();</script>
58 <p>
59 Please activate JavaScript to enable the search
60 functionality.
61 </p>
62 </div>
63 <p>
64 From here you can search these documents. Enter your search
65 words into the box below and click "search". Note that the search
66 function will automatically search for all of the words. Pages
67 containing fewer words won't appear in the result list.
68 </p>
69 <form action="" method="get">
70 <input type="text" name="q" value="" />
71 <input type="submit" value="search" />
72 <span id="search-progress" style="padding-left: 10px"></span>
73 </form>
74
75 <div id="search-results">
76
77 </div>
78
79 </div>
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches