Oddzielenie STATIC_URL od MEDIA_URL.
authorMarek Stępniowski <marek@stepniowski.com>
Mon, 12 Oct 2009 15:09:05 +0000 (17:09 +0200)
committerMarek Stępniowski <marek@stepniowski.com>
Mon, 12 Oct 2009 15:09:05 +0000 (17:09 +0200)
91 files changed:
apps/compress/utils.py
apps/sponsors/widgets.py
wolnelektury/media/css/error.css [deleted file]
wolnelektury/media/css/jquery.autocomplete.css [deleted file]
wolnelektury/media/css/master.book.css [deleted file]
wolnelektury/media/css/master.css [deleted file]
wolnelektury/media/css/master.plain.css [deleted file]
wolnelektury/media/css/sponsors.css [deleted file]
wolnelektury/media/img/arrow-down.png [deleted file]
wolnelektury/media/img/arrow-up.png [deleted file]
wolnelektury/media/img/bg.png [deleted file]
wolnelektury/media/img/book-parent.png [deleted file]
wolnelektury/media/img/book.png [deleted file]
wolnelektury/media/img/czytamysluchajac-logo-small.png [deleted file]
wolnelektury/media/img/favicon.png [deleted file]
wolnelektury/media/img/footer.png [deleted file]
wolnelektury/media/img/indicator.gif [deleted file]
wolnelektury/media/img/logo.png [deleted file]
wolnelektury/media/img/wolontariat/01.jpg [deleted file]
wolnelektury/media/img/wolontariat/02.jpg [deleted file]
wolnelektury/media/img/wolontariat/03.jpg [deleted file]
wolnelektury/media/img/wolontariat/04.jpg [deleted file]
wolnelektury/media/img/wolontariat/okladka.jpg [deleted file]
wolnelektury/media/infobar/infobar.css [deleted file]
wolnelektury/media/infobar/infobar.gif [deleted file]
wolnelektury/media/infobar/infobar.js [deleted file]
wolnelektury/media/js/book.js [deleted file]
wolnelektury/media/js/catalogue.js [deleted file]
wolnelektury/media/js/jquery.autocomplete.js [deleted file]
wolnelektury/media/js/jquery.eventdelegation.js [deleted file]
wolnelektury/media/js/jquery.form.js [deleted file]
wolnelektury/media/js/jquery.highlightfade.js [deleted file]
wolnelektury/media/js/jquery.jqmodal.js [deleted file]
wolnelektury/media/js/jquery.js [deleted file]
wolnelektury/media/js/jquery.labelify.js [deleted file]
wolnelektury/media/js/jquery.scrollto.js [deleted file]
wolnelektury/media/js/ordered_select_multiple.js [deleted file]
wolnelektury/media/player.swf [deleted file]
wolnelektury/media/sponsors/css/footer_admin.css [deleted file]
wolnelektury/media/sponsors/js/footer_admin.js [deleted file]
wolnelektury/media/sponsors/js/jquery.json.min.js [deleted file]
wolnelektury/settings.py
wolnelektury/static/css/error.css [new file with mode: 0644]
wolnelektury/static/css/jquery.autocomplete.css [new file with mode: 0644]
wolnelektury/static/css/master.book.css [new file with mode: 0644]
wolnelektury/static/css/master.css [new file with mode: 0644]
wolnelektury/static/css/master.plain.css [new file with mode: 0644]
wolnelektury/static/css/sponsors.css [new file with mode: 0644]
wolnelektury/static/img/arrow-down.png [new file with mode: 0644]
wolnelektury/static/img/arrow-up.png [new file with mode: 0644]
wolnelektury/static/img/bg.png [new file with mode: 0644]
wolnelektury/static/img/book-parent.png [new file with mode: 0644]
wolnelektury/static/img/book.png [new file with mode: 0644]
wolnelektury/static/img/czytamysluchajac-logo-small.png [new file with mode: 0644]
wolnelektury/static/img/favicon.png [new file with mode: 0644]
wolnelektury/static/img/footer.png [new file with mode: 0644]
wolnelektury/static/img/indicator.gif [new file with mode: 0644]
wolnelektury/static/img/logo.png [new file with mode: 0644]
wolnelektury/static/img/wolontariat/01.jpg [new file with mode: 0644]
wolnelektury/static/img/wolontariat/02.jpg [new file with mode: 0644]
wolnelektury/static/img/wolontariat/03.jpg [new file with mode: 0644]
wolnelektury/static/img/wolontariat/04.jpg [new file with mode: 0644]
wolnelektury/static/img/wolontariat/okladka.jpg [new file with mode: 0644]
wolnelektury/static/infobar/infobar.css [new file with mode: 0644]
wolnelektury/static/infobar/infobar.gif [new file with mode: 0644]
wolnelektury/static/infobar/infobar.js [new file with mode: 0644]
wolnelektury/static/js/book.js [new file with mode: 0644]
wolnelektury/static/js/catalogue.js [new file with mode: 0644]
wolnelektury/static/js/jquery.autocomplete.js [new file with mode: 0644]
wolnelektury/static/js/jquery.eventdelegation.js [new file with mode: 0644]
wolnelektury/static/js/jquery.form.js [new file with mode: 0644]
wolnelektury/static/js/jquery.highlightfade.js [new file with mode: 0644]
wolnelektury/static/js/jquery.jqmodal.js [new file with mode: 0644]
wolnelektury/static/js/jquery.js [new file with mode: 0644]
wolnelektury/static/js/jquery.labelify.js [new file with mode: 0644]
wolnelektury/static/js/jquery.scrollto.js [new file with mode: 0644]
wolnelektury/static/js/ordered_select_multiple.js [new file with mode: 0644]
wolnelektury/static/player.swf [new file with mode: 0644]
wolnelektury/static/sponsors/css/footer_admin.css [new file with mode: 0644]
wolnelektury/static/sponsors/js/footer_admin.js [new file with mode: 0644]
wolnelektury/static/sponsors/js/jquery.json.min.js [new file with mode: 0644]
wolnelektury/templates/404.html
wolnelektury/templates/500.html
wolnelektury/templates/base.html
wolnelektury/templates/catalogue/book_detail.html
wolnelektury/templates/catalogue/book_fragments.html
wolnelektury/templates/catalogue/book_text.html
wolnelektury/templates/catalogue/main_page.html
wolnelektury/templates/catalogue/tagged_object_list.html
wolnelektury/templates/info/voluntary_services.html
wolnelektury/urls.py

index 1e0681f..3c59728 100644 (file)
@@ -58,10 +58,10 @@ def media_root(filename):
     """
     Return the full path to ``filename``. ``filename`` is a relative path name in MEDIA_ROOT
     """
     """
     Return the full path to ``filename``. ``filename`` is a relative path name in MEDIA_ROOT
     """
-    return os.path.join(django_settings.MEDIA_ROOT, filename)
+    return os.path.join(django_settings.STATIC_ROOT, filename)
 
 def media_url(url):
 
 def media_url(url):
-    return django_settings.MEDIA_URL + urlquote(url)
+    return django_settings.STATIC_URL + urlquote(url)
 
 def concat(filenames, separator=''):
     """
 
 def concat(filenames, separator=''):
     """
index 3bb586b..72aaf0a 100644 (file)
@@ -10,11 +10,11 @@ class SponsorPageWidget(forms.Textarea):
         js = (
             'http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js',
             'http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.1/jquery-ui.min.js',
         js = (
             'http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js',
             'http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.1/jquery-ui.min.js',
-            settings.MEDIA_URL + 'sponsors/js/jquery.json.min.js',
-            settings.MEDIA_URL + 'sponsors/js/footer_admin.js',
+            settings.STATIC_URL + 'sponsors/js/jquery.json.min.js',
+            settings.STATIC_URL + 'sponsors/js/footer_admin.js',
         )
         css = {
         )
         css = {
-            'all': (settings.MEDIA_URL + 'sponsors/css/footer_admin.css',),
+            'all': (settings.STATIC_URL + 'sponsors/css/footer_admin.css',),
         }
 
     def render(self, name, value, attrs=None):
         }
 
     def render(self, name, value, attrs=None):
