summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorluxagraf@c63593aa-01b0-44d9-8516-4b9c7e931d7f <luxagraf@c63593aa-01b0-44d9-8516-4b9c7e931d7f>2010-03-12 03:42:13 +0000
committerluxagraf@c63593aa-01b0-44d9-8516-4b9c7e931d7f <luxagraf@c63593aa-01b0-44d9-8516-4b9c7e931d7f>2010-03-12 03:42:13 +0000
commitef35853e54e1572dc1de4fd2311d00dfd16e4f75 (patch)
treefe712fa6a1a2c38761e0458bf1684274a510df32
parent0882d73ca1ba4c84ce24c946548c80d9e4d1c04e (diff)
added projects
-rw-r--r--apps/blog/admin.py2
-rw-r--r--apps/blog/models.py2
-rw-r--r--apps/links/utils.py49
-rw-r--r--apps/photos/models.py1
-rw-r--r--apps/projects/__init__.py0
-rw-r--r--apps/projects/models.py142
-rw-r--r--apps/projects/urls.py15
-rw-r--r--base_urls.py1
-rw-r--r--lib/pydelicious.py858
-rw-r--r--media/css/base.css51
-rw-r--r--media/js/combo.pack.js668
-rw-r--r--media/js/jquery.galleria.pack.js1
-rw-r--r--media/js/jquery.jcarousel.pack.js16
-rw-r--r--media/js/jquery.js11
-rw-r--r--templates/base.html18
-rw-r--r--templates/details/entry.html8
-rw-r--r--templates/includes/map_entry_list.html55
-rw-r--r--templates/includes/recent_entries.html8
-rw-r--r--templates/projects/base.html14
19 files changed, 1493 insertions, 427 deletions
diff --git a/apps/blog/admin.py b/apps/blog/admin.py
index c5c5c5d..6f1cbb9 100644
--- a/apps/blog/admin.py
+++ b/apps/blog/admin.py
@@ -23,7 +23,7 @@ class EntryAdmin(OSMGeoAdmin):
list_filter = ('pub_date', 'enable_comments', 'status','region','location')
fieldsets = (
('Entry', {'fields': ('title','body_markdown', ('location','region'), 'pub_date', ('status','enable_comments'), 'tags', 'slug','photo_gallery'), 'classes': ('show','extrapretty','wide')}),
- ('Pub Location', {'fields': ('point',('thumbnail',),'dek', 'topics', 'title_keywords'), 'classes': ('collapse', 'wide')}),
+ ('Pub Location', {'fields': ('point',('thumbnail',),'dek', 'topics', 'meta_description'), 'classes': ('collapse', 'wide')}),
)
class Media:
diff --git a/apps/blog/models.py b/apps/blog/models.py
index bdbcd82..fb0dac6 100644
--- a/apps/blog/models.py
+++ b/apps/blog/models.py
@@ -66,7 +66,7 @@ class Entry(models.Model):
status = models.IntegerField(choices=PUB_STATUS, default=0)
photo_gallery = models.ForeignKey(PhotoGallery, blank=True, null=True, verbose_name='photo set')
thumbnail = models.FileField(upload_to=get_upload_path, null=True,blank=True)
- title_keywords = models.CharField(max_length=200, null=True, blank=True)
+ meta_description = models.CharField(max_length=256, null=True, blank=True)
topics = models.ManyToManyField(Topic, blank=True)
@property
diff --git a/apps/links/utils.py b/apps/links/utils.py
index 9acbd52..9e5aea5 100644
--- a/apps/links/utils.py
+++ b/apps/links/utils.py
@@ -70,9 +70,9 @@ def sync_magnolia_links(*args, **kwargs):
break
def sync_delicious_links(*args, **kwargs):
- b = delicious.get(settings.DELICIOUS_USER, settings.DELICIOUS_PASS)
+ b = delicious.get_all(settings.DELICIOUS_USER, settings.DELICIOUS_PASS)
dupe = False
- for post in b['posts']:
+ for post in b:
taglist = []
try:
row = Link.objects.get(magnolia_id=safestr(post['hash']))
@@ -91,7 +91,7 @@ def sync_delicious_links(*args, **kwargs):
break
else:
status = 0
- descr = markdown.markdown(unquotehtml(safestr(post['extended'])), safe_mode = False)
+ descr = markdown.markdown(unquotehtml(safestr(post['extended'])), safe_mode = False)
l, created = Link.objects.get_or_create(
title = post['description'],
magnolia_id = safestr(post['hash']),
@@ -115,48 +115,7 @@ def sync_delicious_links(*args, **kwargs):
break
-
- """
- b, created = Link.objects.get_or_create(
- url = info['href'],
- description = info['extended'],
- tags = info.get('tag', ''),
- date = parsedate(info['time']),
- title = info['description']
- )
- for b in bookmarks.bookmarks.bookmark:
-
- try:
- row = Link.objects.get(magnolia_id=safestr(b.id))
- # If the row exists already, set the dupe flag
- print b.title.PCDATA
- dupe = True
- except ObjectDoesNotExist:
- tags=", ".join(t.name for t in b.tags.tag if t.name != "2lux")
- # grab the photo (local copies are good, should I ever change bookmark services)
- local_image_url = "%s/%s.jpg" %(safestr(datetime.datetime.today().strftime("%b").lower()), safestr(b.id))
- f = copy_file(safestr(b.screenshot.PCDATA), safestr(b.id))
- # set the privacy flag (default to false to be on the safe side)
- public = 0
- if safestr(b.private) == 'false': public=1
- # Create and save a new link obj
- l = Link.objects.create(
- title = safestr(b.title.PCDATA),
- magnolia_id = safestr(b.id),
- url = safestr(b.url.PCDATA),
- description = unquotehtml(safestr(b.description.PCDATA)),
- screen_url = local_image_url,
- rating = safestr(b.rating),
- pub_date = datetime.datetime(*(time.strptime(str(b.created[:-6]), '%Y-%m-%dT%H:%M:%S')[0:6])),
- status = public,
- enable_comments = True,
-
- )
- email_link(l)
- send_to_delicious(l)
- if (dupe):
- break
- """
+
def email_link(link):
diff --git a/apps/photos/models.py b/apps/photos/models.py
index 73098b3..a157c6e 100644
--- a/apps/photos/models.py
+++ b/apps/photos/models.py
@@ -138,6 +138,7 @@ class PhotoGallery(models.Model):
class Meta:
ordering = ('id',)
+ verbose_name_plural = 'Photo Galleries'
def __unicode__(self):
return self.set_title
diff --git a/apps/projects/__init__.py b/apps/projects/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/apps/projects/__init__.py
diff --git a/apps/projects/models.py b/apps/projects/models.py
new file mode 100644
index 0000000..bdbcd82
--- /dev/null
+++ b/apps/projects/models.py
@@ -0,0 +1,142 @@
+import datetime
+from django.contrib.gis.db import models
+from django.conf import settings
+from django.contrib.syndication.feeds import Feed
+from django.contrib.sitemaps import Sitemap
+from django.template.defaultfilters import truncatewords_html
+
+
+import markdown2 as markdown
+from tagging.fields import TagField
+from tagging.models import Tag
+
+from photos.models import PhotoGallery
+from locations.models import Location,Region
+#from locations.signals import create_location_item
+from blog.signals import update_recent
+
+def get_upload_path(self, filename):
+ return "images/post-thumbs/%s/%s" %(datetime.datetime.today().strftime("%Y"), filename)
+
+def markdown_processor(md):
+ processed = markdown.markdown(md, safe_mode = False).split('<break>')
+ html = processed[0]+processed[1]
+ lede = processed[0]
+ return html, lede
+
+class PostImage(models.Model):
+ title = models.CharField(max_length=100)
+ image = models.ImageField(upload_to="%s%s" %(settings.IMAGES_ROOT, datetime.datetime.today().strftime("%Y")))
+
+ def __unicode__(self):
+ return self.title
+
+ def output_tags(self):
+ return force_unicode('<img src="%s%s" alt="%s" class="postpic"/>' % \
+ (settings.IMAGES_URL, self.image.url.split('images')[1].split('/',1)[1], self.title))
+
+
+class Topic(models.Model):
+ name = models.CharField(max_length=100)
+ slug = models.SlugField()
+
+ def __unicode__(self):
+ return self.name
+
+ def get_absolute_url(self):
+ return "/topics/%s/" % (self.slug)
+
+class Entry(models.Model):
+ title = models.CharField(max_length=200)
+ slug = models.SlugField(unique_for_date='pub_date')
+ lede = models.TextField(blank=True)
+ body_html = models.TextField(blank=True)
+ body_markdown = models.TextField()
+ dek = models.TextField(null=True,blank=True)
+ pub_date = models.DateTimeField('Date published')
+ tags = TagField()
+ enable_comments = models.BooleanField(default=True)
+ point = models.PointField(null=True)
+ location = models.ForeignKey(Location, null=True)
+ region = models.ForeignKey(Region, null=True)
+ PUB_STATUS = (
+ (0, 'Draft'),
+ (1, 'Published'),
+ )
+ status = models.IntegerField(choices=PUB_STATUS, default=0)
+ photo_gallery = models.ForeignKey(PhotoGallery, blank=True, null=True, verbose_name='photo set')
+ thumbnail = models.FileField(upload_to=get_upload_path, null=True,blank=True)
+ title_keywords = models.CharField(max_length=200, null=True, blank=True)
+ topics = models.ManyToManyField(Topic, blank=True)
+
+ @property
+ def longitude(self):
+ '''Get the site's longitude.'''
+ return self.point.x
+
+ @property
+ def latitude(self):
+ '''Get the site's latitude.'''
+ return self.point.y
+
+ class Meta:
+ ordering = ('-pub_date',)
+ get_latest_by = 'pub_date'
+ verbose_name_plural = 'entries'
+
+ def __unicode__(self):
+ return self.title
+
+ def get_absolute_url(self):
+ return "/%s/%s/" % (self.pub_date.strftime("%Y/%b/%d").lower(), self.slug)
+
+ def get_previous_published(self):
+ return self.get_previous_by_pub_date(status__exact=1)
+
+ def get_next_published(self):
+ return self.get_next_by_pub_date(status__exact=1)
+
+ def get_tags(self):
+ return Tag.objects.get_for_object(self)
+
+ def comment_period_open(self):
+ return self.enable_comments and datetime.datetime.today() - datetime.timedelta(30) <= self.pub_date
+
+ def get_thumbnail_url(self):
+ if settings.DEVELOPMENT == True:
+ return '%s%s' %(settings.IMAGES_URL, self.thumbnail.url[35:])
+ else:
+ return '%s%s' %(settings.IMAGES_URL, self.thumbnail.url[33:])
+
+ def save(self):
+ html,lede = markdown_processor(self.body_markdown)
+ self.body_html = html
+ self.lede = lede
+ self.dek == markdown.markdown(self.dek, safe_mode = False)
+ super(Entry, self).save()
+
+class BlogSitemap(Sitemap):
+ changefreq = "never"
+ priority = 1.0
+
+ def items(self):
+ return Entry.objects.filter(status=1)
+
+ def lastmod(self, obj):
+ return obj.pub_date
+
+class LatestFull(Feed):
+ title = "Luxagraf: Topographical Writings"
+ link = "/writing/"
+ description = "Latest postings to luxagraf.net"
+ description_template = 'feeds/blog_description.html'
+
+ def items(self):
+ return Entry.objects.filter(status__exact=1).order_by('-pub_date')[:10]
+
+
+from django.dispatch import dispatcher
+from django.db.models import signals
+
+signals.post_save.connect(update_recent, sender=Entry)
+
diff --git a/apps/projects/urls.py b/apps/projects/urls.py
new file mode 100644
index 0000000..ed2dbfb
--- /dev/null
+++ b/apps/projects/urls.py
@@ -0,0 +1,15 @@
+from django.conf.urls.defaults import *
+from django.views.generic.list_detail import object_list
+from django.views.generic.simple import redirect_to,direct_to_template
+
+#from blog.models import Entry
+
+
+
+urlpatterns = patterns('',
+
+ #(r'(?P<slug>[-\w]+)/(?P<page>\d+)/$', 'blog.views.entry_list_by_area'),
+ #(r'(?P<page>\d+)/$', 'blog.views.entry_list'),
+ #(r'(?P<slug>[-\w]+)/$', redirect_to, {'url': '/writing/%(slug)s/1/'}),
+ (r'^$', direct_to_template, {'template': 'projects/base.html'}),
+)
diff --git a/base_urls.py b/base_urls.py
index 1fdc87b..44315e9 100644
--- a/base_urls.py
+++ b/base_urls.py
@@ -54,6 +54,7 @@ urlpatterns += patterns('',
#(r'^photo-of-the-day/$', 'luxagraf.photos.views.potd_list'),
(r'^sitemap.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}),
(r'^writing/', include('blog.urls')),
+ (r'^projects/', include('projects.urls')),
(r'^tops/', include('blog.urls')),
(r'^topics/(?P<slug>[-\w]+)/$', redirect_to, {'url': '/topics/%(slug)s/1/'}),
(r'^topics/(?P<slug>[-\w]+)/(?P<page>\d+)/', 'blog.views.topic_list'),
diff --git a/lib/pydelicious.py b/lib/pydelicious.py
index dd33788..8e45843 100644
--- a/lib/pydelicious.py
+++ b/lib/pydelicious.py
@@ -1,131 +1,126 @@
"""Library to access del.icio.us data via Python.
-:examples:
-
- Using the API class directly:
-
- >>> a = pydelicious.apiNew('user', 'passwd')
- >>> # or:
- >>> a = DeliciousAPI('user', 'passwd')
- >>> a.tags_get() # Same as:
- >>> a.request('tags/get', )
-
- Or by calling one of the methods on the module:
-
- - add(user, passwd, url, description, tags = "", extended = "", dt = "", replace="no")
- - get(user, passwd, tag="", dt="", count = 0)
- - get_all(user, passwd, tag = "")
- - delete(user, passwd, url)
- - rename_tag(user, passwd, oldtag, newtag)
- - get_tags(user, passwd)
-
- >>> a = apiNew(user, passwd)
- >>> a.posts_add(url="http://my.com/", desciption="my.com", extended="the url is my.moc", tags="my com")
- True
- >>> len(a.posts_all())
- 1
- >>> get_all(user, passwd)
- 1
-
- This are short functions for getrss calls.
-
- >>> rss_
-
-def get_userposts(user):
-def get_tagposts(tag):
-def get_urlposts(url):
-def get_popular(tag = ""):
-
- >>> json_posts()
- >>> json_tags()
- >>> json_network()
- >>> json_fans()
-
-:License: pydelicious is released under the BSD license. See 'license.txt'
- for more informations.
-
-:todo, bvb:
- - Rewriting comments to english. More documentation, examples.
- - Added JSON-like return values for XML data (del.icio.us also serves some JSON...)
- - better error/exception classes and handling, work in progress.
-
-:todo:
- - Source code SHOULD BE ASCII!
- - More tests.
- - handling different encodings, what, how?
- >>> pydelicious.getrss(tag="t[a]g")
- url: http://del.icio.us/rss/tag/t[a]g
- - Parse datetimes in XML.
- - Test RSS functionality? HTML scraping doesn't work yet?
- - API functions need required argument checks.
- - interesting functionality in other libraries (ruby, java, perl, etc)?
- - what is pydelicious used for?
- - license, readme docs via setup.py verdelen?
- - automatic releas build
-
-:done:
- * Refactored the API class, much cleaner now and functions dlcs_api_request, dlcs_parse_xml are available for who wants them.
+An introduction to the project is given in the README.
+pydelicious is released under the BSD license. See license.txt for details
+and the copyright holders.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+TODO:
+ - distribute license, readme docs via setup.py?
+ - automatic release build?
"""
import sys
import os
import time
import datetime
-import md5, httplib
-import urllib, urllib2, time
+import locale
+import httplib
+import urllib2
+from urllib import urlencode, quote_plus
from StringIO import StringIO
+from pprint import pformat
+
+v = sys.version_info
+if v[0] >= 2 and v[1] >= 5:
+ from hashlib import md5
+else:
+ from md5 import md5
try:
from elementtree.ElementTree import parse as parse_xml
except ImportError:
- from xml.etree.ElementTree import parse as parse_xml
+ # Python 2.5 and higher
+ from xml.etree.ElementTree import parse as parse_xml
-import feedparser
+try:
+ import feedparser
+except ImportError:
+ print >>sys.stderr, \
+ "Feedparser not available, no RSS parsing."
+ feedparser = None
### Static config
-__version__ = '0.5.0'
-__author__ = 'Frank Timmermann <regenkind_at_gmx_dot_de>' # GP: does not respond to emails
+__version__ = '0.5.3'
+__author__ = 'Frank Timmermann <regenkind_at_gmx_dot_de>'
+ # GP: does not respond to emails
__contributors__ = [
'Greg Pinero',
'Berend van Berkum <berend+pydelicious@dotmpe.com>']
__url__ = 'http://code.google.com/p/pydelicious/'
-__author_email__ = ""
# Old URL: 'http://deliciouspython.python-hosting.com/'
-
-__description__ = '''pydelicious.py allows you to access the web service of del.icio.us via it's API through python.'''
-__long_description__ = '''the goal is to design an easy to use and fully functional python interface to del.icio.us. '''
-
-DLCS_OK_MESSAGES = ('done', 'ok') # Known text values of positive del.icio.us <result> answers
+__author_email__ = ""
+__docformat__ = "restructuredtext en"
+__description__ = "pydelicious.py allows you to access the web service of " \
+ "del.icio.us via it's API through Python."
+__long_description__ = "The goal is to design an easy to use and fully " \
+ "functional Python interface to del.icio.us."
+
+DLCS_OK_MESSAGES = ('done', 'ok')
+"Known text values of positive del.icio.us <result/> answers"
DLCS_WAIT_TIME = 4
-DLCS_REQUEST_TIMEOUT = 444 # Seconds before socket triggers timeout
+"Time to wait between API requests"
+DLCS_REQUEST_TIMEOUT = 444
+"Seconds before socket triggers timeout"
#DLCS_API_REALM = 'del.icio.us API'
-DLCS_API_HOST = 'https://api.del.icio.us'
+DLCS_API_HOST = 'api.del.icio.us'
DLCS_API_PATH = 'v1'
-DLCS_API = "%s/%s" % (DLCS_API_HOST, DLCS_API_PATH)
+DLCS_API = "https://%s/%s" % (DLCS_API_HOST, DLCS_API_PATH)
DLCS_RSS = 'http://del.icio.us/rss/'
+DLCS_FEEDS = 'http://feeds.delicious.com/v2/'
+
+PREFERRED_ENCODING = locale.getpreferredencoding()
+# XXX: might need to check sys.platform/encoding combinations here, ie
+#if sys.platform == 'darwin' || PREFERRED_ENCODING == 'macroman:
+# PREFERRED_ENCODING = 'utf-8'
+if not PREFERRED_ENCODING:
+ PREFERRED_ENCODING = 'iso-8859-1'
ISO_8601_DATETIME = '%Y-%m-%dT%H:%M:%SZ'
-USER_AGENT = 'pydelicious.py/%s %s' % (__version__, __url__)
+USER_AGENT = 'pydelicious/%s %s' % (__version__, __url__)
DEBUG = 0
if 'DLCS_DEBUG' in os.environ:
DEBUG = int(os.environ['DLCS_DEBUG'])
-
-
-# Taken from FeedParser.py
-# timeoutsocket allows feedparser to time out rather than hang forever on ultra-slow servers.
-# Python 2.3 now has this functionality available in the standard socket library, so under
-# 2.3 you don't need to install anything. But you probably should anyway, because the socket
-# module is buggy and timeoutsocket is better.
+ if DEBUG:
+ print >>sys.stderr, \
+ "Set DEBUG to %i from DLCS_DEBUG env." % DEBUG
+
+HTTP_PROXY = None
+if 'HTTP_PROXY' in os.environ:
+ HTTP_PROXY = os.environ['HTTP_PROXY']
+ if DEBUG:
+ print >>sys.stderr, \
+ "Set HTTP_PROXY to %i from env." % HTTP_PROXY
+
+### Timeoutsocket hack taken from FeedParser.py
+
+# timeoutsocket allows feedparser to time out rather than hang forever on ultra-
+# slow servers. Python 2.3 now has this functionality available in the standard
+# socket library, so under 2.3 you don't need to install anything. But you
+# probably should anyway, because the socket module is buggy and timeoutsocket
+# is better.
try:
import timeoutsocket # http://www.timo-tasi.org/python/timeoutsocket.py
timeoutsocket.setDefaultSocketTimeout(DLCS_REQUEST_TIMEOUT)
except ImportError:
import socket
- if hasattr(socket, 'setdefaulttimeout'): socket.setdefaulttimeout(DLCS_REQUEST_TIMEOUT)
-if DEBUG: print >>sys.stderr, "Set socket timeout to %s seconds" % DLCS_REQUEST_TIMEOUT
+ if hasattr(socket, 'setdefaulttimeout'):
+ socket.setdefaulttimeout(DLCS_REQUEST_TIMEOUT)
+if DEBUG: print >>sys.stderr, \
+ "Set socket timeout to %s seconds" % DLCS_REQUEST_TIMEOUT
### Utility classes
@@ -163,91 +158,64 @@ class _Waiter:
Waiter = _Waiter(DLCS_WAIT_TIME)
+
class PyDeliciousException(Exception):
- '''Std. pydelicious error'''
- pass
+ """Standard pydelicious error"""
+class PyDeliciousThrottled(Exception): pass
+class PyDeliciousUnauthorized(Exception): pass
class DeliciousError(Exception):
"""Raised when the server responds with a negative answer"""
+ @staticmethod
+ def raiseFor(error_string, path, **params):
+ if error_string == 'item already exists':
+ raise DeliciousItemExistsError, params['url']
+ else:
+ raise DeliciousError, "%s, while calling <%s?%s>" % (error_string,
+ path, urlencode(params))
-class DefaultErrorHandler(urllib2.HTTPDefaultErrorHandler):
- '''xxx, bvb: Where is this used? should it be registered somewhere with urllib2?
-
- Handles HTTP Error, currently only 503.
- '''
- def http_error_503(self, req, fp, code, msg, headers):
- raise urllib2.HTTPError(req, code, throttled_message, headers, fp)
-
+class DeliciousItemExistsError(DeliciousError):
+ """Raised then adding an already existing post."""
-class post(dict):
- """Post object, contains href, description, hash, dt, tags,
- extended, user, count(, shared).
- xxx, bvb: Not used in DeliciousAPI
- """
- def __init__(self, href="", description="", hash="", time="", tag="", extended="", user="", count="",
- tags="", url="", dt=""): # tags or tag?
- self["href"] = href
- if url != "": self["href"] = url
- self["description"] = description
- self["hash"] = hash
- self["dt"] = dt
- if time != "": self["dt"] = time
- self["tags"] = tags
- if tag != "": self["tags"] = tag # tag or tags? # !! tags
- self["extended"] = extended
- self["user"] = user
- self["count"] = count
-
- def __getattr__(self, name):
- try: return self[name]
- except: object.__getattribute__(self, name)
-
-
-class posts(list):
- def __init__(self, *args):
- for i in args: self.append(i)
-
- def __getattr__(self, attr):
- try: return [p[attr] for p in self]
- except: object.__getattribute__(self, attr)
+class HTTPErrorHandler(urllib2.HTTPDefaultErrorHandler):
-### Utility functions
+ def http_error_401(self, req, fp, code, msg, headers):
+ raise PyDeliciousUnauthorized, "Check credentials."
-def str2uni(s):
- # type(in) str or unicode
- # type(out) unicode
- return ("".join([unichr(ord(i)) for i in s]))
+ def http_error_503(self, req, fp, code, msg, headers):
+ # Retry-After?
+ errmsg = "Try again later."
+ if 'Retry-After' in headers:
+ errmsg = "You may try again after %s" % headers['Retry-After']
+ raise PyDeliciousThrottled, errmsg
-def str2utf8(s):
- # type(in) str or unicode
- # type(out) str
- return ("".join([unichr(ord(i)).encode("utf-8") for i in s]))
-def str2quote(s):
- return urllib.quote_plus("".join([unichr(ord(i)).encode("utf-8") for i in s]))
+### Utility functions
def dict0(d):
- # Trims empty dict entries
- # {'a':'a', 'b':'', 'c': 'c'} => {'a': 'a', 'c': 'c'}
- dd = dict()
- for i in d:
- if d[i] != "": dd[i] = d[i]
- return dd
+ "Removes empty string values from dictionary"
+ return dict([(k,v) for k,v in d.items()
+ if v=='' and isinstance(v, basestring)])
+
def delicious_datetime(str):
"""Parse a ISO 8601 formatted string to a Python datetime ...
"""
return datetime.datetime(*time.strptime(str, ISO_8601_DATETIME)[0:6])
-def http_request(url, user_agent=USER_AGENT, retry=4):
+
+def http_request(url, user_agent=USER_AGENT, retry=4, opener=None):
"""Retrieve the contents referenced by the URL using urllib2.
Retries up to four times (default) on exceptions.
"""
request = urllib2.Request(url, headers={'User-Agent':user_agent})
+ if not opener:
+ opener = urllib2.build_opener()
+
# Remember last error
e = None
@@ -255,9 +223,10 @@ def http_request(url, user_agent=USER_AGENT, retry=4):
tries = retry;
while tries:
try:
- return urllib2.urlopen(request)
+ return opener.open(request)
- except urllib2.HTTPError, e: # protocol errors,
+ except urllib2.HTTPError, e:
+ # reraise unexpected protocol errors as PyDeliciousException
raise PyDeliciousException, "%s" % e
except urllib2.URLError, e:
@@ -273,50 +242,99 @@ def http_request(url, user_agent=USER_AGENT, retry=4):
raise PyDeliciousException, \
"Unable to retrieve data at '%s', %s" % (url, e)
-def http_auth_request(url, host, user, passwd, user_agent=USER_AGENT):
- """Call an HTTP server with authorization credentials using urllib2.
+
+def build_api_opener(host, user, passwd, extra_handlers=() ):
"""
+ Build a urllib2 style opener with HTTP Basic authorization for one host
+ and additional error handling. If HTTP_PROXY is set a proxyhandler is also
+ added.
+ """
+
+ global DEBUG
+
if DEBUG: httplib.HTTPConnection.debuglevel = 1
- # Hook up handler/opener to urllib2
password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(None, host, user, passwd)
auth_handler = urllib2.HTTPBasicAuthHandler(password_manager)
- opener = urllib2.build_opener(auth_handler)
- urllib2.install_opener(opener)
- return http_request(url, user_agent)
+ extra_handlers += ( HTTPErrorHandler(), )
+ if HTTP_PROXY:
+ extra_handlers += ( urllib2.ProxyHandler( {'http': HTTP_PROXY} ), )
+
+ return urllib2.build_opener(auth_handler, *extra_handlers)
+
+
+def dlcs_api_opener(user, passwd):
+ "Build an opener for DLCS_API_HOST, see build_api_opener()"
-def dlcs_api_request(path, params='', user='', passwd='', throttle=True):
+ return build_api_opener(DLCS_API_HOST, user, passwd)
+
+
+def dlcs_api_request(path, params='', user='', passwd='', throttle=True,
+ opener=None):
"""Retrieve/query a path within the del.icio.us API.
This implements a minimum interval between calls to avoid
throttling. [#]_ Use param 'throttle' to turn this behaviour off.
- todo: back off on 503's (HTTPError, URLError? testing
-
- Returned XML does not always correspond with given del.icio.us examples
- [#]_.
-
.. [#] http://del.icio.us/help/api/
"""
if throttle:
Waiter()
if params:
- # params come as a dict, strip empty entries and urlencode
- url = "%s/%s?%s" % (DLCS_API, path, urllib.urlencode(dict0(params)))
+ url = "%s/%s?%s" % (DLCS_API, path, urlencode(params))
else:
url = "%s/%s" % (DLCS_API, path)
- if DEBUG: print >>sys.stderr, "dlcs_api_request: %s" % url
+ if DEBUG: print >>sys.stderr, \
+ "dlcs_api_request: %s" % url
- try:
- return http_auth_request(url, DLCS_API_HOST, user, passwd, USER_AGENT)
+ if not opener:
+ opener = dlcs_api_opener(user, passwd)
+
+ fl = http_request(url, opener=opener)
+
+ if DEBUG>2: print >>sys.stderr, \
+ pformat(fl.info().headers)
+
+ return fl
+
+
+def dlcs_encode_params(params, usercodec=PREFERRED_ENCODING):
+ """Turn all param values (int, list, bool) into utf8 encoded strings.
+ """
+
+ if params:
+ for key in params.keys():
+ if isinstance(params[key], bool):
+ if params[key]:
+ params[key] = 'yes'
+ else:
+ params[key] = 'no'
+
+ elif isinstance(params[key], int):
+ params[key] = str(params[key])
+
+ elif not params[key]:
+ # strip/ignore empties other than False or 0
+ del params[key]
+ continue
+
+ elif isinstance(params[key], list):
+ params[key] = " ".join(params[key])
+
+ elif not isinstance(params[key], unicode):
+ params[key] = params[key].decode(usercodec)
+
+ assert isinstance(params[key], basestring)
+
+ params = dict([ (k, v.encode('utf8'))
+ for k, v in params.items() if v])
+
+ return params
- # bvb: Is this ever raised? When?
- except DefaultErrorHandler, e:
- print >>sys.stderr, "%s" % e
def dlcs_parse_xml(data, split_tags=False):
"""Parse any del.icio.us XML document and return Python data structure.
@@ -332,6 +350,7 @@ def dlcs_parse_xml(data, split_tags=False):
{'result':(True, "done")}
# etcetera.
"""
+ # TODO: split_tags is not implemented
if DEBUG>3: print >>sys.stderr, "dlcs_parse_xml: parsing from ", data
@@ -367,55 +386,67 @@ def dlcs_parse_xml(data, split_tags=False):
else:
msg = root.text
- # Return {'result':(True, msg)} for /known/ O.K. messages,
- # use (False, msg) otherwise
+ # XXX: Return {'result':(True, msg)} for /known/ O.K. messages,
+ # use (False, msg) otherwise. Move this to DeliciousAPI?
v = msg in DLCS_OK_MESSAGES
return {fmt: (v, msg)}
elif fmt == 'update':
# Update: "time"
- #return {fmt: root.attrib}
- return {fmt: {'time':time.strptime(root.attrib['time'], ISO_8601_DATETIME)}}
+ return {fmt: {
+ 'time':time.strptime(root.attrib['time'], ISO_8601_DATETIME) }}
else:
raise PyDeliciousException, "Unknown XML document format '%s'" % fmt
-def dlcs_rss_request(tag = "", popular = 0, user = "", url = ''):
- """Handle a request for RSS
-
- todo: translate from German
- rss sollte nun wieder funktionieren, aber diese try, except scheisse ist so nicht schoen
+def dlcs_rss_request(tag="", popular=0, user="", url=''):
+ """Parse a RSS request.
- rss wird unterschiedlich zusammengesetzt. ich kann noch keinen einheitlichen zusammenhang
- zwischen daten (url, desc, ext, usw) und dem feed erkennen. warum k[o]nnen die das nicht einheitlich machen?
+ This requests old (now undocumented?) URL paths that still seem to work.
"""
- tag = str2quote(tag)
- user = str2quote(user)
+
+ tag = quote_plus(tag)
+ user = quote_plus(user)
+
if url != '':
# http://del.icio.us/rss/url/efbfb246d886393d48065551434dab54
- url = DLCS_RSS + '''url/%s'''%md5.new(url).hexdigest()
+ url = DLCS_RSS + 'url/%s' % md5(url).hexdigest()
+
elif user != '' and tag != '':
- url = DLCS_RSS + '''%(user)s/%(tag)s'''%dict(user=user, tag=tag)
+ url = DLCS_RSS + '%(user)s/%(tag)s' % {'user':user, 'tag':tag}
+
elif user != '' and tag == '':
# http://del.icio.us/rss/delpy
- url = DLCS_RSS + '''%s'''%user
+ url = DLCS_RSS + '%s' % user
+
elif popular == 0 and tag == '':
url = DLCS_RSS
+
elif popular == 0 and tag != '':
# http://del.icio.us/rss/tag/apple
# http://del.icio.us/rss/tag/web2.0
- url = DLCS_RSS + "tag/%s"%tag
+ url = DLCS_RSS + "tag/%s" % tag
+
elif popular == 1 and tag == '':
- url = DLCS_RSS + '''popular/'''
+ url = DLCS_RSS + 'popular/'
+
elif popular == 1 and tag != '':
- url = DLCS_RSS + '''popular/%s'''%tag
+ url = DLCS_RSS + 'popular/%s' % tag
+
+ if DEBUG:
+ print 'dlcs_rss_request', url
+
rss = http_request(url).read()
+
+ # assert feedparser, "dlcs_rss_request requires feedparser to be installed."
+ if not feedparser:
+ return rss
+
rss = feedparser.parse(rss)
- # print rss
-# for e in rss.entries: print e;print
- l = posts()
+
+ posts = []
for e in rss.entries:
if e.has_key("links") and e["links"]!=[] and e["links"][0].has_key("href"):
url = e["links"][0]["href"]
@@ -453,59 +484,147 @@ def dlcs_rss_request(tag = "", popular = 0, user = "", url = ''):
# die benennung der variablen ist nicht einheitlich
# api senden und
# xml bekommen sind zwei verschiedene schuhe :(
- l.append(post(url = url, description = description, tags = tags, dt = dt, extended = extended, user = user))
- return l
+ posts.append({'url':url, 'description':description, 'tags':tags,
+ 'dt':dt, 'extended':extended, 'user':user})
+ return posts
+
+
+delicious_v2_feeds = {
+ #"Bookmarks from the hotlist"
+ '': "%(format)s",
+ #"Recent bookmarks"
+ 'recent': "%(format)s/recent",
+ #"Recent bookmarks by tag"
+ 'tagged': "%(format)s/tag/%(tags)s",
+ #"Popular bookmarks"
+ 'popular': "%(format)s/popular",
+ #"Popular bookmarks by tag"
+ 'popular_tagged': "%(format)s/popular/%(tag)s",
+ #"Recent site alerts (as seen in the top-of-page alert bar on the site)"
+ 'alerts': "%(format)s/alerts",
+ #"Bookmarks for a specific user"
+ 'user': "%(format)s/%(username)s",
+ #"Bookmarks for a specific user by tag(s)"
+ 'user_tagged': "%(format)s/%(username)s/%(tags)s",
+ #"Public summary information about a user (as seen in the network badge)"
+ 'user_info': "%(format)s/userinfo/%(username)s",
+ #"A list of all public tags for a user"
+ 'user_tags': "%(format)s/tags/%(username)s",
+ #"Bookmarks from a user's subscriptions"
+ 'user_subscription': "%(format)s/subscriptions/%(username)s",
+ #"Private feed for a user's inbox bookmarks from others"
+ 'user_inbox': "%(format)s/inbox/%(username)s?private=%(key)s",
+ #"Bookmarks from members of a user's network"
+ 'user_network': "%(format)s/network/%(username)s",
+ #"Bookmarks from members of a user's network by tag"
+ 'user_network_tagged': "%(format)s/network/%(username)s/%(tags)s",
+ #"A list of a user's network members"
+ 'user_network_member': "%(format)s/networkmembers/%(username)s",
+ #"A list of a user's network fans"
+ 'user_network_fan': "%(format)s/networkfans/%(username)s",
+ #"Recent bookmarks for a URL"
+ 'url': "%(format)s/url/%(urlmd5)s",
+ #"Summary information about a URL (as seen in the tagometer)"
+ 'urlinfo': "json/urlinfo/%(urlmd5)s",
+}
+
+def dlcs_feed(name_or_url, url_map=delicious_v2_feeds, count=15, **params):
+
+ """
+ Request and parse a feed. See delicious_v2_feeds for available names and
+ required parameters. Format defaults to json.
+ """
+
+# http://delicious.com/help/feeds
+# TODO: plain or fancy
+
+ format = params.setdefault('format', 'json')
+ if count == 'all':
+# TODO: fetch all
+ print >>sys.stderr, "! Maxcount 100 "
+ count = 100
+
+ if name_or_url in url_map:
+ params['count'] = count
+ url = DLCS_FEEDS + url_map[name_or_url] % params
+
+ else:
+ url = name_or_url
+
+ if DEBUG:
+ print 'dlcs_feed', url
+
+ feed = http_request(url).read()
+
+ if format == 'rss':
+ if feedparser:
+ rss = feedparser.parse(feed)
+ return rss
+
+ else:
+ return feed
+
+ elif format == 'json':
+ return feed
### Main module class
class DeliciousAPI:
- """Class providing main interace to del.icio.us API.
+
+ """A single-user Python facade to the del.icio.us HTTP API.
+
+ See http://delicious.com/help/api.
Methods ``request`` and ``request_raw`` represent the core. For all API
paths there are furthermore methods (e.g. posts_add for 'posts/all') with
- an explicit declaration of the parameters and documentation. These all call
- ``request`` and pass on extra keywords like ``_raw``.
+ an explicit declaration of parameters and documentation.
"""
- def __init__(self, user, passwd, codec='iso-8859-1', api_request=dlcs_api_request, xml_parser=dlcs_parse_xml):
- """Initialize access to the API with ``user`` and ``passwd``.
+ def __init__(self, user, passwd, codec=PREFERRED_ENCODING,
+ api_request=dlcs_api_request, xml_parser=dlcs_parse_xml,
+ build_opener=dlcs_api_opener, encode_params=dlcs_encode_params):
+
+ """Initialize access to the API for ``user`` with ``passwd``.
- ``codec`` sets the encoding of the arguments.
+ ``codec`` sets the encoding of the arguments, which defaults to the
+ users preferred locale.
The ``api_request`` and ``xml_parser`` parameters by default point to
- functions within this package with standard implementations to
+ functions within this package with standard implementations which
request and parse a resource. See ``dlcs_api_request()`` and
- ``dlcs_parse_xml()``. Note that ``api_request`` should return a
- file-like instance with an HTTPMessage instance under ``info()``,
- see ``urllib2.openurl`` for more info.
+ ``dlcs_parse_xml()``.
+
+ Parameter ``build_opener`` is a callable that, provided with the
+ credentials, should build a urllib2 opener for the delicious API server
+ with HTTP authentication. See ``dlcs_api_opener()`` for the default
+ implementation.
+
+ ``encode_params`` finally preprocesses API parameters before
+ they are passed to ``api_request``.
"""
+
assert user != ""
self.user = user
self.passwd = passwd
self.codec = codec
# Implement communication to server and parsing of respons messages:
+ assert callable(encode_params)
+ self._encode_params = encode_params
+ assert callable(build_opener)
+ self._opener = build_opener(user, passwd)
assert callable(api_request)
self._api_request = api_request
assert callable(xml_parser)
self._parse_response = xml_parser
- def _call_server(self, path, **params):
- params = dict0(params)
- for key in params:
- params[key] = params[key].encode(self.codec)
-
- # see __init__ for _api_request()
- return self._api_request(path, params, self.user, self.passwd)
-
-
### Core functionality
def request(self, path, _raw=False, **params):
- """Calls a path in the API, parses the answer to a JSON-like structure by
- default. Use with ``_raw=True`` or ``call request_raw()`` directly to
- get the filehandler and process the response message manually.
+ """Sends a request message to `path` in the API, and parses the results
+ from XML. Use with ``_raw=True`` or ``call request_raw()`` directly
+ to get the filehandler and process the response message manually.
Calls to some paths will return a `result` message, i.e.::
@@ -515,46 +634,56 @@ class DeliciousAPI:
<result>...</result>
- These are all parsed to ``{'result':(Boolean, MessageString)}`` and this
- method will raise ``DeliciousError`` on negative `result` answers. Using
- ``_raw=True`` bypasses all parsing and will never raise ``DeliciousError``.
+ These should all be parsed to ``{'result':(Boolean, MessageString)}``,
+ this method raises a ``DeliciousError`` on negative `result` answers.
+ Positive answers are silently accepted and nothing is returned.
+
+ Using ``_raw=True`` bypasses all parsing and never raises
+ ``DeliciousError``.
See ``dlcs_parse_xml()`` and ``self.request_raw()``."""
- # method _parse_response is bound in `__init__()`, `_call_server`
- # uses `_api_request` also set in `__init__()`
if _raw:
# return answer
return self.request_raw(path, **params)
else:
+ params = self._encode_params(params, self.codec)
+
# get answer and parse
- fl = self._call_server(path, **params)
+ fl = self._api_request(path, params=params, opener=self._opener)
rs = self._parse_response(fl)
- # Raise an error for negative 'result' answers
- if type(rs) == dict and rs == 'result' and not rs['result'][0]:
- errmsg = ""
- if len(rs['result'])>0:
- errmsg = rs['result'][1:]
- raise DeliciousError, errmsg
+ if type(rs) == dict and 'result' in rs:
+ if not rs['result'][0]:
+ # Raise an error for negative 'result' answers
+ errmsg = ""
+ if len(rs['result'])>0:
+ errmsg = rs['result'][1]
+ DeliciousError.raiseFor(errmsg, path, **params)
+
+ else:
+ # not out-of-the-oridinary result, OK
+ return
return rs
def request_raw(self, path, **params):
- """Calls the path in the API, returns the filehandle. Returned
- file-like instances have an ``HTTPMessage`` instance with HTTP header
+ """Calls the path in the API, returns the filehandle. Returned file-
+ like instances have an ``HTTPMessage`` instance with HTTP header
information available. Use ``filehandle.info()`` or refer to the
``urllib2.openurl`` documentation.
"""
# see `request()` on how the response can be handled
- return self._call_server(path, **params)
+ params = self._encode_params(params, self.codec)
+ return self._api_request(path, params=params, opener=self._opener)
### Explicit declarations of API paths, their parameters and docs
# Tags
def tags_get(self, **kwds):
- """Returns a list of tags and the number of times it is used by the user.
+ """Returns a list of tags and the number of times it is used by the
+ user.
::
<tags>
@@ -562,14 +691,22 @@ class DeliciousAPI:
"""
return self.request("tags/get", **kwds)
+ def tags_delete(self, tag, **kwds):
+ """Delete an existing tag.
+
+ &tag={TAG}
+ (required) Tag to delete
+ """
+ return self.request('tags/delete', tag=tag, **kwds)
+
def tags_rename(self, old, new, **kwds):
"""Rename an existing tag with a new tag name. Returns a `result`
message or raises an ``DeliciousError``. See ``self.request()``.
- &old (required)
- Tag to rename.
- &new (required)
- New name.
+ &old={TAG}
+ (required) Tag to rename.
+ &new={TAG}
+ (required) New tag name.
"""
return self.request("tags/rename", old=old, new=new, **kwds)
@@ -590,12 +727,12 @@ class DeliciousAPI:
<dates>
<date date="CCYY-MM-DD" count="888">
- &tag (optional).
- Filter by this tag.
+ &tag={TAG}
+ (optional) Filter by this tag
"""
return self.request("posts/dates", tag=tag, **kwds)
- def posts_get(self, tag="", dt="", url="", **kwds):
+ def posts_get(self, tag="", dt="", url="", hashes=[], meta=True, **kwds):
"""Returns posts matching the arguments. If no date or url is given,
most recent date will be used.
::
@@ -603,14 +740,25 @@ class DeliciousAPI:
<posts dt="CCYY-MM-DD" tag="..." user="...">
<post ...>
- &tag (optional).
- Filter by this tag.
- &dt (optional).
- Filter by this date (CCYY-MM-DDThh:mm:ssZ).
- &url (optional).
- Filter by this url.
+ &tag={TAG} {TAG} ... {TAG}
+ (optional) Filter by this/these tag(s).
+ &dt={CCYY-MM-DDThh:mm:ssZ}
+ (optional) Filter by this date, defaults to the most recent date on
+ which bookmarks were saved.
+ &url={URL}
+ (optional) Fetch a bookmark for this URL, regardless of date.
+ &hashes={MD5} {MD5} ... {MD5}
+ (optional) Fetch multiple bookmarks by one or more URL MD5s
+ regardless of date.
+ &meta=yes
+ (optional) Include change detection signatures on each item in a
+ 'meta' attribute. Clients wishing to maintain a synchronized local
+ store of bookmarks should retain the value of this attribute - its
+ value will change when any significant field of the bookmark
+ changes.
"""
- return self.request("posts/get", tag=tag, dt=dt, url=url, **kwds)
+ return self.request("posts/get", tag=tag, dt=dt, url=url,
+ hashes=hashes, meta=meta, **kwds)
def posts_recent(self, tag="", count="", **kwds):
"""Returns a list of the most recent posts, filtered by argument.
@@ -619,14 +767,15 @@ class DeliciousAPI:
<posts tag="..." user="...">
<post ...>
- &tag (optional).
- Filter by this tag.
- &count (optional).
- Number of items to retrieve (Default:15, Maximum:100).
+ &tag={TAG}
+ (optional) Filter by this tag.
+ &count={1..100}
+ (optional) Number of items to retrieve (Default:15, Maximum:100).
"""
return self.request("posts/recent", tag=tag, count=count, **kwds)
- def posts_all(self, tag="", **kwds):
+ def posts_all(self, tag="", start=None, results=None, fromdt=None,
+ todt=None, meta=True, hashes=False, **kwds):
"""Returns all posts. Please use sparingly. Call the `posts_update`
method to see if you need to fetch this at all.
::
@@ -634,13 +783,34 @@ class DeliciousAPI:
<posts tag="..." user="..." update="CCYY-MM-DDThh:mm:ssZ">
<post ...>
- &tag (optional).
- Filter by this tag.
+ &tag
+ (optional) Filter by this tag.
+ &start={#}
+ (optional) Start returning posts this many results into the set.
+ &results={#}
+ (optional) Return this many results.
+ &fromdt={CCYY-MM-DDThh:mm:ssZ}
+ (optional) Filter for posts on this date or later
+ &todt={CCYY-MM-DDThh:mm:ssZ}
+ (optional) Filter for posts on this date or earlier
+ &meta=yes
+ (optional) Include change detection signatures on each item in a
+ 'meta' attribute. Clients wishing to maintain a synchronized local
+ store of bookmarks should retain the value of this attribute - its
+ value will change when any significant field of the bookmark
+ changes.
+ &hashes
+ (optional, exclusive) Do not fetch post details but a posts
+ manifest with url- and meta-hashes. Other options do not apply.
"""
- return self.request("posts/all", tag=tag, **kwds)
+ if hashes:
+ return self.request("posts/all", hashes=hashes, **kwds)
+ else:
+ return self.request("posts/all", tag=tag, fromdt=fromdt, todt=todt,
+ start=start, results=results, meta=meta, **kwds)
def posts_add(self, url, description, extended="", tags="", dt="",
- replace="no", shared="yes", **kwds):
+ replace=False, shared=True, **kwds):
"""Add a post to del.icio.us. Returns a `result` message or raises an
``DeliciousError``. See ``self.request()``.
@@ -654,10 +824,12 @@ class DeliciousAPI:
tags for the item (space delimited).
&dt (optional)
datestamp of the item (format "CCYY-MM-DDThh:mm:ssZ").
-
- Requires a LITERAL "T" and "Z" like in ISO8601 at http://www.cl.cam.ac.uk/~mgk25/iso-time.html for example: "1984-09-01T14:21:31Z"
- &replace=no (optional) - don't replace post if given url has already been posted.
- &shared=no (optional) - make the item private
+ Requires a LITERAL "T" and "Z" like in ISO8601 at
+ http://www.cl.cam.ac.uk/~mgk25/iso-time.html for example:
+ "1984-09-01T14:21:31Z"
+ &replace=no (optional) - don't replace post if given url has already
+ been posted.
+ &shared=yes (optional) - wether the item is public.
"""
return self.request("posts/add", url=url, description=description,
extended=extended, tags=tags, dt=dt,
@@ -690,7 +862,7 @@ class DeliciousAPI:
&bundle (required)
the bundle name.
&tags (required)
- list of tags (space seperated).
+ list of tags.
"""
if type(tags)==list:
tags = " ".join(tags)
@@ -710,19 +882,22 @@ class DeliciousAPI:
# Lookup table for del.icio.us url-path to DeliciousAPI method.
paths = {
- 'tags/get': tags_get,
- 'tags/rename': tags_rename,
- 'posts/update': posts_update,
- 'posts/dates': posts_dates,
- 'posts/get': posts_get,
- 'posts/recent': posts_recent,
- 'posts/all': posts_all,
- 'posts/add': posts_add,
- 'posts/delete': posts_delete,
- 'tags/bundles/all': bundles_all,
- 'tags/bundles/set': bundles_set,
- 'tags/bundles/delete': bundles_delete,
+ 'tags/get': 'tags_get',
+ 'tags/delete': 'tags_delete',
+ 'tags/rename': 'tags_rename',
+ 'posts/update': 'posts_update',
+ 'posts/dates': 'posts_dates',
+ 'posts/get': 'posts_get',
+ 'posts/recent': 'posts_recent',
+ 'posts/all': 'posts_all',
+ 'posts/add': 'posts_add',
+ 'posts/delete': 'posts_delete',
+ 'tags/bundles/all': 'bundles_all',
+ 'tags/bundles/set': 'bundles_set',
+ 'tags/bundles/delete': 'bundles_delete',
}
+ def get_method(self, path):
+ return getattr(self, self.paths[path])
def get_url(self, url):
"""Return the del.icio.us url at which the HTML page with posts for
@@ -730,41 +905,55 @@ class DeliciousAPI:
"""
return "http://del.icio.us/url/?url=%s" % (url,)
+ def __repr__(self):
+ return "DeliciousAPI(%s)" % self.user
+
### Convenience functions on this package
def apiNew(user, passwd):
- """creates a new DeliciousAPI object.
- requires user(name) and passwd
- """
+ "Creates a new DeliciousAPI object, requires user(name) and passwd."
return DeliciousAPI(user=user, passwd=passwd)
-def add(user, passwd, url, description, tags="", extended="", dt="", replace="no"):
- return apiNew(user, passwd).posts_add(url=url, description=description, extended=extended, tags=tags, dt=dt, replace=replace)
+def add(user, passwd, url, description, tags="", extended="", dt=None,
+ replace=False):
+ apiNew(user, passwd).posts_add(url=url, description=description,
+ extended=extended, tags=tags, dt=dt, replace=replace)
-def get(user, passwd, tag="", dt="", count = 0):
- posts = apiNew(user, passwd).posts_get(tag=tag,dt=dt)
- if count != 0: posts = posts[0:count]
+def get(user, passwd, tag="", dt=None, count=0, hashes=[]):
+ "Returns a list of posts for the user"
+ posts = apiNew(user, passwd).posts_get(
+ tag=tag, dt=dt, hashes=hashes)['posts']
+ if count: posts = posts[:count]
return posts
-def get_all(user, passwd, tag=""):
- return apiNew(user, passwd).posts_all(tag=tag)
+def get_update(user, passwd):
+ "Returns the last update time for the user."
+ return apiNew(user, passwd).posts_update()['update']['time']
+
+def get_all(user, passwd, tag="", start=0, results=100, fromdt=None,
+ todt=None):
+ "Returns a list with all posts. Please use sparingly. See `get_updated`"
+ return apiNew(user, passwd).posts_all(tag=tag, start=start,
+ results=results, fromdt=fromdt, todt=todt, meta=True)['posts']
+
+def get_tags(user, passwd):
+ "Returns a list with all tags for user."
+ return apiNew(user=user, passwd=passwd).tags_get()['tags']
def delete(user, passwd, url):
- return apiNew(user, passwd).posts_delete(url=url)
+ "Delete the URL from the del.icio.us account."
+ apiNew(user, passwd).posts_delete(url=url)
def rename_tag(user, passwd, oldtag, newtag):
- return apiNew(user=user, passwd=passwd).tags_rename(old=oldtag, new=newtag)
+ "Rename the tag for the del.icio.us account."
+ apiNew(user=user, passwd=passwd).tags_rename(old=oldtag, new=newtag)
-def get_tags(user, passwd):
- return apiNew(user=user, passwd=passwd).tags_get()
+### RSS functions
-### RSS functions bvb: still working...?
def getrss(tag="", popular=0, url='', user=""):
- """get posts from del.icio.us via parsing RSS (bvb:or HTML)
-
- todo: not tested
+ """Get posts from del.icio.us via parsing RSS.
tag (opt) sort by tag
popular (opt) look for the popular stuff
@@ -774,44 +963,83 @@ def getrss(tag="", popular=0, url='', user=""):
return dlcs_rss_request(tag=tag, popular=popular, user=user, url=url)
def get_userposts(user):
- return getrss(user = user)
+ "parse RSS for user"
+ return getrss(user=user)
def get_tagposts(tag):
- return getrss(tag = tag)
+ "parse RSS for tag"
+ return getrss(tag=tag)
def get_urlposts(url):
- return getrss(url = url)
+ "parse RSS for URL"
+ return getrss(url=url)
+
+def get_popular(tag=""):
+ "parse RSS for popular URLS for tag"
+ return getrss(tag=tag, popular=1)
-def get_popular(tag = ""):
- return getrss(tag = tag, popular = 1)
+### JSON feeds
+# TODO: untested
-### TODO: implement JSON fetching
-def json_posts(user, count=15):
- """http://del.icio.us/feeds/json/mpe
- http://del.icio.us/feeds/json/mpe/art+history
- count=### the number of posts you want to get (default is 15, maximum is 100)
- raw a raw JSON object is returned, instead of an object named Delicious.posts
+def json_posts(user, count=15, tag=None, raw=True):
"""
+ user
+ count=### the number of posts you want to get (default is 15, maximum
+ is 100)
+ raw a raw JSON object is returned, instead of an object named
+ Delicious.posts
+ """
+ url = "http://del.icio.us/feeds/json/" + \
+ dlcs_encode_params({0:user})[0]
+ if tag: url += '/'+dlcs_encode_params({0:tag})[0]
+
+ return dlcs_feed(url, count=count, raw=raw)
-def json_tags(user, atleast, count, sort='alpha'):
- """http://del.icio.us/feeds/json/tags/mpe
- atleast=### include only tags for which there are at least ### number of posts
- count=### include ### tags, counting down from the top
- sort={alpha|count} construct the object with tags in alphabetic order (alpha), or by count of posts (count)
- callback=NAME wrap the object definition in a function call NAME(...), thus invoking that function when the feed is executed
- raw a pure JSON object is returned, instead of code that will construct an object named Delicious.tags
+
+def json_tags(user, atleast, count, sort='alpha', raw=True, callback=None):
+ """
+ user
+ atleast=### include only tags for which there are at least ###
+ number of posts.
+ count=### include ### tags, counting down from the top.
+ sort={alpha|count} construct the object with tags in alphabetic order
+ (alpha), or by count of posts (count).
+ callback=NAME wrap the object definition in a function call NAME(...),
+ thus invoking that function when the feed is executed.
+ raw a pure JSON object is returned, instead of code that
+ will construct an object named Delicious.tags.
"""
+ url = 'http://del.icio.us/feeds/json/tags/' + \
+ dlcs_encode_params({0:user})[0]
+ return dlcs_feed(url, atleast=atleast, count=count, sort=sort, raw=raw,
+ callback=callback)
-def json_network(user):
- """http://del.icio.us/feeds/json/network/mpe
+
+def json_network(user, raw=True, callback=None):
+ """
callback=NAME wrap the object definition in a function call NAME(...)
- ?raw a raw JSON object is returned, instead of an object named Delicious.posts
+ ?raw a raw JSON object is returned, instead of an object named
+ Delicious.posts
"""
+ url = 'http://del.icio.us/feeds/json/network/' + \
+ dlcs_encode_params({0:user})[0]
+ return dlcs_feed(url, raw=raw, callback=callback)
-def json_fans(user):
- """http://del.icio.us/feeds/json/fans/mpe
+
+def json_fans(user, raw=True, callback=None):
+ """
callback=NAME wrap the object definition in a function call NAME(...)
- ?raw a pure JSON object is returned, instead of an object named Delicious.
+ ?raw a pure JSON object is returned, instead of an object named
+ Delicious.
"""
+ url = 'http://del.icio.us/feeds/json/fans/' + \
+ dlcs_encode_params({0:user})[0]
+ return dlcs_feed(url, raw=raw, callback=callback)
+
+
+### delicious V2 feeds
+
+def getfeed(name, **params):
+ return dlcs_feed(name, **params)
diff --git a/media/css/base.css b/media/css/base.css
index 33d1e10..2b65bb8 100644
--- a/media/css/base.css
+++ b/media/css/base.css
@@ -31,7 +31,7 @@ body {
font-size: 93.75%;
/* line height of 24 px */
line-height: 23px;
- color: #000;
+ color: #241d13;
}
body {height:100%;text-align: center;}
@@ -60,35 +60,40 @@ blockquote, blockquote p { font-size: 14px !important; margin: 1.2em !important;
/* global header and nav elements */
-header {margin-bottom: 55px;text-align: center;}
-header nav ul { margin: 35px auto 0;text-align: center;}
-header nav li {display: inline; font-style: italic; font-size: 11px; margin: 0 0 2px 0; letter-spacing: 1px;}
+header {margin: 15px auto 0; width: 700px; padding-bottom: 85px;text-align: center;}
+header nav {float: left;margin-left: 35px; margin-top: 2px; letter-spacing: .10em}
+header nav.rt { float: left; margin: 2px 0 0 0; clear:right;}
+header nav ul { margin: 0 auto 0;}
+header nav li {display: block; text-align: right; font-size: 11px; margin: 0 0 2px 0; line-height: 19px; text-transform: uppercase;}
+header nav.rt li {text-align: left;}
+header hgroup {float: left;}
header hgroup h1,
header hgroup h1 a {
- font: 40px/40px Georgia, "Times New Roman", Times, Serif;
+ font: 44px/44px Georgia, "Times New Roman", Times, Serif;
text-transform: uppercase;
- letter-spacing: 4px;
+ letter-spacing: 6px;
color: #b53a04 !important;
+ width: 480px;
}
header hgroup h1 a:hover, header hgroup h2 a:hover { color: #736357 !important; }
header hgroup h2 {
font-size: 18px;
- line-height: 26px;
+ line-height: 30px;
font-weight: normal;
text-transform: uppercase;
letter-spacing: 2px;
font-style: italic;
}
-header hgroup h2 a {color: #b53a04 !important;}
+header hgroup h2, header hgroup h2 a {color: #b53a04 !important;}
/* global article styles */
article h1,
article h1 a {
- font: 48px/48px Georgia, "Times New Roman", Times, Serif;
+ font: 42px/48px Georgia, "Times New Roman", Times, Serif;
font-style: normal;
- color: #000 !important;
+ color: #241d13 !important;
margin: 55px 0 5px 0;
border: none;
text-align: center;
@@ -113,7 +118,7 @@ body.writing-detail article section#post p:nth-of-type(1), body#home article sec
-article {margin: 0 auto; width: 560px;}
+article {margin: 0 auto; width: 530px;}
.all-link { color: #888; text-align: center; margin: 12px 0 22px;text-transform: uppercase; font-size: 80%;font-style: italic; }
.all-link a {border: none;}
@@ -149,8 +154,8 @@ body#home section#writing-archive ul h3 {font-size: 22px; line-height: 28px; mar
body#home section#writing-archive ul h3 a {border: none;}
body#home section#writing-archive ul li {clear:both; padding: 18px 0; color: #888;}
body#home section#writing-archive ul li:first-child {padding-top: 0;}
-body#home section#writing-archive ul li img {border: #000 10px solid; float: left; margin: 4px 18px 0 0; background: #f3f;}
-body#home section#writing-archive ul li p.intro {float:left; color: #000; width: 375px; margin: 6px 0 0 0;}
+body#home section#writing-archive ul li img {border: #000 10px solid; float: left; margin: 4px 18px 0 0; }
+body#home section#writing-archive ul li p.intro {float:left; color: #000; width: 345px; margin: 6px 0 0 0;}
@@ -171,8 +176,8 @@ body#writing article ul h3 {font-size: 26px; line-height: 34px; margin: 36px 0 8
body#writing article ul h3 a {border: none;}
body#writing article ul li {clear:both; padding: 24px 0; color: #888;}
body#writing article ul li:first-child {padding-top: 0;}
-body#writing article ul li img {border: #000 10px solid; float: left; margin: 4px 18px 0 0; background: #f3f;}
-body#writing article ul li p.intro {float:left; color: #000; width: 375px; margin:0;}
+body#writing article ul li img {border: #000 10px solid; float: left; margin: 4px 18px 0 0;}
+body#writing article ul li p.intro {float:left; color: #000; width: 345px; margin:0;}
@@ -208,10 +213,11 @@ aside h4 {
margin: 8px 0 2px;
}
aside ul li { margin-left: 4px; font-size: 80%; line-height: 20px;}
-aside.meta { float: none; text-align: center; margin: 22px 0 22px 0; color: #888; text-transform: uppercase; font-size: 80%;font-style: italic;}
-aside.meta a {color: #888; border: none;}
-aside.meta span {line-height: 18px;}
+aside.meta { float: none; text-align: center; margin: 22px 0 22px 0; color: #736357; font-size: 12px;}
+aside.meta a {color: #736357; border: none;}
+aside.meta span {line-height: 16px;}
aside.meta .topics {display: block;}
+aside.meta div.geo {letter-spacing: .10em; font-size: 13px;text-transform: uppercase;}
/* Writing Detail Pages */
.all-link {display: block;color: #888; text-align: center; margin: 12px 0 22px;}
@@ -263,6 +269,10 @@ section#comments h4 {
section#comments h4 span {font-size: 90%; font-style: italic;}
section p.pull-quote {text-align: center; font-style: italic;font-size: 14px !important; line-height: 18px !important;margin-bottom: 24px;}
span.credit {display: block;}
+/* Projects */
+dl.lprog dd {text-indent: 15px;}
+dl.lprog {margin: 44px 0 22px 0;}
+
/*contact form*/
.form-holder {width: 500px; margin: 40px auto;}
@@ -289,7 +299,7 @@ footer section h4 {
padding-bottom: 3px;
color: #333;
}
-footer section p {margin: 0; }
+footer section p {margin: 0; padding-bottom: 20px;}
footer section ul li {list-style-type: none; margin-left: 4px;}
footer ul li img {margin-right:5px;
position:relative;
@@ -338,4 +348,5 @@ p.update {font-size: 12px !important; line-height: 18px !important;}
#dsq-comments-title {display: none;}
#dsq-new-post {padding: 10px !important; background:#ded1c0 !important; margin-top: 50px !important}
.disqus-link-count {text-decoration: none; border: none;}
-a.disqus-link-count:hover {color: #222 !important; cursor:pointer !important;} \ No newline at end of file
+a.disqus-link-count:hover {color: #222 !important; cursor:pointer !important;}
+span.alert { color: red;} \ No newline at end of file
diff --git a/media/js/combo.pack.js b/media/js/combo.pack.js
new file mode 100644
index 0000000..43dd9f0
--- /dev/null
+++ b/media/js/combo.pack.js
@@ -0,0 +1,668 @@
+/*
+ * jQuery 1.2.3 - 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-02-06 00:21:25 -0500 (Wed, 06 Feb 2008) $
+ * $Rev: 4663 $
+ */
+(function(){if(window.jQuery)var _jQuery=window.jQuery;var jQuery=window.jQuery=function(selector,context){return new jQuery.prototype.init(selector,context);};if(window.$)var _$=window.$;window.$=jQuery;var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;var isSimple=/^.[^:#\[\.]*$/;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}else 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);else{this[0]=elem;this.length=1;return this;}else
+selector=[];}}else
+return new jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return new jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(selector.constructor==Array&&selector||(selector.jquery||selector.length&&selector!=window&&!selector.nodeType&&selector[0]!=undefined&&selector[0].nodeType)&&jQuery.makeArray(selector)||[selector]);},jquery:"1.2.3",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;this.each(function(i){if(this==elem)ret=i;});return ret;},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value==undefined)return this.length&&jQuery[type||"attr"](this[0],name)||undefined;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!selector?this:this.pushStack(jQuery.merge(this.get(),selector.constructor==String?jQuery(selector).get():selector.length!=undefined&&(!selector.nodeName||jQuery.nodeName(selector,"form"))?selector:[selector]));},is:function(selector){return selector?jQuery.multiFilter(selector,this).length>0:false;},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;}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=value.constructor==Array?value:[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.length?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==null){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data==undefined&&this.length)data=jQuery.data(this[0],key);return data==null&&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.prototype.init.prototype=jQuery.prototype;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);}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==1){target=this;i=0;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){if(target===options[name])continue;if(deep&&options[name]&&typeof options[name]=="object"&&target[name]&&!options[name].nodeType)target[name]=jQuery.extend(target[name],options[name]);else if(options[name]!=undefined)target[name]=options[name];}return target;};var expando="jQuery"+(new Date()).getTime(),uuid=0,windowData={};var exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i;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&&/function/i.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.appendChild(script);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){if(args){if(object.length==undefined){for(var name in object)if(callback.apply(object[name],args)===false)break;}else
+for(var i=0,length=object.length;i<length;i++)if(callback.apply(object[i],args)===false)break;}else{if(object.length==undefined){for(var name in object)if(callback.call(object[name],name,object[name])===false)break;}else
+for(var i=0,length=object.length,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;function color(elem){if(!jQuery.browser.safari)return false;var ret=document.defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(elem.style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=elem.style.outline;elem.style.outline="0 solid black";elem.style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&elem.style&&elem.style[name])ret=elem.style[name];else if(document.defaultView&&document.defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var getComputedStyle=document.defaultView.getComputedStyle(elem,null);if(getComputedStyle&&!color(elem))ret=getComputedStyle.getPropertyValue(name);else{var swap=[],stack=[];for(var a=elem;a&&color(a);a=a.parentNode)stack.unshift(a);for(var i=0;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":(getComputedStyle&&getComputedStyle.getPropertyValue(name))||"";for(var 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 style=elem.style.left,runtimeStyle=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;elem.style.left=ret||0;ret=elem.style.pixelLeft+"px";elem.style.left=style;elem.runtimeStyle.left=runtimeStyle;}}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=elem.toString();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 fix=jQuery.isXMLDoc(elem)?{}:jQuery.props;if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(fix[name]){if(value!=undefined)elem[fix[name]]=value;return elem[fix[name]];}else if(jQuery.browser.msie&&name=="style")return jQuery.attr(elem.style,"cssText",value);else if(value==undefined&&jQuery.browser.msie&&jQuery.nodeName(elem,"form")&&(name=="action"||name=="method"))return elem.getAttributeNode(name).nodeValue;else if(elem.tagName){if(value!=undefined){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem.setAttribute(name,""+value);}if(jQuery.browser.msie&&/href|src/.test(name)&&!jQuery.isXMLDoc(elem))return elem.getAttribute(name,2);return elem.getAttribute(name);}else{if(name=="opacity"&&jQuery.browser.msie){if(value!=undefined){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseFloat(value).toString()=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100).toString():"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(value!=undefined)elem[name]=value;return elem[name];}},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(typeof array!="array")for(var i=0,length=array.length;i<length;i++)ret.push(array[i]);else
+ret=array.slice(0);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){if(jQuery.browser.msie){for(var i=0;second[i];i++)if(second[i].nodeType!=8)first.push(second[i]);}else
+for(var i=0;second[i];i++)first.push(second[i]);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)||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&&value!=undefined){if(value.constructor!=Array)value=[value];ret=ret.concat(value);}}return 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,innerHTML:"innerHTML",className:"className",value:"value",disabled:"disabled",checked:"checked",readonly:"readOnly",selected:"selected",maxlength:"maxLength",selectedIndex:"selectedIndex",defaultValue:"defaultValue",tagName:"tagName",nodeName:"nodeName"}});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");};});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;var re=quickChild;var 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=[];var 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&&(!elem||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!=undefined)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=function(){return fn.apply(this,arguments);};handler.data=data;handler.guid=fn.guid;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){var val;if(typeof jQuery=="undefined"||jQuery.event.triggered)return val;val=jQuery.event.handle.apply(arguments.callee.elem,arguments);return val;});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(this.fix({type:type,target:elem}));data[0].type=type;if(exclusive)data[0].exclusive=true;if(jQuery.isFunction(jQuery.data(elem,"handle")))val=jQuery.data(elem,"handle").apply(elem,data);if(!fn&&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;event=jQuery.event.fix(event||window.event||{});var parts=event.type.split(".");event.type=parts[0];var handlers=jQuery.data(this,"events")&&jQuery.data(this,"events")[event.type],args=Array.prototype.slice.call(arguments,1);args.unshift(event);for(var j in handlers){var handler=handlers[j];args[0].handler=handler;args[0].data=handler.data;if(!parts[1]&&!event.exclusive||handler.type==parts[1]){var ret=handler.apply(this,args);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}if(jQuery.browser.msie)event.target=event.preventDefault=event.stopPropagation=event.handler=event.data=null;return val;},fix:function(event){var originalEvent=event;event=jQuery.extend({},originalEvent);event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=originalEvent.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;},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;arguments[0].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;arguments[0].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){return this.each(function(){jQuery.event.add(this,type,function(event){jQuery(this).unbind(event);return(fn||data).apply(this,arguments);},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){if(this[0])return jQuery.event.trigger(type,data,this[0],false,fn);return undefined;},toggle:function(){var args=arguments;return this.click(function(event){this.lastToggle=0==this.lastToggle?1:0;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.apply(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:function(url,params,callback){if(jQuery.isFunction(url))return this.bind("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=(new Date).getTime();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:{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){var jsonp,jsre=/=\?(&|$)/g,status,data;s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(s.type.toLowerCase()=="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&&s.type.toLowerCase()=="get"){var ts=(new Date()).getTime();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&s.type.toLowerCase()=="get"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");if((!s.url.indexOf("http")||!s.url.indexOf("//"))&&s.dataType=="script"&&s.type.toLowerCase()=="get"){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 xml=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();xml.open(s.type,s.url,s.async,s.username,s.password);try{if(s.data)xml.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xml.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xml.setRequestHeader("X-Requested-With","XMLHttpRequest");xml.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend)s.beforeSend(xml);if(s.global)jQuery.event.trigger("ajaxSend",[xml,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xml&&(xml.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xml)&&"error"||s.ifModified&&jQuery.httpNotModified(xml,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xml,s.dataType);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xml.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
+jQuery.handleError(s,xml,status);complete();if(s.async)xml=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xml){xml.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xml.send(s.data);}catch(e){jQuery.handleError(s,xml,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xml,s]);}function complete(){if(s.complete)s.complete(xml,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xml,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xml;},handleError:function(s,xml,status,e){if(s.error)s.error(xml,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xml,s,e]);},active:0,httpSuccess:function(r){try{return!r.status&&location.protocol=="file:"||(r.status>=200&&r.status<300)||r.status==304||r.status==1223||jQuery.browser.safari&&r.status==undefined;}catch(e){}return false;},httpNotModified:function(xml,url){try{var xmlRes=xml.getResponseHeader("Last-Modified");return xml.status==304||xmlRes==jQuery.lastModified[url]||jQuery.browser.safari&&xml.status==undefined;}catch(e){}return false;},httpData:function(r,type){var ct=r.getResponseHeader("content-type");var xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0;var data=xml?r.responseXML:r.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";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(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(fn,fn2):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);var hidden=jQuery(this).is(":hidden"),self=this;for(var p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return jQuery.isFunction(opt.complete)&&opt.complete.apply(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.apply(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)return undefined;type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",array?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].apply(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:{slow:600,fast:200}[opt.duration])||400;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.apply(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.apply(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=(new Date()).getTime();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=(new Date()).getTime();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&&jQuery.isFunction(this.options.complete))this.options.complete.apply(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.fx.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),fixed=jQuery.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&&jQuery.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(jQuery.css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&jQuery.css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||jQuery.css(offsetChild,"position")=="absolute"))||(mozilla&&jQuery.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)||0;top+=parseInt(t)||0;}return results;};})();
+
+/**
+ * Galleria (http://monc.se/kitchen)
+ *
+ * Galleria is a javascript image gallery written in jQuery.
+ * It loads the images one by one from an unordered list and displays thumbnails when each image is loaded.
+ * It will create thumbnails for you if you choose so, scaled or unscaled,
+ * centered and cropped inside a fixed thumbnail box defined by CSS.
+ *
+ * The core of Galleria lies in it's smart preloading behaviour, snappiness and the fresh absence
+ * of obtrusive design elements. Use it as a foundation for your custom styled image gallery.
+ *
+ * MAJOR CHANGES v.FROM 0.9
+ * Galleria now features a useful history extension, enabling back button and bookmarking for each image.
+ * The main image is no longer stored inside each list item, instead it is placed inside a container
+ * onImage and onThumb functions lets you customize the behaviours of the images on the site
+ *
+ * Tested in Safari 3, Firefox 2, MSIE 6, MSIE 7, Opera 9
+ *
+ * Version 1.0
+ * Februari 21, 2008
+ *
+ * Copyright (c) 2008 David Hellsing (http://monc.se)
+ * Licensed under the GPL licenses.
+ * http://www.gnu.org/licenses/gpl.txt
+ **/
+
+;(function($){
+
+var $$;
+
+
+/**
+ *
+ * @desc Convert images from a simple html <ul> into a thumbnail gallery
+ * @author David Hellsing
+ * @version 1.0
+ *
+ * @name Galleria
+ * @type jQuery
+ *
+ * @cat plugins/Media
+ *
+ * @example $('ul.gallery').galleria({options});
+ * @desc Create a a gallery from an unordered list of images with thumbnails
+ * @options
+ * insert: (selector string) by default, Galleria will create a container div before your ul that holds the image.
+ * You can, however, specify a selector where the image will be placed instead (f.ex '#main_img')
+ * history: Boolean for setting the history object in action with enabled back button, bookmarking etc.
+ * onImage: (function) a function that gets fired when the image is displayed and brings the jQuery image object.
+ * You can use it to add click functionality and effects.
+ * f.ex onImage(image) { image.css('display','none').fadeIn(); } will fadeIn each image that is displayed
+ * onThumb: (function) a function that gets fired when the thumbnail is displayed and brings the jQuery thumb object.
+ * Works the same as onImage except it targets the thumbnail after it's loaded.
+ *
+**/
+
+$$ = $.fn.galleria = function($options) {
+
+ // check for basic CSS support
+ if (!$$.hasCSS()) { return false; }
+
+ // init the modified history object
+ $.historyInit($$.onPageLoad);
+
+ // set default options
+ var $defaults = {
+ insert : '.galleria_container',
+ history : true,
+ clickNext : true,
+ onImage : function(image,caption,thumb) {},
+ onThumb : function(thumb) {}
+ };
+
+
+ // extend the options
+ var $opts = $.extend($defaults, $options);
+
+ // bring the options to the galleria object
+ for (var i in $opts) {
+ $.galleria[i] = $opts[i];
+ }
+
+ // if no insert selector, create a new division and insert it before the ul
+ var _insert = ( $($opts.insert).is($opts.insert) ) ?
+ $($opts.insert) :
+ jQuery(document.createElement('div')).insertBefore(this);
+
+ // create a wrapping div for the image
+ var _div = $(document.createElement('div')).addClass('galleria_wrapper');
+
+ // create a caption span
+ var _span = $(document.createElement('span')).addClass('caption');
+
+ // inject the wrapper in in the insert selector
+ _insert.addClass('galleria_container').append(_div).append(_span);
+
+ //-------------
+
+ return this.each(function(){
+
+ // add the Galleria class
+ $(this).addClass('galleria');
+
+ // loop through list
+ $(this).children('li').each(function(i) {
+
+ // bring the scope
+ var _container = $(this);
+
+ // build element specific options
+ var _o = $.meta ? $.extend({}, $opts, _container.data()) : $opts;
+
+ // remove the clickNext if image is only child
+ _o.clickNext = $(this).is(':only-child') ? false : _o.clickNext;
+
+ // try to fetch an anchor
+ var _a = $(this).find('a').is('a') ? $(this).find('a') : false;
+
+ // reference the original image as a variable and hide it
+ var _img = $(this).children('img').css('display','none');
+
+ // extract the original source
+ var _src = _a ? _a.attr('href') : _img.attr('src');
+
+ // find a title
+ var _title = _a ? i + ":" + _a.attr('title') : i + ":" + _img.attr('title');
+
+ // create loader image
+ var _loader = new Image();
+
+ // check url and activate container if match
+ if (_o.history && (window.location.hash && window.location.hash.replace(/\#/,'') == _src)) {
+ _container.siblings('.active').removeClass('active');
+ _container.addClass('active');
+ }
+
+ // begin loader
+ $(_loader).load(function () {
+
+ // try to bring the alt
+ $(this).attr('alt',_img.attr('alt'));
+
+ //-----------------------------------------------------------------
+ // the image is loaded, let's create the thumbnail
+
+ var _thumb = _a ?
+ _a.find('img').addClass('thumb noscale').css('display','none') :
+ _img.clone(true).addClass('thumb').css('display','none');
+
+ if (_a) { _a.replaceWith(_thumb); }
+
+ if (!_thumb.hasClass('noscale')) { // scaled tumbnails!
+ var w = Math.ceil( _img.width() / _img.height() * _container.height() );
+ var h = Math.ceil( _img.height() / _img.width() * _container.width() );
+ if (w < h) {
+ _thumb.css({ height: 'auto', width: _container.width(), marginTop: -(h-_container.height())/2 });
+ } else {
+ _thumb.css({ width: 'auto', height: _container.height(), marginLeft: -(w-_container.width())/2 });
+ }
+ } else { // Center thumbnails.
+ // a tiny timer fixed the width/height
+ window.setTimeout(function() {
+ _thumb.css({
+ marginLeft: -( _thumb.width() - _container.width() )/2,
+ marginTop: -( _thumb.height() - _container.height() )/2
+ });
+ }, 1);
+ }
+
+ // add the rel attribute
+ _thumb.attr('rel',_src);
+
+ // add the title attribute
+ _thumb.attr('title',_title);
+
+ // add the click functionality to the _thumb
+ _thumb.click(function() {
+ $.galleria.activate(_src);
+ });
+
+ // hover classes for IE6
+ _thumb.hover(
+ function() { $(this).addClass('hover'); },
+ function() { $(this).removeClass('hover'); }
+ );
+ _container.hover(
+ function() { _container.addClass('hover'); },
+ function() { _container.removeClass('hover'); }
+ );
+
+ // prepend the thumbnail in the container
+ _container.prepend(_thumb);
+
+ // show the thumbnail
+ _thumb.css('display','block');
+
+ // call the onThumb function
+ _o.onThumb(jQuery(_thumb));
+
+ // check active class and activate image if match
+ if (_container.hasClass('active')) {
+ $.galleria.activate(_src);
+ //_span.text(_title);
+ }
+
+ //-----------------------------------------------------------------
+
+ // finally delete the original image
+ _img.remove();
+
+ }).error(function () {
+
+ // Error handling
+ _container.html('<span class="error" style="color:red">Error loading image: '+_src+'</span>');
+
+ }).attr('src', _src);
+ });
+ });
+};
+
+/**
+ *
+ * @name NextSelector
+ *
+ * @desc Returns the sibling sibling, or the first one
+ *
+**/
+
+$$.nextSelector = function(selector) {
+ return $(selector).is(':last-child') ?
+ $(selector).siblings(':first-child') :
+ $(selector).next();
+
+};
+
+/**
+ *
+ * @name previousSelector
+ *
+ * @desc Returns the previous sibling, or the last one
+ *
+**/
+
+$$.previousSelector = function(selector) {
+ return $(selector).is(':first-child') ?
+ $(selector).siblings(':last-child') :
+ $(selector).prev();
+
+};
+
+/**
+ *
+ * @name hasCSS
+ *
+ * @desc Checks for CSS support and returns a boolean value
+ *
+**/
+
+$$.hasCSS = function() {
+ $('body').append(
+ $(document.createElement('div')).attr('id','css_test')
+ .css({ width:'1px', height:'1px', display:'none' })
+ );
+ var _v = ($('#css_test').width() != 1) ? false : true;
+ $('#css_test').remove();
+ return _v;
+};
+
+/**
+ *
+ * @name onPageLoad
+ *
+ * @desc The function that displays the image and alters the active classes
+ *
+ * Note: This function gets called when:
+ * 1. after calling $.historyInit();
+ * 2. after calling $.historyLoad();
+ * 3. after pushing "Go Back" button of a browser
+ *
+**/
+
+$$.onPageLoad = function(_src) {
+
+ // get the wrapper
+ var _wrapper = $('.galleria_wrapper');
+
+ // get the thumb
+ var _thumb = $('.galleria img[@rel="'+_src+'"]');
+
+ if (_src) {
+
+ // new hash location
+ if ($.galleria.history) {
+ window.location = window.location.href.replace(/\#.*/,'') + '#' + _src;
+ }
+
+ // alter the active classes
+ _thumb.parents('li').siblings('.active').removeClass('active');
+ _thumb.parents('li').addClass('active');
+
+ // define a new image
+ var _img = $(new Image()).attr('src',_src).addClass('replaced');
+
+ // empty the wrapper and insert the new image
+ _wrapper.empty().append(_img);
+
+ // insert the caption
+ _wrapper.siblings('.caption').text(_thumb.attr('title'));
+
+ // fire the onImage function to customize the loaded image's features
+ $.galleria.onImage(_img,_wrapper.siblings('.caption'),_thumb);
+
+ // add clickable image helper
+ if($.galleria.clickNext) {
+ _img.css('cursor','pointer').click(function() { $.galleria.next(); })
+ }
+
+ //center image
+ var _replaced = $('.replaced');
+ var _container = $('.galleria_container');
+ _replaced.css({
+ marginTop: -( _replaced.height() - _container.height() )/2
+ });
+
+ } else {
+
+ // clean up the container if none are active
+ _wrapper.siblings().andSelf().empty();
+
+ // remove active classes
+ $('.galleria li.active').removeClass('active');
+ }
+
+ // place the source in the galleria.current variable
+ $.galleria.current = _src;
+
+}
+
+/**
+ *
+ * @name jQuery.galleria
+ *
+ * @desc The global galleria object holds four constant variables and four public methods:
+ * $.galleria.history = a boolean for setting the history object in action with named URLs
+ * $.galleria.current = is the current source that's being viewed.
+ * $.galleria.clickNext = boolean helper for adding a clickable image that leads to the next one in line
+ * $.galleria.next() = displays the next image in line, returns to first image after the last.
+ * $.galleria.prev() = displays the previous image in line, returns to last image after the first.
+ * $.galleria.activate(_src) = displays an image from _src in the galleria container.
+ * $.galleria.onImage(image,caption) = gets fired when the image is displayed.
+ *
+**/
+
+$.extend({galleria : {
+ current : '',
+ onImage : function(){},
+ activate : function(_src) {
+ if ($.galleria.history) {
+ $.historyLoad(_src);
+ } else {
+ $$.onPageLoad(_src);
+ }
+ },
+ next : function() {
+ var _next = $($$.nextSelector($('.galleria img[@rel="'+$.galleria.current+'"]').parents('li'))).find('img').attr('rel');
+ $.galleria.activate(_next);
+ },
+ prev : function() {
+ var _prev = $($$.previousSelector($('.galleria img[@rel="'+$.galleria.current+'"]').parents('li'))).find('img').attr('rel');
+ $.galleria.activate(_prev);
+ }
+}
+});
+
+})(jQuery);
+
+
+/**
+ *
+ * Packed history extension for jQuery
+ * Credits to http://www.mikage.to/
+ *
+**/
+
+
+jQuery.extend({historyCurrentHash:undefined,historyCallback:undefined,historyInit:function(callback){jQuery.historyCallback=callback;var current_hash=location.hash;jQuery.historyCurrentHash=current_hash;if(jQuery.browser.msie){if(jQuery.historyCurrentHash==''){jQuery.historyCurrentHash='#'}$("body").prepend('<iframe id="jQuery_history" style="display: none;"></iframe>');var ihistory=$("#jQuery_history")[0];var iframe=ihistory.contentWindow.document;iframe.open();iframe.close();iframe.location.hash=current_hash}else if($.browser.safari){jQuery.historyBackStack=[];jQuery.historyBackStack.length=history.length;jQuery.historyForwardStack=[];jQuery.isFirst=true}jQuery.historyCallback(current_hash.replace(/^#/,''));setInterval(jQuery.historyCheck,100)},historyAddHistory:function(hash){jQuery.historyBackStack.push(hash);jQuery.historyForwardStack.length=0;this.isFirst=true},historyCheck:function(){if(jQuery.browser.msie){var ihistory=$("#jQuery_history")[0];var iframe=ihistory.contentDocument||ihistory.contentWindow.document;var current_hash=iframe.location.hash;if(current_hash!=jQuery.historyCurrentHash){location.hash=current_hash;jQuery.historyCurrentHash=current_hash;jQuery.historyCallback(current_hash.replace(/^#/,''))}}else if($.browser.safari){if(!jQuery.dontCheck){var historyDelta=history.length-jQuery.historyBackStack.length;if(historyDelta){jQuery.isFirst=false;if(historyDelta<0){for(var i=0;i<Math.abs(historyDelta);i++)jQuery.historyForwardStack.unshift(jQuery.historyBackStack.pop())}else{for(var i=0;i<historyDelta;i++)jQuery.historyBackStack.push(jQuery.historyForwardStack.shift())}var cachedHash=jQuery.historyBackStack[jQuery.historyBackStack.length-1];if(cachedHash!=undefined){jQuery.historyCurrentHash=location.hash;jQuery.historyCallback(cachedHash)}}else if(jQuery.historyBackStack[jQuery.historyBackStack.length-1]==undefined&&!jQuery.isFirst){if(document.URL.indexOf('#')>=0){jQuery.historyCallback(document.URL.split('#')[1])}else{var current_hash=location.hash;jQuery.historyCallback('')}jQuery.isFirst=true}}}else{var current_hash=location.hash;if(current_hash!=jQuery.historyCurrentHash){jQuery.historyCurrentHash=current_hash;jQuery.historyCallback(current_hash.replace(/^#/,''))}}},historyLoad:function(hash){var newhash;if(jQuery.browser.safari){newhash=hash}else{newhash='#'+hash;location.hash=newhash}jQuery.historyCurrentHash=newhash;if(jQuery.browser.msie){var ihistory=$("#jQuery_history")[0];var iframe=ihistory.contentWindow.document;iframe.open();iframe.close();iframe.location.hash=newhash;jQuery.historyCallback(hash)}else if(jQuery.browser.safari){jQuery.dontCheck=true;this.historyAddHistory(hash);var fn=function(){jQuery.dontCheck=false};window.setTimeout(fn,200);jQuery.historyCallback(hash);location.hash=newhash}else{jQuery.historyCallback(hash)}}});
+
+//hotkeys
+(function (jQuery){
+ this.version = '(beta)(0.0.3)';
+ this.all = {};
+ this.special_keys = {
+ 27: 'esc', 9: 'tab', 32:'space', 13: 'return', 8:'backspace', 145: 'scroll', 20: 'capslock',
+ 144: 'numlock', 19:'pause', 45:'insert', 36:'home', 46:'del',35:'end', 33: 'pageup',
+ 34:'pagedown', 37:'left', 38:'up', 39:'right',40:'down', 112:'f1',113:'f2', 114:'f3',
+ 115:'f4', 116:'f5', 117:'f6', 118:'f7', 119:'f8', 120:'f9', 121:'f10', 122:'f11', 123:'f12'};
+
+ this.shift_nums = { "`":"~", "1":"!", "2":"@", "3":"#", "4":"$", "5":"%", "6":"^", "7":"&",
+ "8":"*", "9":"(", "0":")", "-":"_", "=":"+", ";":":", "'":"\"", ",":"<",
+ ".":">", "/":"?", "\\":"|" };
+
+ this.add = function(combi, options, callback) {
+ if (jQuery.isFunction(options)){
+ callback = options;
+ options = {};
+ }
+ var opt = {},
+ defaults = {type: 'keydown', propagate: false, disableInInput: false, target: jQuery('html')[0], checkParent: true},
+ that = this;
+ opt = jQuery.extend( opt , defaults, options || {} );
+ combi = combi.toLowerCase();
+
+ // inspect if keystroke matches
+ var inspector = function(event) {
+ event = jQuery.event.fix(event); // jQuery event normalization.
+ var element = event.target;
+ // @ TextNode -> nodeType == 3
+ element = (element.nodeType==3) ? element.parentNode : element;
+
+ if(opt['disableInInput']) { // Disable shortcut keys in Input, Textarea fields
+ var target = jQuery(element);
+ if( target.is("input") || target.is("textarea")){
+ return;
+ }
+ }
+ var code = event.which,
+ type = event.type,
+ character = String.fromCharCode(code).toLowerCase(),
+ special = that.special_keys[code],
+ shift = event.shiftKey,
+ ctrl = event.ctrlKey,
+ alt= event.altKey,
+ propagate = true, // default behaivour
+ mapPoint = null;
+
+ // in opera + safari, the event.target is unpredictable.
+ // for example: 'keydown' might be associated with HtmlBodyElement
+ // or the element where you last clicked with your mouse.
+ if (jQuery.browser.opera || jQuery.browser.safari || opt.checkParent){
+ while (!that.all[element] && element.parentNode){
+ element = element.parentNode;
+ }
+ }
+
+ var cbMap = that.all[element].events[type].callbackMap;
+ if(!shift && !ctrl && !alt) { // No Modifiers
+ mapPoint = cbMap[special] || cbMap[character]
+ }
+ // deals with combinaitons (alt|ctrl|shift+anything)
+ else{
+ var modif = '';
+ if(alt) modif +='alt+';
+ if(ctrl) modif+= 'ctrl+';
+ if(shift) modif += 'shift+';
+ // modifiers + special keys or modifiers + characters or modifiers + shift characters
+ mapPoint = cbMap[modif+special] || cbMap[modif+character] || cbMap[modif+that.shift_nums[character]]
+ }
+ if (mapPoint){
+ mapPoint.cb(event);
+ if(!mapPoint.propagate) {
+ event.stopPropagation();
+ event.preventDefault();
+ return false;
+ }
+ }
+ };
+ // first hook for this element
+ if (!this.all[opt.target]){
+ this.all[opt.target] = {events:{}};
+ }
+ if (!this.all[opt.target].events[opt.type]){
+ this.all[opt.target].events[opt.type] = {callbackMap: {}}
+ jQuery.event.add(opt.target, opt.type, inspector);
+ }
+ this.all[opt.target].events[opt.type].callbackMap[combi] = {cb: callback, propagate:opt.propagate};
+ return jQuery;
+ };
+ this.remove = function(exp, opt) {
+ opt = opt || {};
+ target = opt.target || jQuery('html')[0];
+ type = opt.type || 'keydown';
+ exp = exp.toLowerCase();
+ delete this.all[target].events[type].callbackMap[exp]
+ return jQuery;
+ };
+ jQuery.hotkeys = this;
+ return jQuery;
+})(jQuery);
+
+
+//carousel
+eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(9($){$.1s.B=9(o){z 4.1b(9(){3h r(4,o)})};8 q={W:J,23:1,1X:1,u:7,15:3,17:7,1I:\'2O\',2b:\'2E\',1i:0,C:7,1h:7,1D:7,2x:7,2w:7,2v:7,2t:7,2r:7,2q:7,2o:7,1Q:\'<Y></Y>\',1P:\'<Y></Y>\',2k:\'2j\',2g:\'2j\',1L:7,1J:7};$.B=9(e,o){4.5=$.1a({},q,o||{});4.P=J;4.E=7;4.H=7;4.t=7;4.U=7;4.Q=7;4.N=!4.5.W?\'1E\':\'27\';4.F=!4.5.W?\'26\':\'25\';6(e.20==\'3p\'||e.20==\'3n\'){4.t=$(e);4.E=4.t.1p();6($.D.1e(4.E[0].D,\'B-H\')){6(!$.D.1e(4.E[0].3k.D,\'B-E\'))4.E=4.E.C(\'<Y></Y>\');4.E=4.E.1p()}10 6(!$.D.1e(4.E[0].D,\'B-E\'))4.E=4.t.C(\'<Y></Y>\').1p();8 a=e.D.3g(\' \');1n(8 i=0;i<a.O;i++){6(a[i].3c(\'B-3b\')!=-1){4.t.1y(a[i]);4.E.R(a[i]);1m}}}10{4.E=$(e);4.t=$(e).2m(\'32,2Z\')}4.H=4.t.1p();6(!4.H.O||!$.D.1e(4.H[0].D,\'B-H\'))4.H=4.t.C(\'<Y></Y>\').1p();4.Q=$(\'.B-13\',4.E);6(4.Q.u()==0&&4.5.1P!=7)4.Q=4.H.1w(4.5.1P).13();4.Q.R(4.D(\'B-13\'));4.U=$(\'.B-16\',4.E);6(4.U.u()==0&&4.5.1Q!=7)4.U=4.H.1w(4.5.1Q).13();4.U.R(4.D(\'B-16\'));4.H.R(4.D(\'B-H\'));4.t.R(4.D(\'B-t\'));4.E.R(4.D(\'B-E\'));8 b=4.5.17!=7?1k.1M(4.1j()/4.5.17):7;8 c=4.t.2m(\'1u\');8 d=4;6(c.u()>0){8 f=0,i=4.5.1X;c.1b(9(){d.1O(4,i++);f+=d.T(4,b)});4.t.y(4.N,f+\'S\');6(!o||o.u==L)4.5.u=c.u()}4.E.y(\'1x\',\'1B\');4.U.y(\'1x\',\'1B\');4.Q.y(\'1x\',\'1B\');4.2p=9(){d.16()};4.2s=9(){d.13()};$(2D).1W(\'2B\',9(){d.29()});6(4.5.1h!=7)4.5.1h(4,\'28\');4.1F()};8 r=$.B;r.1s=r.2z={B:\'0.2.2\'};r.1s.1a=r.1a=$.1a;r.1s.1a({1F:9(){4.A=7;4.G=7;4.Z=7;4.11=7;4.14=J;4.1c=7;4.M=7;4.V=J;6(4.P)z;4.t.y(4.F,4.1r(4.5.1X)+\'S\');8 p=4.1r(4.5.23);4.Z=4.11=7;4.1g(p,J)},24:9(){4.t.22();4.t.y(4.F,\'21\');4.t.y(4.N,\'21\');6(4.5.1h!=7)4.5.1h(4,\'24\');4.1F()},29:9(){6(4.M!=7&&4.V)4.t.y(4.F,r.K(4.t.y(4.F))+4.M);4.M=7;4.V=J;6(4.5.1D!=7)4.5.1D(4);6(4.5.17!=7){8 a=4;8 b=1k.1M(4.1j()/4.5.17),N=0,F=0;$(\'1u\',4.t).1b(9(i){N+=a.T(4,b);6(i+1<a.A)F=N});4.t.y(4.N,N+\'S\');4.t.y(4.F,-F+\'S\')}4.15(4.A,J)},2y:9(){4.P=1f;4.1q()},3m:9(){4.P=J;4.1q()},u:9(s){6(s!=L){4.5.u=s;6(!4.P)4.1q()}z 4.5.u},1e:9(i,a){6(a==L||!a)a=i;1n(8 j=i;j<=a;j++){8 e=4.I(j).I(0);6(!e||$.D.1e(e,\'B-19-1C\'))z J}z 1f},I:9(i){z $(\'.B-19-\'+i,4.t)},3l:9(i,s){8 e=4.I(i),1Y=0;6(e.O==0){8 c,e=4.1A(i),j=r.K(i);1o(c=4.I(--j)){6(j<=0||c.O){j<=0?4.t.2u(e):c.1V(e);1m}}}10 1Y=4.T(e);e.1y(4.D(\'B-19-1C\'));1U s==\'3j\'?e.3f(s):e.22().3d(s);8 a=4.5.17!=7?1k.1M(4.1j()/4.5.17):7;8 b=4.T(e,a)-1Y;6(i>0&&i<4.A)4.t.y(4.F,r.K(4.t.y(4.F))+b+\'S\');4.t.y(4.N,r.K(4.t.y(4.N))+b+\'S\');z e},1T:9(i){8 e=4.I(i);6(!e.O||(i>=4.A&&i<=4.G))z;8 d=4.T(e);6(i<4.A)4.t.y(4.F,r.K(4.t.y(4.F))+d+\'S\');e.1T();4.t.y(4.N,r.K(4.t.y(4.N))-d+\'S\')},16:9(){4.1z();6(4.M!=7&&!4.V)4.1S(J);10 4.15(((4.5.C==\'1R\'||4.5.C==\'G\')&&4.5.u!=7&&4.G==4.5.u)?1:4.A+4.5.15)},13:9(){4.1z();6(4.M!=7&&4.V)4.1S(1f);10 4.15(((4.5.C==\'1R\'||4.5.C==\'A\')&&4.5.u!=7&&4.A==1)?4.5.u:4.A-4.5.15)},1S:9(b){6(4.P||4.14||!4.M)z;8 a=r.K(4.t.y(4.F));!b?a-=4.M:a+=4.M;4.V=!b;4.Z=4.A;4.11=4.G;4.1g(a)},15:9(i,a){6(4.P||4.14)z;4.1g(4.1r(i),a)},1r:9(i){6(4.P||4.14)z;6(4.5.C!=\'18\')i=i<1?1:(4.5.u&&i>4.5.u?4.5.u:i);8 a=4.A>i;8 b=r.K(4.t.y(4.F));8 f=4.5.C!=\'18\'&&4.A<=1?1:4.A;8 c=a?4.I(f):4.I(4.G);8 j=a?f:f-1;8 e=7,l=0,p=J,d=0;1o(a?--j>=i:++j<i){e=4.I(j);p=!e.O;6(e.O==0){e=4.1A(j).R(4.D(\'B-19-1C\'));c[a?\'1w\':\'1V\'](e)}c=e;d=4.T(e);6(p)l+=d;6(4.A!=7&&(4.5.C==\'18\'||(j>=1&&(4.5.u==7||j<=4.5.u))))b=a?b+d:b-d}8 g=4.1j();8 h=[];8 k=0,j=i,v=0;8 c=4.I(i-1);1o(++k){e=4.I(j);p=!e.O;6(e.O==0){e=4.1A(j).R(4.D(\'B-19-1C\'));c.O==0?4.t.2u(e):c[a?\'1w\':\'1V\'](e)}c=e;8 d=4.T(e);6(d==0){3a(\'39: 38 1E/27 37 1n 36. 35 34 33 31 30 2Y. 2X...\');z 0}6(4.5.C!=\'18\'&&4.5.u!==7&&j>4.5.u)h.2W(e);10 6(p)l+=d;v+=d;6(v>=g)1m;j++}1n(8 x=0;x<h.O;x++)h[x].1T();6(l>0){4.t.y(4.N,4.T(4.t)+l+\'S\');6(a){b-=l;4.t.y(4.F,r.K(4.t.y(4.F))-l+\'S\')}}8 n=i+k-1;6(4.5.C!=\'18\'&&4.5.u&&n>4.5.u)n=4.5.u;6(j>n){k=0,j=n,v=0;1o(++k){8 e=4.I(j--);6(!e.O)1m;v+=4.T(e);6(v>=g)1m}}8 o=n-k+1;6(4.5.C!=\'18\'&&o<1)o=1;6(4.V&&a){b+=4.M;4.V=J}4.M=7;6(4.5.C!=\'18\'&&n==4.5.u&&(n-k+1)>=1){8 m=r.X(4.I(n),!4.5.W?\'1l\':\'1H\');6((v-m)>g)4.M=v-g-m}1o(i-->o)b+=4.T(4.I(i));4.Z=4.A;4.11=4.G;4.A=o;4.G=n;z b},1g:9(p,a){6(4.P||4.14)z;4.14=1f;8 b=4;8 c=9(){b.14=J;6(p==0)b.t.y(b.F,0);6(b.5.C==\'1R\'||b.5.C==\'G\'||b.5.u==7||b.G<b.5.u)b.2i();b.1q();b.1N(\'2h\')};4.1N(\'2V\');6(!4.5.1I||a==J){4.t.y(4.F,p+\'S\');c()}10{8 o=!4.5.W?{\'26\':p}:{\'25\':p};4.t.1g(o,4.5.1I,4.5.2b,c)}},2i:9(s){6(s!=L)4.5.1i=s;6(4.5.1i==0)z 4.1z();6(4.1c!=7)z;8 a=4;4.1c=2U(9(){a.16()},4.5.1i*2T)},1z:9(){6(4.1c==7)z;2S(4.1c);4.1c=7},1q:9(n,p){6(n==L||n==7){8 n=!4.P&&4.5.u!==0&&((4.5.C&&4.5.C!=\'A\')||4.5.u==7||4.G<4.5.u);6(!4.P&&(!4.5.C||4.5.C==\'A\')&&4.5.u!=7&&4.G>=4.5.u)n=4.M!=7&&!4.V}6(p==L||p==7){8 p=!4.P&&4.5.u!==0&&((4.5.C&&4.5.C!=\'G\')||4.A>1);6(!4.P&&(!4.5.C||4.5.C==\'G\')&&4.5.u!=7&&4.A==1)p=4.M!=7&&4.V}8 a=4;4.U[n?\'1W\':\'2f\'](4.5.2k,4.2p)[n?\'1y\':\'R\'](4.D(\'B-16-1v\')).1K(\'1v\',n?J:1f);4.Q[p?\'1W\':\'2f\'](4.5.2g,4.2s)[p?\'1y\':\'R\'](4.D(\'B-13-1v\')).1K(\'1v\',p?J:1f);6(4.U.O>0&&(4.U[0].1d==L||4.U[0].1d!=n)&&4.5.1L!=7){4.U.1b(9(){a.5.1L(a,4,n)});4.U[0].1d=n}6(4.Q.O>0&&(4.Q[0].1d==L||4.Q[0].1d!=p)&&4.5.1J!=7){4.Q.1b(9(){a.5.1J(a,4,p)});4.Q[0].1d=p}},1N:9(a){8 b=4.Z==7?\'28\':(4.Z<4.A?\'16\':\'13\');4.12(\'2x\',a,b);6(4.Z!=4.A){4.12(\'2w\',a,b,4.A);4.12(\'2v\',a,b,4.Z)}6(4.11!=4.G){4.12(\'2t\',a,b,4.G);4.12(\'2r\',a,b,4.11)}4.12(\'2q\',a,b,4.A,4.G,4.Z,4.11);4.12(\'2o\',a,b,4.Z,4.11,4.A,4.G)},12:9(a,b,c,d,e,f,g){6(4.5[a]==L||(1U 4.5[a]!=\'2e\'&&b!=\'2h\'))z;8 h=1U 4.5[a]==\'2e\'?4.5[a][b]:4.5[a];6(!$.2R(h))z;8 j=4;6(d===L)h(j,c,b);10 6(e===L)4.I(d).1b(9(){h(j,4,d,c,b)});10{1n(8 i=d;i<=e;i++)6(!(i>=f&&i<=g))4.I(i).1b(9(){h(j,4,i,c,b)})}},1A:9(i){z 4.1O(\'<1u></1u>\',i)},1O:9(e,i){8 a=$(e).R(4.D(\'B-19\')).R(4.D(\'B-19-\'+i));a.1K(\'2Q\',i);z a},D:9(c){z c+\' \'+c+(!4.5.W?\'-2P\':\'-W\')},T:9(e,d){8 a=e.2l!=L?e[0]:e;8 b=!4.5.W?a.1t+r.X(a,\'2d\')+r.X(a,\'1l\'):a.2c+r.X(a,\'2n\')+r.X(a,\'1H\');6(d==L||b==d)z b;8 w=!4.5.W?d-r.X(a,\'2d\')-r.X(a,\'1l\'):d-r.X(a,\'2n\')-r.X(a,\'1H\');$(a).y(4.N,w+\'S\');z 4.T(a)},1j:9(){z!4.5.W?4.H[0].1t-r.K(4.H.y(\'2N\'))-r.K(4.H.y(\'2M\')):4.H[0].2c-r.K(4.H.y(\'2L\'))-r.K(4.H.y(\'2K\'))},2J:9(i,s){6(s==L)s=4.5.u;z 1k.2I((((i-1)/s)-1k.3e((i-1)/s))*s)+1}});r.1a({2H:9(d){$.1a(q,d)},X:9(e,p){6(!e)z 0;8 a=e.2l!=L?e[0]:e;6(p==\'1l\'&&$.2G.2F){8 b={\'1x\':\'1B\',\'3i\':\'2C\',\'1E\':\'1i\'},1G,1Z;$.2a(a,b,9(){1G=a.1t});b[\'1l\']=0;$.2a(a,b,9(){1Z=a.1t});z 1Z-1G}z r.K($.y(a,p))},K:9(v){v=2A(v);z 3o(v)?0:v}})})(3q);',62,213,'||||this|options|if|null|var|function||||||||||||||||||||list|size||||css|return|first|jcarousel|wrap|className|container|lt|last|clip|get|false|intval|undefined|tail|wh|length|locked|buttonPrev|addClass|px|dimension|buttonNext|inTail|vertical|margin|div|prevFirst|else|prevLast|callback|prev|animating|scroll|next|visible|circular|item|extend|each|timer|jcarouselstate|has|true|animate|initCallback|auto|clipping|Math|marginRight|break|for|while|parent|buttons|pos|fn|offsetWidth|li|disabled|before|display|removeClass|stopAuto|create|block|placeholder|reloadCallback|width|setup|oWidth|marginBottom|animation|buttonPrevCallback|attr|buttonNextCallback|ceil|notify|format|buttonPrevHTML|buttonNextHTML|both|scrollTail|remove|typeof|after|bind|offset|old|oWidth2|nodeName|0px|empty|start|reset|top|left|height|init|reload|swap|easing|offsetHeight|marginLeft|object|unbind|buttonPrevEvent|onAfterAnimation|startAuto|click|buttonNextEvent|jquery|children|marginTop|itemVisibleOutCallback|funcNext|itemVisibleInCallback|itemLastOutCallback|funcPrev|itemLastInCallback|prepend|itemFirstOutCallback|itemFirstInCallback|itemLoadCallback|lock|prototype|parseInt|resize|none|window|swing|safari|browser|defaults|round|index|borderBottomWidth|borderTopWidth|borderRightWidth|borderLeftWidth|normal|horizontal|jcarouselindex|isFunction|clearTimeout|1000|setTimeout|onBeforeAnimation|push|Aborting|loop|ol|infinite|an|ul|cause|will|This|items|set|No|jCarousel|alert|skin|indexOf|append|floor|html|split|new|float|string|parentNode|add|unlock|OL|isNaN|UL|jQuery'.split('|'),0,{}));
+
+//timer
+jQuery.fn.extend({
+ everyTime: function(interval, label, fn, times, belay) {
+ return this.each(function() {
+ jQuery.timer.add(this, interval, label, fn, times, belay);
+ });
+ },
+ oneTime: function(interval, label, fn) {
+ return this.each(function() {
+ jQuery.timer.add(this, interval, label, fn, 1);
+ });
+ },
+ stopTime: function(label, fn) {
+ return this.each(function() {
+ jQuery.timer.remove(this, label, fn);
+ });
+ }
+});
+
+jQuery.extend({
+ timer: {
+ guid: 1,
+ global: {},
+ regex: /^([0-9]+)\s*(.*s)?$/,
+ powers: {
+ // Yeah this is major overkill...
+ 'ms': 1,
+ 'cs': 10,
+ 'ds': 100,
+ 's': 1000,
+ 'das': 10000,
+ 'hs': 100000,
+ 'ks': 1000000
+ },
+ timeParse: function(value) {
+ if (value == undefined || value == null)
+ return null;
+ var result = this.regex.exec(jQuery.trim(value.toString()));
+ if (result[2]) {
+ var num = parseInt(result[1], 10);
+ var mult = this.powers[result[2]] || 1;
+ return num * mult;
+ } else {
+ return value;
+ }
+ },
+ add: function(element, interval, label, fn, times, belay) {
+ var counter = 0;
+
+ if (jQuery.isFunction(label)) {
+ if (!times)
+ times = fn;
+ fn = label;
+ label = interval;
+ }
+
+ interval = jQuery.timer.timeParse(interval);
+
+ if (typeof interval != 'number' || isNaN(interval) || interval <= 0)
+ return;
+
+ if (times && times.constructor != Number) {
+ belay = !!times;
+ times = 0;
+ }
+
+ times = times || 0;
+ belay = belay || false;
+
+ if (!element.$timers)
+ element.$timers = {};
+
+ if (!element.$timers[label])
+ element.$timers[label] = {};
+
+ fn.$timerID = fn.$timerID || this.guid++;
+
+ var handler = function() {
+ if (belay && this.inProgress)
+ return;
+ this.inProgress = true;
+ if ((++counter > times && times !== 0) || fn.call(element, counter) === false)
+ jQuery.timer.remove(element, label, fn);
+ this.inProgress = false;
+ };
+
+ handler.$timerID = fn.$timerID;
+
+ if (!element.$timers[label][fn.$timerID])
+ element.$timers[label][fn.$timerID] = window.setInterval(handler,interval);
+
+ if ( !this.global[label] )
+ this.global[label] = [];
+ this.global[label].push( element );
+
+ },
+ remove: function(element, label, fn) {
+ var timers = element.$timers, ret;
+
+ if ( timers ) {
+
+ if (!label) {
+ for ( label in timers )
+ this.remove(element, label, fn);
+ } else if ( timers[label] ) {
+ if ( fn ) {
+ if ( fn.$timerID ) {
+ window.clearInterval(timers[label][fn.$timerID]);
+ delete timers[label][fn.$timerID];
+ }
+ } else {
+ for ( var fn in timers[label] ) {
+ window.clearInterval(timers[label][fn]);
+ delete timers[label][fn];
+ }
+ }
+
+ for ( ret in timers[label] ) break;
+ if ( !ret ) {
+ ret = null;
+ delete timers[label];
+ }
+ }
+
+ for ( ret in timers ) break;
+ if ( !ret )
+ element.$timers = null;
+ }
+ }
+ }
+});
+
+if (jQuery.browser.msie)
+ jQuery(window).one("unload", function() {
+ var global = jQuery.timer.global;
+ for ( var label in global ) {
+ var els = global[label], i = els.length;
+ while ( --i )
+ jQuery.timer.remove(els[i], label);
+ }
+ });
+
diff --git a/media/js/jquery.galleria.pack.js b/media/js/jquery.galleria.pack.js
new file mode 100644
index 0000000..9be0df8
--- /dev/null
+++ b/media/js/jquery.galleria.pack.js
@@ -0,0 +1 @@
+eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(5($){4 q;q=$.23.7=5(k){6(!q.1o()){Q J}$.1p(q.1b);4 l={Z:\'.1q\',K:E,10:E,1c:5(a,b,c){},1r:5(a){}};4 m=$.11(l,k);1d(4 i 24 m){6(i){$.7[i]=m[i]}}4 n=($(m.Z).R(m.Z))?$(m.Z):3(B.12(\'1e\')).25(8);4 o=$(B.12(\'1e\')).u(\'1s\');4 p=$(B.12(\'1f\')).u(\'1g\');n.u(\'1q\').13(o).13(p);Q 8.1t(5(){$(8).u(\'7\');$(8).1u(\'L\').1t(5(i){4 b=$(8);4 c=$.26?$.11({},m,b.27()):m;c.10=$(8).R(\':28-S\')?J:c.10;4 d=$(8).T(\'a\').R(\'a\')?$(8).T(\'a\'):J;4 e=$(8).1u(\'F\').C(\'M\',\'U\');4 f=d?d.9(\'1v\'):e.9(\'1h\');4 g=d?d.9(\'14\'):e.9(\'14\');4 j=1w 1x();6(c.K&&(N.r.t&&N.r.t.V(/\\#/,\'\')==f)){b.G(\'.D\').W(\'D\');b.u(\'D\')}$(j).29(5(){$(8).9(\'1y\',e.9(\'1y\'));4 a=d?d.T(\'F\').u(\'1z 1A\').C(\'M\',\'U\'):e.2a(E).u(\'1z\').C(\'M\',\'U\');6(d){d.2b(a)}6(!a.1B(\'1A\')){4 w=1i.1C(e.v()/e.y()*b.y());4 h=1i.1C(e.y()/e.v()*b.v());6(w<h){a.C({y:\'1D\',v:b.v(),1E:-(h-b.y())/2})}s{a.C({v:\'1D\',y:b.y(),1F:-(w-b.v())/2})}}s{N.1G(5(){a.C({1F:-(a.v()-b.v())/2,1E:-(a.y()-b.y())/2})},1)}a.9(\'O\',f);a.9(\'14\',g);a.1H(5(){$.7.X(f)});a.P(5(){$(8).u(\'P\')},5(){$(8).W(\'P\')});b.P(5(){b.u(\'P\')},5(){b.W(\'P\')});b.1I(a);a.C(\'M\',\'2c\');c.1r(3(a));6(b.1B(\'D\')){$.7.X(f)}e.1J()}).1K(5(){b.2d(\'<1f 2e="1K" 1L="2f:2g">2h 2i 2j: \'+f+\'</1f>\')}).9(\'1h\',f)})})};q.1M=5(a){Q $(a).R(\':1N-S\')?$(a).G(\':1O-S\'):$(a).1j()};q.1P=5(a){Q $(a).R(\':1O-S\')?$(a).G(\':1N-S\'):$(a).1Q()};q.1o=5(){$(\'1R\').13($(B.12(\'1e\')).9(\'1S\',\'1k\').C({v:\'1T\',y:\'1T\',M:\'U\'}));4 a=($(\'#1k\').v()!=1)?J:E;$(\'#1k\').1J();Q a};q.1b=5(a){4 b=$(\'.1s\');4 c=$(\'.7 F[O="\'+a+\'"]\');6(a){6($.7.K){N.r=N.r.1v.V(/\\#.*/,\'\')+\'#\'+a}c.15(\'L\').G(\'.D\').W(\'D\');c.15(\'L\').u(\'D\');4 d=$(1w 1x()).9(\'1h\',a).u(\'2k\');b.1U().13(d);b.G(\'.1g\').2l(c.9(\'14\'));$.7.1c(d,b.G(\'.1g\'),c);6($.7.10){d.C(\'2m\',\'2n\').1H(5(){$.7.1j()})}}s{b.G().2o().1U();$(\'.7 L.D\').W(\'D\')}$.7.16=a};$.11({7:{16:\'\',1c:5(){},X:5(a){6($.7.K){$.1V(a)}s{q.1b(a)}},1j:5(){4 a=$(q.1M($(\'.7 F[O="\'+$.7.16+\'"]\').15(\'L\'))).T(\'F\').9(\'O\');$.7.X(a)},1Q:5(){4 a=$(q.1P($(\'.7 F[O="\'+$.7.16+\'"]\').15(\'L\'))).T(\'F\').9(\'O\');$.7.X(a)}}})})(3);3.11({z:17,x:17,1p:5(a){3.x=a;4 b=r.t;3.z=b;6(3.H.1l){6(3.z===\'\'){3.z=\'#\'}$("1R").1I(\'<1W 1S="18" 1L="M: U;"></1W>\');4 c=$("#18")[0];4 d=c.1m.B;d.1X();d.1Y();d.r.t=b}s 6($.H.19){3.A=[];3.A.I=K.I;3.1a=[];3.Y=E}3.x(b.V(/^#/,\'\'));2p(3.1Z,2q)},20:5(a){3.A.21(a);3.1a.I=0;8.Y=E},1Z:5(){6(3.H.1l){4 a=$("#18")[0];4 b=a.2r||a.1m.B;4 c=b.r.t;6(c!=3.z){r.t=c;3.z=c;3.x(c.V(/^#/,\'\'))}}s 6($.H.19){6(!3.1n){4 d=K.I-3.A.I;6(d){3.Y=J;4 i;6(d<0){1d(i=0;i<1i.2s(d);i++){3.1a.2t(3.A.2u())}}s{1d(i=0;i<d;i++){3.A.21(3.1a.2v())}}4 e=3.A[3.A.I-1];6(e!==17){3.z=r.t;3.x(e)}}s 6(3.A[3.A.I-1]===17&&!3.Y){6(B.22.2w(\'#\')>=0){3.x(B.22.2x(\'#\')[1])}s{c=r.t;3.x(\'\')}3.Y=E}}}s{c=r.t;6(c!=3.z){3.z=c;3.x(c.V(/^#/,\'\'))}}},1V:5(a){4 b;6(3.H.19){b=a}s{b=\'#\'+a;r.t=b}3.z=b;6(3.H.1l){4 c=$("#18")[0];4 d=c.1m.B;d.1X();d.1Y();d.r.t=b;3.x(a)}s 6(3.H.19){3.1n=E;8.20(a);4 e=5(){3.1n=J};N.1G(e,2y);3.x(a);r.t=b}s{3.x(a)}}});',62,159,'|||jQuery|var|function|if|galleria|this|attr||||||||||||||||||location|else|hash|addClass|width||historyCallback|height|historyCurrentHash|historyBackStack|document|css|active|true|img|siblings|browser|length|false|history|li|display|window|rel|hover|return|is|child|find|none|replace|removeClass|activate|isFirst|insert|clickNext|extend|createElement|append|title|parents|current|undefined|jQuery_history|safari|historyForwardStack|onPageLoad|onImage|for|div|span|caption|src|Math|next|css_test|msie|contentWindow|dontCheck|hasCSS|historyInit|galleria_container|onThumb|galleria_wrapper|each|children|href|new|Image|alt|thumb|noscale|hasClass|ceil|auto|marginTop|marginLeft|setTimeout|click|prepend|remove|error|style|nextSelector|last|first|previousSelector|prev|body|id|1px|empty|historyLoad|iframe|open|close|historyCheck|historyAddHistory|push|URL|fn|in|insertBefore|meta|data|only|load|clone|replaceWith|block|html|class|color|red|Error|loading|image|replaced|text|cursor|pointer|andSelf|setInterval|100|contentDocument|abs|unshift|pop|shift|indexOf|split|200'.split('|'),0,{})) \ No newline at end of file
diff --git a/media/js/jquery.jcarousel.pack.js b/media/js/jquery.jcarousel.pack.js
new file mode 100644
index 0000000..5fd1166
--- /dev/null
+++ b/media/js/jquery.jcarousel.pack.js
@@ -0,0 +1,16 @@
+/**
+ * jCarousel - Riding carousels with jQuery
+ * http://sorgalla.com/jcarousel/
+ *
+ * Copyright (c) 2006 Jan Sorgalla (http://sorgalla.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * Built on top of the jQuery library
+ * http://jquery.com
+ *
+ * Inspired by the "Carousel Component" by Bill Scott
+ * http://billwscott.com/carousel/
+ */
+eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(9($){$.1s.A=9(o){z 4.14(9(){2H r(4,o)})};8 q={W:F,23:1,1G:1,u:7,15:3,16:7,1H:\'2I\',24:\'2J\',1i:0,B:7,1j:7,1I:7,25:7,26:7,27:7,28:7,29:7,2a:7,2b:7,1J:\'<N></N>\',1K:\'<N></N>\',2c:\'2d\',2e:\'2d\',1L:7,1M:7};$.A=9(e,o){4.5=$.17({},q,o||{});4.Q=F;4.D=7;4.H=7;4.t=7;4.R=7;4.S=7;4.O=!4.5.W?\'1N\':\'2f\';4.E=!4.5.W?\'2g\':\'2h\';8 a=\'\',1d=e.J.1d(\' \');1k(8 i=0;i<1d.K;i++){6(1d[i].2i(\'A-2j\')!=-1){$(e).1t(1d[i]);8 a=1d[i];1l}}6(e.2k==\'2K\'||e.2k==\'2L\'){4.t=$(e);4.D=4.t.18();6(4.D.1m(\'A-H\')){6(!4.D.18().1m(\'A-D\'))4.D=4.D.B(\'<N></N>\');4.D=4.D.18()}X 6(!4.D.1m(\'A-D\'))4.D=4.t.B(\'<N></N>\').18()}X{4.D=$(e);4.t=$(e).2M(\'>2l,>2m,N>2l,N>2m\')}6(a!=\'\'&&4.D.18()[0].J.2i(\'A-2j\')==-1)4.D.B(\'<N 2N=" \'+a+\'"></N>\');4.H=4.t.18();6(!4.H.K||!4.H.1m(\'A-H\'))4.H=4.t.B(\'<N></N>\').18();4.S=$(\'.A-11\',4.D);6(4.S.u()==0&&4.5.1K!=7)4.S=4.H.1u(4.5.1K).11();4.S.V(4.J(\'A-11\'));4.R=$(\'.A-19\',4.D);6(4.R.u()==0&&4.5.1J!=7)4.R=4.H.1u(4.5.1J).11();4.R.V(4.J(\'A-19\'));4.H.V(4.J(\'A-H\'));4.t.V(4.J(\'A-t\'));4.D.V(4.J(\'A-D\'));8 b=4.5.16!=7?1n.1O(4.1o()/4.5.16):7;8 c=4.t.2O(\'1v\');8 d=4;6(c.u()>0){8 f=0,i=4.5.1G;c.14(9(){d.1P(4,i++);f+=d.T(4,b)});4.t.y(4.O,f+\'U\');6(!o||o.u===L)4.5.u=c.u()}4.D.y(\'1w\',\'1x\');4.R.y(\'1w\',\'1x\');4.S.y(\'1w\',\'1x\');4.2n=9(){d.19()};4.2o=9(){d.11()};4.1Q=9(){d.2p()};6(4.5.1j!=7)4.5.1j(4,\'2q\');6($.2r.2s){4.1e(F,F);$(2t).1y(\'2P\',9(){d.1z()})}X 4.1z()};8 r=$.A;r.1s=r.2Q={A:\'0.2.3\'};r.1s.17=r.17=$.17;r.1s.17({1z:9(){4.C=7;4.G=7;4.Y=7;4.12=7;4.1a=F;4.1f=7;4.P=7;4.Z=F;6(4.Q)z;4.t.y(4.E,4.1A(4.5.1G)+\'U\');8 p=4.1A(4.5.23);4.Y=4.12=7;4.1p(p,F);$(2t).1R(\'2u\',4.1Q).1y(\'2u\',4.1Q)},2v:9(){4.t.2w();4.t.y(4.E,\'2R\');4.t.y(4.O,\'2S\');6(4.5.1j!=7)4.5.1j(4,\'2v\');4.1z()},2p:9(){6(4.P!=7&&4.Z)4.t.y(4.E,r.I(4.t.y(4.E))+4.P);4.P=7;4.Z=F;6(4.5.1I!=7)4.5.1I(4);6(4.5.16!=7){8 a=4;8 b=1n.1O(4.1o()/4.5.16),O=0,E=0;$(\'1v\',4.t).14(9(i){O+=a.T(4,b);6(i+1<a.C)E=O});4.t.y(4.O,O+\'U\');4.t.y(4.E,-E+\'U\')}4.15(4.C,F)},2T:9(){4.Q=1g;4.1e()},2U:9(){4.Q=F;4.1e()},u:9(s){6(s!=L){4.5.u=s;6(!4.Q)4.1e()}z 4.5.u},2V:9(i,a){6(a==L||!a)a=i;6(4.5.u!==7&&a>4.5.u)a=4.5.u;1k(8 j=i;j<=a;j++){8 e=4.M(j);6(!e.K||e.1m(\'A-1b-1B\'))z F}z 1g},M:9(i){z $(\'.A-1b-\'+i,4.t)},2x:9(i,s){8 e=4.M(i),1S=0,2x=0;6(e.K==0){8 c,e=4.1C(i),j=r.I(i);1q(c=4.M(--j)){6(j<=0||c.K){j<=0?4.t.2y(e):c.1T(e);1l}}}X 1S=4.T(e);e.1t(4.J(\'A-1b-1B\'));1U s==\'2W\'?e.2X(s):e.2w().2Y(s);8 a=4.5.16!=7?1n.1O(4.1o()/4.5.16):7;8 b=4.T(e,a)-1S;6(i>0&&i<4.C)4.t.y(4.E,r.I(4.t.y(4.E))-b+\'U\');4.t.y(4.O,r.I(4.t.y(4.O))+b+\'U\');z e},1V:9(i){8 e=4.M(i);6(!e.K||(i>=4.C&&i<=4.G))z;8 d=4.T(e);6(i<4.C)4.t.y(4.E,r.I(4.t.y(4.E))+d+\'U\');e.1V();4.t.y(4.O,r.I(4.t.y(4.O))-d+\'U\')},19:9(){4.1D();6(4.P!=7&&!4.Z)4.1W(F);X 4.15(((4.5.B==\'1X\'||4.5.B==\'G\')&&4.5.u!=7&&4.G==4.5.u)?1:4.C+4.5.15)},11:9(){4.1D();6(4.P!=7&&4.Z)4.1W(1g);X 4.15(((4.5.B==\'1X\'||4.5.B==\'C\')&&4.5.u!=7&&4.C==1)?4.5.u:4.C-4.5.15)},1W:9(b){6(4.Q||4.1a||!4.P)z;8 a=r.I(4.t.y(4.E));!b?a-=4.P:a+=4.P;4.Z=!b;4.Y=4.C;4.12=4.G;4.1p(a)},15:9(i,a){6(4.Q||4.1a)z;4.1p(4.1A(i),a)},1A:9(i){6(4.Q||4.1a)z;i=r.I(i);6(4.5.B!=\'1c\')i=i<1?1:(4.5.u&&i>4.5.u?4.5.u:i);8 a=4.C>i;8 b=r.I(4.t.y(4.E));8 f=4.5.B!=\'1c\'&&4.C<=1?1:4.C;8 c=a?4.M(f):4.M(4.G);8 j=a?f:f-1;8 e=7,l=0,p=F,d=0;1q(a?--j>=i:++j<i){e=4.M(j);p=!e.K;6(e.K==0){e=4.1C(j).V(4.J(\'A-1b-1B\'));c[a?\'1u\':\'1T\'](e)}c=e;d=4.T(e);6(p)l+=d;6(4.C!=7&&(4.5.B==\'1c\'||(j>=1&&(4.5.u==7||j<=4.5.u))))b=a?b+d:b-d}8 g=4.1o();8 h=[];8 k=0,j=i,v=0;8 c=4.M(i-1);1q(++k){e=4.M(j);p=!e.K;6(e.K==0){e=4.1C(j).V(4.J(\'A-1b-1B\'));c.K==0?4.t.2y(e):c[a?\'1u\':\'1T\'](e)}c=e;8 d=4.T(e);6(d==0){2Z(\'30: 31 1N/2f 32 1k 33. 34 35 36 37 38 39. 3a...\');z 0}6(4.5.B!=\'1c\'&&4.5.u!==7&&j>4.5.u)h.3b(e);X 6(p)l+=d;v+=d;6(v>=g)1l;j++}1k(8 x=0;x<h.K;x++)h[x].1V();6(l>0){4.t.y(4.O,4.T(4.t)+l+\'U\');6(a){b-=l;4.t.y(4.E,r.I(4.t.y(4.E))-l+\'U\')}}8 n=i+k-1;6(4.5.B!=\'1c\'&&4.5.u&&n>4.5.u)n=4.5.u;6(j>n){k=0,j=n,v=0;1q(++k){8 e=4.M(j--);6(!e.K)1l;v+=4.T(e);6(v>=g)1l}}8 o=n-k+1;6(4.5.B!=\'1c\'&&o<1)o=1;6(4.Z&&a){b+=4.P;4.Z=F}4.P=7;6(4.5.B!=\'1c\'&&n==4.5.u&&(n-k+1)>=1){8 m=r.10(4.M(n),!4.5.W?\'1r\':\'1Y\');6((v-m)>g)4.P=v-g-m}1q(i-->o)b+=4.T(4.M(i));4.Y=4.C;4.12=4.G;4.C=o;4.G=n;z b},1p:9(p,a){6(4.Q||4.1a)z;4.1a=1g;8 b=4;8 c=9(){b.1a=F;6(p==0)b.t.y(b.E,0);6(b.5.B==\'1X\'||b.5.B==\'G\'||b.5.u==7||b.G<b.5.u)b.2z();b.1e();b.1Z(\'2A\')};4.1Z(\'3c\');6(!4.5.1H||a==F){4.t.y(4.E,p+\'U\');c()}X{8 o=!4.5.W?{\'2g\':p}:{\'2h\':p};4.t.1p(o,4.5.1H,4.5.24,c)}},2z:9(s){6(s!=L)4.5.1i=s;6(4.5.1i==0)z 4.1D();6(4.1f!=7)z;8 a=4;4.1f=3d(9(){a.19()},4.5.1i*3e)},1D:9(){6(4.1f==7)z;3f(4.1f);4.1f=7},1e:9(n,p){6(n==L||n==7){8 n=!4.Q&&4.5.u!==0&&((4.5.B&&4.5.B!=\'C\')||4.5.u==7||4.G<4.5.u);6(!4.Q&&(!4.5.B||4.5.B==\'C\')&&4.5.u!=7&&4.G>=4.5.u)n=4.P!=7&&!4.Z}6(p==L||p==7){8 p=!4.Q&&4.5.u!==0&&((4.5.B&&4.5.B!=\'G\')||4.C>1);6(!4.Q&&(!4.5.B||4.5.B==\'G\')&&4.5.u!=7&&4.C==1)p=4.P!=7&&4.Z}8 a=4;4.R[n?\'1y\':\'1R\'](4.5.2c,4.2n)[n?\'1t\':\'V\'](4.J(\'A-19-1E\')).20(\'1E\',n?F:1g);4.S[p?\'1y\':\'1R\'](4.5.2e,4.2o)[p?\'1t\':\'V\'](4.J(\'A-11-1E\')).20(\'1E\',p?F:1g);6(4.R.K>0&&(4.R[0].1h==L||4.R[0].1h!=n)&&4.5.1L!=7){4.R.14(9(){a.5.1L(a,4,n)});4.R[0].1h=n}6(4.S.K>0&&(4.S[0].1h==L||4.S[0].1h!=p)&&4.5.1M!=7){4.S.14(9(){a.5.1M(a,4,p)});4.S[0].1h=p}},1Z:9(a){8 b=4.Y==7?\'2q\':(4.Y<4.C?\'19\':\'11\');4.13(\'25\',a,b);6(4.Y!==4.C){4.13(\'26\',a,b,4.C);4.13(\'27\',a,b,4.Y)}6(4.12!==4.G){4.13(\'28\',a,b,4.G);4.13(\'29\',a,b,4.12)}4.13(\'2a\',a,b,4.C,4.G,4.Y,4.12);4.13(\'2b\',a,b,4.Y,4.12,4.C,4.G)},13:9(a,b,c,d,e,f,g){6(4.5[a]==L||(1U 4.5[a]!=\'2B\'&&b!=\'2A\'))z;8 h=1U 4.5[a]==\'2B\'?4.5[a][b]:4.5[a];6(!$.3g(h))z;8 j=4;6(d===L)h(j,c,b);X 6(e===L)4.M(d).14(9(){h(j,4,d,c,b)});X{1k(8 i=d;i<=e;i++)6(i!==7&&!(i>=f&&i<=g))4.M(i).14(9(){h(j,4,i,c,b)})}},1C:9(i){z 4.1P(\'<1v></1v>\',i)},1P:9(e,i){8 a=$(e).V(4.J(\'A-1b\')).V(4.J(\'A-1b-\'+i));a.20(\'3h\',i);z a},J:9(c){z c+\' \'+c+(!4.5.W?\'-3i\':\'-W\')},T:9(e,d){8 a=e.2C!=L?e[0]:e;8 b=!4.5.W?a.1F+r.10(a,\'2D\')+r.10(a,\'1r\'):a.2E+r.10(a,\'2F\')+r.10(a,\'1Y\');6(d==L||b==d)z b;8 w=!4.5.W?d-r.10(a,\'2D\')-r.10(a,\'1r\'):d-r.10(a,\'2F\')-r.10(a,\'1Y\');$(a).y(4.O,w+\'U\');z 4.T(a)},1o:9(){z!4.5.W?4.H[0].1F-r.I(4.H.y(\'3j\'))-r.I(4.H.y(\'3k\')):4.H[0].2E-r.I(4.H.y(\'3l\'))-r.I(4.H.y(\'3m\'))},3n:9(i,s){6(s==L)s=4.5.u;z 1n.3o((((i-1)/s)-1n.3p((i-1)/s))*s)+1}});r.17({3q:9(d){z $.17(q,d||{})},10:9(e,p){6(!e)z 0;8 a=e.2C!=L?e[0]:e;6(p==\'1r\'&&$.2r.2s){8 b={\'1w\':\'1x\',\'3r\':\'3s\',\'1N\':\'1i\'},21,22;$.2G(a,b,9(){21=a.1F});b[\'1r\']=0;$.2G(a,b,9(){22=a.1F});z 22-21}z r.I($.y(a,p))},I:9(v){v=3t(v);z 3u(v)?0:v}})})(3v);',62,218,'||||this|options|if|null|var|function||||||||||||||||||||list|size||||css|return|jcarousel|wrap|first|container|lt|false|last|clip|intval|className|length|undefined|get|div|wh|tail|locked|buttonNext|buttonPrev|dimension|px|addClass|vertical|else|prevFirst|inTail|margin|prev|prevLast|callback|each|scroll|visible|extend|parent|next|animating|item|circular|split|buttons|timer|true|jcarouselstate|auto|initCallback|for|break|hasClass|Math|clipping|animate|while|marginRight|fn|removeClass|before|li|display|block|bind|setup|pos|placeholder|create|stopAuto|disabled|offsetWidth|offset|animation|reloadCallback|buttonNextHTML|buttonPrevHTML|buttonNextCallback|buttonPrevCallback|width|ceil|format|funcResize|unbind|old|after|typeof|remove|scrollTail|both|marginBottom|notify|attr|oWidth|oWidth2|start|easing|itemLoadCallback|itemFirstInCallback|itemFirstOutCallback|itemLastInCallback|itemLastOutCallback|itemVisibleInCallback|itemVisibleOutCallback|buttonNextEvent|click|buttonPrevEvent|height|left|top|indexOf|skin|nodeName|ul|ol|funcNext|funcPrev|reload|init|browser|safari|window|resize|reset|empty|add|prepend|startAuto|onAfterAnimation|object|jquery|marginLeft|offsetHeight|marginTop|swap|new|normal|swing|UL|OL|find|class|children|load|prototype|0px|10px|lock|unlock|has|string|html|append|alert|jCarousel|No|set|items|This|will|cause|an|infinite|loop|Aborting|push|onBeforeAnimation|setTimeout|1000|clearTimeout|isFunction|jcarouselindex|horizontal|borderLeftWidth|borderRightWidth|borderTopWidth|borderBottomWidth|index|round|floor|defaults|float|none|parseInt|isNaN|jQuery'.split('|'),0,{}))
+
diff --git a/media/js/jquery.js b/media/js/jquery.js
new file mode 100644
index 0000000..74cdfee
--- /dev/null
+++ b/media/js/jquery.js
@@ -0,0 +1,11 @@
+/*
+ * jQuery 1.2.3 - 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-02-06 00:21:25 -0500 (Wed, 06 Feb 2008) $
+ * $Rev: 4663 $
+ */
+eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(J(){7(1e.3N)L w=1e.3N;L E=1e.3N=J(a,b){K 1B E.2l.4T(a,b)};7(1e.$)L D=1e.$;1e.$=E;L u=/^[^<]*(<(.|\\s)+>)[^>]*$|^#(\\w+)$/;L G=/^.[^:#\\[\\.]*$/;E.1n=E.2l={4T:J(d,b){d=d||T;7(d.15){6[0]=d;6.M=1;K 6}N 7(1o d=="25"){L c=u.2O(d);7(c&&(c[1]||!b)){7(c[1])d=E.4a([c[1]],b);N{L a=T.5J(c[3]);7(a)7(a.2w!=c[3])K E().2s(d);N{6[0]=a;6.M=1;K 6}N d=[]}}N K 1B E(b).2s(d)}N 7(E.1q(d))K 1B E(T)[E.1n.21?"21":"3U"](d);K 6.6E(d.1k==1M&&d||(d.5h||d.M&&d!=1e&&!d.15&&d[0]!=10&&d[0].15)&&E.2I(d)||[d])},5h:"1.2.3",87:J(){K 6.M},M:0,22:J(a){K a==10?E.2I(6):6[a]},2F:J(b){L a=E(b);a.54=6;K a},6E:J(a){6.M=0;1M.2l.1g.1i(6,a);K 6},R:J(a,b){K E.R(6,a,b)},4X:J(b){L a=-1;6.R(J(i){7(6==b)a=i});K a},1J:J(c,a,b){L d=c;7(c.1k==4e)7(a==10)K 6.M&&E[b||"1J"](6[0],c)||10;N{d={};d[c]=a}K 6.R(J(i){Q(c 1p d)E.1J(b?6.W:6,c,E.1l(6,d[c],b,i,c))})},1j:J(b,a){7((b==\'27\'||b==\'1R\')&&2M(a)<0)a=10;K 6.1J(b,a,"2o")},1u:J(b){7(1o b!="3V"&&b!=V)K 6.4x().3t((6[0]&&6[0].2i||T).5r(b));L a="";E.R(b||6,J(){E.R(6.3p,J(){7(6.15!=8)a+=6.15!=1?6.6K:E.1n.1u([6])})});K a},5m:J(b){7(6[0])E(b,6[0].2i).5k().3o(6[0]).2c(J(){L a=6;2b(a.1C)a=a.1C;K a}).3t(6);K 6},8w:J(a){K 6.R(J(){E(6).6z().5m(a)})},8p:J(a){K 6.R(J(){E(6).5m(a)})},3t:J(){K 6.3O(18,P,S,J(a){7(6.15==1)6.38(a)})},6q:J(){K 6.3O(18,P,P,J(a){7(6.15==1)6.3o(a,6.1C)})},6o:J(){K 6.3O(18,S,S,J(a){6.1a.3o(a,6)})},5a:J(){K 6.3O(18,S,P,J(a){6.1a.3o(a,6.2B)})},3h:J(){K 6.54||E([])},2s:J(b){L c=E.2c(6,J(a){K E.2s(b,a)});K 6.2F(/[^+>] [^+>]/.17(b)||b.1f("..")>-1?E.57(c):c)},5k:J(e){L f=6.2c(J(){7(E.14.1d&&!E.3E(6)){L a=6.69(P),4Y=T.3s("1x");4Y.38(a);K E.4a([4Y.3d])[0]}N K 6.69(P)});L d=f.2s("*").4R().R(J(){7(6[F]!=10)6[F]=V});7(e===P)6.2s("*").4R().R(J(i){7(6.15==3)K;L c=E.O(6,"2R");Q(L a 1p c)Q(L b 1p c[a])E.16.1b(d[i],a,c[a][b],c[a][b].O)});K f},1E:J(b){K 6.2F(E.1q(b)&&E.3y(6,J(a,i){K b.1P(a,i)})||E.3e(b,6))},56:J(b){7(b.1k==4e)7(G.17(b))K 6.2F(E.3e(b,6,P));N b=E.3e(b,6);L a=b.M&&b[b.M-1]!==10&&!b.15;K 6.1E(J(){K a?E.33(6,b)<0:6!=b})},1b:J(a){K!a?6:6.2F(E.37(6.22(),a.1k==4e?E(a).22():a.M!=10&&(!a.12||E.12(a,"3u"))?a:[a]))},3H:J(a){K a?E.3e(a,6).M>0:S},7j:J(a){K 6.3H("."+a)},5O:J(b){7(b==10){7(6.M){L c=6[0];7(E.12(c,"2k")){L e=c.3T,5I=[],11=c.11,2X=c.U=="2k-2X";7(e<0)K V;Q(L i=2X?e:0,2f=2X?e+1:11.M;i<2f;i++){L d=11[i];7(d.2p){b=E.14.1d&&!d.9J.1A.9y?d.1u:d.1A;7(2X)K b;5I.1g(b)}}K 5I}N K(6[0].1A||"").1r(/\\r/g,"")}K 10}K 6.R(J(){7(6.15!=1)K;7(b.1k==1M&&/5u|5t/.17(6.U))6.3k=(E.33(6.1A,b)>=0||E.33(6.31,b)>=0);N 7(E.12(6,"2k")){L a=b.1k==1M?b:[b];E("98",6).R(J(){6.2p=(E.33(6.1A,a)>=0||E.33(6.1u,a)>=0)});7(!a.M)6.3T=-1}N 6.1A=b})},3q:J(a){K a==10?(6.M?6[0].3d:V):6.4x().3t(a)},6S:J(a){K 6.5a(a).1V()},6Z:J(i){K 6.2K(i,i+1)},2K:J(){K 6.2F(1M.2l.2K.1i(6,18))},2c:J(b){K 6.2F(E.2c(6,J(a,i){K b.1P(a,i,a)}))},4R:J(){K 6.1b(6.54)},O:J(d,b){L a=d.23(".");a[1]=a[1]?"."+a[1]:"";7(b==V){L c=6.5n("8P"+a[1]+"!",[a[0]]);7(c==10&&6.M)c=E.O(6[0],d);K c==V&&a[1]?6.O(a[0]):c}N K 6.1N("8K"+a[1]+"!",[a[0],b]).R(J(){E.O(6,d,b)})},35:J(a){K 6.R(J(){E.35(6,a)})},3O:J(g,f,h,d){L e=6.M>1,3n;K 6.R(J(){7(!3n){3n=E.4a(g,6.2i);7(h)3n.8D()}L b=6;7(f&&E.12(6,"1O")&&E.12(3n[0],"4v"))b=6.3S("1U")[0]||6.38(6.2i.3s("1U"));L c=E([]);E.R(3n,J(){L a=e?E(6).5k(P)[0]:6;7(E.12(a,"1m")){c=c.1b(a)}N{7(a.15==1)c=c.1b(E("1m",a).1V());d.1P(b,a)}});c.R(6A)})}};E.2l.4T.2l=E.2l;J 6A(i,a){7(a.3Q)E.3P({1c:a.3Q,3l:S,1H:"1m"});N E.5g(a.1u||a.6x||a.3d||"");7(a.1a)a.1a.34(a)}E.1s=E.1n.1s=J(){L b=18[0]||{},i=1,M=18.M,5c=S,11;7(b.1k==8d){5c=b;b=18[1]||{};i=2}7(1o b!="3V"&&1o b!="J")b={};7(M==1){b=6;i=0}Q(;i<M;i++)7((11=18[i])!=V)Q(L a 1p 11){7(b===11[a])6w;7(5c&&11[a]&&1o 11[a]=="3V"&&b[a]&&!11[a].15)b[a]=E.1s(b[a],11[a]);N 7(11[a]!=10)b[a]=11[a]}K b};L F="3N"+(1B 3v()).3L(),6t=0,5b={};L H=/z-?4X|86-?84|1w|6k|7Z-?1R/i;E.1s({7Y:J(a){1e.$=D;7(a)1e.3N=w;K E},1q:J(a){K!!a&&1o a!="25"&&!a.12&&a.1k!=1M&&/J/i.17(a+"")},3E:J(a){K a.1F&&!a.1h||a.28&&a.2i&&!a.2i.1h},5g:J(a){a=E.3g(a);7(a){L b=T.3S("6f")[0]||T.1F,1m=T.3s("1m");1m.U="1u/4m";7(E.14.1d)1m.1u=a;N 1m.38(T.5r(a));b.38(1m);b.34(1m)}},12:J(b,a){K b.12&&b.12.2E()==a.2E()},1T:{},O:J(c,d,b){c=c==1e?5b:c;L a=c[F];7(!a)a=c[F]=++6t;7(d&&!E.1T[a])E.1T[a]={};7(b!=10)E.1T[a][d]=b;K d?E.1T[a][d]:a},35:J(c,b){c=c==1e?5b:c;L a=c[F];7(b){7(E.1T[a]){2V E.1T[a][b];b="";Q(b 1p E.1T[a])1Q;7(!b)E.35(c)}}N{1S{2V c[F]}1X(e){7(c.52)c.52(F)}2V E.1T[a]}},R:J(c,a,b){7(b){7(c.M==10){Q(L d 1p c)7(a.1i(c[d],b)===S)1Q}N Q(L i=0,M=c.M;i<M;i++)7(a.1i(c[i],b)===S)1Q}N{7(c.M==10){Q(L d 1p c)7(a.1P(c[d],d,c[d])===S)1Q}N Q(L i=0,M=c.M,1A=c[0];i<M&&a.1P(1A,i,1A)!==S;1A=c[++i]){}}K c},1l:J(b,a,c,i,d){7(E.1q(a))a=a.1P(b,i);K a&&a.1k==51&&c=="2o"&&!H.17(d)?a+"2S":a},1t:{1b:J(c,b){E.R((b||"").23(/\\s+/),J(i,a){7(c.15==1&&!E.1t.3Y(c.1t,a))c.1t+=(c.1t?" ":"")+a})},1V:J(c,b){7(c.15==1)c.1t=b!=10?E.3y(c.1t.23(/\\s+/),J(a){K!E.1t.3Y(b,a)}).6a(" "):""},3Y:J(b,a){K E.33(a,(b.1t||b).3X().23(/\\s+/))>-1}},68:J(b,c,a){L e={};Q(L d 1p c){e[d]=b.W[d];b.W[d]=c[d]}a.1P(b);Q(L d 1p c)b.W[d]=e[d]},1j:J(d,e,c){7(e=="27"||e=="1R"){L b,46={43:"4W",4U:"1Z",19:"3D"},3c=e=="27"?["7O","7M"]:["7J","7I"];J 5E(){b=e=="27"?d.7H:d.7F;L a=0,2N=0;E.R(3c,J(){a+=2M(E.2o(d,"7E"+6,P))||0;2N+=2M(E.2o(d,"2N"+6+"5X",P))||0});b-=24.7C(a+2N)}7(E(d).3H(":4d"))5E();N E.68(d,46,5E);K 24.2f(0,b)}K E.2o(d,e,c)},2o:J(e,k,j){L d;J 3x(b){7(!E.14.2d)K S;L a=T.4c.4K(b,V);K!a||a.4M("3x")==""}7(k=="1w"&&E.14.1d){d=E.1J(e.W,"1w");K d==""?"1":d}7(E.14.2z&&k=="19"){L c=e.W.50;e.W.50="0 7r 7o";e.W.50=c}7(k.1D(/4g/i))k=y;7(!j&&e.W&&e.W[k])d=e.W[k];N 7(T.4c&&T.4c.4K){7(k.1D(/4g/i))k="4g";k=k.1r(/([A-Z])/g,"-$1").2h();L h=T.4c.4K(e,V);7(h&&!3x(e))d=h.4M(k);N{L f=[],2C=[];Q(L a=e;a&&3x(a);a=a.1a)2C.4J(a);Q(L i=0;i<2C.M;i++)7(3x(2C[i])){f[i]=2C[i].W.19;2C[i].W.19="3D"}d=k=="19"&&f[2C.M-1]!=V?"2H":(h&&h.4M(k))||"";Q(L i=0;i<f.M;i++)7(f[i]!=V)2C[i].W.19=f[i]}7(k=="1w"&&d=="")d="1"}N 7(e.4n){L g=k.1r(/\\-(\\w)/g,J(a,b){K b.2E()});d=e.4n[k]||e.4n[g];7(!/^\\d+(2S)?$/i.17(d)&&/^\\d/.17(d)){L l=e.W.26,3K=e.3K.26;e.3K.26=e.4n.26;e.W.26=d||0;d=e.W.7f+"2S";e.W.26=l;e.3K.26=3K}}K d},4a:J(l,h){L k=[];h=h||T;7(1o h.3s==\'10\')h=h.2i||h[0]&&h[0].2i||T;E.R(l,J(i,d){7(!d)K;7(d.1k==51)d=d.3X();7(1o d=="25"){d=d.1r(/(<(\\w+)[^>]*?)\\/>/g,J(b,a,c){K c.1D(/^(aa|a6|7e|a5|4D|7a|a0|3m|9W|9U|9S)$/i)?b:a+"></"+c+">"});L f=E.3g(d).2h(),1x=h.3s("1x");L e=!f.1f("<9P")&&[1,"<2k 74=\'74\'>","</2k>"]||!f.1f("<9M")&&[1,"<73>","</73>"]||f.1D(/^<(9G|1U|9E|9B|9x)/)&&[1,"<1O>","</1O>"]||!f.1f("<4v")&&[2,"<1O><1U>","</1U></1O>"]||(!f.1f("<9w")||!f.1f("<9v"))&&[3,"<1O><1U><4v>","</4v></1U></1O>"]||!f.1f("<7e")&&[2,"<1O><1U></1U><6V>","</6V></1O>"]||E.14.1d&&[1,"1x<1x>","</1x>"]||[0,"",""];1x.3d=e[1]+d+e[2];2b(e[0]--)1x=1x.5o;7(E.14.1d){L g=!f.1f("<1O")&&f.1f("<1U")<0?1x.1C&&1x.1C.3p:e[1]=="<1O>"&&f.1f("<1U")<0?1x.3p:[];Q(L j=g.M-1;j>=0;--j)7(E.12(g[j],"1U")&&!g[j].3p.M)g[j].1a.34(g[j]);7(/^\\s/.17(d))1x.3o(h.5r(d.1D(/^\\s*/)[0]),1x.1C)}d=E.2I(1x.3p)}7(d.M===0&&(!E.12(d,"3u")&&!E.12(d,"2k")))K;7(d[0]==10||E.12(d,"3u")||d.11)k.1g(d);N k=E.37(k,d)});K k},1J:J(d,e,c){7(!d||d.15==3||d.15==8)K 10;L f=E.3E(d)?{}:E.46;7(e=="2p"&&E.14.2d)d.1a.3T;7(f[e]){7(c!=10)d[f[e]]=c;K d[f[e]]}N 7(E.14.1d&&e=="W")K E.1J(d.W,"9u",c);N 7(c==10&&E.14.1d&&E.12(d,"3u")&&(e=="9r"||e=="9o"))K d.9m(e).6K;N 7(d.28){7(c!=10){7(e=="U"&&E.12(d,"4D")&&d.1a)6Q"U 9i 9h\'t 9g 9e";d.9b(e,""+c)}7(E.14.1d&&/6O|3Q/.17(e)&&!E.3E(d))K d.4z(e,2);K d.4z(e)}N{7(e=="1w"&&E.14.1d){7(c!=10){d.6k=1;d.1E=(d.1E||"").1r(/6M\\([^)]*\\)/,"")+(2M(c).3X()=="96"?"":"6M(1w="+c*6L+")")}K d.1E&&d.1E.1f("1w=")>=0?(2M(d.1E.1D(/1w=([^)]*)/)[1])/6L).3X():""}e=e.1r(/-([a-z])/95,J(a,b){K b.2E()});7(c!=10)d[e]=c;K d[e]}},3g:J(a){K(a||"").1r(/^\\s+|\\s+$/g,"")},2I:J(b){L a=[];7(1o b!="93")Q(L i=0,M=b.M;i<M;i++)a.1g(b[i]);N a=b.2K(0);K a},33:J(b,a){Q(L i=0,M=a.M;i<M;i++)7(a[i]==b)K i;K-1},37:J(a,b){7(E.14.1d){Q(L i=0;b[i];i++)7(b[i].15!=8)a.1g(b[i])}N Q(L i=0;b[i];i++)a.1g(b[i]);K a},57:J(a){L c=[],2r={};1S{Q(L i=0,M=a.M;i<M;i++){L b=E.O(a[i]);7(!2r[b]){2r[b]=P;c.1g(a[i])}}}1X(e){c=a}K c},3y:J(c,a,d){L b=[];Q(L i=0,M=c.M;i<M;i++)7(!d&&a(c[i],i)||d&&!a(c[i],i))b.1g(c[i]);K b},2c:J(d,a){L c=[];Q(L i=0,M=d.M;i<M;i++){L b=a(d[i],i);7(b!==V&&b!=10){7(b.1k!=1M)b=[b];c=c.71(b)}}K c}});L v=8Y.8W.2h();E.14={5K:(v.1D(/.+(?:8T|8S|8R|8O)[\\/: ]([\\d.]+)/)||[])[1],2d:/77/.17(v),2z:/2z/.17(v),1d:/1d/.17(v)&&!/2z/.17(v),48:/48/.17(v)&&!/(8L|77)/.17(v)};L y=E.14.1d?"6H":"75";E.1s({8I:!E.14.1d||T.6F=="79",46:{"Q":"8F","8E":"1t","4g":y,75:y,6H:y,3d:"3d",1t:"1t",1A:"1A",2Y:"2Y",3k:"3k",8C:"8B",2p:"2p",8A:"8z",3T:"3T",6C:"6C",28:"28",12:"12"}});E.R({6B:J(a){K a.1a},8y:J(a){K E.4u(a,"1a")},8x:J(a){K E.2Z(a,2,"2B")},8v:J(a){K E.2Z(a,2,"4t")},8u:J(a){K E.4u(a,"2B")},8t:J(a){K E.4u(a,"4t")},8s:J(a){K E.5i(a.1a.1C,a)},8r:J(a){K E.5i(a.1C)},6z:J(a){K E.12(a,"8q")?a.8o||a.8n.T:E.2I(a.3p)}},J(c,d){E.1n[c]=J(b){L a=E.2c(6,d);7(b&&1o b=="25")a=E.3e(b,a);K 6.2F(E.57(a))}});E.R({6y:"3t",8m:"6q",3o:"6o",8l:"5a",8k:"6S"},J(c,b){E.1n[c]=J(){L a=18;K 6.R(J(){Q(L i=0,M=a.M;i<M;i++)E(a[i])[b](6)})}});E.R({8j:J(a){E.1J(6,a,"");7(6.15==1)6.52(a)},8i:J(a){E.1t.1b(6,a)},8h:J(a){E.1t.1V(6,a)},8g:J(a){E.1t[E.1t.3Y(6,a)?"1V":"1b"](6,a)},1V:J(a){7(!a||E.1E(a,[6]).r.M){E("*",6).1b(6).R(J(){E.16.1V(6);E.35(6)});7(6.1a)6.1a.34(6)}},4x:J(){E(">*",6).1V();2b(6.1C)6.34(6.1C)}},J(a,b){E.1n[a]=J(){K 6.R(b,18)}});E.R(["8f","5X"],J(i,c){L b=c.2h();E.1n[b]=J(a){K 6[0]==1e?E.14.2z&&T.1h["5e"+c]||E.14.2d&&1e["8e"+c]||T.6F=="79"&&T.1F["5e"+c]||T.1h["5e"+c]:6[0]==T?24.2f(24.2f(T.1h["5d"+c],T.1F["5d"+c]),24.2f(T.1h["5L"+c],T.1F["5L"+c])):a==10?(6.M?E.1j(6[0],b):V):6.1j(b,a.1k==4e?a:a+"2S")}});L C=E.14.2d&&4s(E.14.5K)<8c?"(?:[\\\\w*4r-]|\\\\\\\\.)":"(?:[\\\\w\\8b-\\8a*4r-]|\\\\\\\\.)",6v=1B 4q("^>\\\\s*("+C+"+)"),6u=1B 4q("^("+C+"+)(#)("+C+"+)"),6s=1B 4q("^([#.]?)("+C+"*)");E.1s({6r:{"":J(a,i,m){K m[2]=="*"||E.12(a,m[2])},"#":J(a,i,m){K a.4z("2w")==m[2]},":":{89:J(a,i,m){K i<m[3]-0},88:J(a,i,m){K i>m[3]-0},2Z:J(a,i,m){K m[3]-0==i},6Z:J(a,i,m){K m[3]-0==i},3j:J(a,i){K i==0},3J:J(a,i,m,r){K i==r.M-1},6n:J(a,i){K i%2==0},6l:J(a,i){K i%2},"3j-4p":J(a){K a.1a.3S("*")[0]==a},"3J-4p":J(a){K E.2Z(a.1a.5o,1,"4t")==a},"83-4p":J(a){K!E.2Z(a.1a.5o,2,"4t")},6B:J(a){K a.1C},4x:J(a){K!a.1C},82:J(a,i,m){K(a.6x||a.81||E(a).1u()||"").1f(m[3])>=0},4d:J(a){K"1Z"!=a.U&&E.1j(a,"19")!="2H"&&E.1j(a,"4U")!="1Z"},1Z:J(a){K"1Z"==a.U||E.1j(a,"19")=="2H"||E.1j(a,"4U")=="1Z"},80:J(a){K!a.2Y},2Y:J(a){K a.2Y},3k:J(a){K a.3k},2p:J(a){K a.2p||E.1J(a,"2p")},1u:J(a){K"1u"==a.U},5u:J(a){K"5u"==a.U},5t:J(a){K"5t"==a.U},59:J(a){K"59"==a.U},3I:J(a){K"3I"==a.U},58:J(a){K"58"==a.U},6j:J(a){K"6j"==a.U},6i:J(a){K"6i"==a.U},2G:J(a){K"2G"==a.U||E.12(a,"2G")},4D:J(a){K/4D|2k|6h|2G/i.17(a.12)},3Y:J(a,i,m){K E.2s(m[3],a).M},7X:J(a){K/h\\d/i.17(a.12)},7W:J(a){K E.3y(E.3G,J(b){K a==b.Y}).M}}},6g:[/^(\\[) *@?([\\w-]+) *([!*$^~=]*) *(\'?"?)(.*?)\\4 *\\]/,/^(:)([\\w-]+)\\("?\'?(.*?(\\(.*?\\))?[^(]*?)"?\'?\\)/,1B 4q("^([:.#]*)("+C+"+)")],3e:J(a,c,b){L d,2m=[];2b(a&&a!=d){d=a;L f=E.1E(a,c,b);a=f.t.1r(/^\\s*,\\s*/,"");2m=b?c=f.r:E.37(2m,f.r)}K 2m},2s:J(t,p){7(1o t!="25")K[t];7(p&&p.15!=1&&p.15!=9)K[];p=p||T;L d=[p],2r=[],3J,12;2b(t&&3J!=t){L r=[];3J=t;t=E.3g(t);L o=S;L g=6v;L m=g.2O(t);7(m){12=m[1].2E();Q(L i=0;d[i];i++)Q(L c=d[i].1C;c;c=c.2B)7(c.15==1&&(12=="*"||c.12.2E()==12))r.1g(c);d=r;t=t.1r(g,"");7(t.1f(" ")==0)6w;o=P}N{g=/^([>+~])\\s*(\\w*)/i;7((m=g.2O(t))!=V){r=[];L l={};12=m[2].2E();m=m[1];Q(L j=0,3f=d.M;j<3f;j++){L n=m=="~"||m=="+"?d[j].2B:d[j].1C;Q(;n;n=n.2B)7(n.15==1){L h=E.O(n);7(m=="~"&&l[h])1Q;7(!12||n.12.2E()==12){7(m=="~")l[h]=P;r.1g(n)}7(m=="+")1Q}}d=r;t=E.3g(t.1r(g,""));o=P}}7(t&&!o){7(!t.1f(",")){7(p==d[0])d.4l();2r=E.37(2r,d);r=d=[p];t=" "+t.6e(1,t.M)}N{L k=6u;L m=k.2O(t);7(m){m=[0,m[2],m[3],m[1]]}N{k=6s;m=k.2O(t)}m[2]=m[2].1r(/\\\\/g,"");L f=d[d.M-1];7(m[1]=="#"&&f&&f.5J&&!E.3E(f)){L q=f.5J(m[2]);7((E.14.1d||E.14.2z)&&q&&1o q.2w=="25"&&q.2w!=m[2])q=E(\'[@2w="\'+m[2]+\'"]\',f)[0];d=r=q&&(!m[3]||E.12(q,m[3]))?[q]:[]}N{Q(L i=0;d[i];i++){L a=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];7(a=="*"&&d[i].12.2h()=="3V")a="3m";r=E.37(r,d[i].3S(a))}7(m[1]==".")r=E.55(r,m[2]);7(m[1]=="#"){L e=[];Q(L i=0;r[i];i++)7(r[i].4z("2w")==m[2]){e=[r[i]];1Q}r=e}d=r}t=t.1r(k,"")}}7(t){L b=E.1E(t,r);d=r=b.r;t=E.3g(b.t)}}7(t)d=[];7(d&&p==d[0])d.4l();2r=E.37(2r,d);K 2r},55:J(r,m,a){m=" "+m+" ";L c=[];Q(L i=0;r[i];i++){L b=(" "+r[i].1t+" ").1f(m)>=0;7(!a&&b||a&&!b)c.1g(r[i])}K c},1E:J(t,r,h){L d;2b(t&&t!=d){d=t;L p=E.6g,m;Q(L i=0;p[i];i++){m=p[i].2O(t);7(m){t=t.7V(m[0].M);m[2]=m[2].1r(/\\\\/g,"");1Q}}7(!m)1Q;7(m[1]==":"&&m[2]=="56")r=G.17(m[3])?E.1E(m[3],r,P).r:E(r).56(m[3]);N 7(m[1]==".")r=E.55(r,m[2],h);N 7(m[1]=="["){L g=[],U=m[3];Q(L i=0,3f=r.M;i<3f;i++){L a=r[i],z=a[E.46[m[2]]||m[2]];7(z==V||/6O|3Q|2p/.17(m[2]))z=E.1J(a,m[2])||\'\';7((U==""&&!!z||U=="="&&z==m[5]||U=="!="&&z!=m[5]||U=="^="&&z&&!z.1f(m[5])||U=="$="&&z.6e(z.M-m[5].M)==m[5]||(U=="*="||U=="~=")&&z.1f(m[5])>=0)^h)g.1g(a)}r=g}N 7(m[1]==":"&&m[2]=="2Z-4p"){L e={},g=[],17=/(-?)(\\d*)n((?:\\+|-)?\\d*)/.2O(m[3]=="6n"&&"2n"||m[3]=="6l"&&"2n+1"||!/\\D/.17(m[3])&&"7U+"+m[3]||m[3]),3j=(17[1]+(17[2]||1))-0,d=17[3]-0;Q(L i=0,3f=r.M;i<3f;i++){L j=r[i],1a=j.1a,2w=E.O(1a);7(!e[2w]){L c=1;Q(L n=1a.1C;n;n=n.2B)7(n.15==1)n.4k=c++;e[2w]=P}L b=S;7(3j==0){7(j.4k==d)b=P}N 7((j.4k-d)%3j==0&&(j.4k-d)/3j>=0)b=P;7(b^h)g.1g(j)}r=g}N{L f=E.6r[m[1]];7(1o f=="3V")f=f[m[2]];7(1o f=="25")f=6c("S||J(a,i){K "+f+";}");r=E.3y(r,J(a,i){K f(a,i,m,r)},h)}}K{r:r,t:t}},4u:J(b,c){L d=[];L a=b[c];2b(a&&a!=T){7(a.15==1)d.1g(a);a=a[c]}K d},2Z:J(a,e,c,b){e=e||1;L d=0;Q(;a;a=a[c])7(a.15==1&&++d==e)1Q;K a},5i:J(n,a){L r=[];Q(;n;n=n.2B){7(n.15==1&&(!a||n!=a))r.1g(n)}K r}});E.16={1b:J(f,i,g,e){7(f.15==3||f.15==8)K;7(E.14.1d&&f.53!=10)f=1e;7(!g.2D)g.2D=6.2D++;7(e!=10){L h=g;g=J(){K h.1i(6,18)};g.O=e;g.2D=h.2D}L j=E.O(f,"2R")||E.O(f,"2R",{}),1v=E.O(f,"1v")||E.O(f,"1v",J(){L a;7(1o E=="10"||E.16.5f)K a;a=E.16.1v.1i(18.3R.Y,18);K a});1v.Y=f;E.R(i.23(/\\s+/),J(c,b){L a=b.23(".");b=a[0];g.U=a[1];L d=j[b];7(!d){d=j[b]={};7(!E.16.2y[b]||E.16.2y[b].4j.1P(f)===S){7(f.3F)f.3F(b,1v,S);N 7(f.6b)f.6b("4i"+b,1v)}}d[g.2D]=g;E.16.2a[b]=P});f=V},2D:1,2a:{},1V:J(e,h,f){7(e.15==3||e.15==8)K;L i=E.O(e,"2R"),29,4X;7(i){7(h==10||(1o h=="25"&&h.7T(0)=="."))Q(L g 1p i)6.1V(e,g+(h||""));N{7(h.U){f=h.2q;h=h.U}E.R(h.23(/\\s+/),J(b,a){L c=a.23(".");a=c[0];7(i[a]){7(f)2V i[a][f.2D];N Q(f 1p i[a])7(!c[1]||i[a][f].U==c[1])2V i[a][f];Q(29 1p i[a])1Q;7(!29){7(!E.16.2y[a]||E.16.2y[a].4h.1P(e)===S){7(e.67)e.67(a,E.O(e,"1v"),S);N 7(e.66)e.66("4i"+a,E.O(e,"1v"))}29=V;2V i[a]}}})}Q(29 1p i)1Q;7(!29){L d=E.O(e,"1v");7(d)d.Y=V;E.35(e,"2R");E.35(e,"1v")}}},1N:J(g,c,d,f,h){c=E.2I(c||[]);7(g.1f("!")>=0){g=g.2K(0,-1);L a=P}7(!d){7(6.2a[g])E("*").1b([1e,T]).1N(g,c)}N{7(d.15==3||d.15==8)K 10;L b,29,1n=E.1q(d[g]||V),16=!c[0]||!c[0].36;7(16)c.4J(6.4Z({U:g,2L:d}));c[0].U=g;7(a)c[0].65=P;7(E.1q(E.O(d,"1v")))b=E.O(d,"1v").1i(d,c);7(!1n&&d["4i"+g]&&d["4i"+g].1i(d,c)===S)b=S;7(16)c.4l();7(h&&E.1q(h)){29=h.1i(d,b==V?c:c.71(b));7(29!==10)b=29}7(1n&&f!==S&&b!==S&&!(E.12(d,\'a\')&&g=="4V")){6.5f=P;1S{d[g]()}1X(e){}}6.5f=S}K b},1v:J(c){L a;c=E.16.4Z(c||1e.16||{});L b=c.U.23(".");c.U=b[0];L f=E.O(6,"2R")&&E.O(6,"2R")[c.U],42=1M.2l.2K.1P(18,1);42.4J(c);Q(L j 1p f){L d=f[j];42[0].2q=d;42[0].O=d.O;7(!b[1]&&!c.65||d.U==b[1]){L e=d.1i(6,42);7(a!==S)a=e;7(e===S){c.36();c.44()}}}7(E.14.1d)c.2L=c.36=c.44=c.2q=c.O=V;K a},4Z:J(c){L a=c;c=E.1s({},a);c.36=J(){7(a.36)a.36();a.7S=S};c.44=J(){7(a.44)a.44();a.7R=P};7(!c.2L)c.2L=c.7Q||T;7(c.2L.15==3)c.2L=a.2L.1a;7(!c.4S&&c.5w)c.4S=c.5w==c.2L?c.7P:c.5w;7(c.64==V&&c.63!=V){L b=T.1F,1h=T.1h;c.64=c.63+(b&&b.2v||1h&&1h.2v||0)-(b.62||0);c.7N=c.7L+(b&&b.2x||1h&&1h.2x||0)-(b.60||0)}7(!c.3c&&((c.4f||c.4f===0)?c.4f:c.5Z))c.3c=c.4f||c.5Z;7(!c.7b&&c.5Y)c.7b=c.5Y;7(!c.3c&&c.2G)c.3c=(c.2G&1?1:(c.2G&2?3:(c.2G&4?2:0)));K c},2y:{21:{4j:J(){5M();K},4h:J(){K}},3C:{4j:J(){7(E.14.1d)K S;E(6).2j("4P",E.16.2y.3C.2q);K P},4h:J(){7(E.14.1d)K S;E(6).3w("4P",E.16.2y.3C.2q);K P},2q:J(a){7(I(a,6))K P;18[0].U="3C";K E.16.1v.1i(6,18)}},3B:{4j:J(){7(E.14.1d)K S;E(6).2j("4O",E.16.2y.3B.2q);K P},4h:J(){7(E.14.1d)K S;E(6).3w("4O",E.16.2y.3B.2q);K P},2q:J(a){7(I(a,6))K P;18[0].U="3B";K E.16.1v.1i(6,18)}}}};E.1n.1s({2j:J(c,a,b){K c=="4H"?6.2X(c,a,b):6.R(J(){E.16.1b(6,c,b||a,b&&a)})},2X:J(d,b,c){K 6.R(J(){E.16.1b(6,d,J(a){E(6).3w(a);K(c||b).1i(6,18)},c&&b)})},3w:J(a,b){K 6.R(J(){E.16.1V(6,a,b)})},1N:J(c,a,b){K 6.R(J(){E.16.1N(c,a,6,P,b)})},5n:J(c,a,b){7(6[0])K E.16.1N(c,a,6[0],S,b);K 10},2g:J(){L b=18;K 6.4V(J(a){6.4N=0==6.4N?1:0;a.36();K b[6.4N].1i(6,18)||S})},7D:J(a,b){K 6.2j(\'3C\',a).2j(\'3B\',b)},21:J(a){5M();7(E.2Q)a.1P(T,E);N E.3A.1g(J(){K a.1P(6,E)});K 6}});E.1s({2Q:S,3A:[],21:J(){7(!E.2Q){E.2Q=P;7(E.3A){E.R(E.3A,J(){6.1i(T)});E.3A=V}E(T).5n("21")}}});L x=S;J 5M(){7(x)K;x=P;7(T.3F&&!E.14.2z)T.3F("5W",E.21,S);7(E.14.1d&&1e==3b)(J(){7(E.2Q)K;1S{T.1F.7B("26")}1X(3a){3z(18.3R,0);K}E.21()})();7(E.14.2z)T.3F("5W",J(){7(E.2Q)K;Q(L i=0;i<T.4L.M;i++)7(T.4L[i].2Y){3z(18.3R,0);K}E.21()},S);7(E.14.2d){L a;(J(){7(E.2Q)K;7(T.39!="5V"&&T.39!="1y"){3z(18.3R,0);K}7(a===10)a=E("W, 7a[7A=7z]").M;7(T.4L.M!=a){3z(18.3R,0);K}E.21()})()}E.16.1b(1e,"3U",E.21)}E.R(("7y,7x,3U,7w,5d,4H,4V,7v,"+"7G,7u,7t,4P,4O,7s,2k,"+"58,7K,7q,7p,3a").23(","),J(i,b){E.1n[b]=J(a){K a?6.2j(b,a):6.1N(b)}});L I=J(a,c){L b=a.4S;2b(b&&b!=c)1S{b=b.1a}1X(3a){b=c}K b==c};E(1e).2j("4H",J(){E("*").1b(T).3w()});E.1n.1s({3U:J(g,d,c){7(E.1q(g))K 6.2j("3U",g);L e=g.1f(" ");7(e>=0){L i=g.2K(e,g.M);g=g.2K(0,e)}c=c||J(){};L f="4Q";7(d)7(E.1q(d)){c=d;d=V}N{d=E.3m(d);f="61"}L h=6;E.3P({1c:g,U:f,1H:"3q",O:d,1y:J(a,b){7(b=="1W"||b=="5U")h.3q(i?E("<1x/>").3t(a.4b.1r(/<1m(.|\\s)*?\\/1m>/g,"")).2s(i):a.4b);h.R(c,[a.4b,b,a])}});K 6},7n:J(){K E.3m(6.5T())},5T:J(){K 6.2c(J(){K E.12(6,"3u")?E.2I(6.7m):6}).1E(J(){K 6.31&&!6.2Y&&(6.3k||/2k|6h/i.17(6.12)||/1u|1Z|3I/i.17(6.U))}).2c(J(i,c){L b=E(6).5O();K b==V?V:b.1k==1M?E.2c(b,J(a,i){K{31:c.31,1A:a}}):{31:c.31,1A:b}}).22()}});E.R("5S,6d,5R,6D,5Q,6m".23(","),J(i,o){E.1n[o]=J(f){K 6.2j(o,f)}});L B=(1B 3v).3L();E.1s({22:J(d,b,a,c){7(E.1q(b)){a=b;b=V}K E.3P({U:"4Q",1c:d,O:b,1W:a,1H:c})},7l:J(b,a){K E.22(b,V,a,"1m")},7k:J(c,b,a){K E.22(c,b,a,"3i")},7i:J(d,b,a,c){7(E.1q(b)){a=b;b={}}K E.3P({U:"61",1c:d,O:b,1W:a,1H:c})},85:J(a){E.1s(E.4I,a)},4I:{2a:P,U:"4Q",2U:0,5P:"4o/x-7h-3u-7g",5N:P,3l:P,O:V,6p:V,3I:V,49:{3M:"4o/3M, 1u/3M",3q:"1u/3q",1m:"1u/4m, 4o/4m",3i:"4o/3i, 1u/4m",1u:"1u/a7",4G:"*/*"}},4F:{},3P:J(s){L f,2W=/=\\?(&|$)/g,1z,O;s=E.1s(P,s,E.1s(P,{},E.4I,s));7(s.O&&s.5N&&1o s.O!="25")s.O=E.3m(s.O);7(s.1H=="4E"){7(s.U.2h()=="22"){7(!s.1c.1D(2W))s.1c+=(s.1c.1D(/\\?/)?"&":"?")+(s.4E||"7d")+"=?"}N 7(!s.O||!s.O.1D(2W))s.O=(s.O?s.O+"&":"")+(s.4E||"7d")+"=?";s.1H="3i"}7(s.1H=="3i"&&(s.O&&s.O.1D(2W)||s.1c.1D(2W))){f="4E"+B++;7(s.O)s.O=(s.O+"").1r(2W,"="+f+"$1");s.1c=s.1c.1r(2W,"="+f+"$1");s.1H="1m";1e[f]=J(a){O=a;1W();1y();1e[f]=10;1S{2V 1e[f]}1X(e){}7(h)h.34(g)}}7(s.1H=="1m"&&s.1T==V)s.1T=S;7(s.1T===S&&s.U.2h()=="22"){L i=(1B 3v()).3L();L j=s.1c.1r(/(\\?|&)4r=.*?(&|$)/,"$a4="+i+"$2");s.1c=j+((j==s.1c)?(s.1c.1D(/\\?/)?"&":"?")+"4r="+i:"")}7(s.O&&s.U.2h()=="22"){s.1c+=(s.1c.1D(/\\?/)?"&":"?")+s.O;s.O=V}7(s.2a&&!E.5H++)E.16.1N("5S");7((!s.1c.1f("a3")||!s.1c.1f("//"))&&s.1H=="1m"&&s.U.2h()=="22"){L h=T.3S("6f")[0];L g=T.3s("1m");g.3Q=s.1c;7(s.7c)g.a2=s.7c;7(!f){L l=S;g.9Z=g.9Y=J(){7(!l&&(!6.39||6.39=="5V"||6.39=="1y")){l=P;1W();1y();h.34(g)}}}h.38(g);K 10}L m=S;L k=1e.78?1B 78("9X.9V"):1B 76();k.9T(s.U,s.1c,s.3l,s.6p,s.3I);1S{7(s.O)k.4C("9R-9Q",s.5P);7(s.5C)k.4C("9O-5A-9N",E.4F[s.1c]||"9L, 9K 9I 9H 5z:5z:5z 9F");k.4C("X-9C-9A","76");k.4C("9z",s.1H&&s.49[s.1H]?s.49[s.1H]+", */*":s.49.4G)}1X(e){}7(s.6Y)s.6Y(k);7(s.2a)E.16.1N("6m",[k,s]);L c=J(a){7(!m&&k&&(k.39==4||a=="2U")){m=P;7(d){6I(d);d=V}1z=a=="2U"&&"2U"||!E.6X(k)&&"3a"||s.5C&&E.6J(k,s.1c)&&"5U"||"1W";7(1z=="1W"){1S{O=E.6W(k,s.1H)}1X(e){1z="5x"}}7(1z=="1W"){L b;1S{b=k.5q("6U-5A")}1X(e){}7(s.5C&&b)E.4F[s.1c]=b;7(!f)1W()}N E.5v(s,k,1z);1y();7(s.3l)k=V}};7(s.3l){L d=53(c,13);7(s.2U>0)3z(J(){7(k){k.9t();7(!m)c("2U")}},s.2U)}1S{k.9s(s.O)}1X(e){E.5v(s,k,V,e)}7(!s.3l)c();J 1W(){7(s.1W)s.1W(O,1z);7(s.2a)E.16.1N("5Q",[k,s])}J 1y(){7(s.1y)s.1y(k,1z);7(s.2a)E.16.1N("5R",[k,s]);7(s.2a&&!--E.5H)E.16.1N("6d")}K k},5v:J(s,a,b,e){7(s.3a)s.3a(a,b,e);7(s.2a)E.16.1N("6D",[a,s,e])},5H:0,6X:J(r){1S{K!r.1z&&9q.9p=="59:"||(r.1z>=6T&&r.1z<9n)||r.1z==6R||r.1z==9l||E.14.2d&&r.1z==10}1X(e){}K S},6J:J(a,c){1S{L b=a.5q("6U-5A");K a.1z==6R||b==E.4F[c]||E.14.2d&&a.1z==10}1X(e){}K S},6W:J(r,b){L c=r.5q("9k-U");L d=b=="3M"||!b&&c&&c.1f("3M")>=0;L a=d?r.9j:r.4b;7(d&&a.1F.28=="5x")6Q"5x";7(b=="1m")E.5g(a);7(b=="3i")a=6c("("+a+")");K a},3m:J(a){L s=[];7(a.1k==1M||a.5h)E.R(a,J(){s.1g(3r(6.31)+"="+3r(6.1A))});N Q(L j 1p a)7(a[j]&&a[j].1k==1M)E.R(a[j],J(){s.1g(3r(j)+"="+3r(6))});N s.1g(3r(j)+"="+3r(a[j]));K s.6a("&").1r(/%20/g,"+")}});E.1n.1s({1G:J(c,b){K c?6.2e({1R:"1G",27:"1G",1w:"1G"},c,b):6.1E(":1Z").R(J(){6.W.19=6.5s||"";7(E.1j(6,"19")=="2H"){L a=E("<"+6.28+" />").6y("1h");6.W.19=a.1j("19");7(6.W.19=="2H")6.W.19="3D";a.1V()}}).3h()},1I:J(b,a){K b?6.2e({1R:"1I",27:"1I",1w:"1I"},b,a):6.1E(":4d").R(J(){6.5s=6.5s||E.1j(6,"19");6.W.19="2H"}).3h()},6N:E.1n.2g,2g:J(a,b){K E.1q(a)&&E.1q(b)?6.6N(a,b):a?6.2e({1R:"2g",27:"2g",1w:"2g"},a,b):6.R(J(){E(6)[E(6).3H(":1Z")?"1G":"1I"]()})},9f:J(b,a){K 6.2e({1R:"1G"},b,a)},9d:J(b,a){K 6.2e({1R:"1I"},b,a)},9c:J(b,a){K 6.2e({1R:"2g"},b,a)},9a:J(b,a){K 6.2e({1w:"1G"},b,a)},99:J(b,a){K 6.2e({1w:"1I"},b,a)},97:J(c,a,b){K 6.2e({1w:a},c,b)},2e:J(l,k,j,h){L i=E.6P(k,j,h);K 6[i.2P===S?"R":"2P"](J(){7(6.15!=1)K S;L g=E.1s({},i);L f=E(6).3H(":1Z"),4A=6;Q(L p 1p l){7(l[p]=="1I"&&f||l[p]=="1G"&&!f)K E.1q(g.1y)&&g.1y.1i(6);7(p=="1R"||p=="27"){g.19=E.1j(6,"19");g.32=6.W.32}}7(g.32!=V)6.W.32="1Z";g.40=E.1s({},l);E.R(l,J(c,a){L e=1B E.2t(4A,g,c);7(/2g|1G|1I/.17(a))e[a=="2g"?f?"1G":"1I":a](l);N{L b=a.3X().1D(/^([+-]=)?([\\d+-.]+)(.*)$/),1Y=e.2m(P)||0;7(b){L d=2M(b[2]),2A=b[3]||"2S";7(2A!="2S"){4A.W[c]=(d||1)+2A;1Y=((d||1)/e.2m(P))*1Y;4A.W[c]=1Y+2A}7(b[1])d=((b[1]=="-="?-1:1)*d)+1Y;e.45(1Y,d,2A)}N e.45(1Y,a,"")}});K P})},2P:J(a,b){7(E.1q(a)||(a&&a.1k==1M)){b=a;a="2t"}7(!a||(1o a=="25"&&!b))K A(6[0],a);K 6.R(J(){7(b.1k==1M)A(6,a,b);N{A(6,a).1g(b);7(A(6,a).M==1)b.1i(6)}})},94:J(b,c){L a=E.3G;7(b)6.2P([]);6.R(J(){Q(L i=a.M-1;i>=0;i--)7(a[i].Y==6){7(c)a[i](P);a.72(i,1)}});7(!c)6.5p();K 6}});L A=J(b,c,a){7(!b)K 10;c=c||"2t";L q=E.O(b,c+"2P");7(!q||a)q=E.O(b,c+"2P",a?E.2I(a):[]);K q};E.1n.5p=J(a){a=a||"2t";K 6.R(J(){L q=A(6,a);q.4l();7(q.M)q[0].1i(6)})};E.1s({6P:J(b,a,c){L d=b&&b.1k==92?b:{1y:c||!c&&a||E.1q(b)&&b,2u:b,3Z:c&&a||a&&a.1k!=91&&a};d.2u=(d.2u&&d.2u.1k==51?d.2u:{90:8Z,9D:6T}[d.2u])||8X;d.5y=d.1y;d.1y=J(){7(d.2P!==S)E(6).5p();7(E.1q(d.5y))d.5y.1i(6)};K d},3Z:{70:J(p,n,b,a){K b+a*p},5j:J(p,n,b,a){K((-24.8V(p*24.8U)/2)+0.5)*a+b}},3G:[],3W:V,2t:J(b,c,a){6.11=c;6.Y=b;6.1l=a;7(!c.47)c.47={}}});E.2t.2l={4y:J(){7(6.11.30)6.11.30.1i(6.Y,[6.2J,6]);(E.2t.30[6.1l]||E.2t.30.4G)(6);7(6.1l=="1R"||6.1l=="27")6.Y.W.19="3D"},2m:J(a){7(6.Y[6.1l]!=V&&6.Y.W[6.1l]==V)K 6.Y[6.1l];L r=2M(E.1j(6.Y,6.1l,a));K r&&r>-8Q?r:2M(E.2o(6.Y,6.1l))||0},45:J(c,b,d){6.5B=(1B 3v()).3L();6.1Y=c;6.3h=b;6.2A=d||6.2A||"2S";6.2J=6.1Y;6.4B=6.4w=0;6.4y();L e=6;J t(a){K e.30(a)}t.Y=6.Y;E.3G.1g(t);7(E.3W==V){E.3W=53(J(){L a=E.3G;Q(L i=0;i<a.M;i++)7(!a[i]())a.72(i--,1);7(!a.M){6I(E.3W);E.3W=V}},13)}},1G:J(){6.11.47[6.1l]=E.1J(6.Y.W,6.1l);6.11.1G=P;6.45(0,6.2m());7(6.1l=="27"||6.1l=="1R")6.Y.W[6.1l]="8N";E(6.Y).1G()},1I:J(){6.11.47[6.1l]=E.1J(6.Y.W,6.1l);6.11.1I=P;6.45(6.2m(),0)},30:J(a){L t=(1B 3v()).3L();7(a||t>6.11.2u+6.5B){6.2J=6.3h;6.4B=6.4w=1;6.4y();6.11.40[6.1l]=P;L b=P;Q(L i 1p 6.11.40)7(6.11.40[i]!==P)b=S;7(b){7(6.11.19!=V){6.Y.W.32=6.11.32;6.Y.W.19=6.11.19;7(E.1j(6.Y,"19")=="2H")6.Y.W.19="3D"}7(6.11.1I)6.Y.W.19="2H";7(6.11.1I||6.11.1G)Q(L p 1p 6.11.40)E.1J(6.Y.W,p,6.11.47[p])}7(b&&E.1q(6.11.1y))6.11.1y.1i(6.Y);K S}N{L n=t-6.5B;6.4w=n/6.11.2u;6.4B=E.3Z[6.11.3Z||(E.3Z.5j?"5j":"70")](6.4w,n,0,1,6.11.2u);6.2J=6.1Y+((6.3h-6.1Y)*6.4B);6.4y()}K P}};E.2t.30={2v:J(a){a.Y.2v=a.2J},2x:J(a){a.Y.2x=a.2J},1w:J(a){E.1J(a.Y.W,"1w",a.2J)},4G:J(a){a.Y.W[a.1l]=a.2J+a.2A}};E.1n.5L=J(){L b=0,3b=0,Y=6[0],5l;7(Y)8M(E.14){L d=Y.1a,41=Y,1K=Y.1K,1L=Y.2i,5D=2d&&4s(5K)<8J&&!/a1/i.17(v),2T=E.1j(Y,"43")=="2T";7(Y.6G){L c=Y.6G();1b(c.26+24.2f(1L.1F.2v,1L.1h.2v),c.3b+24.2f(1L.1F.2x,1L.1h.2x));1b(-1L.1F.62,-1L.1F.60)}N{1b(Y.5G,Y.5F);2b(1K){1b(1K.5G,1K.5F);7(48&&!/^t(8H|d|h)$/i.17(1K.28)||2d&&!5D)2N(1K);7(!2T&&E.1j(1K,"43")=="2T")2T=P;41=/^1h$/i.17(1K.28)?41:1K;1K=1K.1K}2b(d&&d.28&&!/^1h|3q$/i.17(d.28)){7(!/^8G|1O.*$/i.17(E.1j(d,"19")))1b(-d.2v,-d.2x);7(48&&E.1j(d,"32")!="4d")2N(d);d=d.1a}7((5D&&(2T||E.1j(41,"43")=="4W"))||(48&&E.1j(41,"43")!="4W"))1b(-1L.1h.5G,-1L.1h.5F);7(2T)1b(24.2f(1L.1F.2v,1L.1h.2v),24.2f(1L.1F.2x,1L.1h.2x))}5l={3b:3b,26:b}}J 2N(a){1b(E.2o(a,"a8",P),E.2o(a,"a9",P))}J 1b(l,t){b+=4s(l)||0;3b+=4s(t)||0}K 5l}})();',62,631,'||||||this|if||||||||||||||||||||||||||||||||||||||function|return|var|length|else|data|true|for|each|false|document|type|null|style||elem||undefined|options|nodeName||browser|nodeType|event|test|arguments|display|parentNode|add|url|msie|window|indexOf|push|body|apply|css|constructor|prop|script|fn|typeof|in|isFunction|replace|extend|className|text|handle|opacity|div|complete|status|value|new|firstChild|match|filter|documentElement|show|dataType|hide|attr|offsetParent|doc|Array|trigger|table|call|break|height|try|cache|tbody|remove|success|catch|start|hidden||ready|get|split|Math|string|left|width|tagName|ret|global|while|map|safari|animate|max|toggle|toLowerCase|ownerDocument|bind|select|prototype|cur||curCSS|selected|handler|done|find|fx|duration|scrollLeft|id|scrollTop|special|opera|unit|nextSibling|stack|guid|toUpperCase|pushStack|button|none|makeArray|now|slice|target|parseFloat|border|exec|queue|isReady|events|px|fixed|timeout|delete|jsre|one|disabled|nth|step|name|overflow|inArray|removeChild|removeData|preventDefault|merge|appendChild|readyState|error|top|which|innerHTML|multiFilter|rl|trim|end|json|first|checked|async|param|elems|insertBefore|childNodes|html|encodeURIComponent|createElement|append|form|Date|unbind|color|grep|setTimeout|readyList|mouseleave|mouseenter|block|isXMLDoc|addEventListener|timers|is|password|last|runtimeStyle|getTime|xml|jQuery|domManip|ajax|src|callee|getElementsByTagName|selectedIndex|load|object|timerId|toString|has|easing|curAnim|offsetChild|args|position|stopPropagation|custom|props|orig|mozilla|accepts|clean|responseText|defaultView|visible|String|charCode|float|teardown|on|setup|nodeIndex|shift|javascript|currentStyle|application|child|RegExp|_|parseInt|previousSibling|dir|tr|state|empty|update|getAttribute|self|pos|setRequestHeader|input|jsonp|lastModified|_default|unload|ajaxSettings|unshift|getComputedStyle|styleSheets|getPropertyValue|lastToggle|mouseout|mouseover|GET|andSelf|relatedTarget|init|visibility|click|absolute|index|container|fix|outline|Number|removeAttribute|setInterval|prevObject|classFilter|not|unique|submit|file|after|windowData|deep|scroll|client|triggered|globalEval|jquery|sibling|swing|clone|results|wrapAll|triggerHandler|lastChild|dequeue|getResponseHeader|createTextNode|oldblock|checkbox|radio|handleError|fromElement|parsererror|old|00|Modified|startTime|ifModified|safari2|getWH|offsetTop|offsetLeft|active|values|getElementById|version|offset|bindReady|processData|val|contentType|ajaxSuccess|ajaxComplete|ajaxStart|serializeArray|notmodified|loaded|DOMContentLoaded|Width|ctrlKey|keyCode|clientTop|POST|clientLeft|clientX|pageX|exclusive|detachEvent|removeEventListener|swap|cloneNode|join|attachEvent|eval|ajaxStop|substr|head|parse|textarea|reset|image|zoom|odd|ajaxSend|even|before|username|prepend|expr|quickClass|uuid|quickID|quickChild|continue|textContent|appendTo|contents|evalScript|parent|defaultValue|ajaxError|setArray|compatMode|getBoundingClientRect|styleFloat|clearInterval|httpNotModified|nodeValue|100|alpha|_toggle|href|speed|throw|304|replaceWith|200|Last|colgroup|httpData|httpSuccess|beforeSend|eq|linear|concat|splice|fieldset|multiple|cssFloat|XMLHttpRequest|webkit|ActiveXObject|CSS1Compat|link|metaKey|scriptCharset|callback|col|pixelLeft|urlencoded|www|post|hasClass|getJSON|getScript|elements|serialize|black|keyup|keypress|solid|change|mousemove|mouseup|dblclick|resize|focus|blur|stylesheet|rel|doScroll|round|hover|padding|offsetHeight|mousedown|offsetWidth|Bottom|Top|keydown|clientY|Right|pageY|Left|toElement|srcElement|cancelBubble|returnValue|charAt|0n|substring|animated|header|noConflict|line|enabled|innerText|contains|only|weight|ajaxSetup|font|size|gt|lt|uFFFF|u0128|417|Boolean|inner|Height|toggleClass|removeClass|addClass|removeAttr|replaceAll|insertAfter|prependTo|contentWindow|contentDocument|wrap|iframe|children|siblings|prevAll|nextAll|prev|wrapInner|next|parents|maxLength|maxlength|readOnly|readonly|reverse|class|htmlFor|inline|able|boxModel|522|setData|compatible|with|1px|ie|getData|10000|ra|it|rv|PI|cos|userAgent|400|navigator|600|slow|Function|Object|array|stop|ig|NaN|fadeTo|option|fadeOut|fadeIn|setAttribute|slideToggle|slideUp|changed|slideDown|be|can|property|responseXML|content|1223|getAttributeNode|300|method|protocol|location|action|send|abort|cssText|th|td|cap|specified|Accept|With|colg|Requested|fast|tfoot|GMT|thead|1970|Jan|attributes|01|Thu|leg|Since|If|opt|Type|Content|embed|open|area|XMLHTTP|hr|Microsoft|onreadystatechange|onload|meta|adobeair|charset|http|1_|img|br|plain|borderLeftWidth|borderTopWidth|abbr'.split('|'),0,{})) \ No newline at end of file
diff --git a/templates/base.html b/templates/base.html
index 5755523..5af83ff 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -60,15 +60,24 @@
<header>
<nav>
<ul>
- <li id="stories"><a href="/writing/1/" title="An archive of previous writings from around the world">I write.</a></li>
- <li id="map" title="Maps and miscellanea"><a href="/map/">I travel.</a></li>
- <li id="photos" title="Photos from travels around the world"><a href="/photos/1/">I record.</a></li>
+ <li id="stories"><a href="/writing/1/" title="An archive of previous writings from around the world">Writing</a></li>
+ <li id="photos" title="Photos from travels around the world"><a href="/photos/1/">Photos</a></li>
+ <li id="map" title="Maps and miscellanea"><a href="/map/">Maps</a></li>
+
</ul>
</nav>
<hgroup>
<h1><a href="/" title="home">Luxagraf</a></h1>
- <h2><a href="/about/" title="About Luxagraf">{a travelogue}</a></h2>
+ <h2>{a travelogue}</h2>
</hgroup>
+ <nav class="rt">
+ <ul>
+ <li id="projects" title="Luxagraf: Projects (coming soon)"><a href="/projects/">Projects</a></li>
+ <li id="contact" title="How to get in touch"><a href="/contact/">Contact</a></li>
+ <li id="about" title="About Luxagraf"><a href="/about/">About</a></li>
+
+ </ul>
+ </nav>
</header>
{% block primary %}
@@ -86,6 +95,7 @@
<li><a href="/writing/1/">Writing</a></li>
<li><a href="/map/">Map</a></li>
<li><a href="/photos/1/">Photographs</a></li>
+ <li><a href="/projects/">Projects</a></li>
<li><a href="/contact/">Contact</a></li>
</ul>
</nav>
diff --git a/templates/details/entry.html b/templates/details/entry.html
index 3e15f83..ccae192 100644
--- a/templates/details/entry.html
+++ b/templates/details/entry.html
@@ -1,9 +1,9 @@
{% extends 'base.html' %}
{% load typogrify %}
-{% block pagetitle %}{{object.title|title|smartypants|safe}} ({% ifequal object.location.state.country.name "United States" %}{{object.location.name|smartypants|safe}}, {{object.location.state.name}}{%else%}{{object.location.name|smartypants|safe}}, {{object.location.state.country.name}}{%endifequal%}) | Luxagraf, a travelogue{% endblock %}
+{% block pagetitle %}{{object.title|title|smartypants|safe}} | Luxagraf, a travelogue | {% ifequal object.location.state.country.name "United States" %}{{object.location.name|smartypants|safe}}, {{object.location.state.name}}{%else%}{{object.location.name|smartypants|safe}}, {{object.location.state.country.name}}{%endifequal%}){% endblock %}
-{% block metadescription %}Luxagraf: {{object.dek|striptags|safe}}{% endblock %}
+{% block metadescription %}{{object.meta_description|striptags|safe}}{% endblock %}
{%block extrahead%}
<link rel="canonical" href="http://luxagraf.net{{object.get_absolute_url}}" />
<meta name="ICBM" content="{{object.latitude}}, {{object.longitude}}" />
@@ -18,7 +18,7 @@
{% block primary %}
<article>
<section id="post">
- <h1>{{object.title|smartypants|safe}}</h1>
+ <h1>{{object.title|smartypants|widont|safe}}</h1>
<aside class="meta">
<div class="geo">{% ifequal object.location.state.country.name "United States" %}{{object.location.name|smartypants|safe}}, <a href="/writing/united-states/1/" title="travel writing from the United States">{{object.location.state.name}}</a>{%else%}{{object.location.name|smartypants|safe}}, <a href="/writing/{{object.location.state.country.slug}}/1/" title="travel writing from {{object.location.state.country.name}}">{{object.location.state.country.name}}</a>{%endifequal%} <span class="latitude hide">{{object.latitude}}</span> <span class="longitude hide">{{object.longitude}}</span></div>
<span class="topics">Topics: {%for topic in object.topics.all%}<a href="{{topic.get_absolute_url}}" title="view more {{topic.name}} posts">{{topic.name}}</a>{%if forloop.last%}{%else%}, {%endif%}{% endfor %}</span>
@@ -65,4 +65,4 @@
})();
//]]>
</script>
-{% endblock%} \ No newline at end of file
+{% endblock%}ck%}} \ No newline at end of file
diff --git a/templates/includes/map_entry_list.html b/templates/includes/map_entry_list.html
index 46e11d2..9ccd78c 100644
--- a/templates/includes/map_entry_list.html
+++ b/templates/includes/map_entry_list.html
@@ -66,7 +66,7 @@
});
- point_no_strangers = JLngLat(-83.408246028733373, 33.958186941609405);
+ point_no_strangers = JLngLat(-83.408246028733373, 33.958186941609398);
markerOptions = { clickable:true, draggable:false, icon:tinyIcon};
marker_no_strangers = new GMarker(point_no_strangers, markerOptions);
map.addOverlay(marker_no_strangers);
@@ -77,7 +77,7 @@
});
- point_leonardo_da = JLngLat(-86.810799825028056, 33.521441993672681);
+ point_leonardo_da = JLngLat(-86.810799825028027, 33.521441993672674);
markerOptions = { clickable:true, draggable:false, icon:tinyIcon};
marker_leonardo_da = new GMarker(point_leonardo_da, markerOptions);
map.addOverlay(marker_leonardo_da);
@@ -88,7 +88,7 @@
});
- point_elkmont_and = JLngLat(-83.650245654859575, 35.680446234758257);
+ point_elkmont_and = JLngLat(-83.65024565485956, 35.680446234758236);
markerOptions = { clickable:true, draggable:false, icon:tinyIcon};
marker_elkmont_and = new GMarker(point_elkmont_and, markerOptions);
map.addOverlay(marker_elkmont_and);
@@ -99,7 +99,7 @@
});
- point_rope_swings = JLngLat(-83.902802455666631, 34.53463159921273);
+ point_rope_swings = JLngLat(-83.902802455666631, 34.534631599212709);
markerOptions = { clickable:true, draggable:false, icon:tinyIcon};
marker_rope_swings = new GMarker(point_rope_swings, markerOptions);
map.addOverlay(marker_rope_swings);
@@ -110,7 +110,7 @@
});
- point_our_days = JLngLat(-86.884582030599418, 12.436482242903955);
+ point_our_days = JLngLat(-86.88458203059939, 12.436482242903942);
markerOptions = { clickable:true, draggable:false, icon:tinyIcon};
marker_our_days = new GMarker(point_our_days, markerOptions);
map.addOverlay(marker_our_days);
@@ -121,7 +121,7 @@
});
- point_tiny_cities = JLngLat(-86.882200228994549, 12.435654551658539);
+ point_tiny_cities = JLngLat(-86.882200228994535, 12.435654551658532);
markerOptions = { clickable:true, draggable:false, icon:tinyIcon};
marker_tiny_cities = new GMarker(point_tiny_cities, markerOptions);
map.addOverlay(marker_tiny_cities);
@@ -132,7 +132,7 @@
});
- point_you_cant = JLngLat(-82.970981586350391, 12.289688381766881);
+ point_you_cant = JLngLat(-82.970981586350376, 12.289688381766881);
markerOptions = { clickable:true, draggable:false, icon:tinyIcon};
marker_you_cant = new GMarker(point_you_cant, markerOptions);
map.addOverlay(marker_you_cant);
@@ -154,7 +154,7 @@
});
- point_in_love = JLngLat(-83.388606894329286, 33.944877470043934);
+ point_in_love = JLngLat(-83.388606894329271, 33.944877470043906);
markerOptions = { clickable:true, draggable:false, icon:tinyIcon};
marker_in_love = new GMarker(point_in_love, markerOptions);
map.addOverlay(marker_in_love);
@@ -198,17 +198,6 @@
});
- point_new_years = JLngLat(-83.388563978984934, 33.944886370419432);
- markerOptions = { clickable:true, draggable:false, icon:tinyIcon};
- marker_new_years = new GMarker(point_new_years, markerOptions);
- map.addOverlay(marker_new_years);
- marker_new_years.info_window_content = '<div class="infowin"><h4>New Year&#39;s Day<\/h4><span class="date blok">January 1, 2008 (Athens, Georgia)<\/span><p><img src="http://images.luxagraf.net/post-thumbs/2008/annienewyears.jpg" height="100" alt="New Year&#39;s Day" style="float: left; border: #000 10px solid; margin-right: 4px; margin-bottom: 4px; height: 100px;" \/>I\x27ve always been all for New Year\x27s Eve celebrations, parties, what have you, but somehow the next day always seemed a bit hollow. U2 was, in many ways, correct \x2D\x2D \x22nothing changes on New Year\x27s Day.\x22 But, it\x27s a self\x2Dcreated universe, so whether anything changes on New Year\x27s Day is really up to you. And I\x27ve always thought Bono was full of shit. <a href="/2008/jan/01/new-years-day/">Read it &raquo;<\/a><\/p><\/div>'
- marker_new_years.bindInfoWindowHtml(marker_new_years.info_window_content, {maxWidth:400});
- GEvent.addListener(marker_new_years, "click", function() {
- map.panTo(point_new_years, 2);
- });
-
-
point_fall = JLngLat(-83.38856934340312, 33.9448641194789);
markerOptions = { clickable:true, draggable:false, icon:tinyIcon};
marker_fall = new GMarker(point_fall, markerOptions);
@@ -220,7 +209,7 @@
});
- point_on_the = JLngLat(-118.52130172987002, 33.461914385921666);
+ point_on_the = JLngLat(-118.52130172987002, 33.461914385921638);
markerOptions = { clickable:true, draggable:false, icon:tinyIcon};
marker_on_the = new GMarker(point_on_the, markerOptions);
map.addOverlay(marker_on_the);
@@ -264,7 +253,7 @@
});
- point_everything_all = JLngLat(-118.42890499373787, 33.975306864076366);
+ point_everything_all = JLngLat(-118.42890499373786, 33.975306864076359);
markerOptions = { clickable:true, draggable:false, icon:tinyIcon};
marker_everything_all = new GMarker(point_everything_all, markerOptions);
map.addOverlay(marker_everything_all);
@@ -275,7 +264,7 @@
});
- point_the_sun = JLngLat(-118.42887280722944, 33.975173406076344);
+ point_the_sun = JLngLat(-118.42887280722942, 33.975173406076337);
markerOptions = { clickable:true, draggable:false, icon:tinyIcon};
marker_the_sun = new GMarker(point_the_sun, markerOptions);
map.addOverlay(marker_the_sun);
@@ -352,7 +341,7 @@
});
- point_inside_and = JLngLat(14.317352769766009, 48.810530578015509);
+ point_inside_and = JLngLat(14.317352769766009, 48.810530578015488);
markerOptions = { clickable:true, draggable:false, icon:tinyIcon};
marker_inside_and = new GMarker(point_inside_and, markerOptions);
map.addOverlay(marker_inside_and);
@@ -418,7 +407,7 @@
});
- point_london_calling = JLngLat(-0.1495599746495864, 51.551192046821591);
+ point_london_calling = JLngLat(-0.14955997464958642, 51.551192046821591);
markerOptions = { clickable:true, draggable:false, icon:tinyIcon};
marker_london_calling = new GMarker(point_london_calling, markerOptions);
map.addOverlay(marker_london_calling);
@@ -935,14 +924,14 @@
});
- point_tips_and = JLngLat(-117.90123937872941, 33.632093907236353);
+ point_travel_tips = JLngLat(-117.90123937872937, 33.632093907236325);
markerOptions = { clickable:true, draggable:false, icon:tinyIcon};
- marker_tips_and = new GMarker(point_tips_and, markerOptions);
- map.addOverlay(marker_tips_and);
- marker_tips_and.info_window_content = '<div class="infowin"><h4>Tips and Resources<\/h4><span class="date blok">October 19, 2005 (Los Angeles, California)<\/span><p><img src="http://images.luxagraf.net/post-thumbs/2008/travelgear.jpg" height="100" alt="Tips and Resources" style="float: left; border: #000 10px solid; margin-right: 4px; margin-bottom: 4px; height: 100px;" \/>An overview of the things you might want to bring on an extended trip, as well as some tips and recommendations on things like visas and vaccinations. The part that was most helpful for me was learning what I \x3Cem\x3Edidn\x27t\x3C/em\x3E need to bring \x26mdash\x3B as it turns out, quite a bit. Nowadays my pack is much smaller and lighter. <a href="/2005/oct/19/tips-and-resources/">Read it &raquo;<\/a><\/p><\/div>'
- marker_tips_and.bindInfoWindowHtml(marker_tips_and.info_window_content, {maxWidth:400});
- GEvent.addListener(marker_tips_and, "click", function() {
- map.panTo(point_tips_and, 2);
+ marker_travel_tips = new GMarker(point_travel_tips, markerOptions);
+ map.addOverlay(marker_travel_tips);
+ marker_travel_tips.info_window_content = '<div class="infowin"><h4>Travel Tips and Resources<\/h4><span class="date blok">October 19, 2005 (Los Angeles, California)<\/span><p><img src="http://images.luxagraf.net/post-thumbs/2008/travelgear.jpg" height="100" alt="Travel Tips and Resources" style="float: left; border: #000 10px solid; margin-right: 4px; margin-bottom: 4px; height: 100px;" \/>An overview of the things you might want to bring on an extended trip, as well as some tips and recommendations on things like visas and vaccinations. The part that was most helpful for me was learning what I \x3Cem\x3Edidn\x27t\x3C/em\x3E need to bring \x26mdash\x3B as it turns out, quite a bit. Nowadays my pack is much smaller and lighter. <a href="/2005/oct/19/tips-and-resources/">Read it &raquo;<\/a><\/p><\/div>'
+ marker_travel_tips.bindInfoWindowHtml(marker_travel_tips.info_window_content, {maxWidth:400});
+ GEvent.addListener(marker_travel_tips, "click", function() {
+ map.panTo(point_travel_tips, 2);
});
@@ -968,7 +957,7 @@
});
- point_farewell_mr = JLngLat(-72.627954472922156, 42.3226356811873);
+ point_farewell_mr = JLngLat(-72.627954472922156, 42.322635681187286);
markerOptions = { clickable:true, draggable:false, icon:tinyIcon};
marker_farewell_mr = new GMarker(point_farewell_mr, markerOptions);
map.addOverlay(marker_farewell_mr);
@@ -990,7 +979,7 @@
});
- point_farewell_mr = JLngLat(-72.628040303610746, 42.322508760619321);
+ point_farewell_mr = JLngLat(-72.628040303610732, 42.3225087606193);
markerOptions = { clickable:true, draggable:false, icon:tinyIcon};
marker_farewell_mr = new GMarker(point_farewell_mr, markerOptions);
map.addOverlay(marker_farewell_mr);
diff --git a/templates/includes/recent_entries.html b/templates/includes/recent_entries.html
index b461eed..b622294 100644
--- a/templates/includes/recent_entries.html
+++ b/templates/includes/recent_entries.html
@@ -1,25 +1,25 @@
<ul>
<li>
- <h3><a href="/2009/apr/13/strangers-on-a-train/" title="Why Americans love train travel, despite having few trains">No Strangers on a&nbsp;Train</a></h3>
+ <h3><a href="/2009/apr/13/strangers-on-a-train/" title="No Strangers on a Train">No Strangers on a&nbsp;Train</a></h3>
<img src="http://images.luxagraf.net/post-thumbs/2009/strangersonatrain.jpg" alt="No Strangers on a Train" class="post-image" />
<time datetime="2009-04-13 18:36:13">April 13, 2009</time> &bull; <span class="location">Athens, <a href="/writing/united-states/1/" title="travel writing from the United States">Georgia</a></span>
<p class="intro">We mythologize trains because they harken back to an age of community travel, a real, tangible community of travelers, not just backpackers, but people from all walks of life, people traveling near and far together in a shared space that isn't locked down like an airplane and isn't isolated like a car; it's a shared travel experience and there are precious few of those left in our world. <a class="permalink" href="/2009/apr/13/strangers-on-a-train/" title="No Strangers on a Train">Read&nbsp;it&nbsp;&raquo;</a></p>
</li>
<li>
- <h3><a href="/2008/dec/09/leonardo-da-vinci-and-codex-bunnies/" title="Leondaro Da Vinci comes to Birmingham Alabama, along with some bunnies">Leonardo Da Vinci and the Codex on&nbsp;Bunnies</a></h3>
+ <h3><a href="/2008/dec/09/leonardo-da-vinci-and-codex-bunnies/" title="Leonardo Da Vinci and the Codex on Bunnies">Leonardo Da Vinci and the Codex on&nbsp;Bunnies</a></h3>
<img src="http://images.luxagraf.net/post-thumbs/2009/codexofbunnies.jpg" alt="Leonardo Da Vinci and the Codex on Bunnies" class="post-image" />
<time datetime="2008-12-09 17:18:33">December 9, 2008</time> &bull; <span class="location">Birmingham, <a href="/writing/united-states/1/" title="travel writing from the United States">Alabama</a></span>
<p class="intro">A few pages from Leonardo Da Vinci's notebooks make a rare trip outside Italy, to Birmingham, AL, of all places. But the Birmingham Museum of Art is home to far more alarming works of art, works which depict the eventual, inevitable, bunny takeover, after which all the elements of our reality will be replaced by bunnies. Seriously. You heard it here first. <a class="permalink" href="/2008/dec/09/leonardo-da-vinci-and-codex-bunnies/" title="Leonardo Da Vinci and the Codex on Bunnies">Read&nbsp;it&nbsp;&raquo;</a></p>
</li>
<li>
- <h3><a href="/2008/oct/31/elkmont-and-great-smoky-mountains/" title="Travels in the the Smoky Mountains, home of the lost Elkmont Railroad">Elkmont and the Great Smoky&nbsp;Mountains</a></h3>
+ <h3><a href="/2008/oct/31/elkmont-and-great-smoky-mountains/" title="Elkmont and the Great Smoky Mountains">Elkmont and the Great Smoky&nbsp;Mountains</a></h3>
<img src="http://images.luxagraf.net/post-thumbs/2008/reflectedtrees.jpg" alt="Elkmont and the Great Smoky Mountains" class="post-image" />
<time datetime="2008-10-31 14:16:13">October 31, 2008</time> &bull; <span class="location">Great Smoky Mountains, <a href="/writing/united-states/1/" title="travel writing from the United States">Tennessee</a></span>
<p class="intro">Pigeon Forge is Myrtle Beach in the mountains. Redneck weddings cascade straight out of the chapel and into the mini golf reception area. Pigeon Forge is everything that's wrong with America. But we aren't here for Pigeon Forge, it just happens to have a free condo we're staying in. We're here for the mountains. Smoky Mountain National Park is just a few miles up the road. <a class="permalink" href="/2008/oct/31/elkmont-and-great-smoky-mountains/" title="Elkmont and the Great Smoky Mountains">Read&nbsp;it&nbsp;&raquo;</a></p>
</li>
<li>
- <h3><a href="/2008/jul/27/rope-swings-and-river-floats/" title="A trip down the Chestatee River">Rope Swings and River&nbsp;Floats</a></h3>
+ <h3><a href="/2008/jul/27/rope-swings-and-river-floats/" title="Rope Swings and River Floats">Rope Swings and River&nbsp;Floats</a></h3>
<img src="http://images.luxagraf.net/post-thumbs/2008/chestateeriver.jpg" alt="Rope Swings and River Floats" class="post-image" />
<time datetime="2008-07-27 19:14:49">July 27, 2008</time> &bull; <span class="location">Mountain Cabin, <a href="/writing/united-states/1/" title="travel writing from the United States">Georgia</a></span>
<p class="intro">Two weekends ago we went up to the mountains, just outside of Dahlonega GA, and floated the Chestatee River using inner tubes, various pool toys and one super-cool inflatable seahorse. Unfortunately, proving one of my travel mottos -- you can never go back -- a return trip proved disastrous. <a class="permalink" href="/2008/jul/27/rope-swings-and-river-floats/" title="Rope Swings and River Floats">Read&nbsp;it&nbsp;&raquo;</a></p>
diff --git a/templates/projects/base.html b/templates/projects/base.html
new file mode 100644
index 0000000..b52564b
--- /dev/null
+++ b/templates/projects/base.html
@@ -0,0 +1,14 @@
+{% extends 'base.html' %}
+
+{% block primary %}
+ <article>
+ <section id="post">
+ <h1>Projects</h1>
+ <dl class="lprog">
+ <dt>Coming soon.</dt>
+ <dd>Projects. Experiments in travel. Because everything is amazing.</dd>
+ </dl>
+ </section>
+
+ </article>
+{% endblock %} \ No newline at end of file