Moved project files to wolnelektury directory.
authorMarek Stępniowski <marek@stepniowski.com>
Sun, 7 Sep 2008 20:37:22 +0000 (22:37 +0200)
committerMarek Stępniowski <marek@stepniowski.com>
Sun, 7 Sep 2008 20:37:22 +0000 (22:37 +0200)
80 files changed:
README [deleted file]
__init__.py [deleted file]
locale/pl/LC_MESSAGES/django.mo [deleted file]
locale/pl/LC_MESSAGES/django.po [deleted file]
manage.py [deleted file]
media/css/jquery.autocomplete.css [deleted file]
media/css/master.css [deleted file]
media/css/master.plain.css [deleted file]
media/img/bg.png [deleted file]
media/img/book.png [deleted file]
media/img/favicon.png [deleted file]
media/img/footer.png [deleted file]
media/img/indicator.gif [deleted file]
media/img/logo.png [deleted file]
media/js/catalogue.js [deleted file]
media/js/jquery.autocolumn.js [deleted file]
media/js/jquery.autocomplete.js [deleted file]
media/js/jquery.form.js [deleted file]
media/js/jquery.jqmodal.js [deleted file]
media/js/jquery.js [deleted file]
media/js/jquery.labelify.js [deleted file]
middleware.py [deleted file]
settings.py [deleted file]
templates/404.html [deleted file]
templates/admin/base_site.html [deleted file]
templates/auth/login.html [deleted file]
templates/base.html [deleted file]
templates/catalogue/book_detail.html [deleted file]
templates/catalogue/book_list.html [deleted file]
templates/catalogue/book_sets.html [deleted file]
templates/catalogue/book_short.html [deleted file]
templates/catalogue/breadcrumbs.html [deleted file]
templates/catalogue/fragment_sets.html [deleted file]
templates/catalogue/fragment_short.html [deleted file]
templates/catalogue/latest_blog_posts.html [deleted file]
templates/catalogue/main_page.html [deleted file]
templates/catalogue/tagged_object_list.html [deleted file]
templates/catalogue/user_shelves.html [deleted file]
templates/pagination/pagination.html [deleted file]
urls.py [deleted file]
wolnelektury/README [new file with mode: 0644]
wolnelektury/__init__.py [new file with mode: 0644]
wolnelektury/locale/pl/LC_MESSAGES/django.mo [new file with mode: 0644]
wolnelektury/locale/pl/LC_MESSAGES/django.po [new file with mode: 0644]
wolnelektury/manage.py [new file with mode: 0755]
wolnelektury/media/css/jquery.autocomplete.css [new file with mode: 0644]
wolnelektury/media/css/master.css [new file with mode: 0644]
wolnelektury/media/css/master.plain.css [new file with mode: 0644]
wolnelektury/media/img/bg.png [new file with mode: 0644]
wolnelektury/media/img/book.png [new file with mode: 0644]
wolnelektury/media/img/favicon.png [new file with mode: 0644]
wolnelektury/media/img/footer.png [new file with mode: 0644]
wolnelektury/media/img/indicator.gif [new file with mode: 0644]
wolnelektury/media/img/logo.png [new file with mode: 0644]
wolnelektury/media/js/catalogue.js [new file with mode: 0644]
wolnelektury/media/js/jquery.autocolumn.js [new file with mode: 0644]
wolnelektury/media/js/jquery.autocomplete.js [new file with mode: 0644]
wolnelektury/media/js/jquery.form.js [new file with mode: 0644]
wolnelektury/media/js/jquery.jqmodal.js [new file with mode: 0644]
wolnelektury/media/js/jquery.js [new file with mode: 0644]
wolnelektury/media/js/jquery.labelify.js [new file with mode: 0644]
wolnelektury/middleware.py [new file with mode: 0644]
wolnelektury/settings.py [new file with mode: 0644]
wolnelektury/templates/404.html [new file with mode: 0644]
wolnelektury/templates/admin/base_site.html [new file with mode: 0644]
wolnelektury/templates/auth/login.html [new file with mode: 0644]
wolnelektury/templates/base.html [new file with mode: 0644]
wolnelektury/templates/catalogue/book_detail.html [new file with mode: 0644]
wolnelektury/templates/catalogue/book_list.html [new file with mode: 0644]
wolnelektury/templates/catalogue/book_sets.html [new file with mode: 0644]
wolnelektury/templates/catalogue/book_short.html [new file with mode: 0644]
wolnelektury/templates/catalogue/breadcrumbs.html [new file with mode: 0644]
wolnelektury/templates/catalogue/fragment_sets.html [new file with mode: 0644]
wolnelektury/templates/catalogue/fragment_short.html [new file with mode: 0644]
wolnelektury/templates/catalogue/latest_blog_posts.html [new file with mode: 0644]
wolnelektury/templates/catalogue/main_page.html [new file with mode: 0644]
wolnelektury/templates/catalogue/tagged_object_list.html [new file with mode: 0644]
wolnelektury/templates/catalogue/user_shelves.html [new file with mode: 0644]
wolnelektury/templates/pagination/pagination.html [new file with mode: 0644]
wolnelektury/urls.py [new file with mode: 0644]