diff --git a/wolnelektury/media/css/error.css b/wolnelektury/media/css/error.css
deleted file mode 100644 (file)
index 8315734..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-
-body {
-font-family: verdana, arial, sans-serif; 
-margin: 2em;
-font-size: 100%;
-}
-
-
-
-
-h1 {
-font-size: 300%;
-font-weight: bold;
-margin-top: 30px;
-}
-
-h1,h2 {
-margin-bottom: 0;
-}
-
-h2 {
-font-size: 100%;
-font-weight: bold; 
-margin-top: 1em;
-}
-
-p {
-width: 450px;
-margin-top: 0.5em;
-}
-
-img {
-       border: none;
-}
-       
-       #whoiam {
-       text-transform: uppercase;
-       letter-spacing: 0.2em;
-       font-size: 150%;
-       margin-bottom: 0.8em;
-}
-
-.howto {
-
-       color: gray;
-       font-size: 80%
-}
-
-#contact h2 {
-margin-top: 0.5em;
-}
-
-
-.haj {
-       background-color: #ffc;
-}
-
-#urle {
-margin-top: 2.3em;
-}
-
-/*
-LINKS
-*/
-
-a:link {
-color: #037;
-text-decoration: underline; 
-}
-
-a:visited {
-color: #636;
-}
-
-a:active {
-color: #900;
-text-decoration: none;
-}
-
-a:hover {
-color: #d46400;
-}
-
diff --git a/wolnelektury/media/css/jquery.autocomplete.css b/wolnelektury/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/wolnelektury/media/css/master.book.css b/wolnelektury/media/css/master.book.css
deleted file mode 100644 (file)
index a5f791c..0000000
+++ /dev/null
@@ -1,319 +0,0 @@
-body {
-    font-size: 16px;
-    font: Georgia, "Times New Roman", serif;
-    line-height: 1.5em;
-    margin: 0;
-}
-
-a {
-    color: blue;
-    text-decoration: none;
-}
-
-#book-text {
-    margin: 3em;
-    max-width: 36em;
-}
-
-/* ================================== */
-/* = Header with logo and menu      = */
-/* ================================== */
-#header {
-    margin: 3.4em 0 0 1.4em;
-}
-
-img {
-    border: none;
-}
-
-
-#menu {
-    position: fixed;
-    left: 0em;
-    top: 0em;
-    width: 100%;
-    height: 1.5em;
-    background: #333;
-    color: #FFF;
-    opacity: 0.9;
-}
-
-#menu ul {
-    list-style: none;
-    padding: 0;
-    margin: 0;
-}
-
-#menu li a {
-    display: block;
-    float: left;
-    width: 7.5em;
-    height: 1.5em;
-    margin-left: 0.5em;
-    text-align: center;
-    color: #FFF;
-}
-
-#menu li a:hover, #menu li a:active {
-    color: #000;
-    background: #FFF url(/media/img/arrow-down.png) no-repeat center right;
-}
-
-#menu li a.selected {
-    color: #000;
-    background: #FFF url(/media/img/arrow-up.png) no-repeat center right;
-}
-
-#toc, #themes {
-    position: fixed;
-    left: 0em;
-    top: 1.5em;
-    width: 37em;
-    padding: 1.5em;
-    background: #FFF;
-    border-bottom: 0.25em solid #DDD;
-    border-right: 0.25em solid #DDD;
-    display: none;
-    height: 16em;
-    overflow-x: hidden;
-    overflow-y: auto;
-    opacity: 0.9;
-}
-
-#toc ol, #themes ol {
-    list-style: none;
-    padding: 0;
-    margin: 0;
-}
-
-#toc ol li {
-    font-weight: bold;
-}
-
-#toc ol ol {
-    padding: 0 0 1.5em 1.5em;
-    margin: 0;
-}
-
-#toc ol ol li {
-    font-weight: normal;
-}
-
-#toc h2 {
-    display: none;
-}
-
-#toc .anchor {
-    float: none;
-    margin: 0;
-    color: blue;
-    font-size: 16px;
-    position: inherit;
-}
-
-/* =================================================== */
-/* = Common elements: headings, paragraphs and lines = */
-/* =================================================== */
-h1 {
-    font-size: 3em;
-    margin: 1.5em 0;
-    text-align: center;
-    line-height: 1.5em;
-    font-weight: bold;
-}
-
-h2 {
-    font-size: 2em;
-    margin: 1.5em 0 0;
-    font-weight: bold;
-    line-height: 1.5em;
-}
-
-h3 {
-    font-size: 1.5em;
-    margin: 1.5em 0 0;
-    font-weight: normal;
-    line-height: 1.5em;
-}
-
-h4 {
-    font-size: 1em;
-    margin: 1.5em 0 0;
-    line-height: 1.5em;
-}
-
-p {
-    margin: 0;
-}
-
-/* ======================== */
-/* = Footnotes and themes = */
-/* ======================== */
-.theme-begin {
-    border-left: 0.1em solid #DDDDDD;
-    color: #777;
-    padding: 0 0.5em;
-    width: 7.5em;
-    font-style: normal;
-    font-weight: normal;
-    font-size: 16px;
-    float: right;
-    margin-right: -9.5em;
-    clear: both;
-    left: 40em;
-    line-height: 1.5em;
-    text-align: left;
-}
-
-.annotation {
-    font-style: normal;
-    font-weight: normal;
-    font-size: 12px;
-}
-
-#footnotes .annotation {
-    display: block;
-    float: left;
-    width: 2.5em;
-    clear: both;
-}
-
-#footnotes div {
-    margin: 1.5em 0 0 0;
-}
-
-#footnotes p {
-    margin-left: 2.5em;
-    font-size: 0.875em;
-}
-
-blockquote {
-    font-size: 0.875em;
-}
-
-/* ============= */
-/* = Numbering = */
-/* ============= */
-.anchor {
-    position: absolute;
-    margin: -0.25em -0.5em;
-    left: 1em;
-    color: #777;
-    font-size: 12px;
-    width: 2em;
-    text-align: center;
-    padding: 0.25em 0.5em;
-    line-height: 1.5em;
-}
-
-.anchor:hover, #book-text .anchor:active {
-    color: #FFF;
-    background-color: #CCC;
-}
-
-/* =================== */
-/* = Custom elements = */
-/* =================== */
-span.author {
-    font-size: 0.5em;
-    display: block;
-    line-height: 1.5em;
-    margin-bottom: 0.25em;
-}
-
-span.collection {
-    font-size: 0.375em;
-    display: block;
-    line-height: 1.5em;
-    margin-bottom: -0.25em;
-}
-
-span.subtitle {
-    font-size: 0.5em;
-    display: block;
-    line-height: 1.5em;
-    margin-top: -0.25em;
-}
-
-div.didaskalia {
-    font-style: italic;
-    margin: 0.5em 0 0 1.5em;
-}
-
-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;
-    text-align: right;
-}
-
-div.fragment {
-    border-bottom: 0.1em solid #999;
-    padding-bottom: 1.5em;
-}
-
-div.note p, div.dedication p, div.note p.paragraph, div.dedication p.paragraph {
-    text-align: right;
-    font-style: italic;
-}
-
-hr.spacer {
-    height: 3em;
-    visibility: hidden;
-}
-
-hr.spacer-line {
-    margin: 1.5em 0;
-    border: none;
-    border-bottom: 0.1em solid #000;
-}
-
-p.spacer-asterisk {
-    padding: 0;
-    margin: 1.5em 0;
-    text-align: center;
-}
-
-div.person-list ol {
-    list-style: none;
-    padding: 0 0 0 1.5em;
-}
-
-p.place-and-time {
-    font-style: italic;
-}
-
-em.math, em.foreign-word, em.book-title, em.didaskalia {
-    font-style: italic;
-}
-
-em.author-emphasis {
-    letter-spacing: 0.1em;
-}
-
-em.person {
-    font-style: normal;
-    font-variant: small-caps;
-}
-
diff --git a/wolnelektury/media/css/master.css b/wolnelektury/media/css/master.css
deleted file mode 100644 (file)
index 34428b2..0000000
+++ /dev/null
@@ -1,658 +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: 1em;
-    font-weight: bold;
-    margin: 0.2em 0 -1em 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: #777;
-    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: block;
-    float: left;
-}
-
-#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;
-    margin-right: 0.25em;
-}
-
-#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;
-}
-
-.ac_input {
-    width: 18em;
-}
-
-p .ac_input {
-    width: 28em;
-}
-
-
-/* ============= */
-/* = Tags list = */
-/* ============= */
-#intro {
-    margin: 0 0 2.5em 0;
-}
-
-#tags-description {
-    color: #777;
-    margin: 0 0.5em -0.75em 0.5em;
-}
-
-#main-page #tags-list {
-    margin-right: 33%;
-}
-
-#categories-list ul, #themes-list ul {
-    -moz-column-width: 12em;
-    -webkit-column-width: 12em;
-    column-width: 12em;
-}
-
-#tags-list {
-    margin-top: 1em;
-    padding: 1em;
-    background-color: #FBF9E7;
-    -moz-border-radius: 4px;
-    -webkit-border-radius: 4px;
-    border-radius: 4px;
-    border-bottom: 0.15em solid #E3D888;
-    border-right: 0.15em solid #E3D888;
-}
-
-#tagged-object-list #tags-list, #book-detail #tags-list {
-    margin-left: 39em;
-}
-
-#book-info, #categories-list {
-    float: left;
-    width: 47.5%;
-}
-
-#themes-list {
-    margin-left: 52.5%;
-}
-
-#tagged-object-list #categories-list, #book-detail #book-info {
-    width: 12em;
-}
-
-#book-detail #formats .change-sets {
-    margin-right: 0.5em;
-}
-
-#formats .wrap a {
-    display: block;
-    width: 100%;
-    height: 1.5em;
-    background-color: #EEE;
-    margin-top: 0.5em;
-    padding: 0.5em 0;
-    -moz-border-radius: 4px;
-    -webkit-border-radius: 4px;
-    border-radius: 4px;
-    text-align: center;    
-}
-
-#czytamysluchajac {
-    margin-top: 2.5em;
-}
-
-#czytamy-sluchajac-info {
-    width: 400px;
-    height: 80px;
-}
-
-#czytamy-sluchajac-info p {
-    margin-left: 170px;
-    padding-top: 1em;
-    padding-bottom: 0em;
-}
-
-#formats #czytamysluchajac-logo {
-    background: white;
-    text-align: left;
-    float: left;
-    width: 140px;
-    height: 62px;
-    -moz-border-radius: 0px;
-    -webkit-border-radius: 0px;
-    border-radius: 0px;
-}
-
-#tagged-object-list #themes-list, #book-detail #themes-list {
-    margin-left: 14em;
-}
-
-#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;
-}
-
-#books-list {
-    width: 38em;
-    float: left;
-}
-
-.all-tags {
-    display: none;
-}
-
-div.shown-tags p, div.all-tags p {
-    margin: -1em 0 1em 0;
-    text-align: right;
-}
-
-.show-all-tags, .hide-all-tags {
-    text-decoration: underline;
-    padding-right: 1em;
-}
-
-.subcategories {
-    display: block;
-    padding-left: 2em;
-    padding-bottom: 0.5em;
-}
-
-
-/* ============== */
-/* = Propaganda = */
-/* ============== */
-#propaganda {
-    float: right;
-    width: 30%;
-    margin: 0;
-    padding: 2em 0.5em 0.5em;
-}
-
-
-/* ===================== */
-/* = Other info        = */
-/* ===================== */
-#latest-blog-posts {
-    padding: 0.5em;
-    float: left;
-    width: 30%;
-}
-
-#latest-blog-posts ol {
-    padding: 0 0 0 1.5em;
-    margin: 1em 0 0 0;
-    list-style-type: square;
-    color: #D13628;
-}
-
-#you-can-help {
-    float: right;
-    padding: 0.5em;
-    width: 30%;
-}
-
-#about-us {
-    padding: 0.5em;
-    margin-left: 35%;
-    margin-right: 35%;
-}
-
-/* =============== */
-/* = Description = */
-/* =============== */
-#description {
-    margin-top: 0.5em;
-    text-align: justify;
-}
-
-#description .meta {
-    margin: 0.5em;
-    width: 18em;
-    list-style: none;
-    float: right;
-}
-
-#description dt {
-    font-weight: bold;
-    display: inline;
-}
-
-#description dd {
-    margin: 0;
-    display: inline;
-}
-
-#toggle-description, #tagged-object-list .pagination, #book-detail .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;
-}
-
-#download-shelf {
-    display: block;
-    width: 100%;
-    height: 1.5em;
-    background-color: #EEE;
-    margin-top: 0.5em;
-    padding: 0.5em 0;
-    -moz-border-radius: 4px;
-    -webkit-border-radius: 4px;
-    border-radius: 4px;
-    text-align: center;    
-}
-
-/* ============================ */
-/* = 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;
-}
-
-.change-sets a {
-    padding: 0.2em;
-    margin: 0.3em;
-    border: 0.1em solid #EEE;
-    background-color: #F9F9F9;
-}
-
-.book-description {
-    margin-left: 3.5em;
-}
-
-.book-thumbnail, .book-parent-thumbnail {
-    background: transparent url(/media/img/book.png) no-repeat 0 0;
-    width: 3em;
-    height: 3em;
-    float: left;
-}
-
-.book-parent-thumbnail {
-    background: transparent url(/media/img/book-parent.png) no-repeat 0 0;
-}
-
-
-/* =============== */
-/* = 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;
-}
-
-.shelf-list {
-    list-style: none;
-    padding: 0;
-}
-
-.shelf-list li {
-    padding: 0.25em;
-    margin: 0 -0.25em;
-}
-
-.shelf-list a.delete-shelf {
-    color: #900;
-    float: right;
-    padding: 0.25em 0.25em 0.25em 1em;
-    margin: -0.25em;
-}
-
-.shelf-list a.delete-shelf:active, .shelf-list a.delete-shelf:hover {
-    color: #FFF;
-    background-color: #900;
-    text-decoration: none;
-}
-
-/* ======================== */
-/* = Alphabetic book list = */
-/* ======================== */
-#book-a-list #book-list {
-    -moz-column-width: 24em;
-    -webkit-column-width: 24em;
-    column-width: 24em;
-}
-
-#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 2.5em;
-    line-height: 2em;
-}
-
-#top-message a {
-    color: #AAA;
-}
-
-
-/* =========== */
-/* = Columns = */
-/* =========== */
-.column-left {
-    width: 37em;
-    float: left;
-    text-align: justify;
-    margin-top: 1em;
-}
-
-.column-right {
-    margin-left: 40em;
-    text-align: justify;
-    margin-top: 1em;
-}
-
-.see-more {
-    text-align: right;
-}
-
-.remove-from-shelf {
-    float: right;
-    padding: 0.2em;
-    margin: 0.3em;
-    color: #900;
-}
-
-.remove-from-shelf:active, .remove-from-shelf:hover {
-    color: #FFF;
-    background-color: #900;
-    text-decoration: none;
-}
\ No newline at end of file
diff --git a/wolnelektury/media/css/master.plain.css b/wolnelektury/media/css/master.plain.css
deleted file mode 100644 (file)
index 62888a4..0000000
+++ /dev/null
@@ -1,125 +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;
-}
-
-
-/* ============= */
-/* = Numbering = */
-/* ============= */
-.anchor {
-    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/css/sponsors.css b/wolnelektury/media/css/sponsors.css
deleted file mode 100644 (file)
index 810e1ff..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-.sponsors-sponsor-group {
-    float: left;
-    overflow: hidden;
-}
-
-.sponsors-sponsor-logo {
-    float: left;
-}
\ No newline at end of file
diff --git a/wolnelektury/media/img/arrow-down.png b/wolnelektury/media/img/arrow-down.png
deleted file mode 100644 (file)
index 0e32315..0000000
Binary files a/wolnelektury/media/img/arrow-down.png and /dev/null differ
diff --git a/wolnelektury/media/img/arrow-up.png b/wolnelektury/media/img/arrow-up.png
deleted file mode 100644 (file)
index cdf9cf6..0000000
Binary files a/wolnelektury/media/img/arrow-up.png and /dev/null differ
diff --git a/wolnelektury/media/img/bg.png b/wolnelektury/media/img/bg.png
deleted file mode 100644 (file)
index be7d63a..0000000
Binary files a/wolnelektury/media/img/bg.png and /dev/null differ
diff --git a/wolnelektury/media/img/book-parent.png b/wolnelektury/media/img/book-parent.png
deleted file mode 100644 (file)
index 5668598..0000000
Binary files a/wolnelektury/media/img/book-parent.png and /dev/null differ
diff --git a/wolnelektury/media/img/book.png b/wolnelektury/media/img/book.png
deleted file mode 100644 (file)
index f264839..0000000
Binary files a/wolnelektury/media/img/book.png and /dev/null differ
diff --git a/wolnelektury/media/img/czytamysluchajac-logo-small.png b/wolnelektury/media/img/czytamysluchajac-logo-small.png
deleted file mode 100644 (file)
index 9c635aa..0000000
Binary files a/wolnelektury/media/img/czytamysluchajac-logo-small.png and /dev/null differ
diff --git a/wolnelektury/media/img/favicon.png b/wolnelektury/media/img/favicon.png
deleted file mode 100644 (file)
index 6cffce8..0000000
Binary files a/wolnelektury/media/img/favicon.png and /dev/null differ
diff --git a/wolnelektury/media/img/footer.png b/wolnelektury/media/img/footer.png
deleted file mode 100644 (file)
index 0f8c650..0000000
Binary files a/wolnelektury/media/img/footer.png and /dev/null differ
diff --git a/wolnelektury/media/img/indicator.gif b/wolnelektury/media/img/indicator.gif
deleted file mode 100644 (file)
index 085ccae..0000000
Binary files a/wolnelektury/media/img/indicator.gif and /dev/null differ
diff --git a/wolnelektury/media/img/logo.png b/wolnelektury/media/img/logo.png
deleted file mode 100644 (file)
index 398f45d..0000000
Binary files a/wolnelektury/media/img/logo.png and /dev/null differ
diff --git a/wolnelektury/media/img/wolontariat/01.jpg b/wolnelektury/media/img/wolontariat/01.jpg
deleted file mode 100644 (file)
index 84fcc73..0000000
Binary files a/wolnelektury/media/img/wolontariat/01.jpg and /dev/null differ
diff --git a/wolnelektury/media/img/wolontariat/02.jpg b/wolnelektury/media/img/wolontariat/02.jpg
deleted file mode 100644 (file)
index 2fc90ef..0000000
Binary files a/wolnelektury/media/img/wolontariat/02.jpg and /dev/null differ
diff --git a/wolnelektury/media/img/wolontariat/03.jpg b/wolnelektury/media/img/wolontariat/03.jpg
deleted file mode 100644 (file)
index f6e719a..0000000
Binary files a/wolnelektury/media/img/wolontariat/03.jpg and /dev/null differ
diff --git a/wolnelektury/media/img/wolontariat/04.jpg b/wolnelektury/media/img/wolontariat/04.jpg
deleted file mode 100644 (file)
index fbf0f15..0000000
Binary files a/wolnelektury/media/img/wolontariat/04.jpg and /dev/null differ
diff --git a/wolnelektury/media/img/wolontariat/okladka.jpg b/wolnelektury/media/img/wolontariat/okladka.jpg
deleted file mode 100644 (file)
index aec1fc4..0000000
Binary files a/wolnelektury/media/img/wolontariat/okladka.jpg and /dev/null differ
diff --git a/wolnelektury/media/infobar/infobar.css b/wolnelektury/media/infobar/infobar.css
deleted file mode 100644 (file)
index fbab951..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-/*Based on No IE Information Bar 0.2.6 by Martin Ng <http://minghong.webhop.org>, modified by Kornel Lesinski. Under license:http://creativecommons.org/licenses/by-nc/2.0/legalcode*/
-@media screen{#viewplot{
-padding:0; /* << Tutaj ustaw margines jak dla <body> */
-width:100%;height:95%;overflow:auto;height:expression(this.parentNode.offsetHeight-this.offsetTop);position:relative}html{border-top:0;border-left:0;border-bottom:0;overflow:hidden;height:100%}body{margin:0;padding:0;overflow:hidden;height:100%}#infobar{width:100%;font:normal 8pt/1 "MS Sans Serif"}#infobar a{display:block;font:message-box;zoom:1;color:InfoText;background:InfoBackground url(infobar.gif) no-repeat fixed .33em .2em;padding:.45em .3em .45em 2.3em;border-bottom:.16em outset;text-align:left;text-decoration:none;cursor:default}#infobar a{font-size:8pt;letter-spacing:0}#infobar a:hover{color:HighlightText;background-color:Highlight}}#infobar b{position:absolute;right:5px;top:3px;font-size:11px;font-family:webdings;cursor:hand}@media print{#infobar{display:none}}
\ No newline at end of file
diff --git a/wolnelektury/media/infobar/infobar.gif b/wolnelektury/media/infobar/infobar.gif
deleted file mode 100644 (file)
index 12b7474..0000000
Binary files a/wolnelektury/media/infobar/infobar.gif and /dev/null differ
diff --git a/wolnelektury/media/infobar/infobar.js b/wolnelektury/media/infobar/infobar.js
deleted file mode 100644 (file)
index b2e75ca..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/*Based on No IE Information Bar 0.2.9 by Martin Ng <http://minghong.webhop.org>, Ching Yonghan, modified by Kornel Lesinski. Under license: http://creativecommons.org/licenses/by-nc/2.0/legalcode*/
-(function(){if (!infobar||!viewplot)return;if(Math.random()*10>(infobar.s||10) || document.cookie.indexOf('browsehappyinfobar=0')>=0){infobar.style.display='none';return}infobar.innerHTML='<b onclick="infobar.style.display=\'none\';viewplot.height=\'100%\';document.cookie=\'browsehappyinfobar=0; path=/\'">r</b>'+infobar.innerHTML;infobar.onclick=function(){infobar.all.tags("a")[0].innerHTML='Trwa otwieranie strony informacyjnej...'};if (!infobar.offsetHeight) return;var I=infobar.runtimeStyle,V=viewplot.runtimeStyle;I.top=infobar.offsetHeight*-1;I.left=V.top=V.left=0;V.position=I.position="absolute";var T=setInterval(function(){var N=parseInt(infobar.currentStyle.top),M=-N;if(M>0){M=M>5?5:M;I.top=N+M;V.top=parseInt(V.top)+M}else{clearInterval(T);I.position=V.position="";V.top='0'}},40)})()
diff --git a/wolnelektury/media/js/book.js b/wolnelektury/media/js/book.js
deleted file mode 100644 (file)
index 41e3be2..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-$(function() {    
-    function scrollToAnchor(anchor) {
-        if (anchor) {
-            var element = $('a[name="' + anchor.slice(1) + '"]');
-            if (element.length > 0) {
-                $.scrollTo(element, 500, {offset: {top: -50, left: 0}});
-                $(element).highlightFade('yellow');
-                window.location.hash = anchor;
-            }
-        }
-    }
-    
-    $.highlightFade.defaults.speed = 3000;
-    $('#toc').hide();
-    if ($('#toc li').length == 0) {
-        $('#menu li a[href="#toc"]').remove();
-    }
-    
-    // On page load, scroll to anchor
-    scrollToAnchor(window.location.hash)
-    
-    $('#toc, #themes, #book-text').delegate('click', 'a', function(event) {
-        event.preventDefault();
-        $('#menu li a.selected').click();
-        scrollToAnchor($(this).attr('href'));
-    });
-    
-    $('#menu li a').toggle(function() {
-        $('#menu li a.selected').click();
-        $(this).addClass('selected');
-        $($(this).attr('href')).slideDown('fast');
-    }, function() {
-        $(this).removeClass('selected');
-        $($(this).attr('href')).slideUp('fast');
-    });
-});
diff --git a/wolnelektury/media/js/catalogue.js b/wolnelektury/media/js/catalogue.js
deleted file mode 100644 (file)
index 1dbd1b9..0000000
+++ /dev/null
@@ -1,214 +0,0 @@
-(function($) {
-    $(function() {
-        $('form input').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'}); }
-        );
-        
-        $('.show-all-tags').click(function() {
-            $(this).parent().parent().fadeOut(function() { 
-                $(this).next().fadeIn();
-            });
-            return false;
-        });
-        
-        $('.hide-all-tags').click(function() {
-           $(this).parent().parent().fadeOut(function() {
-               $(this).prev().fadeIn();
-           });
-           return false; 
-        });
-        
-        $('#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();
-            }
-        });
-        
-        $('ul.shelf-list li').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() { 
-            var link = $(this);
-            var shelf_name = $('.visit-shelf', link.parent()).text();
-            if (confirm('Czy na pewno usunąć półkę ' + shelf_name + '?')) {
-                $.post(link.attr('href'), function(data, textStatus) {
-                    link.parent().remove();
-                });
-            }
-            return false;
-        });
-        
-        $('#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) { 
-                $('form', hash.w).ajaxForm({
-                    target: $('#user-shelves-window div.target'),
-                    success: function() { setTimeout(function() { $('#user-shelves-window').jqmHide() }, 1000) }
-                });
-                
-                $('input', hash.w).labelify({labelledClass: 'blur'});
-                
-                $('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() {
-                    var link = $(this);
-                    var shelf_name = $('.visit-shelf', link.parent()).text();
-                    if (confirm('Czy na pewno usunąć półkę ' + shelf_name + '?')) {
-                        $.post(link.attr('href'), function(data, textStatus) {
-                            link.parent().remove();
-                        });
-                    }
-                    return false;
-                });
-            }
-        });
-    
-        $('#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) }
-                });
-            }
-        });
-        
-        $('a.remove-from-shelf').click(function(event) {
-            event.preventDefault();
-            link = $(this);
-            $.post(link.attr('href'), function(data, textStatus) {
-                link.parent().remove();
-            });
-        });
-        
-        $('#user-info').show();
-    });
-})(jQuery)
\ No newline at end of file
diff --git a/wolnelektury/media/js/jquery.autocomplete.js b/wolnelektury/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/wolnelektury/media/js/jquery.eventdelegation.js b/wolnelektury/media/js/jquery.eventdelegation.js
deleted file mode 100644 (file)
index 5ecba6e..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/* 
- * jQuery Event Delegation Plugin - jquery.eventdelegation.js
- * Fast flexible event handling
- *
- * January 2008 - Randy Morey (http://dev.distilldesign.com/)
- */
-
-(function ($) {
-       /* setup list of allowed events for event delegation
-        * only events that bubble are appropriate
-        */
-       var allowed = {};
-       $.each([
-               'click',
-               'dblclick',
-               'mousedown',
-               'mouseup',
-               'mousemove',
-               'mouseover',
-               'mouseout',
-               'keydown',
-               'keypress',
-               'keyup'
-               ], function(i, eventName) {     
-                       allowed[eventName] = true;
-       });
-       
-       $.fn.extend({
-               delegate: function (event, selector, f) {
-                       return $(this).each(function () {
-                               if (allowed[event])
-                                       $(this).bind(event, function (e) {
-                                               var el = $(e.target),
-                                                       result = false;
-                                               
-                                               while (!$(el).is('body')) {
-                                                       if ($(el).is(selector)) {
-                                                               result = f.apply($(el)[0], [e]);
-                                                               if (result === false)
-                                                                       e.preventDefault();
-                                                               return;
-                                                       }
-                                                       
-                                                       el = $(el).parent();
-                                               }
-                                       });
-                       });
-               },
-               undelegate: function (event) {
-                       return $(this).each(function () {
-                               $(this).unbind(event);
-                       });
-               }
-       });
-})(jQuery);
\ No newline at end of file
diff --git a/wolnelektury/media/js/jquery.form.js b/wolnelektury/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/wolnelektury/media/js/jquery.highlightfade.js b/wolnelektury/media/js/jquery.highlightfade.js
deleted file mode 100644 (file)
index 600cfe1..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-/**
- *  jQuery Plugin highlightFade (jquery.offput.ca/highlightFade)
- *  (c) 2006 Blair Mitchelmore (offput.ca) blair@offput.ca
- */
-/**
- * This is version 0.7 of my highlightFade plugin. It follows the yellow fade technique of Web 2.0 fame
- * but expands it to allow any starting colour and allows you to specify the end colour as well.
- *
- * For the moment, I'm done with this plug-in. Unless I come upon a really cool feature it should have
- * this plug-in will only receive updates to ensure future compatibility with jQuery.
- *
- * As of now (Aug. 16, 2006) the plugin has been written with the 1.0.1 release of jQuery (rev 249) which
- * is available from http://jquery.com/src/jquery-1.0.1.js
- *
- * A note regarding rgb() syntax: I noticed that most browsers implement rgb syntax as either an integer 
- * (0-255) or percentage (0-100%) value for each field, that is, rgb(i/p,i/p,i/p); however, the W3C 
- * standard clearly defines it as "either three integer values or three percentage values" [http://www.w3.org/TR/CSS21/syndata.html] 
- * which I choose to follow despite the error redundancy of the typical behaviour browsers employ.
- *
- * Changelog:
- *
- *    0.7:
- *        - Added the awesome custom attribute support written by George Adamson (slightly modified)
- *        - Removed bgColor plugin dependency seeing as attr is customizable now...
- *    0.6:
- *        - Abstracted getBGColor into its own plugin with optional test and data retrieval functions
- *        - Converted all $ references to jQuery references as John's code seems to be shifting away
- *          from that and I don't want to have to update this for a long time.
- *    0.5:
- *        - Added simple argument syntax for only specifying start colour of event
- *        - Removed old style argument syntax
- *        - Added 'interval', 'final, and 'end' properties
- *        - Renamed 'color' property to 'start'
- *        - Added second argument to $.highlightFade.getBGColor to bypass the e.highlighting check
- *    0.4:
- *        - Added rgb(%,%,%) color syntax
- *    0.3:
- *        - Fixed bug when event was called while parent was also running event corrupting the
- *          the background colour of the child
- *    0.2:
- *        - Fixed bug where an unspecified onComplete function made the page throw continuous errors
- *        - Fixed bug where multiple events on the same element would speed each subsequent event
- *    0.1:
- *        - Initial Release
- * 
- * @author          Blair Mitchelmore (blair@offput.ca)
- * @version         0.5
- */
-jQuery.fn.highlightFade = function(settings) {
-       var o = (settings && settings.constructor == String) ? {start: settings} : settings || {};
-       var d = jQuery.highlightFade.defaults;
-       var i = o['interval'] || d['interval'];
-       var a = o['attr'] || d['attr'];
-       var ts = {
-               'linear': function(s,e,t,c) { return parseInt(s+(c/t)*(e-s)); },
-               'sinusoidal': function(s,e,t,c) { return parseInt(s+Math.sin(((c/t)*90)*(Math.PI/180))*(e-s)); },
-               'exponential': function(s,e,t,c) { return parseInt(s+(Math.pow(c/t,2))*(e-s)); }
-       };
-       var t = (o['iterator'] && o['iterator'].constructor == Function) ? o['iterator'] : ts[o['iterator']] || ts[d['iterator']] || ts['linear'];
-       if (d['iterator'] && d['iterator'].constructor == Function) t = d['iterator'];
-       return this.each(function() {
-               if (!this.highlighting) this.highlighting = {};
-               var e = (this.highlighting[a]) ? this.highlighting[a].end : jQuery.highlightFade.getBaseValue(this,a) || [255,255,255];
-               var c = jQuery.highlightFade.getRGB(o['start'] || o['colour'] || o['color'] || d['start'] || [255,255,128]);
-               var s = jQuery.speed(o['speed'] || d['speed']);
-               var r = o['final'] || (this.highlighting[a] && this.highlighting[a].orig) ? this.highlighting[a].orig : jQuery.curCSS(this,a);
-               if (o['end'] || d['end']) r = jQuery.highlightFade.asRGBString(e = jQuery.highlightFade.getRGB(o['end'] || d['end']));
-               if (typeof o['final'] != 'undefined') r = o['final'];
-               if (this.highlighting[a] && this.highlighting[a].timer) window.clearInterval(this.highlighting[a].timer);
-               this.highlighting[a] = { steps: ((s.duration) / i), interval: i, currentStep: 0, start: c, end: e, orig: r, attr: a };
-               jQuery.highlightFade(this,a,o['complete'],t);
-       });
-};
-
-jQuery.highlightFade = function(e,a,o,t) {
-       e.highlighting[a].timer = window.setInterval(function() { 
-               var newR = t(e.highlighting[a].start[0],e.highlighting[a].end[0],e.highlighting[a].steps,e.highlighting[a].currentStep);
-               var newG = t(e.highlighting[a].start[1],e.highlighting[a].end[1],e.highlighting[a].steps,e.highlighting[a].currentStep);
-               var newB = t(e.highlighting[a].start[2],e.highlighting[a].end[2],e.highlighting[a].steps,e.highlighting[a].currentStep);
-               jQuery(e).css(a,jQuery.highlightFade.asRGBString([newR,newG,newB]));
-               if (e.highlighting[a].currentStep++ >= e.highlighting[a].steps) {
-                       jQuery(e).css(a,e.highlighting[a].orig || '');
-                       window.clearInterval(e.highlighting[a].timer);
-                       e.highlighting[a] = null;
-                       if (o && o.constructor == Function) o.call(e);
-               }
-       },e.highlighting[a].interval);
-};
-
-jQuery.highlightFade.defaults = {
-       start: [255,255,128],
-       interval: 50,
-       speed: 400,
-       attr: 'backgroundColor'
-};
-
-jQuery.highlightFade.getRGB = function(c,d) {
-       var result;
-       if (c && c.constructor == Array && c.length == 3) return c;
-       if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))
-               return [parseInt(result[1]),parseInt(result[2]),parseInt(result[3])];
-       else if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))
-               return [parseFloat(result[1])*2.55,parseFloat(result[2])*2.55,parseFloat(result[3])*2.55];
-       else if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))
-               return [parseInt("0x" + result[1]),parseInt("0x" + result[2]),parseInt("0x" + result[3])];
-       else if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))
-               return [parseInt("0x"+ result[1] + result[1]),parseInt("0x" + result[2] + result[2]),parseInt("0x" + result[3] + result[3])];
-       else
-               return jQuery.highlightFade.checkColorName(c) || d || null;
-};
-
-jQuery.highlightFade.asRGBString = function(a) {
-       return "rgb(" + a.join(",") + ")";
-};
-
-jQuery.highlightFade.getBaseValue = function(e,a,b) {
-       var s, t;
-       b = b || false;
-       t = a = a || jQuery.highlightFade.defaults['attr'];
-       do {
-               s = jQuery(e).css(t || 'backgroundColor');
-               if ((s  != '' && s != 'transparent') || (e.tagName.toLowerCase() == "body") || (!b && e.highlighting && e.highlighting[a] && e.highlighting[a].end)) break; 
-               t = false;
-       } while (e = e.parentNode);
-       if (!b && e.highlighting && e.highlighting[a] && e.highlighting[a].end) s = e.highlighting[a].end;
-       if (s == undefined || s == '' || s == 'transparent') s = [255,255,255];
-       return jQuery.highlightFade.getRGB(s);
-};
-
-jQuery.highlightFade.checkColorName = function(c) {
-       if (!c) return null;
-       switch(c.replace(/^\s*|\s*$/g,'').toLowerCase()) {
-               case 'aqua': return [0,255,255];
-               case 'black': return [0,0,0];
-               case 'blue': return [0,0,255];
-               case 'fuchsia': return [255,0,255];
-               case 'gray': return [128,128,128];
-               case 'green': return [0,128,0];
-               case 'lime': return [0,255,0];
-               case 'maroon': return [128,0,0];
-               case 'navy': return [0,0,128];
-               case 'olive': return [128,128,0];
-               case 'purple': return [128,0,128];
-               case 'red': return [255,0,0];
-               case 'silver': return [192,192,192];
-               case 'teal': return [0,128,128];
-               case 'white': return [255,255,255];
-               case 'yellow': return [255,255,0];
-       }
-};
diff --git a/wolnelektury/media/js/jquery.jqmodal.js b/wolnelektury/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/wolnelektury/media/js/jquery.js b/wolnelektury/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/wolnelektury/media/js/jquery.labelify.js b/wolnelektury/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/wolnelektury/media/js/jquery.scrollto.js b/wolnelektury/media/js/jquery.scrollto.js
deleted file mode 100644 (file)
index 7f42489..0000000
+++ /dev/null
@@ -1,194 +0,0 @@
-/**\r
- * jQuery.ScrollTo\r
- * Copyright (c) 2007-2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com\r
- * Dual licensed under MIT and GPL.\r
- * Date: 9/11/2008\r
- *\r
- * @projectDescription Easy element scrolling using jQuery.\r
- * http://flesler.blogspot.com/2007/10/jqueryscrollto.html\r
- * Tested with jQuery 1.2.6. On FF 2/3, IE 6/7, Opera 9.2/5 and Safari 3. on Windows.\r
- *\r
- * @author Ariel Flesler\r
- * @version 1.4\r
- *\r
- * @id jQuery.scrollTo\r
- * @id jQuery.fn.scrollTo\r
- * @param {String, Number, DOMElement, jQuery, Object} target Where to scroll the matched elements.\r
- *       The different options for target are:\r
- *             - A number position (will be applied to all axes).\r
- *             - A string position ('44', '100px', '+=90', etc ) will be applied to all axes\r
- *             - A jQuery/DOM element ( logically, child of the element to scroll )\r
- *             - A string selector, that will be relative to the element to scroll ( 'li:eq(2)', etc )\r
- *             - A hash { top:x, left:y }, x and y can be any kind of number/string like above.\r
- * @param {Number} duration The OVERALL length of the animation, this argument can be the settings object instead.\r
- * @param {Object,Function} settings Optional set of settings or the onAfter callback.\r
- *      @option {String} axis Which axis must be scrolled, use 'x', 'y', 'xy' or 'yx'.\r
- *      @option {Number} duration The OVERALL length of the animation.\r
- *      @option {String} easing The easing method for the animation.\r
- *      @option {Boolean} margin If true, the margin of the target element will be deducted from the final position.\r
- *      @option {Object, Number} offset Add/deduct from the end position. One number for both axes or { top:x, left:y }.\r
- *      @option {Object, Number} over Add/deduct the height/width multiplied by 'over', can be { top:x, left:y } when using both axes.\r
- *      @option {Boolean} queue If true, and both axis are given, the 2nd axis will only be animated after the first one ends.\r
- *      @option {Function} onAfter Function to be called after the scrolling ends. \r
- *      @option {Function} onAfterFirst If queuing is activated, this function will be called after the first scrolling ends.\r
- * @return {jQuery} Returns the same jQuery object, for chaining.\r
- *\r
- * @desc Scroll to a fixed position\r
- * @example $('div').scrollTo( 340 );\r
- *\r
- * @desc Scroll relatively to the actual position\r
- * @example $('div').scrollTo( '+=340px', { axis:'y' } );\r
- *\r
- * @dec Scroll using a selector (relative to the scrolled element)\r
- * @example $('div').scrollTo( 'p.paragraph:eq(2)', 500, { easing:'swing', queue:true, axis:'xy' } );\r
- *\r
- * @ Scroll to a DOM element (same for jQuery object)\r
- * @example var second_child = document.getElementById('container').firstChild.nextSibling;\r
- *                     $('#container').scrollTo( second_child, { duration:500, axis:'x', onAfter:function(){\r
- *                             alert('scrolled!!');                                                                                                                               \r
- *                     }});\r
- *\r
- * @desc Scroll on both axes, to different values\r
- * @example $('div').scrollTo( { top: 300, left:'+=200' }, { axis:'xy', offset:-20 } );\r
- */\r
-;(function( $ ){\r
-       \r
-       var $scrollTo = $.scrollTo = function( target, duration, settings ){\r
-               $(window).scrollTo( target, duration, settings );\r
-       };\r
-\r
-       $scrollTo.defaults = {\r
-               axis:'y',\r
-               duration:1\r
-       };\r
-\r
-       // Returns the element that needs to be animated to scroll the window.\r
-       // Kept for backwards compatibility (specially for localScroll & serialScroll)\r
-       $scrollTo.window = function( scope ){\r
-               return $(window).scrollable();\r
-       };\r
-\r
-       // Hack, hack, hack... stay away!\r
-       // Returns the real elements to scroll (supports window/iframes, documents and regular nodes)\r
-       $.fn.scrollable = function(){\r
-               return this.map(function(){\r
-                       // Just store it, we might need it\r
-                       var win = this.parentWindow || this.defaultView,\r
-                               // If it's a document, get its iframe or the window if it's THE document\r
-                               elem = this.nodeName == '#document' ? win.frameElement || win : this,\r
-                               // Get the corresponding document\r
-                               doc = elem.contentDocument || (elem.contentWindow || elem).document,\r
-                               isWin = elem.setInterval;\r
-\r
-                       return elem.nodeName == 'IFRAME' || isWin && $.browser.safari ? doc.body\r
-                               : isWin ? doc.documentElement\r
-                               : this;\r
-               });\r
-       };\r
-\r
-       $.fn.scrollTo = function( target, duration, settings ){\r
-               if( typeof duration == 'object' ){\r
-                       settings = duration;\r
-                       duration = 0;\r
-               }\r
-               if( typeof settings == 'function' )\r
-                       settings = { onAfter:settings };\r
-                       \r
-               settings = $.extend( {}, $scrollTo.defaults, settings );\r
-               // Speed is still recognized for backwards compatibility\r
-               duration = duration || settings.speed || settings.duration;\r
-               // Make sure the settings are given right\r
-               settings.queue = settings.queue && settings.axis.length > 1;\r
-               \r
-               if( settings.queue )\r
-                       // Let's keep the overall duration\r
-                       duration /= 2;\r
-               settings.offset = both( settings.offset );\r
-               settings.over = both( settings.over );\r
-\r
-               return this.scrollable().each(function(){\r
-                       var elem = this,\r
-                               $elem = $(elem),\r
-                               targ = target, toff, attr = {},\r
-                               win = $elem.is('html,body');\r
-\r
-                       switch( typeof targ ){\r
-                               // A number will pass the regex\r
-                               case 'number':\r
-                               case 'string':\r
-                                       if( /^([+-]=)?\d+(px)?$/.test(targ) ){\r
-                                               targ = both( targ );\r
-                                               // We are done\r
-                                               break;\r
-                                       }\r
-                                       // Relative selector, no break!\r
-                                       targ = $(targ,this);\r
-                               case 'object':\r
-                                       // DOMElement / jQuery\r
-                                       if( targ.is || targ.style )\r
-                                               // Get the real position of the target \r
-                                               toff = (targ = $(targ)).offset();\r
-                       }\r
-                       $.each( settings.axis.split(''), function( i, axis ){\r
-                               var Pos = axis == 'x' ? 'Left' : 'Top',\r
-                                       pos = Pos.toLowerCase(),\r
-                                       key = 'scroll' + Pos,\r
-                                       old = elem[key],\r
-                                       Dim = axis == 'x' ? 'Width' : 'Height',\r
-                                       dim = Dim.toLowerCase();\r
-\r
-                               if( toff ){// jQuery / DOMElement\r
-                                       attr[key] = toff[pos] + ( win ? 0 : old - $elem.offset()[pos] );\r
-\r
-                                       // If it's a dom element, reduce the margin\r
-                                       if( settings.margin ){\r
-                                               attr[key] -= parseInt(targ.css('margin'+Pos)) || 0;\r
-                                               attr[key] -= parseInt(targ.css('border'+Pos+'Width')) || 0;\r
-                                       }\r
-                                       \r
-                                       attr[key] += settings.offset[pos] || 0;\r
-                                       \r
-                                       if( settings.over[pos] )\r
-                                               // Scroll to a fraction of its width/height\r
-                                               attr[key] += targ[dim]() * settings.over[pos];\r
-                               }else\r
-                                       attr[key] = targ[pos];\r
-\r
-                               // Number or 'number'\r
-                               if( /^\d+$/.test(attr[key]) )\r
-                                       // Check the limits\r
-                                       attr[key] = attr[key] <= 0 ? 0 : Math.min( attr[key], max(Dim) );\r
-\r
-                               // Queueing axes\r
-                               if( !i && settings.queue ){\r
-                                       // Don't waste time animating, if there's no need.\r
-                                       if( old != attr[key] )\r
-                                               // Intermediate animation\r
-                                               animate( settings.onAfterFirst );\r
-                                       // Don't animate this axis again in the next iteration.\r
-                                       delete attr[key];\r
-                               }\r
-                       });                     \r
-                       animate( settings.onAfter );                    \r
-\r
-                       function animate( callback ){\r
-                               $elem.animate( attr, duration, settings.easing, callback && function(){\r
-                                       callback.call(this, target, settings);\r
-                               });\r
-                       };\r
-                       function max( Dim ){\r
-                               var attr ='scroll'+Dim,\r
-                                       doc = elem.ownerDocument;\r
-                               \r
-                               return win\r
-                                               ? Math.max( doc.documentElement[attr], doc.body[attr]  )\r
-                                               : elem[attr];\r
-                       };\r
-               }).end();\r
-       };\r
-\r
-       function both( val ){\r
-               return typeof val == 'object' ? val : { top:val, left:val };\r
-       };\r
-\r
-})( jQuery );
\ No newline at end of file
diff --git a/wolnelektury/media/js/ordered_select_multiple.js b/wolnelektury/media/js/ordered_select_multiple.js
deleted file mode 100644 (file)
index e4fd74d..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-(function($) {
-  $.fn.orderedSelectMultiple = function(options) {
-    var settings = {
-      choices: []
-    };
-    $.extend(settings, options);
-    
-    var input = $(this).hide();
-    var values = input.val().split(',');
-    
-    var container = $('<div></div>').insertAfter($(this));
-    var choicesList = $('<ol class="choices connectedSortable"></ol>').appendTo(container).css({
-      width: 200, float: 'left', minHeight: 200, backgroundColor: '#eee', margin: 0, padding: 0
-    });
-    var valuesList = $('<ol class="values connectedSortable"></ol>').appendTo(container).css({
-      width: 200, float: 'left', minHeight: 200, backgroundColor: '#eee', margin: 0, padding: 0
-    });
-    var choiceIds = [];
-    $.each(settings.choices, function() {
-      choiceIds.push('' + this.id);
-    });
-    
-    function createItem(hash) {
-      return $('<li>' + hash.name + '</li>').css({
-        backgroundColor: '#cff',
-        display: 'block',
-        border: '1px solid #cdd',
-        padding: 2,
-        margin: 0
-      }).data('obj-id', hash.id);
-    }
-    
-    $.each(settings.choices, function() {
-      if ($.inArray('' + this.id, values) == -1) {
-        choicesList.append(createItem(this));
-      }
-    });
-    
-    $.each(values, function() {
-      var index = $.inArray('' + this, choiceIds); // Why this[0]?
-      if (index != -1) {
-        valuesList.append(createItem(settings.choices[index]));
-      }
-    });
-    
-    choicesList.sortable({
-               connectWith: '.connectedSortable'
-       }).disableSelection();
-       
-       valuesList.sortable({
-               connectWith: '.connectedSortable',
-               update: function() {
-                 values = [];
-                 $('li', valuesList).each(function(index) {
-          values.push($(this).data('obj-id'));
-          console.log($(this).data('obj-id'));
-                 });
-                 console.log('update', values.join(','), input);
-                 input.val(values.join(','));
-               }
-       }).disableSelection();
-  };
-})(jQuery);
diff --git a/wolnelektury/media/player.swf b/wolnelektury/media/player.swf
deleted file mode 100644 (file)
index b2fde33..0000000
Binary files a/wolnelektury/media/player.swf and /dev/null differ
diff --git a/wolnelektury/media/sponsors/css/footer_admin.css b/wolnelektury/media/sponsors/css/footer_admin.css
deleted file mode 100644 (file)
index ba56771..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-.sponsors {
-    display: block;
-    clear: both;
-    margin-top: 5px;
-}
-
-.sponsors .sponsors-sponsor-group {
-    float: left;
-    width: 200px;
-    border: 1px solid #CCC;
-    margin: 2px 2px 0 0;
-}
-
-.sponsors .sponsors-sponsor-group-name {
-    border-bottom: 1px solid #CCC;
-    padding: 2px 2px 2px 4px;
-    margin: 0;
-    color: #FFF;
-    background-color: #7CA0C7;
-    font-weight: bold;
-    height: 15px;
-}
-
-.sponsors .sponsors-sponsor-group-name input {
-    margin: -2px -2px -2px -4px;
-    padding: 0;
-    height: 15px;
-    width: 180px;
-}
-
-.sponsors .sponsors-remove-sponsor-group {
-    float: right;
-    background-color: #CC3434;
-    color: #FFF;
-    width: 10px;
-    height: 15px;
-    padding: 2px;
-    text-align: center;
-    font-weight: bold;
-    display: block;
-    cursor: default;
-}
-
-.sponsors .sponsors-remove-sponsor-group:hover {
-    color: #CC3434;
-    background-color: white;
-}
-
-.sponsors .sponsors-unused-sponsor-group-name {
-    background-color: #FFF;
-    color: #666;
-}
-
-.sponsors .sponsors-sponsor-group-list {
-    margin: 0;
-    padding: 2px;
-    list-style: none;
-    min-height: 200px;
-}
-
-.sponsors-sponsor {
-    margin: 0 0 2px 0;
-    padding: 2px;
-    border: 1px solid #CCC;
-    background-color: #EEE;
-    cursor: default;
-}
diff --git a/wolnelektury/media/sponsors/js/footer_admin.js b/wolnelektury/media/sponsors/js/footer_admin.js
deleted file mode 100644 (file)
index 2f2cd93..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-(function($) {
-  $.fn.sponsorsFooter = function(options) {
-    var settings = {
-      sponsors: []
-    };
-    $.extend(settings, options);
-    
-    var input = $(this).hide();
-    
-    var container = $('<div class="sponsors"></div>').appendTo(input.parent());
-    var groups = $.evalJSON(input.val());
-    
-    var unusedDiv = $('<div class="sponsors-sponsor-group sponsors-unused-sponsor-group"></div>')
-      .appendTo(container)
-      .append('<p class="sponsors-sponsor-group-name sponsors-unused-sponsor-group-name">dostępni sponsorzy</p>');
-    var unusedList = $('<ol class="sponsors-sponsor-group-list sponsors-unused-group-list"></ol>')
-        .appendTo(unusedDiv)
-        .sortable({
-          connectWith: '.sponsors-sponsor-group-list'
-               });
-    
-    // Edit group name inline
-    function editNameInline(name) {
-      name.unbind('click.sponsorsFooter');
-      var inlineInput = $('<input></input>').val(name.html());
-      name.html('');
-      
-      function endEditing() {
-        name.html(inlineInput.val());
-        inlineInput.remove();
-        name.bind('click.sponsorsFooter', function() {
-          editNameInline($(this));
-        });
-        input.parents('form').unbind('submit.sponsorsFooter', endEditing);
-        return false;
-      }
-      
-      inlineInput.appendTo(name).focus().blur(endEditing);
-      input.parents('form').bind('submit.sponsorsFooter', endEditing);
-    }
-    
-    // Remove sponsor with passed id from sponsors array and return it
-    function popSponsor(id) {
-      for (var i=0; i < settings.sponsors.length; i++) {
-        if (settings.sponsors[i].id == id) {
-          var s = settings.sponsors[i];
-          settings.sponsors.splice(i, 1);
-          return s;
-        }
-      }
-      return null;
-    }
-    
-    // Create sponsor group and bind events
-    function createGroup(name, sponsors) {
-      if (!sponsors) {
-        sponsors = [];
-      }
-      
-      var groupDiv = $('<div class="sponsors-sponsor-group"></div>');
-      
-      $('<a class="sponsors-remove-sponsor-group">X</a>')
-        .click(function() {
-          groupDiv.fadeOut('slow', function() {
-            $('.sponsors-sponsor', groupDiv).hide().appendTo(unusedList).fadeIn();
-            groupDiv.remove();
-          });
-        }).appendTo(groupDiv);
-      
-      $('<p class="sponsors-sponsor-group-name">' + name + '</p>')
-        .bind('click.sponsorsFooter', function() {
-          editNameInline($(this));
-        }).appendTo(groupDiv);
-      
-      var groupList = $('<ol class="sponsors-sponsor-group-list"></ol>')
-        .appendTo(groupDiv)
-        .sortable({
-          connectWith: '.sponsors-sponsor-group-list'
-               });
-      
-      
-      for (var i = 0; i < sponsors.length; i++) {
-        $('<li class="sponsors-sponsor">' + sponsors[i].name + '</li>')
-          .data('obj_id', sponsors[i].id)
-          .appendTo(groupList);
-      }
-      return groupDiv;
-    }
-    
-    // Create groups from data in input value
-    for (var i = 0; i < groups.length; i++) {
-      var group = groups[i];
-      var sponsors = [];
-      
-      for (var j = 0; j < group.sponsors.length; j++) {
-        var s = popSponsor(group.sponsors[j]);
-        if (s) {
-          sponsors.push(s);
-        }
-      }
-      createGroup(group.name, sponsors).appendTo(container);
-    }
-    
-    // Serialize input value before submiting form
-    input.parents('form').submit(function(event) {
-      var groups = [];
-      $('.sponsors-sponsor-group', container).not('.sponsors-unused-sponsor-group').each(function() {
-        var group = {name: $('.sponsors-sponsor-group-name', this).html(), sponsors: []};
-        $('.sponsors-sponsor', this).each(function() {
-          group.sponsors.push($(this).data('obj_id'));
-        });
-        groups.push(group);
-      });
-      input.val($.toJSON(groups));
-    });
-    
-    for (i = 0; i < settings.sponsors.length; i++) {
-      $('<li class="sponsors-sponsor">' + settings.sponsors[i].name + '</li>')
-        .data('obj_id', settings.sponsors[i].id)
-        .appendTo(unusedList);
-    }
-    
-    $('<button type="button">Dodaj nową grupę</button>')
-      .click(function() {
-        var newGroup = createGroup('').appendTo(container);
-        editNameInline($('.sponsors-sponsor-group-name', newGroup));
-      }).prependTo(input.parent());
-    
-    input.parent().append('<div style="clear: both"></div>');
-  };
-})(jQuery);
diff --git a/wolnelektury/media/sponsors/js/jquery.json.min.js b/wolnelektury/media/sponsors/js/jquery.json.min.js
deleted file mode 100644 (file)
index bad4a0a..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-
-(function($){$.toJSON=function(o)
-{if(typeof(JSON)=='object'&&JSON.stringify)
-return JSON.stringify(o);var type=typeof(o);if(o===null)
-return"null";if(type=="undefined")
-return undefined;if(type=="number"||type=="boolean")
-return o+"";if(type=="string")
-return $.quoteString(o);if(type=='object')
-{if(typeof o.toJSON=="function")
-return $.toJSON(o.toJSON());if(o.constructor===Date)
-{var month=o.getUTCMonth()+1;if(month<10)month='0'+month;var day=o.getUTCDate();if(day<10)day='0'+day;var year=o.getUTCFullYear();var hours=o.getUTCHours();if(hours<10)hours='0'+hours;var minutes=o.getUTCMinutes();if(minutes<10)minutes='0'+minutes;var seconds=o.getUTCSeconds();if(seconds<10)seconds='0'+seconds;var milli=o.getUTCMilliseconds();if(milli<100)milli='0'+milli;if(milli<10)milli='0'+milli;return'"'+year+'-'+month+'-'+day+'T'+
-hours+':'+minutes+':'+seconds+'.'+milli+'Z"';}
-if(o.constructor===Array)
-{var ret=[];for(var i=0;i<o.length;i++)
-ret.push($.toJSON(o[i])||"null");return"["+ret.join(",")+"]";}
-var pairs=[];for(var k in o){var name;var type=typeof k;if(type=="number")
-name='"'+k+'"';else if(type=="string")
-name=$.quoteString(k);else
-continue;if(typeof o[k]=="function")
-continue;var val=$.toJSON(o[k]);pairs.push(name+":"+val);}
-return"{"+pairs.join(", ")+"}";}};$.evalJSON=function(src)
-{if(typeof(JSON)=='object'&&JSON.parse)
-return JSON.parse(src);return eval("("+src+")");};$.secureEvalJSON=function(src)
-{if(typeof(JSON)=='object'&&JSON.parse)
-return JSON.parse(src);var filtered=src;filtered=filtered.replace(/\\["\\\/bfnrtu]/g,'@');filtered=filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']');filtered=filtered.replace(/(?:^|:|,)(?:\s*\[)+/g,'');if(/^[\],:{}\s]*$/.test(filtered))
-return eval("("+src+")");else
-throw new SyntaxError("Error parsing JSON, source is not valid.");};$.quoteString=function(string)
-{if(string.match(_escapeable))
-{return'"'+string.replace(_escapeable,function(a)
-{var c=_meta[a];if(typeof c==='string')return c;c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+(c%16).toString(16);})+'"';}
-return'"'+string+'"';};var _escapeable=/["\\\x00-\x1f\x7f-\x9f]/g;var _meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};})(jQuery);
\ No newline at end of file
index 9e9f6a5..722cd93 100644 (file)
@@ -38,12 +38,14 @@ USE_I18N = True
 
 # Absolute path to the directory that holds media.
 # Example: "/home/media/media.lawrence.com/"
 
 # Absolute path to the directory that holds media.
 # Example: "/home/media/media.lawrence.com/"
-MEDIA_ROOT = path.join(PROJECT_DIR, 'media')
+MEDIA_ROOT = path.join(PROJECT_DIR, '../media')
+STATIC_ROOT = path.join(PROJECT_DIR, 'static')
 
 # 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 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/'
+STATIC_URL = '/static/'
 
 # URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
 # trailing slash.
 
 # URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
 # trailing slash.
diff --git a/wolnelektury/static/css/error.css b/wolnelektury/static/css/error.css
new file mode 100644 (file)
index 0000000..8315734
--- /dev/null
@@ -0,0 +1,83 @@
+
+body {
+font-family: verdana, arial, sans-serif; 
+margin: 2em;
+font-size: 100%;
+}
+
+
+
+
+h1 {
+font-size: 300%;
+font-weight: bold;
+margin-top: 30px;
+}
+
+h1,h2 {
+margin-bottom: 0;
+}
+
+h2 {
+font-size: 100%;
+font-weight: bold; 
+margin-top: 1em;
+}
+
+p {
+width: 450px;
+margin-top: 0.5em;
+}
+
+img {
+       border: none;
+}
+       
+       #whoiam {
+       text-transform: uppercase;
+       letter-spacing: 0.2em;
+       font-size: 150%;
+       margin-bottom: 0.8em;
+}
+
+.howto {
+
+       color: gray;
+       font-size: 80%
+}
+
+#contact h2 {
+margin-top: 0.5em;
+}
+
+
+.haj {
+       background-color: #ffc;
+}
+
+#urle {
+margin-top: 2.3em;
+}
+
+/*
+LINKS
+*/
+
+a:link {
+color: #037;
+text-decoration: underline; 
+}
+
+a:visited {
+color: #636;
+}
+
+a:active {
+color: #900;
+text-decoration: none;
+}
+
+a:hover {
+color: #d46400;
+}
+
diff --git a/wolnelektury/static/css/jquery.autocomplete.css b/wolnelektury/static/css/jquery.autocomplete.css
new file mode 100644 (file)
index 0000000..434de13
--- /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(/static/img/indicator.gif) right center no-repeat;
+}
+
+.ac_odd {
+       background-color: #EEE;
+}
+
+.ac_over {
+       background-color: #0A246A;
+       color: #FFF;
+}
diff --git a/wolnelektury/static/css/master.book.css b/wolnelektury/static/css/master.book.css
new file mode 100644 (file)
index 0000000..b0d3542
--- /dev/null
@@ -0,0 +1,319 @@
+body {
+    font-size: 16px;
+    font: Georgia, "Times New Roman", serif;
+    line-height: 1.5em;
+    margin: 0;
+}
+
+a {
+    color: blue;
+    text-decoration: none;
+}
+
+#book-text {
+    margin: 3em;
+    max-width: 36em;
+}
+
+/* ================================== */
+/* = Header with logo and menu      = */
+/* ================================== */
+#header {
+    margin: 3.4em 0 0 1.4em;
+}
+
+img {
+    border: none;
+}
+
+
+#menu {
+    position: fixed;
+    left: 0em;
+    top: 0em;
+    width: 100%;
+    height: 1.5em;
+    background: #333;
+    color: #FFF;
+    opacity: 0.9;
+}
+
+#menu ul {
+    list-style: none;
+    padding: 0;
+    margin: 0;
+}
+
+#menu li a {
+    display: block;
+    float: left;
+    width: 7.5em;
+    height: 1.5em;
+    margin-left: 0.5em;
+    text-align: center;
+    color: #FFF;
+}
+
+#menu li a:hover, #menu li a:active {
+    color: #000;
+    background: #FFF url(/static/img/arrow-down.png) no-repeat center right;
+}
+
+#menu li a.selected {
+    color: #000;
+    background: #FFF url(/static/img/arrow-up.png) no-repeat center right;
+}
+
+#toc, #themes {
+    position: fixed;
+    left: 0em;
+    top: 1.5em;
+    width: 37em;
+    padding: 1.5em;
+    background: #FFF;
+    border-bottom: 0.25em solid #DDD;
+    border-right: 0.25em solid #DDD;
+    display: none;
+    height: 16em;
+    overflow-x: hidden;
+    overflow-y: auto;
+    opacity: 0.9;
+}
+
+#toc ol, #themes ol {
+    list-style: none;
+    padding: 0;
+    margin: 0;
+}
+
+#toc ol li {
+    font-weight: bold;
+}
+
+#toc ol ol {
+    padding: 0 0 1.5em 1.5em;
+    margin: 0;
+}
+
+#toc ol ol li {
+    font-weight: normal;
+}
+
+#toc h2 {
+    display: none;
+}
+
+#toc .anchor {
+    float: none;
+    margin: 0;
+    color: blue;
+    font-size: 16px;
+    position: inherit;
+}
+
+/* =================================================== */
+/* = Common elements: headings, paragraphs and lines = */
+/* =================================================== */
+h1 {
+    font-size: 3em;
+    margin: 1.5em 0;
+    text-align: center;
+    line-height: 1.5em;
+    font-weight: bold;
+}
+
+h2 {
+    font-size: 2em;
+    margin: 1.5em 0 0;
+    font-weight: bold;
+    line-height: 1.5em;
+}
+
+h3 {
+    font-size: 1.5em;
+    margin: 1.5em 0 0;
+    font-weight: normal;
+    line-height: 1.5em;
+}
+
+h4 {
+    font-size: 1em;
+    margin: 1.5em 0 0;
+    line-height: 1.5em;
+}
+
+p {
+    margin: 0;
+}
+
+/* ======================== */
+/* = Footnotes and themes = */
+/* ======================== */
+.theme-begin {
+    border-left: 0.1em solid #DDDDDD;
+    color: #777;
+    padding: 0 0.5em;
+    width: 7.5em;
+    font-style: normal;
+    font-weight: normal;
+    font-size: 16px;
+    float: right;
+    margin-right: -9.5em;
+    clear: both;
+    left: 40em;
+    line-height: 1.5em;
+    text-align: left;
+}
+
+.annotation {
+    font-style: normal;
+    font-weight: normal;
+    font-size: 12px;
+}
+
+#footnotes .annotation {
+    display: block;
+    float: left;
+    width: 2.5em;
+    clear: both;
+}
+
+#footnotes div {
+    margin: 1.5em 0 0 0;
+}
+
+#footnotes p {
+    margin-left: 2.5em;
+    font-size: 0.875em;
+}
+
+blockquote {
+    font-size: 0.875em;
+}
+
+/* ============= */
+/* = Numbering = */
+/* ============= */
+.anchor {
+    position: absolute;
+    margin: -0.25em -0.5em;
+    left: 1em;
+    color: #777;
+    font-size: 12px;
+    width: 2em;
+    text-align: center;
+    padding: 0.25em 0.5em;
+    line-height: 1.5em;
+}
+
+.anchor:hover, #book-text .anchor:active {
+    color: #FFF;
+    background-color: #CCC;
+}
+
+/* =================== */
+/* = Custom elements = */
+/* =================== */
+span.author {
+    font-size: 0.5em;
+    display: block;
+    line-height: 1.5em;
+    margin-bottom: 0.25em;
+}
+
+span.collection {
+    font-size: 0.375em;
+    display: block;
+    line-height: 1.5em;
+    margin-bottom: -0.25em;
+}
+
+span.subtitle {
+    font-size: 0.5em;
+    display: block;
+    line-height: 1.5em;
+    margin-top: -0.25em;
+}
+
+div.didaskalia {
+    font-style: italic;
+    margin: 0.5em 0 0 1.5em;
+}
+
+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;
+    text-align: right;
+}
+
+div.fragment {
+    border-bottom: 0.1em solid #999;
+    padding-bottom: 1.5em;
+}
+
+div.note p, div.dedication p, div.note p.paragraph, div.dedication p.paragraph {
+    text-align: right;
+    font-style: italic;
+}
+
+hr.spacer {
+    height: 3em;
+    visibility: hidden;
+}
+
+hr.spacer-line {
+    margin: 1.5em 0;
+    border: none;
+    border-bottom: 0.1em solid #000;
+}
+
+p.spacer-asterisk {
+    padding: 0;
+    margin: 1.5em 0;
+    text-align: center;
+}
+
+div.person-list ol {
+    list-style: none;
+    padding: 0 0 0 1.5em;
+}
+
+p.place-and-time {
+    font-style: italic;
+}
+
+em.math, em.foreign-word, em.book-title, em.didaskalia {
+    font-style: italic;
+}
+
+em.author-emphasis {
+    letter-spacing: 0.1em;
+}
+
+em.person {
+    font-style: normal;
+    font-variant: small-caps;
+}
+
diff --git a/wolnelektury/static/css/master.css b/wolnelektury/static/css/master.css
new file mode 100644 (file)
index 0000000..d7d741a
--- /dev/null
@@ -0,0 +1,658 @@
+body {
+    margin: 0 2em 2em 2em;
+    font: 70% Verdana, Arial, Helvetica, sans-serif;
+    line-height: 1.5em;
+    background: #FFF url(/static/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: 1em;
+    font-weight: bold;
+    margin: 0.2em 0 -1em 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: #777;
+    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: block;
+    float: left;
+}
+
+#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;
+    margin-right: 0.25em;
+}
+
+#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;
+}
+
+.ac_input {
+    width: 18em;
+}
+
+p .ac_input {
+    width: 28em;
+}
+
+
+/* ============= */
+/* = Tags list = */
+/* ============= */
+#intro {
+    margin: 0 0 2.5em 0;
+}
+
+#tags-description {
+    color: #777;
+    margin: 0 0.5em -0.75em 0.5em;
+}
+
+#main-page #tags-list {
+    margin-right: 33%;
+}
+
+#categories-list ul, #themes-list ul {
+    -moz-column-width: 12em;
+    -webkit-column-width: 12em;
+    column-width: 12em;
+}
+
+#tags-list {
+    margin-top: 1em;
+    padding: 1em;
+    background-color: #FBF9E7;
+    -moz-border-radius: 4px;
+    -webkit-border-radius: 4px;
+    border-radius: 4px;
+    border-bottom: 0.15em solid #E3D888;
+    border-right: 0.15em solid #E3D888;
+}
+
+#tagged-object-list #tags-list, #book-detail #tags-list {
+    margin-left: 39em;
+}
+
+#book-info, #categories-list {
+    float: left;
+    width: 47.5%;
+}
+
+#themes-list {
+    margin-left: 52.5%;
+}
+
+#tagged-object-list #categories-list, #book-detail #book-info {
+    width: 12em;
+}
+
+#book-detail #formats .change-sets {
+    margin-right: 0.5em;
+}
+
+#formats .wrap a {
+    display: block;
+    width: 100%;
+    height: 1.5em;
+    background-color: #EEE;
+    margin-top: 0.5em;
+    padding: 0.5em 0;
+    -moz-border-radius: 4px;
+    -webkit-border-radius: 4px;
+    border-radius: 4px;
+    text-align: center;    
+}
+
+#czytamysluchajac {
+    margin-top: 2.5em;
+}
+
+#czytamy-sluchajac-info {
+    width: 400px;
+    height: 80px;
+}
+
+#czytamy-sluchajac-info p {
+    margin-left: 170px;
+    padding-top: 1em;
+    padding-bottom: 0em;
+}
+
+#formats #czytamysluchajac-logo {
+    background: white;
+    text-align: left;
+    float: left;
+    width: 140px;
+    height: 62px;
+    -moz-border-radius: 0px;
+    -webkit-border-radius: 0px;
+    border-radius: 0px;
+}
+
+#tagged-object-list #themes-list, #book-detail #themes-list {
+    margin-left: 14em;
+}
+
+#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;
+}
+
+#books-list {
+    width: 38em;
+    float: left;
+}
+
+.all-tags {
+    display: none;
+}
+
+div.shown-tags p, div.all-tags p {
+    margin: -1em 0 1em 0;
+    text-align: right;
+}
+
+.show-all-tags, .hide-all-tags {
+    text-decoration: underline;
+    padding-right: 1em;
+}
+
+.subcategories {
+    display: block;
+    padding-left: 2em;
+    padding-bottom: 0.5em;
+}
+
+
+/* ============== */
+/* = Propaganda = */
+/* ============== */
+#propaganda {
+    float: right;
+    width: 30%;
+    margin: 0;
+    padding: 2em 0.5em 0.5em;
+}
+
+
+/* ===================== */
+/* = Other info        = */
+/* ===================== */
+#latest-blog-posts {
+    padding: 0.5em;
+    float: left;
+    width: 30%;
+}
+
+#latest-blog-posts ol {
+    padding: 0 0 0 1.5em;
+    margin: 1em 0 0 0;
+    list-style-type: square;
+    color: #D13628;
+}
+
+#you-can-help {
+    float: right;
+    padding: 0.5em;
+    width: 30%;
+}
+
+#about-us {
+    padding: 0.5em;
+    margin-left: 35%;
+    margin-right: 35%;
+}
+
+/* =============== */
+/* = Description = */
+/* =============== */
+#description {
+    margin-top: 0.5em;
+    text-align: justify;
+}
+
+#description .meta {
+    margin: 0.5em;
+    width: 18em;
+    list-style: none;
+    float: right;
+}
+
+#description dt {
+    font-weight: bold;
+    display: inline;
+}
+
+#description dd {
+    margin: 0;
+    display: inline;
+}
+
+#toggle-description, #tagged-object-list .pagination, #book-detail .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;
+}
+
+#download-shelf {
+    display: block;
+    width: 100%;
+    height: 1.5em;
+    background-color: #EEE;
+    margin-top: 0.5em;
+    padding: 0.5em 0;
+    -moz-border-radius: 4px;
+    -webkit-border-radius: 4px;
+    border-radius: 4px;
+    text-align: center;    
+}
+
+/* ============================ */
+/* = 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;
+}
+
+.change-sets a {
+    padding: 0.2em;
+    margin: 0.3em;
+    border: 0.1em solid #EEE;
+    background-color: #F9F9F9;
+}
+
+.book-description {
+    margin-left: 3.5em;
+}
+
+.book-thumbnail, .book-parent-thumbnail {
+    background: transparent url(/static/img/book.png) no-repeat 0 0;
+    width: 3em;
+    height: 3em;
+    float: left;
+}
+
+.book-parent-thumbnail {
+    background: transparent url(/static/img/book-parent.png) no-repeat 0 0;
+}
+
+
+/* =============== */
+/* = 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;
+}
+
+.shelf-list {
+    list-style: none;
+    padding: 0;
+}
+
+.shelf-list li {
+    padding: 0.25em;
+    margin: 0 -0.25em;
+}
+
+.shelf-list a.delete-shelf {
+    color: #900;
+    float: right;
+    padding: 0.25em 0.25em 0.25em 1em;
+    margin: -0.25em;
+}
+
+.shelf-list a.delete-shelf:active, .shelf-list a.delete-shelf:hover {
+    color: #FFF;
+    background-color: #900;
+    text-decoration: none;
+}
+
+/* ======================== */
+/* = Alphabetic book list = */
+/* ======================== */
+#book-a-list #book-list {
+    -moz-column-width: 24em;
+    -webkit-column-width: 24em;
+    column-width: 24em;
+}
+
+#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 2.5em;
+    line-height: 2em;
+}
+
+#top-message a {
+    color: #AAA;
+}
+
+
+/* =========== */
+/* = Columns = */
+/* =========== */
+.column-left {
+    width: 37em;
+    float: left;
+    text-align: justify;
+    margin-top: 1em;
+}
+
+.column-right {
+    margin-left: 40em;
+    text-align: justify;
+    margin-top: 1em;
+}
+
+.see-more {
+    text-align: right;
+}
+
+.remove-from-shelf {
+    float: right;
+    padding: 0.2em;
+    margin: 0.3em;
+    color: #900;
+}
+
+.remove-from-shelf:active, .remove-from-shelf:hover {
+    color: #FFF;
+    background-color: #900;
+    text-decoration: none;
+}
\ No newline at end of file
diff --git a/wolnelektury/static/css/master.plain.css b/wolnelektury/static/css/master.plain.css
new file mode 100644 (file)
index 0000000..62888a4
--- /dev/null
@@ -0,0 +1,125 @@
+/* =================================================== */
+/* = 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;
+}
+
+
+/* ============= */
+/* = Numbering = */
+/* ============= */
+.anchor {
+    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/static/css/sponsors.css b/wolnelektury/static/css/sponsors.css
new file mode 100644 (file)
index 0000000..810e1ff
--- /dev/null
@@ -0,0 +1,8 @@
+.sponsors-sponsor-group {
+    float: left;
+    overflow: hidden;
+}
+
+.sponsors-sponsor-logo {
+    float: left;
+}
\ No newline at end of file
diff --git a/wolnelektury/static/img/arrow-down.png b/wolnelektury/static/img/arrow-down.png
new file mode 100644 (file)
index 0000000..0e32315
Binary files /dev/null and b/wolnelektury/static/img/arrow-down.png differ
diff --git a/wolnelektury/static/img/arrow-up.png b/wolnelektury/static/img/arrow-up.png
new file mode 100644 (file)
index 0000000..cdf9cf6
Binary files /dev/null and b/wolnelektury/static/img/arrow-up.png differ
diff --git a/wolnelektury/static/img/bg.png b/wolnelektury/static/img/bg.png
new file mode 100644 (file)
index 0000000..be7d63a
Binary files /dev/null and b/wolnelektury/static/img/bg.png differ
diff --git a/wolnelektury/static/img/book-parent.png b/wolnelektury/static/img/book-parent.png
new file mode 100644 (file)
index 0000000..5668598
Binary files /dev/null and b/wolnelektury/static/img/book-parent.png differ
diff --git a/wolnelektury/static/img/book.png b/wolnelektury/static/img/book.png
new file mode 100644 (file)
index 0000000..f264839
Binary files /dev/null and b/wolnelektury/static/img/book.png differ
diff --git a/wolnelektury/static/img/czytamysluchajac-logo-small.png b/wolnelektury/static/img/czytamysluchajac-logo-small.png
new file mode 100644 (file)
index 0000000..9c635aa
Binary files /dev/null and b/wolnelektury/static/img/czytamysluchajac-logo-small.png differ
diff --git a/wolnelektury/static/img/favicon.png b/wolnelektury/static/img/favicon.png
new file mode 100644 (file)
index 0000000..6cffce8
Binary files /dev/null and b/wolnelektury/static/img/favicon.png differ
diff --git a/wolnelektury/static/img/footer.png b/wolnelektury/static/img/footer.png
new file mode 100644 (file)
index 0000000..0f8c650
Binary files /dev/null and b/wolnelektury/static/img/footer.png differ
diff --git a/wolnelektury/static/img/indicator.gif b/wolnelektury/static/img/indicator.gif
new file mode 100644 (file)
index 0000000..085ccae
Binary files /dev/null and b/wolnelektury/static/img/indicator.gif differ
diff --git a/wolnelektury/static/img/logo.png b/wolnelektury/static/img/logo.png
new file mode 100644 (file)
index 0000000..398f45d
Binary files /dev/null and b/wolnelektury/static/img/logo.png differ
diff --git a/wolnelektury/static/img/wolontariat/01.jpg b/wolnelektury/static/img/wolontariat/01.jpg
new file mode 100644 (file)
index 0000000..84fcc73
Binary files /dev/null and b/wolnelektury/static/img/wolontariat/01.jpg differ
diff --git a/wolnelektury/static/img/wolontariat/02.jpg b/wolnelektury/static/img/wolontariat/02.jpg
new file mode 100644 (file)
index 0000000..2fc90ef
Binary files /dev/null and b/wolnelektury/static/img/wolontariat/02.jpg differ
diff --git a/wolnelektury/static/img/wolontariat/03.jpg b/wolnelektury/static/img/wolontariat/03.jpg
new file mode 100644 (file)
index 0000000..f6e719a
Binary files /dev/null and b/wolnelektury/static/img/wolontariat/03.jpg differ
diff --git a/wolnelektury/static/img/wolontariat/04.jpg b/wolnelektury/static/img/wolontariat/04.jpg
new file mode 100644 (file)
index 0000000..fbf0f15
Binary files /dev/null and b/wolnelektury/static/img/wolontariat/04.jpg differ
diff --git a/wolnelektury/static/img/wolontariat/okladka.jpg b/wolnelektury/static/img/wolontariat/okladka.jpg
new file mode 100644 (file)
index 0000000..aec1fc4
Binary files /dev/null and b/wolnelektury/static/img/wolontariat/okladka.jpg differ
diff --git a/wolnelektury/static/infobar/infobar.css b/wolnelektury/static/infobar/infobar.css
new file mode 100644 (file)
index 0000000..fbab951
--- /dev/null
@@ -0,0 +1,4 @@
+/*Based on No IE Information Bar 0.2.6 by Martin Ng <http://minghong.webhop.org>, modified by Kornel Lesinski. Under license:http://creativecommons.org/licenses/by-nc/2.0/legalcode*/
+@media screen{#viewplot{
+padding:0; /* << Tutaj ustaw margines jak dla <body> */
+width:100%;height:95%;overflow:auto;height:expression(this.parentNode.offsetHeight-this.offsetTop);position:relative}html{border-top:0;border-left:0;border-bottom:0;overflow:hidden;height:100%}body{margin:0;padding:0;overflow:hidden;height:100%}#infobar{width:100%;font:normal 8pt/1 "MS Sans Serif"}#infobar a{display:block;font:message-box;zoom:1;color:InfoText;background:InfoBackground url(infobar.gif) no-repeat fixed .33em .2em;padding:.45em .3em .45em 2.3em;border-bottom:.16em outset;text-align:left;text-decoration:none;cursor:default}#infobar a{font-size:8pt;letter-spacing:0}#infobar a:hover{color:HighlightText;background-color:Highlight}}#infobar b{position:absolute;right:5px;top:3px;font-size:11px;font-family:webdings;cursor:hand}@media print{#infobar{display:none}}
\ No newline at end of file
diff --git a/wolnelektury/static/infobar/infobar.gif b/wolnelektury/static/infobar/infobar.gif
new file mode 100644 (file)
index 0000000..12b7474
Binary files /dev/null and b/wolnelektury/static/infobar/infobar.gif differ
diff --git a/wolnelektury/static/infobar/infobar.js b/wolnelektury/static/infobar/infobar.js
new file mode 100644 (file)
index 0000000..b2e75ca
--- /dev/null
@@ -0,0 +1,2 @@
+/*Based on No IE Information Bar 0.2.9 by Martin Ng <http://minghong.webhop.org>, Ching Yonghan, modified by Kornel Lesinski. Under license: http://creativecommons.org/licenses/by-nc/2.0/legalcode*/
+(function(){if (!infobar||!viewplot)return;if(Math.random()*10>(infobar.s||10) || document.cookie.indexOf('browsehappyinfobar=0')>=0){infobar.style.display='none';return}infobar.innerHTML='<b onclick="infobar.style.display=\'none\';viewplot.height=\'100%\';document.cookie=\'browsehappyinfobar=0; path=/\'">r</b>'+infobar.innerHTML;infobar.onclick=function(){infobar.all.tags("a")[0].innerHTML='Trwa otwieranie strony informacyjnej...'};if (!infobar.offsetHeight) return;var I=infobar.runtimeStyle,V=viewplot.runtimeStyle;I.top=infobar.offsetHeight*-1;I.left=V.top=V.left=0;V.position=I.position="absolute";var T=setInterval(function(){var N=parseInt(infobar.currentStyle.top),M=-N;if(M>0){M=M>5?5:M;I.top=N+M;V.top=parseInt(V.top)+M}else{clearInterval(T);I.position=V.position="";V.top='0'}},40)})()
diff --git a/wolnelektury/static/js/book.js b/wolnelektury/static/js/book.js
new file mode 100644 (file)
index 0000000..41e3be2
--- /dev/null
@@ -0,0 +1,36 @@
+$(function() {    
+    function scrollToAnchor(anchor) {
+        if (anchor) {
+            var element = $('a[name="' + anchor.slice(1) + '"]');
+            if (element.length > 0) {
+                $.scrollTo(element, 500, {offset: {top: -50, left: 0}});
+                $(element).highlightFade('yellow');
+                window.location.hash = anchor;
+            }
+        }
+    }
+    
+    $.highlightFade.defaults.speed = 3000;
+    $('#toc').hide();
+    if ($('#toc li').length == 0) {
+        $('#menu li a[href="#toc"]').remove();
+    }
+    
+    // On page load, scroll to anchor
+    scrollToAnchor(window.location.hash)
+    
+    $('#toc, #themes, #book-text').delegate('click', 'a', function(event) {
+        event.preventDefault();
+        $('#menu li a.selected').click();
+        scrollToAnchor($(this).attr('href'));
+    });
+    
+    $('#menu li a').toggle(function() {
+        $('#menu li a.selected').click();
+        $(this).addClass('selected');
+        $($(this).attr('href')).slideDown('fast');
+    }, function() {
+        $(this).removeClass('selected');
+        $($(this).attr('href')).slideUp('fast');
+    });
+});
diff --git a/wolnelektury/static/js/catalogue.js b/wolnelektury/static/js/catalogue.js
new file mode 100644 (file)
index 0000000..60f1f49
--- /dev/null
@@ -0,0 +1,214 @@
+(function($) {
+    $(function() {
+        $('form input').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'}); }
+        );
+        
+        $('.show-all-tags').click(function() {
+            $(this).parent().parent().fadeOut(function() { 
+                $(this).next().fadeIn();
+            });
+            return false;
+        });
+        
+        $('.hide-all-tags').click(function() {
+           $(this).parent().parent().fadeOut(function() {
+               $(this).prev().fadeIn();
+           });
+           return false; 
+        });
+        
+        $('#registration-form').ajaxForm({
+            dataType: 'json',
+            beforeSubmit: function() {
+                $('#registration-form input[type=submit]')
+                    .attr('disabled', 'disabled')
+                    .after('<img src="/static/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="/static/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();
+            }
+        });
+        
+        $('ul.shelf-list li').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() { 
+            var link = $(this);
+            var shelf_name = $('.visit-shelf', link.parent()).text();
+            if (confirm('Czy na pewno usunąć półkę ' + shelf_name + '?')) {
+                $.post(link.attr('href'), function(data, textStatus) {
+                    link.parent().remove();
+                });
+            }
+            return false;
+        });
+        
+        $('#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) { 
+                $('form', hash.w).ajaxForm({
+                    target: $('#user-shelves-window div.target'),
+                    success: function() { setTimeout(function() { $('#user-shelves-window').jqmHide() }, 1000) }
+                });
+                
+                $('input', hash.w).labelify({labelledClass: 'blur'});
+                
+                $('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() {
+                    var link = $(this);
+                    var shelf_name = $('.visit-shelf', link.parent()).text();
+                    if (confirm('Czy na pewno usunąć półkę ' + shelf_name + '?')) {
+                        $.post(link.attr('href'), function(data, textStatus) {
+                            link.parent().remove();
+                        });
+                    }
+                    return false;
+                });
+            }
+        });
+    
+        $('#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="/static/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) }
+                });
+            }
+        });
+        
+        $('a.remove-from-shelf').click(function(event) {
+            event.preventDefault();
+            link = $(this);
+            $.post(link.attr('href'), function(data, textStatus) {
+                link.parent().remove();
+            });
+        });
+        
+        $('#user-info').show();
+    });
+})(jQuery)
\ No newline at end of file
diff --git a/wolnelektury/static/js/jquery.autocomplete.js b/wolnelektury/static/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/static/js/jquery.eventdelegation.js b/wolnelektury/static/js/jquery.eventdelegation.js
new file mode 100644 (file)
index 0000000..5ecba6e
--- /dev/null
@@ -0,0 +1,55 @@
+/* 
+ * jQuery Event Delegation Plugin - jquery.eventdelegation.js
+ * Fast flexible event handling
+ *
+ * January 2008 - Randy Morey (http://dev.distilldesign.com/)
+ */
+
+(function ($) {
+       /* setup list of allowed events for event delegation
+        * only events that bubble are appropriate
+        */
+       var allowed = {};
+       $.each([
+               'click',
+               'dblclick',
+               'mousedown',
+               'mouseup',
+               'mousemove',
+               'mouseover',
+               'mouseout',
+               'keydown',
+               'keypress',
+               'keyup'
+               ], function(i, eventName) {     
+                       allowed[eventName] = true;
+       });
+       
+       $.fn.extend({
+               delegate: function (event, selector, f) {
+                       return $(this).each(function () {
+                               if (allowed[event])
+                                       $(this).bind(event, function (e) {
+                                               var el = $(e.target),
+                                                       result = false;
+                                               
+                                               while (!$(el).is('body')) {
+                                                       if ($(el).is(selector)) {
+                                                               result = f.apply($(el)[0], [e]);
+                                                               if (result === false)
+                                                                       e.preventDefault();
+                                                               return;
+                                                       }
+                                                       
+                                                       el = $(el).parent();
+                                               }
+                                       });
+                       });
+               },
+               undelegate: function (event) {
+                       return $(this).each(function () {
+                               $(this).unbind(event);
+                       });
+               }
+       });
+})(jQuery);
\ No newline at end of file
diff --git a/wolnelektury/static/js/jquery.form.js b/wolnelektury/static/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/static/js/jquery.highlightfade.js b/wolnelektury/static/js/jquery.highlightfade.js
new file mode 100644 (file)
index 0000000..600cfe1
--- /dev/null
@@ -0,0 +1,150 @@
+/**
+ *  jQuery Plugin highlightFade (jquery.offput.ca/highlightFade)
+ *  (c) 2006 Blair Mitchelmore (offput.ca) blair@offput.ca
+ */
+/**
+ * This is version 0.7 of my highlightFade plugin. It follows the yellow fade technique of Web 2.0 fame
+ * but expands it to allow any starting colour and allows you to specify the end colour as well.
+ *
+ * For the moment, I'm done with this plug-in. Unless I come upon a really cool feature it should have
+ * this plug-in will only receive updates to ensure future compatibility with jQuery.
+ *
+ * As of now (Aug. 16, 2006) the plugin has been written with the 1.0.1 release of jQuery (rev 249) which
+ * is available from http://jquery.com/src/jquery-1.0.1.js
+ *
+ * A note regarding rgb() syntax: I noticed that most browsers implement rgb syntax as either an integer 
+ * (0-255) or percentage (0-100%) value for each field, that is, rgb(i/p,i/p,i/p); however, the W3C 
+ * standard clearly defines it as "either three integer values or three percentage values" [http://www.w3.org/TR/CSS21/syndata.html] 
+ * which I choose to follow despite the error redundancy of the typical behaviour browsers employ.
+ *
+ * Changelog:
+ *
+ *    0.7:
+ *        - Added the awesome custom attribute support written by George Adamson (slightly modified)
+ *        - Removed bgColor plugin dependency seeing as attr is customizable now...
+ *    0.6:
+ *        - Abstracted getBGColor into its own plugin with optional test and data retrieval functions
+ *        - Converted all $ references to jQuery references as John's code seems to be shifting away
+ *          from that and I don't want to have to update this for a long time.
+ *    0.5:
+ *        - Added simple argument syntax for only specifying start colour of event
+ *        - Removed old style argument syntax
+ *        - Added 'interval', 'final, and 'end' properties
+ *        - Renamed 'color' property to 'start'
+ *        - Added second argument to $.highlightFade.getBGColor to bypass the e.highlighting check
+ *    0.4:
+ *        - Added rgb(%,%,%) color syntax
+ *    0.3:
+ *        - Fixed bug when event was called while parent was also running event corrupting the
+ *          the background colour of the child
+ *    0.2:
+ *        - Fixed bug where an unspecified onComplete function made the page throw continuous errors
+ *        - Fixed bug where multiple events on the same element would speed each subsequent event
+ *    0.1:
+ *        - Initial Release
+ * 
+ * @author          Blair Mitchelmore (blair@offput.ca)
+ * @version         0.5
+ */
+jQuery.fn.highlightFade = function(settings) {
+       var o = (settings && settings.constructor == String) ? {start: settings} : settings || {};
+       var d = jQuery.highlightFade.defaults;
+       var i = o['interval'] || d['interval'];
+       var a = o['attr'] || d['attr'];
+       var ts = {
+               'linear': function(s,e,t,c) { return parseInt(s+(c/t)*(e-s)); },
+               'sinusoidal': function(s,e,t,c) { return parseInt(s+Math.sin(((c/t)*90)*(Math.PI/180))*(e-s)); },
+               'exponential': function(s,e,t,c) { return parseInt(s+(Math.pow(c/t,2))*(e-s)); }
+       };
+       var t = (o['iterator'] && o['iterator'].constructor == Function) ? o['iterator'] : ts[o['iterator']] || ts[d['iterator']] || ts['linear'];
+       if (d['iterator'] && d['iterator'].constructor == Function) t = d['iterator'];
+       return this.each(function() {
+               if (!this.highlighting) this.highlighting = {};
+               var e = (this.highlighting[a]) ? this.highlighting[a].end : jQuery.highlightFade.getBaseValue(this,a) || [255,255,255];
+               var c = jQuery.highlightFade.getRGB(o['start'] || o['colour'] || o['color'] || d['start'] || [255,255,128]);
+               var s = jQuery.speed(o['speed'] || d['speed']);
+               var r = o['final'] || (this.highlighting[a] && this.highlighting[a].orig) ? this.highlighting[a].orig : jQuery.curCSS(this,a);
+               if (o['end'] || d['end']) r = jQuery.highlightFade.asRGBString(e = jQuery.highlightFade.getRGB(o['end'] || d['end']));
+               if (typeof o['final'] != 'undefined') r = o['final'];
+               if (this.highlighting[a] && this.highlighting[a].timer) window.clearInterval(this.highlighting[a].timer);
+               this.highlighting[a] = { steps: ((s.duration) / i), interval: i, currentStep: 0, start: c, end: e, orig: r, attr: a };
+               jQuery.highlightFade(this,a,o['complete'],t);
+       });
+};
+
+jQuery.highlightFade = function(e,a,o,t) {
+       e.highlighting[a].timer = window.setInterval(function() { 
+               var newR = t(e.highlighting[a].start[0],e.highlighting[a].end[0],e.highlighting[a].steps,e.highlighting[a].currentStep);
+               var newG = t(e.highlighting[a].start[1],e.highlighting[a].end[1],e.highlighting[a].steps,e.highlighting[a].currentStep);
+               var newB = t(e.highlighting[a].start[2],e.highlighting[a].end[2],e.highlighting[a].steps,e.highlighting[a].currentStep);
+               jQuery(e).css(a,jQuery.highlightFade.asRGBString([newR,newG,newB]));
+               if (e.highlighting[a].currentStep++ >= e.highlighting[a].steps) {
+                       jQuery(e).css(a,e.highlighting[a].orig || '');
+                       window.clearInterval(e.highlighting[a].timer);
+                       e.highlighting[a] = null;
+                       if (o && o.constructor == Function) o.call(e);
+               }
+       },e.highlighting[a].interval);
+};
+
+jQuery.highlightFade.defaults = {
+       start: [255,255,128],
+       interval: 50,
+       speed: 400,
+       attr: 'backgroundColor'
+};
+
+jQuery.highlightFade.getRGB = function(c,d) {
+       var result;
+       if (c && c.constructor == Array && c.length == 3) return c;
+       if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))
+               return [parseInt(result[1]),parseInt(result[2]),parseInt(result[3])];
+       else if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))
+               return [parseFloat(result[1])*2.55,parseFloat(result[2])*2.55,parseFloat(result[3])*2.55];
+       else if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))
+               return [parseInt("0x" + result[1]),parseInt("0x" + result[2]),parseInt("0x" + result[3])];
+       else if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))
+               return [parseInt("0x"+ result[1] + result[1]),parseInt("0x" + result[2] + result[2]),parseInt("0x" + result[3] + result[3])];
+       else
+               return jQuery.highlightFade.checkColorName(c) || d || null;
+};
+
+jQuery.highlightFade.asRGBString = function(a) {
+       return "rgb(" + a.join(",") + ")";
+};
+
+jQuery.highlightFade.getBaseValue = function(e,a,b) {
+       var s, t;
+       b = b || false;
+       t = a = a || jQuery.highlightFade.defaults['attr'];
+       do {
+               s = jQuery(e).css(t || 'backgroundColor');
+               if ((s  != '' && s != 'transparent') || (e.tagName.toLowerCase() == "body") || (!b && e.highlighting && e.highlighting[a] && e.highlighting[a].end)) break; 
+               t = false;
+       } while (e = e.parentNode);
+       if (!b && e.highlighting && e.highlighting[a] && e.highlighting[a].end) s = e.highlighting[a].end;
+       if (s == undefined || s == '' || s == 'transparent') s = [255,255,255];
+       return jQuery.highlightFade.getRGB(s);
+};
+
+jQuery.highlightFade.checkColorName = function(c) {
+       if (!c) return null;
+       switch(c.replace(/^\s*|\s*$/g,'').toLowerCase()) {
+               case 'aqua': return [0,255,255];
+               case 'black': return [0,0,0];
+               case 'blue': return [0,0,255];
+               case 'fuchsia': return [255,0,255];
+               case 'gray': return [128,128,128];
+               case 'green': return [0,128,0];
+               case 'lime': return [0,255,0];
+               case 'maroon': return [128,0,0];
+               case 'navy': return [0,0,128];
+               case 'olive': return [128,128,0];
+               case 'purple': return [128,0,128];
+               case 'red': return [255,0,0];
+               case 'silver': return [192,192,192];
+               case 'teal': return [0,128,128];
+               case 'white': return [255,255,255];
+               case 'yellow': return [255,255,0];
+       }
+};
diff --git a/wolnelektury/static/js/jquery.jqmodal.js b/wolnelektury/static/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/static/js/jquery.js b/wolnelektury/static/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/static/js/jquery.labelify.js b/wolnelektury/static/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/static/js/jquery.scrollto.js b/wolnelektury/static/js/jquery.scrollto.js
new file mode 100644 (file)
index 0000000..7f42489
--- /dev/null
@@ -0,0 +1,194 @@
+/**\r
+ * jQuery.ScrollTo\r
+ * Copyright (c) 2007-2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com\r
+ * Dual licensed under MIT and GPL.\r
+ * Date: 9/11/2008\r
+ *\r
+ * @projectDescription Easy element scrolling using jQuery.\r
+ * http://flesler.blogspot.com/2007/10/jqueryscrollto.html\r
+ * Tested with jQuery 1.2.6. On FF 2/3, IE 6/7, Opera 9.2/5 and Safari 3. on Windows.\r
+ *\r
+ * @author Ariel Flesler\r
+ * @version 1.4\r
+ *\r
+ * @id jQuery.scrollTo\r
+ * @id jQuery.fn.scrollTo\r
+ * @param {String, Number, DOMElement, jQuery, Object} target Where to scroll the matched elements.\r
+ *       The different options for target are:\r
+ *             - A number position (will be applied to all axes).\r
+ *             - A string position ('44', '100px', '+=90', etc ) will be applied to all axes\r
+ *             - A jQuery/DOM element ( logically, child of the element to scroll )\r
+ *             - A string selector, that will be relative to the element to scroll ( 'li:eq(2)', etc )\r
+ *             - A hash { top:x, left:y }, x and y can be any kind of number/string like above.\r
+ * @param {Number} duration The OVERALL length of the animation, this argument can be the settings object instead.\r
+ * @param {Object,Function} settings Optional set of settings or the onAfter callback.\r
+ *      @option {String} axis Which axis must be scrolled, use 'x', 'y', 'xy' or 'yx'.\r
+ *      @option {Number} duration The OVERALL length of the animation.\r
+ *      @option {String} easing The easing method for the animation.\r
+ *      @option {Boolean} margin If true, the margin of the target element will be deducted from the final position.\r
+ *      @option {Object, Number} offset Add/deduct from the end position. One number for both axes or { top:x, left:y }.\r
+ *      @option {Object, Number} over Add/deduct the height/width multiplied by 'over', can be { top:x, left:y } when using both axes.\r
+ *      @option {Boolean} queue If true, and both axis are given, the 2nd axis will only be animated after the first one ends.\r
+ *      @option {Function} onAfter Function to be called after the scrolling ends. \r
+ *      @option {Function} onAfterFirst If queuing is activated, this function will be called after the first scrolling ends.\r
+ * @return {jQuery} Returns the same jQuery object, for chaining.\r
+ *\r
+ * @desc Scroll to a fixed position\r
+ * @example $('div').scrollTo( 340 );\r
+ *\r
+ * @desc Scroll relatively to the actual position\r
+ * @example $('div').scrollTo( '+=340px', { axis:'y' } );\r
+ *\r
+ * @dec Scroll using a selector (relative to the scrolled element)\r
+ * @example $('div').scrollTo( 'p.paragraph:eq(2)', 500, { easing:'swing', queue:true, axis:'xy' } );\r
+ *\r
+ * @ Scroll to a DOM element (same for jQuery object)\r
+ * @example var second_child = document.getElementById('container').firstChild.nextSibling;\r
+ *                     $('#container').scrollTo( second_child, { duration:500, axis:'x', onAfter:function(){\r
+ *                             alert('scrolled!!');                                                                                                                               \r
+ *                     }});\r
+ *\r
+ * @desc Scroll on both axes, to different values\r
+ * @example $('div').scrollTo( { top: 300, left:'+=200' }, { axis:'xy', offset:-20 } );\r
+ */\r
+;(function( $ ){\r
+       \r
+       var $scrollTo = $.scrollTo = function( target, duration, settings ){\r
+               $(window).scrollTo( target, duration, settings );\r
+       };\r
+\r
+       $scrollTo.defaults = {\r
+               axis:'y',\r
+               duration:1\r
+       };\r
+\r
+       // Returns the element that needs to be animated to scroll the window.\r
+       // Kept for backwards compatibility (specially for localScroll & serialScroll)\r
+       $scrollTo.window = function( scope ){\r
+               return $(window).scrollable();\r
+       };\r
+\r
+       // Hack, hack, hack... stay away!\r
+       // Returns the real elements to scroll (supports window/iframes, documents and regular nodes)\r
+       $.fn.scrollable = function(){\r
+               return this.map(function(){\r
+                       // Just store it, we might need it\r
+                       var win = this.parentWindow || this.defaultView,\r
+                               // If it's a document, get its iframe or the window if it's THE document\r
+                               elem = this.nodeName == '#document' ? win.frameElement || win : this,\r
+                               // Get the corresponding document\r
+                               doc = elem.contentDocument || (elem.contentWindow || elem).document,\r
+                               isWin = elem.setInterval;\r
+\r
+                       return elem.nodeName == 'IFRAME' || isWin && $.browser.safari ? doc.body\r
+                               : isWin ? doc.documentElement\r
+                               : this;\r
+               });\r
+       };\r
+\r
+       $.fn.scrollTo = function( target, duration, settings ){\r
+               if( typeof duration == 'object' ){\r
+                       settings = duration;\r
+                       duration = 0;\r
+               }\r
+               if( typeof settings == 'function' )\r
+                       settings = { onAfter:settings };\r
+                       \r
+               settings = $.extend( {}, $scrollTo.defaults, settings );\r
+               // Speed is still recognized for backwards compatibility\r
+               duration = duration || settings.speed || settings.duration;\r
+               // Make sure the settings are given right\r
+               settings.queue = settings.queue && settings.axis.length > 1;\r
+               \r
+               if( settings.queue )\r
+                       // Let's keep the overall duration\r
+                       duration /= 2;\r
+               settings.offset = both( settings.offset );\r
+               settings.over = both( settings.over );\r
+\r
+               return this.scrollable().each(function(){\r
+                       var elem = this,\r
+                               $elem = $(elem),\r
+                               targ = target, toff, attr = {},\r
+                               win = $elem.is('html,body');\r
+\r
+                       switch( typeof targ ){\r
+                               // A number will pass the regex\r
+                               case 'number':\r
+                               case 'string':\r
+                                       if( /^([+-]=)?\d+(px)?$/.test(targ) ){\r
+                                               targ = both( targ );\r
+                                               // We are done\r
+                                               break;\r
+                                       }\r
+                                       // Relative selector, no break!\r
+                                       targ = $(targ,this);\r
+                               case 'object':\r
+                                       // DOMElement / jQuery\r
+                                       if( targ.is || targ.style )\r
+                                               // Get the real position of the target \r
+                                               toff = (targ = $(targ)).offset();\r
+                       }\r
+                       $.each( settings.axis.split(''), function( i, axis ){\r
+                               var Pos = axis == 'x' ? 'Left' : 'Top',\r
+                                       pos = Pos.toLowerCase(),\r
+                                       key = 'scroll' + Pos,\r
+                                       old = elem[key],\r
+                                       Dim = axis == 'x' ? 'Width' : 'Height',\r
+                                       dim = Dim.toLowerCase();\r
+\r
+                               if( toff ){// jQuery / DOMElement\r
+                                       attr[key] = toff[pos] + ( win ? 0 : old - $elem.offset()[pos] );\r
+\r
+                                       // If it's a dom element, reduce the margin\r
+                                       if( settings.margin ){\r
+                                               attr[key] -= parseInt(targ.css('margin'+Pos)) || 0;\r
+                                               attr[key] -= parseInt(targ.css('border'+Pos+'Width')) || 0;\r
+                                       }\r
+                                       \r
+                                       attr[key] += settings.offset[pos] || 0;\r
+                                       \r
+                                       if( settings.over[pos] )\r
+                                               // Scroll to a fraction of its width/height\r
+                                               attr[key] += targ[dim]() * settings.over[pos];\r
+                               }else\r
+                                       attr[key] = targ[pos];\r
+\r
+                               // Number or 'number'\r
+                               if( /^\d+$/.test(attr[key]) )\r
+                                       // Check the limits\r
+                                       attr[key] = attr[key] <= 0 ? 0 : Math.min( attr[key], max(Dim) );\r
+\r
+                               // Queueing axes\r
+                               if( !i && settings.queue ){\r
+                                       // Don't waste time animating, if there's no need.\r
+                                       if( old != attr[key] )\r
+                                               // Intermediate animation\r
+                                               animate( settings.onAfterFirst );\r
+                                       // Don't animate this axis again in the next iteration.\r
+                                       delete attr[key];\r
+                               }\r
+                       });                     \r
+                       animate( settings.onAfter );                    \r
+\r
+                       function animate( callback ){\r
+                               $elem.animate( attr, duration, settings.easing, callback && function(){\r
+                                       callback.call(this, target, settings);\r
+                               });\r
+                       };\r
+                       function max( Dim ){\r
+                               var attr ='scroll'+Dim,\r
+                                       doc = elem.ownerDocument;\r
+                               \r
+                               return win\r
+                                               ? Math.max( doc.documentElement[attr], doc.body[attr]  )\r
+                                               : elem[attr];\r
+                       };\r
+               }).end();\r
+       };\r
+\r
+       function both( val ){\r
+               return typeof val == 'object' ? val : { top:val, left:val };\r
+       };\r
+\r
+})( jQuery );
\ No newline at end of file
diff --git a/wolnelektury/static/js/ordered_select_multiple.js b/wolnelektury/static/js/ordered_select_multiple.js
new file mode 100644 (file)
index 0000000..e4fd74d
--- /dev/null
@@ -0,0 +1,63 @@
+(function($) {
+  $.fn.orderedSelectMultiple = function(options) {
+    var settings = {
+      choices: []
+    };
+    $.extend(settings, options);
+    
+    var input = $(this).hide();
+    var values = input.val().split(',');
+    
+    var container = $('<div></div>').insertAfter($(this));
+    var choicesList = $('<ol class="choices connectedSortable"></ol>').appendTo(container).css({
+      width: 200, float: 'left', minHeight: 200, backgroundColor: '#eee', margin: 0, padding: 0
+    });
+    var valuesList = $('<ol class="values connectedSortable"></ol>').appendTo(container).css({
+      width: 200, float: 'left', minHeight: 200, backgroundColor: '#eee', margin: 0, padding: 0
+    });
+    var choiceIds = [];
+    $.each(settings.choices, function() {
+      choiceIds.push('' + this.id);
+    });
+    
+    function createItem(hash) {
+      return $('<li>' + hash.name + '</li>').css({
+        backgroundColor: '#cff',
+        display: 'block',
+        border: '1px solid #cdd',
+        padding: 2,
+        margin: 0
+      }).data('obj-id', hash.id);
+    }
+    
+    $.each(settings.choices, function() {
+      if ($.inArray('' + this.id, values) == -1) {
+        choicesList.append(createItem(this));
+      }
+    });
+    
+    $.each(values, function() {
+      var index = $.inArray('' + this, choiceIds); // Why this[0]?
+      if (index != -1) {
+        valuesList.append(createItem(settings.choices[index]));
+      }
+    });
+    
+    choicesList.sortable({
+               connectWith: '.connectedSortable'
+       }).disableSelection();
+       
+       valuesList.sortable({
+               connectWith: '.connectedSortable',
+               update: function() {
+                 values = [];
+                 $('li', valuesList).each(function(index) {
+          values.push($(this).data('obj-id'));
+          console.log($(this).data('obj-id'));
+                 });
+                 console.log('update', values.join(','), input);
+                 input.val(values.join(','));
+               }
+       }).disableSelection();
+  };
+})(jQuery);
diff --git a/wolnelektury/static/player.swf b/wolnelektury/static/player.swf
new file mode 100644 (file)
index 0000000..b2fde33
Binary files /dev/null and b/wolnelektury/static/player.swf differ
diff --git a/wolnelektury/static/sponsors/css/footer_admin.css b/wolnelektury/static/sponsors/css/footer_admin.css
new file mode 100644 (file)
index 0000000..ba56771
--- /dev/null
@@ -0,0 +1,67 @@
+.sponsors {
+    display: block;
+    clear: both;
+    margin-top: 5px;
+}
+
+.sponsors .sponsors-sponsor-group {
+    float: left;
+    width: 200px;
+    border: 1px solid #CCC;
+    margin: 2px 2px 0 0;
+}
+
+.sponsors .sponsors-sponsor-group-name {
+    border-bottom: 1px solid #CCC;
+    padding: 2px 2px 2px 4px;
+    margin: 0;
+    color: #FFF;
+    background-color: #7CA0C7;
+    font-weight: bold;
+    height: 15px;
+}
+
+.sponsors .sponsors-sponsor-group-name input {
+    margin: -2px -2px -2px -4px;
+    padding: 0;
+    height: 15px;
+    width: 180px;
+}
+
+.sponsors .sponsors-remove-sponsor-group {
+    float: right;
+    background-color: #CC3434;
+    color: #FFF;
+    width: 10px;
+    height: 15px;
+    padding: 2px;
+    text-align: center;
+    font-weight: bold;
+    display: block;
+    cursor: default;
+}
+
+.sponsors .sponsors-remove-sponsor-group:hover {
+    color: #CC3434;
+    background-color: white;
+}
+
+.sponsors .sponsors-unused-sponsor-group-name {
+    background-color: #FFF;
+    color: #666;
+}
+
+.sponsors .sponsors-sponsor-group-list {
+    margin: 0;
+    padding: 2px;
+    list-style: none;
+    min-height: 200px;
+}
+
+.sponsors-sponsor {
+    margin: 0 0 2px 0;
+    padding: 2px;
+    border: 1px solid #CCC;
+    background-color: #EEE;
+    cursor: default;
+}
diff --git a/wolnelektury/static/sponsors/js/footer_admin.js b/wolnelektury/static/sponsors/js/footer_admin.js
new file mode 100644 (file)
index 0000000..2f2cd93
--- /dev/null
@@ -0,0 +1,131 @@
+(function($) {
+  $.fn.sponsorsFooter = function(options) {
+    var settings = {
+      sponsors: []
+    };
+    $.extend(settings, options);
+    
+    var input = $(this).hide();
+    
+    var container = $('<div class="sponsors"></div>').appendTo(input.parent());
+    var groups = $.evalJSON(input.val());
+    
+    var unusedDiv = $('<div class="sponsors-sponsor-group sponsors-unused-sponsor-group"></div>')
+      .appendTo(container)
+      .append('<p class="sponsors-sponsor-group-name sponsors-unused-sponsor-group-name">dostępni sponsorzy</p>');
+    var unusedList = $('<ol class="sponsors-sponsor-group-list sponsors-unused-group-list"></ol>')
+        .appendTo(unusedDiv)
+        .sortable({
+          connectWith: '.sponsors-sponsor-group-list'
+               });
+    
+    // Edit group name inline
+    function editNameInline(name) {
+      name.unbind('click.sponsorsFooter');
+      var inlineInput = $('<input></input>').val(name.html());
+      name.html('');
+      
+      function endEditing() {
+        name.html(inlineInput.val());
+        inlineInput.remove();
+        name.bind('click.sponsorsFooter', function() {
+          editNameInline($(this));
+        });
+        input.parents('form').unbind('submit.sponsorsFooter', endEditing);
+        return false;
+      }
+      
+      inlineInput.appendTo(name).focus().blur(endEditing);
+      input.parents('form').bind('submit.sponsorsFooter', endEditing);
+    }
+    
+    // Remove sponsor with passed id from sponsors array and return it
+    function popSponsor(id) {
+      for (var i=0; i < settings.sponsors.length; i++) {
+        if (settings.sponsors[i].id == id) {
+          var s = settings.sponsors[i];
+          settings.sponsors.splice(i, 1);
+          return s;
+        }
+      }
+      return null;
+    }
+    
+    // Create sponsor group and bind events
+    function createGroup(name, sponsors) {
+      if (!sponsors) {
+        sponsors = [];
+      }
+      
+      var groupDiv = $('<div class="sponsors-sponsor-group"></div>');
+      
+      $('<a class="sponsors-remove-sponsor-group">X</a>')
+        .click(function() {
+          groupDiv.fadeOut('slow', function() {
+            $('.sponsors-sponsor', groupDiv).hide().appendTo(unusedList).fadeIn();
+            groupDiv.remove();
+          });
+        }).appendTo(groupDiv);
+      
+      $('<p class="sponsors-sponsor-group-name">' + name + '</p>')
+        .bind('click.sponsorsFooter', function() {
+          editNameInline($(this));
+        }).appendTo(groupDiv);
+      
+      var groupList = $('<ol class="sponsors-sponsor-group-list"></ol>')
+        .appendTo(groupDiv)
+        .sortable({
+          connectWith: '.sponsors-sponsor-group-list'
+               });
+      
+      
+      for (var i = 0; i < sponsors.length; i++) {
+        $('<li class="sponsors-sponsor">' + sponsors[i].name + '</li>')
+          .data('obj_id', sponsors[i].id)
+          .appendTo(groupList);
+      }
+      return groupDiv;
+    }
+    
+    // Create groups from data in input value
+    for (var i = 0; i < groups.length; i++) {
+      var group = groups[i];
+      var sponsors = [];
+      
+      for (var j = 0; j < group.sponsors.length; j++) {
+        var s = popSponsor(group.sponsors[j]);
+        if (s) {
+          sponsors.push(s);
+        }
+      }
+      createGroup(group.name, sponsors).appendTo(container);
+    }
+    
+    // Serialize input value before submiting form
+    input.parents('form').submit(function(event) {
+      var groups = [];
+      $('.sponsors-sponsor-group', container).not('.sponsors-unused-sponsor-group').each(function() {
+        var group = {name: $('.sponsors-sponsor-group-name', this).html(), sponsors: []};
+        $('.sponsors-sponsor', this).each(function() {
+          group.sponsors.push($(this).data('obj_id'));
+        });
+        groups.push(group);
+      });
+      input.val($.toJSON(groups));
+    });
+    
+    for (i = 0; i < settings.sponsors.length; i++) {
+      $('<li class="sponsors-sponsor">' + settings.sponsors[i].name + '</li>')
+        .data('obj_id', settings.sponsors[i].id)
+        .appendTo(unusedList);
+    }
+    
+    $('<button type="button">Dodaj nową grupę</button>')
+      .click(function() {
+        var newGroup = createGroup('').appendTo(container);
+        editNameInline($('.sponsors-sponsor-group-name', newGroup));
+      }).prependTo(input.parent());
+    
+    input.parent().append('<div style="clear: both"></div>');
+  };
+})(jQuery);
diff --git a/wolnelektury/static/sponsors/js/jquery.json.min.js b/wolnelektury/static/sponsors/js/jquery.json.min.js
new file mode 100644 (file)
index 0000000..bad4a0a
--- /dev/null
@@ -0,0 +1,31 @@
+
+(function($){$.toJSON=function(o)
+{if(typeof(JSON)=='object'&&JSON.stringify)
+return JSON.stringify(o);var type=typeof(o);if(o===null)
+return"null";if(type=="undefined")
+return undefined;if(type=="number"||type=="boolean")
+return o+"";if(type=="string")
+return $.quoteString(o);if(type=='object')
+{if(typeof o.toJSON=="function")
+return $.toJSON(o.toJSON());if(o.constructor===Date)
+{var month=o.getUTCMonth()+1;if(month<10)month='0'+month;var day=o.getUTCDate();if(day<10)day='0'+day;var year=o.getUTCFullYear();var hours=o.getUTCHours();if(hours<10)hours='0'+hours;var minutes=o.getUTCMinutes();if(minutes<10)minutes='0'+minutes;var seconds=o.getUTCSeconds();if(seconds<10)seconds='0'+seconds;var milli=o.getUTCMilliseconds();if(milli<100)milli='0'+milli;if(milli<10)milli='0'+milli;return'"'+year+'-'+month+'-'+day+'T'+
+hours+':'+minutes+':'+seconds+'.'+milli+'Z"';}
+if(o.constructor===Array)
+{var ret=[];for(var i=0;i<o.length;i++)
+ret.push($.toJSON(o[i])||"null");return"["+ret.join(",")+"]";}
+var pairs=[];for(var k in o){var name;var type=typeof k;if(type=="number")
+name='"'+k+'"';else if(type=="string")
+name=$.quoteString(k);else
+continue;if(typeof o[k]=="function")
+continue;var val=$.toJSON(o[k]);pairs.push(name+":"+val);}
+return"{"+pairs.join(", ")+"}";}};$.evalJSON=function(src)
+{if(typeof(JSON)=='object'&&JSON.parse)
+return JSON.parse(src);return eval("("+src+")");};$.secureEvalJSON=function(src)
+{if(typeof(JSON)=='object'&&JSON.parse)
+return JSON.parse(src);var filtered=src;filtered=filtered.replace(/\\["\\\/bfnrtu]/g,'@');filtered=filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']');filtered=filtered.replace(/(?:^|:|,)(?:\s*\[)+/g,'');if(/^[\],:{}\s]*$/.test(filtered))
+return eval("("+src+")");else
+throw new SyntaxError("Error parsing JSON, source is not valid.");};$.quoteString=function(string)
+{if(string.match(_escapeable))
+{return'"'+string.replace(_escapeable,function(a)
+{var c=_meta[a];if(typeof c==='string')return c;c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+(c%16).toString(16);})+'"';}
+return'"'+string+'"';};var _escapeable=/["\\\x00-\x1f\x7f-\x9f]/g;var _meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};})(jQuery);
\ No newline at end of file
index 9831864..e51ec82 100644 (file)
@@ -5,12 +5,12 @@
 <title>404 - Zagubiona strona w WolneLektury.pl</title>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.5.2/build/reset/reset-min.css"> 
 <title>404 - Zagubiona strona w WolneLektury.pl</title>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.5.2/build/reset/reset-min.css"> 
-<link rel="stylesheet" href="/media/css/error.css" type="text/css" />
+<link rel="stylesheet" href="/static/css/error.css" type="text/css" />
 </head>
 
 <body>
 
 </head>
 
 <body>
 
-<a href="/"><img src="/media/img/logo.png" /></a>
+<a href="/"><img src="/static/img/logo.png" /></a>
 <p class="haj" style="font-weight: bold">Podana strona nie istnieje</p>
 <p>
 Przepraszamy, ale ta strona nie istnieje. Sprawdź czy podałeś dobry adres, lub przejdź do <a href="/">strony głównej</a>.
 <p class="haj" style="font-weight: bold">Podana strona nie istnieje</p>
 <p>
 Przepraszamy, ale ta strona nie istnieje. Sprawdź czy podałeś dobry adres, lub przejdź do <a href="/">strony głównej</a>.
index 7dc97f7..8346afe 100644 (file)
@@ -5,12 +5,12 @@
 <title>500 - Błąd serwera w WolneLektury.pl</title>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.5.2/build/reset/reset-min.css"> 
 <title>500 - Błąd serwera w WolneLektury.pl</title>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.5.2/build/reset/reset-min.css"> 
-<link rel="stylesheet" href="/media/css/error.css" type="text/css" />
+<link rel="stylesheet" href="/static/css/error.css" type="text/css" />
 </head>
 
 <body>
 
 </head>
 
 <body>
 
-<a href="/"><img src="/media/img/logo.png" /></a>
+<a href="/"><img src="/static/img/logo.png" /></a>
 <p class="haj" style="font-weight: bold">Błąd serwera</p>
 <p>
 Przepraszamy, ale wystąpił błąd serwera. Na pewno już się nim zajmujemy i postaramy się naprawić tak szybko jak to tylko możliwe. Do tego czasu proponujemy żebyś przeszedł do <a href="/">strony głównej</a>.
 <p class="haj" style="font-weight: bold">Błąd serwera</p>
 <p>
 Przepraszamy, ale wystąpił błąd serwera. Na pewno już się nim zajmujemy i postaramy się naprawić tak szybko jak to tylko możliwe. Do tego czasu proponujemy żebyś przeszedł do <a href="/">strony głównej</a>.
index 0f30a9e..3b4e8f3 100644 (file)
@@ -5,7 +5,7 @@
     <head>
         <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
         <title>{% block title %}WolneLektury.pl{% endblock %}</title>
     <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" />
+        <link rel="icon" href="/static/img/favicon.png" type="image/x-icon" />
         {% compressed_css "all" %}
         {% compressed_js "jquery" %}
         {% compressed_js "all" %}
         {% compressed_css "all" %}
         {% compressed_js "jquery" %}
         {% compressed_js "all" %}
         {% endblock %}
     </head>
     <body id="{% block bodyid %}base{% endblock %}">
         {% endblock %}
     </head>
     <body id="{% block bodyid %}base{% endblock %}">
-        <!--[if lt IE 7]><link href=/media/infobar/infobar.css rel=stylesheet>
+        <!--[if lt IE 7]><link href=/static/infobar/infobar.css rel=stylesheet>
         <div id=infobar><a href=http://browsehappy.pl/infobar>
         Internet Explorer nie potrafi poprawnie wyświetlić tej strony. Kliknij tutaj, aby dowiedzieć się więcej...
         <div id=infobar><a href=http://browsehappy.pl/infobar>
         Internet Explorer nie potrafi poprawnie wyświetlić tej strony. Kliknij tutaj, aby dowiedzieć się więcej...
-        </a></div><div id=viewplot><script src=/media/infobar/infobar.js></script><![endif]-->
+        </a></div><div id=viewplot><script src=/static/infobar/infobar.js></script><![endif]-->
         <div id="top-message">
             {% chunk "top-message" %}
         </div>
         <div id="header">
             <div id="logo">
         <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>
+                <a href="/"><img src="/static/img/logo.png" alt="WolneLektury.pl - logo" /></a>
             </div>
             <div id="user-info" style="display:none">
                 {% if user.is_authenticated %}
             </div>
             <div id="user-info" style="display:none">
                 {% if user.is_authenticated %}
@@ -82,7 +82,7 @@
         <div id="user-shelves-window">
             <div class="header"><a href="#" class="jqmClose">Zamknij</a></div>
             <div class="target">
         <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>
+                <p><img src="/static/img/indicator.gif" alt="*"/> Ładowanie</p>
             </div>
         </div>
         <script type="text/javascript">
             </div>
         </div>
         <script type="text/javascript">
index 081ee50..24e9169 100644 (file)
             {% endif %}
             {% if book.mp3_file and book.ogg_file %}
             <div id="czytamy-sluchajac-info">
             {% endif %}
             {% if book.mp3_file and book.ogg_file %}
             <div id="czytamy-sluchajac-info">
-                    <a href="http://czytamysluchajac.pl/" id="czytamysluchajac-logo"><img src="/media/img/czytamysluchajac-logo-small.png" /></a>     
+                    <a href="http://czytamysluchajac.pl/" id="czytamysluchajac-logo"><img src="/static/img/czytamysluchajac-logo-small.png" /></a>     
                     <p>Czyta: {{ book.get_extra_info_value.artist_name }}</p>
                     <p>Reżyseruje: {{ book.get_extra_info_value.director_name }}</p>
                 </div>
                 <a href="{{ book.mp3_file.url }}">Pobierz plik MP3</a>
                 <a href="{{ book.ogg_file.url }}">Pobierz plik Ogg Vorbis</a>
                     <p>Czyta: {{ book.get_extra_info_value.artist_name }}</p>
                     <p>Reżyseruje: {{ book.get_extra_info_value.director_name }}</p>
                 </div>
                 <a href="{{ book.mp3_file.url }}">Pobierz plik MP3</a>
                 <a href="{{ book.ogg_file.url }}">Pobierz plik Ogg Vorbis</a>
-                <object type="application/x-shockwave-flash" style="margin-top: 0.5em" data="/media/player.swf" width="426" height="20">
-                    <param name="movie" value="/media/player.swf" />
+                <object type="application/x-shockwave-flash" style="margin-top: 0.5em" data="/static/player.swf" width="426" height="20">
+                    <param name="movie" value="/static/player.swf" />
                     <param name="bgcolor" value="#ffffff" />
                     <param name="FlashVars" value="mp3={{ book.mp3_file.url }}&amp;width=426&amp;showvolume=1&amp;bgcolor1=eeeeee&amp;bgcolor2=eeeeee&amp;buttoncolor=666666" />
                 </object>
                     <param name="bgcolor" value="#ffffff" />
                     <param name="FlashVars" value="mp3={{ book.mp3_file.url }}&amp;width=426&amp;showvolume=1&amp;bgcolor1=eeeeee&amp;bgcolor2=eeeeee&amp;buttoncolor=666666" />
                 </object>
     <div id="set-window">
         <div class="header"><a href="#" class="jqmClose">Zamknij</a></div>
         <div class="target">
     <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>
+            <p><img src="/static/img/indicator.gif" alt="*"/> Ładowanie</p>
         </div>
     </div>
 {% endblock %}
         </div>
     </div>
 {% endblock %}
index 4f1c0eb..f21b1a8 100644 (file)
@@ -31,7 +31,7 @@
     <div id="set-window">
         <div class="header"><a href="#" class="jqmClose">Zamknij</a></div>
         <div class="target">
     <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>
+            <p><img src="/static/img/indicator.gif" alt="*"/> Ładowanie</p>
         </div>
     </div>
 {% endblock %}
\ No newline at end of file
         </div>
     </div>
 {% endblock %}
\ No newline at end of file
index d3f6a1c..b3d18ea 100644 (file)
@@ -5,7 +5,7 @@
     <head>
         <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
         <title>{% block title %}WolneLektury.pl{% endblock %}</title>
     <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" />
+        <link rel="icon" href="/static/img/favicon.png" type="image/x-icon" />
         {% compressed_css "book" %}
         {% compressed_js "jquery" %}
         {% compressed_js "book" %}
         {% compressed_css "book" %}
         {% compressed_js "jquery" %}
         {% compressed_js "book" %}
@@ -19,7 +19,7 @@
         </div>
         <div id="header">
             <div id="logo">
         </div>
         <div id="header">
             <div id="logo">
-                <a href="/"><img src="/media/img/logo.png" alt="WolneLektury.pl - logo" /></a>
+                <a href="/"><img src="/static/img/logo.png" alt="WolneLektury.pl - logo" /></a>
             </div>
         </div>
         <div id="themes">
             </div>
         </div>
         <div id="themes">
index af48f84..5e36ead 100644 (file)
@@ -37,7 +37,7 @@
                 <p>Aby zarządzać swoimi półkami, musisz się <a class="login-register-link" href="#">zalogować</a>.</p>
             {% endif %}
             <div id="czytamysluchajac">
                 <p>Aby zarządzać swoimi półkami, musisz się <a class="login-register-link" href="#">zalogować</a>.</p>
             {% endif %}
             <div id="czytamysluchajac">
-                <a href="http://czytamysluchajac.pl/"><img src="/media/img/czytamysluchajac-logo-small.png" /></a>
+                <a href="http://czytamysluchajac.pl/"><img src="/static/img/czytamysluchajac-logo-small.png" /></a>
                 <p><a href="http://czytamysluchajac.pl/">Czytamy Słuchając</a> to profesjonalne nagrania tekstów literackich z naszego zbioru dostępne na wolnej licencji w formatach MP3, Ogg Vorbis oraz w systemie DAISY.</p>
                 <p class="see-more"><a href="http://czytamysluchajac.pl/index.php/o-projekcie/">Zobacz więcej ⇒</a></p>
             </div>
                 <p><a href="http://czytamysluchajac.pl/">Czytamy Słuchając</a> to profesjonalne nagrania tekstów literackich z naszego zbioru dostępne na wolnej licencji w formatach MP3, Ogg Vorbis oraz w systemie DAISY.</p>
                 <p class="see-more"><a href="http://czytamysluchajac.pl/index.php/o-projekcie/">Zobacz więcej ⇒</a></p>
             </div>
index b5b8ca7..497fbb1 100644 (file)
@@ -85,7 +85,7 @@
     <div id="set-window">
         <div class="header"><a href="#" class="jqmClose">Zamknij</a></div>
         <div class="target">
     <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>
+            <p><img src="/static/img/indicator.gif" alt="*"/> Ładowanie</p>
         </div>
     </div>
 {% endblock %}
\ No newline at end of file
         </div>
     </div>
 {% endblock %}
\ No newline at end of file
index 25c4474..b835671 100644 (file)
        </p>
 
        <p>
        </p>
 
        <p>
-               <a href="/media/wolontariat.pdf">Raport z realizacji projektu „Wolontariat dla wiedzy"</a>.
+               <a href="/static/wolontariat.pdf">Raport z realizacji projektu „Wolontariat dla wiedzy"</a>.
        </p>
        <p>
        </p>
        <p>
-       <img src="/media/img/wolontariat/okladka.jpg" style='margin: 10px' />
-       <img src="/media/img/wolontariat/01.jpg" style='margin: 10px' />
-       <img src="/media/img/wolontariat/02.jpg" style='margin: 10px' />
-    <img src="/media/img/wolontariat/03.jpg" style='margin: 10px' />
-    <img src="/media/img/wolontariat/04.jpg" style='margin: 10px' />
+       <img src="/static/img/wolontariat/okladka.jpg" style='margin: 10px' />
+       <img src="/static/img/wolontariat/01.jpg" style='margin: 10px' />
+       <img src="/static/img/wolontariat/02.jpg" style='margin: 10px' />
+    <img src="/static/img/wolontariat/03.jpg" style='margin: 10px' />
+    <img src="/static/img/wolontariat/04.jpg" style='margin: 10px' />
        </p>
        
     </div>
        </p>
        
     </div>
index a142c73..1994414 100644 (file)
@@ -2,11 +2,14 @@
 import os
 
 from django.conf.urls.defaults import *
 import os
 
 from django.conf.urls.defaults import *
+from django.conf import settings
 from django.contrib import admin
 
 from django.contrib import admin
 
+from catalogue.forms import SearchForm
+
+
 admin.autodiscover()
 
 admin.autodiscover()
 
-from catalogue.forms import SearchForm
 
 urlpatterns = patterns('',
     url(r'^katalog/', include('catalogue.urls')),
 
 urlpatterns = patterns('',
     url(r'^katalog/', include('catalogue.urls')),
@@ -33,7 +36,9 @@ urlpatterns = patterns('',
     url(r'^uzytkownicy/utworz/$', 'catalogue.views.register', name='register'),
     
     # Static files
     url(r'^uzytkownicy/utworz/$', 'catalogue.views.register', name='register'),
     
     # Static files
-    url(r'^media/(?P<path>.*)$', 'django.views.static.serve', 
-        {'document_root': os.path.join(os.path.dirname(__file__), 'media'), 'show_indexes': True}),
+    url(r'^%s(?P<path>.*)$' % settings.MEDIA_URL[1:], 'django.views.static.serve', 
+        {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
+    url(r'^%s(?P<path>.*)$' % settings.STATIC_URL[1:], 'django.views.static.serve',
+        {'document_root': settings.STATIC_ROOT, 'show_indexes': True}),
     url(r'^$', 'django.views.generic.simple.redirect_to', {'url': 'katalog/'}),
 )
     url(r'^$', 'django.views.generic.simple.redirect_to', {'url': 'katalog/'}),
 )