diff --git a/README b/README
deleted file mode 100644 (file)
index 8c024c0..0000000
--- a/README
+++ /dev/null
@@ -1,5 +0,0 @@
-Dependencies
-============
- * `Django 1.0 <http://djangoproject.com/>`_ (application framework)
- * `lxml 2.0.0 <http://codespeak.net/lxml/>`_ (for importing books)
\ No newline at end of file
diff --git a/__init__.py b/__init__.py
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/locale/pl/LC_MESSAGES/django.mo b/locale/pl/LC_MESSAGES/django.mo
deleted file mode 100644 (file)
index 216cfcd..0000000
Binary files a/locale/pl/LC_MESSAGES/django.mo and /dev/null differ
diff --git a/locale/pl/LC_MESSAGES/django.po b/locale/pl/LC_MESSAGES/django.po
deleted file mode 100644 (file)
index b09ad09..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-09-04 06:17-0500\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: catalogue/models.py:15
-msgid "author"
-msgstr "autor"
-
-#: catalogue/models.py:16
-msgid "epoch"
-msgstr "epoka"
-
-#: catalogue/models.py:17
-msgid "kind"
-msgstr "rodzaj"
-
-#: catalogue/models.py:18
-msgid "genre"
-msgstr "gatunek"
-
-#: catalogue/models.py:19
-msgid "theme"
-msgstr "motyw"
-
-#: catalogue/models.py:20
-msgid "set"
-msgstr "zestaw"
-
-#: catalogue/models.py:34
-msgid "name"
-msgstr "nazwa"
-
-#: catalogue/models.py:35 catalogue/models.py:71
-msgid "slug"
-msgstr "slug"
-
-#: catalogue/models.py:36
-msgid "sort key"
-msgstr "klucz sortowania"
-
-#: catalogue/models.py:37
-msgid "category"
-msgstr "kategoria"
-
-#: catalogue/models.py:45 catalogue/models.py:72 catalogue/models.py:86
-#: chunks/models.py:11
-msgid "description"
-msgstr "opis"
-
-#: catalogue/models.py:54 newtagging/models.py:470
-msgid "tag"
-msgstr "tag"
-
-#: catalogue/models.py:55 newtagging/admin.py:38
-msgid "tags"
-msgstr "tagi"
-
-#: catalogue/models.py:70
-msgid "title"
-msgstr "tytuł"
-
-#: catalogue/models.py:73
-msgid "creation date"
-msgstr "data utworzenia"
-
-#: catalogue/models.py:76
-msgid "XML file"
-msgstr "plik XML"
-
-#: catalogue/models.py:77
-msgid "PDF file"
-msgstr "plik PDF"
-
-#: catalogue/models.py:78
-msgid "ODT file"
-msgstr "plik ODT"
-
-#: catalogue/models.py:79
-msgid "HTML file"
-msgstr "plik HTML"
-
-#: catalogue/models.py:162
-msgid "book"
-msgstr "książka"
-
-#: catalogue/models.py:163
-msgid "books"
-msgstr "książki"
-
-#: catalogue/models.py:180
-msgid "fragment"
-msgstr "fragment"
-
-#: catalogue/models.py:181
-msgid "fragments"
-msgstr "fragmenty"
-
-#: chunks/models.py:10
-msgid "key"
-msgstr "klucz"
-
-#: chunks/models.py:10
-msgid "A unique name for this chunk of content"
-msgstr "Unikalna nazwa dla tego kawałka treści"
-
-#: chunks/models.py:12
-#, fuzzy
-msgid "content"
-msgstr "typ zawartości"
-
-#: chunks/models.py:16
-msgid "chunk"
-msgstr "kawałek"
-
-#: chunks/models.py:17
-msgid "chunks"
-msgstr "kawałki"
-
-#: newtagging/models.py:471
-msgid "content type"
-msgstr "typ zawartości"
-
-#: newtagging/models.py:472
-msgid "object id"
-msgstr "id obiektu"
-
-#: newtagging/views.py:29
-msgid "tagged_object_list must be called with a queryset or a model."
-msgstr ""
-
-#: newtagging/views.py:31
-msgid "tagged_object_list must be called with a tag model."
-msgstr ""
-
-#: newtagging/views.py:33
-msgid "tagged_object_list must be called with a tag."
-msgstr ""
-
-#: newtagging/views.py:37
-#, python-format
-msgid "No tags found matching \"%s\"."
-msgstr "Nie znaleziono tagów zgodnych z \"%s\"."
diff --git a/manage.py b/manage.py
deleted file mode 100755 (executable)
index 5e78ea9..0000000
--- a/manage.py
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env python
-from django.core.management import execute_manager
-try:
-    import settings # Assumed to be in the same directory.
-except ImportError:
-    import sys
-    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
-    sys.exit(1)
-
-if __name__ == "__main__":
-    execute_manager(settings)
diff --git a/media/css/jquery.autocomplete.css b/media/css/jquery.autocomplete.css
deleted file mode 100644 (file)
index 9c5a36d..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-.ac_results {
-       padding: 0px;
-       border: 0.1em solid #999;
-       background-color: #FFF;
-       overflow: hidden;
-       z-index: 99999;
-}
-
-.ac_results ul {
-       width: 100%;
-       list-style-position: outside;
-       list-style: none;
-       padding: 0;
-       margin: 0;
-}
-
-.ac_results li {
-       margin: 0;
-       padding: 0.2em 0.5em;
-       cursor: default;
-       display: block;
-       overflow: hidden;
-}
-
-.ac_loading {
-       background: white url(/media/img/indicator.gif) right center no-repeat;
-}
-
-.ac_odd {
-       background-color: #EEE;
-}
-
-.ac_over {
-       background-color: #0A246A;
-       color: #FFF;
-}
diff --git a/media/css/master.css b/media/css/master.css
deleted file mode 100644 (file)
index 6615ee6..0000000
+++ /dev/null
@@ -1,454 +0,0 @@
-body {
-    margin: 0 2em 2em 2em;
-    font: 70% Verdana, Arial, Helvetica, sans-serif;
-    line-height: 1.5em;
-    background: #FFF url(/media/img/bg.png) repeat-x;
-    color: #2F4110;
-}
-
-img {
-    border: none;
-}
-
-a {
-    color: #295158;
-    text-decoration: none;
-}
-
-a:hover, a:active {
-    text-decoration: underline;
-}
-
-input {
-    font: 1em Verdana, Arial, Helvetica, sans-serif; 
-}
-
-h1 {
-    font: normal normal bold 1.75em Arial, sans-serif;
-    color: #2F4110;
-    margin: 0.55em 0 0 0;
-}
-
-h2 {
-    font-size: 1.2em;
-    font-weight: bold;
-    color: #2F4110;
-    margin: 0;
-}
-
-h3 {
-    font-size: 1.3em;
-    font-weight: bold;
-    margin: 0.2em 0 0 0;
-    color: #333;
-}
-
-em {
-    font-style: normal;
-    background-color: #F5DC7D;
-}
-
-.clearboth {
-    clear: both;
-}
-
-.blur {
-    color: #777;
-}
-
-/* ================================== */
-/* = Header with logo and user-info = */
-/* ================================== */
-#header {
-    position: relative;
-    margin-top: 1.5em;
-}
-
-#header #logo {
-    float: left;
-}
-
-#header #user-info {
-    margin: 0 0 0 auto;
-    width: 40em;
-    text-align: right;
-}
-
-#site-description {
-    margin-top: -1.5em;
-    height:4.5em;
-    overflow: hidden;
-    float: right;
-    width: 42em;
-    text-align: right;
-    color: #777;
-}
-
-/* ======================== */
-/* = Footer with sponsors = */
-/* ======================== */
-#footer {
-    border-top: 0.1em solid #999;
-    color: #999;
-    font-size: 0.8em;
-    padding-top: 0.5em;
-    margin: 2em 0 0 0;
-}
-
-#footer p {
-    margin: 0;
-}
-
-#footer a {
-    color: #999;
-    text-decoration: underline;
-}
-
-
-/* =============== */
-/* = Search form = */
-/* =============== */
-#search-form {
-    margin: 0.5em 0;
-    padding: 0.5em;
-    background-color: rgb(132, 191, 42);
-    -moz-border-radius: 4px;
-    -webkit-border-radius: 4px;
-    border-radius: 4px;
-    border-bottom: 0.15em solid #7B9C2D;
-    border-right: 0.15em solid #7B9C2D;
-}
-
-#search-form p {
-    margin: 0em 0 0 0;
-}
-
-#search-form ol {
-    margin: 0;
-    padding: 0;
-}
-
-#search-form li {
-    margin: 0;
-    padding: 0;
-    list-style: none;
-    display: inline;
-}
-
-#search-form li.category, #search-form li.book-title {
-    padding: 0.2em 0.5em 0.2em 0.5em;
-    background-color: rgb(242, 163, 15);
-    border: 1px solid #BA8722;
-    border-right: 1px solid #555;
-    border-bottom: 1px solid #555;
-    -moz-border-radius: 3px;
-    -webkit-border-radius: 3px;
-    border-radius: 3px;
-}
-
-#search-form li.book-title {
-    background-color: #DDD;
-    border: 1px solid #999;
-    border-right: 1px solid #555;
-    border-bottom: 1px solid #555;
-}
-
-#search-form input[type=submit] {
-    color: #444;
-}
-
-/* TODO: Shouldn't be needed */
-#book-detail #search-form {
-    padding: 0.75em 0.5em;
-}
-
-.ac_input {
-    width: 20em;
-}
-
-
-/* ============= */
-/* = Tags list = */
-/* ============= */
-#tags-list {
-    margin-top: 1em;
-    padding: 1em;
-    background-color: #FBEF90;
-    -moz-border-radius: 4px;
-    -webkit-border-radius: 4px;
-    border-radius: 4px;
-    border-bottom: 0.15em solid #E3D888;
-    border-right: 0.15em solid #E3D888;
-}
-
-#books #tags-list, #book-detail #tags-list {
-    margin-left: 39em;
-}
-
-#tags-list ol, #tags-list ul {
-    padding: 0;
-    margin: 0.3em 0 1.2em 0;
-}
-
-#tags-list li {
-    list-style: none;
-    padding: 0;
-    margin: 0;
-}
-
-#main-page #categories-list {
-    float: left;
-    width: 50%;
-}
-
-#main-page #themes-list {
-    margin-left: 50%;
-}
-
-
-.column {
-    padding-right: 1em;
-}
-
-.last.column {
-    padding-right: 0;
-}
-
-
-#books-list {
-    width: 38em;
-    float: left;
-}
-
-/* ===================== */
-/* = Latest blog posts = */
-/* ===================== */
-#latest-blog-posts {
-    padding: 0.5em;
-    margin-top: 0.5em;
-}
-
-#latest-blog-posts ol {
-    padding: 0 0 0 1.5em;
-    margin: 0.3em 0 0 0;
-    list-style-type: square;
-    color: #D13628;
-}
-
-/* =============== */
-/* = Description = */
-/* =============== */
-#description {
-    margin-top: 0.5em;
-    text-align: justify;
-}
-
-#toggle-description, #books .pagination {
-    width: 100%;
-    height: 1.5em;
-    background-color: #EEE;
-    margin-top: 0.5em;
-    -moz-border-radius: 4px;
-    -webkit-border-radius: 4px;
-    border-radius: 4px;
-    text-align: center;
-}
-
-#toggle-description p {
-    margin: 0;
-    padding: 0;
-    color: #999;
-}
-
-/* ============================ */
-/* = Books and fragments list = */
-/* ============================ */
-#books-list {
-    margin: 0;
-}
-
-#books-list ol {
-    list-style: none;
-    padding: 0;
-    margin: 1.5em 0;
-}
-
-.book {
-    padding: 0.5em;
-    background-color: #FFF;
-    -moz-border-radius: 3px;
-    -webkit-border-radius: 3px;
-    border-radius: 3px;
-}
-
-.fragment {
-    border-bottom: 0.1em solid #EEE;
-    margin-top: 0.5em;
-}
-
-.fragment-text, .fragment-short-text {
-    padding: 0.5em;
-    background-color: #FFF;
-    -moz-border-radius: 3px;
-    -webkit-border-radius: 3px;
-    border-radius: 3px;
-}
-
-.fragment-metadata {
-    padding: 0.5em 0.5em 1.5em 0.5em;
-    float: right;
-}
-
-.change-sets {
-    float: right;
-}
-
-.book-description {
-    margin-left: 3.5em;
-}
-
-.book-thumbnail {
-    background: transparent url(/media/img/book.png) no-repeat 0 0;
-    width: 3em;
-    height: 3em;
-    float: left;
-}
-
-/* =============== */
-/* = Simple form = */
-/* =============== */
-.cuteform ol, .cuteform ul {
-    padding: 0;
-    margin: 0;
-    list-style: none;
-}
-
-.cuteform ol li, .cuteform ul li {
-    margin-top: 0.7em;
-}
-
-.cuteform label {
-    display: block;
-}
-
-.cuteform span.help-text {
-    display: block;
-    font-size: 0.8em;
-    color: #999;
-}
-
-.cuteform .error {
-    color: #BF3024;
-}
-
-/* ================ */
-/* = Modal Window = */
-/* ================ */
-.jqmOverlay { background-color: #000; }
-
-#set-window {
-    position: absolute;
-    display: none;
-    width: 32em;
-    background-color: transparent;
-    margin-top: -0.5em;
-    margin-left: -1em;
-}
-
-#set-window div.header {
-    background-color: #FFF;
-    border-right: 0.25em solid #DDD;
-    width: 4em;
-    padding: 0.5em 1em 0.5em 1em;
-}
-
-#set-window div.target {
-    background-color: #FFF;
-    border-right: 0.3em solid #DDD;
-    border-bottom: 0.3em solid #DDD;
-    padding: 1em;
-}
-
-#login-register-window {
-    position: absolute;
-    display: none;
-    width: 24em;
-    background-color: transparent;
-    margin-top: -0.5em;
-    margin-left: 1em;
-}
-
-#login-register-window div.header {
-    background-color: #FFF;
-    border-right: 0.3em solid #DDD;
-    width: 4em;
-    right: 0;
-    left: auto;
-    padding: 0.5em 1em 0.5em 1em;
-    float: right;
-    text-align: center;
-}
-
-#login-register-window div.target {
-    clear: both;
-    background-color: #FFF;
-    border-right: 0.3em solid #DDD;
-    border-bottom: 0.3em solid #DDD;
-    padding: 1em;
-}
-
-#user-shelves-window {
-    position: absolute;
-    display: none;
-    width: 28em;
-    background-color: transparent;
-    margin-top: -0.5em;
-    margin-left: 1em;
-}
-
-#user-shelves-window div.header {
-    background-color: #FFF;
-    border-right: 0.3em solid #DDD;
-    width: 4em;
-    right: 0;
-    left: auto;
-    padding: 0.5em 1em 0.5em 1em;
-    float: right;
-    text-align: center;
-}
-
-#user-shelves-window div.target {
-    clear: both;
-    background-color: #FFF;
-    border-right: 0.3em solid #DDD;
-    border-bottom: 0.3em solid #DDD;
-    padding: 1em;
-}
-
-#user-shelves-window ul {
-    list-style: none;
-    padding: 0;
-}
-
-#user-shelves-window a.delete-shelf {
-    color: #900;
-    float: right;
-}
-
-/* ======================== */
-/* = Alphabetic book list = */
-/* ======================== */
-#book-a-list #book-list ol {
-    padding: 0;
-    margin: 0.3em 0 1.2em 0;
-    list-style: none;
-}
-
-#top-message {
-    background-color: #2F4110;
-    color: #FFF;
-    margin: 0 -2em;
-    padding: 0 2em;
-    line-height: 2em;
-}
-
diff --git a/media/css/master.plain.css b/media/css/master.plain.css
deleted file mode 100644 (file)
index 55bc023..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-/* =================================================== */
-/* = Common elements: headings, paragraphs and lines = */
-/* =================================================== */
-.fragment h1 {
-    font-size: 3em;
-    margin: 1.5em 0;
-    text-align: center;
-    line-height: 1.5em;
-    font-weight: bold;
-}
-
-.fragment h2 {
-    font-size: 2em;
-    margin: 1.5em 0 0;
-    font-weight: bold;
-    line-height: 1.5em;
-}
-
-.fragment h3 {
-    font-size: 1.5em;
-    margin: 1.5em 0 0;
-    font-weight: normal;
-    line-height: 1.5em;
-}
-
-.fragment h4 {
-    font-size: 1em;
-    margin: 1.5em 0 0;
-    line-height: 1.5em;
-}
-
-.fragment p {
-    margin: 0;
-}
-
-/* ======================== */
-/* = Footnotes and themes = */
-/* ======================== */
-.theme-begin {
-    display: none;
-}
-
-.annotation {
-    display: none;
-}
-
-/* =================== */
-/* = Custom elements = */
-/* =================== */
-span.author {
-    font-size: 0.75em;
-    display: block;
-    line-height: 1.5em;
-    margin-bottom: 0.25em;
-}
-
-span.collection {
-    font-size: 0.75em;
-    display: block;
-    line-height: 1.5em;
-    margin-bottom: -0.25em;
-}
-
-span.subtitle {
-    font-size: 0.75em;
-    display: block;
-    line-height: 1.5em;
-    margin-top: -0.25em;
-}
-
-div.didaskalia {
-    font-style: italic;
-    margin: 0.5em 0 0;
-}
-
-div.kwestia {
-    margin: 0.5em 0 0;
-}
-
-div.stanza {
-    margin: 1.5em 0 0;
-}
-
-div.kwestia div.stanza {
-    margin: 0;
-}
-
-p.paragraph {
-    text-align: justify;
-    margin: 1.5em 0 0;
-}
-
-p.motto {
-    text-align: justify;
-    font-style: italic;
-    margin: 1.5em 0 0;
-}
-
-p.motto_podpis {
-    font-size: 0.875em;
-}
-
-/*div.fragment {
-    border-bottom: 0.1em solid #999;
-    padding-bottom: 1.5em;
-}*/
-
-div.note p, div.note p.paragraph {
-    text-align: right;
-    font-style: italic;
-}
-
-hr.spacer {
-    height: 3em;
-    visibility: hidden;
-}
diff --git a/media/img/bg.png b/media/img/bg.png
deleted file mode 100644 (file)
index be7d63a..0000000
Binary files a/media/img/bg.png and /dev/null differ
diff --git a/media/img/book.png b/media/img/book.png
deleted file mode 100644 (file)
index f264839..0000000
Binary files a/media/img/book.png and /dev/null differ
diff --git a/media/img/favicon.png b/media/img/favicon.png
deleted file mode 100644 (file)
index 6cffce8..0000000
Binary files a/media/img/favicon.png and /dev/null differ
diff --git a/media/img/footer.png b/media/img/footer.png
deleted file mode 100644 (file)
index 7863423..0000000
Binary files a/media/img/footer.png and /dev/null differ
diff --git a/media/img/indicator.gif b/media/img/indicator.gif
deleted file mode 100644 (file)
index 085ccae..0000000
Binary files a/media/img/indicator.gif and /dev/null differ
diff --git a/media/img/logo.png b/media/img/logo.png
deleted file mode 100644 (file)
index bf92ee0..0000000
Binary files a/media/img/logo.png and /dev/null differ
diff --git a/media/js/catalogue.js b/media/js/catalogue.js
deleted file mode 100644 (file)
index ad5a7c2..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-(function($) {
-    $(function() {
-        $('#id_q').labelify({labelledClass: 'blur'});
-        
-        target = $('#login-register-window div.target');
-        
-        $('#show-registration-form').click(function() {
-            $('#login-form').hide();
-            $('#registration-form').show();
-        });
-        
-        $('#show-login-form').click(function() {
-            $('#registration-form').hide();
-            $('#login-form').show();
-        });
-        
-        // Fragments
-        $('.fragment-text').each(function() {
-            if ($(this).prev().filter('.fragment-short-text').length) {
-                $(this).hover(
-                    function() { $(this).css({background: '#F3F3F3', cursor: 'pointer'}); },
-                    function() { $(this).css({background: '#FFF'}); }
-                ).click(function() {
-                    $(this).fadeOut(function() {
-                        $(this).prev().fadeIn()
-                    });
-                })
-            }
-        });
-        
-        $('.fragment-short-text').click(function() {
-            $(this).fadeOut(function() { $(this).next().fadeIn() });
-        }).hover(
-            function() { $(this).css({background: '#F3F3F3', cursor: 'pointer'}); },
-            function() { $(this).css({background: '#FFF'}); }
-        );
-        
-        $('#registration-form').ajaxForm({
-            dataType: 'json',
-            beforeSubmit: function() {
-                $('#registration-form input[type=submit]')
-                    .attr('disabled', 'disabled')
-                    .after('<img src="/media/img/indicator.gif" style="margin-left: 0.5em"/>');
-            },
-            success: function(response) {
-                if (response.success) {
-                    location.reload(true);
-                } else {
-                    $('#registration-form span.error').remove();
-                    $.each(response.errors, function(id, errors) {
-                        $('#id_registration-' + id).before('<span class="error">' + errors[0] + '</span>');
-                    });
-                    $('#registration-form input[type=submit]').removeAttr('disabled');
-                    $('#registration-form img').remove();
-                }
-            }
-        });
-        
-        $('#login-form').ajaxForm({
-            dataType: 'json',
-            beforeSubmit: function() {
-                $('#login-form input[type=submit]')
-                    .attr('disabled', 'disabled')
-                    .after('<img src="/media/img/indicator.gif" style="margin-left: 0.5em"/>');
-            },
-            success: function(response) {
-                if (response.success) {
-                    location.reload(true);
-                } else {
-                    $('#login-form span.error').remove();
-                    $.each(response.errors, function(id, errors) {
-                        $('#id_login-' + id).before('<span class="error">' + errors[0] + '</span>');
-                    });
-                    $('#login-form input[type=submit]').removeAttr('disabled');
-                    $('#login-form img').remove();
-                }
-            }
-        });
-        
-        $('#login-register-window').jqm({
-            target: target[0],
-            overlay: 60,
-            trigger: '#login-register-link',
-            onShow: function(hash) {
-                var offset = $(hash.t).offset();
-                hash.w.css({position: 'absolute', left: offset.left - hash.w.width() + $(hash.t).width(), top: offset.top});
-                $('div.header', hash.w).css({width: $(hash.t).width()});
-                hash.w.show();
-            }
-        });
-        
-        $('#user-shelves-window').jqm({
-            ajax: '@href',
-            target: $('#user-shelves-window div.target')[0],
-            overlay: 60,
-            trigger: '#user-shelves-link',
-            onShow: function(hash) {
-                var offset = $(hash.t).offset();
-                hash.w.css({position: 'absolute', left: offset.left - hash.w.width() + $(hash.t).width(), top: offset.top});
-                $('div.header', hash.w).css({width: $(hash.t).width()});
-                hash.w.show();
-            },
-            onLoad: function(hash) { 
-                var shelf_name = $('a.visit-shelf', this).html();
-                
-                $('form', hash.w).ajaxForm({
-                    target: $('#user-shelves-window div.target'),
-                    success: function() { setTimeout(function() { $('#user-shelves-window').jqmHide() }, 1000) }
-                });
-                
-                $('ul.shelf-list li', hash.w).hover(function() {
-                    $(this).css({background: '#EEE', cursor: 'pointer'});
-                }, function() {
-                    $(this).css({background: 'transparent'});
-                }).click(function() {
-                    location.href = $('a.visit-shelf', this).attr('href');
-                });
-                
-                $('.delete-shelf').click(function() { 
-                    if (confirm('Czy na pewno usunąć półkę ' + shelf_name + '?')) {
-                        $.post($(this).attr('href'), function(data, textStatus) {
-                            $('#user-shelves-window div.target').html(data);
-                            setTimeout(function() { $('#user-shelves-window').jqmHide() }, 1000);
-                        });
-                    }
-                    return false;
-                });
-            }
-        });
-    });
-})(jQuery)
\ No newline at end of file
diff --git a/media/js/jquery.autocolumn.js b/media/js/jquery.autocolumn.js
deleted file mode 100644 (file)
index ea896b6..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-// version 1.1.0
-// http://welcome.totheinter.net/columnizer-jquery-plugin/
-// created by: Adam Wulf adam.wulf@gmail.com
-
-(function($){
- $.fn.columnize = function(options) {
-
-
-       var defaults = {
-               width: 400,
-               columns : false,
-               buildOnce : false
-       };
-       var options = $.extend(defaults, options);
-
-    return this.each(function() {
-           var $inBox = $(this);
-               var maxHeight = $inBox.height();
-               var $cache = $('<div></div>'); // this is where we'll put the real content
-               var lastWidth = 0;
-               var columnizing = false;
-               $cache.append($inBox.children().clone());
-               
-               columnizeIt();
-               
-               $(window).resize(function() {
-                       if(!options.buildOnce && $.browser.msie){
-                               if($inBox.data("timeout")){
-                                       clearTimeout($inBox.data("timeout"));
-                               }
-                               $inBox.data("timeout", setTimeout(columnizeIt, 200));
-                       }else if(!options.buildOnce){
-                               columnizeIt();
-                       }else{
-                               // don't rebuild
-                       }
-               });
-               
-               /**
-                * return a node that has a height
-                * less than or equal to height
-                *
-                * @param putInHere, a dom element
-                * @$pullOutHere, a jQuery element
-                */
-               function columnize($putInHere, $pullOutHere, $parentColumn, height){
-                       while($parentColumn.height() < height &&
-                                 $pullOutHere[0].childNodes.length){
-                               $putInHere.append($pullOutHere[0].childNodes[0]);
-                       }
-                       if($putInHere[0].childNodes.length == 0) return;
-                       
-                       // now we're too tall, undo the last one
-                       var kids = $putInHere[0].childNodes;
-                       var lastKid = kids[kids.length-1];
-                       $putInHere[0].removeChild(lastKid);
-                       var $item = $(lastKid);
-                       if($item[0].nodeType == 3){
-                               // it's a text node, split it up
-                               var oText = $item[0].nodeValue;
-                               var counter2 = options.width / 8;
-                               var columnText;
-                               while($parentColumn.height() < height && oText.length){
-                                       if (oText.indexOf(' ', counter2) != '-1') {
-                                               columnText = oText.substring(0, oText.indexOf(' ', counter2));
-                                       } else {
-                                               columnText = oText;
-                                       }
-                                       $putInHere.append(document.createTextNode(columnText));
-                                       if(oText.length > counter2){
-                                               oText = oText.substring(oText.indexOf(' ', counter2));
-                                       }else{
-                                               oText = "";
-                                       }
-                               }
-                               if(oText.length){
-                                       $item[0].nodeValue = oText;
-                               }else{
-                                       return;
-                               }
-                       }
-                       
-                       if($pullOutHere.children().length){
-                               $pullOutHere.prepend($item);
-                       }else{
-                               $pullOutHere.append($item);
-                       }
-               }
-               
-               function split($putInHere, $pullOutHere, $parentColumn, height){
-                       if($pullOutHere.children().length){
-                               $cloneMe = $pullOutHere.children(":first");
-                               $clone = $cloneMe.clone();
-                               if($clone.attr("nodeType") == 1){ 
-                                       $putInHere.append($clone);
-                                       if($clone.is("img") && $parentColumn.height() < height + 20){
-                                               $cloneMe.remove();
-                                       }else if(!$cloneMe.hasClass("dontsplit") && $parentColumn.height() < height + 20){
-                                               $cloneMe.remove();
-                                       }else if($clone.is("img") || $cloneMe.hasClass("dontsplit")){
-                                               $clone.remove();
-                                       }else{
-                                               $clone.empty();
-                                               columnize($clone, $cloneMe, $parentColumn, height);
-                                               if($cloneMe.children().length){
-                                                       split($clone, $cloneMe, $parentColumn, height);
-                                               }
-                                       }
-                               }
-                       }
-               }
-               
-               
-               function singleColumnizeIt() {
-                       if ($inBox.data("columnized") && $inBox.children().length == 1) {
-                               return;
-                       }
-                       $inBox.data("columnized", true);
-                       $inBox.data("columnizing", true);
-                       
-                       $inBox.empty();
-                       $inBox.append($("<div class='first last column'></div>")); //"
-                       $col = $inBox.children().eq($inBox.children().length-1);
-                       $col.append($cache.clone());
-                       
-                       $inBox.data("columnizing", false);
-               }
-               
-               
-               function columnizeIt() {
-                       if(lastWidth == $inBox.width()) return;
-                       lastWidth = $inBox.width();
-                       
-                       var numCols = Math.round($inBox.width() / options.width);
-                       if(options.columns) numCols = options.columns;
-//                     if ($inBox.data("columnized") && numCols == $inBox.children().length) {
-//                             return;
-//                     }
-                       if(numCols <= 1){
-                               return singleColumnizeIt();
-                       }
-                       if($inBox.data("columnizing")) return;
-                       $inBox.data("columnized", true);
-                       $inBox.data("columnizing", true);
-                       
-                       $inBox.empty();
-                       $inBox.append($("<div style='width:" + (Math.round(100 / numCols) - 2)+ "%; padding: 3px; float: left;'></div>")); //"
-                       $col = $inBox.children(":last");
-                       $col.append($cache.clone());
-                       maxHeight = $col.height();
-                       $inBox.empty();
-                       
-                       var targetHeight = maxHeight / numCols;
-                       var firstTime = true;
-                       var maxLoops = 3;
-                       for(var loopCount=0;loopCount<maxLoops;loopCount++){
-                               $inBox.empty();
-                               var $destroyable = $cache.clone();
-                               $destroyable.css("visibility", "hidden");
-                               // create the columns
-                               for (var i = 0; i < numCols; i++) {
-                                       /* create column */
-                                       var className = (i == 0) ? "first column" : "column";
-                                       var className = (i == numCols - 1) ? ("last " + className) : className;
-                                       $inBox.append($("<div class='" + className + "' style='width:" + (Math.round(100 / numCols) - 2)+ "%; float: left;'></div>")); //"
-                               }
-                               
-                               // fill all but the last column
-                               for (var i = 0; i < numCols-1; i++) {
-                                       var $col = $inBox.children().eq(i);
-                                       columnize($col, $destroyable, $col, targetHeight);
-                                       split($col, $destroyable, $col, targetHeight);
-                               }
-                               // the last column in the series
-                               $col = $inBox.children().eq($inBox.children().length-1);
-                               while($destroyable.children().length) $col.append($destroyable.children(":first"));
-                               var afterH = $col.height();
-                               var diff = afterH - targetHeight;
-                               var totalH = 0;
-                               var min = 10000000;
-                               var max = 0;
-                               $inBox.children().each(function($inBox){ return function($item){
-                                       var h = $inBox.children().eq($item).height();
-                                       totalH += h;
-                                       if(h > max) max = h;
-                                       if(h < min) min = h;
-                               }}($inBox));
-                               var avgH = totalH / numCols;
-                               if(max - min > 30){
-                                       targetHeight = avgH + 30;
-                               }else if(Math.abs(avgH-targetHeight) > 20){
-                                       targetHeight = avgH;
-                               }else{
-                                       loopCount = maxLoops;
-                               }
-                               $inBox.append($("<br style='clear:both;'>"));
-                       }
-                       $inBox.data("columnizing", false);
-               }
-    });
- };
-})(jQuery);
diff --git a/media/js/jquery.autocomplete.js b/media/js/jquery.autocomplete.js
deleted file mode 100644 (file)
index 5ad9178..0000000
+++ /dev/null
@@ -1,759 +0,0 @@
-/*
- * Autocomplete - jQuery plugin 1.0.2
- *
- * Copyright (c) 2007 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, Jörn Zaefferer
- *
- * Dual licensed under the MIT and GPL licenses:
- *   http://www.opensource.org/licenses/mit-license.php
- *   http://www.gnu.org/licenses/gpl.html
- *
- * Revision: $Id: jquery.autocomplete.js 5747 2008-06-25 18:30:55Z joern.zaefferer $
- *
- */
-
-;(function($) {
-       
-$.fn.extend({
-       autocomplete: function(urlOrData, options) {
-               var isUrl = typeof urlOrData == "string";
-               options = $.extend({}, $.Autocompleter.defaults, {
-                       url: isUrl ? urlOrData : null,
-                       data: isUrl ? null : urlOrData,
-                       delay: isUrl ? $.Autocompleter.defaults.delay : 10,
-                       max: options && !options.scroll ? 10 : 150
-               }, options);
-               
-               // if highlight is set to false, replace it with a do-nothing function
-               options.highlight = options.highlight || function(value) { return value; };
-               
-               // if the formatMatch option is not specified, then use formatItem for backwards compatibility
-               options.formatMatch = options.formatMatch || options.formatItem;
-               
-               return this.each(function() {
-                       new $.Autocompleter(this, options);
-               });
-       },
-       result: function(handler) {
-               return this.bind("result", handler);
-       },
-       search: function(handler) {
-               return this.trigger("search", [handler]);
-       },
-       flushCache: function() {
-               return this.trigger("flushCache");
-       },
-       setOptions: function(options){
-               return this.trigger("setOptions", [options]);
-       },
-       unautocomplete: function() {
-               return this.trigger("unautocomplete");
-       }
-});
-
-$.Autocompleter = function(input, options) {
-
-       var KEY = {
-               UP: 38,
-               DOWN: 40,
-               DEL: 46,
-               TAB: 9,
-               RETURN: 13,
-               ESC: 27,
-               COMMA: 188,
-               PAGEUP: 33,
-               PAGEDOWN: 34,
-               BACKSPACE: 8
-       };
-
-       // Create $ object for input element
-       var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass);
-
-       var timeout;
-       var previousValue = "";
-       var cache = $.Autocompleter.Cache(options);
-       var hasFocus = 0;
-       var lastKeyPressCode;
-       var config = {
-               mouseDownOnSelect: false
-       };
-       var select = $.Autocompleter.Select(options, input, selectCurrent, config);
-       
-       var blockSubmit;
-       
-       // prevent form submit in opera when selecting with return key
-       $.browser.opera && $(input.form).bind("submit.autocomplete", function() {
-               if (blockSubmit) {
-                       blockSubmit = false;
-                       return false;
-               }
-       });
-       
-       // only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all
-       $input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) {
-               // track last key pressed
-               lastKeyPressCode = event.keyCode;
-               switch(event.keyCode) {
-               
-                       case KEY.UP:
-                               event.preventDefault();
-                               if ( select.visible() ) {
-                                       select.prev();
-                               } else {
-                                       onChange(0, true);
-                               }
-                               break;
-                               
-                       case KEY.DOWN:
-                               event.preventDefault();
-                               if ( select.visible() ) {
-                                       select.next();
-                               } else {
-                                       onChange(0, true);
-                               }
-                               break;
-                               
-                       case KEY.PAGEUP:
-                               event.preventDefault();
-                               if ( select.visible() ) {
-                                       select.pageUp();
-                               } else {
-                                       onChange(0, true);
-                               }
-                               break;
-                               
-                       case KEY.PAGEDOWN:
-                               event.preventDefault();
-                               if ( select.visible() ) {
-                                       select.pageDown();
-                               } else {
-                                       onChange(0, true);
-                               }
-                               break;
-                       
-                       // matches also semicolon
-                       case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA:
-                       case KEY.TAB:
-                       case KEY.RETURN:
-                               if( selectCurrent() ) {
-                                       // stop default to prevent a form submit, Opera needs special handling
-                                       event.preventDefault();
-                                       blockSubmit = true;
-                                       return false;
-                               }
-                               break;
-                               
-                       case KEY.ESC:
-                               select.hide();
-                               break;
-                               
-                       default:
-                               clearTimeout(timeout);
-                               timeout = setTimeout(onChange, options.delay);
-                               break;
-               }
-       }).focus(function(){
-               // track whether the field has focus, we shouldn't process any
-               // results if the field no longer has focus
-               hasFocus++;
-       }).blur(function() {
-               hasFocus = 0;
-               if (!config.mouseDownOnSelect) {
-                       hideResults();
-               }
-       }).click(function() {
-               // show select when clicking in a focused field
-               if ( hasFocus++ > 1 && !select.visible() ) {
-                       onChange(0, true);
-               }
-       }).bind("search", function() {
-               // TODO why not just specifying both arguments?
-               var fn = (arguments.length > 1) ? arguments[1] : null;
-               function findValueCallback(q, data) {
-                       var result;
-                       if( data && data.length ) {
-                               for (var i=0; i < data.length; i++) {
-                                       if( data[i].result.toLowerCase() == q.toLowerCase() ) {
-                                               result = data[i];
-                                               break;
-                                       }
-                               }
-                       }
-                       if( typeof fn == "function" ) fn(result);
-                       else $input.trigger("result", result && [result.data, result.value]);
-               }
-               $.each(trimWords($input.val()), function(i, value) {
-                       request(value, findValueCallback, findValueCallback);
-               });
-       }).bind("flushCache", function() {
-               cache.flush();
-       }).bind("setOptions", function() {
-               $.extend(options, arguments[1]);
-               // if we've updated the data, repopulate
-               if ( "data" in arguments[1] )
-                       cache.populate();
-       }).bind("unautocomplete", function() {
-               select.unbind();
-               $input.unbind();
-               $(input.form).unbind(".autocomplete");
-       });
-       
-       
-       function selectCurrent() {
-               var selected = select.selected();
-               if( !selected )
-                       return false;
-               
-               var v = selected.result;
-               previousValue = v;
-               
-               if ( options.multiple ) {
-                       var words = trimWords($input.val());
-                       if ( words.length > 1 ) {
-                               v = words.slice(0, words.length - 1).join( options.multipleSeparator ) + options.multipleSeparator + v;
-                       }
-                       v += options.multipleSeparator;
-               }
-               
-               $input.val(v);
-               hideResultsNow();
-               $input.trigger("result", [selected.data, selected.value]);
-               return true;
-       }
-       
-       function onChange(crap, skipPrevCheck) {
-               if( lastKeyPressCode == KEY.DEL ) {
-                       select.hide();
-                       return;
-               }
-               
-               var currentValue = $input.val();
-               
-               if ( !skipPrevCheck && currentValue == previousValue )
-                       return;
-               
-               previousValue = currentValue;
-               
-               currentValue = lastWord(currentValue);
-               if ( currentValue.length >= options.minChars) {
-                       $input.addClass(options.loadingClass);
-                       if (!options.matchCase)
-                               currentValue = currentValue.toLowerCase();
-                       request(currentValue, receiveData, hideResultsNow);
-               } else {
-                       stopLoading();
-                       select.hide();
-               }
-       };
-       
-       function trimWords(value) {
-               if ( !value ) {
-                       return [""];
-               }
-               var words = value.split( options.multipleSeparator );
-               var result = [];
-               $.each(words, function(i, value) {
-                       if ( $.trim(value) )
-                               result[i] = $.trim(value);
-               });
-               return result;
-       }
-       
-       function lastWord(value) {
-               if ( !options.multiple )
-                       return value;
-               var words = trimWords(value);
-               return words[words.length - 1];
-       }
-       
-       // fills in the input box w/the first match (assumed to be the best match)
-       // q: the term entered
-       // sValue: the first matching result
-       function autoFill(q, sValue){
-               // autofill in the complete box w/the first match as long as the user hasn't entered in more data
-               // if the last user key pressed was backspace, don't autofill
-               if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) {
-                       // fill in the value (keep the case the user has typed)
-                       $input.val($input.val() + sValue.substring(lastWord(previousValue).length));
-                       // select the portion of the value not typed by the user (so the next character will erase)
-                       $.Autocompleter.Selection(input, previousValue.length, previousValue.length + sValue.length);
-               }
-       };
-
-       function hideResults() {
-               clearTimeout(timeout);
-               timeout = setTimeout(hideResultsNow, 200);
-       };
-
-       function hideResultsNow() {
-               var wasVisible = select.visible();
-               select.hide();
-               clearTimeout(timeout);
-               stopLoading();
-               if (options.mustMatch) {
-                       // call search and run callback
-                       $input.search(
-                               function (result){
-                                       // if no value found, clear the input box
-                                       if( !result ) {
-                                               if (options.multiple) {
-                                                       var words = trimWords($input.val()).slice(0, -1);
-                                                       $input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") );
-                                               }
-                                               else
-                                                       $input.val( "" );
-                                       }
-                               }
-                       );
-               }
-               if (wasVisible)
-                       // position cursor at end of input field
-                       $.Autocompleter.Selection(input, input.value.length, input.value.length);
-       };
-
-       function receiveData(q, data) {
-               if ( data && data.length && hasFocus ) {
-                       stopLoading();
-                       select.display(data, q);
-                       autoFill(q, data[0].value);
-                       select.show();
-               } else {
-                       hideResultsNow();
-               }
-       };
-
-       function request(term, success, failure) {
-               if (!options.matchCase)
-                       term = term.toLowerCase();
-               var data = cache.load(term);
-               // recieve the cached data
-               if (data && data.length) {
-                       success(term, data);
-               // if an AJAX url has been supplied, try loading the data now
-               } else if( (typeof options.url == "string") && (options.url.length > 0) ){
-                       
-                       var extraParams = {
-                               timestamp: +new Date()
-                       };
-                       $.each(options.extraParams, function(key, param) {
-                               extraParams[key] = typeof param == "function" ? param() : param;
-                       });
-                       
-                       $.ajax({
-                               // try to leverage ajaxQueue plugin to abort previous requests
-                               mode: "abort",
-                               // limit abortion to this input
-                               port: "autocomplete" + input.name,
-                               dataType: options.dataType,
-                               url: options.url,
-                               data: $.extend({
-                                       q: lastWord(term),
-                                       limit: options.max
-                               }, extraParams),
-                               success: function(data) {
-                                       var parsed = options.parse && options.parse(data) || parse(data);
-                                       cache.add(term, parsed);
-                                       success(term, parsed);
-                               }
-                       });
-               } else {
-                       // if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match
-                       select.emptyList();
-                       failure(term);
-               }
-       };
-       
-       function parse(data) {
-               var parsed = [];
-               var rows = data.split("\n");
-               for (var i=0; i < rows.length; i++) {
-                       var row = $.trim(rows[i]);
-                       if (row) {
-                               row = row.split("|");
-                               parsed[parsed.length] = {
-                                       data: row,
-                                       value: row[0],
-                                       result: options.formatResult && options.formatResult(row, row[0]) || row[0]
-                               };
-                       }
-               }
-               return parsed;
-       };
-
-       function stopLoading() {
-               $input.removeClass(options.loadingClass);
-       };
-
-};
-
-$.Autocompleter.defaults = {
-       inputClass: "ac_input",
-       resultsClass: "ac_results",
-       loadingClass: "ac_loading",
-       minChars: 1,
-       delay: 400,
-       matchCase: false,
-       matchSubset: true,
-       matchContains: false,
-       cacheLength: 10,
-       max: 100,
-       mustMatch: false,
-       extraParams: {},
-       selectFirst: true,
-       formatItem: function(row) { return row[0]; },
-       formatMatch: null,
-       autoFill: false,
-       width: 0,
-       multiple: false,
-       multipleSeparator: ", ",
-       highlight: function(value, term) {
-               return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
-       },
-    scroll: true,
-    scrollHeight: 180
-};
-
-$.Autocompleter.Cache = function(options) {
-
-       var data = {};
-       var length = 0;
-       
-       function matchSubset(s, sub) {
-               if (!options.matchCase) 
-                       s = s.toLowerCase();
-               var i = s.indexOf(sub);
-               if (i == -1) return false;
-               return i == 0 || options.matchContains;
-       };
-       
-       function add(q, value) {
-               if (length > options.cacheLength){
-                       flush();
-               }
-               if (!data[q]){ 
-                       length++;
-               }
-               data[q] = value;
-       }
-       
-       function populate(){
-               if( !options.data ) return false;
-               // track the matches
-               var stMatchSets = {},
-                       nullData = 0;
-
-               // no url was specified, we need to adjust the cache length to make sure it fits the local data store
-               if( !options.url ) options.cacheLength = 1;
-               
-               // track all options for minChars = 0
-               stMatchSets[""] = [];
-               
-               // loop through the array and create a lookup structure
-               for ( var i = 0, ol = options.data.length; i < ol; i++ ) {
-                       var rawValue = options.data[i];
-                       // if rawValue is a string, make an array otherwise just reference the array
-                       rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue;
-                       
-                       var value = options.formatMatch(rawValue, i+1, options.data.length);
-                       if ( value === false )
-                               continue;
-                               
-                       var firstChar = value.charAt(0).toLowerCase();
-                       // if no lookup array for this character exists, look it up now
-                       if( !stMatchSets[firstChar] ) 
-                               stMatchSets[firstChar] = [];
-
-                       // if the match is a string
-                       var row = {
-                               value: value,
-                               data: rawValue,
-                               result: options.formatResult && options.formatResult(rawValue) || value
-                       };
-                       
-                       // push the current match into the set list
-                       stMatchSets[firstChar].push(row);
-
-                       // keep track of minChars zero items
-                       if ( nullData++ < options.max ) {
-                               stMatchSets[""].push(row);
-                       }
-               };
-
-               // add the data items to the cache
-               $.each(stMatchSets, function(i, value) {
-                       // increase the cache size
-                       options.cacheLength++;
-                       // add to the cache
-                       add(i, value);
-               });
-       }
-       
-       // populate any existing data
-       setTimeout(populate, 25);
-       
-       function flush(){
-               data = {};
-               length = 0;
-       }
-       
-       return {
-               flush: flush,
-               add: add,
-               populate: populate,
-               load: function(q) {
-                       if (!options.cacheLength || !length)
-                               return null;
-                       /* 
-                        * if dealing w/local data and matchContains than we must make sure
-                        * to loop through all the data collections looking for matches
-                        */
-                       if( !options.url && options.matchContains ){
-                               // track all matches
-                               var csub = [];
-                               // loop through all the data grids for matches
-                               for( var k in data ){
-                                       // don't search through the stMatchSets[""] (minChars: 0) cache
-                                       // this prevents duplicates
-                                       if( k.length > 0 ){
-                                               var c = data[k];
-                                               $.each(c, function(i, x) {
-                                                       // if we've got a match, add it to the array
-                                                       if (matchSubset(x.value, q)) {
-                                                               csub.push(x);
-                                                       }
-                                               });
-                                       }
-                               }                               
-                               return csub;
-                       } else 
-                       // if the exact item exists, use it
-                       if (data[q]){
-                               return data[q];
-                       } else
-                       if (options.matchSubset) {
-                               for (var i = q.length - 1; i >= options.minChars; i--) {
-                                       var c = data[q.substr(0, i)];
-                                       if (c) {
-                                               var csub = [];
-                                               $.each(c, function(i, x) {
-                                                       if (matchSubset(x.value, q)) {
-                                                               csub[csub.length] = x;
-                                                       }
-                                               });
-                                               return csub;
-                                       }
-                               }
-                       }
-                       return null;
-               }
-       };
-};
-
-$.Autocompleter.Select = function (options, input, select, config) {
-       var CLASSES = {
-               ACTIVE: "ac_over"
-       };
-       
-       var listItems,
-               active = -1,
-               data,
-               term = "",
-               needsInit = true,
-               element,
-               list;
-       
-       // Create results
-       function init() {
-               if (!needsInit)
-                       return;
-               element = $("<div/>")
-               .hide()
-               .addClass(options.resultsClass)
-               .css("position", "absolute")
-               .appendTo(document.body);
-       
-               list = $("<ul/>").appendTo(element).mouseover( function(event) {
-                       if(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') {
-                   active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event));
-                           $(target(event)).addClass(CLASSES.ACTIVE);            
-               }
-               }).click(function(event) {
-                       $(target(event)).addClass(CLASSES.ACTIVE);
-                       select();
-                       // TODO provide option to avoid setting focus again after selection? useful for cleanup-on-focus
-                       input.focus();
-                       return false;
-               }).mousedown(function() {
-                       config.mouseDownOnSelect = true;
-               }).mouseup(function() {
-                       config.mouseDownOnSelect = false;
-               });
-               
-               if( options.width > 0 )
-                       element.css("width", options.width);
-                       
-               needsInit = false;
-       } 
-       
-       function target(event) {
-               var element = event.target;
-               while(element && element.tagName != "LI")
-                       element = element.parentNode;
-               // more fun with IE, sometimes event.target is empty, just ignore it then
-               if(!element)
-                       return [];
-               return element;
-       }
-
-       function moveSelect(step) {
-               listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE);
-               movePosition(step);
-        var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE);
-        if(options.scroll) {
-            var offset = 0;
-            listItems.slice(0, active).each(function() {
-                               offset += this.offsetHeight;
-                       });
-            if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) {
-                list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight());
-            } else if(offset < list.scrollTop()) {
-                list.scrollTop(offset);
-            }
-        }
-       };
-       
-       function movePosition(step) {
-               active += step;
-               if (active < 0) {
-                       active = listItems.size() - 1;
-               } else if (active >= listItems.size()) {
-                       active = 0;
-               }
-       }
-       
-       function limitNumberOfItems(available) {
-               return options.max && options.max < available
-                       ? options.max
-                       : available;
-       }
-       
-       function fillList() {
-               list.empty();
-               var max = limitNumberOfItems(data.length);
-               for (var i=0; i < max; i++) {
-                       if (!data[i])
-                               continue;
-                       var formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term);
-                       if ( formatted === false )
-                               continue;
-                       var li = $("<li/>").html( options.highlight(formatted, term) ).addClass(i%2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0];
-                       $.data(li, "ac_data", data[i]);
-               }
-               listItems = list.find("li");
-               if ( options.selectFirst ) {
-                       listItems.slice(0, 1).addClass(CLASSES.ACTIVE);
-                       active = 0;
-               }
-               // apply bgiframe if available
-               if ( $.fn.bgiframe )
-                       list.bgiframe();
-       }
-       
-       return {
-               display: function(d, q) {
-                       init();
-                       data = d;
-                       term = q;
-                       fillList();
-               },
-               next: function() {
-                       moveSelect(1);
-               },
-               prev: function() {
-                       moveSelect(-1);
-               },
-               pageUp: function() {
-                       if (active != 0 && active - 8 < 0) {
-                               moveSelect( -active );
-                       } else {
-                               moveSelect(-8);
-                       }
-               },
-               pageDown: function() {
-                       if (active != listItems.size() - 1 && active + 8 > listItems.size()) {
-                               moveSelect( listItems.size() - 1 - active );
-                       } else {
-                               moveSelect(8);
-                       }
-               },
-               hide: function() {
-                       element && element.hide();
-                       listItems && listItems.removeClass(CLASSES.ACTIVE);
-                       active = -1;
-               },
-               visible : function() {
-                       return element && element.is(":visible");
-               },
-               current: function() {
-                       return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]);
-               },
-               show: function() {
-                       var offset = $(input).offset();
-                       element.css({
-                               width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(),
-                               top: offset.top + input.offsetHeight,
-                               left: offset.left
-                       }).show();
-            if(options.scroll) {
-                list.scrollTop(0);
-                list.css({
-                                       maxHeight: options.scrollHeight,
-                                       overflow: 'auto'
-                               });
-                               
-                if($.browser.msie && typeof document.body.style.maxHeight === "undefined") {
-                                       var listHeight = 0;
-                                       listItems.each(function() {
-                                               listHeight += this.offsetHeight;
-                                       });
-                                       var scrollbarsVisible = listHeight > options.scrollHeight;
-                    list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight );
-                                       if (!scrollbarsVisible) {
-                                               // IE doesn't recalculate width when scrollbar disappears
-                                               listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) );
-                                       }
-                }
-                
-            }
-               },
-               selected: function() {
-                       var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);
-                       return selected && selected.length && $.data(selected[0], "ac_data");
-               },
-               emptyList: function (){
-                       list && list.empty();
-               },
-               unbind: function() {
-                       element && element.remove();
-               }
-       };
-};
-
-$.Autocompleter.Selection = function(field, start, end) {
-       if( field.createTextRange ){
-               var selRange = field.createTextRange();
-               selRange.collapse(true);
-               selRange.moveStart("character", start);
-               selRange.moveEnd("character", end);
-               selRange.select();
-       } else if( field.setSelectionRange ){
-               field.setSelectionRange(start, end);
-       } else {
-               if( field.selectionStart ){
-                       field.selectionStart = start;
-                       field.selectionEnd = end;
-               }
-       }
-       field.focus();
-};
-
-})(jQuery);
\ No newline at end of file
diff --git a/media/js/jquery.form.js b/media/js/jquery.form.js
deleted file mode 100644 (file)
index 659baa9..0000000
+++ /dev/null
@@ -1,601 +0,0 @@
-/*
- * jQuery Form Plugin
- * version: 2.12 (06/07/2008)
- * @requires jQuery v1.2.2 or later
- *
- * Examples and documentation at: http://malsup.com/jquery/form/
- * Dual licensed under the MIT and GPL licenses:
- *   http://www.opensource.org/licenses/mit-license.php
- *   http://www.gnu.org/licenses/gpl.html
- *
- * Revision: $Id$
- */
-(function($) {
-
-/*
-    Usage Note:  
-    -----------
-    Do not use both ajaxSubmit and ajaxForm on the same form.  These
-    functions are intended to be exclusive.  Use ajaxSubmit if you want
-    to bind your own submit handler to the form.  For example,
-
-    $(document).ready(function() {
-        $('#myForm').bind('submit', function() {
-            $(this).ajaxSubmit({
-                target: '#output'
-            });
-            return false; // <-- important!
-        });
-    });
-
-    Use ajaxForm when you want the plugin to manage all the event binding
-    for you.  For example,
-
-    $(document).ready(function() {
-        $('#myForm').ajaxForm({
-            target: '#output'
-        });
-    });
-        
-    When using ajaxForm, the ajaxSubmit function will be invoked for you
-    at the appropriate time.  
-*/
-
-/**
- * ajaxSubmit() provides a mechanism for immediately submitting 
- * an HTML form using AJAX.
- */
-$.fn.ajaxSubmit = function(options) {
-    // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
-    if (!this.length) {
-        log('ajaxSubmit: skipping submit process - no element selected');
-        return this;
-    }
-
-    if (typeof options == 'function')
-        options = { success: options };
-
-    options = $.extend({
-        url:  this.attr('action') || window.location.toString(),
-        type: this.attr('method') || 'GET'
-    }, options || {});
-
-    // hook for manipulating the form data before it is extracted;
-    // convenient for use with rich editors like tinyMCE or FCKEditor
-    var veto = {};
-    this.trigger('form-pre-serialize', [this, options, veto]);
-    if (veto.veto) {
-        log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
-        return this;
-   }
-
-    var a = this.formToArray(options.semantic);
-    if (options.data) {
-        options.extraData = options.data;
-        for (var n in options.data)
-            a.push( { name: n, value: options.data[n] } );
-    }
-
-    // give pre-submit callback an opportunity to abort the submit
-    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
-        log('ajaxSubmit: submit aborted via beforeSubmit callback');
-        return this;
-    }    
-
-    // fire vetoable 'validate' event
-    this.trigger('form-submit-validate', [a, this, options, veto]);
-    if (veto.veto) {
-        log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
-        return this;
-    }    
-
-    var q = $.param(a);
-
-    if (options.type.toUpperCase() == 'GET') {
-        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
-        options.data = null;  // data is null for 'get'
-    }
-    else
-        options.data = q; // data is the query string for 'post'
-
-    var $form = this, callbacks = [];
-    if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
-    if (options.clearForm) callbacks.push(function() { $form.clearForm(); });
-
-    // perform a load on the target only if dataType is not provided
-    if (!options.dataType && options.target) {
-        var oldSuccess = options.success || function(){};
-        callbacks.push(function(data) {
-            $(options.target).html(data).each(oldSuccess, arguments);
-        });
-    }
-    else if (options.success)
-        callbacks.push(options.success);
-
-    options.success = function(data, status) {
-        for (var i=0, max=callbacks.length; i < max; i++)
-            callbacks[i](data, status, $form);
-    };
-
-    // are there files to upload?
-    var files = $('input:file', this).fieldValue();
-    var found = false;
-    for (var j=0; j < files.length; j++)
-        if (files[j])
-            found = true;
-
-    // options.iframe allows user to force iframe mode
-   if (options.iframe || found) { 
-       // hack to fix Safari hang (thanks to Tim Molendijk for this)
-       // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
-       if ($.browser.safari && options.closeKeepAlive)
-           $.get(options.closeKeepAlive, fileUpload);
-       else
-           fileUpload();
-       }
-   else
-       $.ajax(options);
-
-    // fire 'notify' event
-    this.trigger('form-submit-notify', [this, options]);
-    return this;
-
-
-    // private function for handling file uploads (hat tip to YAHOO!)
-    function fileUpload() {
-        var form = $form[0];
-        
-        if ($(':input[@name=submit]', form).length) {
-            alert('Error: Form elements must not be named "submit".');
-            return;
-        }
-        
-        var opts = $.extend({}, $.ajaxSettings, options);
-
-        var id = 'jqFormIO' + (new Date().getTime());
-        var $io = $('<iframe id="' + id + '" name="' + id + '" />');
-        var io = $io[0];
-
-        if ($.browser.msie || $.browser.opera) 
-            io.src = 'javascript:false;document.write("");';
-        $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
-
-        var xhr = { // mock object
-            responseText: null,
-            responseXML: null,
-            status: 0,
-            statusText: 'n/a',
-            getAllResponseHeaders: function() {},
-            getResponseHeader: function() {},
-            setRequestHeader: function() {}
-        };
-
-        var g = opts.global;
-        // trigger ajax global events so that activity/block indicators work like normal
-        if (g && ! $.active++) $.event.trigger("ajaxStart");
-        if (g) $.event.trigger("ajaxSend", [xhr, opts]);
-
-        var cbInvoked = 0;
-        var timedOut = 0;
-
-        // add submitting element to data if we know it
-        var sub = form.clk;
-        if (sub) {
-            var n = sub.name;
-            if (n && !sub.disabled) {
-                options.extraData = options.extraData || {};
-                options.extraData[n] = sub.value;
-                if (sub.type == "image") {
-                    options.extraData[name+'.x'] = form.clk_x;
-                    options.extraData[name+'.y'] = form.clk_y;
-                }
-            }
-        }
-        
-        // take a breath so that pending repaints get some cpu time before the upload starts
-        setTimeout(function() {
-            // make sure form attrs are set
-            var t = $form.attr('target'), a = $form.attr('action');
-            $form.attr({
-                target:   id,
-                encoding: 'multipart/form-data',
-                enctype:  'multipart/form-data',
-                method:   'POST',
-                action:   opts.url
-            });
-
-            // support timout
-            if (opts.timeout)
-                setTimeout(function() { timedOut = true; cb(); }, opts.timeout);
-
-            // add "extra" data to form if provided in options
-            var extraInputs = [];
-            try {
-                if (options.extraData)
-                    for (var n in options.extraData)
-                        extraInputs.push(
-                            $('<input type="hidden" name="'+n+'" value="'+options.extraData[n]+'" />')
-                                .appendTo(form)[0]);
-            
-                // add iframe to doc and submit the form
-                $io.appendTo('body');
-                io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
-                form.submit();
-            }
-            finally {
-                // reset attrs and remove "extra" input elements
-                $form.attr('action', a);
-                t ? $form.attr('target', t) : $form.removeAttr('target');
-                $(extraInputs).remove();
-            }
-        }, 10);
-
-        function cb() {
-            if (cbInvoked++) return;
-            
-            io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
-
-            var operaHack = 0;
-            var ok = true;
-            try {
-                if (timedOut) throw 'timeout';
-                // extract the server response from the iframe
-                var data, doc;
-
-                doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
-                
-                if (doc.body == null && !operaHack && $.browser.opera) {
-                    // In Opera 9.2.x the iframe DOM is not always traversable when
-                    // the onload callback fires so we give Opera 100ms to right itself
-                    operaHack = 1;
-                    cbInvoked--;
-                    setTimeout(cb, 100);
-                    return;
-                }
-                
-                xhr.responseText = doc.body ? doc.body.innerHTML : null;
-                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
-                xhr.getResponseHeader = function(header){
-                    var headers = {'content-type': opts.dataType};
-                    return headers[header];
-                };
-
-                if (opts.dataType == 'json' || opts.dataType == 'script') {
-                    var ta = doc.getElementsByTagName('textarea')[0];
-                    xhr.responseText = ta ? ta.value : xhr.responseText;
-                }
-                else if (opts.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
-                    xhr.responseXML = toXml(xhr.responseText);
-                }
-                data = $.httpData(xhr, opts.dataType);
-            }
-            catch(e){
-                ok = false;
-                $.handleError(opts, xhr, 'error', e);
-            }
-
-            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
-            if (ok) {
-                opts.success(data, 'success');
-                if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
-            }
-            if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
-            if (g && ! --$.active) $.event.trigger("ajaxStop");
-            if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');
-
-            // clean up
-            setTimeout(function() {
-                $io.remove();
-                xhr.responseXML = null;
-            }, 100);
-        };
-
-        function toXml(s, doc) {
-            if (window.ActiveXObject) {
-                doc = new ActiveXObject('Microsoft.XMLDOM');
-                doc.async = 'false';
-                doc.loadXML(s);
-            }
-            else
-                doc = (new DOMParser()).parseFromString(s, 'text/xml');
-            return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
-        };
-    };
-};
-
-/**
- * ajaxForm() provides a mechanism for fully automating form submission.
- *
- * The advantages of using this method instead of ajaxSubmit() are:
- *
- * 1: This method will include coordinates for <input type="image" /> elements (if the element
- *    is used to submit the form).
- * 2. This method will include the submit element's name/value data (for the element that was
- *    used to submit the form).
- * 3. This method binds the submit() method to the form for you.
- *
- * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
- * passes the options argument along after properly binding events for submit elements and
- * the form itself.
- */ 
-$.fn.ajaxForm = function(options) {
-    return this.ajaxFormUnbind().bind('submit.form-plugin',function() {
-        $(this).ajaxSubmit(options);
-        return false;
-    }).each(function() {
-        // store options in hash
-        $(":submit,input:image", this).bind('click.form-plugin',function(e) {
-            var $form = this.form;
-            $form.clk = this;
-            if (this.type == 'image') {
-                if (e.offsetX != undefined) {
-                    $form.clk_x = e.offsetX;
-                    $form.clk_y = e.offsetY;
-                } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
-                    var offset = $(this).offset();
-                    $form.clk_x = e.pageX - offset.left;
-                    $form.clk_y = e.pageY - offset.top;
-                } else {
-                    $form.clk_x = e.pageX - this.offsetLeft;
-                    $form.clk_y = e.pageY - this.offsetTop;
-                }
-            }
-            // clear form vars
-            setTimeout(function() { $form.clk = $form.clk_x = $form.clk_y = null; }, 10);
-        });
-    });
-};
-
-// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
-$.fn.ajaxFormUnbind = function() {
-    this.unbind('submit.form-plugin');
-    return this.each(function() {
-        $(":submit,input:image", this).unbind('click.form-plugin');
-    });
-
-};
-
-/**
- * formToArray() gathers form element data into an array of objects that can
- * be passed to any of the following ajax functions: $.get, $.post, or load.
- * Each object in the array has both a 'name' and 'value' property.  An example of
- * an array for a simple login form might be:
- *
- * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
- *
- * It is this array that is passed to pre-submit callback functions provided to the
- * ajaxSubmit() and ajaxForm() methods.
- */
-$.fn.formToArray = function(semantic) {
-    var a = [];
-    if (this.length == 0) return a;
-
-    var form = this[0];
-    var els = semantic ? form.getElementsByTagName('*') : form.elements;
-    if (!els) return a;
-    for(var i=0, max=els.length; i < max; i++) {
-        var el = els[i];
-        var n = el.name;
-        if (!n) continue;
-
-        if (semantic && form.clk && el.type == "image") {
-            // handle image inputs on the fly when semantic == true
-            if(!el.disabled && form.clk == el)
-                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
-            continue;
-        }
-
-        var v = $.fieldValue(el, true);
-        if (v && v.constructor == Array) {
-            for(var j=0, jmax=v.length; j < jmax; j++)
-                a.push({name: n, value: v[j]});
-        }
-        else if (v !== null && typeof v != 'undefined')
-            a.push({name: n, value: v});
-    }
-
-    if (!semantic && form.clk) {
-        // input type=='image' are not found in elements array! handle them here
-        var inputs = form.getElementsByTagName("input");
-        for(var i=0, max=inputs.length; i < max; i++) {
-            var input = inputs[i];
-            var n = input.name;
-            if(n && !input.disabled && input.type == "image" && form.clk == input)
-                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
-        }
-    }
-    return a;
-};
-
-/**
- * Serializes form data into a 'submittable' string. This method will return a string
- * in the format: name1=value1&amp;name2=value2
- */
-$.fn.formSerialize = function(semantic) {
-    //hand off to jQuery.param for proper encoding
-    return $.param(this.formToArray(semantic));
-};
-
-/**
- * Serializes all field elements in the jQuery object into a query string.
- * This method will return a string in the format: name1=value1&amp;name2=value2
- */
-$.fn.fieldSerialize = function(successful) {
-    var a = [];
-    this.each(function() {
-        var n = this.name;
-        if (!n) return;
-        var v = $.fieldValue(this, successful);
-        if (v && v.constructor == Array) {
-            for (var i=0,max=v.length; i < max; i++)
-                a.push({name: n, value: v[i]});
-        }
-        else if (v !== null && typeof v != 'undefined')
-            a.push({name: this.name, value: v});
-    });
-    //hand off to jQuery.param for proper encoding
-    return $.param(a);
-};
-
-/**
- * Returns the value(s) of the element in the matched set.  For example, consider the following form:
- *
- *  <form><fieldset>
- *      <input name="A" type="text" />
- *      <input name="A" type="text" />
- *      <input name="B" type="checkbox" value="B1" />
- *      <input name="B" type="checkbox" value="B2"/>
- *      <input name="C" type="radio" value="C1" />
- *      <input name="C" type="radio" value="C2" />
- *  </fieldset></form>
- *
- *  var v = $(':text').fieldValue();
- *  // if no values are entered into the text inputs
- *  v == ['','']
- *  // if values entered into the text inputs are 'foo' and 'bar'
- *  v == ['foo','bar']
- *
- *  var v = $(':checkbox').fieldValue();
- *  // if neither checkbox is checked
- *  v === undefined
- *  // if both checkboxes are checked
- *  v == ['B1', 'B2']
- *
- *  var v = $(':radio').fieldValue();
- *  // if neither radio is checked
- *  v === undefined
- *  // if first radio is checked
- *  v == ['C1']
- *
- * The successful argument controls whether or not the field element must be 'successful'
- * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
- * The default value of the successful argument is true.  If this value is false the value(s)
- * for each element is returned.
- *
- * Note: This method *always* returns an array.  If no valid value can be determined the
- *       array will be empty, otherwise it will contain one or more values.
- */
-$.fn.fieldValue = function(successful) {
-    for (var val=[], i=0, max=this.length; i < max; i++) {
-        var el = this[i];
-        var v = $.fieldValue(el, successful);
-        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
-            continue;
-        v.constructor == Array ? $.merge(val, v) : val.push(v);
-    }
-    return val;
-};
-
-/**
- * Returns the value of the field element.
- */
-$.fieldValue = function(el, successful) {
-    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
-    if (typeof successful == 'undefined') successful = true;
-
-    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
-        (t == 'checkbox' || t == 'radio') && !el.checked ||
-        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
-        tag == 'select' && el.selectedIndex == -1))
-            return null;
-
-    if (tag == 'select') {
-        var index = el.selectedIndex;
-        if (index < 0) return null;
-        var a = [], ops = el.options;
-        var one = (t == 'select-one');
-        var max = (one ? index+1 : ops.length);
-        for(var i=(one ? index : 0); i < max; i++) {
-            var op = ops[i];
-            if (op.selected) {
-                // extra pain for IE...
-                var v = $.browser.msie && !(op.attributes['value'].specified) ? op.text : op.value;
-                if (one) return v;
-                a.push(v);
-            }
-        }
-        return a;
-    }
-    return el.value;
-};
-
-/**
- * Clears the form data.  Takes the following actions on the form's input fields:
- *  - input text fields will have their 'value' property set to the empty string
- *  - select elements will have their 'selectedIndex' property set to -1
- *  - checkbox and radio inputs will have their 'checked' property set to false
- *  - inputs of type submit, button, reset, and hidden will *not* be effected
- *  - button elements will *not* be effected
- */
-$.fn.clearForm = function() {
-    return this.each(function() {
-        $('input,select,textarea', this).clearFields();
-    });
-};
-
-/**
- * Clears the selected form elements.
- */
-$.fn.clearFields = $.fn.clearInputs = function() {
-    return this.each(function() {
-        var t = this.type, tag = this.tagName.toLowerCase();
-        if (t == 'text' || t == 'password' || tag == 'textarea')
-            this.value = '';
-        else if (t == 'checkbox' || t == 'radio')
-            this.checked = false;
-        else if (tag == 'select')
-            this.selectedIndex = -1;
-    });
-};
-
-/**
- * Resets the form data.  Causes all form elements to be reset to their original value.
- */
-$.fn.resetForm = function() {
-    return this.each(function() {
-        // guard against an input with the name of 'reset'
-        // note that IE reports the reset function as an 'object'
-        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
-            this.reset();
-    });
-};
-
-/**
- * Enables or disables any matching elements.
- */
-$.fn.enable = function(b) { 
-    if (b == undefined) b = true;
-    return this.each(function() { 
-        this.disabled = !b 
-    });
-};
-
-/**
- * Checks/unchecks any matching checkboxes or radio buttons and
- * selects/deselects and matching option elements.
- */
-$.fn.select = function(select) {
-    if (select == undefined) select = true;
-    return this.each(function() { 
-        var t = this.type;
-        if (t == 'checkbox' || t == 'radio')
-            this.checked = select;
-        else if (this.tagName.toLowerCase() == 'option') {
-            var $sel = $(this).parent('select');
-            if (select && $sel[0] && $sel[0].type == 'select-one') {
-                // deselect all other options
-                $sel.find('option').select(false);
-            }
-            this.selected = select;
-        }
-    });
-};
-
-// helper fn for console logging
-// set $.fn.ajaxSubmit.debug to true to enable debug logging
-function log() {
-    if ($.fn.ajaxSubmit.debug && window.console && window.console.log)
-        window.console.log('[jquery.form] ' + Array.prototype.join.call(arguments,''));
-};
-
-})(jQuery);
diff --git a/media/js/jquery.jqmodal.js b/media/js/jquery.jqmodal.js
deleted file mode 100644 (file)
index 966336a..0000000
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * jqModal - Minimalist Modaling with jQuery
- *
- * Copyright (c) 2007 Brice Burgess <bhb@iceburg.net>, http://www.iceburg.net
- * Licensed under the MIT License:
- * http://www.opensource.org/licenses/mit-license.php
- * 
- * $Version: 2007.??.?? +r12 beta
- * Requires: jQuery 1.1.3+
- */
-(function($) {
-/**
- * Initialize a set of elements as "modals". Modals typically are popup dialogs,
- * notices, modal windows, and image containers. An expando ("_jqm") containing
- * the UUID or "serial" of the modal is added to each element. This expando helps
- * reference the modal's settings in the jqModal Hash Object (jQuery.jqm.hash)
- * 
- * Accepts a parameter object with the following modal settings;
- * 
- * (Integer) zIndex - Desired z-Index of the modal. This setting does not override (has no effect on) preexisting z-Index styling (set via CSS or inline style).  
- * (Integer) overlay - [0-100] Translucency percentage (opacity) of the body covering overlay. Set to 0 for NO overlay, and up to 100 for a 100% opaque overlay.  
- * (String) overlayClass - This class is applied to the body covering overlay. Allows CSS control of the overlay look (tint, background image, etc.).
- * (String) closeClass - A close trigger is added to all elements matching this class within the modal.
- * (Mixed) trigger - An open trigger is added to all matching elements within the DOM. Trigger can be a selector String, a jQuery collection of elements, a DOM element, or a False boolean.
- * (Mixed) ajax - If not false; The URL (string) to load content from via an AJAX request.
- *                If ajax begins with a "@", the URL is extracted from the requested attribute of the triggering element.
- * (Mixed) target - If not false; The element within the modal to load the ajax response (content) into. Allows retention of modal design (e.g. framing and close elements are not overwritten by the AJAX response).
- *                  Target may be a selector string, jQuery collection of elements, or a DOM element -- but MUST exist within (as a child of) the modal.
- * (Boolean) modal - If true, user interactivity will be locked to the modal window until closed.
- * (Boolean) toTop - If true, modal will be posistioned as a first child of the BODY element when opened, and its DOM posistion restored when closed. This aids in overcoming z-Index stacking order/containment issues where overlay covers whole page *including* modal.
- * (Mixed) onShow - User defined callback function fired when modal opened.
- * (Mixed) onHide - User defined callback function fired when modal closed.
- * (Mixed) onLoad - User defined callback function fired when ajax content loads.
- *
- * @name jqm
- * @param Map options User defined settings for the modal(s).
- * @type jQuery
- * @cat Plugins/jqModal
- */
-$.fn.jqm=function(p){
-var o = {
-zIndex: 3000,
-overlay: 50,
-overlayClass: 'jqmOverlay',
-closeClass: 'jqmClose',
-trigger: '.jqModal',
-ajax: false,
-target: false,
-modal: false,
-toTop: false,
-onShow: false,
-onHide: false,
-onLoad: false
-};
-
-// For each element (aka "modal") $.jqm() has been called on;
-//  IF the _jqm expando exists, return (do nothing)
-//  ELSE increment serials and add _jqm expando to element ("serialization")
-//    *AND*...
-return this.each(function(){if(this._jqm)return;s++;this._jqm=s;
-
-// ... Add this element's serial to the jqModal Hash Object 
-//  Hash is globally accessible via jQuery.jqm.hash. It consists of;
-//   c: {obj} config/options
-//   a: {bool} active state (true: active/visible, false: inactive/hidden)
-//   w: {JQ DOM Element} The modal element (window/dialog/notice/etc. container)
-//   s: {int} The serial number of this modal (same as "H[s].w[0]._jqm")
-//   t: {DOM Element} The triggering element
-// *AND* ...
-H[s]={c:$.extend(o,p),a:false,w:$(this).addClass('jqmID'+s),s:s};
-
-// ... Attach events to trigger showing of this modal
-o.trigger&&$(this).jqmAddTrigger(o.trigger);
-});};
-
-// Adds behavior to triggering elements via the hide-show (HS) function.
-// 
-$.fn.jqmAddClose=function(e){return HS(this,e,'jqmHide');};
-$.fn.jqmAddTrigger=function(e){return HS(this,e,'jqmShow');};
-
-// Hide/Show a modal -- first check if it is already shown or hidden via the toggle state (H[{modal serial}].a)
-$.fn.jqmShow=function(t){return this.each(function(){!H[this._jqm].a&&$.jqm.open(this._jqm,t)});};
-$.fn.jqmHide=function(t){return this.each(function(){H[this._jqm].a&&$.jqm.close(this._jqm,t)});};
-
-$.jqm = {
-hash:{},
-
-// Function is executed by $.jqmShow to show a modal
-// s: {INT} serial of modal
-// t: {DOM Element} the triggering element
-
-// set local shortcuts
-//  h: {obj} this Modal's "hash"
-//  c: {obj} (h.c) config/options
-//  cc: {STR} closing class ('.'+h.c.closeClass)
-//  z: {INT} z-Index of Modal. If the Modal (h.w) has the z-index style set it will use this value before defaulting to the one passed in the config (h.c.zIndex)
-//  o: The overlay object
-// mark this modal as active (h.a === true)
-// set the triggering object (h.t) and the modal's z-Index.
-open:function(s,t){var h=H[s],c=h.c,cc='.'+c.closeClass,z=/^\d+$/.test(h.w.css('z-index'))&&h.w.css('z-index')||c.zIndex,o=$('<div></div>').css({height:'100%',width:'100%',position:'fixed',left:0,top:0,'z-index':z-1,opacity:c.overlay/100});h.t=t;h.a=true;h.w.css('z-index',z);
- // IF the modal argument was passed as true;
- //    Bind the Keep Focus Function if no other Modals are open (!A[0]),
- //    Add this modal to the opened modals stack (A) for nested modal support,
- //    and Mark overlay to show wait cursor when mouse hovers over it.
- if(c.modal) {!A[0]&&F('bind');A.push(s);o.css('cursor','wait');}
- // ELSE IF an overlay was requested (translucency set greater than 0);
- //    Attach a Close event to overlay to hide modal when overlay is clicked.
- else if(c.overlay > 0)h.w.jqmAddClose(o);
- // ELSE disable the overlay
- else o=false;
-
- // Add the Overlay to BODY if not disabled.
- h.o=(o)?o.addClass(c.overlayClass).prependTo('body'):false;
- // IF IE6;
- //  Set the Overlay to 100% height/width, and fix-position it via JS workaround
- if(ie6&&$('html,body').css({height:'100%',width:'100%'})&&o){o=o.css({position:'absolute'})[0];for(var y in {Top:1,Left:1})o.style.setExpression(y.toLowerCase(),"(_=(document.documentElement.scroll"+y+" || document.body.scroll"+y+"))+'px'");}
-
- // IF the modal's content is to be loaded via ajax;
- //  determine the target element {JQ} to recieve content (r),
- //  determine the URL {STR} to load content from (u)
- if(c.ajax) {var r=c.target||h.w,u=c.ajax,r=(typeof r == 'string')?$(r,h.w):$(r),u=(u.substr(0,1) == '@')?$(t).attr(u.substring(1)):u;
-  // Load the Content (and once loaded);
-   // Fire the onLoad callback (if exists),
-   // Attach closing events to elements inside the modal that match the closingClass,
-   // and Execute the jqModal default Open Callback
-  r.load(u,function(){c.onLoad&&c.onLoad.call(this,h);cc&&h.w.jqmAddClose($(cc,h.w));O(h);});}
- // ELSE the modal content is NOT to be loaded via ajax;
- //  Attach closing events to elements inside the modal that match the closingClass
- else cc&&h.w.jqmAddClose($(cc,h.w));
-
- // IF toTop was passed and an overlay exists;
- //  Remember the DOM posistion of the modal by inserting a tagged (matching serial) <SPAN> before the modal
- //  Move the Modal from its current position to a first child of the body tag (after the overlay)
- c.toTop&&h.o&&h.w.before('<span id="jqmP'+h.w[0]._jqm+'"></span>').insertAfter(h.o);  
- // Execute user defined onShow callback, or else show (make visible) the modal.
- // Execute the jqModal default Open Callback.
- // Return false to prevent trigger click from being followed.
- (c.onShow)?c.onShow(h):h.w.show();O(h);return false;
-},
-
-// Function is executed by $.jqmHide to hide a modal
-  // mark this modal as inactive (h.a === false)
-close:function(s){var h=H[s];h.a=false;
- // If modal, remove from modal stack.
-   // If no modals in modal stack, unbind the Keep Focus Function
- if(h.c.modal){A.pop();!A[0]&&F('unbind');}
- // IF toTop was passed and an overlay exists;
- //  Move modal back to its previous ("remembered") position.
- h.c.toTop&&h.o&&$('#jqmP'+h.w[0]._jqm).after(h.w).remove();
- // Execute user defined onHide callback, or else hide (make invisible) the modal and remove the overlay.
- if(h.c.onHide)h.c.onHide(h);else{h.w.hide()&&h.o&&h.o.remove()}return false;
-}};
-
-// set jqModal scope shortcuts;
-//  s: {INT} serials placeholder
-//  H: {HASH} shortcut to jqModal Hash Object
-//  A: {ARRAY} Array of active/visible modals
-//  ie6: {bool} True if client browser is Internet Explorer 6
-//  i: {JQ, DOM Element} iframe placeholder used to prevent active-x bleedthrough in IE6
-//    NOTE: It is important to include the iframe styling (iframe.jqm) in your CSS!
-//     *AND* ...
-var s=0,H=$.jqm.hash,A=[],ie6=$.browser.msie&&($.browser.version == "6.0"),i=$('<iframe src="javascript:false;document.write(\'\');" class="jqm"></iframe>').css({opacity:0}),
-
-//  O: The jqModal default Open Callback;
-//    IF ie6; Add the iframe to the overlay (if overlay exists) OR to the modal (if an iframe doesn't already exist from a previous opening)
-//    Execute the Modal Focus Function
-O=function(h){if(ie6)h.o&&h.o.html('<p style="width:100%;height:100%"/>').prepend(i)||(!$('iframe.jqm',h.w)[0]&&h.w.prepend(i)); f(h);},
-
-//  f: The Modal Focus Function;
-//    Attempt to focus the first visible input within the modal
-f=function(h){try{$(':input:visible',h.w)[0].focus();}catch(e){}},
-
-//  F: The Keep Focus Function;
-//    Binds or Unbinds (t) the Focus Examination Function to keypresses and clicks
-F=function(t){$()[t]("keypress",x)[t]("keydown",x)[t]("mousedown",x);},
-
-//  x: The Focus Examination Function;
-//    Fetch the current modal's Hash as h (supports nested modals)
-//    Determine if the click/press falls within the modal. If not (r===true);
-//      call the Modal Focus Function and prevent click/press follow-through (return false [!true])
-//      ELSE if so (r===false); follow event (return true [!false])
-x=function(e){var h=H[A[A.length-1]],r=(!$(e.target).parents('.jqmID'+h.s)[0]);r&&f(h);return !r;},
-
-// hide-show function; assigns click events to trigger elements that 
-//   hide, show, or hide AND show modals.
-
-// Expandos (jqmShow and/or jqmHide) are added to all trigger elements. 
-// These Expandos hold an array of modal serials {INT} to show or hide.
-
-//  w: {DOM Element} The modal element (window/dialog/notice/etc. container)
-//  e: {DOM Elemet||jQ Selector String} The triggering element
-//  y: {String} Type (jqmHide||jqmShow)
-
-//  s: {array} the serial number of passed modals, calculated below;
-HS=function(w,e,y){var s=[];w.each(function(){s.push(this._jqm)});
-
-// for each triggering element attach the jqmHide or jqmShow expando (y)
-//  or else expand the expando with the current serial array
- $(e).each(function(){if(this[y])$.extend(this[y],s);
- // Assign a click event on the trigger element which examines the element's
- //  jqmHide/Show expandos and attempts to execute $.jqmHide/Show on matching modals
- else{this[y]=s;$(this).click(function(){for(var i in {jqmShow:1,jqmHide:1})for(var s in this[i])if(H[this[i][s]])H[this[i][s]].w[i](this);return false;});}});return w;};
-})(jQuery);
\ No newline at end of file
diff --git a/media/js/jquery.js b/media/js/jquery.js
deleted file mode 100644 (file)
index 82b98e1..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * jQuery 1.2.6 - New Wave Javascript
- *
- * Copyright (c) 2008 John Resig (jquery.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
- * $Rev: 5685 $
- */
-(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
-return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
-return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
-selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
-return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
-this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
-return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
-jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
-script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
-for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
-for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
-jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
-ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
-while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
-while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
-for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
-jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
-xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
-jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
-for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
-s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
-e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();
\ No newline at end of file
diff --git a/media/js/jquery.labelify.js b/media/js/jquery.labelify.js
deleted file mode 100644 (file)
index 13196b2..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * jQuery.labelify - Display in-textbox hints
- * Stuart Langridge, http://www.kryogenix.org/
- * Released into the public domain
- * Date: 25th June 2008
- * @author Stuart Langridge
- * @version 1.3
- *
- *
- * Basic calling syntax: $("input").labelify();
- * Defaults to taking the in-field label from the field's title attribute
- *
- * You can also pass an options object with the following keys:
- *   text
- *     "title" to get the in-field label from the field's title attribute 
- *      (this is the default)
- *     "label" to get the in-field label from the inner text of the field's label
- *      (note that the label must be attached to the field with for="fieldid")
- *     a function which takes one parameter, the input field, and returns
- *      whatever text it likes
- *
- *   labelledClass
- *     a class that will be applied to the input field when it contains the
- *      label and removed when it contains user input. Defaults to blank.
- *  
- */
-jQuery.fn.labelify = function(settings) {
-  settings = jQuery.extend({
-    text: "title",
-    labelledClass: ""
-  }, settings);
-  var lookups = {
-    title: function(input) {
-      return $(input).attr("title");
-    },
-    label: function(input) {
-      return $("label[for=" + input.id +"]").text();
-    }
-  };
-  var lookup;
-  var jQuery_labellified_elements = $(this);
-  return $(this).each(function() {
-    if (typeof settings.text === "string") {
-      lookup = lookups[settings.text]; // what if not there?
-    } else {
-      lookup = settings.text; // what if not a fn?
-    };
-    // bail if lookup isn't a function or if it returns undefined
-    if (typeof lookup !== "function") { return; }
-    var lookupval = lookup(this);
-    if (!lookupval) { return; }
-
-    // need to strip newlines because the browser strips them
-    // if you set textbox.value to a string containing them    
-    $(this).data("label",lookup(this).replace(/\n/g,''));
-    $(this).focus(function() {
-      if (this.value === $(this).data("label")) {
-        this.value = this.defaultValue;
-        $(this).removeClass(settings.labelledClass);
-      }
-    }).blur(function(){
-      if (this.value === this.defaultValue) {
-        this.value = $(this).data("label");
-        $(this).addClass(settings.labelledClass);
-      }
-    });
-    
-    var removeValuesOnExit = function() {
-      jQuery_labellified_elements.each(function(){
-        if (this.value === $(this).data("label")) {
-          this.value = this.defaultValue;
-          $(this).removeClass(settings.labelledClass);
-        }
-      })
-    };
-    
-    $(this).parents("form").submit(removeValuesOnExit);
-    $(window).unload(removeValuesOnExit);
-    
-    if (this.value !== this.defaultValue) {
-      // user already started typing; don't overwrite their work!
-      return;
-    }
-    // actually set the value
-    this.value = $(this).data("label");
-    $(this).addClass(settings.labelledClass);
-
-  });
-};
\ No newline at end of file
diff --git a/middleware.py b/middleware.py
deleted file mode 100644 (file)
index c9a17dc..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-# Orignal version taken from http://www.djangosnippets.org/snippets/186/
-# Original author: udfalkso
-# Modified by: Shwagroo Team
-
-import sys
-import os
-import re
-import hotshot, hotshot.stats
-import tempfile
-import StringIO
-import pprint
-
-from django.conf import settings
-from django.db import connection
-
-
-words_re = re.compile( r'\s+' )
-
-group_prefix_re = [
-    re.compile( "^.*/django/[^/]+" ),
-    re.compile( "^(.*)/[^/]+$" ), # extract module path
-    re.compile( ".*" ),           # catch strange entries
-]
-
-
-class ProfileMiddleware(object):
-    """
-    Displays hotshot profiling for any view.
-    http://yoursite.com/yourview/?prof
-
-    Add the "prof" key to query string by appending ?prof (or &prof=)
-    and you'll see the profiling results in your browser.
-    It's set up to only be available in django's debug mode, is available for superuser otherwise,
-    but you really shouldn't add this middleware to any production configuration.
-
-    WARNING: It uses hotshot profiler which is not thread safe.
-    """
-    def process_request(self, request):
-        if (settings.DEBUG or request.user.is_superuser) and request.GET.has_key('prof'):
-            connection.queries = []
-            self.tmpfile = tempfile.mktemp()
-            self.prof = hotshot.Profile(self.tmpfile)
-
-    def process_view(self, request, callback, callback_args, callback_kwargs):
-        if (settings.DEBUG or request.user.is_superuser) and request.GET.has_key('prof'):
-            return self.prof.runcall(callback, request, *callback_args, **callback_kwargs)
-
-    def get_group(self, file):
-        for g in group_prefix_re:
-            name = g.findall( file )
-            if name:
-                return name[0]
-
-    def get_summary(self, results_dict, sum):
-        list = [ (item[1], item[0]) for item in results_dict.items() ]
-        list.sort( reverse = True )
-        list = list[:40]
-
-        res = "      tottime\n"
-        for item in list:
-            if sum == 0:
-                foo = 0
-            else:
-                foo = 100*item[0]/sum
-            res += "%4.1f%% %7.3f %s\n" % (foo, item[0], item[1] )
-
-        return res
-
-    def summary_for_files(self, stats_str):
-        stats_str = stats_str.split("\n")[5:]
-
-        mystats = {}
-        mygroups = {}
-
-        sum = 0
-
-        for s in stats_str:
-            fields = words_re.split(s);
-            if len(fields) == 7:
-                time = float(fields[2])
-                sum += time
-                file = fields[6].split(":")[0]
-
-                if not file in mystats:
-                    mystats[file] = 0
-                mystats[file] += time
-
-                group = self.get_group(file)
-                if not group in mygroups:
-                    mygroups[ group ] = 0
-                mygroups[ group ] += time
-
-        return "<pre>" + \
-               " ---- By file ----\n\n" + self.get_summary(mystats,sum) + "\n" + \
-               " ---- By group ---\n\n" + self.get_summary(mygroups,sum) + \
-               "</pre>"
-
-    def process_response(self, request, response):
-        if (settings.DEBUG or request.user.is_superuser) and request.GET.has_key('prof'):
-            self.prof.close()
-
-            out = StringIO.StringIO()
-            old_stdout = sys.stdout
-            sys.stdout = out
-
-            stats = hotshot.stats.load(self.tmpfile)
-            stats.sort_stats('time', 'calls')
-            stats.print_stats()
-
-            sys.stdout = old_stdout
-            stats_str = out.getvalue()
-
-            if response and response.content and stats_str:
-                response.content = "<pre>" + stats_str + "</pre>"
-
-            response.content = "\n".join(response.content.split("\n")[:40])
-
-            response.content += self.summary_for_files(stats_str)
-
-            os.unlink(self.tmpfile)
-            
-            response.content += '\n%d SQL Queries:\n' % len(connection.queries)
-            response.content += pprint.pformat(connection.queries)
-
-        return response
-
diff --git a/settings.py b/settings.py
deleted file mode 100644 (file)
index 04b5fd5..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-# -*- coding: utf-8 -*-
-# Django settings for wolnelektury project.
-from os import path
-
-PROJECT_DIR = path.abspath(path.dirname(__file__))
-
-DEBUG = True
-TEMPLATE_DEBUG = DEBUG
-
-ADMINS = (
-    (u'Marek Stępniowski', 'marek@stepniowski.com'),
-)
-
-MANAGERS = ADMINS
-
-DATABASE_ENGINE = 'sqlite3'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
-DATABASE_NAME = path.join(PROJECT_DIR, 'lektury.sqlite')  # Or path to database file if using sqlite3.
-DATABASE_USER = ''             # Not used with sqlite3.
-DATABASE_PASSWORD = ''         # Not used with sqlite3.
-DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
-DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.
-
-# Local time zone for this installation. Choices can be found here:
-# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
-# although not all choices may be available on all operating systems.
-# If running in a Windows environment this must be set to the same as your
-# system time zone.
-TIME_ZONE = 'America/Chicago'
-
-# Language code for this installation. All choices can be found here:
-# http://www.i18nguy.com/unicode/language-identifiers.html
-LANGUAGE_CODE = 'pl'
-
-SITE_ID = 1
-
-# If you set this to False, Django will make some optimizations so as not
-# to load the internationalization machinery.
-USE_I18N = True
-
-# Absolute path to the directory that holds media.
-# Example: "/home/media/media.lawrence.com/"
-MEDIA_ROOT = PROJECT_DIR + '/media/'
-
-# URL that handles the media served from MEDIA_ROOT. Make sure to use a
-# trailing slash if there is a path component (optional in other cases).
-# Examples: "http://media.lawrence.com", "http://example.com/media/"
-MEDIA_URL = '/media/'
-
-# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
-# trailing slash.
-# Examples: "http://foo.com/media/", "/media/".
-ADMIN_MEDIA_PREFIX = '/admin-media/'
-
-# Make this unique, and don't share it with anybody.
-
-# List of callables that know how to import templates from various sources.
-TEMPLATE_LOADERS = (
-    'django.template.loaders.filesystem.load_template_source',
-    'django.template.loaders.app_directories.load_template_source',
-#     'django.template.loaders.eggs.load_template_source',
-)
-
-TEMPLATE_CONTEXT_PROCESSORS = (
-    'django.core.context_processors.auth',
-    'django.core.context_processors.debug',
-    'django.core.context_processors.i18n',
-    'django.core.context_processors.media',
-    'django.core.context_processors.request',
-)
-
-MIDDLEWARE_CLASSES = [
-    'django.middleware.common.CommonMiddleware',
-    'django.contrib.sessions.middleware.SessionMiddleware',
-    'django.contrib.auth.middleware.AuthenticationMiddleware',
-    'django.middleware.doc.XViewMiddleware',
-    'pagination.middleware.PaginationMiddleware',
-]
-
-# If DEBUG is enabled add query log to bottom of every template
-if DEBUG:
-    MIDDLEWARE_CLASSES.append('middleware.ProfileMiddleware')
-
-ROOT_URLCONF = 'wolnelektury.urls'
-
-TEMPLATE_DIRS = (
-    PROJECT_DIR + '/templates/'
-)
-
-# CSS and JS files to compress
-COMPRESS_CSS = {
-    'all': {
-        'source_filenames': ('css/master.css', 'css/jquery.autocomplete.css', 'css/master.plain.css',),
-        'output_filename': 'css/all.min.css',
-    }
-}
-
-COMPRESS_JS = {
-    'all': {
-        'source_filenames': ('js/jquery.js', 'js/jquery.autocolumn.js', 'js/jquery.autocomplete.js', 
-            'js/jquery.form.js', 'js/jquery.jqmodal.js', 'js/jquery.labelify.js', 'js/catalogue.js',),
-        'output_filename': 'js/all.min.js',
-    }
-}
-
-COMPRESS_CSS_FILTERS = None
-
-LOGIN_URL = '/uzytkownicy/zaloguj/'
-
-LOGIN_REDIRECT_URL = '/'
-
-INSTALLED_APPS = (
-    'django.contrib.auth',
-    'django.contrib.contenttypes',
-    'django.contrib.sessions',
-    'django.contrib.sites',
-    'django.contrib.admin',
-    'newtagging',
-    'pagination',
-    'chunks',
-    'compress',
-    'catalogue',
-)
-
diff --git a/templates/404.html b/templates/404.html
deleted file mode 100644 (file)
index 5003eae..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<h1>Blad 404 - Strona nie istnieje</h1>
-
-<p>(Tutaj później będzie coś więcej, naprawdę)</p>
\ No newline at end of file
diff --git a/templates/admin/base_site.html b/templates/admin/base_site.html
deleted file mode 100644 (file)
index d0ca937..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{% extends "admin/base.html" %}
-
-{% block title %}{{ title }} | Administracja stroną WolneLektury.pl{% endblock %}
-
-{% block branding %}
-<h1 id="site-name">Administracja stroną WolneLektury.pl</h1>
-{% endblock %}
-
-{% block nav-global %}{% endblock %}
\ No newline at end of file
diff --git a/templates/auth/login.html b/templates/auth/login.html
deleted file mode 100644 (file)
index 6db94aa..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}Zaloguj / Zarejestruj się w WolneLektury.pl{% endblock %}
-
-{% block body %}
-    <h1>Zaloguj się / Załóż konto</h1>
-    <form action="." method="get" accept-charset="utf-8" id="search-form">
-        <p><li>{{ search_form.q }} <input type="submit" value="Szukaj" /></li> <strong>lub</strong> <a href="{% url main_page %}">wróć do strony głównej</a></p>
-    </form>
-    <form method="post" action="." id="login-form" class="cuteform">
-        <h2>Zaloguj się</h2>
-        <ol>
-            {{ form.as_ul }}
-            <li><input type="submit" value="Zaloguj się" /></li>
-        </ol>
-        <p><input type="hidden" name="next" value="{{ next }}" /></p>
-    </form>
-    
-    <form action="." method="post" accept-charset="utf-8" id="registration-form">
-        <h2>Załóż konto</h2>
-
-        <p><input type="submit" value="Załóż konto"/></p>
-    </form>
-{% endblock %}
diff --git a/templates/base.html b/templates/base.html
deleted file mode 100644 (file)
index 8c8f1c6..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-{% load chunks compressed catalogue_tags %}
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-    <head>
-        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
-        <title>{% block title %}WolneLektury.pl{% endblock %}</title>
-        <link rel="icon" href="/media/img/favicon.png" type="image/x-icon" />
-        {% compressed_css "all" %}
-        {% compressed_js "all" %}
-        {% block extrahead %}
-        {% endblock %}
-    </head>
-    <body id="{% block bodyid %}base{% endblock %}">
-        <div id="top-message">
-            {% chunk "top-message" %}
-        </div>
-        <div id="header">
-            <div id="logo">
-                <a href="/"><img src="/media/img/logo.png" alt="WolneLektury.pl - logo" /></a>
-            </div>
-            <div id="user-info">
-                {% if user.is_authenticated %}
-                    <p>
-                        Zalogowany jako <strong>{{ user.username }}</strong>
-                        | <a href="{% url user_shelves %}" id="user-shelves-link">Moje półki</a>
-                        {% if user.is_staff %}
-                        | <a href="/admin/">Administracja</a>
-                        {% endif %}
-                        | <a href="{% url logout %}?next={{ request.get_full_path }}">Wyloguj</a>
-                    </p>
-                {% else %}
-                    <p><a href="{% url login %}" id="login-register-link">Zaloguj się / Załóż konto</a></p>
-                {% endif %}
-            </div>
-            <div class="clearboth"></div>
-        </div>
-        <div id="maincontent">
-            {% block body %}
-            {% endblock %}    
-        </div>
-        <div class="clearboth"></div>
-        <div id="footer">
-            <p>
-                Wolne Lektury to projekt prowadzony przez <a href="http://nowoczesnapolska.org.pl/">Fundację Nowoczesna
-                Polska</a>. Reprodukcje cyfrowe wykonane przez <a href="http://www.bn.org.pl/">Bibliotekę Narodową</a>
-                z egzemplarzy pochodzących ze zbiorów BN. Hosting <a href="http://eo.pl/">EO Networks</a>.
-            </p>
-            <p>
-                Fundacja Nowoczesna Polska, 00-514 Warszawa, ul. Marszałkowska 84/92 lok. 125, tel/fax: (22) 621-30-17,
-                e-mail: <a href="mailto:fundacja@nowoczesnapolska.org.pl">fundacja@nowoczesnapolska.org.pl</a>
-            </p>
-            <img src="/media/img/footer.png" usemap="#footermap" alt="Partnerzy serwisu" />
-            <map name="footermap" id="footermap">
-                <area alt="Biblioteka Analiz" coords="618,59,679,77" href="http://www.rynek-ksiazki.pl/" shape="rect" />
-                <area alt="Przekrój" coords="590,53,615,74" href="http://www.przekroj.pl/" shape="rect" />
-                <area alt="TVP Kultura" coords="551,53,588,74" href="http://www.tvp.pl/tvpkultura/" shape="rect" />
-                <area alt="Elle" coords="618,33,677,57" href="http://elle.interia.pl/" shape="rect" />
-                <area alt="Radio TOK.FM " coords="515,53,549,75" href="http://www.tok.fm/" shape="rect" />
-                <area alt="Tygodnik Powszechny" coords="514,33,616,51" href="http://tygodnik.onet.pl/" shape="rect" />
-                <area alt="Dziennik Polska-Europa-Swiat" coords="368,34,512,75" href="http://www.dziennik.pl/" shape="rect" />
-                <area alt="Ministerstwo Kultury i Dziedzictwa Narodowego" coords="265,35,366,74" href="http://www.mkidn.gov.pl/" shape="rect" />
-                <area alt="Biblioteka Narodowa" coords="222,29,261,83" href="http://www.bn.org.pl/" shape="rect" />
-                <area alt="PZL" coords="188,58,217,81" href="http://www.pzl.pl/" shape="rect" />
-                <area alt="EO Networks" coords="162,32,218,56" href="http://eo.pl/" shape="rect" />
-                <area alt="Kancelaria Prawna Grynhoff Woźny Maliński Spółka komandytowa" coords="104,61,184,76" href="http://www.gww.pl/" shape="rect" />
-                <area alt="Information is art" coords="104,35,160,60" href="http://www.informationisart.com/" shape="rect" />
-                <area alt="Fundacja Nowoczesna Polska" coords="15,39,98,75" href="http://nowoczesnapolska.org.pl/" shape="rect" />
-            </map>
-        </div>
-        <div id="login-register-window">
-            <div class="header"><a href="#" class="jqmClose">Zamknij</a></div>
-            <div class="target">
-                <form method="post" action="{% url login %}" id="login-form" class="cuteform">
-                    <h2>Zaloguj się / <a href="#" id="show-registration-form" style="font-size: 0.85em; font-weight: normal">Załóż konto</a></h2>
-                    <p><span id="id_login-__all__" /></p>
-                    <ol>
-                        {% authentication_form %}
-                        <li><input type="submit" value="Zaloguj się" /></li>
-                    </ol>
-                </form>
-                <form method="post" action="{% url register %}" id="registration-form" class="cuteform" style="display: none;">
-                    <h2><a href="#" id="show-login-form" style="font-size: 0.85em; font-weight: normal">Zaloguj się</a> / Załóż konto</h2>
-                    <p><span id="id_registration-__all__" /></p>
-                    <ol>
-                        {% user_creation_form %}
-                        <li><input type="submit" value="Załóż konto" /></li>
-                    </ol>
-                </form>
-            </div>
-        </div>
-        <div id="user-shelves-window">
-            <div class="header"><a href="#" class="jqmClose">Zamknij</a></div>
-            <div class="target">
-                <p><img src="/media/img/indicator.gif" alt="*"/> Ładowanie</p>
-            </div>
-        </div>
-    </body>
-</html>
diff --git a/templates/catalogue/book_detail.html b/templates/catalogue/book_detail.html
deleted file mode 100644 (file)
index ff92780..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-{% extends "base.html" %}
-{% load catalogue_tags %}
-
-{% block title %}Lektura {{ book.title }} w WolneLektury.pl{% endblock %}
-
-{% block bodyid %}book-detail{% endblock %}
-
-{% block extrahead %}
-    <script type="text/javascript">
-        $(function() {
-            $('#toggle-description').hover(
-                function() { $(this).css({background: '#F3F3F3', cursor: 'pointer'}); },
-                function() { $(this).css({background: '#EEE'}); }
-            ).click(function() {
-                if ($('#description').hasClass('hidden')) {
-                    $('#description').slideDown('fast').removeClass('hidden');
-                    $('p', this).html('Zwiń opis ▲');
-                } else {
-                    $('#description').slideUp('fast').addClass('hidden');
-                    $('p', this).html('Rozwiń opis ▼');
-                }
-            });
-        });
-    </script>
-{% endblock %}
-
-{% block body %}
-    <h1>{{ book.title }}, {{ categories.author|join:", " }}</h1>
-    <form action="{% url main_page %}" method="get" accept-charset="utf-8" id="search-form">
-        <ol>
-            {# {% for tag in tags %} #}
-            {# <li class="category"><a href="{% catalogue_url tag %}">{{ tag }}</a> | <a href="{% catalogue_url tags -tag %}">x</a></li> #}
-            {# {% endfor %} #}
-            <li class="book-title">{{ book.title }} | <a href="{% url main_page %}">x</a></li>
-        </ol>
-    </form>
-    
-    <div id="books-list">
-        {% if book.has_description %}
-            <div id="description">
-                {{ book.description|safe }}
-            </div>
-            <div id="toggle-description"><p>Zwiń opis ▲</p></div>
-        {% endif %}
-        <div id="formats">
-            <ul>
-            {% if book.pdf_file %}
-                <li><a href="{{ book.pdf_file.url }}">Pobierz plik PDF</a></li>
-            {% endif %}
-            {% if book.odt_file %}
-                <li><a href="{{ book.odt_file.url }}">Pobierz plik ODT</a></li>
-            {% endif %}
-            {% if book.html_file %}
-                <li><a href="{{ book.html_file.url }}">Pobierz plik HTML</a></li>
-            {% endif %}
-            </ul>
-        </div>
-    
-        {% if book.children.all %}
-        <div id="book-children">
-            <h2>Utwory składające się na ten utwór:</h2>
-            {% for book in book.children.all %}
-                <li><a href="{{ book.get_absolute_url }}">{{ book.title }}</a></li>
-            {% endfor %}
-        </div>
-        {% endif %}
-    
-    </div>
-        
-    <div id="tags-list">
-        <h2>O utworze</h2>
-        <ul>
-            <li>
-                Autor: 
-                {% for tag in categories.author %}
-                <a href="{{ tag.get_absolute_url }}">{{ tag }}</a>
-                {% endfor %}
-            </li>
-            <li>
-                Epoka:
-                {% for tag in categories.epoch %}
-                <a href="{{ tag.get_absolute_url }}">{{ tag }}</a>
-                {% endfor %}
-            </li>
-            <li>
-                Rodzaj:
-                {% for tag in categories.kind %}
-                <a href="{{ tag.get_absolute_url }}">{{ tag }}</a>
-                {% endfor %}
-            </li>
-            <li>
-                Gatunek:
-                {% for tag in categories.genre %}
-                <a href="{{ tag.get_absolute_url }}">{{ tag }}</a>
-                {% endfor %}
-            </li>
-        </ul>
-        {% if categories.theme %}
-            <h2>Motywy w utworze</h2>
-            <ul>
-            {% for theme in categories.theme %}
-                <li>{{ theme }}</li>
-            {% endfor %}
-            </ul>
-        {% endif %}
-    </div>
-{% endblock %}
\ No newline at end of file
diff --git a/templates/catalogue/book_list.html b/templates/catalogue/book_list.html
deleted file mode 100644 (file)
index f4f575c..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-{% extends "base.html" %}
-{% load catalogue_tags chunks %}
-
-{% block bodyid %}book-a-list{% endblock %}
-
-{% block title %}Alfabetyczny spis utworów w WolneLektury.pl{% endblock %}
-
-{% block extrahead %}
-    <script type="text/javascript" charset="utf-8">
-        $(function() {
-            $('#book-list .group').addClass('dontsplit');
-            $('#book-list').columnize({columns: 3});
-        });
-    </script>
-{% endblock %}
-
-{% block body %}
-    <h1>Alfabetyczny spis utworów</h1>
-    <form action="{% url search %}" method="GET" accept-charset="utf-8" id="search-form">
-        <p>{{ form.q }} <input type="submit" value="Szukaj" /> <strong>lub</strong> <a href="{% url main_page %}">wróć do strony głównej</a></p>
-    </form>
-    
-    <div id="book-list">
-        {% for first_letter, group in books_by_first_letter.items %}
-        <div class="group">
-            <h2>{{ first_letter }}</h2>
-            <ol>
-            {% for book in group %}
-                <li><a href="{{ book.get_absolute_url }}">{{ book.title }}</a></li>
-            {% endfor %}
-            </ol>
-        </div>
-        {% endfor %}    
-    </div>
-{% endblock %}
diff --git a/templates/catalogue/book_sets.html b/templates/catalogue/book_sets.html
deleted file mode 100644 (file)
index c739418..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-<h2>Półki zawierające utwór {{ book.title }}</h2>
-{% if not user.tag_set.count %}
-    <p>Nie posiadasz żadnych półek. Jeśli chcesz, możesz utworzyć nową półkę poniżej.</p>
-{% else %}
-    <form action="{% url catalogue.views.book_sets book.slug %}" method="POST" accept-charset="utf-8" class="cuteform">
-    <ol>
-        <li>{{ form.set_ids }}</li>
-        <li><input type="submit" value="Zapisz półki"/></li>
-    </ol>
-    </form>
-{% endif %}
-<hr />
-<form action="{% url catalogue.views.new_set %}" method="POST" accept-charset="utf-8" class="cuteform">
-<ol>
-    <li>{{ new_set_form.name }} <input type="submit" value="Utwórz nową półkę"/></li>
-</ol>
-</form>
\ No newline at end of file
diff --git a/templates/catalogue/book_short.html b/templates/catalogue/book_short.html
deleted file mode 100644 (file)
index e6a3748..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<div class="book">
-    <div class="change-sets">
-        <a href="{% url catalogue.views.book_sets book.slug %}" class="jqm-trigger">Półki</a>
-    </div>
-    <div class="book-thumbnail"></div>
-    <div class="book-description">
-        <h2><a href="{{ book.get_absolute_url }}">{{ book.title }}</a></h2>
-        <p style="margin: 0">Formaty: {{ formats|join:", "|safe }}</p>
-        <p style="margin: 0">Utwór w kategoriach: {{ tags|join:", "|safe }}</p>
-    </div>
-</div>
diff --git a/templates/catalogue/breadcrumbs.html b/templates/catalogue/breadcrumbs.html
deleted file mode 100644 (file)
index 896d999..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{% load catalogue_tags %}
-<form action="{% url search %}" method="get" accept-charset="utf-8" id="search-form">
-    <ol>
-        {% for tag in tag_list %}
-        <li class="category"><a href="{% catalogue_url tag %}">{{ tag }}</a> | <a href="{% catalogue_url tag_list -tag %}">x</a></li>
-        {% endfor %}
-        <li>{{ search_form.q }} {{ search_form.tags }} <input type="submit" value="Szukaj"/></li>
-    </ol>
-</form>
\ No newline at end of file
diff --git a/templates/catalogue/fragment_sets.html b/templates/catalogue/fragment_sets.html
deleted file mode 100644 (file)
index c7d641c..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-<h2>Półki zawierające fragment</h2>
-{% if not user.tag_set.count %}
-    <p>Nie posiadasz żadnych półek. Jeśli chcesz, możesz utworzyć nową półkę poniżej.</p>
-{% else %}
-    <form action="{% url catalogue.views.fragment_sets fragment.id %}" method="POST" accept-charset="utf-8" class="cuteform">
-    <ol>
-        <li>{{ form.set_ids }}</li>
-        <li><input type="submit" value="Zapisz półki"/></li>
-    </ol>
-    </form>
-{% endif %}
-<hr />
-<form action="{% url catalogue.views.new_set %}" method="POST" accept-charset="utf-8" class="cuteform">
-<ol>
-    <li>{{ new_set_form.name }} <input type="submit" value="Utwórz nową półkę"/></li>
-</ol>
-</form>
\ No newline at end of file
diff --git a/templates/catalogue/fragment_short.html b/templates/catalogue/fragment_short.html
deleted file mode 100644 (file)
index 99fface..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<div class="fragment">
-    {# <div class="change-sets"> #}
-    {#     <a href="{% url catalogue.views.fragment_sets fragment.id %}" class="jqm-trigger">Półki</a> #}
-    {# </div> #}
-    {% if fragment.short_text %}
-    <div class='fragment-short-text'>
-        {{ fragment.short_text|safe }}
-        <a href="#">↓ Rozwiń fragment ↓</a>
-    </div>
-    {% endif %}
-    <div class="fragment-text" {% if fragment.short_text %}style="display:none;"{% endif %}>
-        {{ fragment.text|safe }}
-        {% if fragment.short_text %}
-            <a href="#">↑ Zwiń fragment ↑</a>
-        {% endif %}
-    </div>
-    <div class="fragment-metadata">
-        <p><a href="{{ book.get_absolute_url }}">{{ book.title }}</a>, {{ book_authors|join:","|safe }}</p>
-    </div>
-    <div class="clearboth"></div>
-</div>
diff --git a/templates/catalogue/latest_blog_posts.html b/templates/catalogue/latest_blog_posts.html
deleted file mode 100644 (file)
index d2c90e1..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<ol>
-{% for post in posts %}
-    <li><a href="{{ post.link }}">{{ post.title }}</a></li>
-{% endfor %}
-</ol>
\ No newline at end of file
diff --git a/templates/catalogue/main_page.html b/templates/catalogue/main_page.html
deleted file mode 100644 (file)
index 0c58ada..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-{% extends "base.html" %}
-{% load catalogue_tags chunks cache %}
-
-{% block bodyid %}main-page{% endblock %}
-
-{% block extrahead %}
-    <script type="text/javascript" charset="utf-8">
-        $(function() {
-            $('#categories-list ul').columnize({width: 180});
-            $('#themes-list ul').columnize({width: 180});
-        });
-    </script>
-{% endblock %}
-
-{% block body %}
-    <div id="site-description">
-        {% chunk "site-description" %}
-    </div>
-    <div class="clearboth"></div>
-    <form action="{% url search %}" method="get" accept-charset="utf-8" id="search-form">
-        <p>{{ form.q }} {{ form.tags }} <input type="submit" value="Szukaj" /> <strong>lub</strong> <a href="{% url catalogue.views.book_list %}">zobacz spis utworów</a> w naszym zbiorze</p>
-    </form>
-    
-    <div id="tags-list">
-        <div id="categories-list">
-            {% if categories.set %}
-                <h2>Półki</h2>
-                <ul>
-                {% for set in categories.set %}
-                    <li><a href="{% catalogue_url set %}">{{ set }}&nbsp;({{ set.count }})</a></li>
-                {% endfor %}
-                </ul>
-            {% endif %}
-            
-            {% if categories.author %}
-                <h2>Autorzy</h2>
-                <ul>
-                {% for author in categories.author %}
-                    <li><a href="{% catalogue_url author %}">{{ author }}&nbsp;({{ author.count }})</a></li>
-                {% endfor %}
-                </ul>
-            {% endif %}
-            
-            {% if categories.epoch %}
-            <h2>Epoki</h2>
-                <ul>
-                {% for epoch in categories.epoch %}
-                    <li><a href="{% catalogue_url epoch %}">{{ epoch }}&nbsp;({{ epoch.count }})</a></li>
-                {% endfor %}
-                </ul>                
-            {% endif %}
-            
-            {% if categories.kind %}
-                <h2>Rodzaje</h2>
-                <ul>
-                {% for kind in categories.kind %}
-                    <li><a href="{% catalogue_url kind %}">{{ kind }}&nbsp;({{ kind.count }})</a></li>
-                {% endfor %}
-                </ul>                
-            {% endif %}
-            
-            {% if categories.genre %}
-                <h2>Gatunki literackie</h2>
-                <ul>
-                {% for genre in categories.genre %}
-                    <li><a href="{% catalogue_url genre %}">{{ genre }}&nbsp;({{ genre.count }})</a></li>
-                {% endfor %}
-                </ul>                
-            {% endif %}
-        </div>
-        <div id="themes-list">
-            {% if categories.theme %}
-                <h2>Motywy</h2>
-                <ul>
-                {% for theme in fragment_tags %}
-                    <li><a href="{% catalogue_url theme %}">{{ theme }}&nbsp;({{ theme.count }})</a></li>
-                {% endfor %}
-                </ul>                
-            {% endif %}
-        </div>
-        <div class="clearboth"></div>
-    </div>
-    
-    <div id="latest-blog-posts">
-        <h2>Aktualności z naszego bloga</h2>
-        {% cache 1800 latest-blog-posts %}
-        {% latest_blog_posts "http://wolnepodreczniki.pl/feed/?s=Wolne%20Lektury" %}
-        {% endcache %}
-    </div>
-{% endblock %}
diff --git a/templates/catalogue/tagged_object_list.html b/templates/catalogue/tagged_object_list.html
deleted file mode 100644 (file)
index de7d4f0..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-{% extends "base.html" %}
-{% load catalogue_tags pagination_tags %}
-
-{% block title %}{% title_from_tags tags %} w WolneLektury.pl{% endblock %}
-
-{% block bodyid %}books{% endblock %}
-
-{% block extrahead %}
-    <script type="text/javascript">
-    // <![CDATA[
-        $(function() {            
-            // $('#tags-list ul').addClass('dontsplit');
-            // $('#tags-list').columnize({width: 180});
-            
-            $('#books-list .book').hover(
-                function() { $(this).css({background: '#F3F3F3', cursor: 'pointer'}); },
-                function() { $(this).css({background: '#FFF'}); }
-            ).click(function() {
-                location.href = $('h2 a', this).attr('href');
-            });
-            
-            $('#toggle-description').hover(
-                function() { $(this).css({background: '#F3F3F3', cursor: 'pointer'}); },
-                function() { $(this).css({background: '#EEE'}); }
-            ).click(function() {
-                if ($('#description').hasClass('hidden')) {
-                    $('#description').slideDown('fast').removeClass('hidden');
-                    $('p', this).html('Zwiń opis ▲');
-                } else {
-                    $('#description').slideUp('fast').addClass('hidden');
-                    $('p', this).html('Rozwiń opis ▼');
-                }
-            });
-            
-            var target = $('#set-window div.target');
-            
-            $('#set-window').jqm({
-                ajax: '@href', 
-                target: target[0],
-                overlay: 60,
-                trigger: 'a.jqm-trigger', 
-                onShow: function(hash) { 
-                    var offset = $(hash.t).offset();
-                    target.html('<p><img src="/media/img/indicator.gif" /> Ładowanie</p>');
-                    hash.w.css({position: 'absolute', left: offset.left, top: offset.top}).show() },
-                onLoad: function(hash) { 
-                    $('form', hash.w).ajaxForm({
-                        target: target,
-                        success: function() { setTimeout(function() { $('#set-window').jqmHide() }, 1000) }
-                    });
-                }});
-        });
-    // ]]>
-    </script>
-{% endblock %}
-
-{% block body %}
-    <h1>{% title_from_tags tags %}</h1>
-    {% breadcrumbs tags %}
-    
-    {% autopaginate object_list 10 %}
-    <div id="books-list">
-        {% with tags|last as last_tag %}
-        {% if last_tag.has_description %}
-            <div id="description">
-                {{ last_tag.description|safe }}
-            </div>
-            <div id="toggle-description"><p>Zwiń opis ▲</p></div>
-        {% endif %}
-        {% endwith %}
-        <ol>
-        {% for book in object_list %}
-            <li>{{ book.short_html }}</li>
-        {% endfor %}
-        </ol>
-        {% paginate %}
-    </div>
-    <div id="tags-list">
-        <div class="dontsplit">
-            {% if categories.set %}
-                <h2>Półki</h2>
-                <ul>
-                {% for set in categories.set %}
-                    <li><a href="{% catalogue_url tags set %}">{{ set }}&nbsp;({{ set.count }})</a></li>
-                {% endfor %}
-                </ul>
-            {% endif %}
-        </div>
-        <div class="dontsplit">
-            {% if categories.author %}
-                <h2>Autorzy</h2>
-                <ul>
-                {% for author in categories.author %}
-                    <li><a href="{% catalogue_url tags author %}">{{ author }}&nbsp;({{ author.count }})</a></li>
-                {% endfor %}
-                </ul>
-            {% endif %}
-        </div>
-        <div class="dontsplit">
-            {% if categories.epoch %}
-                <h2>Epoki</h2>
-                <ul>
-                {% for epoch in categories.epoch %}
-                    <li><a href="{% catalogue_url tags epoch %}">{{ epoch }}&nbsp;({{ epoch.count }})</a></li>
-                {% endfor %}
-                </ul>
-            {% endif %}
-        </div>
-        <div class="dontsplit">
-            {% if categories.kind %}
-                <h2>Rodzaje</h2>
-                <ul>
-                {% for kind in categories.kind %}
-                    <li><a href="{% catalogue_url tags kind %}">{{ kind }}&nbsp;({{ kind.count }})</a></li>
-                {% endfor %}
-                </ul>
-            {% endif %}
-        </div>
-        <div class="dontsplit">
-            {% if categories.genre %}
-                <h2>Gatunki literackie</h2>
-                <ul>
-                {% for genre in categories.genre %}
-                    <li><a href="{% catalogue_url tags genre %}">{{ genre }}&nbsp;({{ genre.count }})</a></li>
-                {% endfor %}
-                </ul>
-            {% endif %}
-        </div>
-        <div class="dontsplit">
-            {% if categories.theme %}
-                <h2>Motywy</h2>
-                <ul>
-                {% for theme in categories.theme %}
-                    <li><a href="{% catalogue_url tags theme %}">{{ theme }} ({{ theme.count }})</a></li>
-                {% endfor %}
-                </ul>
-            {% endif %}
-        </div>
-    </div>
-    <div id="set-window">
-        <div class="header"><a href="#" class="jqmClose">Zamknij</a></div>
-        <div class="target">
-            <p><img src="/media/img/indicator.gif" alt="*"/> Ładowanie</p>
-        </div>
-    </div>
-{% endblock %}
\ No newline at end of file
diff --git a/templates/catalogue/user_shelves.html b/templates/catalogue/user_shelves.html
deleted file mode 100644 (file)
index 44517c5..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<h2>Moje półki</h2>
-{% if shelves %}
-<ul class="shelf-list">
-{% for shelf in shelves %}
-    <li><a href="{% url delete_shelf shelf.slug %}" class="delete-shelf">usuń</a> <a href="{{ shelf.get_absolute_url }}" class="visit-shelf">{{ shelf.name }}</a></li>
-{% endfor %}
-</ul>
-{% else %}
-<p>Nie posiadasz żadnych półek. Jeśli chcesz, możesz utworzyć półkę poniżej.</p>
-{% endif %}
-<hr />
-<form action="{% url catalogue.views.new_set %}" method="POST" accept-charset="utf-8" class="cuteform">
-<ol>
-    <li>{{ new_set_form.name }} <input type="submit" value="Utwórz nową półkę"/></li>
-</ol>
diff --git a/templates/pagination/pagination.html b/templates/pagination/pagination.html
deleted file mode 100644 (file)
index 36c297b..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-{% if is_paginated %}
-<div class="pagination">
-    {% if page_obj.has_previous %}
-        <a href="?page={{ page_obj.previous_page_number }}{{ getvars }}" class="prev">&lsaquo;&lsaquo; poprzedni</a>
-    {% else %}
-        <span class="disabled prev">&lsaquo;&lsaquo; poprzedni</span>
-    {% endif %}
-    {% for page in pages %}
-        {% if page %}
-            {% ifequal page page_obj.number %}
-                <span class="current page">{{ page }}</span>
-            {% else %}
-                <a href="?page={{ page }}{{ getvars }}" class="page">{{ page }}</a>
-            {% endifequal %}
-        {% else %}
-            ...
-        {% endif %}
-    {% endfor %}
-    {% if page_obj.has_next %}
-        <a href="?page={{ page_obj.next_page_number }}{{ getvars }}" class="next">następny &rsaquo;&rsaquo;</a>
-    {% else %}
-        <span class="disabled next">następny &rsaquo;&rsaquo;</span>
-    {% endif %}
-</div>
-{% endif %}
diff --git a/urls.py b/urls.py
deleted file mode 100644 (file)
index 104899f..0000000
--- a/urls.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# -*- coding: utf-8 -*-
-import os
-
-from django.conf.urls.defaults import *
-from django.contrib import admin
-
-admin.autodiscover()
-
-
-urlpatterns = patterns('',
-    url(r'^katalog/', include('catalogue.urls')),
-    
-    # Panel administracyjny
-    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
-    url(r'^admin/(.*)$', admin.site.root),
-    
-    # Użytkownicy
-    url(r'^uzytkownicy/zaloguj/$', 'catalogue.views.login', name='login'),
-    url(r'^uzytkownicy/wyloguj/$', 'catalogue.views.logout_then_redirect', name='logout'),
-    url(r'^uzytkownicy/utworz/$', 'catalogue.views.register', name='register'),
-    
-    # Pliki statyczne
-    url(r'^media/(?P<path>.*)$', 'django.views.static.serve', 
-        {'document_root': os.path.join(os.path.dirname(__file__), 'media'), 'show_indexes': True}),
-    url(r'^$', 'django.views.generic.simple.redirect_to', {'url': 'katalog/'}),
-)
diff --git a/wolnelektury/README b/wolnelektury/README
new file mode 100644 (file)
index 0000000..8c024c0
--- /dev/null
@@ -0,0 +1,5 @@
+Dependencies
+============
+ * `Django 1.0 <http://djangoproject.com/>`_ (application framework)
+ * `lxml 2.0.0 <http://codespeak.net/lxml/>`_ (for importing books)
\ No newline at end of file
diff --git a/wolnelektury/__init__.py b/wolnelektury/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/wolnelektury/locale/pl/LC_MESSAGES/django.mo b/wolnelektury/locale/pl/LC_MESSAGES/django.mo
new file mode 100644 (file)
index 0000000..216cfcd
Binary files /dev/null and b/wolnelektury/locale/pl/LC_MESSAGES/django.mo differ
diff --git a/wolnelektury/locale/pl/LC_MESSAGES/django.po b/wolnelektury/locale/pl/LC_MESSAGES/django.po
new file mode 100644 (file)
index 0000000..b09ad09
--- /dev/null
@@ -0,0 +1,156 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-09-04 06:17-0500\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: catalogue/models.py:15
+msgid "author"
+msgstr "autor"
+
+#: catalogue/models.py:16
+msgid "epoch"
+msgstr "epoka"
+
+#: catalogue/models.py:17
+msgid "kind"
+msgstr "rodzaj"
+
+#: catalogue/models.py:18
+msgid "genre"
+msgstr "gatunek"
+
+#: catalogue/models.py:19
+msgid "theme"
+msgstr "motyw"
+
+#: catalogue/models.py:20
+msgid "set"
+msgstr "zestaw"
+
+#: catalogue/models.py:34
+msgid "name"
+msgstr "nazwa"
+
+#: catalogue/models.py:35 catalogue/models.py:71
+msgid "slug"
+msgstr "slug"
+
+#: catalogue/models.py:36
+msgid "sort key"
+msgstr "klucz sortowania"
+
+#: catalogue/models.py:37
+msgid "category"
+msgstr "kategoria"
+
+#: catalogue/models.py:45 catalogue/models.py:72 catalogue/models.py:86
+#: chunks/models.py:11
+msgid "description"
+msgstr "opis"
+
+#: catalogue/models.py:54 newtagging/models.py:470
+msgid "tag"
+msgstr "tag"
+
+#: catalogue/models.py:55 newtagging/admin.py:38
+msgid "tags"
+msgstr "tagi"
+
+#: catalogue/models.py:70
+msgid "title"
+msgstr "tytuł"
+
+#: catalogue/models.py:73
+msgid "creation date"
+msgstr "data utworzenia"
+
+#: catalogue/models.py:76
+msgid "XML file"
+msgstr "plik XML"
+
+#: catalogue/models.py:77
+msgid "PDF file"
+msgstr "plik PDF"
+
+#: catalogue/models.py:78
+msgid "ODT file"
+msgstr "plik ODT"
+
+#: catalogue/models.py:79
+msgid "HTML file"
+msgstr "plik HTML"
+
+#: catalogue/models.py:162
+msgid "book"
+msgstr "książka"
+
+#: catalogue/models.py:163
+msgid "books"
+msgstr "książki"
+
+#: catalogue/models.py:180
+msgid "fragment"
+msgstr "fragment"
+
+#: catalogue/models.py:181
+msgid "fragments"
+msgstr "fragmenty"
+
+#: chunks/models.py:10
+msgid "key"
+msgstr "klucz"
+
+#: chunks/models.py:10
+msgid "A unique name for this chunk of content"
+msgstr "Unikalna nazwa dla tego kawałka treści"
+
+#: chunks/models.py:12
+#, fuzzy
+msgid "content"
+msgstr "typ zawartości"
+
+#: chunks/models.py:16
+msgid "chunk"
+msgstr "kawałek"
+
+#: chunks/models.py:17
+msgid "chunks"
+msgstr "kawałki"
+
+#: newtagging/models.py:471
+msgid "content type"
+msgstr "typ zawartości"
+
+#: newtagging/models.py:472
+msgid "object id"
+msgstr "id obiektu"
+
+#: newtagging/views.py:29
+msgid "tagged_object_list must be called with a queryset or a model."
+msgstr ""
+
+#: newtagging/views.py:31
+msgid "tagged_object_list must be called with a tag model."
+msgstr ""
+
+#: newtagging/views.py:33
+msgid "tagged_object_list must be called with a tag."
+msgstr ""
+
+#: newtagging/views.py:37
+#, python-format
+msgid "No tags found matching \"%s\"."
+msgstr "Nie znaleziono tagów zgodnych z \"%s\"."
diff --git a/wolnelektury/manage.py b/wolnelektury/manage.py
new file mode 100755 (executable)
index 0000000..5e78ea9
--- /dev/null
@@ -0,0 +1,11 @@
+#!/usr/bin/env python
+from django.core.management import execute_manager
+try:
+    import settings # Assumed to be in the same directory.
+except ImportError:
+    import sys
+    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
+    sys.exit(1)
+
+if __name__ == "__main__":
+    execute_manager(settings)
diff --git a/wolnelektury/media/css/jquery.autocomplete.css b/wolnelektury/media/css/jquery.autocomplete.css
new file mode 100644 (file)
index 0000000..9c5a36d
--- /dev/null
@@ -0,0 +1,36 @@
+.ac_results {
+       padding: 0px;
+       border: 0.1em solid #999;
+       background-color: #FFF;
+       overflow: hidden;
+       z-index: 99999;
+}
+
+.ac_results ul {
+       width: 100%;
+       list-style-position: outside;
+       list-style: none;
+       padding: 0;
+       margin: 0;
+}
+
+.ac_results li {
+       margin: 0;
+       padding: 0.2em 0.5em;
+       cursor: default;
+       display: block;
+       overflow: hidden;
+}
+
+.ac_loading {
+       background: white url(/media/img/indicator.gif) right center no-repeat;
+}
+
+.ac_odd {
+       background-color: #EEE;
+}
+
+.ac_over {
+       background-color: #0A246A;
+       color: #FFF;
+}
diff --git a/wolnelektury/media/css/master.css b/wolnelektury/media/css/master.css
new file mode 100644 (file)
index 0000000..6615ee6
--- /dev/null
@@ -0,0 +1,454 @@
+body {
+    margin: 0 2em 2em 2em;
+    font: 70% Verdana, Arial, Helvetica, sans-serif;
+    line-height: 1.5em;
+    background: #FFF url(/media/img/bg.png) repeat-x;
+    color: #2F4110;
+}
+
+img {
+    border: none;
+}
+
+a {
+    color: #295158;
+    text-decoration: none;
+}
+
+a:hover, a:active {
+    text-decoration: underline;
+}
+
+input {
+    font: 1em Verdana, Arial, Helvetica, sans-serif; 
+}
+
+h1 {
+    font: normal normal bold 1.75em Arial, sans-serif;
+    color: #2F4110;
+    margin: 0.55em 0 0 0;
+}
+
+h2 {
+    font-size: 1.2em;
+    font-weight: bold;
+    color: #2F4110;
+    margin: 0;
+}
+
+h3 {
+    font-size: 1.3em;
+    font-weight: bold;
+    margin: 0.2em 0 0 0;
+    color: #333;
+}
+
+em {
+    font-style: normal;
+    background-color: #F5DC7D;
+}
+
+.clearboth {
+    clear: both;
+}
+
+.blur {
+    color: #777;
+}
+
+/* ================================== */
+/* = Header with logo and user-info = */
+/* ================================== */
+#header {
+    position: relative;
+    margin-top: 1.5em;
+}
+
+#header #logo {
+    float: left;
+}
+
+#header #user-info {
+    margin: 0 0 0 auto;
+    width: 40em;
+    text-align: right;
+}
+
+#site-description {
+    margin-top: -1.5em;
+    height:4.5em;
+    overflow: hidden;
+    float: right;
+    width: 42em;
+    text-align: right;
+    color: #777;
+}
+
+/* ======================== */
+/* = Footer with sponsors = */
+/* ======================== */
+#footer {
+    border-top: 0.1em solid #999;
+    color: #999;
+    font-size: 0.8em;
+    padding-top: 0.5em;
+    margin: 2em 0 0 0;
+}
+
+#footer p {
+    margin: 0;
+}
+
+#footer a {
+    color: #999;
+    text-decoration: underline;
+}
+
+
+/* =============== */
+/* = Search form = */
+/* =============== */
+#search-form {
+    margin: 0.5em 0;
+    padding: 0.5em;
+    background-color: rgb(132, 191, 42);
+    -moz-border-radius: 4px;
+    -webkit-border-radius: 4px;
+    border-radius: 4px;
+    border-bottom: 0.15em solid #7B9C2D;
+    border-right: 0.15em solid #7B9C2D;
+}
+
+#search-form p {
+    margin: 0em 0 0 0;
+}
+
+#search-form ol {
+    margin: 0;
+    padding: 0;
+}
+
+#search-form li {
+    margin: 0;
+    padding: 0;
+    list-style: none;
+    display: inline;
+}
+
+#search-form li.category, #search-form li.book-title {
+    padding: 0.2em 0.5em 0.2em 0.5em;
+    background-color: rgb(242, 163, 15);
+    border: 1px solid #BA8722;
+    border-right: 1px solid #555;
+    border-bottom: 1px solid #555;
+    -moz-border-radius: 3px;
+    -webkit-border-radius: 3px;
+    border-radius: 3px;
+}
+
+#search-form li.book-title {
+    background-color: #DDD;
+    border: 1px solid #999;
+    border-right: 1px solid #555;
+    border-bottom: 1px solid #555;
+}
+
+#search-form input[type=submit] {
+    color: #444;
+}
+
+/* TODO: Shouldn't be needed */
+#book-detail #search-form {
+    padding: 0.75em 0.5em;
+}
+
+.ac_input {
+    width: 20em;
+}
+
+
+/* ============= */
+/* = Tags list = */
+/* ============= */
+#tags-list {
+    margin-top: 1em;
+    padding: 1em;
+    background-color: #FBEF90;
+    -moz-border-radius: 4px;
+    -webkit-border-radius: 4px;
+    border-radius: 4px;
+    border-bottom: 0.15em solid #E3D888;
+    border-right: 0.15em solid #E3D888;
+}
+
+#books #tags-list, #book-detail #tags-list {
+    margin-left: 39em;
+}
+
+#tags-list ol, #tags-list ul {
+    padding: 0;
+    margin: 0.3em 0 1.2em 0;
+}
+
+#tags-list li {
+    list-style: none;
+    padding: 0;
+    margin: 0;
+}
+
+#main-page #categories-list {
+    float: left;
+    width: 50%;
+}
+
+#main-page #themes-list {
+    margin-left: 50%;
+}
+
+
+.column {
+    padding-right: 1em;
+}
+
+.last.column {
+    padding-right: 0;
+}
+
+
+#books-list {
+    width: 38em;
+    float: left;
+}
+
+/* ===================== */
+/* = Latest blog posts = */
+/* ===================== */
+#latest-blog-posts {
+    padding: 0.5em;
+    margin-top: 0.5em;
+}
+
+#latest-blog-posts ol {
+    padding: 0 0 0 1.5em;
+    margin: 0.3em 0 0 0;
+    list-style-type: square;
+    color: #D13628;
+}
+
+/* =============== */
+/* = Description = */
+/* =============== */
+#description {
+    margin-top: 0.5em;
+    text-align: justify;
+}
+
+#toggle-description, #books .pagination {
+    width: 100%;
+    height: 1.5em;
+    background-color: #EEE;
+    margin-top: 0.5em;
+    -moz-border-radius: 4px;
+    -webkit-border-radius: 4px;
+    border-radius: 4px;
+    text-align: center;
+}
+
+#toggle-description p {
+    margin: 0;
+    padding: 0;
+    color: #999;
+}
+
+/* ============================ */
+/* = Books and fragments list = */
+/* ============================ */
+#books-list {
+    margin: 0;
+}
+
+#books-list ol {
+    list-style: none;
+    padding: 0;
+    margin: 1.5em 0;
+}
+
+.book {
+    padding: 0.5em;
+    background-color: #FFF;
+    -moz-border-radius: 3px;
+    -webkit-border-radius: 3px;
+    border-radius: 3px;
+}
+
+.fragment {
+    border-bottom: 0.1em solid #EEE;
+    margin-top: 0.5em;
+}
+
+.fragment-text, .fragment-short-text {
+    padding: 0.5em;
+    background-color: #FFF;
+    -moz-border-radius: 3px;
+    -webkit-border-radius: 3px;
+    border-radius: 3px;
+}
+
+.fragment-metadata {
+    padding: 0.5em 0.5em 1.5em 0.5em;
+    float: right;
+}
+
+.change-sets {
+    float: right;
+}
+
+.book-description {
+    margin-left: 3.5em;
+}
+
+.book-thumbnail {
+    background: transparent url(/media/img/book.png) no-repeat 0 0;
+    width: 3em;
+    height: 3em;
+    float: left;
+}
+
+/* =============== */
+/* = Simple form = */
+/* =============== */
+.cuteform ol, .cuteform ul {
+    padding: 0;
+    margin: 0;
+    list-style: none;
+}
+
+.cuteform ol li, .cuteform ul li {
+    margin-top: 0.7em;
+}
+
+.cuteform label {
+    display: block;
+}
+
+.cuteform span.help-text {
+    display: block;
+    font-size: 0.8em;
+    color: #999;
+}
+
+.cuteform .error {
+    color: #BF3024;
+}
+
+/* ================ */
+/* = Modal Window = */
+/* ================ */
+.jqmOverlay { background-color: #000; }
+
+#set-window {
+    position: absolute;
+    display: none;
+    width: 32em;
+    background-color: transparent;
+    margin-top: -0.5em;
+    margin-left: -1em;
+}
+
+#set-window div.header {
+    background-color: #FFF;
+    border-right: 0.25em solid #DDD;
+    width: 4em;
+    padding: 0.5em 1em 0.5em 1em;
+}
+
+#set-window div.target {
+    background-color: #FFF;
+    border-right: 0.3em solid #DDD;
+    border-bottom: 0.3em solid #DDD;
+    padding: 1em;
+}
+
+#login-register-window {
+    position: absolute;
+    display: none;
+    width: 24em;
+    background-color: transparent;
+    margin-top: -0.5em;
+    margin-left: 1em;
+}
+
+#login-register-window div.header {
+    background-color: #FFF;
+    border-right: 0.3em solid #DDD;
+    width: 4em;
+    right: 0;
+    left: auto;
+    padding: 0.5em 1em 0.5em 1em;
+    float: right;
+    text-align: center;
+}
+
+#login-register-window div.target {
+    clear: both;
+    background-color: #FFF;
+    border-right: 0.3em solid #DDD;
+    border-bottom: 0.3em solid #DDD;
+    padding: 1em;
+}
+
+#user-shelves-window {
+    position: absolute;
+    display: none;
+    width: 28em;
+    background-color: transparent;
+    margin-top: -0.5em;
+    margin-left: 1em;
+}
+
+#user-shelves-window div.header {
+    background-color: #FFF;
+    border-right: 0.3em solid #DDD;
+    width: 4em;
+    right: 0;
+    left: auto;
+    padding: 0.5em 1em 0.5em 1em;
+    float: right;
+    text-align: center;
+}
+
+#user-shelves-window div.target {
+    clear: both;
+    background-color: #FFF;
+    border-right: 0.3em solid #DDD;
+    border-bottom: 0.3em solid #DDD;
+    padding: 1em;
+}
+
+#user-shelves-window ul {
+    list-style: none;
+    padding: 0;
+}
+
+#user-shelves-window a.delete-shelf {
+    color: #900;
+    float: right;
+}
+
+/* ======================== */
+/* = Alphabetic book list = */
+/* ======================== */
+#book-a-list #book-list ol {
+    padding: 0;
+    margin: 0.3em 0 1.2em 0;
+    list-style: none;
+}
+
+#top-message {
+    background-color: #2F4110;
+    color: #FFF;
+    margin: 0 -2em;
+    padding: 0 2em;
+    line-height: 2em;
+}
+
diff --git a/wolnelektury/media/css/master.plain.css b/wolnelektury/media/css/master.plain.css
new file mode 100644 (file)
index 0000000..55bc023
--- /dev/null
@@ -0,0 +1,116 @@
+/* =================================================== */
+/* = Common elements: headings, paragraphs and lines = */
+/* =================================================== */
+.fragment h1 {
+    font-size: 3em;
+    margin: 1.5em 0;
+    text-align: center;
+    line-height: 1.5em;
+    font-weight: bold;
+}
+
+.fragment h2 {
+    font-size: 2em;
+    margin: 1.5em 0 0;
+    font-weight: bold;
+    line-height: 1.5em;
+}
+
+.fragment h3 {
+    font-size: 1.5em;
+    margin: 1.5em 0 0;
+    font-weight: normal;
+    line-height: 1.5em;
+}
+
+.fragment h4 {
+    font-size: 1em;
+    margin: 1.5em 0 0;
+    line-height: 1.5em;
+}
+
+.fragment p {
+    margin: 0;
+}
+
+/* ======================== */
+/* = Footnotes and themes = */
+/* ======================== */
+.theme-begin {
+    display: none;
+}
+
+.annotation {
+    display: none;
+}
+
+/* =================== */
+/* = Custom elements = */
+/* =================== */
+span.author {
+    font-size: 0.75em;
+    display: block;
+    line-height: 1.5em;
+    margin-bottom: 0.25em;
+}
+
+span.collection {
+    font-size: 0.75em;
+    display: block;
+    line-height: 1.5em;
+    margin-bottom: -0.25em;
+}
+
+span.subtitle {
+    font-size: 0.75em;
+    display: block;
+    line-height: 1.5em;
+    margin-top: -0.25em;
+}
+
+div.didaskalia {
+    font-style: italic;
+    margin: 0.5em 0 0;
+}
+
+div.kwestia {
+    margin: 0.5em 0 0;
+}
+
+div.stanza {
+    margin: 1.5em 0 0;
+}
+
+div.kwestia div.stanza {
+    margin: 0;
+}
+
+p.paragraph {
+    text-align: justify;
+    margin: 1.5em 0 0;
+}
+
+p.motto {
+    text-align: justify;
+    font-style: italic;
+    margin: 1.5em 0 0;
+}
+
+p.motto_podpis {
+    font-size: 0.875em;
+}
+
+/*div.fragment {
+    border-bottom: 0.1em solid #999;
+    padding-bottom: 1.5em;
+}*/
+
+div.note p, div.note p.paragraph {
+    text-align: right;
+    font-style: italic;
+}
+
+hr.spacer {
+    height: 3em;
+    visibility: hidden;
+}
diff --git a/wolnelektury/media/img/bg.png b/wolnelektury/media/img/bg.png
new file mode 100644 (file)
index 0000000..be7d63a
Binary files /dev/null and b/wolnelektury/media/img/bg.png differ
diff --git a/wolnelektury/media/img/book.png b/wolnelektury/media/img/book.png
new file mode 100644 (file)
index 0000000..f264839
Binary files /dev/null and b/wolnelektury/media/img/book.png differ
diff --git a/wolnelektury/media/img/favicon.png b/wolnelektury/media/img/favicon.png
new file mode 100644 (file)
index 0000000..6cffce8
Binary files /dev/null and b/wolnelektury/media/img/favicon.png differ
diff --git a/wolnelektury/media/img/footer.png b/wolnelektury/media/img/footer.png
new file mode 100644 (file)
index 0000000..7863423
Binary files /dev/null and b/wolnelektury/media/img/footer.png differ
diff --git a/wolnelektury/media/img/indicator.gif b/wolnelektury/media/img/indicator.gif
new file mode 100644 (file)
index 0000000..085ccae
Binary files /dev/null and b/wolnelektury/media/img/indicator.gif differ
diff --git a/wolnelektury/media/img/logo.png b/wolnelektury/media/img/logo.png
new file mode 100644 (file)
index 0000000..bf92ee0
Binary files /dev/null and b/wolnelektury/media/img/logo.png differ
diff --git a/wolnelektury/media/js/catalogue.js b/wolnelektury/media/js/catalogue.js
new file mode 100644 (file)
index 0000000..ad5a7c2
--- /dev/null
@@ -0,0 +1,131 @@
+(function($) {
+    $(function() {
+        $('#id_q').labelify({labelledClass: 'blur'});
+        
+        target = $('#login-register-window div.target');
+        
+        $('#show-registration-form').click(function() {
+            $('#login-form').hide();
+            $('#registration-form').show();
+        });
+        
+        $('#show-login-form').click(function() {
+            $('#registration-form').hide();
+            $('#login-form').show();
+        });
+        
+        // Fragments
+        $('.fragment-text').each(function() {
+            if ($(this).prev().filter('.fragment-short-text').length) {
+                $(this).hover(
+                    function() { $(this).css({background: '#F3F3F3', cursor: 'pointer'}); },
+                    function() { $(this).css({background: '#FFF'}); }
+                ).click(function() {
+                    $(this).fadeOut(function() {
+                        $(this).prev().fadeIn()
+                    });
+                })
+            }
+        });
+        
+        $('.fragment-short-text').click(function() {
+            $(this).fadeOut(function() { $(this).next().fadeIn() });
+        }).hover(
+            function() { $(this).css({background: '#F3F3F3', cursor: 'pointer'}); },
+            function() { $(this).css({background: '#FFF'}); }
+        );
+        
+        $('#registration-form').ajaxForm({
+            dataType: 'json',
+            beforeSubmit: function() {
+                $('#registration-form input[type=submit]')
+                    .attr('disabled', 'disabled')
+                    .after('<img src="/media/img/indicator.gif" style="margin-left: 0.5em"/>');
+            },
+            success: function(response) {
+                if (response.success) {
+                    location.reload(true);
+                } else {
+                    $('#registration-form span.error').remove();
+                    $.each(response.errors, function(id, errors) {
+                        $('#id_registration-' + id).before('<span class="error">' + errors[0] + '</span>');
+                    });
+                    $('#registration-form input[type=submit]').removeAttr('disabled');
+                    $('#registration-form img').remove();
+                }
+            }
+        });
+        
+        $('#login-form').ajaxForm({
+            dataType: 'json',
+            beforeSubmit: function() {
+                $('#login-form input[type=submit]')
+                    .attr('disabled', 'disabled')
+                    .after('<img src="/media/img/indicator.gif" style="margin-left: 0.5em"/>');
+            },
+            success: function(response) {
+                if (response.success) {
+                    location.reload(true);
+                } else {
+                    $('#login-form span.error').remove();
+                    $.each(response.errors, function(id, errors) {
+                        $('#id_login-' + id).before('<span class="error">' + errors[0] + '</span>');
+                    });
+                    $('#login-form input[type=submit]').removeAttr('disabled');
+                    $('#login-form img').remove();
+                }
+            }
+        });
+        
+        $('#login-register-window').jqm({
+            target: target[0],
+            overlay: 60,
+            trigger: '#login-register-link',
+            onShow: function(hash) {
+                var offset = $(hash.t).offset();
+                hash.w.css({position: 'absolute', left: offset.left - hash.w.width() + $(hash.t).width(), top: offset.top});
+                $('div.header', hash.w).css({width: $(hash.t).width()});
+                hash.w.show();
+            }
+        });
+        
+        $('#user-shelves-window').jqm({
+            ajax: '@href',
+            target: $('#user-shelves-window div.target')[0],
+            overlay: 60,
+            trigger: '#user-shelves-link',
+            onShow: function(hash) {
+                var offset = $(hash.t).offset();
+                hash.w.css({position: 'absolute', left: offset.left - hash.w.width() + $(hash.t).width(), top: offset.top});
+                $('div.header', hash.w).css({width: $(hash.t).width()});
+                hash.w.show();
+            },
+            onLoad: function(hash) { 
+                var shelf_name = $('a.visit-shelf', this).html();
+                
+                $('form', hash.w).ajaxForm({
+                    target: $('#user-shelves-window div.target'),
+                    success: function() { setTimeout(function() { $('#user-shelves-window').jqmHide() }, 1000) }
+                });
+                
+                $('ul.shelf-list li', hash.w).hover(function() {
+                    $(this).css({background: '#EEE', cursor: 'pointer'});
+                }, function() {
+                    $(this).css({background: 'transparent'});
+                }).click(function() {
+                    location.href = $('a.visit-shelf', this).attr('href');
+                });
+                
+                $('.delete-shelf').click(function() { 
+                    if (confirm('Czy na pewno usunąć półkę ' + shelf_name + '?')) {
+                        $.post($(this).attr('href'), function(data, textStatus) {
+                            $('#user-shelves-window div.target').html(data);
+                            setTimeout(function() { $('#user-shelves-window').jqmHide() }, 1000);
+                        });
+                    }
+                    return false;
+                });
+            }
+        });
+    });
+})(jQuery)
\ No newline at end of file
diff --git a/wolnelektury/media/js/jquery.autocolumn.js b/wolnelektury/media/js/jquery.autocolumn.js
new file mode 100644 (file)
index 0000000..ea896b6
--- /dev/null
@@ -0,0 +1,202 @@
+// version 1.1.0
+// http://welcome.totheinter.net/columnizer-jquery-plugin/
+// created by: Adam Wulf adam.wulf@gmail.com
+
+(function($){
+ $.fn.columnize = function(options) {
+
+
+       var defaults = {
+               width: 400,
+               columns : false,
+               buildOnce : false
+       };
+       var options = $.extend(defaults, options);
+
+    return this.each(function() {
+           var $inBox = $(this);
+               var maxHeight = $inBox.height();
+               var $cache = $('<div></div>'); // this is where we'll put the real content
+               var lastWidth = 0;
+               var columnizing = false;
+               $cache.append($inBox.children().clone());
+               
+               columnizeIt();
+               
+               $(window).resize(function() {
+                       if(!options.buildOnce && $.browser.msie){
+                               if($inBox.data("timeout")){
+                                       clearTimeout($inBox.data("timeout"));
+                               }
+                               $inBox.data("timeout", setTimeout(columnizeIt, 200));
+                       }else if(!options.buildOnce){
+                               columnizeIt();
+                       }else{
+                               // don't rebuild
+                       }
+               });
+               
+               /**
+                * return a node that has a height
+                * less than or equal to height
+                *
+                * @param putInHere, a dom element
+                * @$pullOutHere, a jQuery element
+                */
+               function columnize($putInHere, $pullOutHere, $parentColumn, height){
+                       while($parentColumn.height() < height &&
+                                 $pullOutHere[0].childNodes.length){
+                               $putInHere.append($pullOutHere[0].childNodes[0]);
+                       }
+                       if($putInHere[0].childNodes.length == 0) return;
+                       
+                       // now we're too tall, undo the last one
+                       var kids = $putInHere[0].childNodes;
+                       var lastKid = kids[kids.length-1];
+                       $putInHere[0].removeChild(lastKid);
+                       var $item = $(lastKid);
+                       if($item[0].nodeType == 3){
+                               // it's a text node, split it up
+                               var oText = $item[0].nodeValue;
+                               var counter2 = options.width / 8;
+                               var columnText;
+                               while($parentColumn.height() < height && oText.length){
+                                       if (oText.indexOf(' ', counter2) != '-1') {
+                                               columnText = oText.substring(0, oText.indexOf(' ', counter2));
+                                       } else {
+                                               columnText = oText;
+                                       }
+                                       $putInHere.append(document.createTextNode(columnText));
+                                       if(oText.length > counter2){
+                                               oText = oText.substring(oText.indexOf(' ', counter2));
+                                       }else{
+                                               oText = "";
+                                       }
+                               }
+                               if(oText.length){
+                                       $item[0].nodeValue = oText;
+                               }else{
+                                       return;
+                               }
+                       }
+                       
+                       if($pullOutHere.children().length){
+                               $pullOutHere.prepend($item);
+                       }else{
+                               $pullOutHere.append($item);
+                       }
+               }
+               
+               function split($putInHere, $pullOutHere, $parentColumn, height){
+                       if($pullOutHere.children().length){
+                               $cloneMe = $pullOutHere.children(":first");
+                               $clone = $cloneMe.clone();
+                               if($clone.attr("nodeType") == 1){ 
+                                       $putInHere.append($clone);
+                                       if($clone.is("img") && $parentColumn.height() < height + 20){
+                                               $cloneMe.remove();
+                                       }else if(!$cloneMe.hasClass("dontsplit") && $parentColumn.height() < height + 20){
+                                               $cloneMe.remove();
+                                       }else if($clone.is("img") || $cloneMe.hasClass("dontsplit")){
+                                               $clone.remove();
+                                       }else{
+                                               $clone.empty();
+                                               columnize($clone, $cloneMe, $parentColumn, height);
+                                               if($cloneMe.children().length){
+                                                       split($clone, $cloneMe, $parentColumn, height);
+                                               }
+                                       }
+                               }
+                       }
+               }
+               
+               
+               function singleColumnizeIt() {
+                       if ($inBox.data("columnized") && $inBox.children().length == 1) {
+                               return;
+                       }
+                       $inBox.data("columnized", true);
+                       $inBox.data("columnizing", true);
+                       
+                       $inBox.empty();
+                       $inBox.append($("<div class='first last column'></div>")); //"
+                       $col = $inBox.children().eq($inBox.children().length-1);
+                       $col.append($cache.clone());
+                       
+                       $inBox.data("columnizing", false);
+               }
+               
+               
+               function columnizeIt() {
+                       if(lastWidth == $inBox.width()) return;
+                       lastWidth = $inBox.width();
+                       
+                       var numCols = Math.round($inBox.width() / options.width);
+                       if(options.columns) numCols = options.columns;
+//                     if ($inBox.data("columnized") && numCols == $inBox.children().length) {
+//                             return;
+//                     }
+                       if(numCols <= 1){
+                               return singleColumnizeIt();
+                       }
+                       if($inBox.data("columnizing")) return;
+                       $inBox.data("columnized", true);
+                       $inBox.data("columnizing", true);
+                       
+                       $inBox.empty();
+                       $inBox.append($("<div style='width:" + (Math.round(100 / numCols) - 2)+ "%; padding: 3px; float: left;'></div>")); //"
+                       $col = $inBox.children(":last");
+                       $col.append($cache.clone());
+                       maxHeight = $col.height();
+                       $inBox.empty();
+                       
+                       var targetHeight = maxHeight / numCols;
+                       var firstTime = true;
+                       var maxLoops = 3;
+                       for(var loopCount=0;loopCount<maxLoops;loopCount++){
+                               $inBox.empty();
+                               var $destroyable = $cache.clone();
+                               $destroyable.css("visibility", "hidden");
+                               // create the columns
+                               for (var i = 0; i < numCols; i++) {
+                                       /* create column */
+                                       var className = (i == 0) ? "first column" : "column";
+                                       var className = (i == numCols - 1) ? ("last " + className) : className;
+                                       $inBox.append($("<div class='" + className + "' style='width:" + (Math.round(100 / numCols) - 2)+ "%; float: left;'></div>")); //"
+                               }
+                               
+                               // fill all but the last column
+                               for (var i = 0; i < numCols-1; i++) {
+                                       var $col = $inBox.children().eq(i);
+                                       columnize($col, $destroyable, $col, targetHeight);
+                                       split($col, $destroyable, $col, targetHeight);
+                               }
+                               // the last column in the series
+                               $col = $inBox.children().eq($inBox.children().length-1);
+                               while($destroyable.children().length) $col.append($destroyable.children(":first"));
+                               var afterH = $col.height();
+                               var diff = afterH - targetHeight;
+                               var totalH = 0;
+                               var min = 10000000;
+                               var max = 0;
+                               $inBox.children().each(function($inBox){ return function($item){
+                                       var h = $inBox.children().eq($item).height();
+                                       totalH += h;
+                                       if(h > max) max = h;
+                                       if(h < min) min = h;
+                               }}($inBox));
+                               var avgH = totalH / numCols;
+                               if(max - min > 30){
+                                       targetHeight = avgH + 30;
+                               }else if(Math.abs(avgH-targetHeight) > 20){
+                                       targetHeight = avgH;
+                               }else{
+                                       loopCount = maxLoops;
+                               }
+                               $inBox.append($("<br style='clear:both;'>"));
+                       }
+                       $inBox.data("columnizing", false);
+               }
+    });
+ };
+})(jQuery);
diff --git a/wolnelektury/media/js/jquery.autocomplete.js b/wolnelektury/media/js/jquery.autocomplete.js
new file mode 100644 (file)
index 0000000..5ad9178
--- /dev/null
@@ -0,0 +1,759 @@
+/*
+ * Autocomplete - jQuery plugin 1.0.2
+ *
+ * Copyright (c) 2007 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, Jörn Zaefferer
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id: jquery.autocomplete.js 5747 2008-06-25 18:30:55Z joern.zaefferer $
+ *
+ */
+
+;(function($) {
+       
+$.fn.extend({
+       autocomplete: function(urlOrData, options) {
+               var isUrl = typeof urlOrData == "string";
+               options = $.extend({}, $.Autocompleter.defaults, {
+                       url: isUrl ? urlOrData : null,
+                       data: isUrl ? null : urlOrData,
+                       delay: isUrl ? $.Autocompleter.defaults.delay : 10,
+                       max: options && !options.scroll ? 10 : 150
+               }, options);
+               
+               // if highlight is set to false, replace it with a do-nothing function
+               options.highlight = options.highlight || function(value) { return value; };
+               
+               // if the formatMatch option is not specified, then use formatItem for backwards compatibility
+               options.formatMatch = options.formatMatch || options.formatItem;
+               
+               return this.each(function() {
+                       new $.Autocompleter(this, options);
+               });
+       },
+       result: function(handler) {
+               return this.bind("result", handler);
+       },
+       search: function(handler) {
+               return this.trigger("search", [handler]);
+       },
+       flushCache: function() {
+               return this.trigger("flushCache");
+       },
+       setOptions: function(options){
+               return this.trigger("setOptions", [options]);
+       },
+       unautocomplete: function() {
+               return this.trigger("unautocomplete");
+       }
+});
+
+$.Autocompleter = function(input, options) {
+
+       var KEY = {
+               UP: 38,
+               DOWN: 40,
+               DEL: 46,
+               TAB: 9,
+               RETURN: 13,
+               ESC: 27,
+               COMMA: 188,
+               PAGEUP: 33,
+               PAGEDOWN: 34,
+               BACKSPACE: 8
+       };
+
+       // Create $ object for input element
+       var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass);
+
+       var timeout;
+       var previousValue = "";
+       var cache = $.Autocompleter.Cache(options);
+       var hasFocus = 0;
+       var lastKeyPressCode;
+       var config = {
+               mouseDownOnSelect: false
+       };
+       var select = $.Autocompleter.Select(options, input, selectCurrent, config);
+       
+       var blockSubmit;
+       
+       // prevent form submit in opera when selecting with return key
+       $.browser.opera && $(input.form).bind("submit.autocomplete", function() {
+               if (blockSubmit) {
+                       blockSubmit = false;
+                       return false;
+               }
+       });
+       
+       // only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all
+       $input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) {
+               // track last key pressed
+               lastKeyPressCode = event.keyCode;
+               switch(event.keyCode) {
+               
+                       case KEY.UP:
+                               event.preventDefault();
+                               if ( select.visible() ) {
+                                       select.prev();
+                               } else {
+                                       onChange(0, true);
+                               }
+                               break;
+                               
+                       case KEY.DOWN:
+                               event.preventDefault();
+                               if ( select.visible() ) {
+                                       select.next();
+                               } else {
+                                       onChange(0, true);
+                               }
+                               break;
+                               
+                       case KEY.PAGEUP:
+                               event.preventDefault();
+                               if ( select.visible() ) {
+                                       select.pageUp();
+                               } else {
+                                       onChange(0, true);
+                               }
+                               break;
+                               
+                       case KEY.PAGEDOWN:
+                               event.preventDefault();
+                               if ( select.visible() ) {
+                                       select.pageDown();
+                               } else {
+                                       onChange(0, true);
+                               }
+                               break;
+                       
+                       // matches also semicolon
+                       case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA:
+                       case KEY.TAB:
+                       case KEY.RETURN:
+                               if( selectCurrent() ) {
+                                       // stop default to prevent a form submit, Opera needs special handling
+                                       event.preventDefault();
+                                       blockSubmit = true;
+                                       return false;
+                               }
+                               break;
+                               
+                       case KEY.ESC:
+                               select.hide();
+                               break;
+                               
+                       default:
+                               clearTimeout(timeout);
+                               timeout = setTimeout(onChange, options.delay);
+                               break;
+               }
+       }).focus(function(){
+               // track whether the field has focus, we shouldn't process any
+               // results if the field no longer has focus
+               hasFocus++;
+       }).blur(function() {
+               hasFocus = 0;
+               if (!config.mouseDownOnSelect) {
+                       hideResults();
+               }
+       }).click(function() {
+               // show select when clicking in a focused field
+               if ( hasFocus++ > 1 && !select.visible() ) {
+                       onChange(0, true);
+               }
+       }).bind("search", function() {
+               // TODO why not just specifying both arguments?
+               var fn = (arguments.length > 1) ? arguments[1] : null;
+               function findValueCallback(q, data) {
+                       var result;
+                       if( data && data.length ) {
+                               for (var i=0; i < data.length; i++) {
+                                       if( data[i].result.toLowerCase() == q.toLowerCase() ) {
+                                               result = data[i];
+                                               break;
+                                       }
+                               }
+                       }
+                       if( typeof fn == "function" ) fn(result);
+                       else $input.trigger("result", result && [result.data, result.value]);
+               }
+               $.each(trimWords($input.val()), function(i, value) {
+                       request(value, findValueCallback, findValueCallback);
+               });
+       }).bind("flushCache", function() {
+               cache.flush();
+       }).bind("setOptions", function() {
+               $.extend(options, arguments[1]);
+               // if we've updated the data, repopulate
+               if ( "data" in arguments[1] )
+                       cache.populate();
+       }).bind("unautocomplete", function() {
+               select.unbind();
+               $input.unbind();
+               $(input.form).unbind(".autocomplete");
+       });
+       
+       
+       function selectCurrent() {
+               var selected = select.selected();
+               if( !selected )
+                       return false;
+               
+               var v = selected.result;
+               previousValue = v;
+               
+               if ( options.multiple ) {
+                       var words = trimWords($input.val());
+                       if ( words.length > 1 ) {
+                               v = words.slice(0, words.length - 1).join( options.multipleSeparator ) + options.multipleSeparator + v;
+                       }
+                       v += options.multipleSeparator;
+               }
+               
+               $input.val(v);
+               hideResultsNow();
+               $input.trigger("result", [selected.data, selected.value]);
+               return true;
+       }
+       
+       function onChange(crap, skipPrevCheck) {
+               if( lastKeyPressCode == KEY.DEL ) {
+                       select.hide();
+                       return;
+               }
+               
+               var currentValue = $input.val();
+               
+               if ( !skipPrevCheck && currentValue == previousValue )
+                       return;
+               
+               previousValue = currentValue;
+               
+               currentValue = lastWord(currentValue);
+               if ( currentValue.length >= options.minChars) {
+                       $input.addClass(options.loadingClass);
+                       if (!options.matchCase)
+                               currentValue = currentValue.toLowerCase();
+                       request(currentValue, receiveData, hideResultsNow);
+               } else {
+                       stopLoading();
+                       select.hide();
+               }
+       };
+       
+       function trimWords(value) {
+               if ( !value ) {
+                       return [""];
+               }
+               var words = value.split( options.multipleSeparator );
+               var result = [];
+               $.each(words, function(i, value) {
+                       if ( $.trim(value) )
+                               result[i] = $.trim(value);
+               });
+               return result;
+       }
+       
+       function lastWord(value) {
+               if ( !options.multiple )
+                       return value;
+               var words = trimWords(value);
+               return words[words.length - 1];
+       }
+       
+       // fills in the input box w/the first match (assumed to be the best match)
+       // q: the term entered
+       // sValue: the first matching result
+       function autoFill(q, sValue){
+               // autofill in the complete box w/the first match as long as the user hasn't entered in more data
+               // if the last user key pressed was backspace, don't autofill
+               if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) {
+                       // fill in the value (keep the case the user has typed)
+                       $input.val($input.val() + sValue.substring(lastWord(previousValue).length));
+                       // select the portion of the value not typed by the user (so the next character will erase)
+                       $.Autocompleter.Selection(input, previousValue.length, previousValue.length + sValue.length);
+               }
+       };
+
+       function hideResults() {
+               clearTimeout(timeout);
+               timeout = setTimeout(hideResultsNow, 200);
+       };
+
+       function hideResultsNow() {
+               var wasVisible = select.visible();
+               select.hide();
+               clearTimeout(timeout);
+               stopLoading();
+               if (options.mustMatch) {
+                       // call search and run callback
+                       $input.search(
+                               function (result){
+                                       // if no value found, clear the input box
+                                       if( !result ) {
+                                               if (options.multiple) {
+                                                       var words = trimWords($input.val()).slice(0, -1);
+                                                       $input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") );
+                                               }
+                                               else
+                                                       $input.val( "" );
+                                       }
+                               }
+                       );
+               }
+               if (wasVisible)
+                       // position cursor at end of input field
+                       $.Autocompleter.Selection(input, input.value.length, input.value.length);
+       };
+
+       function receiveData(q, data) {
+               if ( data && data.length && hasFocus ) {
+                       stopLoading();
+                       select.display(data, q);
+                       autoFill(q, data[0].value);
+                       select.show();
+               } else {
+                       hideResultsNow();
+               }
+       };
+
+       function request(term, success, failure) {
+               if (!options.matchCase)
+                       term = term.toLowerCase();
+               var data = cache.load(term);
+               // recieve the cached data
+               if (data && data.length) {
+                       success(term, data);
+               // if an AJAX url has been supplied, try loading the data now
+               } else if( (typeof options.url == "string") && (options.url.length > 0) ){
+                       
+                       var extraParams = {
+                               timestamp: +new Date()
+                       };
+                       $.each(options.extraParams, function(key, param) {
+                               extraParams[key] = typeof param == "function" ? param() : param;
+                       });
+                       
+                       $.ajax({
+                               // try to leverage ajaxQueue plugin to abort previous requests
+                               mode: "abort",
+                               // limit abortion to this input
+                               port: "autocomplete" + input.name,
+                               dataType: options.dataType,
+                               url: options.url,
+                               data: $.extend({
+                                       q: lastWord(term),
+                                       limit: options.max
+                               }, extraParams),
+                               success: function(data) {
+                                       var parsed = options.parse && options.parse(data) || parse(data);
+                                       cache.add(term, parsed);
+                                       success(term, parsed);
+                               }
+                       });
+               } else {
+                       // if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match
+                       select.emptyList();
+                       failure(term);
+               }
+       };
+       
+       function parse(data) {
+               var parsed = [];
+               var rows = data.split("\n");
+               for (var i=0; i < rows.length; i++) {
+                       var row = $.trim(rows[i]);
+                       if (row) {
+                               row = row.split("|");
+                               parsed[parsed.length] = {
+                                       data: row,
+                                       value: row[0],
+                                       result: options.formatResult && options.formatResult(row, row[0]) || row[0]
+                               };
+                       }
+               }
+               return parsed;
+       };
+
+       function stopLoading() {
+               $input.removeClass(options.loadingClass);
+       };
+
+};
+
+$.Autocompleter.defaults = {
+       inputClass: "ac_input",
+       resultsClass: "ac_results",
+       loadingClass: "ac_loading",
+       minChars: 1,
+       delay: 400,
+       matchCase: false,
+       matchSubset: true,
+       matchContains: false,
+       cacheLength: 10,
+       max: 100,
+       mustMatch: false,
+       extraParams: {},
+       selectFirst: true,
+       formatItem: function(row) { return row[0]; },
+       formatMatch: null,
+       autoFill: false,
+       width: 0,
+       multiple: false,
+       multipleSeparator: ", ",
+       highlight: function(value, term) {
+               return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
+       },
+    scroll: true,
+    scrollHeight: 180
+};
+
+$.Autocompleter.Cache = function(options) {
+
+       var data = {};
+       var length = 0;
+       
+       function matchSubset(s, sub) {
+               if (!options.matchCase) 
+                       s = s.toLowerCase();
+               var i = s.indexOf(sub);
+               if (i == -1) return false;
+               return i == 0 || options.matchContains;
+       };
+       
+       function add(q, value) {
+               if (length > options.cacheLength){
+                       flush();
+               }
+               if (!data[q]){ 
+                       length++;
+               }
+               data[q] = value;
+       }
+       
+       function populate(){
+               if( !options.data ) return false;
+               // track the matches
+               var stMatchSets = {},
+                       nullData = 0;
+
+               // no url was specified, we need to adjust the cache length to make sure it fits the local data store
+               if( !options.url ) options.cacheLength = 1;
+               
+               // track all options for minChars = 0
+               stMatchSets[""] = [];
+               
+               // loop through the array and create a lookup structure
+               for ( var i = 0, ol = options.data.length; i < ol; i++ ) {
+                       var rawValue = options.data[i];
+                       // if rawValue is a string, make an array otherwise just reference the array
+                       rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue;
+                       
+                       var value = options.formatMatch(rawValue, i+1, options.data.length);
+                       if ( value === false )
+                               continue;
+                               
+                       var firstChar = value.charAt(0).toLowerCase();
+                       // if no lookup array for this character exists, look it up now
+                       if( !stMatchSets[firstChar] ) 
+                               stMatchSets[firstChar] = [];
+
+                       // if the match is a string
+                       var row = {
+                               value: value,
+                               data: rawValue,
+                               result: options.formatResult && options.formatResult(rawValue) || value
+                       };
+                       
+                       // push the current match into the set list
+                       stMatchSets[firstChar].push(row);
+
+                       // keep track of minChars zero items
+                       if ( nullData++ < options.max ) {
+                               stMatchSets[""].push(row);
+                       }
+               };
+
+               // add the data items to the cache
+               $.each(stMatchSets, function(i, value) {
+                       // increase the cache size
+                       options.cacheLength++;
+                       // add to the cache
+                       add(i, value);
+               });
+       }
+       
+       // populate any existing data
+       setTimeout(populate, 25);
+       
+       function flush(){
+               data = {};
+               length = 0;
+       }
+       
+       return {
+               flush: flush,
+               add: add,
+               populate: populate,
+               load: function(q) {
+                       if (!options.cacheLength || !length)
+                               return null;
+                       /* 
+                        * if dealing w/local data and matchContains than we must make sure
+                        * to loop through all the data collections looking for matches
+                        */
+                       if( !options.url && options.matchContains ){
+                               // track all matches
+                               var csub = [];
+                               // loop through all the data grids for matches
+                               for( var k in data ){
+                                       // don't search through the stMatchSets[""] (minChars: 0) cache
+                                       // this prevents duplicates
+                                       if( k.length > 0 ){
+                                               var c = data[k];
+                                               $.each(c, function(i, x) {
+                                                       // if we've got a match, add it to the array
+                                                       if (matchSubset(x.value, q)) {
+                                                               csub.push(x);
+                                                       }
+                                               });
+                                       }
+                               }                               
+                               return csub;
+                       } else 
+                       // if the exact item exists, use it
+                       if (data[q]){
+                               return data[q];
+                       } else
+                       if (options.matchSubset) {
+                               for (var i = q.length - 1; i >= options.minChars; i--) {
+                                       var c = data[q.substr(0, i)];
+                                       if (c) {
+                                               var csub = [];
+                                               $.each(c, function(i, x) {
+                                                       if (matchSubset(x.value, q)) {
+                                                               csub[csub.length] = x;
+                                                       }
+                                               });
+                                               return csub;
+                                       }
+                               }
+                       }
+                       return null;
+               }
+       };
+};
+
+$.Autocompleter.Select = function (options, input, select, config) {
+       var CLASSES = {
+               ACTIVE: "ac_over"
+       };
+       
+       var listItems,
+               active = -1,
+               data,
+               term = "",
+               needsInit = true,
+               element,
+               list;
+       
+       // Create results
+       function init() {
+               if (!needsInit)
+                       return;
+               element = $("<div/>")
+               .hide()
+               .addClass(options.resultsClass)
+               .css("position", "absolute")
+               .appendTo(document.body);
+       
+               list = $("<ul/>").appendTo(element).mouseover( function(event) {
+                       if(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') {
+                   active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event));
+                           $(target(event)).addClass(CLASSES.ACTIVE);            
+               }
+               }).click(function(event) {
+                       $(target(event)).addClass(CLASSES.ACTIVE);
+                       select();
+                       // TODO provide option to avoid setting focus again after selection? useful for cleanup-on-focus
+                       input.focus();
+                       return false;
+               }).mousedown(function() {
+                       config.mouseDownOnSelect = true;
+               }).mouseup(function() {
+                       config.mouseDownOnSelect = false;
+               });
+               
+               if( options.width > 0 )
+                       element.css("width", options.width);
+                       
+               needsInit = false;
+       } 
+       
+       function target(event) {
+               var element = event.target;
+               while(element && element.tagName != "LI")
+                       element = element.parentNode;
+               // more fun with IE, sometimes event.target is empty, just ignore it then
+               if(!element)
+                       return [];
+               return element;
+       }
+
+       function moveSelect(step) {
+               listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE);
+               movePosition(step);
+        var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE);
+        if(options.scroll) {
+            var offset = 0;
+            listItems.slice(0, active).each(function() {
+                               offset += this.offsetHeight;
+                       });
+            if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) {
+                list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight());
+            } else if(offset < list.scrollTop()) {
+                list.scrollTop(offset);
+            }
+        }
+       };
+       
+       function movePosition(step) {
+               active += step;
+               if (active < 0) {
+                       active = listItems.size() - 1;
+               } else if (active >= listItems.size()) {
+                       active = 0;
+               }
+       }
+       
+       function limitNumberOfItems(available) {
+               return options.max && options.max < available
+                       ? options.max
+                       : available;
+       }
+       
+       function fillList() {
+               list.empty();
+               var max = limitNumberOfItems(data.length);
+               for (var i=0; i < max; i++) {
+                       if (!data[i])
+                               continue;
+                       var formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term);
+                       if ( formatted === false )
+                               continue;
+                       var li = $("<li/>").html( options.highlight(formatted, term) ).addClass(i%2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0];
+                       $.data(li, "ac_data", data[i]);
+               }
+               listItems = list.find("li");
+               if ( options.selectFirst ) {
+                       listItems.slice(0, 1).addClass(CLASSES.ACTIVE);
+                       active = 0;
+               }
+               // apply bgiframe if available
+               if ( $.fn.bgiframe )
+                       list.bgiframe();
+       }
+       
+       return {
+               display: function(d, q) {
+                       init();
+                       data = d;
+                       term = q;
+                       fillList();
+               },
+               next: function() {
+                       moveSelect(1);
+               },
+               prev: function() {
+                       moveSelect(-1);
+               },
+               pageUp: function() {
+                       if (active != 0 && active - 8 < 0) {
+                               moveSelect( -active );
+                       } else {
+                               moveSelect(-8);
+                       }
+               },
+               pageDown: function() {
+                       if (active != listItems.size() - 1 && active + 8 > listItems.size()) {
+                               moveSelect( listItems.size() - 1 - active );
+                       } else {
+                               moveSelect(8);
+                       }
+               },
+               hide: function() {
+                       element && element.hide();
+                       listItems && listItems.removeClass(CLASSES.ACTIVE);
+                       active = -1;
+               },
+               visible : function() {
+                       return element && element.is(":visible");
+               },
+               current: function() {
+                       return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]);
+               },
+               show: function() {
+                       var offset = $(input).offset();
+                       element.css({
+                               width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(),
+                               top: offset.top + input.offsetHeight,
+                               left: offset.left
+                       }).show();
+            if(options.scroll) {
+                list.scrollTop(0);
+                list.css({
+                                       maxHeight: options.scrollHeight,
+                                       overflow: 'auto'
+                               });
+                               
+                if($.browser.msie && typeof document.body.style.maxHeight === "undefined") {
+                                       var listHeight = 0;
+                                       listItems.each(function() {
+                                               listHeight += this.offsetHeight;
+                                       });
+                                       var scrollbarsVisible = listHeight > options.scrollHeight;
+                    list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight );
+                                       if (!scrollbarsVisible) {
+                                               // IE doesn't recalculate width when scrollbar disappears
+                                               listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) );
+                                       }
+                }
+                
+            }
+               },
+               selected: function() {
+                       var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);
+                       return selected && selected.length && $.data(selected[0], "ac_data");
+               },
+               emptyList: function (){
+                       list && list.empty();
+               },
+               unbind: function() {
+                       element && element.remove();
+               }
+       };
+};
+
+$.Autocompleter.Selection = function(field, start, end) {
+       if( field.createTextRange ){
+               var selRange = field.createTextRange();
+               selRange.collapse(true);
+               selRange.moveStart("character", start);
+               selRange.moveEnd("character", end);
+               selRange.select();
+       } else if( field.setSelectionRange ){
+               field.setSelectionRange(start, end);
+       } else {
+               if( field.selectionStart ){
+                       field.selectionStart = start;
+                       field.selectionEnd = end;
+               }
+       }
+       field.focus();
+};
+
+})(jQuery);
\ No newline at end of file
diff --git a/wolnelektury/media/js/jquery.form.js b/wolnelektury/media/js/jquery.form.js
new file mode 100644 (file)
index 0000000..659baa9
--- /dev/null
@@ -0,0 +1,601 @@
+/*
+ * jQuery Form Plugin
+ * version: 2.12 (06/07/2008)
+ * @requires jQuery v1.2.2 or later
+ *
+ * Examples and documentation at: http://malsup.com/jquery/form/
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id$
+ */
+(function($) {
+
+/*
+    Usage Note:  
+    -----------
+    Do not use both ajaxSubmit and ajaxForm on the same form.  These
+    functions are intended to be exclusive.  Use ajaxSubmit if you want
+    to bind your own submit handler to the form.  For example,
+
+    $(document).ready(function() {
+        $('#myForm').bind('submit', function() {
+            $(this).ajaxSubmit({
+                target: '#output'
+            });
+            return false; // <-- important!
+        });
+    });
+
+    Use ajaxForm when you want the plugin to manage all the event binding
+    for you.  For example,
+
+    $(document).ready(function() {
+        $('#myForm').ajaxForm({
+            target: '#output'
+        });
+    });
+        
+    When using ajaxForm, the ajaxSubmit function will be invoked for you
+    at the appropriate time.  
+*/
+
+/**
+ * ajaxSubmit() provides a mechanism for immediately submitting 
+ * an HTML form using AJAX.
+ */
+$.fn.ajaxSubmit = function(options) {
+    // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
+    if (!this.length) {
+        log('ajaxSubmit: skipping submit process - no element selected');
+        return this;
+    }
+
+    if (typeof options == 'function')
+        options = { success: options };
+
+    options = $.extend({
+        url:  this.attr('action') || window.location.toString(),
+        type: this.attr('method') || 'GET'
+    }, options || {});
+
+    // hook for manipulating the form data before it is extracted;
+    // convenient for use with rich editors like tinyMCE or FCKEditor
+    var veto = {};
+    this.trigger('form-pre-serialize', [this, options, veto]);
+    if (veto.veto) {
+        log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
+        return this;
+   }
+
+    var a = this.formToArray(options.semantic);
+    if (options.data) {
+        options.extraData = options.data;
+        for (var n in options.data)
+            a.push( { name: n, value: options.data[n] } );
+    }
+
+    // give pre-submit callback an opportunity to abort the submit
+    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
+        log('ajaxSubmit: submit aborted via beforeSubmit callback');
+        return this;
+    }    
+
+    // fire vetoable 'validate' event
+    this.trigger('form-submit-validate', [a, this, options, veto]);
+    if (veto.veto) {
+        log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
+        return this;
+    }    
+
+    var q = $.param(a);
+
+    if (options.type.toUpperCase() == 'GET') {
+        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
+        options.data = null;  // data is null for 'get'
+    }
+    else
+        options.data = q; // data is the query string for 'post'
+
+    var $form = this, callbacks = [];
+    if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
+    if (options.clearForm) callbacks.push(function() { $form.clearForm(); });
+
+    // perform a load on the target only if dataType is not provided
+    if (!options.dataType && options.target) {
+        var oldSuccess = options.success || function(){};
+        callbacks.push(function(data) {
+            $(options.target).html(data).each(oldSuccess, arguments);
+        });
+    }
+    else if (options.success)
+        callbacks.push(options.success);
+
+    options.success = function(data, status) {
+        for (var i=0, max=callbacks.length; i < max; i++)
+            callbacks[i](data, status, $form);
+    };
+
+    // are there files to upload?
+    var files = $('input:file', this).fieldValue();
+    var found = false;
+    for (var j=0; j < files.length; j++)
+        if (files[j])
+            found = true;
+
+    // options.iframe allows user to force iframe mode
+   if (options.iframe || found) { 
+       // hack to fix Safari hang (thanks to Tim Molendijk for this)
+       // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
+       if ($.browser.safari && options.closeKeepAlive)
+           $.get(options.closeKeepAlive, fileUpload);
+       else
+           fileUpload();
+       }
+   else
+       $.ajax(options);
+
+    // fire 'notify' event
+    this.trigger('form-submit-notify', [this, options]);
+    return this;
+
+
+    // private function for handling file uploads (hat tip to YAHOO!)
+    function fileUpload() {
+        var form = $form[0];
+        
+        if ($(':input[@name=submit]', form).length) {
+            alert('Error: Form elements must not be named "submit".');
+            return;
+        }
+        
+        var opts = $.extend({}, $.ajaxSettings, options);
+
+        var id = 'jqFormIO' + (new Date().getTime());
+        var $io = $('<iframe id="' + id + '" name="' + id + '" />');
+        var io = $io[0];
+
+        if ($.browser.msie || $.browser.opera) 
+            io.src = 'javascript:false;document.write("");';
+        $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
+
+        var xhr = { // mock object
+            responseText: null,
+            responseXML: null,
+            status: 0,
+            statusText: 'n/a',
+            getAllResponseHeaders: function() {},
+            getResponseHeader: function() {},
+            setRequestHeader: function() {}
+        };
+
+        var g = opts.global;
+        // trigger ajax global events so that activity/block indicators work like normal
+        if (g && ! $.active++) $.event.trigger("ajaxStart");
+        if (g) $.event.trigger("ajaxSend", [xhr, opts]);
+
+        var cbInvoked = 0;
+        var timedOut = 0;
+
+        // add submitting element to data if we know it
+        var sub = form.clk;
+        if (sub) {
+            var n = sub.name;
+            if (n && !sub.disabled) {
+                options.extraData = options.extraData || {};
+                options.extraData[n] = sub.value;
+                if (sub.type == "image") {
+                    options.extraData[name+'.x'] = form.clk_x;
+                    options.extraData[name+'.y'] = form.clk_y;
+                }
+            }
+        }
+        
+        // take a breath so that pending repaints get some cpu time before the upload starts
+        setTimeout(function() {
+            // make sure form attrs are set
+            var t = $form.attr('target'), a = $form.attr('action');
+            $form.attr({
+                target:   id,
+                encoding: 'multipart/form-data',
+                enctype:  'multipart/form-data',
+                method:   'POST',
+                action:   opts.url
+            });
+
+            // support timout
+            if (opts.timeout)
+                setTimeout(function() { timedOut = true; cb(); }, opts.timeout);
+
+            // add "extra" data to form if provided in options
+            var extraInputs = [];
+            try {
+                if (options.extraData)
+                    for (var n in options.extraData)
+                        extraInputs.push(
+                            $('<input type="hidden" name="'+n+'" value="'+options.extraData[n]+'" />')
+                                .appendTo(form)[0]);
+            
+                // add iframe to doc and submit the form
+                $io.appendTo('body');
+                io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
+                form.submit();
+            }
+            finally {
+                // reset attrs and remove "extra" input elements
+                $form.attr('action', a);
+                t ? $form.attr('target', t) : $form.removeAttr('target');
+                $(extraInputs).remove();
+            }
+        }, 10);
+
+        function cb() {
+            if (cbInvoked++) return;
+            
+            io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
+
+            var operaHack = 0;
+            var ok = true;
+            try {
+                if (timedOut) throw 'timeout';
+                // extract the server response from the iframe
+                var data, doc;
+
+                doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
+                
+                if (doc.body == null && !operaHack && $.browser.opera) {
+                    // In Opera 9.2.x the iframe DOM is not always traversable when
+                    // the onload callback fires so we give Opera 100ms to right itself
+                    operaHack = 1;
+                    cbInvoked--;
+                    setTimeout(cb, 100);
+                    return;
+                }
+                
+                xhr.responseText = doc.body ? doc.body.innerHTML : null;
+                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
+                xhr.getResponseHeader = function(header){
+                    var headers = {'content-type': opts.dataType};
+                    return headers[header];
+                };
+
+                if (opts.dataType == 'json' || opts.dataType == 'script') {
+                    var ta = doc.getElementsByTagName('textarea')[0];
+                    xhr.responseText = ta ? ta.value : xhr.responseText;
+                }
+                else if (opts.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
+                    xhr.responseXML = toXml(xhr.responseText);
+                }
+                data = $.httpData(xhr, opts.dataType);
+            }
+            catch(e){
+                ok = false;
+                $.handleError(opts, xhr, 'error', e);
+            }
+
+            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
+            if (ok) {
+                opts.success(data, 'success');
+                if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
+            }
+            if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
+            if (g && ! --$.active) $.event.trigger("ajaxStop");
+            if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');
+
+            // clean up
+            setTimeout(function() {
+                $io.remove();
+                xhr.responseXML = null;
+            }, 100);
+        };
+
+        function toXml(s, doc) {
+            if (window.ActiveXObject) {
+                doc = new ActiveXObject('Microsoft.XMLDOM');
+                doc.async = 'false';
+                doc.loadXML(s);
+            }
+            else
+                doc = (new DOMParser()).parseFromString(s, 'text/xml');
+            return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
+        };
+    };
+};
+
+/**
+ * ajaxForm() provides a mechanism for fully automating form submission.
+ *
+ * The advantages of using this method instead of ajaxSubmit() are:
+ *
+ * 1: This method will include coordinates for <input type="image" /> elements (if the element
+ *    is used to submit the form).
+ * 2. This method will include the submit element's name/value data (for the element that was
+ *    used to submit the form).
+ * 3. This method binds the submit() method to the form for you.
+ *
+ * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
+ * passes the options argument along after properly binding events for submit elements and
+ * the form itself.
+ */ 
+$.fn.ajaxForm = function(options) {
+    return this.ajaxFormUnbind().bind('submit.form-plugin',function() {
+        $(this).ajaxSubmit(options);
+        return false;
+    }).each(function() {
+        // store options in hash
+        $(":submit,input:image", this).bind('click.form-plugin',function(e) {
+            var $form = this.form;
+            $form.clk = this;
+            if (this.type == 'image') {
+                if (e.offsetX != undefined) {
+                    $form.clk_x = e.offsetX;
+                    $form.clk_y = e.offsetY;
+                } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
+                    var offset = $(this).offset();
+                    $form.clk_x = e.pageX - offset.left;
+                    $form.clk_y = e.pageY - offset.top;
+                } else {
+                    $form.clk_x = e.pageX - this.offsetLeft;
+                    $form.clk_y = e.pageY - this.offsetTop;
+                }
+            }
+            // clear form vars
+            setTimeout(function() { $form.clk = $form.clk_x = $form.clk_y = null; }, 10);
+        });
+    });
+};
+
+// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
+$.fn.ajaxFormUnbind = function() {
+    this.unbind('submit.form-plugin');
+    return this.each(function() {
+        $(":submit,input:image", this).unbind('click.form-plugin');
+    });
+
+};
+
+/**
+ * formToArray() gathers form element data into an array of objects that can
+ * be passed to any of the following ajax functions: $.get, $.post, or load.
+ * Each object in the array has both a 'name' and 'value' property.  An example of
+ * an array for a simple login form might be:
+ *
+ * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
+ *
+ * It is this array that is passed to pre-submit callback functions provided to the
+ * ajaxSubmit() and ajaxForm() methods.
+ */
+$.fn.formToArray = function(semantic) {
+    var a = [];
+    if (this.length == 0) return a;
+
+    var form = this[0];
+    var els = semantic ? form.getElementsByTagName('*') : form.elements;
+    if (!els) return a;
+    for(var i=0, max=els.length; i < max; i++) {
+        var el = els[i];
+        var n = el.name;
+        if (!n) continue;
+
+        if (semantic && form.clk && el.type == "image") {
+            // handle image inputs on the fly when semantic == true
+            if(!el.disabled && form.clk == el)
+                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+            continue;
+        }
+
+        var v = $.fieldValue(el, true);
+        if (v && v.constructor == Array) {
+            for(var j=0, jmax=v.length; j < jmax; j++)
+                a.push({name: n, value: v[j]});
+        }
+        else if (v !== null && typeof v != 'undefined')
+            a.push({name: n, value: v});
+    }
+
+    if (!semantic && form.clk) {
+        // input type=='image' are not found in elements array! handle them here
+        var inputs = form.getElementsByTagName("input");
+        for(var i=0, max=inputs.length; i < max; i++) {
+            var input = inputs[i];
+            var n = input.name;
+            if(n && !input.disabled && input.type == "image" && form.clk == input)
+                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+        }
+    }
+    return a;
+};
+
+/**
+ * Serializes form data into a 'submittable' string. This method will return a string
+ * in the format: name1=value1&amp;name2=value2
+ */
+$.fn.formSerialize = function(semantic) {
+    //hand off to jQuery.param for proper encoding
+    return $.param(this.formToArray(semantic));
+};
+
+/**
+ * Serializes all field elements in the jQuery object into a query string.
+ * This method will return a string in the format: name1=value1&amp;name2=value2
+ */
+$.fn.fieldSerialize = function(successful) {
+    var a = [];
+    this.each(function() {
+        var n = this.name;
+        if (!n) return;
+        var v = $.fieldValue(this, successful);
+        if (v && v.constructor == Array) {
+            for (var i=0,max=v.length; i < max; i++)
+                a.push({name: n, value: v[i]});
+        }
+        else if (v !== null && typeof v != 'undefined')
+            a.push({name: this.name, value: v});
+    });
+    //hand off to jQuery.param for proper encoding
+    return $.param(a);
+};
+
+/**
+ * Returns the value(s) of the element in the matched set.  For example, consider the following form:
+ *
+ *  <form><fieldset>
+ *      <input name="A" type="text" />
+ *      <input name="A" type="text" />
+ *      <input name="B" type="checkbox" value="B1" />
+ *      <input name="B" type="checkbox" value="B2"/>
+ *      <input name="C" type="radio" value="C1" />
+ *      <input name="C" type="radio" value="C2" />
+ *  </fieldset></form>
+ *
+ *  var v = $(':text').fieldValue();
+ *  // if no values are entered into the text inputs
+ *  v == ['','']
+ *  // if values entered into the text inputs are 'foo' and 'bar'
+ *  v == ['foo','bar']
+ *
+ *  var v = $(':checkbox').fieldValue();
+ *  // if neither checkbox is checked
+ *  v === undefined
+ *  // if both checkboxes are checked
+ *  v == ['B1', 'B2']
+ *
+ *  var v = $(':radio').fieldValue();
+ *  // if neither radio is checked
+ *  v === undefined
+ *  // if first radio is checked
+ *  v == ['C1']
+ *
+ * The successful argument controls whether or not the field element must be 'successful'
+ * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
+ * The default value of the successful argument is true.  If this value is false the value(s)
+ * for each element is returned.
+ *
+ * Note: This method *always* returns an array.  If no valid value can be determined the
+ *       array will be empty, otherwise it will contain one or more values.
+ */
+$.fn.fieldValue = function(successful) {
+    for (var val=[], i=0, max=this.length; i < max; i++) {
+        var el = this[i];
+        var v = $.fieldValue(el, successful);
+        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
+            continue;
+        v.constructor == Array ? $.merge(val, v) : val.push(v);
+    }
+    return val;
+};
+
+/**
+ * Returns the value of the field element.
+ */
+$.fieldValue = function(el, successful) {
+    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
+    if (typeof successful == 'undefined') successful = true;
+
+    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
+        (t == 'checkbox' || t == 'radio') && !el.checked ||
+        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
+        tag == 'select' && el.selectedIndex == -1))
+            return null;
+
+    if (tag == 'select') {
+        var index = el.selectedIndex;
+        if (index < 0) return null;
+        var a = [], ops = el.options;
+        var one = (t == 'select-one');
+        var max = (one ? index+1 : ops.length);
+        for(var i=(one ? index : 0); i < max; i++) {
+            var op = ops[i];
+            if (op.selected) {
+                // extra pain for IE...
+                var v = $.browser.msie && !(op.attributes['value'].specified) ? op.text : op.value;
+                if (one) return v;
+                a.push(v);
+            }
+        }
+        return a;
+    }
+    return el.value;
+};
+
+/**
+ * Clears the form data.  Takes the following actions on the form's input fields:
+ *  - input text fields will have their 'value' property set to the empty string
+ *  - select elements will have their 'selectedIndex' property set to -1
+ *  - checkbox and radio inputs will have their 'checked' property set to false
+ *  - inputs of type submit, button, reset, and hidden will *not* be effected
+ *  - button elements will *not* be effected
+ */
+$.fn.clearForm = function() {
+    return this.each(function() {
+        $('input,select,textarea', this).clearFields();
+    });
+};
+
+/**
+ * Clears the selected form elements.
+ */
+$.fn.clearFields = $.fn.clearInputs = function() {
+    return this.each(function() {
+        var t = this.type, tag = this.tagName.toLowerCase();
+        if (t == 'text' || t == 'password' || tag == 'textarea')
+            this.value = '';
+        else if (t == 'checkbox' || t == 'radio')
+            this.checked = false;
+        else if (tag == 'select')
+            this.selectedIndex = -1;
+    });
+};
+
+/**
+ * Resets the form data.  Causes all form elements to be reset to their original value.
+ */
+$.fn.resetForm = function() {
+    return this.each(function() {
+        // guard against an input with the name of 'reset'
+        // note that IE reports the reset function as an 'object'
+        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
+            this.reset();
+    });
+};
+
+/**
+ * Enables or disables any matching elements.
+ */
+$.fn.enable = function(b) { 
+    if (b == undefined) b = true;
+    return this.each(function() { 
+        this.disabled = !b 
+    });
+};
+
+/**
+ * Checks/unchecks any matching checkboxes or radio buttons and
+ * selects/deselects and matching option elements.
+ */
+$.fn.select = function(select) {
+    if (select == undefined) select = true;
+    return this.each(function() { 
+        var t = this.type;
+        if (t == 'checkbox' || t == 'radio')
+            this.checked = select;
+        else if (this.tagName.toLowerCase() == 'option') {
+            var $sel = $(this).parent('select');
+            if (select && $sel[0] && $sel[0].type == 'select-one') {
+                // deselect all other options
+                $sel.find('option').select(false);
+            }
+            this.selected = select;
+        }
+    });
+};
+
+// helper fn for console logging
+// set $.fn.ajaxSubmit.debug to true to enable debug logging
+function log() {
+    if ($.fn.ajaxSubmit.debug && window.console && window.console.log)
+        window.console.log('[jquery.form] ' + Array.prototype.join.call(arguments,''));
+};
+
+})(jQuery);
diff --git a/wolnelektury/media/js/jquery.jqmodal.js b/wolnelektury/media/js/jquery.jqmodal.js
new file mode 100644 (file)
index 0000000..966336a
--- /dev/null
@@ -0,0 +1,214 @@
+/*
+ * jqModal - Minimalist Modaling with jQuery
+ *
+ * Copyright (c) 2007 Brice Burgess <bhb@iceburg.net>, http://www.iceburg.net
+ * Licensed under the MIT License:
+ * http://www.opensource.org/licenses/mit-license.php
+ * 
+ * $Version: 2007.??.?? +r12 beta
+ * Requires: jQuery 1.1.3+
+ */
+(function($) {
+/**
+ * Initialize a set of elements as "modals". Modals typically are popup dialogs,
+ * notices, modal windows, and image containers. An expando ("_jqm") containing
+ * the UUID or "serial" of the modal is added to each element. This expando helps
+ * reference the modal's settings in the jqModal Hash Object (jQuery.jqm.hash)
+ * 
+ * Accepts a parameter object with the following modal settings;
+ * 
+ * (Integer) zIndex - Desired z-Index of the modal. This setting does not override (has no effect on) preexisting z-Index styling (set via CSS or inline style).  
+ * (Integer) overlay - [0-100] Translucency percentage (opacity) of the body covering overlay. Set to 0 for NO overlay, and up to 100 for a 100% opaque overlay.  
+ * (String) overlayClass - This class is applied to the body covering overlay. Allows CSS control of the overlay look (tint, background image, etc.).
+ * (String) closeClass - A close trigger is added to all elements matching this class within the modal.
+ * (Mixed) trigger - An open trigger is added to all matching elements within the DOM. Trigger can be a selector String, a jQuery collection of elements, a DOM element, or a False boolean.
+ * (Mixed) ajax - If not false; The URL (string) to load content from via an AJAX request.
+ *                If ajax begins with a "@", the URL is extracted from the requested attribute of the triggering element.
+ * (Mixed) target - If not false; The element within the modal to load the ajax response (content) into. Allows retention of modal design (e.g. framing and close elements are not overwritten by the AJAX response).
+ *                  Target may be a selector string, jQuery collection of elements, or a DOM element -- but MUST exist within (as a child of) the modal.
+ * (Boolean) modal - If true, user interactivity will be locked to the modal window until closed.
+ * (Boolean) toTop - If true, modal will be posistioned as a first child of the BODY element when opened, and its DOM posistion restored when closed. This aids in overcoming z-Index stacking order/containment issues where overlay covers whole page *including* modal.
+ * (Mixed) onShow - User defined callback function fired when modal opened.
+ * (Mixed) onHide - User defined callback function fired when modal closed.
+ * (Mixed) onLoad - User defined callback function fired when ajax content loads.
+ *
+ * @name jqm
+ * @param Map options User defined settings for the modal(s).
+ * @type jQuery
+ * @cat Plugins/jqModal
+ */
+$.fn.jqm=function(p){
+var o = {
+zIndex: 3000,
+overlay: 50,
+overlayClass: 'jqmOverlay',
+closeClass: 'jqmClose',
+trigger: '.jqModal',
+ajax: false,
+target: false,
+modal: false,
+toTop: false,
+onShow: false,
+onHide: false,
+onLoad: false
+};
+
+// For each element (aka "modal") $.jqm() has been called on;
+//  IF the _jqm expando exists, return (do nothing)
+//  ELSE increment serials and add _jqm expando to element ("serialization")
+//    *AND*...
+return this.each(function(){if(this._jqm)return;s++;this._jqm=s;
+
+// ... Add this element's serial to the jqModal Hash Object 
+//  Hash is globally accessible via jQuery.jqm.hash. It consists of;
+//   c: {obj} config/options
+//   a: {bool} active state (true: active/visible, false: inactive/hidden)
+//   w: {JQ DOM Element} The modal element (window/dialog/notice/etc. container)
+//   s: {int} The serial number of this modal (same as "H[s].w[0]._jqm")
+//   t: {DOM Element} The triggering element
+// *AND* ...
+H[s]={c:$.extend(o,p),a:false,w:$(this).addClass('jqmID'+s),s:s};
+
+// ... Attach events to trigger showing of this modal
+o.trigger&&$(this).jqmAddTrigger(o.trigger);
+});};
+
+// Adds behavior to triggering elements via the hide-show (HS) function.
+// 
+$.fn.jqmAddClose=function(e){return HS(this,e,'jqmHide');};
+$.fn.jqmAddTrigger=function(e){return HS(this,e,'jqmShow');};
+
+// Hide/Show a modal -- first check if it is already shown or hidden via the toggle state (H[{modal serial}].a)
+$.fn.jqmShow=function(t){return this.each(function(){!H[this._jqm].a&&$.jqm.open(this._jqm,t)});};
+$.fn.jqmHide=function(t){return this.each(function(){H[this._jqm].a&&$.jqm.close(this._jqm,t)});};
+
+$.jqm = {
+hash:{},
+
+// Function is executed by $.jqmShow to show a modal
+// s: {INT} serial of modal
+// t: {DOM Element} the triggering element
+
+// set local shortcuts
+//  h: {obj} this Modal's "hash"
+//  c: {obj} (h.c) config/options
+//  cc: {STR} closing class ('.'+h.c.closeClass)
+//  z: {INT} z-Index of Modal. If the Modal (h.w) has the z-index style set it will use this value before defaulting to the one passed in the config (h.c.zIndex)
+//  o: The overlay object
+// mark this modal as active (h.a === true)
+// set the triggering object (h.t) and the modal's z-Index.
+open:function(s,t){var h=H[s],c=h.c,cc='.'+c.closeClass,z=/^\d+$/.test(h.w.css('z-index'))&&h.w.css('z-index')||c.zIndex,o=$('<div></div>').css({height:'100%',width:'100%',position:'fixed',left:0,top:0,'z-index':z-1,opacity:c.overlay/100});h.t=t;h.a=true;h.w.css('z-index',z);
+ // IF the modal argument was passed as true;
+ //    Bind the Keep Focus Function if no other Modals are open (!A[0]),
+ //    Add this modal to the opened modals stack (A) for nested modal support,
+ //    and Mark overlay to show wait cursor when mouse hovers over it.
+ if(c.modal) {!A[0]&&F('bind');A.push(s);o.css('cursor','wait');}
+ // ELSE IF an overlay was requested (translucency set greater than 0);
+ //    Attach a Close event to overlay to hide modal when overlay is clicked.
+ else if(c.overlay > 0)h.w.jqmAddClose(o);
+ // ELSE disable the overlay
+ else o=false;
+
+ // Add the Overlay to BODY if not disabled.
+ h.o=(o)?o.addClass(c.overlayClass).prependTo('body'):false;
+ // IF IE6;
+ //  Set the Overlay to 100% height/width, and fix-position it via JS workaround
+ if(ie6&&$('html,body').css({height:'100%',width:'100%'})&&o){o=o.css({position:'absolute'})[0];for(var y in {Top:1,Left:1})o.style.setExpression(y.toLowerCase(),"(_=(document.documentElement.scroll"+y+" || document.body.scroll"+y+"))+'px'");}
+
+ // IF the modal's content is to be loaded via ajax;
+ //  determine the target element {JQ} to recieve content (r),
+ //  determine the URL {STR} to load content from (u)
+ if(c.ajax) {var r=c.target||h.w,u=c.ajax,r=(typeof r == 'string')?$(r,h.w):$(r),u=(u.substr(0,1) == '@')?$(t).attr(u.substring(1)):u;
+  // Load the Content (and once loaded);
+   // Fire the onLoad callback (if exists),
+   // Attach closing events to elements inside the modal that match the closingClass,
+   // and Execute the jqModal default Open Callback
+  r.load(u,function(){c.onLoad&&c.onLoad.call(this,h);cc&&h.w.jqmAddClose($(cc,h.w));O(h);});}
+ // ELSE the modal content is NOT to be loaded via ajax;
+ //  Attach closing events to elements inside the modal that match the closingClass
+ else cc&&h.w.jqmAddClose($(cc,h.w));
+
+ // IF toTop was passed and an overlay exists;
+ //  Remember the DOM posistion of the modal by inserting a tagged (matching serial) <SPAN> before the modal
+ //  Move the Modal from its current position to a first child of the body tag (after the overlay)
+ c.toTop&&h.o&&h.w.before('<span id="jqmP'+h.w[0]._jqm+'"></span>').insertAfter(h.o);  
+ // Execute user defined onShow callback, or else show (make visible) the modal.
+ // Execute the jqModal default Open Callback.
+ // Return false to prevent trigger click from being followed.
+ (c.onShow)?c.onShow(h):h.w.show();O(h);return false;
+},
+
+// Function is executed by $.jqmHide to hide a modal
+  // mark this modal as inactive (h.a === false)
+close:function(s){var h=H[s];h.a=false;
+ // If modal, remove from modal stack.
+   // If no modals in modal stack, unbind the Keep Focus Function
+ if(h.c.modal){A.pop();!A[0]&&F('unbind');}
+ // IF toTop was passed and an overlay exists;
+ //  Move modal back to its previous ("remembered") position.
+ h.c.toTop&&h.o&&$('#jqmP'+h.w[0]._jqm).after(h.w).remove();
+ // Execute user defined onHide callback, or else hide (make invisible) the modal and remove the overlay.
+ if(h.c.onHide)h.c.onHide(h);else{h.w.hide()&&h.o&&h.o.remove()}return false;
+}};
+
+// set jqModal scope shortcuts;
+//  s: {INT} serials placeholder
+//  H: {HASH} shortcut to jqModal Hash Object
+//  A: {ARRAY} Array of active/visible modals
+//  ie6: {bool} True if client browser is Internet Explorer 6
+//  i: {JQ, DOM Element} iframe placeholder used to prevent active-x bleedthrough in IE6
+//    NOTE: It is important to include the iframe styling (iframe.jqm) in your CSS!
+//     *AND* ...
+var s=0,H=$.jqm.hash,A=[],ie6=$.browser.msie&&($.browser.version == "6.0"),i=$('<iframe src="javascript:false;document.write(\'\');" class="jqm"></iframe>').css({opacity:0}),
+
+//  O: The jqModal default Open Callback;
+//    IF ie6; Add the iframe to the overlay (if overlay exists) OR to the modal (if an iframe doesn't already exist from a previous opening)
+//    Execute the Modal Focus Function
+O=function(h){if(ie6)h.o&&h.o.html('<p style="width:100%;height:100%"/>').prepend(i)||(!$('iframe.jqm',h.w)[0]&&h.w.prepend(i)); f(h);},
+
+//  f: The Modal Focus Function;
+//    Attempt to focus the first visible input within the modal
+f=function(h){try{$(':input:visible',h.w)[0].focus();}catch(e){}},
+
+//  F: The Keep Focus Function;
+//    Binds or Unbinds (t) the Focus Examination Function to keypresses and clicks
+F=function(t){$()[t]("keypress",x)[t]("keydown",x)[t]("mousedown",x);},
+
+//  x: The Focus Examination Function;
+//    Fetch the current modal's Hash as h (supports nested modals)
+//    Determine if the click/press falls within the modal. If not (r===true);
+//      call the Modal Focus Function and prevent click/press follow-through (return false [!true])
+//      ELSE if so (r===false); follow event (return true [!false])
+x=function(e){var h=H[A[A.length-1]],r=(!$(e.target).parents('.jqmID'+h.s)[0]);r&&f(h);return !r;},
+
+// hide-show function; assigns click events to trigger elements that 
+//   hide, show, or hide AND show modals.
+
+// Expandos (jqmShow and/or jqmHide) are added to all trigger elements. 
+// These Expandos hold an array of modal serials {INT} to show or hide.
+
+//  w: {DOM Element} The modal element (window/dialog/notice/etc. container)
+//  e: {DOM Elemet||jQ Selector String} The triggering element
+//  y: {String} Type (jqmHide||jqmShow)
+
+//  s: {array} the serial number of passed modals, calculated below;
+HS=function(w,e,y){var s=[];w.each(function(){s.push(this._jqm)});
+
+// for each triggering element attach the jqmHide or jqmShow expando (y)
+//  or else expand the expando with the current serial array
+ $(e).each(function(){if(this[y])$.extend(this[y],s);
+ // Assign a click event on the trigger element which examines the element's
+ //  jqmHide/Show expandos and attempts to execute $.jqmHide/Show on matching modals
+ else{this[y]=s;$(this).click(function(){for(var i in {jqmShow:1,jqmHide:1})for(var s in this[i])if(H[this[i][s]])H[this[i][s]].w[i](this);return false;});}});return w;};
+})(jQuery);
\ No newline at end of file
diff --git a/wolnelektury/media/js/jquery.js b/wolnelektury/media/js/jquery.js
new file mode 100644 (file)
index 0000000..82b98e1
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * jQuery 1.2.6 - New Wave Javascript
+ *
+ * Copyright (c) 2008 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
+ * $Rev: 5685 $
+ */
+(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
+return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
+return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
+selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
+return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
+this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
+return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
+jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
+script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
+for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
+for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
+jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
+ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
+while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
+while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
+for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
+jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
+xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
+jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
+for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
+s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
+e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();
\ No newline at end of file
diff --git a/wolnelektury/media/js/jquery.labelify.js b/wolnelektury/media/js/jquery.labelify.js
new file mode 100644 (file)
index 0000000..13196b2
--- /dev/null
@@ -0,0 +1,89 @@
+/**
+ * jQuery.labelify - Display in-textbox hints
+ * Stuart Langridge, http://www.kryogenix.org/
+ * Released into the public domain
+ * Date: 25th June 2008
+ * @author Stuart Langridge
+ * @version 1.3
+ *
+ *
+ * Basic calling syntax: $("input").labelify();
+ * Defaults to taking the in-field label from the field's title attribute
+ *
+ * You can also pass an options object with the following keys:
+ *   text
+ *     "title" to get the in-field label from the field's title attribute 
+ *      (this is the default)
+ *     "label" to get the in-field label from the inner text of the field's label
+ *      (note that the label must be attached to the field with for="fieldid")
+ *     a function which takes one parameter, the input field, and returns
+ *      whatever text it likes
+ *
+ *   labelledClass
+ *     a class that will be applied to the input field when it contains the
+ *      label and removed when it contains user input. Defaults to blank.
+ *  
+ */
+jQuery.fn.labelify = function(settings) {
+  settings = jQuery.extend({
+    text: "title",
+    labelledClass: ""
+  }, settings);
+  var lookups = {
+    title: function(input) {
+      return $(input).attr("title");
+    },
+    label: function(input) {
+      return $("label[for=" + input.id +"]").text();
+    }
+  };
+  var lookup;
+  var jQuery_labellified_elements = $(this);
+  return $(this).each(function() {
+    if (typeof settings.text === "string") {
+      lookup = lookups[settings.text]; // what if not there?
+    } else {
+      lookup = settings.text; // what if not a fn?
+    };
+    // bail if lookup isn't a function or if it returns undefined
+    if (typeof lookup !== "function") { return; }
+    var lookupval = lookup(this);
+    if (!lookupval) { return; }
+
+    // need to strip newlines because the browser strips them
+    // if you set textbox.value to a string containing them    
+    $(this).data("label",lookup(this).replace(/\n/g,''));
+    $(this).focus(function() {
+      if (this.value === $(this).data("label")) {
+        this.value = this.defaultValue;
+        $(this).removeClass(settings.labelledClass);
+      }
+    }).blur(function(){
+      if (this.value === this.defaultValue) {
+        this.value = $(this).data("label");
+        $(this).addClass(settings.labelledClass);
+      }
+    });
+    
+    var removeValuesOnExit = function() {
+      jQuery_labellified_elements.each(function(){
+        if (this.value === $(this).data("label")) {
+          this.value = this.defaultValue;
+          $(this).removeClass(settings.labelledClass);
+        }
+      })
+    };
+    
+    $(this).parents("form").submit(removeValuesOnExit);
+    $(window).unload(removeValuesOnExit);
+    
+    if (this.value !== this.defaultValue) {
+      // user already started typing; don't overwrite their work!
+      return;
+    }
+    // actually set the value
+    this.value = $(this).data("label");
+    $(this).addClass(settings.labelledClass);
+
+  });
+};
\ No newline at end of file
diff --git a/wolnelektury/middleware.py b/wolnelektury/middleware.py
new file mode 100644 (file)
index 0000000..c9a17dc
--- /dev/null
@@ -0,0 +1,126 @@
+# Orignal version taken from http://www.djangosnippets.org/snippets/186/
+# Original author: udfalkso
+# Modified by: Shwagroo Team
+
+import sys
+import os
+import re
+import hotshot, hotshot.stats
+import tempfile
+import StringIO
+import pprint
+
+from django.conf import settings
+from django.db import connection
+
+
+words_re = re.compile( r'\s+' )
+
+group_prefix_re = [
+    re.compile( "^.*/django/[^/]+" ),
+    re.compile( "^(.*)/[^/]+$" ), # extract module path
+    re.compile( ".*" ),           # catch strange entries
+]
+
+
+class ProfileMiddleware(object):
+    """
+    Displays hotshot profiling for any view.
+    http://yoursite.com/yourview/?prof
+
+    Add the "prof" key to query string by appending ?prof (or &prof=)
+    and you'll see the profiling results in your browser.
+    It's set up to only be available in django's debug mode, is available for superuser otherwise,
+    but you really shouldn't add this middleware to any production configuration.
+
+    WARNING: It uses hotshot profiler which is not thread safe.
+    """
+    def process_request(self, request):
+        if (settings.DEBUG or request.user.is_superuser) and request.GET.has_key('prof'):
+            connection.queries = []
+            self.tmpfile = tempfile.mktemp()
+            self.prof = hotshot.Profile(self.tmpfile)
+
+    def process_view(self, request, callback, callback_args, callback_kwargs):
+        if (settings.DEBUG or request.user.is_superuser) and request.GET.has_key('prof'):
+            return self.prof.runcall(callback, request, *callback_args, **callback_kwargs)
+
+    def get_group(self, file):
+        for g in group_prefix_re:
+            name = g.findall( file )
+            if name:
+                return name[0]
+
+    def get_summary(self, results_dict, sum):
+        list = [ (item[1], item[0]) for item in results_dict.items() ]
+        list.sort( reverse = True )
+        list = list[:40]
+
+        res = "      tottime\n"
+        for item in list:
+            if sum == 0:
+                foo = 0
+            else:
+                foo = 100*item[0]/sum
+            res += "%4.1f%% %7.3f %s\n" % (foo, item[0], item[1] )
+
+        return res
+
+    def summary_for_files(self, stats_str):
+        stats_str = stats_str.split("\n")[5:]
+
+        mystats = {}
+        mygroups = {}
+
+        sum = 0
+
+        for s in stats_str:
+            fields = words_re.split(s);
+            if len(fields) == 7:
+                time = float(fields[2])
+                sum += time
+                file = fields[6].split(":")[0]
+
+                if not file in mystats:
+                    mystats[file] = 0
+                mystats[file] += time
+
+                group = self.get_group(file)
+                if not group in mygroups:
+                    mygroups[ group ] = 0
+                mygroups[ group ] += time
+
+        return "<pre>" + \
+               " ---- By file ----\n\n" + self.get_summary(mystats,sum) + "\n" + \
+               " ---- By group ---\n\n" + self.get_summary(mygroups,sum) + \
+               "</pre>"
+
+    def process_response(self, request, response):
+        if (settings.DEBUG or request.user.is_superuser) and request.GET.has_key('prof'):
+            self.prof.close()
+
+            out = StringIO.StringIO()
+            old_stdout = sys.stdout
+            sys.stdout = out
+
+            stats = hotshot.stats.load(self.tmpfile)
+            stats.sort_stats('time', 'calls')
+            stats.print_stats()
+
+            sys.stdout = old_stdout
+            stats_str = out.getvalue()
+
+            if response and response.content and stats_str:
+                response.content = "<pre>" + stats_str + "</pre>"
+
+            response.content = "\n".join(response.content.split("\n")[:40])
+
+            response.content += self.summary_for_files(stats_str)
+
+            os.unlink(self.tmpfile)
+            
+            response.content += '\n%d SQL Queries:\n' % len(connection.queries)
+            response.content += pprint.pformat(connection.queries)
+
+        return response
+
diff --git a/wolnelektury/settings.py b/wolnelektury/settings.py
new file mode 100644 (file)
index 0000000..c5b8d67
--- /dev/null
@@ -0,0 +1,123 @@
+# -*- coding: utf-8 -*-
+# Django settings for wolnelektury project.
+from os import path
+
+PROJECT_DIR = path.abspath(path.dirname(__file__))
+
+DEBUG = True
+TEMPLATE_DEBUG = DEBUG
+
+ADMINS = (
+    (u'Marek Stępniowski', 'marek@stepniowski.com'),
+)
+
+MANAGERS = ADMINS
+
+DATABASE_ENGINE = 'sqlite3'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
+DATABASE_NAME = path.join(PROJECT_DIR, 'lektury.sqlite')  # Or path to database file if using sqlite3.
+DATABASE_USER = ''             # Not used with sqlite3.
+DATABASE_PASSWORD = ''         # Not used with sqlite3.
+DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
+DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.
+
+# Local time zone for this installation. Choices can be found here:
+# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
+# although not all choices may be available on all operating systems.
+# If running in a Windows environment this must be set to the same as your
+# system time zone.
+TIME_ZONE = 'America/Chicago'
+
+# Language code for this installation. All choices can be found here:
+# http://www.i18nguy.com/unicode/language-identifiers.html
+LANGUAGE_CODE = 'pl'
+
+SITE_ID = 1
+
+# If you set this to False, Django will make some optimizations so as not
+# to load the internationalization machinery.
+USE_I18N = True
+
+# Absolute path to the directory that holds media.
+# Example: "/home/media/media.lawrence.com/"
+MEDIA_ROOT = PROJECT_DIR + '/media/'
+
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash if there is a path component (optional in other cases).
+# Examples: "http://media.lawrence.com", "http://example.com/media/"
+MEDIA_URL = '/media/'
+
+# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
+# trailing slash.
+# Examples: "http://foo.com/media/", "/media/".
+ADMIN_MEDIA_PREFIX = '/admin-media/'
+
+# Make this unique, and don't share it with anybody.
+
+# List of callables that know how to import templates from various sources.
+TEMPLATE_LOADERS = (
+    'django.template.loaders.filesystem.load_template_source',
+    'django.template.loaders.app_directories.load_template_source',
+#     'django.template.loaders.eggs.load_template_source',
+)
+
+TEMPLATE_CONTEXT_PROCESSORS = (
+    'django.core.context_processors.auth',
+    'django.core.context_processors.debug',
+    'django.core.context_processors.i18n',
+    'django.core.context_processors.media',
+    'django.core.context_processors.request',
+)
+
+MIDDLEWARE_CLASSES = [
+    'django.middleware.common.CommonMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'django.middleware.doc.XViewMiddleware',
+    'pagination.middleware.PaginationMiddleware',
+]
+
+# If DEBUG is enabled add query log to bottom of every template
+if DEBUG:
+    MIDDLEWARE_CLASSES.append('middleware.ProfileMiddleware')
+
+ROOT_URLCONF = 'urls'
+
+TEMPLATE_DIRS = (
+    PROJECT_DIR + '/templates/'
+)
+
+# CSS and JS files to compress
+COMPRESS_CSS = {
+    'all': {
+        'source_filenames': ('css/master.css', 'css/jquery.autocomplete.css', 'css/master.plain.css',),
+        'output_filename': 'css/all.min.css',
+    }
+}
+
+COMPRESS_JS = {
+    'all': {
+        'source_filenames': ('js/jquery.js', 'js/jquery.autocolumn.js', 'js/jquery.autocomplete.js', 
+            'js/jquery.form.js', 'js/jquery.jqmodal.js', 'js/jquery.labelify.js', 'js/catalogue.js',),
+        'output_filename': 'js/all.min.js',
+    }
+}
+
+COMPRESS_CSS_FILTERS = None
+
+LOGIN_URL = '/uzytkownicy/zaloguj/'
+
+LOGIN_REDIRECT_URL = '/'
+
+INSTALLED_APPS = (
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.sites',
+    'django.contrib.admin',
+    'newtagging',
+    'pagination',
+    'chunks',
+    'compress',
+    'catalogue',
+)
+
diff --git a/wolnelektury/templates/404.html b/wolnelektury/templates/404.html
new file mode 100644 (file)
index 0000000..5003eae
--- /dev/null
@@ -0,0 +1,3 @@
+<h1>Blad 404 - Strona nie istnieje</h1>
+
+<p>(Tutaj później będzie coś więcej, naprawdę)</p>
\ No newline at end of file
diff --git a/wolnelektury/templates/admin/base_site.html b/wolnelektury/templates/admin/base_site.html
new file mode 100644 (file)
index 0000000..d0ca937
--- /dev/null
@@ -0,0 +1,9 @@
+{% extends "admin/base.html" %}
+
+{% block title %}{{ title }} | Administracja stroną WolneLektury.pl{% endblock %}
+
+{% block branding %}
+<h1 id="site-name">Administracja stroną WolneLektury.pl</h1>
+{% endblock %}
+
+{% block nav-global %}{% endblock %}
\ No newline at end of file
diff --git a/wolnelektury/templates/auth/login.html b/wolnelektury/templates/auth/login.html
new file mode 100644 (file)
index 0000000..6db94aa
--- /dev/null
@@ -0,0 +1,24 @@
+{% extends "base.html" %}
+
+{% block title %}Zaloguj / Zarejestruj się w WolneLektury.pl{% endblock %}
+
+{% block body %}
+    <h1>Zaloguj się / Załóż konto</h1>
+    <form action="." method="get" accept-charset="utf-8" id="search-form">
+        <p><li>{{ search_form.q }} <input type="submit" value="Szukaj" /></li> <strong>lub</strong> <a href="{% url main_page %}">wróć do strony głównej</a></p>
+    </form>
+    <form method="post" action="." id="login-form" class="cuteform">
+        <h2>Zaloguj się</h2>
+        <ol>
+            {{ form.as_ul }}
+            <li><input type="submit" value="Zaloguj się" /></li>
+        </ol>
+        <p><input type="hidden" name="next" value="{{ next }}" /></p>
+    </form>
+    
+    <form action="." method="post" accept-charset="utf-8" id="registration-form">
+        <h2>Załóż konto</h2>
+
+        <p><input type="submit" value="Załóż konto"/></p>
+    </form>
+{% endblock %}
diff --git a/wolnelektury/templates/base.html b/wolnelektury/templates/base.html
new file mode 100644 (file)
index 0000000..8c8f1c6
--- /dev/null
@@ -0,0 +1,99 @@
+{% load chunks compressed catalogue_tags %}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+        <title>{% block title %}WolneLektury.pl{% endblock %}</title>
+        <link rel="icon" href="/media/img/favicon.png" type="image/x-icon" />
+        {% compressed_css "all" %}
+        {% compressed_js "all" %}
+        {% block extrahead %}
+        {% endblock %}
+    </head>
+    <body id="{% block bodyid %}base{% endblock %}">
+        <div id="top-message">
+            {% chunk "top-message" %}
+        </div>
+        <div id="header">
+            <div id="logo">
+                <a href="/"><img src="/media/img/logo.png" alt="WolneLektury.pl - logo" /></a>
+            </div>
+            <div id="user-info">
+                {% if user.is_authenticated %}
+                    <p>
+                        Zalogowany jako <strong>{{ user.username }}</strong>
+                        | <a href="{% url user_shelves %}" id="user-shelves-link">Moje półki</a>
+                        {% if user.is_staff %}
+                        | <a href="/admin/">Administracja</a>
+                        {% endif %}
+                        | <a href="{% url logout %}?next={{ request.get_full_path }}">Wyloguj</a>
+                    </p>
+                {% else %}
+                    <p><a href="{% url login %}" id="login-register-link">Zaloguj się / Załóż konto</a></p>
+                {% endif %}
+            </div>
+            <div class="clearboth"></div>
+        </div>
+        <div id="maincontent">
+            {% block body %}
+            {% endblock %}    
+        </div>
+        <div class="clearboth"></div>
+        <div id="footer">
+            <p>
+                Wolne Lektury to projekt prowadzony przez <a href="http://nowoczesnapolska.org.pl/">Fundację Nowoczesna
+                Polska</a>. Reprodukcje cyfrowe wykonane przez <a href="http://www.bn.org.pl/">Bibliotekę Narodową</a>
+                z egzemplarzy pochodzących ze zbiorów BN. Hosting <a href="http://eo.pl/">EO Networks</a>.
+            </p>
+            <p>
+                Fundacja Nowoczesna Polska, 00-514 Warszawa, ul. Marszałkowska 84/92 lok. 125, tel/fax: (22) 621-30-17,
+                e-mail: <a href="mailto:fundacja@nowoczesnapolska.org.pl">fundacja@nowoczesnapolska.org.pl</a>
+            </p>
+            <img src="/media/img/footer.png" usemap="#footermap" alt="Partnerzy serwisu" />
+            <map name="footermap" id="footermap">
+                <area alt="Biblioteka Analiz" coords="618,59,679,77" href="http://www.rynek-ksiazki.pl/" shape="rect" />
+                <area alt="Przekrój" coords="590,53,615,74" href="http://www.przekroj.pl/" shape="rect" />
+                <area alt="TVP Kultura" coords="551,53,588,74" href="http://www.tvp.pl/tvpkultura/" shape="rect" />
+                <area alt="Elle" coords="618,33,677,57" href="http://elle.interia.pl/" shape="rect" />
+                <area alt="Radio TOK.FM " coords="515,53,549,75" href="http://www.tok.fm/" shape="rect" />
+                <area alt="Tygodnik Powszechny" coords="514,33,616,51" href="http://tygodnik.onet.pl/" shape="rect" />
+                <area alt="Dziennik Polska-Europa-Swiat" coords="368,34,512,75" href="http://www.dziennik.pl/" shape="rect" />
+                <area alt="Ministerstwo Kultury i Dziedzictwa Narodowego" coords="265,35,366,74" href="http://www.mkidn.gov.pl/" shape="rect" />
+                <area alt="Biblioteka Narodowa" coords="222,29,261,83" href="http://www.bn.org.pl/" shape="rect" />
+                <area alt="PZL" coords="188,58,217,81" href="http://www.pzl.pl/" shape="rect" />
+                <area alt="EO Networks" coords="162,32,218,56" href="http://eo.pl/" shape="rect" />
+                <area alt="Kancelaria Prawna Grynhoff Woźny Maliński Spółka komandytowa" coords="104,61,184,76" href="http://www.gww.pl/" shape="rect" />
+                <area alt="Information is art" coords="104,35,160,60" href="http://www.informationisart.com/" shape="rect" />
+                <area alt="Fundacja Nowoczesna Polska" coords="15,39,98,75" href="http://nowoczesnapolska.org.pl/" shape="rect" />
+            </map>
+        </div>
+        <div id="login-register-window">
+            <div class="header"><a href="#" class="jqmClose">Zamknij</a></div>
+            <div class="target">
+                <form method="post" action="{% url login %}" id="login-form" class="cuteform">
+                    <h2>Zaloguj się / <a href="#" id="show-registration-form" style="font-size: 0.85em; font-weight: normal">Załóż konto</a></h2>
+                    <p><span id="id_login-__all__" /></p>
+                    <ol>
+                        {% authentication_form %}
+                        <li><input type="submit" value="Zaloguj się" /></li>
+                    </ol>
+                </form>
+                <form method="post" action="{% url register %}" id="registration-form" class="cuteform" style="display: none;">
+                    <h2><a href="#" id="show-login-form" style="font-size: 0.85em; font-weight: normal">Zaloguj się</a> / Załóż konto</h2>
+                    <p><span id="id_registration-__all__" /></p>
+                    <ol>
+                        {% user_creation_form %}
+                        <li><input type="submit" value="Załóż konto" /></li>
+                    </ol>
+                </form>
+            </div>
+        </div>
+        <div id="user-shelves-window">
+            <div class="header"><a href="#" class="jqmClose">Zamknij</a></div>
+            <div class="target">
+                <p><img src="/media/img/indicator.gif" alt="*"/> Ładowanie</p>
+            </div>
+        </div>
+    </body>
+</html>
diff --git a/wolnelektury/templates/catalogue/book_detail.html b/wolnelektury/templates/catalogue/book_detail.html
new file mode 100644 (file)
index 0000000..ff92780
--- /dev/null
@@ -0,0 +1,107 @@
+{% extends "base.html" %}
+{% load catalogue_tags %}
+
+{% block title %}Lektura {{ book.title }} w WolneLektury.pl{% endblock %}
+
+{% block bodyid %}book-detail{% endblock %}
+
+{% block extrahead %}
+    <script type="text/javascript">
+        $(function() {
+            $('#toggle-description').hover(
+                function() { $(this).css({background: '#F3F3F3', cursor: 'pointer'}); },
+                function() { $(this).css({background: '#EEE'}); }
+            ).click(function() {
+                if ($('#description').hasClass('hidden')) {
+                    $('#description').slideDown('fast').removeClass('hidden');
+                    $('p', this).html('Zwiń opis ▲');
+                } else {
+                    $('#description').slideUp('fast').addClass('hidden');
+                    $('p', this).html('Rozwiń opis ▼');
+                }
+            });
+        });
+    </script>
+{% endblock %}
+
+{% block body %}
+    <h1>{{ book.title }}, {{ categories.author|join:", " }}</h1>
+    <form action="{% url main_page %}" method="get" accept-charset="utf-8" id="search-form">
+        <ol>
+            {# {% for tag in tags %} #}
+            {# <li class="category"><a href="{% catalogue_url tag %}">{{ tag }}</a> | <a href="{% catalogue_url tags -tag %}">x</a></li> #}
+            {# {% endfor %} #}
+            <li class="book-title">{{ book.title }} | <a href="{% url main_page %}">x</a></li>
+        </ol>
+    </form>
+    
+    <div id="books-list">
+        {% if book.has_description %}
+            <div id="description">
+                {{ book.description|safe }}
+            </div>
+            <div id="toggle-description"><p>Zwiń opis ▲</p></div>
+        {% endif %}
+        <div id="formats">
+            <ul>
+            {% if book.pdf_file %}
+                <li><a href="{{ book.pdf_file.url }}">Pobierz plik PDF</a></li>
+            {% endif %}
+            {% if book.odt_file %}
+                <li><a href="{{ book.odt_file.url }}">Pobierz plik ODT</a></li>
+            {% endif %}
+            {% if book.html_file %}
+                <li><a href="{{ book.html_file.url }}">Pobierz plik HTML</a></li>
+            {% endif %}
+            </ul>
+        </div>
+    
+        {% if book.children.all %}
+        <div id="book-children">
+            <h2>Utwory składające się na ten utwór:</h2>
+            {% for book in book.children.all %}
+                <li><a href="{{ book.get_absolute_url }}">{{ book.title }}</a></li>
+            {% endfor %}
+        </div>
+        {% endif %}
+    
+    </div>
+        
+    <div id="tags-list">
+        <h2>O utworze</h2>
+        <ul>
+            <li>
+                Autor: 
+                {% for tag in categories.author %}
+                <a href="{{ tag.get_absolute_url }}">{{ tag }}</a>
+                {% endfor %}
+            </li>
+            <li>
+                Epoka:
+                {% for tag in categories.epoch %}
+                <a href="{{ tag.get_absolute_url }}">{{ tag }}</a>
+                {% endfor %}
+            </li>
+            <li>
+                Rodzaj:
+                {% for tag in categories.kind %}
+                <a href="{{ tag.get_absolute_url }}">{{ tag }}</a>
+                {% endfor %}
+            </li>
+            <li>
+                Gatunek:
+                {% for tag in categories.genre %}
+                <a href="{{ tag.get_absolute_url }}">{{ tag }}</a>
+                {% endfor %}
+            </li>
+        </ul>
+        {% if categories.theme %}
+            <h2>Motywy w utworze</h2>
+            <ul>
+            {% for theme in categories.theme %}
+                <li>{{ theme }}</li>
+            {% endfor %}
+            </ul>
+        {% endif %}
+    </div>
+{% endblock %}
\ No newline at end of file
diff --git a/wolnelektury/templates/catalogue/book_list.html b/wolnelektury/templates/catalogue/book_list.html
new file mode 100644 (file)
index 0000000..f4f575c
--- /dev/null
@@ -0,0 +1,35 @@
+{% extends "base.html" %}
+{% load catalogue_tags chunks %}
+
+{% block bodyid %}book-a-list{% endblock %}
+
+{% block title %}Alfabetyczny spis utworów w WolneLektury.pl{% endblock %}
+
+{% block extrahead %}
+    <script type="text/javascript" charset="utf-8">
+        $(function() {
+            $('#book-list .group').addClass('dontsplit');
+            $('#book-list').columnize({columns: 3});
+        });
+    </script>
+{% endblock %}
+
+{% block body %}
+    <h1>Alfabetyczny spis utworów</h1>
+    <form action="{% url search %}" method="GET" accept-charset="utf-8" id="search-form">
+        <p>{{ form.q }} <input type="submit" value="Szukaj" /> <strong>lub</strong> <a href="{% url main_page %}">wróć do strony głównej</a></p>
+    </form>
+    
+    <div id="book-list">
+        {% for first_letter, group in books_by_first_letter.items %}
+        <div class="group">
+            <h2>{{ first_letter }}</h2>
+            <ol>
+            {% for book in group %}
+                <li><a href="{{ book.get_absolute_url }}">{{ book.title }}</a></li>
+            {% endfor %}
+            </ol>
+        </div>
+        {% endfor %}    
+    </div>
+{% endblock %}
diff --git a/wolnelektury/templates/catalogue/book_sets.html b/wolnelektury/templates/catalogue/book_sets.html
new file mode 100644 (file)
index 0000000..c739418
--- /dev/null
@@ -0,0 +1,17 @@
+<h2>Półki zawierające utwór {{ book.title }}</h2>
+{% if not user.tag_set.count %}
+    <p>Nie posiadasz żadnych półek. Jeśli chcesz, możesz utworzyć nową półkę poniżej.</p>
+{% else %}
+    <form action="{% url catalogue.views.book_sets book.slug %}" method="POST" accept-charset="utf-8" class="cuteform">
+    <ol>
+        <li>{{ form.set_ids }}</li>
+        <li><input type="submit" value="Zapisz półki"/></li>
+    </ol>
+    </form>
+{% endif %}
+<hr />
+<form action="{% url catalogue.views.new_set %}" method="POST" accept-charset="utf-8" class="cuteform">
+<ol>
+    <li>{{ new_set_form.name }} <input type="submit" value="Utwórz nową półkę"/></li>
+</ol>
+</form>
\ No newline at end of file
diff --git a/wolnelektury/templates/catalogue/book_short.html b/wolnelektury/templates/catalogue/book_short.html
new file mode 100644 (file)
index 0000000..e6a3748
--- /dev/null
@@ -0,0 +1,11 @@
+<div class="book">
+    <div class="change-sets">
+        <a href="{% url catalogue.views.book_sets book.slug %}" class="jqm-trigger">Półki</a>
+    </div>
+    <div class="book-thumbnail"></div>
+    <div class="book-description">
+        <h2><a href="{{ book.get_absolute_url }}">{{ book.title }}</a></h2>
+        <p style="margin: 0">Formaty: {{ formats|join:", "|safe }}</p>
+        <p style="margin: 0">Utwór w kategoriach: {{ tags|join:", "|safe }}</p>
+    </div>
+</div>
diff --git a/wolnelektury/templates/catalogue/breadcrumbs.html b/wolnelektury/templates/catalogue/breadcrumbs.html
new file mode 100644 (file)
index 0000000..896d999
--- /dev/null
@@ -0,0 +1,9 @@
+{% load catalogue_tags %}
+<form action="{% url search %}" method="get" accept-charset="utf-8" id="search-form">
+    <ol>
+        {% for tag in tag_list %}
+        <li class="category"><a href="{% catalogue_url tag %}">{{ tag }}</a> | <a href="{% catalogue_url tag_list -tag %}">x</a></li>
+        {% endfor %}
+        <li>{{ search_form.q }} {{ search_form.tags }} <input type="submit" value="Szukaj"/></li>
+    </ol>
+</form>
\ No newline at end of file
diff --git a/wolnelektury/templates/catalogue/fragment_sets.html b/wolnelektury/templates/catalogue/fragment_sets.html
new file mode 100644 (file)
index 0000000..c7d641c
--- /dev/null
@@ -0,0 +1,17 @@
+<h2>Półki zawierające fragment</h2>
+{% if not user.tag_set.count %}
+    <p>Nie posiadasz żadnych półek. Jeśli chcesz, możesz utworzyć nową półkę poniżej.</p>
+{% else %}
+    <form action="{% url catalogue.views.fragment_sets fragment.id %}" method="POST" accept-charset="utf-8" class="cuteform">
+    <ol>
+        <li>{{ form.set_ids }}</li>
+        <li><input type="submit" value="Zapisz półki"/></li>
+    </ol>
+    </form>
+{% endif %}
+<hr />
+<form action="{% url catalogue.views.new_set %}" method="POST" accept-charset="utf-8" class="cuteform">
+<ol>
+    <li>{{ new_set_form.name }} <input type="submit" value="Utwórz nową półkę"/></li>
+</ol>
+</form>
\ No newline at end of file
diff --git a/wolnelektury/templates/catalogue/fragment_short.html b/wolnelektury/templates/catalogue/fragment_short.html
new file mode 100644 (file)
index 0000000..99fface
--- /dev/null
@@ -0,0 +1,21 @@
+<div class="fragment">
+    {# <div class="change-sets"> #}
+    {#     <a href="{% url catalogue.views.fragment_sets fragment.id %}" class="jqm-trigger">Półki</a> #}
+    {# </div> #}
+    {% if fragment.short_text %}
+    <div class='fragment-short-text'>
+        {{ fragment.short_text|safe }}
+        <a href="#">↓ Rozwiń fragment ↓</a>
+    </div>
+    {% endif %}
+    <div class="fragment-text" {% if fragment.short_text %}style="display:none;"{% endif %}>
+        {{ fragment.text|safe }}
+        {% if fragment.short_text %}
+            <a href="#">↑ Zwiń fragment ↑</a>
+        {% endif %}
+    </div>
+    <div class="fragment-metadata">
+        <p><a href="{{ book.get_absolute_url }}">{{ book.title }}</a>, {{ book_authors|join:","|safe }}</p>
+    </div>
+    <div class="clearboth"></div>
+</div>
diff --git a/wolnelektury/templates/catalogue/latest_blog_posts.html b/wolnelektury/templates/catalogue/latest_blog_posts.html
new file mode 100644 (file)
index 0000000..d2c90e1
--- /dev/null
@@ -0,0 +1,5 @@
+<ol>
+{% for post in posts %}
+    <li><a href="{{ post.link }}">{{ post.title }}</a></li>
+{% endfor %}
+</ol>
\ No newline at end of file
diff --git a/wolnelektury/templates/catalogue/main_page.html b/wolnelektury/templates/catalogue/main_page.html
new file mode 100644 (file)
index 0000000..0c58ada
--- /dev/null
@@ -0,0 +1,90 @@
+{% extends "base.html" %}
+{% load catalogue_tags chunks cache %}
+
+{% block bodyid %}main-page{% endblock %}
+
+{% block extrahead %}
+    <script type="text/javascript" charset="utf-8">
+        $(function() {
+            $('#categories-list ul').columnize({width: 180});
+            $('#themes-list ul').columnize({width: 180});
+        });
+    </script>
+{% endblock %}
+
+{% block body %}
+    <div id="site-description">
+        {% chunk "site-description" %}
+    </div>
+    <div class="clearboth"></div>
+    <form action="{% url search %}" method="get" accept-charset="utf-8" id="search-form">
+        <p>{{ form.q }} {{ form.tags }} <input type="submit" value="Szukaj" /> <strong>lub</strong> <a href="{% url catalogue.views.book_list %}">zobacz spis utworów</a> w naszym zbiorze</p>
+    </form>
+    
+    <div id="tags-list">
+        <div id="categories-list">
+            {% if categories.set %}
+                <h2>Półki</h2>
+                <ul>
+                {% for set in categories.set %}
+                    <li><a href="{% catalogue_url set %}">{{ set }}&nbsp;({{ set.count }})</a></li>
+                {% endfor %}
+                </ul>
+            {% endif %}
+            
+            {% if categories.author %}
+                <h2>Autorzy</h2>
+                <ul>
+                {% for author in categories.author %}
+                    <li><a href="{% catalogue_url author %}">{{ author }}&nbsp;({{ author.count }})</a></li>
+                {% endfor %}
+                </ul>
+            {% endif %}
+            
+            {% if categories.epoch %}
+            <h2>Epoki</h2>
+                <ul>
+                {% for epoch in categories.epoch %}
+                    <li><a href="{% catalogue_url epoch %}">{{ epoch }}&nbsp;({{ epoch.count }})</a></li>
+                {% endfor %}
+                </ul>                
+            {% endif %}
+            
+            {% if categories.kind %}
+                <h2>Rodzaje</h2>
+                <ul>
+                {% for kind in categories.kind %}
+                    <li><a href="{% catalogue_url kind %}">{{ kind }}&nbsp;({{ kind.count }})</a></li>
+                {% endfor %}
+                </ul>                
+            {% endif %}
+            
+            {% if categories.genre %}
+                <h2>Gatunki literackie</h2>
+                <ul>
+                {% for genre in categories.genre %}
+                    <li><a href="{% catalogue_url genre %}">{{ genre }}&nbsp;({{ genre.count }})</a></li>
+                {% endfor %}
+                </ul>                
+            {% endif %}
+        </div>
+        <div id="themes-list">
+            {% if categories.theme %}
+                <h2>Motywy</h2>
+                <ul>
+                {% for theme in fragment_tags %}
+                    <li><a href="{% catalogue_url theme %}">{{ theme }}&nbsp;({{ theme.count }})</a></li>
+                {% endfor %}
+                </ul>                
+            {% endif %}
+        </div>
+        <div class="clearboth"></div>
+    </div>
+    
+    <div id="latest-blog-posts">
+        <h2>Aktualności z naszego bloga</h2>
+        {% cache 1800 latest-blog-posts %}
+        {% latest_blog_posts "http://wolnepodreczniki.pl/feed/?s=Wolne%20Lektury" %}
+        {% endcache %}
+    </div>
+{% endblock %}
diff --git a/wolnelektury/templates/catalogue/tagged_object_list.html b/wolnelektury/templates/catalogue/tagged_object_list.html
new file mode 100644 (file)
index 0000000..de7d4f0
--- /dev/null
@@ -0,0 +1,146 @@
+{% extends "base.html" %}
+{% load catalogue_tags pagination_tags %}
+
+{% block title %}{% title_from_tags tags %} w WolneLektury.pl{% endblock %}
+
+{% block bodyid %}books{% endblock %}
+
+{% block extrahead %}
+    <script type="text/javascript">
+    // <![CDATA[
+        $(function() {            
+            // $('#tags-list ul').addClass('dontsplit');
+            // $('#tags-list').columnize({width: 180});
+            
+            $('#books-list .book').hover(
+                function() { $(this).css({background: '#F3F3F3', cursor: 'pointer'}); },
+                function() { $(this).css({background: '#FFF'}); }
+            ).click(function() {
+                location.href = $('h2 a', this).attr('href');
+            });
+            
+            $('#toggle-description').hover(
+                function() { $(this).css({background: '#F3F3F3', cursor: 'pointer'}); },
+                function() { $(this).css({background: '#EEE'}); }
+            ).click(function() {
+                if ($('#description').hasClass('hidden')) {
+                    $('#description').slideDown('fast').removeClass('hidden');
+                    $('p', this).html('Zwiń opis ▲');
+                } else {
+                    $('#description').slideUp('fast').addClass('hidden');
+                    $('p', this).html('Rozwiń opis ▼');
+                }
+            });
+            
+            var target = $('#set-window div.target');
+            
+            $('#set-window').jqm({
+                ajax: '@href', 
+                target: target[0],
+                overlay: 60,
+                trigger: 'a.jqm-trigger', 
+                onShow: function(hash) { 
+                    var offset = $(hash.t).offset();
+                    target.html('<p><img src="/media/img/indicator.gif" /> Ładowanie</p>');
+                    hash.w.css({position: 'absolute', left: offset.left, top: offset.top}).show() },
+                onLoad: function(hash) { 
+                    $('form', hash.w).ajaxForm({
+                        target: target,
+                        success: function() { setTimeout(function() { $('#set-window').jqmHide() }, 1000) }
+                    });
+                }});
+        });
+    // ]]>
+    </script>
+{% endblock %}
+
+{% block body %}
+    <h1>{% title_from_tags tags %}</h1>
+    {% breadcrumbs tags %}
+    
+    {% autopaginate object_list 10 %}
+    <div id="books-list">
+        {% with tags|last as last_tag %}
+        {% if last_tag.has_description %}
+            <div id="description">
+                {{ last_tag.description|safe }}
+            </div>
+            <div id="toggle-description"><p>Zwiń opis ▲</p></div>
+        {% endif %}
+        {% endwith %}
+        <ol>
+        {% for book in object_list %}
+            <li>{{ book.short_html }}</li>
+        {% endfor %}
+        </ol>
+        {% paginate %}
+    </div>
+    <div id="tags-list">
+        <div class="dontsplit">
+            {% if categories.set %}
+                <h2>Półki</h2>
+                <ul>
+                {% for set in categories.set %}
+                    <li><a href="{% catalogue_url tags set %}">{{ set }}&nbsp;({{ set.count }})</a></li>
+                {% endfor %}
+                </ul>
+            {% endif %}
+        </div>
+        <div class="dontsplit">
+            {% if categories.author %}
+                <h2>Autorzy</h2>
+                <ul>
+                {% for author in categories.author %}
+                    <li><a href="{% catalogue_url tags author %}">{{ author }}&nbsp;({{ author.count }})</a></li>
+                {% endfor %}
+                </ul>
+            {% endif %}
+        </div>
+        <div class="dontsplit">
+            {% if categories.epoch %}
+                <h2>Epoki</h2>
+                <ul>
+                {% for epoch in categories.epoch %}
+                    <li><a href="{% catalogue_url tags epoch %}">{{ epoch }}&nbsp;({{ epoch.count }})</a></li>
+                {% endfor %}
+                </ul>
+            {% endif %}
+        </div>
+        <div class="dontsplit">
+            {% if categories.kind %}
+                <h2>Rodzaje</h2>
+                <ul>
+                {% for kind in categories.kind %}
+                    <li><a href="{% catalogue_url tags kind %}">{{ kind }}&nbsp;({{ kind.count }})</a></li>
+                {% endfor %}
+                </ul>
+            {% endif %}
+        </div>
+        <div class="dontsplit">
+            {% if categories.genre %}
+                <h2>Gatunki literackie</h2>
+                <ul>
+                {% for genre in categories.genre %}
+                    <li><a href="{% catalogue_url tags genre %}">{{ genre }}&nbsp;({{ genre.count }})</a></li>
+                {% endfor %}
+                </ul>
+            {% endif %}
+        </div>
+        <div class="dontsplit">
+            {% if categories.theme %}
+                <h2>Motywy</h2>
+                <ul>
+                {% for theme in categories.theme %}
+                    <li><a href="{% catalogue_url tags theme %}">{{ theme }} ({{ theme.count }})</a></li>
+                {% endfor %}
+                </ul>
+            {% endif %}
+        </div>
+    </div>
+    <div id="set-window">
+        <div class="header"><a href="#" class="jqmClose">Zamknij</a></div>
+        <div class="target">
+            <p><img src="/media/img/indicator.gif" alt="*"/> Ładowanie</p>
+        </div>
+    </div>
+{% endblock %}
\ No newline at end of file
diff --git a/wolnelektury/templates/catalogue/user_shelves.html b/wolnelektury/templates/catalogue/user_shelves.html
new file mode 100644 (file)
index 0000000..44517c5
--- /dev/null
@@ -0,0 +1,15 @@
+<h2>Moje półki</h2>
+{% if shelves %}
+<ul class="shelf-list">
+{% for shelf in shelves %}
+    <li><a href="{% url delete_shelf shelf.slug %}" class="delete-shelf">usuń</a> <a href="{{ shelf.get_absolute_url }}" class="visit-shelf">{{ shelf.name }}</a></li>
+{% endfor %}
+</ul>
+{% else %}
+<p>Nie posiadasz żadnych półek. Jeśli chcesz, możesz utworzyć półkę poniżej.</p>
+{% endif %}
+<hr />
+<form action="{% url catalogue.views.new_set %}" method="POST" accept-charset="utf-8" class="cuteform">
+<ol>
+    <li>{{ new_set_form.name }} <input type="submit" value="Utwórz nową półkę"/></li>
+</ol>
diff --git a/wolnelektury/templates/pagination/pagination.html b/wolnelektury/templates/pagination/pagination.html
new file mode 100644 (file)
index 0000000..36c297b
--- /dev/null
@@ -0,0 +1,25 @@
+{% if is_paginated %}
+<div class="pagination">
+    {% if page_obj.has_previous %}
+        <a href="?page={{ page_obj.previous_page_number }}{{ getvars }}" class="prev">&lsaquo;&lsaquo; poprzedni</a>
+    {% else %}
+        <span class="disabled prev">&lsaquo;&lsaquo; poprzedni</span>
+    {% endif %}
+    {% for page in pages %}
+        {% if page %}
+            {% ifequal page page_obj.number %}
+                <span class="current page">{{ page }}</span>
+            {% else %}
+                <a href="?page={{ page }}{{ getvars }}" class="page">{{ page }}</a>
+            {% endifequal %}
+        {% else %}
+            ...
+        {% endif %}
+    {% endfor %}
+    {% if page_obj.has_next %}
+        <a href="?page={{ page_obj.next_page_number }}{{ getvars }}" class="next">następny &rsaquo;&rsaquo;</a>
+    {% else %}
+        <span class="disabled next">następny &rsaquo;&rsaquo;</span>
+    {% endif %}
+</div>
+{% endif %}
diff --git a/wolnelektury/urls.py b/wolnelektury/urls.py
new file mode 100644 (file)
index 0000000..104899f
--- /dev/null
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+import os
+
+from django.conf.urls.defaults import *
+from django.contrib import admin
+
+admin.autodiscover()
+
+
+urlpatterns = patterns('',
+    url(r'^katalog/', include('catalogue.urls')),
+    
+    # Panel administracyjny
+    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
+    url(r'^admin/(.*)$', admin.site.root),
+    
+    # Użytkownicy
+    url(r'^uzytkownicy/zaloguj/$', 'catalogue.views.login', name='login'),
+    url(r'^uzytkownicy/wyloguj/$', 'catalogue.views.logout_then_redirect', name='logout'),
+    url(r'^uzytkownicy/utworz/$', 'catalogue.views.register', name='register'),
+    
+    # Pliki statyczne
+    url(r'^media/(?P<path>.*)$', 'django.views.static.serve', 
+        {'document_root': os.path.join(os.path.dirname(__file__), 'media'), 'show_indexes': True}),
+    url(r'^$', 'django.views.generic.simple.redirect_to', {'url': 'katalog/'}),
+)