Browse code

irrisponsibly massive commit

Brandon Mathis authored on 18/04/2011 at 03:49:30
Showing 120 changed files
... ...
@@ -1,7 +1,8 @@
1 1
 site
2 2
 .bundle
3 3
 .DS_Store
4
-.rvmrc
5 4
 .sass-cache
6 5
 test
7 6
 source/_stash
7
+vendor/ruby
8
+vendor/ruby
8 9
new file mode 100644
... ...
@@ -0,0 +1 @@
0
+rvm 1.9.2
... ...
@@ -1,12 +1,13 @@
1
-source "http://rubygems.org"
2
-source "http://gems.github.com"
1
+source :rubygems
3 2
 
4
-gem 'activesupport', "2.3.5"
5
-gem 'henrik-jekyll'
6
-gem 'compass'
7
-gem 'compass-colors'
3
+gem 'jekyll'
8 4
 gem 'rdiscount'
9
-gem 'fssm'
5
+gem 'RedCloth'
6
+gem "haml", "3.1.0.alpha.147"
7
+gem 'compass', '0.11.beta.5'
8
+gem 'rubypants'
9
+gem 'rb-fsevent'
10
+gem 'guard-shell'
11
+gem 'guard-livereload'
10 12
 gem 'serve'
11
-gem 'mongrel'
12
-gem 'rake'
13 13
\ No newline at end of file
14
+gem 'rake'
14 15
new file mode 100644
... ...
@@ -0,0 +1,74 @@
0
+GEM
1
+  remote: http://rubygems.org/
2
+  specs:
3
+    RedCloth (4.2.3)
4
+    activesupport (3.0.5)
5
+    addressable (2.2.4)
6
+    chunky_png (1.1.0)
7
+    classifier (1.3.3)
8
+      fast-stemmer (>= 1.0.0)
9
+    compass (0.11.beta.5)
10
+      chunky_png (~> 1.1.0)
11
+      sass (>= 3.1.0.alpha.249)
12
+    configuration (1.2.0)
13
+    directory_watcher (1.3.2)
14
+    em-websocket (0.2.1)
15
+      addressable (>= 2.1.1)
16
+      eventmachine (>= 0.12.9)
17
+    eventmachine (0.12.10)
18
+    fast-stemmer (1.0.0)
19
+    guard (0.3.0)
20
+      open_gem (~> 1.4.2)
21
+      thor (~> 0.14.6)
22
+    guard-livereload (0.1.9)
23
+      em-websocket (~> 0.2.0)
24
+      guard (>= 0.2.2)
25
+      json (~> 1.4.6)
26
+    guard-shell (0.1.1)
27
+      guard (>= 0.2.0)
28
+    haml (3.1.0.alpha.147)
29
+    i18n (0.4.2)
30
+    jekyll (0.10.0)
31
+      classifier (>= 1.3.1)
32
+      directory_watcher (>= 1.1.1)
33
+      liquid (>= 1.9.0)
34
+      maruku (>= 0.5.9)
35
+    json (1.4.6)
36
+    launchy (0.3.7)
37
+      configuration (>= 0.0.5)
38
+      rake (>= 0.8.1)
39
+    liquid (2.2.2)
40
+    maruku (0.6.0)
41
+      syntax (>= 1.0.0)
42
+    open_gem (1.4.2)
43
+      launchy (~> 0.3.5)
44
+    rack (1.2.1)
45
+    rake (0.8.7)
46
+    rb-fsevent (0.4.0)
47
+    rdiscount (1.6.8)
48
+    rubypants (0.2.0)
49
+    sass (3.1.0.alpha.252)
50
+    serve (1.0.0)
51
+      activesupport (~> 3.0.1)
52
+      i18n (~> 0.4.1)
53
+      rack (~> 1.2.1)
54
+      tzinfo (~> 0.3.23)
55
+    syntax (1.0.0)
56
+    thor (0.14.6)
57
+    tzinfo (0.3.24)
58
+
59
+PLATFORMS
60
+  ruby
61
+
62
+DEPENDENCIES
63
+  RedCloth
64
+  compass (= 0.11.beta.5)
65
+  guard-livereload
66
+  guard-shell
67
+  haml (= 3.1.0.alpha.147)
68
+  jekyll
69
+  rake
70
+  rb-fsevent
71
+  rdiscount
72
+  rubypants
73
+  serve
0 74
new file mode 100644
... ...
@@ -0,0 +1,9 @@
0
+guard 'shell' do
1
+  watch(/source\/sass\/(.*)\.s[ac]ss/) {|m| `compass compile` }
2
+  watch(%r{public/.+\.(js|html)}) {|m| `compass compile` }
3
+end
4
+
5
+guard 'livereload', :api_version => '1.6' do
6
+  watch(%r{public/.+\.(css)})
7
+  watch(%r{public/.+\.(js|html)})
8
+end
... ...
@@ -2,11 +2,8 @@ require "rubygems"
2 2
 require "bundler"
3 3
 Bundler.setup
4 4
 
5
-require 'source/_helpers'
6
-
7
-site_url    = "http://yoursite.com"   # deployed site url for sitemap.xml generator
8 5
 port        = "4000"      # preview project port eg. http://localhost:4000
9
-site        = "site"      # compiled site directory
6
+site        = "public"    # compiled site directory
10 7
 source      = "source"    # source file directory
11 8
 stash       = "_stash"    # directory to stash posts for speedy generation
12 9
 posts       = "_posts"    # directory for blog files
... ...
@@ -19,6 +16,7 @@ document_root = "~/document_root/" # for rsync deployment
19 19
 
20 20
 ## -- Github Pages deploy config -- ##
21 21
 # Read http://pages.github.com for guidance
22
+# You can deploy to github pages with `rake push_github` or change the default push task below to :push_github
22 23
 # If you're not using this, you can remove it
23 24
 source_branch = "source" # this compiles to your deploy branch
24 25
 deploy_branch = "master" # For user pages, use "master" for project pages use "gh-pages"
... ...
@@ -32,13 +30,13 @@ def ok_failed(condition)
32 32
   end
33 33
 end
34 34
 
35
-## if you're deploying with github, change the default deploy to deploy_github
36
-desc "default deploy task"
37
-task :deploy => [:deploy_rsync] do
35
+## if you're deploying with github, change the default deploy to push_github
36
+desc "default push task"
37
+task :push => [:push_rsync] do
38 38
 end
39 39
 
40 40
 desc "Generate and deploy task"
41
-task :generate_deploy => [:integrate, :generate, :clean_debug, :deploy] do
41
+task :deploy => [:integrate, :generate, :clean_debug, :push] do
42 42
 end
43 43
 
44 44
 desc "generate website in output directory"
... ...
@@ -49,10 +47,13 @@ end
49 49
 # usage rake post[my-new-post] or rake post['my new post'] or rake post (defaults to "new-post")
50 50
 desc "Begin a new post in #{source}/_posts"
51 51
 task :post, :filename do |t, args|
52
+  require './_plugins/titlecase.rb'
52 53
   args.with_defaults(:filename => 'new-post')
53
-  open("#{source}/_posts/#{Time.now.strftime('%Y-%m-%d_%H-%M')}-#{args.filename.downcase.gsub(/[ _]/, '-')}.#{post_format}", 'w') do |post|
54
+  open("#{source}/_posts/#{Time.now.strftime('%Y-%m-%d')}-#{args.filename.downcase.gsub(/[ _]/, '-')}.#{post_format}", 'w') do |post|
54 55
     post.puts "---"
55 56
     post.puts "title: \"#{args.filename.gsub(/[-_]/, ' ').titlecase}\""
57
+    post.puts "date: #{Time.now.strftime('%Y-%m-%d %H:%M')}"
58
+    post.puts "layout: post"
56 59
     post.puts "---"
57 60
   end
58 61
 end
... ...
@@ -98,124 +99,64 @@ end
98 98
 desc "Generate site files only"
99 99
 task :generate_site => [:clean, :generate_style] do
100 100
   puts "\n\n>>> Generating site files <<<"
101
-  system "jekyll --pygments"
102
-  system "mv #{site}/atom.html #{site}/atom.xml"
103
-end
104
-
105
-def rebuild_site(relative)
106
-  puts "\n\n>>> Change Detected to: #{relative} <<<"
107
-  IO.popen('rake generate_site'){|io| print(io.readpartial(512)) until io.eof?}
108
-  puts '>>> Update Complete <<<'
109
-end
110
-
111
-def rebuild_style(relative)
112
-  puts "\n\n>>> Change Detected to: #{relative} <<<"
113
-  IO.popen('rake generate_style'){|io| print(io.readpartial(512)) until io.eof?}
114
-  puts '>>> Update Complete <<<'
101
+  system "jekyll"
115 102
 end
116 103
 
117 104
 desc "Watch the site and regenerate when it changes"
118 105
 task :watch do
119
-  require 'fssm'
120
-  puts ">>> Watching for Changes <<<"
121
-  FSSM.monitor do
122
-    path "#{File.dirname(__FILE__)}/#{source}" do
123
-      update {|base, relative| rebuild_site(relative)}
124
-      delete {|base, relative| rebuild_site(relative)}
125
-      create {|base, relative| rebuild_site(relative)}
126
-    end
127
-    path "#{File.dirname(__FILE__)}/stylesheets" do
128
-      glob '**/*.sass'
129
-      update {|base, relative| rebuild_style(relative)}
130
-      delete {|base, relative| rebuild_style(relative)}
131
-      create {|base, relative| rebuild_style(relative)}
132
-    end
133
-  end
106
+  system "trap 'kill $jekyllPid $guardPid' Exit; guard & guardPid=$!; jekyll --auto & jekyllPid=$!; wait"
134 107
 end
135 108
 
136 109
 desc "generate and deploy website via rsync"
137
-multitask :deploy_rsync do
138
-  puts ">>> Deploying website to #{site_url} <<<"
110
+multitask :push_rsync do
111
+  puts ">>> Deploying website via Rsync <<<"
139 112
   ok_failed system("rsync -avz --delete #{site}/ #{ssh_user}:#{document_root}")
140 113
 end
141 114
 
142
-desc "generate and deploy website to github user pages"
143
-multitask :deploy_github do
115
+desc "deploy website to github user pages"
116
+multitask :push_github do
144 117
   puts ">>> Deploying #{deploy_branch} branch to Github Pages <<<"
145 118
   require 'git'
146 119
   repo = Git.open('.')
147 120
   puts "\n>>> Checking out #{deploy_branch} branch <<<\n"
148 121
   repo.branch("#{deploy_branch}").checkout
149
-  (Dir["*"] - [site]).each { |f| rm_rf(f) }
122
+  (Dir["*"] - ["#{site}"]).each { |f| rm_rf(f) }
150 123
   Dir["#{site}/*"].each {|f| mv(f, ".")}
151
-  rm_rf(site)
152
-  puts "\n>>> Moving generated site files <<<\n"
124
+  rm_rf("#{site}")
125
+  puts "\n>>> Moving generated /#{site} files <<<\n"
153 126
   Dir["**/*"].each {|f| repo.add(f) }
154 127
   repo.status.deleted.each {|f, s| repo.remove(f)}
155 128
   puts "\n>>> Commiting: Site updated at #{Time.now.utc} <<<\n"
156 129
   message = ENV["MESSAGE"] || "Site updated at #{Time.now.utc}"
157 130
   repo.commit(message)
158
-  puts "\n>>> Pushing generated site to #{deploy_branch} branch <<<\n"
131
+  puts "\n>>> Pushing generated /#{site} files to #{deploy_branch} branch <<<\n"
159 132
   repo.push
160 133
   puts "\n>>> Github Pages deploy complete <<<\n"
161 134
   repo.branch("#{source_branch}").checkout
162 135
 end
163 136
 
164
-desc "start up an instance of serve on the output files"
165
-task :start_serve => :stop_serve do
166
-  cd "#{site}" do
167
-    print "Starting serve..."
168
-    system("serve #{port} > /dev/null 2>&1 &")
169
-    sleep 1
170
-    pid = `ps auxw | awk '/bin\\/serve\\ #{port}/ { print $2 }'`.strip
171
-    ok_failed !pid.empty?
172
-    system "open http://localhost:#{port}" unless pid.empty?
173
-  end
137
+desc "start up a web server on the output files"
138
+task :start_server => :stop_server do
139
+  print "Starting serve..."
140
+  system("serve #{site} #{port} > /dev/null 2>&1 &")
141
+  sleep 1
142
+  pid = `ps auxw | awk '/bin\\/serve #{site} #{port}/ { print $2 }'`.strip
143
+  ok_failed !pid.empty?
144
+  system "open http://localhost:#{port}" unless pid.empty?
174 145
 end
175 146
 
176
-desc "stop all instances of serve"
177
-task :stop_serve do
178
-  pid = `ps auxw | awk '/bin\\/serve\\ #{port}/ { print $2 }'`.strip
147
+desc "stop the web server"
148
+task :stop_server do
149
+  pid = `ps auxw | awk '/bin\\/serve #{site} #{port}/ { print $2 }'`.strip
179 150
   if pid.empty?
180
-    puts "Serve is not running"
151
+    puts "Adsf is not running"
181 152
   else
182
-    print "Stoping serve..."
153
+    print "Stoping adsf..."
183 154
     ok_failed system("kill -9 #{pid}")
184 155
   end
185 156
 end
186 157
 
187 158
 desc "preview the site in a web browser"
188
-task :preview => [:generate, :start_serve, :watch]
189
-
190
-desc "Build an XML sitemap of all html files."
191
-task :sitemap do
192
-  html_files = FileList.new("#{site}/**/*.html").map{|f| f[("#{site}".size)..-1]}.map do |f|
193
-    if f.ends_with?("index.html")
194
-      f[0..(-("index.html".size + 1))]
195
-    else
196
-      f
197
-    end
198
-  end.sort_by{|f| f.size}
199
-  open("#{site}/sitemap.xml", 'w') do |sitemap|
200
-    sitemap.puts %Q{<?xml version="1.0" encoding="UTF-8"?>}
201
-    sitemap.puts %Q{<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">}
202
-    html_files.each do |f|
203
-      priority = case f
204
-      when %r{^/$}
205
-        1.0
206
-      when %r{^/articles}
207
-        0.9
208
-      else
209
-        0.8
210
-      end
211
-      sitemap.puts %Q{  <url>}
212
-      sitemap.puts %Q{    <loc>#{site_url}#{f}</loc>}
213
-      sitemap.puts %Q{    <lastmod>#{Time.now.strftime('%Y-%m-%d')}</lastmod>}
214
-      sitemap.puts %Q{    <changefreq>weekly</changefreq>}
215
-      sitemap.puts %Q{    <priority>#{priority}</priority>}
216
-      sitemap.puts %Q{  </url>}
217
-    end
218
-    sitemap.puts %Q{</urlset>}
219
-    puts "Created #{site}/sitemap.xml"
220
-  end
159
+task :preview do
160
+  system "trap 'kill $servePid $jekyllPid $guardPid' Exit; serve #{site} #{port} > /dev/null 2>&1 & servePid=$!; jekyll --auto & jekyllPid=$!; guard & guardPid=$!; compass compile; open http://localhost:#{port}; wait"
221 161
 end
... ...
@@ -1,11 +1,28 @@
1 1
 source: source
2
-destination: site
2
+destination: public
3
+exclude: sass, *.scss
3 4
 markdown: rdiscount
4 5
 pygments: true
5
-permalink: /blog/:year/:month/:day/:title
6
+permalink: pretty
7
+
6 8
 url: http://yoursite.com
7
-multiviews: true
8
-sass: false
9
-haml: true
10
-post_defaults:
11
-  layout: blog_post
12 9
\ No newline at end of file
10
+title: My Octopress Blog
11
+author: Your Name
12
+email: you@domain.com #Add your email (optional) for the atom feed
13
+
14
+recent_posts: 10
15
+
16
+twitter_user: imathis
17
+tweet_count: 3
18
+show_replies: false
19
+
20
+delicious_user:
21
+delicious_count: 3
22
+
23
+pinboard_user: imathis
24
+pinboard_count: 3
25
+
26
+disqus_short_name:
27
+
28
+google_custom_search_id:
29
+google_analytics_tracking_id:
13 30
new file mode 100644
... ...
@@ -0,0 +1,46 @@
0
+#custom filters for Octopress
1
+
2
+module OctopressFilters
3
+  def exerpt(input, url, url_text="Reade more&hellip;", permalink_text=false)
4
+    if input.index(/<!--\s?more\s?-->/i)
5
+      input.split(/<!--\s?more\s?-->/i)[0] + "<p><a href='#{url}'>#{url_text}</a></p>"
6
+    elsif permalink_text
7
+      input + "<p><a href='#{url}'>#{permalink_text}</a></p>"
8
+    else
9
+      input
10
+    end
11
+  end
12
+  def full_urls(input, url='')
13
+    input.gsub /(\s+(href|src)\s*=\s*["|']{1})(\/[^\"'>]+)/ do
14
+      $1+url+$3
15
+    end
16
+  end
17
+  def smart_quotes(input)
18
+    require 'rubypants'
19
+    RubyPants.new(input).to_html
20
+  end
21
+  def titlecase(input)
22
+    require 'titlecase'
23
+    input.titlecase
24
+  end
25
+  def ordinalize(date)
26
+    if date.class == String
27
+      date = Time.parse(date)
28
+    end
29
+    "#{date.strftime('%B')} #{ordinal(date.strftime('%e').to_i)}, #{date.strftime('%Y')}"
30
+  end
31
+  def ordinal(number)
32
+    if (11..13).include?(number.to_i % 100)
33
+      "#{number}<span>th</span>"
34
+    else
35
+      case number.to_i % 10
36
+      when 1; "#{number}<span>st</span>"
37
+      when 2; "#{number}<span>nd<span>"
38
+      when 3; "#{number}<span>rd</span>"
39
+      else    "#{number}<span>th</span>"
40
+      end
41
+    end
42
+  end
43
+end
44
+
45
+Liquid::Template.register_filter OctopressFilters
0 46
new file mode 100644
... ...
@@ -0,0 +1,132 @@
0
+# Jekyll sitemap page generator.
1
+# http://recursive-design.com/projects/jekyll-plugins/
2
+#
3
+# Version: 0.1.3 (201101061053)
4
+#
5
+# Copyright (c) 2010 Dave Perrett, http://recursive-design.com/
6
+# Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
7
+#
8
+# A generator that creates a sitemap.xml page for jekyll sites, suitable for submission to
9
+# google etc.
10
+#
11
+# To use it, simply drop this script into the _plugins directory of your Jekyll site.
12
+#
13
+# When you compile your jekyll site, this plugin will loop through the list of pages in your
14
+# site, and generate an entry in sitemap.xml for each one.
15
+
16
+require 'pathname'
17
+
18
+module Jekyll
19
+
20
+
21
+  # Monkey-patch an accessor for a page's containing folder, since
22
+  # we need it to generate the sitemap.
23
+  class Page
24
+    def subfolder
25
+      @dir
26
+    end
27
+  end
28
+
29
+
30
+  # Sub-class Jekyll::StaticFile to allow recovery from unimportant exception
31
+  # when writing the sitemap file.
32
+  class StaticSitemapFile < StaticFile
33
+    def write(dest)
34
+      super(dest) rescue ArgumentError
35
+      true
36
+    end
37
+  end
38
+
39
+
40
+  # Generates a sitemap.xml file containing URLs of all pages and posts.
41
+  class SitemapGenerator < Generator
42
+    safe true
43
+    priority :low
44
+
45
+    # Domain that you are generating the sitemap for - update this to match your site.
46
+    BASE_URL = 'http://recursive-design.com'
47
+
48
+    # Generates the sitemap.xml file.
49
+    #
50
+    #  +site+ is the global Site object.
51
+    def generate(site)
52
+      # Create the destination folder if necessary.
53
+      site_folder = site.config['destination']
54
+      unless File.directory?(site_folder)
55
+        p = Pathname.new(site_folder)
56
+        p.mkdir
57
+      end
58
+
59
+      # Write the contents of sitemap.xml.
60
+      File.open(File.join(site_folder, 'sitemap.xml'), 'w') do |f|
61
+        f.write(generate_header())
62
+        f.write(generate_content(site))
63
+        f.write(generate_footer())
64
+        f.close
65
+      end
66
+
67
+      # Add a static file entry for the zip file, otherwise Site::cleanup will remove it.
68
+      site.static_files << Jekyll::StaticSitemapFile.new(site, site.dest, '/', 'sitemap.xml')
69
+    end
70
+
71
+    private
72
+
73
+    # Returns the XML header.
74
+    def generate_header
75
+      "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">"
76
+    end
77
+
78
+    # Returns a string containing the the XML entries.
79
+    #
80
+    #  +site+ is the global Site object.
81
+    def generate_content(site)
82
+      result   = ''
83
+
84
+      # First, try to find any stand-alone pages.
85
+      site.pages.each{ |page|
86
+        path     = page.subfolder + '/' + page.name
87
+        mod_date = File.mtime(site.source + path)
88
+
89
+  			# Remove the trailing 'index.html' if there is one, and just output the folder name.
90
+  			if path=~/index.html$/
91
+  			  path = path[0..-11]
92
+  		  end
93
+
94
+        unless path =~/error/
95
+          result += entry(path, mod_date)
96
+        end
97
+      }
98
+
99
+      # Next, find all the posts.
100
+      posts = site.site_payload['site']['posts']
101
+      for post in posts do
102
+        result += entry(post.id, post.date)
103
+      end
104
+
105
+    	result
106
+    end
107
+
108
+    # Returns the XML footer.
109
+    def generate_footer
110
+      "\n</urlset>"
111
+    end
112
+
113
+    # Creates an XML entry from the given path and date.
114
+    #
115
+    #  +path+ is the URL path to the page.
116
+    #  +date+ is the date the file was modified (in the case of regular pages), or published (for blog posts).
117
+    def entry(path, date)
118
+        # Force extensions to .html from markdown, textile.
119
+        path = path.gsub(/\.(markdown|textile)$/i, '.html')
120
+      "
121
+  <url>
122
+      <loc>#{BASE_URL}#{path}</loc>
123
+      <lastmod>#{date.strftime("%Y-%m-%d")}</lastmod>
124
+  </url>"
125
+    end
126
+
127
+  end
128
+
129
+end
130
+
131
+
0 132
new file mode 100644
... ...
@@ -0,0 +1,83 @@
0
+# Nicked from Brandon Tilly
1
+# Gist https://gist.github.com/803483
2
+# Post http://brandontilley.com/2011/01/31/gist-tag-for-jekyll.html
3
+#
4
+# Example usage: {% gist 803483 gist_tag.rb %} //embeds a gist for this plugin
5
+
6
+require 'digest/md5'
7
+require 'net/https'
8
+require 'uri'
9
+
10
+module Jekyll
11
+  class GistTag < Liquid::Tag
12
+    def initialize(tag_name, text, token)
13
+      super
14
+      system('mkdir -p .gist_cache')
15
+      @text         = text
16
+      @cache        = true
17
+      @cache_folder = File.expand_path "../.gist_cache", File.dirname(__FILE__)
18
+    end
19
+
20
+    def render(context)
21
+      return "" unless @text =~ /([\d]*) (.*)/
22
+
23
+      gist, file = $1.strip, $2.strip
24
+      script_url = "https://gist.github.com/#{gist}.js?file=#{file}"
25
+
26
+      code       = get_cached_gist(gist, file) || get_gist_from_web(gist, file)
27
+      code       = code.gsub "<", "&lt;"
28
+      string     = "<script src='#{script_url}'></script>"
29
+      string    += "<noscript><pre><code>#{code}</code></pre></noscript>"
30
+      return string
31
+    end
32
+
33
+    def get_gist_url_for(gist, file)
34
+      "https://gist.github.com/raw/#{gist}/#{file}"
35
+    end
36
+
37
+    def cache_gist(gist, file, data)
38
+      file = get_cache_file_for gist, file
39
+      File.open(file, "w+") do |f|
40
+        f.write(data)
41
+      end
42
+    end
43
+
44
+    def get_cached_gist(gist, file)
45
+      return nil if @cache == false
46
+      file = get_cache_file_for gist, file
47
+      return nil unless File.exist?(file)
48
+      return File.new(file).readlines.join
49
+    end
50
+
51
+    def get_cache_file_for(gist, file)
52
+      gist.gsub! /[^a-zA-Z0-9\-_\.]/, ''
53
+      file.gsub! /[^a-zA-Z0-9\-_\.]/, ''
54
+      md5 = Digest::MD5.hexdigest "#{gist}-#{file}"
55
+      File.join @cache_folder, "#{gist}-#{file}-#{md5}.cache"
56
+    end
57
+
58
+    def get_gist_from_web(gist, file)
59
+      gist_url          = get_gist_url_for(gist, file)
60
+      raw_uri           = URI.parse(gist_url)
61
+      https             = Net::HTTP.new(raw_uri.host, raw_uri.port)
62
+      https.use_ssl     = true
63
+      https.verify_mode = OpenSSL::SSL::VERIFY_NONE
64
+      request           = Net::HTTP::Get.new(raw_uri.request_uri)
65
+      data              = https.request(request)
66
+      data              = data.body
67
+      cache_gist(gist, file, data) unless @cache == false
68
+      data
69
+    end
70
+  end
71
+
72
+  class GistTagNoCache < GistTag
73
+    def initialize(tag_name, text, token)
74
+      super
75
+      @cache = false
76
+    end
77
+  end
78
+end
79
+
80
+Liquid::Template.register_tag('gist', Jekyll::GistTag)
81
+Liquid::Template.register_tag('gistnocache', Jekyll::GistTagNoCache)
82
+
0 83
new file mode 100644
... ...
@@ -0,0 +1,24 @@
0
+module Jekyll
1
+  require 'haml'
2
+  class HamlConverter < Converter
3
+    safe true
4
+    priority :low
5
+
6
+    def matches(ext)
7
+      ext =~ /haml/i
8
+    end
9
+
10
+    def output_ext(ext)
11
+      ".html"
12
+    end
13
+
14
+    def convert(content)
15
+      begin
16
+        engine = Haml::Engine.new(content)
17
+        engine.render
18
+      rescue StandardError => e
19
+          puts "!!! HAML Error: " + e.message
20
+      end
21
+    end
22
+  end
23
+end
0 24
new file mode 100644
... ...
@@ -0,0 +1,36 @@
0
+class String
1
+  def titlecase
2
+    small_words = %w(a an and as at but by en for if in of on or the to v v. via vs vs.)
3
+
4
+    x = split(" ").map do |word|
5
+      # note: word could contain non-word characters!
6
+      # downcase all small_words, capitalize the rest
7
+      small_words.include?(word.gsub(/\W/, "").downcase) ? word.downcase! : word.smart_capitalize!
8
+      word
9
+    end
10
+    # capitalize first and last words
11
+    x.first.to_s.smart_capitalize!
12
+    x.last.to_s.smart_capitalize!
13
+    # small words after colons are capitalized
14
+    x.join(" ").gsub(/:\s?(\W*#{small_words.join("|")}\W*)\s/) { ": #{$1.smart_capitalize} " }
15
+  end
16
+
17
+  def titlecase!
18
+    replace(titlecase)
19
+  end
20
+
21
+  def smart_capitalize
22
+    # ignore any leading crazy characters and capitalize the first real character
23
+    if self =~ /^['"\(\[']*([a-z])/
24
+      i = index($1)
25
+      x = self[i,self.length]
26
+      # word with capitals and periods mid-word are left alone
27
+      self[i,1] = self[i,1].upcase unless x =~ /[A-Z]/ or x =~ /\.\w+/
28
+    end
29
+    self
30
+  end
31
+
32
+  def smart_capitalize!
33
+    replace(smart_capitalize)
34
+  end
35
+end
... ...
@@ -1,10 +1,13 @@
1 1
 # Require any additional compass plugins here.
2
-require 'compass-colors'
3 2
 project_type = :stand_alone
4 3
 # Set this to the root of your project when deployed:
5 4
 http_path = "/"
6
-css_dir = "site/stylesheets"
7
-sass_dir = "stylesheets"
5
+css_dir = "public/stylesheets"
6
+sass_dir = "source/sass"
8 7
 images_dir = "source/images"
9
-images_dir = "source/images/"
10
-http_images_path = "/images"
11 8
\ No newline at end of file
9
+http_images_dir = "images"
10
+fonts_dir = "source/fonts"
11
+http_fonts_dir = "fonts"
12
+
13
+line_comments = false
14
+output_style = :compressed
12 15
new file mode 100644
... ...
@@ -0,0 +1,123 @@
0
+<!DOCTYPE html>
1
+<html>
2
+<head>
3
+  <title>Hello World! I'm Octopress! - My Octopress Blog</title>
4
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
5
+  
6
+  
7
+  <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
8
+  <script src="/javascripts/mootools-yui-compressed.js" type="text/javascript"></script>
9
+  <script src="/javascripts/mootools-more-1.3.1.1.js" type="text/javascript"></script>
10
+  <script src="/javascripts/octopress.js" type="text/javascript"></script>
11
+  <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
12
+  <meta name="viewport" content="initial-scale=1.0 width=device-width">
13
+  
14
+    <script>
15
+      var twitter_user = "imathis";
16
+      var show_replies = false;
17
+      var tweet_count = 3;
18
+    </script>
19
+    <script src="/javascripts/twitter.js" type="text/javascript"></script>
20
+  
21
+  
22
+  <link href="/atom.xml" rel="alternate" title="My Octopress Blog" type="application/atom+xml"/>
23
+</head>
24
+
25
+<body id="">
26
+  <header><div><h1><a href="/">My Octopress Blog</a></h1>
27
+
28
+</div></header>
29
+  <nav id="nav"><div><ul>
30
+  <li><a href="/">Blog</a></li>
31
+  <li><a href="/about/">About</a></li>
32
+  <li class="subscribe"><a href="/atom.xml">Subscribe</a></li>
33
+</ul>
34
+</div></nav>
35
+  <div id="page">
36
+    <div>
37
+      <div id="main"><article><article>
38
+  <header>
39
+  <p>
40
+    <time>November 13<span>th</span>, 2009</time>
41
+    
42
+      <span class="byline"><em>by</em> <span class="author">Your Name</span></span>
43
+    
44
+  </p>
45
+  <h1><a href="/2009/11/13/hello-world/">Hello World! I'm Octopress!</a></h1>
46
+</header>
47
+
48
+<div class="entry"><p><strong>Octopress is a blogging framework designed for hackers</strong>, based on <a href="http://github.com/mojombo/jekyll">Jekyll</a> the blog aware static site generator powering <a href="http://pages.github.com/">Github pages</a>.
49
+If you don&#8217;t know what Jekyll is, <a href="http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/">Jack Moffitt</a> wrote a good summary:</p>
50
+
51
+<blockquote><p>Jekyll is a static blog generator; it transforms a directory of input files into another directory of files suitable for a blog. The management of the blog is handled by standard, familiar tools like creating and renaming files, the text editor of your choice, and version control.</p></blockquote>
52
+
53
+<p><cite><strong>Jack Moffitt</strong> <a href="http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/">Blogging with Git Emacs and Jekyll</a></cite></p>
54
+
55
+<p>There&#8217;s no database to set up, and you get to use tools like Emacs, Vim, or TextMate to write your posts, not some lame in-browser text editor. Just write, generate, deploy, using the same tools and patterns you already use for your daily work.</p>
56
+
57
+<p><a href="http://wiki.github.com/imathis/octopress/">Read the wiki to learn more</a></p>
58
+</div>
59
+
60
+
61
+<p class="updated"><em>updated</em> <time>March 10<span>th</span>, 2010</time></p>
62
+
63
+  
64
+</article>
65
+</article></div>
66
+      <aside><h4>About Me</h4>
67
+<p> Yo everybody! </p>
68
+
69
+<section>
70
+  <h4>Recent Posts</h4>
71
+  <ul id="recent_posts">
72
+    
73
+      <li class="post">
74
+        <a href="/2011/04/07/test-of-typography/">Test of Typography</a>
75
+        <time>April 07, 2011</time>
76
+      </li>
77
+    
78
+      <li class="post">
79
+        <a href="/2011/03/14/test-post/">Test Post</a>
80
+        <time>March 14, 2011</time>
81
+      </li>
82
+    
83
+      <li class="post">
84
+        <a href="/2009/11/13/hello-world/">Hello World! I'm Octopress!</a>
85
+        <time>November 13, 2009</time>
86
+      </li>
87
+    
88
+  </ul>
89
+  </section>
90
+
91
+
92
+  <section><h4>On Twitter</h4>
93
+<ul id="tweets">
94
+  Status updating...
95
+</ul>
96
+<p>Follow <a href="http://twitter.com/#{page.twitter_user}">@imathis</a></p>
97
+</section>
98
+
99
+
100
+
101
+  <section><h4>My Pinboard</h4>
102
+<ul id="pinboard_linkroll">Fetching linkroll...</ul>
103
+<p><a href="http://pinboard.in/u:imathis">My Pinboard Bookmarks &raquo;</a></p>
104
+</section>
105
+
106
+</aside>
107
+    </div>
108
+  </div>
109
+  <footer><div><p>
110
+  Copyright &copy; 2011 - Your Name -
111
+  <span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
112
+</p>
113
+
114
+  <script language="javascript">
115
+    var pinboard_user = "imathis";
116
+    var pinboard_count = "3";
117
+  </script>
118
+  <script language="javascript" src="/javascripts/pinboard.js"></script>
119
+
120
+</div></footer>
121
+</body>
122
+</html>
0 123
new file mode 100644
... ...
@@ -0,0 +1,114 @@
0
+<!DOCTYPE html>
1
+<html>
2
+<head>
3
+  <title>Test Post - My Octopress Blog</title>
4
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
5
+  
6
+  
7
+  <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
8
+  <script src="/javascripts/mootools-yui-compressed.js" type="text/javascript"></script>
9
+  <script src="/javascripts/mootools-more-1.3.1.1.js" type="text/javascript"></script>
10
+  <script src="/javascripts/octopress.js" type="text/javascript"></script>
11
+  <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
12
+  <meta name="viewport" content="initial-scale=1.0 width=device-width">
13
+  
14
+    <script>
15
+      var twitter_user = "imathis";
16
+      var show_replies = false;
17
+      var tweet_count = 3;
18
+    </script>
19
+    <script src="/javascripts/twitter.js" type="text/javascript"></script>
20
+  
21
+  
22
+  <link href="/atom.xml" rel="alternate" title="My Octopress Blog" type="application/atom+xml"/>
23
+</head>
24
+
25
+<body id="">
26
+  <header><div><h1><a href="/">My Octopress Blog</a></h1>
27
+
28
+</div></header>
29
+  <nav id="nav"><div><ul>
30
+  <li><a href="/">Blog</a></li>
31
+  <li><a href="/about/">About</a></li>
32
+  <li class="subscribe"><a href="/atom.xml">Subscribe</a></li>
33
+</ul>
34
+</div></nav>
35
+  <div id="page">
36
+    <div>
37
+      <div id="main"><article><article>
38
+  <header>
39
+  <p>
40
+    <time>March 14<span>th</span>, 2011</time>
41
+    
42
+      <span class="byline"><em>by</em> <span class="author">Your Name</span></span>
43
+    
44
+  </p>
45
+  <h1><a href="/2011/03/14/test-post/">Test Post</a></h1>
46
+</header>
47
+
48
+<div class="entry"><p>This is a test!</p>
49
+</div>
50
+
51
+
52
+
53
+
54
+  
55
+</article>
56
+</article></div>
57
+      <aside><h4>About Me</h4>
58
+<p> Yo everybody! </p>
59
+
60
+<section>
61
+  <h4>Recent Posts</h4>
62
+  <ul id="recent_posts">
63
+    
64
+      <li class="post">
65
+        <a href="/2011/04/07/test-of-typography/">Test of Typography</a>
66
+        <time>April 07, 2011</time>
67
+      </li>
68
+    
69
+      <li class="post">
70
+        <a href="/2011/03/14/test-post/">Test Post</a>
71
+        <time>March 14, 2011</time>
72
+      </li>
73
+    
74
+      <li class="post">
75
+        <a href="/2009/11/13/hello-world/">Hello World! I'm Octopress!</a>
76
+        <time>November 13, 2009</time>
77
+      </li>
78
+    
79
+  </ul>
80
+  </section>
81
+
82
+
83
+  <section><h4>On Twitter</h4>
84
+<ul id="tweets">
85
+  Status updating...
86
+</ul>
87
+<p>Follow <a href="http://twitter.com/#{page.twitter_user}">@imathis</a></p>
88
+</section>
89
+
90
+
91
+
92
+  <section><h4>My Pinboard</h4>
93
+<ul id="pinboard_linkroll">Fetching linkroll...</ul>
94
+<p><a href="http://pinboard.in/u:imathis">My Pinboard Bookmarks &raquo;</a></p>
95
+</section>
96
+
97
+</aside>
98
+    </div>
99
+  </div>
100
+  <footer><div><p>
101
+  Copyright &copy; 2011 - Your Name -
102
+  <span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
103
+</p>
104
+
105
+  <script language="javascript">
106
+    var pinboard_user = "imathis";
107
+    var pinboard_count = "3";
108
+  </script>
109
+  <script language="javascript" src="/javascripts/pinboard.js"></script>
110
+
111
+</div></footer>
112
+</body>
113
+</html>
0 114
new file mode 100644
... ...
@@ -0,0 +1,164 @@
0
+<!DOCTYPE html>
1
+<html>
2
+<head>
3
+  <title>Test of Typography - My Octopress Blog</title>
4
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
5
+  
6
+  
7
+  <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
8
+  <script src="/javascripts/mootools-yui-compressed.js" type="text/javascript"></script>
9
+  <script src="/javascripts/mootools-more-1.3.1.1.js" type="text/javascript"></script>
10
+  <script src="/javascripts/octopress.js" type="text/javascript"></script>
11
+  <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
12
+  <meta name="viewport" content="initial-scale=1.0 width=device-width">
13
+  
14
+    <script>
15
+      var twitter_user = "imathis";
16
+      var show_replies = false;
17
+      var tweet_count = 3;
18
+    </script>
19
+    <script src="/javascripts/twitter.js" type="text/javascript"></script>
20
+  
21
+  
22
+  <link href="/atom.xml" rel="alternate" title="My Octopress Blog" type="application/atom+xml"/>
23
+</head>
24
+
25
+<body id="">
26
+  <header><div><h1><a href="/">My Octopress Blog</a></h1>
27
+
28
+</div></header>
29
+  <nav id="nav"><div><ul>
30
+  <li><a href="/">Blog</a></li>
31
+  <li><a href="/about/">About</a></li>
32
+  <li class="subscribe"><a href="/atom.xml">Subscribe</a></li>
33
+</ul>
34
+</div></nav>
35
+  <div id="page">
36
+    <div>
37
+      <div id="main"><article><article>
38
+  <header>
39
+  <p>
40
+    <time>April 7<span>th</span>, 2011</time>
41
+    
42
+      <span class="byline"><em>by</em> <span class="author">Your Name</span></span>
43
+    
44
+  </p>
45
+  <h1><a href="/2011/04/07/test-of-typography/">Test of Typography</a></h1>
46
+</header>
47
+
48
+<div class="entry"><p>In the past I&#8217;ve always designed my own business cards, printed them on expensive card stock, and hand-cut them with an X-Acto knife. My cards were way nicer than those my clients had gotten <em>professionally</em> printed with bubbly ink, no-bleed designs, and cheap paper. Though I put tremendous care into my cards, I never was happy with the design.</p>
49
+
50
+<h2>Why Have Business Cards?</h2>
51
+
52
+<p>I&#8217;m rarely asked for my business card except when I attend conferences, of which I attend one or two each year. As a freelance contractor, I leave work by walking twenty-five feet from my office to the couch. Many of the
53
+people I work for I&#8217;ve never met in-person.</p>
54
+
55
+<p>When someone gives me their business card, I read it, pocket it, and eventually throw it out &mdash; sometimes before I remember to copy the information to my address book (sorry, just being honest). The reality is, with the ubiquity of the internet and with frictionless social networks like Twitter, I can connect with people immediately. So why have business cards?</p>
56
+
57
+<!-- more -->
58
+
59
+
60
+<h3>Inspiration Demands Action</h3>
61
+
62
+<p>In one of our campfire chats <a href="http://twitter.com/NTalbott">Nathaniel Talbott</a> showed off his business cards which he printed through <a href="http://moo.com">Moo</a>. They were half the size of regular business cards featuring the company logo on the front, and the url on the back. The unique size of the card intrigued me, and days later I couldn&#8217;t stop thinking about designing a set of mini-cards for myself.</p>
63
+
64
+<p><img src="/content/blog/2010/cards/box.jpg" alt="cards in a box" width="300px" class="right"/> Moo&#8217;s <a href="http://moo.com/products/minicards.php">MiniCard&#8217;s</a> are very unique. You can print 100 cards, each with a totally different back. With a typical printing service this would be prohibitively expensive, but with Moo the rules are different. This freedom encourages us to go beyond nicely styled contact information and branding. Some clever uses involve offering unique invite codes for a web application, or sharing a photography portfolio with Moo&#8217;s Flickr import feature.</p>
65
+
66
+<p>I realized that I could print several design iterations and decide later which worked best. Without the pressure to choose a single design, I felt the freedom to create.</p>
67
+
68
+<h3>The Freedom to Fail</h3>
69
+
70
+<p><img src="/content/blog/2010/cards/concepts.jpg" alt="card concepts" width="270px" class="left"/> I could be cheeky and print up half of my cards with my logo on one side and only my Twitter name on the other. For less than $20 for 100 cards, I wasn&#8217;t even concerned about possibly screwing up a whole batch. So that&#8217;s what I did. I designed cards that were good enough and I printed them. If the cards did&#8217;t turn out how I wanted them to, I could improve and print again.</p>
71
+
72
+<p><img src="/content/blog/2010/cards/handout.jpg" alt="handout cards" width="220px" class="right"/> The process was fun and simple, and as soon as I finished, I wanted to do it again. When my cards arrived, I was absolutely delighted by the print quality and the care put into their presentation. Smartly Moo even included some beautiful promotional cards to hand out when people inevitably ask about mine.</p>
73
+
74
+<h3>A Second Iteration</h3>
75
+
76
+<p>After holding the finished product, I began to see how my design could be improved. I learned that Gill Sans is harder to read at a small size in a high contrast print, so I switched to Futura. I showed my cards to some far-sighted friends and adjusted my font size accordingly. I discarded a background gradient (which I should have known wouldn&#8217;t translate well to print) in favor of a solid color. <strong>Sidenote:</strong> On screen, gradients emulate the subtleties of a natural light source, but on a real object it doesn&#8217;t make sense and generally looks bad.</p>
77
+
78
+<p>I changed my approach choosing a single design with multiple color variations. In the promotional cards Moo sent me, I learned that they do a fantastic job with bright colors and I wanted to use that boldness in my design. I was inspired by what <a href="http://sethgodin.typepad.com/seths_blog/2009/07/welcome-to-island-marketing.html">Seth Godin said</a>:</p>
79
+
80
+<blockquote><p>Every interaction is both precious and an opportunity to delight.</p></blockquote>
81
+
82
+<p><img src="/content/blog/2010/cards/holder.jpg" alt="MiniCard Holder" width="220px" class="right"/> I pictured sliding a card out of my <a href="http://moo.com/products/accessories/holders/moo_minicard_holders">MiniCard Holder</a> and revealing another brightly-colored card beneath. As I hand someone a card they&#8217;ll see the flash of color and realize that their card was special, and different from my other cards. That&#8217;s what I want my clients and future clients to feel.</p>
83
+
84
+<h3>The Final Design</h3>
85
+
86
+<p><img src="/content/blog/2010/cards/all.jpg" alt="all card designs" width="640px"/></p>
87
+
88
+<p>The MiniCard&#8217;s unique constraints inspired me with a fresh challenge and their pricing model encouraged me to experiment. Instead of treating business cards like a necessary design task, I saw them as a opportunity to release quickly, fail cheaply, and improve. Now when I give someone a business card, it&#8217;s something valuable to me, and I hope they&#8217;re delighted.</p>
89
+
90
+<p><strong>Update:</strong> I thought I&#8217;d share some other great uses of Moo&#8217;s MiniCards. There&#8217;s a fantastic <a href="http://www.flickr.com/groups/moo/pool/">Flikr pool</a>, but here are some of my favorites. Enjoy:</p>
91
+
92
+<ul>
93
+<li><a href="http://www.flickr.com/photos/lushlampwork/4131018201/in/pool-moo">Product</a> <a href="http://www.flickr.com/photos/lushlampwork/4297224179/in/pool-moo">tags</a></li>
94
+<li><a href="http://www.flickr.com/photos/thisiswoly/4206576342/in/pool-moo">Photography</a> or <a href="http://www.flickr.com/photos/lesleybarnes/4276368956/in/pool-moo">art</a> <a href="http://www.flickr.com/photos/playinprogress/4158223112/in/pool-moo">portfolios</a></li>
95
+<li><a href="http://www.flickr.com/photos/polkadotcreations/4167249758/in/pool-moo">Gift</a> <a href="http://www.flickr.com/photos/22338102@N04/4278114745/in/pool-moo">tags</a></li>
96
+<li><a href="http://www.flickr.com/photos/bcome/4177034036/in/pool-moo">An advent calendar</a></li>
97
+</ul>
98
+
99
+</div>
100
+
101
+
102
+
103
+
104
+  
105
+</article>
106
+</article></div>
107
+      <aside><h4>About Me</h4>
108
+<p> Yo everybody! </p>
109
+
110
+<section>
111
+  <h4>Recent Posts</h4>
112
+  <ul id="recent_posts">
113
+    
114
+      <li class="post">
115
+        <a href="/2011/04/07/test-of-typography/">Test of Typography</a>
116
+        <time>April 07, 2011</time>
117
+      </li>
118
+    
119
+      <li class="post">
120
+        <a href="/2011/03/14/test-post/">Test Post</a>
121
+        <time>March 14, 2011</time>
122
+      </li>
123
+    
124
+      <li class="post">
125
+        <a href="/2009/11/13/hello-world/">Hello World! I'm Octopress!</a>
126
+        <time>November 13, 2009</time>
127
+      </li>
128
+    
129
+  </ul>
130
+  </section>
131
+
132
+
133
+  <section><h4>On Twitter</h4>
134
+<ul id="tweets">
135
+  Status updating...
136
+</ul>
137
+<p>Follow <a href="http://twitter.com/#{page.twitter_user}">@imathis</a></p>
138
+</section>
139
+
140
+
141
+
142
+  <section><h4>My Pinboard</h4>
143
+<ul id="pinboard_linkroll">Fetching linkroll...</ul>
144
+<p><a href="http://pinboard.in/u:imathis">My Pinboard Bookmarks &raquo;</a></p>
145
+</section>
146
+
147
+</aside>
148
+    </div>
149
+  </div>
150
+  <footer><div><p>
151
+  Copyright &copy; 2011 - Your Name -
152
+  <span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
153
+</p>
154
+
155
+  <script language="javascript">
156
+    var pinboard_user = "imathis";
157
+    var pinboard_count = "3";
158
+  </script>
159
+  <script language="javascript" src="/javascripts/pinboard.js"></script>
160
+
161
+</div></footer>
162
+</body>
163
+</html>
0 164
new file mode 100644
... ...
@@ -0,0 +1,103 @@
0
+<!DOCTYPE html>
1
+<html>
2
+<head>
3
+  <title>About Me - My Octopress Blog</title>
4
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
5
+  
6
+  
7
+  <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
8
+  <script src="/javascripts/mootools-yui-compressed.js" type="text/javascript"></script>
9
+  <script src="/javascripts/mootools-more-1.3.1.1.js" type="text/javascript"></script>
10
+  <script src="/javascripts/octopress.js" type="text/javascript"></script>
11
+  <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
12
+  <meta name="viewport" content="initial-scale=1.0 width=device-width">
13
+  
14
+    <script>
15
+      var twitter_user = "imathis";
16
+      var show_replies = false;
17
+      var tweet_count = 3;
18
+    </script>
19
+    <script src="/javascripts/twitter.js" type="text/javascript"></script>
20
+  
21
+  
22
+  <link href="/atom.xml" rel="alternate" title="My Octopress Blog" type="application/atom+xml"/>
23
+</head>
24
+
25
+<body id="">
26
+  <header><div><h1><a href="/">My Octopress Blog</a></h1>
27
+
28
+</div></header>
29
+  <nav id="nav"><div><ul>
30
+  <li><a href="/">Blog</a></li>
31
+  <li><a href="/about/">About</a></li>
32
+  <li class="subscribe"><a href="/atom.xml">Subscribe</a></li>
33
+</ul>
34
+</div></nav>
35
+  <div id="page">
36
+    <div>
37
+      <div id="main"><article><!-- use the :mardown filter if you want to write pages with Markdown -->
38
+<h1>About Me</h1>
39
+
40
+<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum.</p>
41
+
42
+<p>Ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt.</p>
43
+
44
+<p>Dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent.</p>
45
+</article></div>
46
+      <aside><h4>About Me</h4>
47
+<p> Yo everybody! </p>
48
+
49
+<section>
50
+  <h4>Recent Posts</h4>
51
+  <ul id="recent_posts">
52
+    
53
+      <li class="post">
54
+        <a href="/2011/04/07/test-of-typography/">Test of Typography</a>
55
+        <time>April 07, 2011</time>
56
+      </li>
57
+    
58
+      <li class="post">
59
+        <a href="/2011/03/14/test-post/">Test Post</a>
60
+        <time>March 14, 2011</time>
61
+      </li>
62
+    
63
+      <li class="post">
64
+        <a href="/2009/11/13/hello-world/">Hello World! I'm Octopress!</a>
65
+        <time>November 13, 2009</time>
66
+      </li>
67
+    
68
+  </ul>
69
+  </section>
70
+
71
+
72
+  <section><h4>On Twitter</h4>
73
+<ul id="tweets">
74
+  Status updating...
75
+</ul>
76
+<p>Follow <a href="http://twitter.com/#{page.twitter_user}">@imathis</a></p>
77
+</section>
78
+
79
+
80
+
81
+  <section><h4>My Pinboard</h4>
82
+<ul id="pinboard_linkroll">Fetching linkroll...</ul>
83
+<p><a href="http://pinboard.in/u:imathis">My Pinboard Bookmarks &raquo;</a></p>
84
+</section>
85
+
86
+</aside>
87
+    </div>
88
+  </div>
89
+  <footer><div><p>
90
+  Copyright &copy; 2011 - Your Name -
91
+  <span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
92
+</p>
93
+
94
+  <script language="javascript">
95
+    var pinboard_user = "imathis";
96
+    var pinboard_count = "3";
97
+  </script>
98
+  <script language="javascript" src="/javascripts/pinboard.js"></script>
99
+
100
+</div></footer>
101
+</body>
102
+</html>
0 103
new file mode 100644
... ...
@@ -0,0 +1,103 @@
0
+<?xml version="1.0" encoding="utf-8"?>
1
+<feed xmlns="http://www.w3.org/2005/Atom">
2
+
3
+  <title></title>
4
+  <link href="http://yoursite.com/atom.xml" rel="self"/>
5
+  <link href="http://yoursite.com/"/>
6
+  <updated>2011-04-11T16:23:20-05:00</updated>
7
+  <id>http://yoursite.com/</id>
8
+  <author>
9
+    <name>Your Name</name>
10
+    
11
+      <email>you@domain.com</email>
12
+    
13
+  </author>
14
+
15
+  
16
+  <entry>
17
+    <title>Test of Typography</title>
18
+    <link href="http://yoursite.com/2011/04/07/test-of-typography/"/>
19
+    <updated>2011-04-07T19:17:00-05:00</updated>
20
+    <id>http://yoursite.com/2011/04/07/test-of-typography</id>
21
+    <content type="html">&lt;p&gt;In the past I've always designed my own business cards, printed them on expensive card stock, and hand-cut them with an X-Acto knife. My cards were way nicer than those my clients had gotten &lt;em&gt;professionally&lt;/em&gt; printed with bubbly ink, no-bleed designs, and cheap paper. Though I put tremendous care into my cards, I never was happy with the design.&lt;/p&gt;
22
+
23
+&lt;h2&gt;Why Have Business Cards?&lt;/h2&gt;
24
+
25
+&lt;p&gt;I'm rarely asked for my business card except when I attend conferences, of which I attend one or two each year. As a freelance contractor, I leave work by walking twenty-five feet from my office to the couch. Many of the
26
+people I work for I've never met in-person.&lt;/p&gt;
27
+
28
+&lt;p&gt;When someone gives me their business card, I read it, pocket it, and eventually throw it out &amp;mdash; sometimes before I remember to copy the information to my address book (sorry, just being honest). The reality is, with the ubiquity of the internet and with frictionless social networks like Twitter, I can connect with people immediately. So why have business cards?&lt;/p&gt;
29
+
30
+&lt;!-- more --&gt;
31
+
32
+
33
+&lt;h3&gt;Inspiration Demands Action&lt;/h3&gt;
34
+
35
+&lt;p&gt;In one of our campfire chats &lt;a href=&quot;http://twitter.com/NTalbott&quot;&gt;Nathaniel Talbott&lt;/a&gt; showed off his business cards which he printed through &lt;a href=&quot;http://moo.com&quot;&gt;Moo&lt;/a&gt;. They were half the size of regular business cards featuring the company logo on the front, and the url on the back. The unique size of the card intrigued me, and days later I couldn't stop thinking about designing a set of mini-cards for myself.&lt;/p&gt;
36
+
37
+&lt;p&gt;&lt;img src=&quot;http://yoursite.com/content/blog/2010/cards/box.jpg&quot; alt=&quot;cards in a box&quot; width=&quot;300px&quot; class=&quot;right&quot;/&gt; Moo's &lt;a href=&quot;http://moo.com/products/minicards.php&quot;&gt;MiniCard's&lt;/a&gt; are very unique. You can print 100 cards, each with a totally different back. With a typical printing service this would be prohibitively expensive, but with Moo the rules are different. This freedom encourages us to go beyond nicely styled contact information and branding. Some clever uses involve offering unique invite codes for a web application, or sharing a photography portfolio with Moo's Flickr import feature.&lt;/p&gt;
38
+
39
+&lt;p&gt;I realized that I could print several design iterations and decide later which worked best. Without the pressure to choose a single design, I felt the freedom to create.&lt;/p&gt;
40
+
41
+&lt;h3&gt;The Freedom to Fail&lt;/h3&gt;
42
+
43
+&lt;p&gt;&lt;img src=&quot;http://yoursite.com/content/blog/2010/cards/concepts.jpg&quot; alt=&quot;card concepts&quot; width=&quot;270px&quot; class=&quot;left&quot;/&gt; I could be cheeky and print up half of my cards with my logo on one side and only my Twitter name on the other. For less than $20 for 100 cards, I wasn't even concerned about possibly screwing up a whole batch. So that's what I did. I designed cards that were good enough and I printed them. If the cards did't turn out how I wanted them to, I could improve and print again.&lt;/p&gt;
44
+
45
+&lt;p&gt;&lt;img src=&quot;http://yoursite.com/content/blog/2010/cards/handout.jpg&quot; alt=&quot;handout cards&quot; width=&quot;220px&quot; class=&quot;right&quot;/&gt; The process was fun and simple, and as soon as I finished, I wanted to do it again. When my cards arrived, I was absolutely delighted by the print quality and the care put into their presentation. Smartly Moo even included some beautiful promotional cards to hand out when people inevitably ask about mine.&lt;/p&gt;
46
+
47
+&lt;h3&gt;A Second Iteration&lt;/h3&gt;
48
+
49
+&lt;p&gt;After holding the finished product, I began to see how my design could be improved. I learned that Gill Sans is harder to read at a small size in a high contrast print, so I switched to Futura. I showed my cards to some far-sighted friends and adjusted my font size accordingly. I discarded a background gradient (which I should have known wouldn't translate well to print) in favor of a solid color. &lt;strong&gt;Sidenote:&lt;/strong&gt; On screen, gradients emulate the subtleties of a natural light source, but on a real object it doesn't make sense and generally looks bad.&lt;/p&gt;
50
+
51
+&lt;p&gt;I changed my approach choosing a single design with multiple color variations. In the promotional cards Moo sent me, I learned that they do a fantastic job with bright colors and I wanted to use that boldness in my design. I was inspired by what &lt;a href=&quot;http://sethgodin.typepad.com/seths_blog/2009/07/welcome-to-island-marketing.html&quot;&gt;Seth Godin said&lt;/a&gt;:&lt;/p&gt;
52
+
53
+&lt;blockquote&gt;&lt;p&gt;Every interaction is both precious and an opportunity to delight.&lt;/p&gt;&lt;/blockquote&gt;
54
+
55
+&lt;p&gt;&lt;img src=&quot;http://yoursite.com/content/blog/2010/cards/holder.jpg&quot; alt=&quot;MiniCard Holder&quot; width=&quot;220px&quot; class=&quot;right&quot;/&gt; I pictured sliding a card out of my &lt;a href=&quot;http://moo.com/products/accessories/holders/moo_minicard_holders&quot;&gt;MiniCard Holder&lt;/a&gt; and revealing another brightly-colored card beneath. As I hand someone a card they'll see the flash of color and realize that their card was special, and different from my other cards. That's what I want my clients and future clients to feel.&lt;/p&gt;
56
+
57
+&lt;h3&gt;The Final Design&lt;/h3&gt;
58
+
59
+&lt;p&gt;&lt;img src=&quot;http://yoursite.com/content/blog/2010/cards/all.jpg&quot; alt=&quot;all card designs&quot; width=&quot;640px&quot;/&gt;&lt;/p&gt;
60
+
61
+&lt;p&gt;The MiniCard's unique constraints inspired me with a fresh challenge and their pricing model encouraged me to experiment. Instead of treating business cards like a necessary design task, I saw them as a opportunity to release quickly, fail cheaply, and improve. Now when I give someone a business card, it's something valuable to me, and I hope they're delighted.&lt;/p&gt;
62
+
63
+&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I thought I'd share some other great uses of Moo's MiniCards. There's a fantastic &lt;a href=&quot;http://www.flickr.com/groups/moo/pool/&quot;&gt;Flikr pool&lt;/a&gt;, but here are some of my favorites. Enjoy:&lt;/p&gt;
64
+
65
+&lt;ul&gt;
66
+&lt;li&gt;&lt;a href=&quot;http://www.flickr.com/photos/lushlampwork/4131018201/in/pool-moo&quot;&gt;Product&lt;/a&gt; &lt;a href=&quot;http://www.flickr.com/photos/lushlampwork/4297224179/in/pool-moo&quot;&gt;tags&lt;/a&gt;&lt;/li&gt;
67
+&lt;li&gt;&lt;a href=&quot;http://www.flickr.com/photos/thisiswoly/4206576342/in/pool-moo&quot;&gt;Photography&lt;/a&gt; or &lt;a href=&quot;http://www.flickr.com/photos/lesleybarnes/4276368956/in/pool-moo&quot;&gt;art&lt;/a&gt; &lt;a href=&quot;http://www.flickr.com/photos/playinprogress/4158223112/in/pool-moo&quot;&gt;portfolios&lt;/a&gt;&lt;/li&gt;
68
+&lt;li&gt;&lt;a href=&quot;http://www.flickr.com/photos/polkadotcreations/4167249758/in/pool-moo&quot;&gt;Gift&lt;/a&gt; &lt;a href=&quot;http://www.flickr.com/photos/22338102@N04/4278114745/in/pool-moo&quot;&gt;tags&lt;/a&gt;&lt;/li&gt;
69
+&lt;li&gt;&lt;a href=&quot;http://www.flickr.com/photos/bcome/4177034036/in/pool-moo&quot;&gt;An advent calendar&lt;/a&gt;&lt;/li&gt;
70
+&lt;/ul&gt;
71
+
72
+</content>
73
+  </entry>
74
+  
75
+  <entry>
76
+    <title>Test Post</title>
77
+    <link href="http://yoursite.com/2011/03/14/test-post/"/>
78
+    <updated>2011-03-14T00:00:00-05:00</updated>
79
+    <id>http://yoursite.com/2011/03/14/test-post</id>
80
+    <content type="html">&lt;p&gt;This is a test!&lt;/p&gt;
81
+</content>
82
+  </entry>
83
+  
84
+  <entry>
85
+    <title>Hello World! I'm Octopress!</title>
86
+    <link href="http://yoursite.com/2009/11/13/hello-world/"/>
87
+    <updated>2009-11-13T00:00:00-06:00</updated>
88
+    <id>http://yoursite.com/2009/11/13/hello-world</id>
89
+    <content type="html">&lt;p&gt;&lt;strong&gt;Octopress is a blogging framework designed for hackers&lt;/strong&gt;, based on &lt;a href=&quot;http://github.com/mojombo/jekyll&quot;&gt;Jekyll&lt;/a&gt; the blog aware static site generator powering &lt;a href=&quot;http://pages.github.com/&quot;&gt;Github pages&lt;/a&gt;.
90
+If you don't know what Jekyll is, &lt;a href=&quot;http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/&quot;&gt;Jack Moffitt&lt;/a&gt; wrote a good summary:&lt;/p&gt;
91
+
92
+&lt;blockquote&gt;&lt;p&gt;Jekyll is a static blog generator; it transforms a directory of input files into another directory of files suitable for a blog. The management of the blog is handled by standard, familiar tools like creating and renaming files, the text editor of your choice, and version control.&lt;/p&gt;&lt;/blockquote&gt;
93
+
94
+&lt;p&gt;&lt;cite&gt;&lt;strong&gt;Jack Moffitt&lt;/strong&gt; &lt;a href=&quot;http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/&quot;&gt;Blogging with Git Emacs and Jekyll&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
95
+
96
+&lt;p&gt;There's no database to set up, and you get to use tools like Emacs, Vim, or TextMate to write your posts, not some lame in-browser text editor. Just write, generate, deploy, using the same tools and patterns you already use for your daily work.&lt;/p&gt;
97
+
98
+&lt;p&gt;&lt;a href=&quot;http://wiki.github.com/imathis/octopress/&quot;&gt;Read the wiki to learn more&lt;/a&gt;&lt;/p&gt;
99
+</content>
100
+  </entry>
101
+  
102
+</feed>
0 103
new file mode 100644
1 104
Binary files /dev/null and b/public/fonts/adellebasic_bold-webfont.eot differ
2 105
new file mode 100644
... ...
@@ -0,0 +1,139 @@
0
+<?xml version="1.0" standalone="no"?>
1
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
2
+<svg xmlns="http://www.w3.org/2000/svg">
3
+<metadata>
4
+This is a custom SVG webfont generated by Font Squirrel.
5
+Copyright   : Copyright c 2009 by TypeTogether All rights reserved
6
+Designer    : Veronika Burian Jos Scaglione
7
+Foundry     : TypeTogether
8
+Foundry URL : wwwtypetogethercom
9
+</metadata>
10
+<defs>
11
+<font id="webfontKykxqSyz" horiz-adv-x="1167" >
12
+<font-face units-per-em="2048" ascent="1546" descent="-502" />
13
+<missing-glyph horiz-adv-x="413" />
14
+<glyph unicode=" "  horiz-adv-x="413" />
15
+<glyph unicode="&#x09;" horiz-adv-x="413" />
16
+<glyph unicode="&#xa0;" horiz-adv-x="413" />
17
+<glyph unicode="!" horiz-adv-x="569" d="M414 401h-258l-37 719v363h330v-363zM461 135q0 -160 -176 -160t-176 160t176 160t176 -160z" />
18
+<glyph unicode="&#x22;" horiz-adv-x="825" d="M358 915h-276v531h276v-531zM743 915h-276v531h276v-531z" />
19
+<glyph unicode="#" horiz-adv-x="1243" d="M831 0h-210l34 248h-176l-37 -248h-213l37 248h-205l45 207h193l35 231h-205l43 209h193l32 217h213l-32 -217h176l32 217h213l-32 -217h207l-41 -209h-197l-35 -231h207l-41 -207h-199zM688 455l35 231h-176l-37 -231h178z" />
20
+<glyph unicode="$" horiz-adv-x="1083" d="M999 399q0 -158 -85 -254t-234 -129v-180h-254v166q-227 10 -356 74v327h223l26 -143q4 -23 11.5 -31t27.5 -14q51 -18 152 -18q207 0 207 145q0 72 -65.5 114t-159 66.5t-186.5 58t-158.5 113.5t-65.5 209q0 160 93 256t251 129v160h256v-150q152 -10 293 -59v-350 l-225 22l-25 136q-6 35 -41 45q-41 10 -117 10q-203 0 -202 -137q0 -68 65.5 -109t158.5 -67.5t186 -61.5t158.5 -118t65.5 -210z" />
21
+<glyph unicode="%" horiz-adv-x="1818" d="M410 526q-182 0 -263 99.5t-81 261.5q0 180 90 281.5t270 101.5q342 0 342 -357q0 -180 -91 -283.5t-267 -103.5zM662 -35h-285l772 1307h283zM420 694q61 0 89 51.5t28 159.5q0 100 -27 147.5t-88 47.5q-121 0 -121 -199q0 -207 119 -207zM1395 -25q-182 0 -263 99.5 t-81 261.5q0 180 90 281.5t270 101.5q342 0 342 -357q0 -180 -91 -283.5t-267 -103.5zM1402.5 143q63.5 0 90.5 50.5t27 160.5q0 100 -26 147.5t-89 47.5q-119 0 -119 -199q0 -106 26.5 -156.5t90 -50.5z" />
22
+<glyph unicode="&#x26;" horiz-adv-x="1470" d="M1409 0h-346l-113 131q-166 -156 -413 -156q-211 0 -338 112t-127 310q0 295 295 418q-76 119 -76 238q0 156 109.5 247t285.5 91q104 0 206.5 -28t158.5 -63v-321l-220 8l-24 137q-4 25 -29 33q-27 8 -73 8q-59 0 -90 -30.5t-31 -81.5q0 -86 112 -217l230 -271 q29 88 47 228h352v-158l-94 -19q-18 -4 -25.5 -9t-9.5 -25q-29 -133 -76 -232l129 -147q18 -23 39 -25l121 -18v-160zM784 317l-270 308q-145 -61 -145 -213q0 -82 47 -136.5t145 -54.5q135 0 223 96z" />
23
+<glyph unicode="'" horiz-adv-x="442" d="M358 915h-276v531h276v-531z" />
24
+<glyph unicode="(" horiz-adv-x="729" d="M655 -221l-235 -133q-145 190 -239.5 429.5t-94.5 497.5q0 485 352 951l232 -138q-131 -195 -192.5 -388t-61.5 -425q0 -238 59 -413.5t180 -380.5z" />
25
+<glyph unicode=")" horiz-adv-x="729" d="M297 -354l-231 135q125 190 187 380.5t62 428.5q0 231 -59 412.5t-186 386.5l233 135q147 -188 243.5 -433t96.5 -501q0 -483 -346 -944z" />
26
+<glyph unicode="*" horiz-adv-x="976" d="M342 782l-174 129l88 115l178 115l-213 -8l-137 45l70 204l137 -45l162 -133l-74 199v143h215v-143l-72 -199h-69l-19 -63l53 -41l-59 -201zM809 911l-174 -129l-86 117l-62 201l56 41l-21 63l164 133l137 45l68 -204l-137 -45l-211 8l178 -115z" />
27
+<glyph unicode="+" d="M705 248h-246v295h-273v237h273v287h246v-287h274v-237h-274v-295z" />
28
+<glyph unicode="," horiz-adv-x="516" d="M281 -244l-140 41l56 219q6 18 -11 25l-84 29l45 221q141 -2 214 -33t73 -127q0 -55 -43 -141z" />
29
+<glyph unicode="-" horiz-adv-x="636" d="M596 465h-555v260h555v-260z" />
30
+<glyph unicode="." horiz-adv-x="555" d="M453 135q0 -160 -174 -160q-176 0 -176.5 160t176.5 160q174 0 174 -160z" />
31
+<glyph unicode="/" horiz-adv-x="929" d="M315 -188h-292l575 1734h291z" />
32
+<glyph unicode="0" horiz-adv-x="1232" d="M606 -25q-291 0 -409.5 160t-118.5 459q0 616 553 616q287 0 405.5 -155.5t118.5 -444.5q0 -305 -128 -470t-421 -165zM618 195q113 0 161 93t48 310q0 213 -45 301t-157 88q-117 0 -167 -92t-50 -305q0 -211 46.5 -303t163.5 -92z" />
33
+<glyph unicode="1" horiz-adv-x="831" d="M791 0h-719v162l176 14q20 2 26.5 9.5t6.5 31.5v715q0 35 -27 43l-178 37l22 168h492v-963q0 -25 5 -32t28 -9l168 -14v-162z" />
34
+<glyph unicode="2" horiz-adv-x="1073" d="M1012 0h-946v190l274 269q129 125 175 173t83 108.5t37 117.5q0 131 -146 131q-88 0 -123.5 -38t-35.5 -144l-279 24q2 379 465 379q430 0 430 -327q0 -90 -45 -178.5t-92 -139.5t-145 -145l-232 -221h301q29 0 33 24l29 162h217v-385z" />
35
+<glyph unicode="3" horiz-adv-x="1062" d="M723 551v-8q270 -41 270 -316q0 -197 -134 -297t-361 -100q-154 0 -285 50t-211 138l164 181q139 -135 307 -136q213 0 213 185q0 176 -205 176q-66 0 -151 -14v204l100 13q227 29 227 221q0 141 -149 141q-88 0 -126 -39t-38 -143l-281 24q0 379 459 379 q229 0 332.5 -85t103.5 -255q0 -123 -66.5 -205.5t-168.5 -113.5z" />
36
+<glyph unicode="4" horiz-adv-x="1140" d="M934 -137h-283v264h-598v211l420 879l268 -123l-387 -727h297v329l283 43v-372h170v-240h-170v-264z" />
37
+<glyph unicode="5" horiz-adv-x="1110" d="M942 922h-543l-28 -281q106 70 260 70q184 0 289.5 -106.5t105.5 -311.5q0 -199 -133 -331t-371 -132q-340 0 -516 188l164 187q139 -139 326 -139q96 0 158.5 56t62.5 161q0 113 -57.5 155.5t-133.5 42.5q-113 0 -196 -88l-203 84l45 703h535q20 0 26 24l27 113l182 12 v-407z" />
38
+<glyph unicode="6" horiz-adv-x="1157" d="M1067 1004l-289 -35q0 92 -31.5 126.5t-113.5 34.5q-217 0 -230 -382q135 80 287 79q184 0 292 -100t108 -295q0 -229 -134.5 -343t-357.5 -114q-145 0 -246.5 50.5t-158 145.5t-81 211t-24.5 267q0 121 25.5 232.5t83 220t171 174t271.5 65.5q428 1 428 -337zM403 543 q2 -74 10.5 -126t28 -105.5t60.5 -82t102 -28.5q172 0 172 217q0 104 -37 147t-129 43q-101 1 -207 -65z" />
39
+<glyph unicode="7" horiz-adv-x="1089" d="M625 -137h-326q53 625 446 1059h-391q-14 0 -18 -5.5t-8 -21.5l-33 -172l-215 -16v473h989v-232q-186 -199 -311 -491.5t-133 -593.5z" />
40
+<glyph unicode="8" horiz-adv-x="1105" d="M823 696q215 -123 215 -325q0 -193 -139 -294.5t-367 -101.5q-223 0 -343.5 90.5t-120.5 264.5q0 111 51 192.5t143 157.5q-152 104 -151 281q0 182 124.5 281t323.5 99q201 0 313.5 -87t112.5 -240q0 -177 -162 -318zM459 575q-135 -125 -135 -229q0 -166 213 -166 q94 0 142 43t48 113q0 27 -6 49.5t-26 42.5l-31 34q-12 13 -47 33l-47 26q-13 7 -57 28.5t-54 25.5zM618 795q106 111 107 204q0 139 -164 140q-76 0 -115.5 -37t-39.5 -96q0 -37 15 -68t49 -56.5t63.5 -42.5t84.5 -44z" />
41
+<glyph unicode="9" d="M109 -18l131 188q131 -111 284 -111q135 0 186.5 90.5t57.5 251.5q-121 -78 -287 -77q-176 0 -287.5 113.5t-111.5 316.5q0 219 129 337.5t356 118.5q518 0 518 -659q0 -719 -546 -719q-123 0 -240.5 40t-189.5 110zM768 623q-4 78 -12 134t-28.5 113.5t-61.5 87 t-101 29.5q-170 0 -170 -217q0 -113 37 -167t127 -54q105 0 209 74z" />
42
+<glyph unicode=":" horiz-adv-x="555" d="M453 135q0 -160 -174 -160q-176 0 -176.5 160t176.5 160q174 0 174 -160zM453 913.5q0 -159.5 -174 -159.5q-176 0 -176.5 159.5t176.5 159.5q174 0 174 -159.5z" />
43
+<glyph unicode=";" horiz-adv-x="522" d="M281 -244l-140 41l56 219q6 18 -11 25l-84 29l45 221q141 -2 214 -33t73 -127q0 -55 -43 -141zM461 913.5q0 -159.5 -174 -159.5q-176 0 -176 159.5t176 159.5q174 0 174 -159.5z" />
44
+<glyph unicode="&#x3c;" d="M940 172l-799 281v286l795 291l70 -231l-598 -201l602 -201z" />
45
+<glyph unicode="=" d="M979 266h-791v240h791v-240zM979 647h-791v240h791v-240z" />
46
+<glyph unicode="&#x3e;" d="M1010 453l-799 -281l-70 225l602 201l-596 201l68 231l795 -291v-286z" />
47
+<glyph unicode="?" horiz-adv-x="1081" d="M600 401h-309v373q70 6 112.5 11.5t106 23.5t99.5 46t63.5 78t27.5 118q0 86 -43 133t-122 47q-78 0 -138 -25q-23 -8 -26 -41l-19 -131l-250 -18v377q236 90 447 90q496 0 495 -422q0 -199 -113.5 -322t-330.5 -149v-189zM621 135q0 -160 -175 -160q-176 0 -176 160 t176 160q175 0 175 -160z" />
48
+<glyph unicode="@" horiz-adv-x="1722" d="M1219 -143l49 -168q-164 -72 -416 -72q-340 0 -537.5 187.5t-197.5 539.5q0 369 220 594t574 225q322 0 515.5 -171t193.5 -480q0 -272 -108.5 -404.5t-294.5 -132.5q-184 0 -236 142q-145 -141 -250 -142q-109 0 -171 75t-62 214q0 229 121.5 389t328.5 160 q145 0 285 -65l-47 -302q-27 -147 -27 -217q0 -80 76 -79q51 0 89 35.5t56.5 93t26.5 111.5t8 106q0 231 -125 357t-385 126q-283 0 -432 -184.5t-149 -450.5q0 -268 144 -409.5t409 -141.5q168 1 342 64zM963 262l59 377q-35 25 -90 25q-92 0 -159.5 -103.5t-67.5 -263.5 q0 -143 82 -143.5t176 108.5z" />
49
+<glyph unicode="A" horiz-adv-x="1554" d="M1548 0h-647v160l168 18l-74 213h-508l-71 -213l162 -18v-160h-572v160l90 22q41 10 51 39l449 1262h362l447 -1266q8 -25 49 -35l94 -22v-160zM934 612l-182 557h-13l-188 -557h383z" />
50
+<glyph unicode="B" horiz-adv-x="1376" d="M750 0h-672v160l129 14q20 2 26.5 10.5t6.5 30.5v1049q0 25 -6.5 32t-26.5 9l-129 14v164h690q449 0 449 -363q0 -135 -72 -222t-178 -122v-6q342 -39 342 -362q0 -408 -559 -408zM555 221h141q141 0 213 47t72 172q0 215 -254 215h-172v-434zM555 860h82q129 0 203.5 45 t74.5 164q0 115 -62 153t-185 38h-113v-400z" />
51
+<glyph unicode="C" horiz-adv-x="1386" d="M1294 469v-381q-184 -113 -512 -113q-719 0 -719 773q0 342 197 551.5t565 209.5q287 0 465 -116v-402l-225 19l-33 200q-6 29 -33 37q-78 25 -182 25q-199 0 -312.5 -134t-113.5 -390q0 -266 108.5 -402.5t303.5 -136.5q119 0 205 27q18 4 25 12t11 31l31 190h219z" />
52
+<glyph unicode="D" horiz-adv-x="1540" d="M707 0h-629v164l129 14q20 2 26.5 9.5t6.5 31.5v1047q0 23 -6.5 31t-26.5 10l-129 14v162h663q375 0 555.5 -187.5t180.5 -531.5q0 -354 -192.5 -559t-577.5 -205zM557 221h117q481 0 481 524q0 279 -110.5 398t-358.5 119h-129v-1041z" />
53
+<glyph unicode="E" horiz-adv-x="1284" d="M1212 0h-1134v160l129 14q20 2 26.5 10.5t6.5 30.5v1051q0 25 -6.5 32t-26.5 9l-129 14v162h1089v-414l-225 10l-29 156q-6 27 -34 27h-322v-404h479v-227h-479v-412h367q29 0 32 23l33 180h223v-422z" />
54
+<glyph unicode="F" horiz-adv-x="1234" d="M891 0h-813v160l129 14q20 2 26.5 10.5t6.5 30.5v1051q0 25 -6.5 32t-26.5 9l-129 14v162h1081v-414l-225 10l-29 156q-6 27 -35 27h-313v-402h471v-227h-471v-414q0 -25 5 -32t28 -9l301 -16v-162z" />
55
+<glyph unicode="G" horiz-adv-x="1478" d="M1460 551l-84 -8q-33 -2 -33 -29v-440q-207 -98 -530 -99q-205 0 -353.5 57.5t-233.5 164t-125 241.5t-40 307q0 342 197 553t571 211q119 0 247 -30.5t216 -87.5v-387l-227 16l-31 184q-8 35 -33 41q-94 27 -188 27q-197 0 -309.5 -140.5t-112.5 -381.5 q0 -258 109.5 -398.5t326.5 -140.5q88 0 170 14q33 6 33 37v268h-227l28 185h629v-164z" />
56
+<glyph unicode="H" horiz-adv-x="1675" d="M1604 0h-648v160l129 14q20 2 26.5 10.5t6.5 30.5v432h-561v-430q0 -25 5 -32t28 -9l137 -16v-160h-649v160l129 14q20 2 26.5 10.5t6.5 30.5v1049q0 25 -6.5 32t-26.5 9l-129 14v164h649v-164l-137 -16q-23 -2 -28 -9.5t-5 -29.5v-387h561v387q0 25 -6 32t-27 9l-129 14 v164h648v-164l-138 -16q-23 -2 -27.5 -9.5t-4.5 -29.5v-1047q0 -25 5 -32t27 -9l138 -16v-160z" />
57
+<glyph unicode="I" horiz-adv-x="827" d="M762 0h-688v160l149 14q20 2 26.5 9t6.5 32v1049q0 25 -6 32t-27 9l-149 14v164h688v-164l-158 -16q-23 -2 -28 -9.5t-5 -29.5v-1047q0 -25 5.5 -32t27.5 -9l158 -16v-160z" />
58
+<glyph unicode="J" horiz-adv-x="1056" d="M526 336v930q0 23 -6 30t-26 9l-185 14v164h705v-164l-137 -16q-23 -2 -28 -8.5t-5 -28.5v-932q0 -182 -92.5 -270.5t-294.5 -88.5q-117 0 -227.5 25t-157.5 55v365l229 -17l21 -147q2 -20 22 -27q37 -12 82 -12q55 0 77.5 26.5t22.5 92.5z" />
59
+<glyph unicode="K" horiz-adv-x="1540" d="M1522 0h-453l-383 592l-129 -154v-219q0 -25 5 -32t28 -9l158 -16v-162h-670v162l129 14q20 2 26.5 9.5t6.5 31.5v1049q0 23 -6.5 31t-26.5 10l-129 14v162h649v-162l-137 -16q-23 -2 -28 -9.5t-5 -29.5v-512l483 549l-127 16v164h537v-164l-86 -14q-41 -6 -64 -35 l-376 -426l411 -629q18 -29 60 -33l127 -20v-162z" />
60
+<glyph unicode="L" horiz-adv-x="1277" d="M1212 0h-1134v162l129 14q20 2 26.5 10.5t6.5 30.5v1049q0 25 -6.5 32t-26.5 9l-129 14v162h682v-162l-170 -16q-23 -2 -28 -9.5t-5 -29.5v-1047h365q29 0 32 23l33 204h225v-446z" />
61
+<glyph unicode="M" horiz-adv-x="1970" d="M1898 0h-673v160l168 14q20 2 26 10.5t6 30.5v778h-8l-293 -698h-333l-289 700h-10v-778q0 -25 5 -32t27 -9l176 -16v-160h-622v160l129 14q20 2 26.5 10.5t6.5 30.5v1051q0 23 -6.5 31t-26.5 10l-129 14v162h549l356 -928h8l375 928h532v-160l-137 -16 q-23 -2 -27.5 -9.5t-4.5 -29.5v-1053q0 -35 32 -39l137 -16v-160z" />
62
+<glyph unicode="N" horiz-adv-x="1693" d="M1466 0h-336l-653 1069v-852q0 -25 5 -32t28 -9l137 -16v-160h-569v160l129 14q20 2 26.5 10.5t6.5 30.5v1053q0 25 -6.5 32t-26.5 9l-129 14v160h508l643 -1071v852q0 25 -6 32t-27 9l-129 14v164h569v-164l-137 -16q-23 -2 -28 -9.5t-5 -29.5v-1264z" />
63
+<glyph unicode="O" horiz-adv-x="1554" d="M768 -25q-356 0 -530.5 206t-174.5 556q0 342 190.5 557t543.5 215q346 0 520 -207.5t174 -537.5q0 -371 -183.5 -580t-539.5 -209zM780 227q385 0 385 518q0 506 -372 506q-184 0 -293 -127t-109 -381q0 -516 389 -516z" />
64
+<glyph unicode="P" horiz-adv-x="1323" d="M881 0h-803v162l129 14q20 2 26.5 10.5t6.5 30.5v1047q0 25 -6.5 32t-26.5 9l-129 14v164h694q264 0 379 -120t115 -316q0 -500 -561 -500h-150v-328q0 -25 5 -32t28 -9l293 -16v-162zM555 766h102q59 0 103.5 9t88.5 35t68.5 81t24.5 137q0 135 -69.5 183.5t-196.5 48.5 h-121v-494z" />
65
+<glyph unicode="Q" horiz-adv-x="1552" d="M1182 -176l59 -180q-143 -76 -291 -76q-324 0 -323 305q0 55 6 111q-291 35 -434.5 235.5t-143.5 517.5q0 342 190.5 557t542.5 215q236 0 395.5 -102t229.5 -266t70 -377q0 -326 -143.5 -528.5t-421.5 -245.5q-4 -25 -5 -70q0 -63 28 -95t93 -32q72 0 148 31zM774 227 q385 0 385 518q0 506 -373 506q-186 0 -294.5 -127t-108.5 -381q0 -516 391 -516z" />
66
+<glyph unicode="R" horiz-adv-x="1406" d="M1403 0h-447l-184 514q-18 53 -44 72.5t-77 19.5h-96v-385q0 -25 5 -32t28 -9l143 -16v-164h-653v164l129 14q20 2 26.5 9.5t6.5 31.5v1047q0 23 -6.5 31t-26.5 10l-129 14v162h698q256 0 366.5 -115t110.5 -295q0 -274 -270 -393q70 -33 119 -164l112 -293 q18 -33 62 -39l127 -20v-164zM555 819h94q131 0 205 49.5t74 186.5q0 115 -64.5 160t-206.5 45h-102v-441z" />
67
+<glyph unicode="S" horiz-adv-x="1214" d="M1090 1028l-232 21l-24 165q-4 31 -25 39q-72 23 -150 23q-113 0 -171 -47t-58 -127q0 -39 18.5 -71t38 -50t70.5 -39.5t74.5 -30t93.5 -28.5q94 -29 149.5 -52.5t125 -72.5t103.5 -128t34 -188q0 -238 -161 -352.5t-415 -114.5q-129 0 -266 27t-203 57v400h230l40 -195 q4 -31 35 -37q90 -23 172 -22q258 0 258 190q0 47 -18 82t-58 59.5t-78 38t-100 31.5q-201 57 -274 101q-178 106 -178 342q0 227 151.5 343.5t397.5 116.5q225 0 420 -82v-399z" />
68
+<glyph unicode="T" horiz-adv-x="1421" d="M1128 0h-819v162l211 14q20 2 26.5 9.5t6.5 31.5v1043h-211q-29 0 -33 -23l-33 -178h-225v424h1319v-424h-223l-33 178q-4 23 -33 23h-211v-1043q0 -23 5.5 -30t27.5 -9l225 -16v-162z" />
69
+<glyph unicode="U" horiz-adv-x="1607" d="M1112 588v678q0 25 -6 32t-27 9l-129 14v162h606v-162l-137 -16q-23 -2 -28 -9.5t-5 -29.5v-736q0 -283 -151.5 -419t-431.5 -136q-303 0 -442.5 137.5t-139.5 426.5v727q0 25 -6 32t-27 9l-127 14v162h648v-162l-138 -16q-23 -2 -27.5 -9.5t-4.5 -29.5v-670 q0 -188 58 -275.5t218 -87.5q164 0 230.5 80t66.5 275z" />
70
+<glyph unicode="V" horiz-adv-x="1505" d="M981 0h-418l-411 1266q-8 25 -50 34l-92 23l21 160h620v-160l-166 -18l308 -1024h16l297 1024l-164 18l21 160h530v-160l-86 -23q-45 -10 -51 -38z" />
71
+<glyph unicode="W" horiz-adv-x="2136" d="M1688 0h-414l-201 750h-12l-189 -750h-401l-309 1264q-6 27 -45 36l-105 23l21 160h626v-160l-172 -20l209 -1002h17l235 907h312l233 -913h16l211 1008l-172 20l21 160h553v-160l-97 -23q-37 -6 -47 -36z" />
72
+<glyph unicode="X" horiz-adv-x="1583" d="M1548 0h-671v160l161 18l-278 375l-277 -375l158 -18v-160h-586v160l119 22q35 8 53 39l389 504l-409 541q-16 27 -49 34l-107 23l21 160h641v-160l-160 -18l266 -373l279 373l-158 18l21 160h540v-160l-100 -23q-29 -8 -51 -38l-383 -496l419 -545q31 -33 52 -39 l110 -22v-160z" />
73
+<glyph unicode="Y" horiz-adv-x="1384" d="M1120 0h-803v162l205 14q20 2 26.5 9.5t6.5 31.5v336l-408 713q-14 23 -49 34l-92 23l21 160h614v-160l-160 -18l248 -484h16l248 484l-157 18l20 160h522v-160l-86 -23q-39 -10 -51 -38l-371 -705v-340q0 -23 5.5 -30t27.5 -9l217 -16v-162z" />
74
+<glyph unicode="Z" horiz-adv-x="1376" d="M1284 0h-1180v199l766 1063h-454q-29 0 -33 -23l-39 -192l-221 -7v443h1124v-207l-755 -1057h499q29 0 33 23l39 219h221v-461z" />
75
+<glyph unicode="[" horiz-adv-x="630" d="M557 -293h-459v1776h459v-156l-127 -22q-33 -4 -33 -41v-1336q0 -39 33 -43l127 -22v-156z" />
76
+<glyph unicode="\" horiz-adv-x="921" d="M897 -188h-283l-573 1734h281z" />
77
+<glyph unicode="]" horiz-adv-x="630" d="M532 1483v-1776h-464v156l133 22q33 4 32 43v1295q0 76 -32 82l-133 22v156h464z" />
78
+<glyph unicode="^" horiz-adv-x="1247" d="M1186 612h-295l-273 492l-266 -492h-291l404 748h313z" />
79
+<glyph unicode="_" horiz-adv-x="1024" d="M1024 -371h-1024v219h1024v-219z" />
80
+<glyph unicode="`" horiz-adv-x="1024" d="M762 1251l-117 -102l-364 299l168 160z" />
81
+<glyph unicode="a" horiz-adv-x="1140" d="M1118 0h-377l-20 111l-10 2q-141 -137 -344 -138q-299 0 -299 304q0 152 94 227.5t289 87.5l235 16v113q0 84 -24.5 123t-112.5 39q-82 0 -116 -25.5t-34 -111.5l-288 24q0 315 440 315q240 0 338 -79.5t98 -290.5v-498q0 -25 5 -32t28 -9l98 -16v-162zM686 270v170 l-139 -10q-90 -6 -127 -32.5t-37 -88.5q0 -113 117 -112q86 -1 186 73z" />
82
+<glyph unicode="b" horiz-adv-x="1247" d="M420 0h-293q31 197 31 299v999q0 35 -27 43l-113 39l23 166h422v-567l8 -2q135 111 309 110q178 0 287 -126.5t109 -397.5q0 -303 -115 -445.5t-316 -142.5q-186 0 -301 129l-10 -2zM465 774v-479q88 -80 188 -80q199 0 199 332q0 131 -46 215t-142 84q-90 0 -199 -72z " />
83
+<glyph unicode="c" horiz-adv-x="1044" d="M901 266l80 -190q-166 -100 -389 -101q-266 0 -401.5 148.5t-135.5 394.5q0 279 152.5 424t408.5 145q113 0 212.5 -25.5t152.5 -60.5v-321l-219 10l-25 135q-4 27 -24 33q-43 14 -105 14q-100 0 -163.5 -77.5t-63.5 -245.5q0 -342 264 -342q119 0 256 59z" />
84
+<glyph unicode="d" horiz-adv-x="1251" d="M1221 0h-381l-21 115l-14 2q-145 -141 -336 -142q-397 0 -397 545q0 289 122.5 428t311.5 139q156 0 289 -98v311q0 33 -27 41l-113 39l23 166h412v-1331q0 -23 5 -30t27 -9l99 -14v-162zM782 305v483q-90 61 -176 62q-109 0 -160 -88t-51 -236q0 -309 187 -309 q98 0 200 88z" />
85
+<glyph unicode="e" horiz-adv-x="1075" d="M930 283l76 -203q-215 -104 -420 -105q-281 0 -406 153t-125 413q0 266 142.5 406t365.5 140q213 0 332 -119.5t119 -375.5q0 -55 -4 -137h-627q16 -242 242 -242q117 0 305 70zM385 649h326q-2 217 -154 217q-156 0 -172 -217z" />
86
+<glyph unicode="f" horiz-adv-x="894" d="M799 0h-744v164l115 12q20 2 26.5 10.5t6.5 32.5v623q0 20 -17 20h-137v205h154v113q0 203 110.5 297t327.5 94q80 0 139.5 -12.5t113.5 -42t84 -90t30 -150.5l-287 -35v13q0 65 -20 89q-22 27 -74 27q-72 0 -93.5 -36t-21.5 -117v-130q0 -20 16 -20h324v-205h-340v-637 q0 -25 7 -32t30 -9l250 -22v-162z" />
87
+<glyph unicode="g" horiz-adv-x="1165" d="M1139 893l-189 -14q76 -96 76 -207q0 -168 -120 -264.5t-316 -96.5q-96 0 -162 19l-68 -109l201 -12q299 -18 391 -51q150 -49 168 -199q4 -25 4 -55q0 -176 -147.5 -272.5t-415.5 -96.5q-512 0 -512 256q0 63 25.5 107.5t87.5 101.5q-90 39 -90 135q0 61 59 125 q47 49 127 123q-80 39 -128 119t-48 188q0 182 120 289.5t349 107.5q111 0 188 -20h400v-174zM756 700q0 90 -49.5 137.5t-137.5 47.5q-90 0 -143 -46t-53 -143q0 -170 190 -170q86 0 139.5 47t53.5 127zM643 -76l-299 21q-53 -66 -53 -109q0 -106 248 -106q281 0 280 118 q0 25 -11 39.5t-42 21.5t-52.5 10t-70.5 5z" />
88
+<glyph unicode="h" horiz-adv-x="1277" d="M1253 0h-444v668q0 174 -108.5 174t-213.5 -76v-549q0 -25 5.5 -32t27.5 -9l98 -14v-162h-565v162l92 14q20 2 26.5 10.5t6.5 30.5v1081q0 35 -26 43l-113 39l22 166h422v-579l11 -2q150 123 327 122q158 0 227.5 -82.5t69.5 -248.5v-539q0 -25 5 -32t28 -9l102 -14v-162 z" />
89
+<glyph unicode="i" horiz-adv-x="647" d="M492 1415q0 -88 -49.5 -136t-137.5 -48t-136 48t-48 136t48 134t136 46q90 0 138.5 -46t48.5 -134zM625 0h-584v162l104 14q20 2 26.5 10.5t6.5 30.5v602q0 35 -26 43l-111 39l22 166h424v-850q0 -25 5.5 -32t27.5 -9l105 -14v-162z" />
90
+<glyph unicode="j" horiz-adv-x="622" d="M174 -57v876q0 35 -27 43l-116 39l24 166h428v-1176q0 -348 -356 -348q-113 0 -206 34t-136 71l88 170q86 -53 178 -54q66 0 94.5 38.5t28.5 140.5zM489 1415q0 -88 -49 -136t-137 -48t-137 48t-49 136q0 86 49 133t137 47q90 0 138 -46t48 -134z" />
91
+<glyph unicode="k" horiz-adv-x="1269" d="M1255 0h-397l-260 522l-111 -121v-184q0 -25 5.5 -32t27.5 -9l123 -14v-162h-600v162l102 14q20 2 26.5 10.5t6.5 30.5v1081q0 35 -26 43l-113 39l22 166h426v-874l375 395h283v-162l-107 -20q-27 -4 -51 -31l-145 -154l262 -489q16 -31 61 -37l90 -14v-160z" />
92
+<glyph unicode="l" horiz-adv-x="647" d="M621 0h-578v162l102 14q20 2 26.5 10.5t6.5 30.5v1081q0 35 -26 43l-113 39l22 166h426v-1329q0 -25 5.5 -32t27.5 -9l101 -14v-162z" />
93
+<glyph unicode="m" horiz-adv-x="1820" d="M1794 0h-444v662q0 51 -5.5 83.5t-33 62.5t-76.5 30q-82 0 -166 -56q6 -49 6 -100v-465q0 -27 5 -34t28 -9l82 -12v-162h-424v672q0 35 -3 58.5t-12.5 51t-33 42t-60.5 14.5q-92 0 -170 -66v-555q0 -25 4.5 -31t28.5 -10l101 -14v-162h-568v162l92 14q20 2 26.5 10.5 t6.5 30.5v602q0 35 -26 43l-111 39l22 166h361l16 -106l11 -3q158 129 327 129q176 0 250 -122q156 123 330 122q162 0 231.5 -82.5t69.5 -263.5v-524q0 -25 5 -33t28 -10l102 -12v-162z" />
94
+<glyph unicode="n" horiz-adv-x="1277" d="M1253 0h-444v662q0 59 -5 91.5t-29.5 60.5t-74.5 28q-53 0 -114.5 -23.5t-98.5 -52.5v-549q0 -25 5.5 -32t27.5 -9l98 -14v-162h-565v164l92 12q20 2 26.5 10.5t6.5 30.5v602q0 35 -26 43l-111 39l25 166h358l16 -106l9 -5q176 131 360 131q164 0 236.5 -87t72.5 -261 v-522q0 -25 5 -32t28 -9l102 -14v-162z" />
95
+<glyph unicode="o" horiz-adv-x="1189" d="M582 -25q-268 0 -397.5 148.5t-129.5 402.5q0 262 139.5 411.5t413.5 149.5q270 0 398.5 -144t128.5 -394q0 -268 -139.5 -421t-413.5 -153zM596 190q215 0 215 349q0 176 -51 251.5t-156 75.5q-225 0 -225 -329q0 -347 217 -347z" />
96
+<glyph unicode="p" horiz-adv-x="1259" d="M719 -434h-668v164l82 12q23 4 30 12t7 31v1034q0 35 -27 43l-108 39l22 166h361l18 -104l10 -5q160 129 349 129q182 0 287.5 -125.5t105.5 -398.5q0 -80 -11.5 -155.5t-41 -156.5t-74.5 -140.5t-122 -97.5t-173 -38q-164 0 -293 105v-293q0 -25 5 -32t28 -9l213 -18 v-162zM477 770v-477q90 -78 193 -78q195 0 194 332q0 297 -174 297q-104 0 -213 -74z" />
97
+<glyph unicode="q" horiz-adv-x="1220" d="M1219 -434h-623v164l176 14q25 2 33 9t8 28v321l-10 4q-154 -131 -324 -131q-190 0 -298.5 130.5t-108.5 406.5q0 293 126 434t312 141q162 0 297 -116l31 96h268q-16 -154 -16 -332v-954q0 -23 5 -30t27 -9l97 -14v-162zM780 301v483q-96 66 -180 66q-104 0 -155.5 -89 t-51.5 -235q0 -309 193 -309q96 0 194 84z" />
98
+<glyph unicode="r" horiz-adv-x="968" d="M723 0h-670v166l92 12q20 2 26.5 10.5t6.5 30.5v600q0 35 -26 43l-111 39l22 166h361l25 -164h12q119 184 289 184q113 0 178 -18v-373l-246 9l-20 108q-4 23 -27 23q-66 0 -148 -72v-543q0 -25 5.5 -32t27.5 -9l203 -16v-164z" />
99
+<glyph unicode="s" horiz-adv-x="997" d="M911 731l-219 14l-20 107q-2 25 -21 29q-53 16 -131 16q-160 0 -160 -104q0 -37 32 -61.5t70 -36t107 -27.5q18 -4 29 -6q74 -16 124 -35t106.5 -54.5t85 -97t28.5 -147.5q0 -178 -127 -265.5t-336 -87.5q-127 0 -250 26t-155 48v297l219 -16l20 -117q2 -27 25 -31 q61 -20 158 -20q170 0 170 106q0 55 -47.5 82t-139.5 43l-77.5 14.5t-75 18.5t-77 27.5t-64.5 40t-56 57.5t-32.5 77t-14.5 101q0 178 130 268t323 90q225 0 376 -59v-297z" />
100
+<glyph unicode="t" horiz-adv-x="892" d="M791 238l55 -181q-168 -82 -334 -82q-180 0 -258 78t-78 252v537q0 20 -16 20h-144v182q135 14 196.5 90t78.5 244h194v-291q0 -20 17 -20h289v-205h-306v-489q0 -94 29 -131t111 -37q78 0 166 33z" />
101
+<glyph unicode="u" horiz-adv-x="1275" d="M1241 0h-381l-16 111l-10 2q-53 -41 -94.5 -65.5t-115 -48.5t-155.5 -24q-158 0 -227.5 89.5t-69.5 271.5v500q0 25 -5 31.5t-28 11.5l-98 20l20 168h420v-678q0 -96 22.5 -134t86.5 -38q109 0 211 94v527q0 25 -5 30.5t-28 10.5l-88 20l22 168h408v-850q0 -23 5 -30 t24 -9l102 -14v-164z" />
102
+<glyph unicode="v" horiz-adv-x="1275" d="M819 0h-358l-326 848q-10 27 -43 35l-86 18l33 166h555v-166l-131 -16l209 -584h14l217 584l-133 16l27 166h473v-166l-74 -12q-41 -10 -51 -35z" />
103
+<glyph unicode="w" horiz-adv-x="1800" d="M1419 0h-323l-160 686h-12l-162 -686h-369l-258 848q-8 27 -43 35l-86 18l33 166h518v-170l-115 -12l164 -576h15l182 731h309l176 -731h12l154 576l-117 12l27 170h430v-166l-74 -14q-39 -6 -49 -41z" />
104
+<glyph unicode="x" horiz-adv-x="1234" d="M1214 0h-581v160l96 18l-156 205l-170 -203l115 -18v-162h-491v160l92 18q27 4 53 35l270 299l-278 332q-25 27 -49 35l-82 22l20 166h545v-166l-100 -16l151 -191l168 191l-112 16l20 166h453v-166l-95 -20q-12 -4 -51 -39l-250 -277l287 -350q33 -33 53 -37l92 -16 v-162z" />
105
+<glyph unicode="y" horiz-adv-x="1267" d="M907 -434h-682v166l160 18q33 2 51 45l88 195l-391 856q-8 27 -43 35l-84 20l33 166h543v-166l-129 -16l227 -541h14l217 541l-133 16l27 166h457v-166l-66 -12q-39 -6 -51 -35l-451 -1102l213 -22v-164z" />
106
+<glyph unicode="z" horiz-adv-x="1058" d="M1001 0h-929v172l549 702h-287q-18 0 -23 -26l-24 -115l-217 -12v346h899v-176l-539 -701h301q18 0 23 27l24 141l223 11v-369z" />
107
+<glyph unicode="{" horiz-adv-x="677" d="M610 -141l-20 -164q-246 4 -343 64.5t-97 220.5q0 53 14 177t14 201q0 84 -33.5 116t-109.5 36v162q76 4 109.5 35.5t33.5 115.5q0 78 -14 203t-14 178q0 160 97 220.5t343 64.5l20 -164q-86 -20 -115.5 -47t-29.5 -100q0 -51 16.5 -170t16.5 -185q0 -178 -129 -233 q129 -55 129 -232q0 -63 -16.5 -182t-16.5 -170q0 -74 29.5 -100.5t115.5 -46.5z" />
108
+<glyph unicode="|" horiz-adv-x="573" d="M426 -293h-281v1839h281v-1839z" />
109
+<glyph unicode="}" horiz-adv-x="677" d="M88 -305l-20 164q86 20 115.5 46.5t29.5 100.5q0 51 -16.5 170t-16.5 182q0 176 129 232q-129 55 -129 233q0 66 16.5 184.5t16.5 170.5q0 74 -29.5 100.5t-115.5 46.5l20 164q246 -4 343 -64.5t97 -220.5q0 -53 -14 -178t-14 -203q0 -84 33.5 -115.5t109.5 -35.5v-162 q-76 -4 -109.5 -36t-33.5 -116q0 -78 14 -201.5t14 -176.5q0 -160 -97 -220.5t-343 -64.5z" />
110
+<glyph unicode="~" horiz-adv-x="1073" d="M868 942l160 -59q-25 -147 -80 -218t-151 -71q-78 0 -237 47t-216 47q-51 0 -83 -20.5t-62 -77.5l-152 74q33 121 101.5 196.5t162.5 75.5q82 0 231.5 -47t213.5 -47q47 0 69.5 21.5t42.5 78.5z" />
111
+<glyph unicode="&#xad;" horiz-adv-x="636" d="M596 465h-555v260h555v-260z" />
112
+<glyph unicode="&#x2000;" horiz-adv-x="802" />
113
+<glyph unicode="&#x2001;" horiz-adv-x="1607" />
114
+<glyph unicode="&#x2002;" horiz-adv-x="802" />
115
+<glyph unicode="&#x2003;" horiz-adv-x="1607" />
116
+<glyph unicode="&#x2004;" horiz-adv-x="534" />
117
+<glyph unicode="&#x2005;" horiz-adv-x="401" />
118
+<glyph unicode="&#x2006;" horiz-adv-x="266" />
119
+<glyph unicode="&#x2007;" horiz-adv-x="266" />
120
+<glyph unicode="&#x2008;" horiz-adv-x="200" />
121
+<glyph unicode="&#x2009;" horiz-adv-x="321" />
122
+<glyph unicode="&#x200a;" horiz-adv-x="88" />
123
+<glyph unicode="&#x2010;" horiz-adv-x="636" d="M596 465h-555v260h555v-260z" />
124
+<glyph unicode="&#x2011;" horiz-adv-x="636" d="M596 465h-555v260h555v-260z" />
125
+<glyph unicode="&#x2012;" horiz-adv-x="636" d="M596 465h-555v260h555v-260z" />
126
+<glyph unicode="&#x2013;" horiz-adv-x="1024" d="M1022 465h-1022v219h1022v-219z" />
127
+<glyph unicode="&#x2014;" horiz-adv-x="2048" d="M2048 465h-2048v219h2048v-219z" />
128
+<glyph unicode="&#x2018;" horiz-adv-x="460" d="M389 1296l-41 -196q-86 2 -137 10t-90 43t-39 96q0 53 39 131l98 207l129 -39l-47 -202q-2 -16 10 -23z" />
129
+<glyph unicode="&#x2019;" horiz-adv-x="460" d="M244 1100l-131 39l47 202q6 18 -10 25l-78 25l41 196q63 0 104 -5t82 -19.5t60.5 -46t19.5 -78.5q0 -57 -37 -131z" />
130
+<glyph unicode="&#x201c;" horiz-adv-x="829" d="M389 1296l-41 -196q-86 2 -137 10t-90 43t-39 96q0 53 39 131l98 207l129 -39l-47 -202q-2 -16 10 -23zM758 1296l-41 -196q-86 2 -137.5 10t-90 43t-38.5 96q0 53 38 131l99 207l129 -39l-47 -202q-2 -16 10 -23z" />
131
+<glyph unicode="&#x201d;" horiz-adv-x="829" d="M244 1100l-131 39l47 202q6 18 -10 25l-78 25l41 196q63 0 104 -5t82 -19.5t60.5 -46t19.5 -78.5q0 -57 -37 -131zM612 1100l-131 39l47 202q6 18 -10 25l-78 25l41 196q63 0 104.5 -5t82.5 -19.5t60.5 -46t19.5 -78.5q0 -57 -37 -131z" />
132
+<glyph unicode="&#x2026;" horiz-adv-x="1443" d="M432 135q0 -160 -174 -160q-176 0 -176 160t176 160q174 0 174 -160zM899 135q0 -160 -174 -160q-176 0 -176 160t176 160q174 0 174 -160zM1362 135q0 -160 -174 -160q-176 0 -176 160t176 160q174 0 174 -160z" />
133
+<glyph unicode="&#x202f;" horiz-adv-x="321" />
134
+<glyph unicode="&#x205f;" horiz-adv-x="401" />
135
+<glyph unicode="&#xe000;" horiz-adv-x="1065" d="M0 1065h1065v-1065h-1065v1065z" />
136
+<glyph horiz-adv-x="1024" />
137
+</font>
138
+</defs></svg> 
0 139
\ No newline at end of file
1 140
new file mode 100644
2 141
Binary files /dev/null and b/public/fonts/adellebasic_bold-webfont.ttf differ
3 142
new file mode 100644
4 143
Binary files /dev/null and b/public/fonts/adellebasic_bold-webfont.woff differ
5 144
new file mode 100644
6 145
Binary files /dev/null and b/public/images/code_bg.png differ
7 146
new file mode 100644
8 147
Binary files /dev/null and b/public/images/rss.png differ
9 148
new file mode 100644
10 149
Binary files /dev/null and b/public/images/search_bg.png differ
11 150
new file mode 100644
... ...
@@ -0,0 +1,177 @@
0
+<!DOCTYPE html>
1
+<html>
2
+<head>
3
+  <title>Octopress - My Octopress Blog</title>
4
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
5
+  
6
+  
7
+  <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
8
+  <script src="/javascripts/mootools-yui-compressed.js" type="text/javascript"></script>
9
+  <script src="/javascripts/mootools-more-1.3.1.1.js" type="text/javascript"></script>
10
+  <script src="/javascripts/octopress.js" type="text/javascript"></script>
11
+  <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
12
+  <meta name="viewport" content="initial-scale=1.0 width=device-width">
13
+  
14
+    <script>
15
+      var twitter_user = "imathis";
16
+      var show_replies = false;
17
+      var tweet_count = 3;
18
+    </script>
19
+    <script src="/javascripts/twitter.js" type="text/javascript"></script>
20
+  
21
+  
22
+  <link href="/atom.xml" rel="alternate" title="My Octopress Blog" type="application/atom+xml"/>
23
+</head>
24
+
25
+<body id="">
26
+  <header><div><h1><a href="/">My Octopress Blog</a></h1>
27
+
28
+</div></header>
29
+  <nav id="nav"><div><ul>
30
+  <li><a href="/">Blog</a></li>
31
+  <li><a href="/about/">About</a></li>
32
+  <li class="subscribe"><a href="/atom.xml">Subscribe</a></li>
33
+</ul>
34
+</div></nav>
35
+  <div id="page">
36
+    <div>
37
+      <div id="main"><article>
38
+
39
+
40
+  <article>
41
+    <header>
42
+  <p>
43
+    <time>April 7<span>th</span>, 2011</time>
44
+    
45
+      <span class="byline"><em>by</em> <span class="author">Your Name</span></span>
46
+    
47
+  </p>
48
+  <h1><a href="/2011/04/07/test-of-typography/">Test of Typography</a></h1>
49
+</header>
50
+
51
+<div class="entry"><p>In the past I&#8217;ve always designed my own business cards, printed them on expensive card stock, and hand-cut them with an X-Acto knife. My cards were way nicer than those my clients had gotten <em>professionally</em> printed with bubbly ink, no-bleed designs, and cheap paper. Though I put tremendous care into my cards, I never was happy with the design.</p>
52
+
53
+<h2>Why Have Business Cards?</h2>
54
+
55
+<p>I&#8217;m rarely asked for my business card except when I attend conferences, of which I attend one or two each year. As a freelance contractor, I leave work by walking twenty-five feet from my office to the couch. Many of the
56
+people I work for I&#8217;ve never met in-person.</p>
57
+
58
+<p>When someone gives me their business card, I read it, pocket it, and eventually throw it out &mdash; sometimes before I remember to copy the information to my address book (sorry, just being honest). The reality is, with the ubiquity of the internet and with frictionless social networks like Twitter, I can connect with people immediately. So why have business cards?</p>
59
+
60
+<p><a href='/2011/04/07/test-of-typography/'>Continue reading &raquo;</a></p></div>
61
+
62
+
63
+
64
+
65
+  </article>
66
+
67
+
68
+
69
+  <article>
70
+    <header>
71
+  <p>
72
+    <time>March 14<span>th</span>, 2011</time>
73
+    
74
+      <span class="byline"><em>by</em> <span class="author">Your Name</span></span>
75
+    
76
+  </p>
77
+  <h1><a href="/2011/03/14/test-post/">Test Post</a></h1>
78
+</header>
79
+
80
+<div class="entry"><p>This is a test!</p>
81
+</div>
82
+
83
+
84
+
85
+
86
+  </article>
87
+
88
+
89
+
90
+  <article>
91
+    <header>
92
+  <p>
93
+    <time>November 13<span>th</span>, 2009</time>
94
+    
95
+      <span class="byline"><em>by</em> <span class="author">Your Name</span></span>
96
+    
97
+  </p>
98
+  <h1><a href="/2009/11/13/hello-world/">Hello World! I'm Octopress!</a></h1>
99
+</header>
100
+
101
+<div class="entry"><p><strong>Octopress is a blogging framework designed for hackers</strong>, based on <a href="http://github.com/mojombo/jekyll">Jekyll</a> the blog aware static site generator powering <a href="http://pages.github.com/">Github pages</a>.
102
+If you don&#8217;t know what Jekyll is, <a href="http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/">Jack Moffitt</a> wrote a good summary:</p>
103
+
104
+<blockquote><p>Jekyll is a static blog generator; it transforms a directory of input files into another directory of files suitable for a blog. The management of the blog is handled by standard, familiar tools like creating and renaming files, the text editor of your choice, and version control.</p></blockquote>
105
+
106
+<p><cite><strong>Jack Moffitt</strong> <a href="http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/">Blogging with Git Emacs and Jekyll</a></cite></p>
107
+
108
+<p>There&#8217;s no database to set up, and you get to use tools like Emacs, Vim, or TextMate to write your posts, not some lame in-browser text editor. Just write, generate, deploy, using the same tools and patterns you already use for your daily work.</p>
109
+
110
+<p><a href="http://wiki.github.com/imathis/octopress/">Read the wiki to learn more</a></p>
111
+</div>
112
+
113
+
114
+<p class="updated"><em>updated</em> <time>March 10<span>th</span>, 2010</time></p>
115
+
116
+  </article>
117
+
118
+
119
+</article></div>
120
+      <aside><h4>About Me</h4>
121
+<p> Yo everybody! </p>
122
+
123
+<section>
124
+  <h4>Recent Posts</h4>
125
+  <ul id="recent_posts">
126
+    
127
+      <li class="post">
128
+        <a href="/2011/04/07/test-of-typography/">Test of Typography</a>
129
+        <time>April 07, 2011</time>
130
+      </li>
131
+    
132
+      <li class="post">
133
+        <a href="/2011/03/14/test-post/">Test Post</a>
134
+        <time>March 14, 2011</time>
135
+      </li>
136
+    
137
+      <li class="post">
138
+        <a href="/2009/11/13/hello-world/">Hello World! I'm Octopress!</a>
139
+        <time>November 13, 2009</time>
140
+      </li>
141
+    
142
+  </ul>
143
+  </section>
144
+
145
+
146
+  <section><h4>On Twitter</h4>
147
+<ul id="tweets">
148
+  Status updating...
149
+</ul>
150
+<p>Follow <a href="http://twitter.com/#{page.twitter_user}">@imathis</a></p>
151
+</section>
152
+
153
+
154
+
155
+  <section><h4>My Pinboard</h4>
156
+<ul id="pinboard_linkroll">Fetching linkroll...</ul>
157
+<p><a href="http://pinboard.in/u:imathis">My Pinboard Bookmarks &raquo;</a></p>
158
+</section>
159
+
160
+</aside>
161
+    </div>
162
+  </div>
163
+  <footer><div><p>
164
+  Copyright &copy; 2011 - Your Name -
165
+  <span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
166
+</p>
167
+
168
+  <script language="javascript">
169
+    var pinboard_user = "imathis";
170
+    var pinboard_count = "3";
171
+  </script>
172
+  <script language="javascript" src="/javascripts/pinboard.js"></script>
173
+
174
+</div></footer>
175
+</body>
176
+</html>
0 177
new file mode 100644
... ...
@@ -0,0 +1,100 @@
0
+//MooTools More, <http://mootools.net/more>. Copyright (c) 2006-2009 Aaron Newton <http://clientcide.com/>, Valerio Proietti <http://mad4milk.net> & the MooTools team <http://mootools.net/developers>, MIT Style License.
1
+
2
+MooTools.More={version:"1.2.4.2",build:"bd5a93c0913cce25917c48cbdacde568e15e02ef"};(function(){var a={language:"en-US",languages:{"en-US":{}},cascades:["en-US"]};
3
+var b;MooTools.lang=new Events();$extend(MooTools.lang,{setLanguage:function(c){if(!a.languages[c]){return this;}a.language=c;this.load();this.fireEvent("langChange",c);
4
+return this;},load:function(){var c=this.cascade(this.getCurrentLanguage());b={};$each(c,function(e,d){b[d]=this.lambda(e);},this);},getCurrentLanguage:function(){return a.language;
5
+},addLanguage:function(c){a.languages[c]=a.languages[c]||{};return this;},cascade:function(e){var c=(a.languages[e]||{}).cascades||[];c.combine(a.cascades);
6
+c.erase(e).push(e);var d=c.map(function(f){return a.languages[f];},this);return $merge.apply(this,d);},lambda:function(c){(c||{}).get=function(e,d){return $lambda(c[e]).apply(this,$splat(d));
7
+};return c;},get:function(e,d,c){if(b&&b[e]){return(d?b[e].get(d,c):b[e]);}},set:function(d,e,c){this.addLanguage(d);langData=a.languages[d];if(!langData[e]){langData[e]={};
8
+}$extend(langData[e],c);if(d==this.getCurrentLanguage()){this.load();this.fireEvent("langChange",d);}return this;},list:function(){return Hash.getKeys(a.languages);
9
+}});})();(function(){var i=this.Date;if(!i.now){i.now=$time;}i.Methods={ms:"Milliseconds",year:"FullYear",min:"Minutes",mo:"Month",sec:"Seconds",hr:"Hours"};
10
+["Date","Day","FullYear","Hours","Milliseconds","Minutes","Month","Seconds","Time","TimezoneOffset","Week","Timezone","GMTOffset","DayOfYear","LastMonth","LastDayOfMonth","UTCDate","UTCDay","UTCFullYear","AMPM","Ordinal","UTCHours","UTCMilliseconds","UTCMinutes","UTCMonth","UTCSeconds"].each(function(p){i.Methods[p.toLowerCase()]=p;
11
+});var d=function(q,p){return new Array(p-String(q).length+1).join("0")+q;};i.implement({set:function(t,r){switch($type(t)){case"object":for(var s in t){this.set(s,t[s]);
12
+}break;case"string":t=t.toLowerCase();var q=i.Methods;if(q[t]){this["set"+q[t]](r);}}return this;},get:function(q){q=q.toLowerCase();var p=i.Methods;if(p[q]){return this["get"+p[q]]();
13
+}return null;},clone:function(){return new i(this.get("time"));},increment:function(p,r){p=p||"day";r=$pick(r,1);switch(p){case"year":return this.increment("month",r*12);
14
+case"month":var q=this.get("date");this.set("date",1).set("mo",this.get("mo")+r);return this.set("date",q.min(this.get("lastdayofmonth")));case"week":return this.increment("day",r*7);
15
+case"day":return this.set("date",this.get("date")+r);}if(!i.units[p]){throw new Error(p+" is not a supported interval");}return this.set("time",this.get("time")+r*i.units[p]());
16
+},decrement:function(p,q){return this.increment(p,-1*$pick(q,1));},isLeapYear:function(){return i.isLeapYear(this.get("year"));},clearTime:function(){return this.set({hr:0,min:0,sec:0,ms:0});
17
+},diff:function(q,p){if($type(q)=="string"){q=i.parse(q);}return((q-this)/i.units[p||"day"](3,3)).toInt();},getLastDayOfMonth:function(){return i.daysInMonth(this.get("mo"),this.get("year"));
18
+},getDayOfYear:function(){return(i.UTC(this.get("year"),this.get("mo"),this.get("date")+1)-i.UTC(this.get("year"),0,1))/i.units.day();},getWeek:function(){return(this.get("dayofyear")/7).ceil();
19
+},getOrdinal:function(p){return i.getMsg("ordinal",p||this.get("date"));},getTimezone:function(){return this.toString().replace(/^.*? ([A-Z]{3}).[0-9]{4}.*$/,"$1").replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/,"$1$2$3");
20
+},getGMTOffset:function(){var p=this.get("timezoneOffset");return((p>0)?"-":"+")+d((p.abs()/60).floor(),2)+d(p%60,2);},setAMPM:function(p){p=p.toUpperCase();
21
+var q=this.get("hr");if(q>11&&p=="AM"){return this.decrement("hour",12);}else{if(q<12&&p=="PM"){return this.increment("hour",12);}}return this;},getAMPM:function(){return(this.get("hr")<12)?"AM":"PM";
22
+},parse:function(p){this.set("time",i.parse(p));return this;},isValid:function(p){return !!(p||this).valueOf();},format:function(p){if(!this.isValid()){return"invalid date";
23
+}p=p||"%x %X";p=k[p.toLowerCase()]||p;var q=this;return p.replace(/%([a-z%])/gi,function(s,r){switch(r){case"a":return i.getMsg("days")[q.get("day")].substr(0,3);
24
+case"A":return i.getMsg("days")[q.get("day")];case"b":return i.getMsg("months")[q.get("month")].substr(0,3);case"B":return i.getMsg("months")[q.get("month")];
25
+case"c":return q.toString();case"d":return d(q.get("date"),2);case"H":return d(q.get("hr"),2);case"I":return((q.get("hr")%12)||12);case"j":return d(q.get("dayofyear"),3);
26
+case"m":return d((q.get("mo")+1),2);case"M":return d(q.get("min"),2);case"o":return q.get("ordinal");case"p":return i.getMsg(q.get("ampm"));case"S":return d(q.get("seconds"),2);
27
+case"U":return d(q.get("week"),2);case"w":return q.get("day");case"x":return q.format(i.getMsg("shortDate"));case"X":return q.format(i.getMsg("shortTime"));
28
+case"y":return q.get("year").toString().substr(2);case"Y":return q.get("year");case"T":return q.get("GMTOffset");case"Z":return q.get("Timezone");}return r;
29
+});},toISOString:function(){return this.format("iso8601");}});i.alias("toISOString","toJSON");i.alias("diff","compare");i.alias("format","strftime");var k={db:"%Y-%m-%d %H:%M:%S",compact:"%Y%m%dT%H%M%S",iso8601:"%Y-%m-%dT%H:%M:%S%T",rfc822:"%a, %d %b %Y %H:%M:%S %Z","short":"%d %b %H:%M","long":"%B %d, %Y %H:%M"};
30
+var g=[];var e=i.parse;var n=function(s,u,r){var q=-1;var t=i.getMsg(s+"s");switch($type(u)){case"object":q=t[u.get(s)];break;case"number":q=t[month-1];
31
+if(!q){throw new Error("Invalid "+s+" index: "+index);}break;case"string":var p=t.filter(function(v){return this.test(v);},new RegExp("^"+u,"i"));if(!p.length){throw new Error("Invalid "+s+" string");
32
+}if(p.length>1){throw new Error("Ambiguous "+s);}q=p[0];}return(r)?t.indexOf(q):q;};i.extend({getMsg:function(q,p){return MooTools.lang.get("Date",q,p);
33
+},units:{ms:$lambda(1),second:$lambda(1000),minute:$lambda(60000),hour:$lambda(3600000),day:$lambda(86400000),week:$lambda(608400000),month:function(q,p){var r=new i;
34
+return i.daysInMonth($pick(q,r.get("mo")),$pick(p,r.get("year")))*86400000;},year:function(p){p=p||new i().get("year");return i.isLeapYear(p)?31622400000:31536000000;
35
+}},daysInMonth:function(q,p){return[31,i.isLeapYear(p)?29:28,31,30,31,30,31,31,30,31,30,31][q];},isLeapYear:function(p){return((p%4===0)&&(p%100!==0))||(p%400===0);
36
+},parse:function(r){var q=$type(r);if(q=="number"){return new i(r);}if(q!="string"){return r;}r=r.clean();if(!r.length){return null;}var p;g.some(function(t){var s=t.re.exec(r);
37
+return(s)?(p=t.handler(s)):false;});return p||new i(e(r));},parseDay:function(p,q){return n("day",p,q);},parseMonth:function(q,p){return n("month",q,p);
38
+},parseUTC:function(q){var p=new i(q);var r=i.UTC(p.get("year"),p.get("mo"),p.get("date"),p.get("hr"),p.get("min"),p.get("sec"));return new i(r);},orderIndex:function(p){return i.getMsg("dateOrder").indexOf(p)+1;
39
+},defineFormat:function(p,q){k[p]=q;},defineFormats:function(p){for(var q in p){i.defineFormat(q,p[q]);}},parsePatterns:g,defineParser:function(p){g.push((p.re&&p.handler)?p:l(p));
40
+},defineParsers:function(){Array.flatten(arguments).each(i.defineParser);},define2DigitYearStart:function(p){h=p%100;m=p-h;}});var m=1900;var h=70;var j=function(p){return new RegExp("(?:"+i.getMsg(p).map(function(q){return q.substr(0,3);
41
+}).join("|")+")[a-z]*");};var a=function(p){switch(p){case"x":return((i.orderIndex("month")==1)?"%m[.-/]%d":"%d[.-/]%m")+"([.-/]%y)?";case"X":return"%H([.:]%M)?([.:]%S([.:]%s)?)? ?%p? ?%T?";
42
+}return null;};var o={d:/[0-2]?[0-9]|3[01]/,H:/[01]?[0-9]|2[0-3]/,I:/0?[1-9]|1[0-2]/,M:/[0-5]?\d/,s:/\d+/,o:/[a-z]*/,p:/[ap]\.?m\.?/,y:/\d{2}|\d{4}/,Y:/\d{4}/,T:/Z|[+-]\d{2}(?::?\d{2})?/};
43
+o.m=o.I;o.S=o.M;var c;var b=function(p){c=p;o.a=o.A=j("days");o.b=o.B=j("months");g.each(function(r,q){if(r.format){g[q]=l(r.format);}});};var l=function(r){if(!c){return{format:r};
44
+}var p=[];var q=(r.source||r).replace(/%([a-z])/gi,function(t,s){return a(s)||t;}).replace(/\((?!\?)/g,"(?:").replace(/ (?!\?|\*)/g,",? ").replace(/%([a-z%])/gi,function(t,s){var u=o[s];
45
+if(!u){return s;}p.push(s);return"("+u.source+")";}).replace(/\[a-z\]/gi,"[a-z\\u00c0-\\uffff]");return{format:r,re:new RegExp("^"+q+"$","i"),handler:function(u){u=u.slice(1).associate(p);
46
+var s=new i().clearTime();if("d" in u){f.call(s,"d",1);}if("m" in u){f.call(s,"m",1);}for(var t in u){f.call(s,t,u[t]);}return s;}};};var f=function(p,q){if(!q){return this;
47
+}switch(p){case"a":case"A":return this.set("day",i.parseDay(q,true));case"b":case"B":return this.set("mo",i.parseMonth(q,true));case"d":return this.set("date",q);
48
+case"H":case"I":return this.set("hr",q);case"m":return this.set("mo",q-1);case"M":return this.set("min",q);case"p":return this.set("ampm",q.replace(/\./g,""));
49
+case"S":return this.set("sec",q);case"s":return this.set("ms",("0."+q)*1000);case"w":return this.set("day",q);case"Y":return this.set("year",q);case"y":q=+q;
50
+if(q<100){q+=m+(q<h?100:0);}return this.set("year",q);case"T":if(q=="Z"){q="+00";}var r=q.match(/([+-])(\d{2}):?(\d{2})?/);r=(r[1]+"1")*(r[2]*60+(+r[3]||0))+this.getTimezoneOffset();
51
+return this.set("time",this-r*60000);}return this;};i.defineParsers("%Y([-./]%m([-./]%d((T| )%X)?)?)?","%Y%m%d(T%H(%M%S?)?)?","%x( %X)?","%d%o( %b( %Y)?)?( %X)?","%b( %d%o)?( %Y)?( %X)?","%Y %b( %d%o( %X)?)?","%o %b %d %X %T %Y");
52
+MooTools.lang.addEvent("langChange",function(p){if(MooTools.lang.get("Date")){b(p);}}).fireEvent("langChange",MooTools.lang.getCurrentLanguage());})();
53
+Date.implement({timeDiffInWords:function(a){return Date.distanceOfTimeInWords(this,a||new Date);},timeDiff:function(g,b){if(g==null){g=new Date;}var f=((g-this)/1000).toInt();
54
+if(!f){return"0s";}var a={s:60,m:60,h:24,d:365,y:0};var e,d=[];for(var c in a){if(!f){break;}if((e=a[c])){d.unshift((f%e)+c);f=(f/e).toInt();}else{d.unshift(f+c);
55
+}}return d.join(b||":");}});Date.alias("timeDiffInWords","timeAgoInWords");Date.extend({distanceOfTimeInWords:function(b,a){return Date.getTimePhrase(((a-b)/1000).toInt());
56
+},getTimePhrase:function(f){var d=(f<0)?"Until":"Ago";if(f<0){f*=-1;}var b={minute:60,hour:60,day:24,week:7,month:52/12,year:12,eon:Infinity};var e="lessThanMinute";
57
+for(var c in b){var a=b[c];if(f<1.5*a){if(f>0.75*a){e=c;}break;}f/=a;e=c+"s";}return Date.getMsg(e+d).substitute({delta:f.round()});}});Date.defineParsers({re:/^(?:tod|tom|yes)/i,handler:function(a){var b=new Date().clearTime();
58
+switch(a[0]){case"tom":return b.increment();case"yes":return b.decrement();default:return b;}}},{re:/^(next|last) ([a-z]+)$/i,handler:function(e){var f=new Date().clearTime();
59
+var b=f.getDay();var c=Date.parseDay(e[2],true);var a=c-b;if(c<=b){a+=7;}if(e[1]=="last"){a-=7;}return f.set("date",f.getDate()+a);}});Element.implement({measure:function(e){var g=function(h){return !!(!h||h.offsetHeight||h.offsetWidth);
60
+};if(g(this)){return e.apply(this);}var d=this.getParent(),f=[],b=[];while(!g(d)&&d!=document.body){b.push(d.expose());d=d.getParent();}var c=this.expose();
61
+var a=e.apply(this);c();b.each(function(h){h();});return a;},expose:function(){if(this.getStyle("display")!="none"){return $empty;}var a=this.style.cssText;
62
+this.setStyles({display:"block",position:"absolute",visibility:"hidden"});return function(){this.style.cssText=a;}.bind(this);},getDimensions:function(a){a=$merge({computeSize:false},a);
63
+var f={};var d=function(g,e){return(e.computeSize)?g.getComputedSize(e):g.getSize();};var b=this.getParent("body");if(b&&this.getStyle("display")=="none"){f=this.measure(function(){return d(this,a);
64
+});}else{if(b){try{f=d(this,a);}catch(c){}}else{f={x:0,y:0};}}return $chk(f.x)?$extend(f,{width:f.x,height:f.y}):$extend(f,{x:f.width,y:f.height});},getComputedSize:function(a){a=$merge({styles:["padding","border"],plains:{height:["top","bottom"],width:["left","right"]},mode:"both"},a);
65
+var c={width:0,height:0};switch(a.mode){case"vertical":delete c.width;delete a.plains.width;break;case"horizontal":delete c.height;delete a.plains.height;
66
+break;}var b=[];$each(a.plains,function(g,f){g.each(function(h){a.styles.each(function(i){b.push((i=="border")?i+"-"+h+"-width":i+"-"+h);});});});var e={};
67
+b.each(function(f){e[f]=this.getComputedStyle(f);},this);var d=[];$each(a.plains,function(g,f){var h=f.capitalize();c["total"+h]=c["computed"+h]=0;g.each(function(i){c["computed"+i.capitalize()]=0;
68
+b.each(function(k,j){if(k.test(i)){e[k]=e[k].toInt()||0;c["total"+h]=c["total"+h]+e[k];c["computed"+i.capitalize()]=c["computed"+i.capitalize()]+e[k];}if(k.test(i)&&f!=k&&(k.test("border")||k.test("padding"))&&!d.contains(k)){d.push(k);
69
+c["computed"+h]=c["computed"+h]-e[k];}});});});["Width","Height"].each(function(g){var f=g.toLowerCase();if(!$chk(c[f])){return;}c[f]=c[f]+this["offset"+g]+c["computed"+g];
70
+c["total"+g]=c[f]+c["total"+g];delete c["computed"+g];},this);return $extend(e,c);}});Element.implement({isDisplayed:function(){return this.getStyle("display")!="none";
71
+},isVisible:function(){var a=this.offsetWidth,b=this.offsetHeight;return(a==0&&b==0)?false:(a>0&&b>0)?true:this.isDisplayed();},toggle:function(){return this[this.isDisplayed()?"hide":"show"]();
72
+},hide:function(){var b;try{if((b=this.getStyle("display"))=="none"){b=null;}}catch(a){}return this.store("originalDisplay",b||"block").setStyle("display","none");
73
+},show:function(a){return this.setStyle("display",a||this.retrieve("originalDisplay")||"block");},swapClass:function(a,b){return this.removeClass(a).addClass(b);
74
+}});Fx.Reveal=new Class({Extends:Fx.Morph,options:{link:"cancel",styles:["padding","border","margin"],transitionOpacity:!Browser.Engine.trident4,mode:"vertical",display:"block",hideInputs:Browser.Engine.trident?"select, input, textarea, object, embed":false},dissolve:function(){try{if(!this.hiding&&!this.showing){if(this.element.getStyle("display")!="none"){this.hiding=true;
75
+this.showing=false;this.hidden=true;this.cssText=this.element.style.cssText;var d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode});
76
+this.element.setStyle("display","block");if(this.options.transitionOpacity){d.opacity=1;}var b={};$each(d,function(f,e){b[e]=[f,0];},this);this.element.setStyle("overflow","hidden");
77
+var a=this.options.hideInputs?this.element.getElements(this.options.hideInputs):null;this.$chain.unshift(function(){if(this.hidden){this.hiding=false;$each(d,function(f,e){d[e]=f;
78
+},this);this.element.style.cssText=this.cssText;this.element.setStyle("display","none");if(a){a.setStyle("visibility","visible");}}this.fireEvent("hide",this.element);
79
+this.callChain();}.bind(this));if(a){a.setStyle("visibility","hidden");}this.start(b);}else{this.callChain.delay(10,this);this.fireEvent("complete",this.element);
80
+this.fireEvent("hide",this.element);}}else{if(this.options.link=="chain"){this.chain(this.dissolve.bind(this));}else{if(this.options.link=="cancel"&&!this.hiding){this.cancel();
81
+this.dissolve();}}}}catch(c){this.hiding=false;this.element.setStyle("display","none");this.callChain.delay(10,this);this.fireEvent("complete",this.element);
82
+this.fireEvent("hide",this.element);}return this;},reveal:function(){try{if(!this.showing&&!this.hiding){if(this.element.getStyle("display")=="none"||this.element.getStyle("visiblity")=="hidden"||this.element.getStyle("opacity")==0){this.showing=true;
83
+this.hiding=this.hidden=false;var d;this.cssText=this.element.style.cssText;this.element.measure(function(){d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode});
84
+}.bind(this));$each(d,function(f,e){d[e]=f;});if($chk(this.options.heightOverride)){d.height=this.options.heightOverride.toInt();}if($chk(this.options.widthOverride)){d.width=this.options.widthOverride.toInt();
85
+}if(this.options.transitionOpacity){this.element.setStyle("opacity",0);d.opacity=1;}var b={height:0,display:this.options.display};$each(d,function(f,e){b[e]=0;
86
+});this.element.setStyles($merge(b,{overflow:"hidden"}));var a=this.options.hideInputs?this.element.getElements(this.options.hideInputs):null;if(a){a.setStyle("visibility","hidden");
87
+}this.start(d);this.$chain.unshift(function(){this.element.style.cssText=this.cssText;this.element.setStyle("display",this.options.display);if(!this.hidden){this.showing=false;
88
+}if(a){a.setStyle("visibility","visible");}this.callChain();this.fireEvent("show",this.element);}.bind(this));}else{this.callChain();this.fireEvent("complete",this.element);
89
+this.fireEvent("show",this.element);}}else{if(this.options.link=="chain"){this.chain(this.reveal.bind(this));}else{if(this.options.link=="cancel"&&!this.showing){this.cancel();
90
+this.reveal();}}}}catch(c){this.element.setStyles({display:this.options.display,visiblity:"visible",opacity:1});this.showing=false;this.callChain.delay(10,this);
91
+this.fireEvent("complete",this.element);this.fireEvent("show",this.element);}return this;},toggle:function(){if(this.element.getStyle("display")=="none"||this.element.getStyle("visiblity")=="hidden"||this.element.getStyle("opacity")==0){this.reveal();
92
+}else{this.dissolve();}return this;},cancel:function(){this.parent.apply(this,arguments);this.element.style.cssText=this.cssText;this.hidding=false;this.showing=false;
93
+}});Element.Properties.reveal={set:function(a){var b=this.retrieve("reveal");if(b){b.cancel();}return this.eliminate("reveal").store("reveal:options",a);
94
+},get:function(a){if(a||!this.retrieve("reveal")){if(a||!this.retrieve("reveal:options")){this.set("reveal",a);}this.store("reveal",new Fx.Reveal(this,this.retrieve("reveal:options")));
95
+}return this.retrieve("reveal");}};Element.Properties.dissolve=Element.Properties.reveal;Element.implement({reveal:function(a){this.get("reveal",a).reveal();
96
+return this;},dissolve:function(a){this.get("reveal",a).dissolve();return this;},nix:function(){var a=Array.link(arguments,{destroy:Boolean.type,options:Object.type});
97
+this.get("reveal",a.options).dissolve().chain(function(){this[a.destroy?"destroy":"dispose"]();}.bind(this));return this;},wink:function(){var b=Array.link(arguments,{duration:Number.type,options:Object.type});
98
+var a=this.get("reveal",b.options);a.reveal().chain(function(){(function(){a.dissolve();}).delay(b.duration||2000);});}});MooTools.lang.set("en-US","Date",{months:["January","February","March","April","May","June","July","August","September","October","November","December"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dateOrder:["month","date","year"],shortDate:"%m/%d/%Y",shortTime:"%I:%M%p",AM:"AM",PM:"PM",ordinal:function(a){return(a>3&&a<21)?"th":["th","st","nd","rd","th"][Math.min(a%10,4)];
99
+},lessThanMinuteAgo:"less than a minute ago",minuteAgo:"about a minute ago",minutesAgo:"{delta} minutes ago",hourAgo:"about an hour ago",hoursAgo:"about {delta} hours ago",dayAgo:"1 day ago",daysAgo:"{delta} days ago",weekAgo:"1 week ago",weeksAgo:"{delta} weeks ago",monthAgo:"1 month ago",monthsAgo:"{delta} months ago",yearAgo:"1 year ago",yearsAgo:"{delta} years ago",lessThanMinuteUntil:"less than a minute from now",minuteUntil:"about a minute from now",minutesUntil:"{delta} minutes from now",hourUntil:"about an hour from now",hoursUntil:"about {delta} hours from now",dayUntil:"1 day from now",daysUntil:"{delta} days from now",weekUntil:"1 week from now",weeksUntil:"{delta} weeks from now",monthUntil:"1 month from now",monthsUntil:"{delta} months from now",yearUntil:"1 year from now",yearsUntil:"{delta} years from now"});
0 100
new file mode 100644
... ...
@@ -0,0 +1,1322 @@
0
+// MooTools: the javascript framework.
1
+// Load this file's selection again by visiting: http://mootools.net/more/0a2b8625655481363709ef8d9ab1d0f4
2
+// Or build this file again with packager using: packager build More/Date More/Date.Extras More/Hash More/Request.JSONP
3
+/*
4
+---
5
+
6
+script: More.js
7
+
8
+name: More
9
+
10
+description: MooTools More
11
+
12
+license: MIT-style license
13
+
14
+authors:
15
+  - Guillermo Rauch
16
+  - Thomas Aylott
17
+  - Scott Kyle
18
+  - Arian Stolwijk
19
+  - Tim Wienk
20
+  - Christoph Pojer
21
+  - Aaron Newton
22
+
23
+requires:
24
+  - Core/MooTools
25
+
26
+provides: [MooTools.More]
27
+
28
+...
29
+*/
30
+
31
+MooTools.More = {
32
+	'version': '1.3.1.1',
33
+	'build': '0292a3af1eea242b817fecf9daa127417d10d4ce'
34
+};
35
+
36
+
37
+/*
38
+---
39
+
40
+script: Object.Extras.js
41
+
42
+name: Object.Extras
43
+
44
+description: Extra Object generics, like getFromPath which allows a path notation to child elements.
45
+
46
+license: MIT-style license
47
+
48
+authors:
49
+  - Aaron Newton
50
+
51
+requires:
52
+  - Core/Object
53
+  - /MooTools.More
54
+
55
+provides: [Object.Extras]
56
+
57
+...
58
+*/
59
+
60
+(function(){
61
+
62
+var defined = function(value){
63
+	return value != null;
64
+};
65
+
66
+var hasOwnProperty = Object.prototype.hasOwnProperty;
67
+
68
+Object.extend({
69
+
70
+	getFromPath: function(source, parts){
71
+		if (typeof parts == 'string') parts = parts.split('.');
72
+		for (var i = 0, l = parts.length; i < l; i++){
73
+			if (hasOwnProperty.call(source, parts[i])) source = source[parts[i]];
74
+			else return null;
75
+		}
76
+		return source;
77
+	},
78
+
79
+	cleanValues: function(object, method){
80
+		method = method || defined;
81
+		for (var key in object) if (!method(object[key])){
82
+			delete object[key];
83
+		}
84
+		return object;
85
+	},
86
+
87
+	erase: function(object, key){
88
+		if (hasOwnProperty.call(object, key)) delete object[key];
89
+		return object;
90
+	},
91
+
92
+	run: function(object){
93
+		var args = Array.slice(arguments, 1);
94
+		for (var key in object) if (object[key].apply){
95
+			object[key].apply(object, args);
96
+		}
97
+		return object;
98
+	}
99
+
100
+});
101
+
102
+}).call(this);
103
+
104
+
105
+/*
106
+---
107
+
108
+script: Locale.js
109
+
110
+name: Locale
111
+
112
+description: Provides methods for localization.
113
+
114
+license: MIT-style license
115
+
116
+authors:
117
+  - Aaron Newton
118
+  - Arian Stolwijk
119
+
120
+requires:
121
+  - Core/Events
122
+  - /Object.Extras
123
+  - /MooTools.More
124
+
125
+provides: [Locale, Lang]
126
+
127
+...
128
+*/
129
+
130
+(function(){
131
+
132
+var current = null,
133
+	locales = {},
134
+	inherits = {};
135
+
136
+var getSet = function(set){
137
+	if (instanceOf(set, Locale.Set)) return set;
138
+	else return locales[set];
139
+};
140
+
141
+var Locale = this.Locale = {
142
+
143
+	define: function(locale, set, key, value){
144
+		var name;
145
+		if (instanceOf(locale, Locale.Set)){
146
+			name = locale.name;
147
+			if (name) locales[name] = locale;
148
+		} else {
149
+			name = locale;
150
+			if (!locales[name]) locales[name] = new Locale.Set(name);
151
+			locale = locales[name];
152
+		}
153
+
154
+		if (set) locale.define(set, key, value);
155
+
156
+
157
+
158
+		if (!current) current = locale;
159
+
160
+		return locale;
161
+	},
162
+
163
+	use: function(locale){
164
+		locale = getSet(locale);
165
+
166
+		if (locale){
167
+			current = locale;
168
+
169
+			this.fireEvent('change', locale);
170
+
171
+
172
+		}
173
+
174
+		return this;
175
+	},
176
+
177
+	getCurrent: function(){
178
+		return current;
179
+	},
180
+
181
+	get: function(key, args){
182
+		return (current) ? current.get(key, args) : '';
183
+	},
184
+
185
+	inherit: function(locale, inherits, set){
186
+		locale = getSet(locale);
187
+
188
+		if (locale) locale.inherit(inherits, set);
189
+		return this;
190
+	},
191
+
192
+	list: function(){
193
+		return Object.keys(locales);
194
+	}
195
+
196
+};
197
+
198
+Object.append(Locale, new Events);
199
+
200
+Locale.Set = new Class({
201
+
202
+	sets: {},
203
+
204
+	inherits: {
205
+		locales: [],
206
+		sets: {}
207
+	},
208
+
209
+	initialize: function(name){
210
+		this.name = name || '';
211
+	},
212
+
213
+	define: function(set, key, value){
214
+		var defineData = this.sets[set];
215
+		if (!defineData) defineData = {};
216
+
217
+		if (key){
218
+			if (typeOf(key) == 'object') defineData = Object.merge(defineData, key);
219
+			else defineData[key] = value;
220
+		}
221
+		this.sets[set] = defineData;
222
+
223
+		return this;
224
+	},
225
+
226
+	get: function(key, args, _base){
227
+		var value = Object.getFromPath(this.sets, key);
228
+		if (value != null){
229
+			var type = typeOf(value);
230
+			if (type == 'function') value = value.apply(null, Array.from(args));
231
+			else if (type == 'object') value = Object.clone(value);
232
+			return value;
233
+		}
234
+
235
+		// get value of inherited locales
236
+		var index = key.indexOf('.'),
237
+			set = index < 0 ? key : key.substr(0, index),
238
+			names = (this.inherits.sets[set] || []).combine(this.inherits.locales).include('en-US');
239
+		if (!_base) _base = [];
240
+
241
+		for (var i = 0, l = names.length; i < l; i++){
242
+			if (_base.contains(names[i])) continue;
243
+			_base.include(names[i]);
244
+
245
+			var locale = locales[names[i]];
246
+			if (!locale) continue;
247
+
248
+			value = locale.get(key, args, _base);
249
+			if (value != null) return value;
250
+		}
251
+
252
+		return '';
253
+	},
254
+
255
+	inherit: function(names, set){
256
+		names = Array.from(names);
257
+
258
+		if (set && !this.inherits.sets[set]) this.inherits.sets[set] = [];
259
+
260
+		var l = names.length;
261
+		while (l--) (set ? this.inherits.sets[set] : this.inherits.locales).unshift(names[l]);
262
+
263
+		return this;
264
+	}
265
+
266
+});
267
+
268
+
269
+
270
+}).call(this);
271
+
272
+
273
+/*
274
+---
275
+
276
+name: Locale.en-US.Date
277
+
278
+description: Date messages for US English.
279
+
280
+license: MIT-style license
281
+
282
+authors:
283
+  - Aaron Newton
284
+
285
+requires:
286
+  - /Locale
287
+
288
+provides: [Locale.en-US.Date]
289
+
290
+...
291
+*/
292
+
293
+Locale.define('en-US', 'Date', {
294
+
295
+	months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
296
+	months_abbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
297
+	days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
298
+	days_abbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
299
+
300
+	// Culture's date order: MM/DD/YYYY
301
+	dateOrder: ['month', 'date', 'year'],
302
+	shortDate: '%m/%d/%Y',
303
+	shortTime: '%I:%M%p',
304
+	AM: 'AM',
305
+	PM: 'PM',
306
+	firstDayOfWeek: 0,
307
+
308
+	// Date.Extras
309
+	ordinal: function(dayOfMonth){
310
+		// 1st, 2nd, 3rd, etc.
311
+		return (dayOfMonth > 3 && dayOfMonth < 21) ? 'th' : ['th', 'st', 'nd', 'rd', 'th'][Math.min(dayOfMonth % 10, 4)];
312
+	},
313
+
314
+	lessThanMinuteAgo: 'less than a minute ago',
315
+	minuteAgo: 'about a minute ago',
316
+	minutesAgo: '{delta} minutes ago',
317
+	hourAgo: 'about an hour ago',
318
+	hoursAgo: 'about {delta} hours ago',
319
+	dayAgo: '1 day ago',
320
+	daysAgo: '{delta} days ago',
321
+	weekAgo: '1 week ago',
322
+	weeksAgo: '{delta} weeks ago',
323
+	monthAgo: '1 month ago',
324
+	monthsAgo: '{delta} months ago',
325
+	yearAgo: '1 year ago',
326
+	yearsAgo: '{delta} years ago',
327
+
328
+	lessThanMinuteUntil: 'less than a minute from now',
329
+	minuteUntil: 'about a minute from now',
330
+	minutesUntil: '{delta} minutes from now',
331
+	hourUntil: 'about an hour from now',
332
+	hoursUntil: 'about {delta} hours from now',
333
+	dayUntil: '1 day from now',
334
+	daysUntil: '{delta} days from now',
335
+	weekUntil: '1 week from now',
336
+	weeksUntil: '{delta} weeks from now',
337
+	monthUntil: '1 month from now',
338
+	monthsUntil: '{delta} months from now',
339
+	yearUntil: '1 year from now',
340
+	yearsUntil: '{delta} years from now'
341
+
342
+});
343
+
344
+
345
+/*
346
+---
347
+
348
+script: Date.js
349
+
350
+name: Date
351
+
352
+description: Extends the Date native object to include methods useful in managing dates.
353
+
354
+license: MIT-style license
355
+
356
+authors:
357
+  - Aaron Newton
358
+  - Nicholas Barthelemy - https://svn.nbarthelemy.com/date-js/
359
+  - Harald Kirshner - mail [at] digitarald.de; http://digitarald.de
360
+  - Scott Kyle - scott [at] appden.com; http://appden.com
361
+
362
+requires:
363
+  - Core/Array
364
+  - Core/String
365
+  - Core/Number
366
+  - MooTools.More
367
+  - Locale
368
+  - Locale.en-US.Date
369
+
370
+provides: [Date]
371
+
372
+...
373
+*/
374
+
375
+(function(){
376
+
377
+var Date = this.Date;
378
+
379
+var DateMethods = Date.Methods = {
380
+	ms: 'Milliseconds',
381
+	year: 'FullYear',
382
+	min: 'Minutes',
383
+	mo: 'Month',
384
+	sec: 'Seconds',
385
+	hr: 'Hours'
386
+};
387
+
388
+['Date', 'Day', 'FullYear', 'Hours', 'Milliseconds', 'Minutes', 'Month', 'Seconds', 'Time', 'TimezoneOffset',
389
+	'Week', 'Timezone', 'GMTOffset', 'DayOfYear', 'LastMonth', 'LastDayOfMonth', 'UTCDate', 'UTCDay', 'UTCFullYear',
390
+	'AMPM', 'Ordinal', 'UTCHours', 'UTCMilliseconds', 'UTCMinutes', 'UTCMonth', 'UTCSeconds', 'UTCMilliseconds'].each(function(method){
391
+	Date.Methods[method.toLowerCase()] = method;
392
+});
393
+
394
+var pad = function(n, digits, string){
395
+	if (digits == 1) return n;
396
+	return n < Math.pow(10, digits - 1) ? (string || '0') + pad(n, digits - 1, string) : n;
397
+};
398
+
399
+Date.implement({
400
+
401
+	set: function(prop, value){
402
+		prop = prop.toLowerCase();
403
+		var method = DateMethods[prop] && 'set' + DateMethods[prop];
404
+		if (method && this[method]) this[method](value);
405
+		return this;
406
+	}.overloadSetter(),
407
+
408
+	get: function(prop){
409
+		prop = prop.toLowerCase();
410
+		var method = DateMethods[prop] && 'get' + DateMethods[prop];
411
+		if (method && this[method]) return this[method]();
412
+		return null;
413
+	}.overloadGetter(),
414
+
415
+	clone: function(){
416
+		return new Date(this.get('time'));
417
+	},
418
+
419
+	increment: function(interval, times){
420
+		interval = interval || 'day';
421
+		times = times != null ? times : 1;
422
+
423
+		switch (interval){
424
+			case 'year':
425
+				return this.increment('month', times * 12);
426
+			case 'month':
427
+				var d = this.get('date');
428
+				this.set('date', 1).set('mo', this.get('mo') + times);
429
+				return this.set('date', d.min(this.get('lastdayofmonth')));
430
+			case 'week':
431
+				return this.increment('day', times * 7);
432
+			case 'day':
433
+				return this.set('date', this.get('date') + times);
434
+		}
435
+
436
+		if (!Date.units[interval]) throw new Error(interval + ' is not a supported interval');
437
+
438
+		return this.set('time', this.get('time') + times * Date.units[interval]());
439
+	},
440
+
441
+	decrement: function(interval, times){
442
+		return this.increment(interval, -1 * (times != null ? times : 1));
443
+	},
444
+
445
+	isLeapYear: function(){
446
+		return Date.isLeapYear(this.get('year'));
447
+	},
448
+
449
+	clearTime: function(){
450
+		return this.set({hr: 0, min: 0, sec: 0, ms: 0});
451
+	},
452
+
453
+	diff: function(date, resolution){
454
+		if (typeOf(date) == 'string') date = Date.parse(date);
455
+
456
+		return ((date - this) / Date.units[resolution || 'day'](3, 3)).round(); // non-leap year, 30-day month
457
+	},
458
+
459
+	getLastDayOfMonth: function(){
460
+		return Date.daysInMonth(this.get('mo'), this.get('year'));
461
+	},
462
+
463
+	getDayOfYear: function(){
464
+		return (Date.UTC(this.get('year'), this.get('mo'), this.get('date') + 1)
465
+			- Date.UTC(this.get('year'), 0, 1)) / Date.units.day();
466
+	},
467
+
468
+	setDay: function(day, firstDayOfWeek){
469
+		if (firstDayOfWeek == null){
470
+			firstDayOfWeek = Date.getMsg('firstDayOfWeek');
471
+			if (firstDayOfWeek === '') firstDayOfWeek = 1;
472
+		}
473
+
474
+		day = (7 + Date.parseDay(day, true) - firstDayOfWeek) % 7;
475
+		var currentDay = (7 + this.get('day') - firstDayOfWeek) % 7;
476
+
477
+		return this.increment('day', day - currentDay);
478
+	},
479
+
480
+	getWeek: function(firstDayOfWeek){
481
+		if (firstDayOfWeek == null){
482
+			firstDayOfWeek = Date.getMsg('firstDayOfWeek');
483
+			if (firstDayOfWeek === '') firstDayOfWeek = 1;
484
+		}
485
+
486
+		var date = this,
487
+			dayOfWeek = (7 + date.get('day') - firstDayOfWeek) % 7,
488
+			dividend = 0,
489
+			firstDayOfYear;
490
+
491
+		if (firstDayOfWeek == 1){
492
+			// ISO-8601, week belongs to year that has the most days of the week (i.e. has the thursday of the week)
493
+			var month = date.get('month'),
494
+				startOfWeek = date.get('date') - dayOfWeek;
495
+
496
+			if (month == 11 && startOfWeek > 28) return 1; // Week 1 of next year
497
+
498
+			if (month == 0 && startOfWeek < -2){
499
+				// Use a date from last year to determine the week
500
+				date = new Date(date).decrement('day', dayOfWeek);
501
+				dayOfWeek = 0;
502
+			}
503
+
504
+			firstDayOfYear = new Date(date.get('year'), 0, 1).get('day') || 7;
505
+			if (firstDayOfYear > 4) dividend = -7; // First week of the year is not week 1
506
+		} else {
507
+			// In other cultures the first week of the year is always week 1 and the last week always 53 or 54.
508
+			// Days in the same week can have a different weeknumber if the week spreads across two years.
509
+			firstDayOfYear = new Date(date.get('year'), 0, 1).get('day');
510
+		}
511
+
512
+		dividend += date.get('dayofyear');
513
+		dividend += 6 - dayOfWeek; // Add days so we calculate the current date's week as a full week
514
+		dividend += (7 + firstDayOfYear - firstDayOfWeek) % 7; // Make up for first week of the year not being a full week
515
+
516
+		return (dividend / 7);
517
+	},
518
+
519
+	getOrdinal: function(day){
520
+		return Date.getMsg('ordinal', day || this.get('date'));
521
+	},
522
+
523
+	getTimezone: function(){
524
+		return this.toString()
525
+			.replace(/^.*? ([A-Z]{3}).[0-9]{4}.*$/, '$1')
526
+			.replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, '$1$2$3');
527
+	},
528
+
529
+	getGMTOffset: function(){
530
+		var off = this.get('timezoneOffset');
531
+		return ((off > 0) ? '-' : '+') + pad((off.abs() / 60).floor(), 2) + pad(off % 60, 2);
532
+	},
533
+
534
+	setAMPM: function(ampm){
535
+		ampm = ampm.toUpperCase();
536
+		var hr = this.get('hr');
537
+		if (hr > 11 && ampm == 'AM') return this.decrement('hour', 12);
538
+		else if (hr < 12 && ampm == 'PM') return this.increment('hour', 12);
539
+		return this;
540
+	},
541
+
542
+	getAMPM: function(){
543
+		return (this.get('hr') < 12) ? 'AM' : 'PM';
544
+	},
545
+
546
+	parse: function(str){
547
+		this.set('time', Date.parse(str));
548
+		return this;
549
+	},
550
+
551
+	isValid: function(date){
552
+		return !isNaN((date || this).valueOf());
553
+	},
554
+
555
+	format: function(f){
556
+		if (!this.isValid()) return 'invalid date';
557
+		if (!f) f = '%x %X';
558
+
559
+		var formatLower = f.toLowerCase();
560
+		if (formatters[formatLower]) return formatters[formatLower](this); // it's a formatter!
561
+		f = formats[formatLower] || f; // replace short-hand with actual format
562
+
563
+		var d = this;
564
+		return f.replace(/%([a-z%])/gi,
565
+			function($0, $1){
566
+				switch ($1){
567
+					case 'a': return Date.getMsg('days_abbr')[d.get('day')];
568
+					case 'A': return Date.getMsg('days')[d.get('day')];
569
+					case 'b': return Date.getMsg('months_abbr')[d.get('month')];
570
+					case 'B': return Date.getMsg('months')[d.get('month')];
571
+					case 'c': return d.format('%a %b %d %H:%M:%S %Y');
572
+					case 'd': return pad(d.get('date'), 2);
573
+					case 'e': return pad(d.get('date'), 2, ' ');
574
+					case 'H': return pad(d.get('hr'), 2);
575
+					case 'I': return pad((d.get('hr') % 12) || 12, 2);
576
+					case 'j': return pad(d.get('dayofyear'), 3);
577
+					case 'k': return pad(d.get('hr'), 2, ' ');
578
+					case 'l': return pad((d.get('hr') % 12) || 12, 2, ' ');
579
+					case 'L': return pad(d.get('ms'), 3);
580
+					case 'm': return pad((d.get('mo') + 1), 2);
581
+					case 'M': return pad(d.get('min'), 2);
582
+					case 'o': return d.get('ordinal');
583
+					case 'p': return Date.getMsg(d.get('ampm'));
584
+					case 's': return Math.round(d / 1000);
585
+					case 'S': return pad(d.get('seconds'), 2);
586
+					case 'T': return d.format('%H:%M:%S');
587
+					case 'U': return pad(d.get('week'), 2);
588
+					case 'w': return d.get('day');
589
+					case 'x': return d.format(Date.getMsg('shortDate'));
590
+					case 'X': return d.format(Date.getMsg('shortTime'));
591
+					case 'y': return d.get('year').toString().substr(2);
592
+					case 'Y': return d.get('year');
593
+					case 'z': return d.get('GMTOffset');
594
+					case 'Z': return d.get('Timezone');
595
+				}
596
+				return $1;
597
+			}
598
+		);
599
+	},
600
+
601
+	toISOString: function(){
602
+		return this.format('iso8601');
603
+	}
604
+
605
+}).alias({
606
+	toJSON: 'toISOString',
607
+	compare: 'diff',
608
+	strftime: 'format'
609
+});
610
+
611
+var formats = {
612
+	db: '%Y-%m-%d %H:%M:%S',
613
+	compact: '%Y%m%dT%H%M%S',
614
+	'short': '%d %b %H:%M',
615
+	'long': '%B %d, %Y %H:%M'
616
+};
617
+
618
+// The day and month abbreviations are standardized, so we cannot use simply %a and %b because they will get localized
619
+var rfcDayAbbr = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
620
+	rfcMonthAbbr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
621
+
622
+var formatters = {
623
+	rfc822: function(date){
624
+		return rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %Z');
625
+	},
626
+	rfc2822: function(date){
627
+		return rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %z');
628
+	},
629
+	iso8601: function(date){
630
+		return (
631
+			date.getUTCFullYear() + '-' +
632
+			pad(date.getUTCMonth() + 1, 2) + '-' +
633
+			pad(date.getUTCDate(), 2) + 'T' +
634
+			pad(date.getUTCHours(), 2) + ':' +
635
+			pad(date.getUTCMinutes(), 2) + ':' +
636
+			pad(date.getUTCSeconds(), 2) + '.' +
637
+			pad(date.getUTCMilliseconds(), 3) + 'Z'
638
+		);
639
+	}
640
+};
641
+
642
+
643
+var parsePatterns = [],
644
+	nativeParse = Date.parse;
645
+
646
+var parseWord = function(type, word, num){
647
+	var ret = -1,
648
+		translated = Date.getMsg(type + 's');
649
+	switch (typeOf(word)){
650
+		case 'object':
651
+			ret = translated[word.get(type)];
652
+			break;
653
+		case 'number':
654
+			ret = translated[word];
655
+			if (!ret) throw new Error('Invalid ' + type + ' index: ' + word);
656
+			break;
657
+		case 'string':
658
+			var match = translated.filter(function(name){
659
+				return this.test(name);
660
+			}, new RegExp('^' + word, 'i'));
661
+			if (!match.length) throw new Error('Invalid ' + type + ' string');
662
+			if (match.length > 1) throw new Error('Ambiguous ' + type);
663
+			ret = match[0];
664
+	}
665
+
666
+	return (num) ? translated.indexOf(ret) : ret;
667
+};
668
+
669
+var startCentury = 1900,
670
+	startYear = 70;
671
+
672
+Date.extend({
673
+
674
+	getMsg: function(key, args){
675
+		return Locale.get('Date.' + key, args);
676
+	},
677
+
678
+	units: {
679
+		ms: Function.from(1),
680
+		second: Function.from(1000),
681
+		minute: Function.from(60000),
682
+		hour: Function.from(3600000),
683
+		day: Function.from(86400000),
684
+		week: Function.from(608400000),
685
+		month: function(month, year){
686
+			var d = new Date;
687
+			return Date.daysInMonth(month != null ? month : d.get('mo'), year != null ? year : d.get('year')) * 86400000;
688
+		},
689
+		year: function(year){
690
+			year = year || new Date().get('year');
691
+			return Date.isLeapYear(year) ? 31622400000 : 31536000000;
692
+		}
693
+	},
694
+
695
+	daysInMonth: function(month, year){
696
+		return [31, Date.isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
697
+	},
698
+
699
+	isLeapYear: function(year){
700
+		return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);
701
+	},
702
+
703
+	parse: function(from){
704
+		var t = typeOf(from);
705
+		if (t == 'number') return new Date(from);
706
+		if (t != 'string') return from;
707
+		from = from.clean();
708
+		if (!from.length) return null;
709
+
710
+		var parsed;
711
+		parsePatterns.some(function(pattern){
712
+			var bits = pattern.re.exec(from);
713
+			return (bits) ? (parsed = pattern.handler(bits)) : false;
714
+		});
715
+
716
+		if (!(parsed && parsed.isValid())){
717
+			parsed = new Date(nativeParse(from));
718
+			if (!(parsed && parsed.isValid())) parsed = new Date(from.toInt());
719
+		}
720
+		return parsed;
721
+	},
722
+
723
+	parseDay: function(day, num){
724
+		return parseWord('day', day, num);
725
+	},
726
+
727
+	parseMonth: function(month, num){
728
+		return parseWord('month', month, num);
729
+	},
730
+
731
+	parseUTC: function(value){
732
+		var localDate = new Date(value);
733
+		var utcSeconds = Date.UTC(
734
+			localDate.get('year'),
735
+			localDate.get('mo'),
736
+			localDate.get('date'),
737
+			localDate.get('hr'),
738
+			localDate.get('min'),
739
+			localDate.get('sec'),
740
+			localDate.get('ms')
741
+		);
742
+		return new Date(utcSeconds);
743
+	},
744
+
745
+	orderIndex: function(unit){
746
+		return Date.getMsg('dateOrder').indexOf(unit) + 1;
747
+	},
748
+
749
+	defineFormat: function(name, format){
750
+		formats[name] = format;
751
+		return this;
752
+	},
753
+
754
+	defineFormats: function(formats){
755
+		for (var name in formats) Date.defineFormat(name, formats[name]);
756
+		return this;
757
+	},
758
+
759
+
760
+
761
+	defineParser: function(pattern){
762
+		parsePatterns.push((pattern.re && pattern.handler) ? pattern : build(pattern));
763
+		return this;
764
+	},
765
+
766
+	defineParsers: function(){
767
+		Array.flatten(arguments).each(Date.defineParser);
768
+		return this;
769
+	},
770
+
771
+	define2DigitYearStart: function(year){
772
+		startYear = year % 100;
773
+		startCentury = year - startYear;
774
+		return this;
775
+	}
776
+
777
+});
778
+
779
+var regexOf = function(type){
780
+	return new RegExp('(?:' + Date.getMsg(type).map(function(name){
781
+		return name.substr(0, 3);
782
+	}).join('|') + ')[a-z]*');
783
+};
784
+
785
+var replacers = function(key){
786
+	switch (key){
787
+		case 'T':
788
+			return '%H:%M:%S';
789
+		case 'x': // iso8601 covers yyyy-mm-dd, so just check if month is first
790
+			return ((Date.orderIndex('month') == 1) ? '%m[-./]%d' : '%d[-./]%m') + '([-./]%y)?';
791
+		case 'X':
792
+			return '%H([.:]%M)?([.:]%S([.:]%s)?)? ?%p? ?%z?';
793
+	}
794
+	return null;
795
+};
796
+
797
+var keys = {
798
+	d: /[0-2]?[0-9]|3[01]/,
799
+	H: /[01]?[0-9]|2[0-3]/,
800
+	I: /0?[1-9]|1[0-2]/,
801
+	M: /[0-5]?\d/,
802
+	s: /\d+/,
803
+	o: /[a-z]*/,
804
+	p: /[ap]\.?m\.?/,
805
+	y: /\d{2}|\d{4}/,
806
+	Y: /\d{4}/,
807
+	z: /Z|[+-]\d{2}(?::?\d{2})?/
808
+};
809
+
810
+keys.m = keys.I;
811
+keys.S = keys.M;
812
+
813
+var currentLanguage;
814
+
815
+var recompile = function(language){
816
+	currentLanguage = language;
817
+
818
+	keys.a = keys.A = regexOf('days');
819
+	keys.b = keys.B = regexOf('months');
820
+
821
+	parsePatterns.each(function(pattern, i){
822
+		if (pattern.format) parsePatterns[i] = build(pattern.format);
823
+	});
824
+};
825
+
826
+var build = function(format){
827
+	if (!currentLanguage) return {format: format};
828
+
829
+	var parsed = [];
830
+	var re = (format.source || format) // allow format to be regex
831
+	 .replace(/%([a-z])/gi,
832
+		function($0, $1){
833
+			return replacers($1) || $0;
834
+		}
835
+	).replace(/\((?!\?)/g, '(?:') // make all groups non-capturing
836
+	 .replace(/ (?!\?|\*)/g, ',? ') // be forgiving with spaces and commas
837
+	 .replace(/%([a-z%])/gi,
838
+		function($0, $1){
839
+			var p = keys[$1];
840
+			if (!p) return $1;
841
+			parsed.push($1);
842
+			return '(' + p.source + ')';
843
+		}
844
+	).replace(/\[a-z\]/gi, '[a-z\\u00c0-\\uffff;\&]'); // handle unicode words
845
+
846
+	return {
847
+		format: format,
848
+		re: new RegExp('^' + re + '$', 'i'),
849
+		handler: function(bits){
850
+			bits = bits.slice(1).associate(parsed);
851
+			var date = new Date().clearTime(),
852
+				year = bits.y || bits.Y;
853
+
854
+			if (year != null) handle.call(date, 'y', year); // need to start in the right year
855
+			if ('d' in bits) handle.call(date, 'd', 1);
856
+			if ('m' in bits || bits.b || bits.B) handle.call(date, 'm', 1);
857
+
858
+			for (var key in bits) handle.call(date, key, bits[key]);
859
+			return date;
860
+		}
861
+	};
862
+};
863
+
864
+var handle = function(key, value){
865
+	if (!value) return this;
866
+
867
+	switch (key){
868
+		case 'a': case 'A': return this.set('day', Date.parseDay(value, true));
869
+		case 'b': case 'B': return this.set('mo', Date.parseMonth(value, true));
870
+		case 'd': return this.set('date', value);
871
+		case 'H': case 'I': return this.set('hr', value);
872
+		case 'm': return this.set('mo', value - 1);
873
+		case 'M': return this.set('min', value);
874
+		case 'p': return this.set('ampm', value.replace(/\./g, ''));
875
+		case 'S': return this.set('sec', value);
876
+		case 's': return this.set('ms', ('0.' + value) * 1000);
877
+		case 'w': return this.set('day', value);
878
+		case 'Y': return this.set('year', value);
879
+		case 'y':
880
+			value = +value;
881
+			if (value < 100) value += startCentury + (value < startYear ? 100 : 0);
882
+			return this.set('year', value);
883
+		case 'z':
884
+			if (value == 'Z') value = '+00';
885
+			var offset = value.match(/([+-])(\d{2}):?(\d{2})?/);
886
+			offset = (offset[1] + '1') * (offset[2] * 60 + (+offset[3] || 0)) + this.getTimezoneOffset();
887
+			return this.set('time', this - offset * 60000);
888
+	}
889
+
890
+	return this;
891
+};
892
+
893
+Date.defineParsers(
894
+	'%Y([-./]%m([-./]%d((T| )%X)?)?)?', // "1999-12-31", "1999-12-31 11:59pm", "1999-12-31 23:59:59", ISO8601
895
+	'%Y%m%d(T%H(%M%S?)?)?', // "19991231", "19991231T1159", compact
896
+	'%x( %X)?', // "12/31", "12.31.99", "12-31-1999", "12/31/2008 11:59 PM"
897
+	'%d%o( %b( %Y)?)?( %X)?', // "31st", "31st December", "31 Dec 1999", "31 Dec 1999 11:59pm"
898
+	'%b( %d%o)?( %Y)?( %X)?', // Same as above with month and day switched
899
+	'%Y %b( %d%o( %X)?)?', // Same as above with year coming first
900
+	'%o %b %d %X %z %Y', // "Thu Oct 22 08:11:23 +0000 2009"
901
+	'%T', // %H:%M:%S
902
+	'%H:%M( ?%p)?' // "11:05pm", "11:05 am" and "11:05"
903
+);
904
+
905
+Locale.addEvent('change', function(language){
906
+	if (Locale.get('Date')) recompile(language);
907
+}).fireEvent('change', Locale.getCurrent());
908
+
909
+}).call(this);
910
+
911
+
912
+/*
913
+---
914
+
915
+script: Date.Extras.js
916
+
917
+name: Date.Extras
918
+
919
+description: Extends the Date native object to include extra methods (on top of those in Date.js).
920
+
921
+license: MIT-style license
922
+
923
+authors:
924
+  - Aaron Newton
925
+  - Scott Kyle
926
+
927
+requires:
928
+  - /Date
929
+
930
+provides: [Date.Extras]
931
+
932
+...
933
+*/
934
+
935
+Date.implement({
936
+
937
+	timeDiffInWords: function(to){
938
+		return Date.distanceOfTimeInWords(this, to || new Date);
939
+	},
940
+
941
+	timeDiff: function(to, separator){
942
+		if (to == null) to = new Date;
943
+		var delta = ((to - this) / 1000).floor();
944
+
945
+		var vals = [],
946
+			durations = [60, 60, 24, 365, 0],
947
+			names = ['s', 'm', 'h', 'd', 'y'],
948
+			value, duration;
949
+
950
+		for (var item = 0; item < durations.length; item++){
951
+			if (item && !delta) break;
952
+			value = delta;
953
+			if ((duration = durations[item])){
954
+				value = (delta % duration);
955
+				delta = (delta / duration).floor();
956
+			}
957
+			vals.unshift(value + (names[item] || ''));
958
+		}
959
+
960
+		return vals.join(separator || ':');
961
+	}
962
+
963
+}).extend({
964
+
965
+	distanceOfTimeInWords: function(from, to){
966
+		return Date.getTimePhrase(((to - from) / 1000).toInt());
967
+	},
968
+
969
+	getTimePhrase: function(delta){
970
+		var suffix = (delta < 0) ? 'Until' : 'Ago';
971
+		if (delta < 0) delta *= -1;
972
+
973
+		var units = {
974
+			minute: 60,
975
+			hour: 60,
976
+			day: 24,
977
+			week: 7,
978
+			month: 52 / 12,
979
+			year: 12,
980
+			eon: Infinity
981
+		};
982
+
983
+		var msg = 'lessThanMinute';
984
+
985
+		for (var unit in units){
986
+			var interval = units[unit];
987
+			if (delta < 1.5 * interval){
988
+				if (delta > 0.75 * interval) msg = unit;
989
+				break;
990
+			}
991
+			delta /= interval;
992
+			msg = unit + 's';
993
+		}
994
+
995
+		delta = delta.round();
996
+		return Date.getMsg(msg + suffix, delta).substitute({delta: delta});
997
+	}
998
+
999
+}).defineParsers(
1000
+
1001
+	{
1002
+		// "today", "tomorrow", "yesterday"
1003
+		re: /^(?:tod|tom|yes)/i,
1004
+		handler: function(bits){
1005
+			var d = new Date().clearTime();
1006
+			switch (bits[0]){
1007
+				case 'tom': return d.increment();
1008
+				case 'yes': return d.decrement();
1009
+				default: return d;
1010
+			}
1011
+		}
1012
+	},
1013
+
1014
+	{
1015
+		// "next Wednesday", "last Thursday"
1016
+		re: /^(next|last) ([a-z]+)$/i,
1017
+		handler: function(bits){
1018
+			var d = new Date().clearTime();
1019
+			var day = d.getDay();
1020
+			var newDay = Date.parseDay(bits[2], true);
1021
+			var addDays = newDay - day;
1022
+			if (newDay <= day) addDays += 7;
1023
+			if (bits[1] == 'last') addDays -= 7;
1024
+			return d.set('date', d.getDate() + addDays);
1025
+		}
1026
+	}
1027
+
1028
+).alias('timeAgoInWords', 'timeDiffInWords');
1029
+
1030
+
1031
+/*
1032
+---
1033
+
1034
+name: Hash
1035
+
1036
+description: Contains Hash Prototypes. Provides a means for overcoming the JavaScript practical impossibility of extending native Objects.
1037
+
1038
+license: MIT-style license.
1039
+
1040
+requires:
1041
+  - Core/Object
1042
+  - /MooTools.More
1043
+
1044
+provides: [Hash]
1045
+
1046
+...
1047
+*/
1048
+
1049
+(function(){
1050
+
1051
+if (this.Hash) return;
1052
+
1053
+var Hash = this.Hash = new Type('Hash', function(object){
1054
+	if (typeOf(object) == 'hash') object = Object.clone(object.getClean());
1055
+	for (var key in object) this[key] = object[key];
1056
+	return this;
1057
+});
1058
+
1059
+this.$H = function(object){
1060
+	return new Hash(object);
1061
+};
1062
+
1063
+Hash.implement({
1064
+
1065
+	forEach: function(fn, bind){
1066
+		Object.forEach(this, fn, bind);
1067
+	},
1068
+
1069
+	getClean: function(){
1070
+		var clean = {};
1071
+		for (var key in this){
1072
+			if (this.hasOwnProperty(key)) clean[key] = this[key];
1073
+		}
1074
+		return clean;
1075
+	},
1076
+
1077
+	getLength: function(){
1078
+		var length = 0;
1079
+		for (var key in this){
1080
+			if (this.hasOwnProperty(key)) length++;
1081
+		}
1082
+		return length;
1083
+	}
1084
+
1085
+});
1086
+
1087
+Hash.alias('each', 'forEach');
1088
+
1089
+Hash.implement({
1090
+
1091
+	has: Object.prototype.hasOwnProperty,
1092
+
1093
+	keyOf: function(value){
1094
+		return Object.keyOf(this, value);
1095
+	},
1096
+
1097
+	hasValue: function(value){
1098
+		return Object.contains(this, value);
1099
+	},
1100
+
1101
+	extend: function(properties){
1102
+		Hash.each(properties || {}, function(value, key){
1103
+			Hash.set(this, key, value);
1104
+		}, this);
1105
+		return this;
1106
+	},
1107
+
1108
+	combine: function(properties){
1109
+		Hash.each(properties || {}, function(value, key){
1110
+			Hash.include(this, key, value);
1111
+		}, this);
1112
+		return this;
1113
+	},
1114
+
1115
+	erase: function(key){
1116
+		if (this.hasOwnProperty(key)) delete this[key];
1117
+		return this;
1118
+	},
1119
+
1120
+	get: function(key){
1121
+		return (this.hasOwnProperty(key)) ? this[key] : null;
1122
+	},
1123
+
1124
+	set: function(key, value){
1125
+		if (!this[key] || this.hasOwnProperty(key)) this[key] = value;
1126
+		return this;
1127
+	},
1128
+
1129
+	empty: function(){
1130
+		Hash.each(this, function(value, key){
1131
+			delete this[key];
1132
+		}, this);
1133
+		return this;
1134
+	},
1135
+
1136
+	include: function(key, value){
1137
+		if (this[key] == undefined) this[key] = value;
1138
+		return this;
1139
+	},
1140
+
1141
+	map: function(fn, bind){
1142
+		return new Hash(Object.map(this, fn, bind));
1143
+	},
1144
+
1145
+	filter: function(fn, bind){
1146
+		return new Hash(Object.filter(this, fn, bind));
1147
+	},
1148
+
1149
+	every: function(fn, bind){
1150
+		return Object.every(this, fn, bind);
1151
+	},
1152
+
1153
+	some: function(fn, bind){
1154
+		return Object.some(this, fn, bind);
1155
+	},
1156
+
1157
+	getKeys: function(){
1158
+		return Object.keys(this);
1159
+	},
1160
+
1161
+	getValues: function(){
1162
+		return Object.values(this);
1163
+	},
1164
+
1165
+	toQueryString: function(base){
1166
+		return Object.toQueryString(this, base);
1167
+	}
1168
+
1169
+});
1170
+
1171
+Hash.alias({indexOf: 'keyOf', contains: 'hasValue'});
1172
+
1173
+
1174
+}).call(this);
1175
+
1176
+
1177
+
1178
+/*
1179
+---
1180
+
1181
+script: Request.JSONP.js
1182
+
1183
+name: Request.JSONP
1184
+
1185
+description: Defines Request.JSONP, a class for cross domain javascript via script injection.
1186
+
1187
+license: MIT-style license
1188
+
1189
+authors:
1190
+  - Aaron Newton
1191
+  - Guillermo Rauch
1192
+  - Arian Stolwijk
1193
+
1194
+requires:
1195
+  - Core/Element
1196
+  - Core/Request
1197
+  - MooTools.More
1198
+
1199
+provides: [Request.JSONP]
1200
+
1201
+...
1202
+*/
1203
+
1204
+Request.JSONP = new Class({
1205
+
1206
+	Implements: [Chain, Events, Options],
1207
+
1208
+	options: {
1209
+	/*
1210
+		onRequest: function(src, scriptElement){},
1211
+		onComplete: function(data){},
1212
+		onSuccess: function(data){},
1213
+		onCancel: function(){},
1214
+		onTimeout: function(){},
1215
+		onError: function(){}, */
1216
+		onRequest: function(src){
1217
+			if (this.options.log && window.console && console.log){
1218
+				console.log('JSONP retrieving script with url:' + src);
1219
+			}
1220
+		},
1221
+		onError: function(src){
1222
+			if (this.options.log && window.console && console.warn){
1223
+				console.warn('JSONP '+ src +' will fail in Internet Explorer, which enforces a 2083 bytes length limit on URIs');
1224
+			}
1225
+		},
1226
+		url: '',
1227
+		callbackKey: 'callback',
1228
+		injectScript: document.head,
1229
+		data: '',
1230
+		link: 'ignore',
1231
+		timeout: 0,
1232
+		log: false
1233
+	},
1234
+
1235
+	initialize: function(options){
1236
+		this.setOptions(options);
1237
+	},
1238
+
1239
+	send: function(options){
1240
+		if (!Request.prototype.check.call(this, options)) return this;
1241
+		this.running = true;
1242
+
1243
+		var type = typeOf(options);
1244
+		if (type == 'string' || type == 'element') options = {data: options};
1245
+		options = Object.merge(this.options, options || {});
1246
+
1247
+		var data = options.data;
1248
+		switch (typeOf(data)){
1249
+			case 'element': data = document.id(data).toQueryString(); break;
1250
+			case 'object': case 'hash': data = Object.toQueryString(data);
1251
+		}
1252
+
1253
+		var index = this.index = Request.JSONP.counter++;
1254
+
1255
+		var src = options.url +
1256
+			(options.url.test('\\?') ? '&' :'?') +
1257
+			(options.callbackKey) +
1258
+			'=Request.JSONP.request_map.request_'+ index +
1259
+			(data ? '&' + data : '');
1260
+
1261
+		if (src.length > 2083) this.fireEvent('error', src);
1262
+
1263
+		Request.JSONP.request_map['request_' + index] = function(){
1264
+			this.success(arguments, index);
1265
+		}.bind(this);
1266
+
1267
+		var script = this.getScript(src).inject(options.injectScript);
1268
+		this.fireEvent('request', [src, script]);
1269
+
1270
+		if (options.timeout) this.timeout.delay(options.timeout, this);
1271
+
1272
+		return this;
1273
+	},
1274
+
1275
+	getScript: function(src){
1276
+		if (!this.script) this.script = new Element('script[type=text/javascript]', {
1277
+			async: true,
1278
+			src: src
1279
+		});
1280
+		return this.script;
1281
+	},
1282
+
1283
+	success: function(args, index){
1284
+		if (!this.running) return false;
1285
+		this.clear()
1286
+			.fireEvent('complete', args).fireEvent('success', args)
1287
+			.callChain();
1288
+	},
1289
+
1290
+	cancel: function(){
1291
+		if (this.running) this.clear().fireEvent('cancel');
1292
+		return this;
1293
+	},
1294
+
1295
+	isRunning: function(){
1296
+		return !!this.running;
1297
+	},
1298
+
1299
+	clear: function(){
1300
+		this.running = false;
1301
+		if (this.script){
1302
+			this.script.destroy();
1303
+			this.script = null;
1304
+		}
1305
+		return this;
1306
+	},
1307
+
1308
+	timeout: function(){
1309
+		if (this.running){
1310
+			this.running = false;
1311
+			this.fireEvent('timeout', [this.script.get('src'), this.script]).fireEvent('failure').cancel();
1312
+		}
1313
+		return this;
1314
+	}
1315
+
1316
+});
1317
+
1318
+Request.JSONP.counter = 0;
1319
+Request.JSONP.request_map = {};
1320
+
1321
+
0 1322
new file mode 100644
... ...
@@ -0,0 +1,5492 @@
0
+/*
1
+---
2
+MooTools: the javascript framework
3
+
4
+web build:
5
+ - http://mootools.net/core/7c56cfef9dddcf170a5d68e3fb61cfd7
6
+
7
+packager build:
8
+ - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady Core/Swiff
9
+
10
+/*
11
+---
12
+
13
+name: Core
14
+
15
+description: The heart of MooTools.
16
+
17
+license: MIT-style license.
18
+
19
+copyright: Copyright (c) 2006-2010 [Valerio Proietti](http://mad4milk.net/).
20
+
21
+authors: The MooTools production team (http://mootools.net/developers/)
22
+
23
+inspiration:
24
+  - Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php)
25
+  - Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php)
26
+
27
+provides: [Core, MooTools, Type, typeOf, instanceOf, Native]
28
+
29
+...
30
+*/
31
+
32
+(function(){
33
+
34
+this.MooTools = {
35
+	version: '1.3.1',
36
+	build: 'af48c8d589f43f32212f9bb8ff68a127e6a3ba6c'
37
+};
38
+
39
+// typeOf, instanceOf
40
+
41
+var typeOf = this.typeOf = function(item){
42
+	if (item == null) return 'null';
43
+	if (item.$family) return item.$family();
44
+
45
+	if (item.nodeName){
46
+		if (item.nodeType == 1) return 'element';
47
+		if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? 'textnode' : 'whitespace';
48
+	} else if (typeof item.length == 'number'){
49
+		if (item.callee) return 'arguments';
50
+		if ('item' in item) return 'collection';
51
+	}
52
+
53
+	return typeof item;
54
+};
55
+
56
+var instanceOf = this.instanceOf = function(item, object){
57
+	if (item == null) return false;
58
+	var constructor = item.$constructor || item.constructor;
59
+	while (constructor){
60
+		if (constructor === object) return true;
61
+		constructor = constructor.parent;
62
+	}
63
+	return item instanceof object;
64
+};
65
+
66
+// Function overloading
67
+
68
+var Function = this.Function;
69
+
70
+var enumerables = true;
71
+for (var i in {toString: 1}) enumerables = null;
72
+if (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor'];
73
+
74
+Function.prototype.overloadSetter = function(usePlural){
75
+	var self = this;
76
+	return function(a, b){
77
+		if (a == null) return this;
78
+		if (usePlural || typeof a != 'string'){
79
+			for (var k in a) self.call(this, k, a[k]);
80
+			if (enumerables) for (var i = enumerables.length; i--;){
81
+				k = enumerables[i];
82
+				if (a.hasOwnProperty(k)) self.call(this, k, a[k]);
83
+			}
84
+		} else {
85
+			self.call(this, a, b);
86
+		}
87
+		return this;
88
+	};
89
+};
90
+
91
+Function.prototype.overloadGetter = function(usePlural){
92
+	var self = this;
93
+	return function(a){
94
+		var args, result;
95
+		if (usePlural || typeof a != 'string') args = a;
96
+		else if (arguments.length > 1) args = arguments;
97
+		if (args){
98
+			result = {};
99
+			for (var i = 0; i < args.length; i++) result[args[i]] = self.call(this, args[i]);
100
+		} else {
101
+			result = self.call(this, a);
102
+		}
103
+		return result;
104
+	};
105
+};
106
+
107
+Function.prototype.extend = function(key, value){
108
+	this[key] = value;
109
+}.overloadSetter();
110
+
111
+Function.prototype.implement = function(key, value){
112
+	this.prototype[key] = value;
113
+}.overloadSetter();
114
+
115
+// From
116
+
117
+var slice = Array.prototype.slice;
118
+
119
+Function.from = function(item){
120
+	return (typeOf(item) == 'function') ? item : function(){
121
+		return item;
122
+	};
123
+};
124
+
125
+Array.from = function(item){
126
+	if (item == null) return [];
127
+	return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item];
128
+};
129
+
130
+Number.from = function(item){
131
+	var number = parseFloat(item);
132
+	return isFinite(number) ? number : null;
133
+};
134
+
135
+String.from = function(item){
136
+	return item + '';
137
+};
138
+
139
+// hide, protect
140
+
141
+Function.implement({
142
+
143
+	hide: function(){
144
+		this.$hidden = true;
145
+		return this;
146
+	},
147
+
148
+	protect: function(){
149
+		this.$protected = true;
150
+		return this;
151
+	}
152
+
153
+});
154
+
155
+// Type
156
+
157
+var Type = this.Type = function(name, object){
158
+	if (name){
159
+		var lower = name.toLowerCase();
160
+		var typeCheck = function(item){
161
+			return (typeOf(item) == lower);
162
+		};
163
+
164
+		Type['is' + name] = typeCheck;
165
+		if (object != null){
166
+			object.prototype.$family = (function(){
167
+				return lower;
168
+			}).hide();
169
+
170
+		}
171
+	}
172
+
173
+	if (object == null) return null;
174
+
175
+	object.extend(this);
176
+	object.$constructor = Type;
177
+	object.prototype.$constructor = object;
178
+
179
+	return object;
180
+};
181
+
182
+var toString = Object.prototype.toString;
183
+
184
+Type.isEnumerable = function(item){
185
+	return (item != null && typeof item.length == 'number' && toString.call(item) != '[object Function]' );
186
+};
187
+
188
+var hooks = {};
189
+
190
+var hooksOf = function(object){
191
+	var type = typeOf(object.prototype);
192
+	return hooks[type] || (hooks[type] = []);
193
+};
194
+
195
+var implement = function(name, method){
196
+	if (method && method.$hidden) return;
197
+
198
+	var hooks = hooksOf(this);
199
+
200
+	for (var i = 0; i < hooks.length; i++){
201
+		var hook = hooks[i];
202
+		if (typeOf(hook) == 'type') implement.call(hook, name, method);
203
+		else hook.call(this, name, method);
204
+	}
205
+
206
+	var previous = this.prototype[name];
207
+	if (previous == null || !previous.$protected) this.prototype[name] = method;
208
+
209
+	if (this[name] == null && typeOf(method) == 'function') extend.call(this, name, function(item){
210
+		return method.apply(item, slice.call(arguments, 1));
211
+	});
212
+};
213
+
214
+var extend = function(name, method){
215
+	if (method && method.$hidden) return;
216
+	var previous = this[name];
217
+	if (previous == null || !previous.$protected) this[name] = method;
218
+};
219
+
220
+Type.implement({
221
+
222
+	implement: implement.overloadSetter(),
223
+
224
+	extend: extend.overloadSetter(),
225
+
226
+	alias: function(name, existing){
227
+		implement.call(this, name, this.prototype[existing]);
228
+	}.overloadSetter(),
229
+
230
+	mirror: function(hook){
231
+		hooksOf(this).push(hook);
232
+		return this;
233
+	}
234
+
235
+});
236
+
237
+new Type('Type', Type);
238
+
239
+// Default Types
240
+
241
+var force = function(name, object, methods){
242
+	var isType = (object != Object),
243
+		prototype = object.prototype;
244
+
245
+	if (isType) object = new Type(name, object);
246
+
247
+	for (var i = 0, l = methods.length; i < l; i++){
248
+		var key = methods[i],
249
+			generic = object[key],
250
+			proto = prototype[key];
251
+
252
+		if (generic) generic.protect();
253
+
254
+		if (isType && proto){
255
+			delete prototype[key];
256
+			prototype[key] = proto.protect();
257
+		}
258
+	}
259
+
260
+	if (isType) object.implement(prototype);
261
+
262
+	return force;
263
+};
264
+
265
+force('String', String, [
266
+	'charAt', 'charCodeAt', 'concat', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search',
267
+	'slice', 'split', 'substr', 'substring', 'toLowerCase', 'toUpperCase'
268
+])('Array', Array, [
269
+	'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice',
270
+	'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight'
271
+])('Number', Number, [
272
+	'toExponential', 'toFixed', 'toLocaleString', 'toPrecision'
273
+])('Function', Function, [
274
+	'apply', 'call', 'bind'
275
+])('RegExp', RegExp, [
276
+	'exec', 'test'
277
+])('Object', Object, [
278
+	'create', 'defineProperty', 'defineProperties', 'keys',
279
+	'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames',
280
+	'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen'
281
+])('Date', Date, ['now']);
282
+
283
+Object.extend = extend.overloadSetter();
284
+
285
+Date.extend('now', function(){
286
+	return +(new Date);
287
+});
288
+
289
+new Type('Boolean', Boolean);
290
+
291
+// fixes NaN returning as Number
292
+
293
+Number.prototype.$family = function(){
294
+	return isFinite(this) ? 'number' : 'null';
295
+}.hide();
296
+
297
+// Number.random
298
+
299
+Number.extend('random', function(min, max){
300
+	return Math.floor(Math.random() * (max - min + 1) + min);
301
+});
302
+
303
+// forEach, each
304
+
305
+var hasOwnProperty = Object.prototype.hasOwnProperty;
306
+Object.extend('forEach', function(object, fn, bind){
307
+	for (var key in object){
308
+		if (hasOwnProperty.call(object, key)) fn.call(bind, object[key], key, object);
309
+	}
310
+});
311
+
312
+Object.each = Object.forEach;
313
+
314
+Array.implement({
315
+
316
+	forEach: function(fn, bind){
317
+		for (var i = 0, l = this.length; i < l; i++){
318
+			if (i in this) fn.call(bind, this[i], i, this);
319
+		}
320
+	},
321
+
322
+	each: function(fn, bind){
323
+		Array.forEach(this, fn, bind);
324
+		return this;
325
+	}
326
+
327
+});
328
+
329
+// Array & Object cloning, Object merging and appending
330
+
331
+var cloneOf = function(item){
332
+	switch (typeOf(item)){
333
+		case 'array': return item.clone();
334
+		case 'object': return Object.clone(item);
335
+		default: return item;
336
+	}
337
+};
338
+
339
+Array.implement('clone', function(){
340
+	var i = this.length, clone = new Array(i);
341
+	while (i--) clone[i] = cloneOf(this[i]);
342
+	return clone;
343
+});
344
+
345
+var mergeOne = function(source, key, current){
346
+	switch (typeOf(current)){
347
+		case 'object':
348
+			if (typeOf(source[key]) == 'object') Object.merge(source[key], current);
349
+			else source[key] = Object.clone(current);
350
+		break;
351
+		case 'array': source[key] = current.clone(); break;
352
+		default: source[key] = current;
353
+	}
354
+	return source;
355
+};
356
+
357
+Object.extend({
358
+
359
+	merge: function(source, k, v){
360
+		if (typeOf(k) == 'string') return mergeOne(source, k, v);
361
+		for (var i = 1, l = arguments.length; i < l; i++){
362
+			var object = arguments[i];
363
+			for (var key in object) mergeOne(source, key, object[key]);
364
+		}
365
+		return source;
366
+	},
367
+
368
+	clone: function(object){
369
+		var clone = {};
370
+		for (var key in object) clone[key] = cloneOf(object[key]);
371
+		return clone;
372
+	},
373
+
374
+	append: function(original){
375
+		for (var i = 1, l = arguments.length; i < l; i++){
376
+			var extended = arguments[i] || {};
377
+			for (var key in extended) original[key] = extended[key];
378
+		}
379
+		return original;
380
+	}
381
+
382
+});
383
+
384
+// Object-less types
385
+
386
+['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each(function(name){
387
+	new Type(name);
388
+});
389
+
390
+// Unique ID
391
+
392
+var UID = Date.now();
393
+
394
+String.extend('uniqueID', function(){
395
+	return (UID++).toString(36);
396
+});
397
+
398
+
399
+
400
+}).call(this);
401
+
402
+
403
+/*
404
+---
405
+
406
+name: Array
407
+
408
+description: Contains Array Prototypes like each, contains, and erase.
409
+
410
+license: MIT-style license.
411
+
412
+requires: Type
413
+
414
+provides: Array
415
+
416
+...
417
+*/
418
+
419
+Array.implement({
420
+
421
+	invoke: function(methodName){
422
+		var args = Array.slice(arguments, 1);
423
+		return this.map(function(item){
424
+			return item[methodName].apply(item, args);
425
+		});
426
+	},
427
+
428
+	every: function(fn, bind){
429
+		for (var i = 0, l = this.length; i < l; i++){
430
+			if ((i in this) && !fn.call(bind, this[i], i, this)) return false;
431
+		}
432
+		return true;
433
+	},
434
+
435
+	filter: function(fn, bind){
436
+		var results = [];
437
+		for (var i = 0, l = this.length; i < l; i++){
438
+			if ((i in this) && fn.call(bind, this[i], i, this)) results.push(this[i]);
439
+		}
440
+		return results;
441
+	},
442
+
443
+	clean: function(){
444
+		return this.filter(function(item){
445
+			return item != null;
446
+		});
447
+	},
448
+
449
+	indexOf: function(item, from){
450
+		var len = this.length;
451
+		for (var i = (from < 0) ? Math.max(0, len + from) : from || 0; i < len; i++){
452
+			if (this[i] === item) return i;
453
+		}
454
+		return -1;
455
+	},
456
+
457
+	map: function(fn, bind){
458
+		var results = [];
459
+		for (var i = 0, l = this.length; i < l; i++){
460
+			if (i in this) results[i] = fn.call(bind, this[i], i, this);
461
+		}
462
+		return results;
463
+	},
464
+
465
+	some: function(fn, bind){
466
+		for (var i = 0, l = this.length; i < l; i++){
467
+			if ((i in this) && fn.call(bind, this[i], i, this)) return true;
468
+		}
469
+		return false;
470
+	},
471
+
472
+	associate: function(keys){
473
+		var obj = {}, length = Math.min(this.length, keys.length);
474
+		for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
475
+		return obj;
476
+	},
477
+
478
+	link: function(object){
479
+		var result = {};
480
+		for (var i = 0, l = this.length; i < l; i++){
481
+			for (var key in object){
482
+				if (object[key](this[i])){
483
+					result[key] = this[i];
484
+					delete object[key];
485
+					break;
486
+				}
487
+			}
488
+		}
489
+		return result;
490
+	},
491
+
492
+	contains: function(item, from){
493
+		return this.indexOf(item, from) != -1;
494
+	},
495
+
496
+	append: function(array){
497
+		this.push.apply(this, array);
498
+		return this;
499
+	},
500
+
501
+	getLast: function(){
502
+		return (this.length) ? this[this.length - 1] : null;
503
+	},
504
+
505
+	getRandom: function(){
506
+		return (this.length) ? this[Number.random(0, this.length - 1)] : null;
507
+	},
508
+
509
+	include: function(item){
510
+		if (!this.contains(item)) this.push(item);
511
+		return this;
512
+	},
513
+
514
+	combine: function(array){
515
+		for (var i = 0, l = array.length; i < l; i++) this.include(array[i]);
516
+		return this;
517
+	},
518
+
519
+	erase: function(item){
520
+		for (var i = this.length; i--;){
521
+			if (this[i] === item) this.splice(i, 1);
522
+		}
523
+		return this;
524
+	},
525
+
526
+	empty: function(){
527
+		this.length = 0;
528
+		return this;
529
+	},
530
+
531
+	flatten: function(){
532
+		var array = [];
533
+		for (var i = 0, l = this.length; i < l; i++){
534
+			var type = typeOf(this[i]);
535
+			if (type == 'null') continue;
536
+			array = array.concat((type == 'array' || type == 'collection' || type == 'arguments' || instanceOf(this[i], Array)) ? Array.flatten(this[i]) : this[i]);
537
+		}
538
+		return array;
539
+	},
540
+
541
+	pick: function(){
542
+		for (var i = 0, l = this.length; i < l; i++){
543
+			if (this[i] != null) return this[i];
544
+		}
545
+		return null;
546
+	},
547
+
548
+	hexToRgb: function(array){
549
+		if (this.length != 3) return null;
550
+		var rgb = this.map(function(value){
551
+			if (value.length == 1) value += value;
552
+			return value.toInt(16);
553
+		});
554
+		return (array) ? rgb : 'rgb(' + rgb + ')';
555
+	},
556
+
557
+	rgbToHex: function(array){
558
+		if (this.length < 3) return null;
559
+		if (this.length == 4 && this[3] == 0 && !array) return 'transparent';
560
+		var hex = [];
561
+		for (var i = 0; i < 3; i++){
562
+			var bit = (this[i] - 0).toString(16);
563
+			hex.push((bit.length == 1) ? '0' + bit : bit);
564
+		}
565
+		return (array) ? hex : '#' + hex.join('');
566
+	}
567
+
568
+});
569
+
570
+
571
+
572
+
573
+/*
574
+---
575
+
576
+name: String
577
+
578
+description: Contains String Prototypes like camelCase, capitalize, test, and toInt.
579
+
580
+license: MIT-style license.
581
+
582
+requires: Type
583
+
584
+provides: String
585
+
586
+...
587
+*/
588
+
589
+String.implement({
590
+
591
+	test: function(regex, params){
592
+		return ((typeOf(regex) == 'regexp') ? regex : new RegExp('' + regex, params)).test(this);
593
+	},
594
+
595
+	contains: function(string, separator){
596
+		return (separator) ? (separator + this + separator).indexOf(separator + string + separator) > -1 : this.indexOf(string) > -1;
597
+	},
598
+
599
+	trim: function(){
600
+		return this.replace(/^\s+|\s+$/g, '');
601
+	},
602
+
603
+	clean: function(){
604
+		return this.replace(/\s+/g, ' ').trim();
605
+	},
606
+
607
+	camelCase: function(){
608
+		return this.replace(/-\D/g, function(match){
609
+			return match.charAt(1).toUpperCase();
610
+		});
611
+	},
612
+
613
+	hyphenate: function(){
614
+		return this.replace(/[A-Z]/g, function(match){
615
+			return ('-' + match.charAt(0).toLowerCase());
616
+		});
617
+	},
618
+
619
+	capitalize: function(){
620
+		return this.replace(/\b[a-z]/g, function(match){
621
+			return match.toUpperCase();
622
+		});
623
+	},
624
+
625
+	escapeRegExp: function(){
626
+		return this.replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1');
627
+	},
628
+
629
+	toInt: function(base){
630
+		return parseInt(this, base || 10);
631
+	},
632
+
633
+	toFloat: function(){
634
+		return parseFloat(this);
635
+	},
636
+
637
+	hexToRgb: function(array){
638
+		var hex = this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
639
+		return (hex) ? hex.slice(1).hexToRgb(array) : null;
640
+	},
641
+
642
+	rgbToHex: function(array){
643
+		var rgb = this.match(/\d{1,3}/g);
644
+		return (rgb) ? rgb.rgbToHex(array) : null;
645
+	},
646
+
647
+	substitute: function(object, regexp){
648
+		return this.replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){
649
+			if (match.charAt(0) == '\\') return match.slice(1);
650
+			return (object[name] != null) ? object[name] : '';
651
+		});
652
+	}
653
+
654
+});
655
+
656
+
657
+/*
658
+---
659
+
660
+name: Number
661
+
662
+description: Contains Number Prototypes like limit, round, times, and ceil.
663
+
664
+license: MIT-style license.
665
+
666
+requires: Type
667
+
668
+provides: Number
669
+
670
+...
671
+*/
672
+
673
+Number.implement({
674
+
675
+	limit: function(min, max){
676
+		return Math.min(max, Math.max(min, this));
677
+	},
678
+
679
+	round: function(precision){
680
+		precision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0);
681
+		return Math.round(this * precision) / precision;
682
+	},
683
+
684
+	times: function(fn, bind){
685
+		for (var i = 0; i < this; i++) fn.call(bind, i, this);
686
+	},
687
+
688
+	toFloat: function(){
689
+		return parseFloat(this);
690
+	},
691
+
692
+	toInt: function(base){
693
+		return parseInt(this, base || 10);
694
+	}
695
+
696
+});
697
+
698
+Number.alias('each', 'times');
699
+
700
+(function(math){
701
+	var methods = {};
702
+	math.each(function(name){
703
+		if (!Number[name]) methods[name] = function(){
704
+			return Math[name].apply(null, [this].concat(Array.from(arguments)));
705
+		};
706
+	});
707
+	Number.implement(methods);
708
+})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']);
709
+
710
+
711
+/*
712
+---
713
+
714
+name: Function
715
+
716
+description: Contains Function Prototypes like create, bind, pass, and delay.
717
+
718
+license: MIT-style license.
719
+
720
+requires: Type
721
+
722
+provides: Function
723
+
724
+...
725
+*/
726
+
727
+Function.extend({
728
+
729
+	attempt: function(){
730
+		for (var i = 0, l = arguments.length; i < l; i++){
731
+			try {
732
+				return arguments[i]();
733
+			} catch (e){}
734
+		}
735
+		return null;
736
+	}
737
+
738
+});
739
+
740
+Function.implement({
741
+
742
+	attempt: function(args, bind){
743
+		try {
744
+			return this.apply(bind, Array.from(args));
745
+		} catch (e){}
746
+
747
+		return null;
748
+	},
749
+
750
+	bind: function(bind){
751
+		var self = this,
752
+			args = (arguments.length > 1) ? Array.slice(arguments, 1) : null;
753
+
754
+		return function(){
755
+			if (!args && !arguments.length) return self.call(bind);
756
+			if (args && arguments.length) return self.apply(bind, args.concat(Array.from(arguments)));
757
+			return self.apply(bind, args || arguments);
758
+		};
759
+	},
760
+
761
+	pass: function(args, bind){
762
+		var self = this;
763
+		if (args != null) args = Array.from(args);
764
+		return function(){
765
+			return self.apply(bind, args || arguments);
766
+		};
767
+	},
768
+
769
+	delay: function(delay, bind, args){
770
+		return setTimeout(this.pass((args == null ? [] : args), bind), delay);
771
+	},
772
+
773
+	periodical: function(periodical, bind, args){
774
+		return setInterval(this.pass((args == null ? [] : args), bind), periodical);
775
+	}
776
+
777
+});
778
+
779
+
780
+
781
+
782
+/*
783
+---
784
+
785
+name: Object
786
+
787
+description: Object generic methods
788
+
789
+license: MIT-style license.
790
+
791
+requires: Type
792
+
793
+provides: [Object, Hash]
794
+
795
+...
796
+*/
797
+
798
+(function(){
799
+
800
+var hasOwnProperty = Object.prototype.hasOwnProperty;
801
+
802
+Object.extend({
803
+
804
+	subset: function(object, keys){
805
+		var results = {};
806
+		for (var i = 0, l = keys.length; i < l; i++){
807
+			var k = keys[i];
808
+			results[k] = object[k];
809
+		}
810
+		return results;
811
+	},
812
+
813
+	map: function(object, fn, bind){
814
+		var results = {};
815
+		for (var key in object){
816
+			if (hasOwnProperty.call(object, key)) results[key] = fn.call(bind, object[key], key, object);
817
+		}
818
+		return results;
819
+	},
820
+
821
+	filter: function(object, fn, bind){
822
+		var results = {};
823
+		Object.each(object, function(value, key){
824
+			if (fn.call(bind, value, key, object)) results[key] = value;
825
+		});
826
+		return results;
827
+	},
828
+
829
+	every: function(object, fn, bind){
830
+		for (var key in object){
831
+			if (hasOwnProperty.call(object, key) && !fn.call(bind, object[key], key)) return false;
832
+		}
833
+		return true;
834
+	},
835
+
836
+	some: function(object, fn, bind){
837
+		for (var key in object){
838
+			if (hasOwnProperty.call(object, key) && fn.call(bind, object[key], key)) return true;
839
+		}
840
+		return false;
841
+	},
842
+
843
+	keys: function(object){
844
+		var keys = [];
845
+		for (var key in object){
846
+			if (hasOwnProperty.call(object, key)) keys.push(key);
847
+		}
848
+		return keys;
849
+	},
850
+
851
+	values: function(object){
852
+		var values = [];
853
+		for (var key in object){
854
+			if (hasOwnProperty.call(object, key)) values.push(object[key]);
855
+		}
856
+		return values;
857
+	},
858
+
859
+	getLength: function(object){
860
+		return Object.keys(object).length;
861
+	},
862
+
863
+	keyOf: function(object, value){
864
+		for (var key in object){
865
+			if (hasOwnProperty.call(object, key) && object[key] === value) return key;
866
+		}
867
+		return null;
868
+	},
869
+
870
+	contains: function(object, value){
871
+		return Object.keyOf(object, value) != null;
872
+	},
873
+
874
+	toQueryString: function(object, base){
875
+		var queryString = [];
876
+
877
+		Object.each(object, function(value, key){
878
+			if (base) key = base + '[' + key + ']';
879
+			var result;
880
+			switch (typeOf(value)){
881
+				case 'object': result = Object.toQueryString(value, key); break;
882
+				case 'array':
883
+					var qs = {};
884
+					value.each(function(val, i){
885
+						qs[i] = val;
886
+					});
887
+					result = Object.toQueryString(qs, key);
888
+				break;
889
+				default: result = key + '=' + encodeURIComponent(value);
890
+			}
891
+			if (value != null) queryString.push(result);
892
+		});
893
+
894
+		return queryString.join('&');
895
+	}
896
+
897
+});
898
+
899
+})();
900
+
901
+
902
+
903
+
904
+/*
905
+---
906
+
907
+name: Browser
908
+
909
+description: The Browser Object. Contains Browser initialization, Window and Document, and the Browser Hash.
910
+
911
+license: MIT-style license.
912
+
913
+requires: [Array, Function, Number, String]
914
+
915
+provides: [Browser, Window, Document]
916
+
917
+...
918
+*/
919
+
920
+(function(){
921
+
922
+var document = this.document;
923
+var window = document.window = this;
924
+
925
+var UID = 1;
926
+
927
+this.$uid = (window.ActiveXObject) ? function(item){
928
+	return (item.uid || (item.uid = [UID++]))[0];
929
+} : function(item){
930
+	return item.uid || (item.uid = UID++);
931
+};
932
+
933
+$uid(window);
934
+$uid(document);
935
+
936
+var ua = navigator.userAgent.toLowerCase(),
937
+	platform = navigator.platform.toLowerCase(),
938
+	UA = ua.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/) || [null, 'unknown', 0],
939
+	mode = UA[1] == 'ie' && document.documentMode;
940
+
941
+var Browser = this.Browser = {
942
+
943
+	extend: Function.prototype.extend,
944
+
945
+	name: (UA[1] == 'version') ? UA[3] : UA[1],
946
+
947
+	version: mode || parseFloat((UA[1] == 'opera' && UA[4]) ? UA[4] : UA[2]),
948
+
949
+	Platform: {
950
+		name: ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || platform.match(/mac|win|linux/) || ['other'])[0]
951
+	},
952
+
953
+	Features: {
954
+		xpath: !!(document.evaluate),
955
+		air: !!(window.runtime),
956
+		query: !!(document.querySelector),
957
+		json: !!(window.JSON)
958
+	},
959
+
960
+	Plugins: {}
961
+
962
+};
963
+
964
+Browser[Browser.name] = true;
965
+Browser[Browser.name + parseInt(Browser.version, 10)] = true;
966
+Browser.Platform[Browser.Platform.name] = true;
967
+
968
+// Request
969
+
970
+Browser.Request = (function(){
971
+
972
+	var XMLHTTP = function(){
973
+		return new XMLHttpRequest();
974
+	};
975
+
976
+	var MSXML2 = function(){
977
+		return new ActiveXObject('MSXML2.XMLHTTP');
978
+	};
979
+
980
+	var MSXML = function(){
981
+		return new ActiveXObject('Microsoft.XMLHTTP');
982
+	};
983
+
984
+	return Function.attempt(function(){
985
+		XMLHTTP();
986
+		return XMLHTTP;
987
+	}, function(){
988
+		MSXML2();
989
+		return MSXML2;
990
+	}, function(){
991
+		MSXML();
992
+		return MSXML;
993
+	});
994
+
995
+})();
996
+
997
+Browser.Features.xhr = !!(Browser.Request);
998
+
999
+// Flash detection
1000
+
1001
+var version = (Function.attempt(function(){
1002
+	return navigator.plugins['Shockwave Flash'].description;
1003
+}, function(){
1004
+	return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
1005
+}) || '0 r0').match(/\d+/g);
1006
+
1007
+Browser.Plugins.Flash = {
1008
+	version: Number(version[0] || '0.' + version[1]) || 0,
1009
+	build: Number(version[2]) || 0
1010
+};
1011
+
1012
+// String scripts
1013
+
1014
+Browser.exec = function(text){
1015
+	if (!text) return text;
1016
+	if (window.execScript){
1017
+		window.execScript(text);
1018
+	} else {
1019
+		var script = document.createElement('script');
1020
+		script.setAttribute('type', 'text/javascript');
1021
+		script.text = text;
1022
+		document.head.appendChild(script);
1023
+		document.head.removeChild(script);
1024
+	}
1025
+	return text;
1026
+};
1027
+
1028
+String.implement('stripScripts', function(exec){
1029
+	var scripts = '';
1030
+	var text = this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(all, code){
1031
+		scripts += code + '\n';
1032
+		return '';
1033
+	});
1034
+	if (exec === true) Browser.exec(scripts);
1035
+	else if (typeOf(exec) == 'function') exec(scripts, text);
1036
+	return text;
1037
+});
1038
+
1039
+// Window, Document
1040
+
1041
+Browser.extend({
1042
+	Document: this.Document,
1043
+	Window: this.Window,
1044
+	Element: this.Element,
1045
+	Event: this.Event
1046
+});
1047
+
1048
+this.Window = this.$constructor = new Type('Window', function(){});
1049
+
1050
+this.$family = Function.from('window').hide();
1051
+
1052
+Window.mirror(function(name, method){
1053
+	window[name] = method;
1054
+});
1055
+
1056
+this.Document = document.$constructor = new Type('Document', function(){});
1057
+
1058
+document.$family = Function.from('document').hide();
1059
+
1060
+Document.mirror(function(name, method){
1061
+	document[name] = method;
1062
+});
1063
+
1064
+document.html = document.documentElement;
1065
+document.head = document.getElementsByTagName('head')[0];
1066
+
1067
+if (document.execCommand) try {
1068
+	document.execCommand("BackgroundImageCache", false, true);
1069
+} catch (e){}
1070
+
1071
+if (this.attachEvent && !this.addEventListener){
1072
+	var unloadEvent = function(){
1073
+		this.detachEvent('onunload', unloadEvent);
1074
+		document.head = document.html = document.window = null;
1075
+	};
1076
+	this.attachEvent('onunload', unloadEvent);
1077
+}
1078
+
1079
+// IE fails on collections and <select>.options (refers to <select>)
1080
+var arrayFrom = Array.from;
1081
+try {
1082
+	arrayFrom(document.html.childNodes);
1083
+} catch(e){
1084
+	Array.from = function(item){
1085
+		if (typeof item != 'string' && Type.isEnumerable(item) && typeOf(item) != 'array'){
1086
+			var i = item.length, array = new Array(i);
1087
+			while (i--) array[i] = item[i];
1088
+			return array;
1089
+		}
1090
+		return arrayFrom(item);
1091
+	};
1092
+
1093
+	var prototype = Array.prototype,
1094
+		slice = prototype.slice;
1095
+	['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice'].each(function(name){
1096
+		var method = prototype[name];
1097
+		Array[name] = function(item){
1098
+			return method.apply(Array.from(item), slice.call(arguments, 1));
1099
+		};
1100
+	});
1101
+}
1102
+
1103
+
1104
+
1105
+}).call(this);
1106
+
1107
+
1108
+/*
1109
+---
1110
+
1111
+name: Event
1112
+
1113
+description: Contains the Event Class, to make the event object cross-browser.
1114
+
1115
+license: MIT-style license.
1116
+
1117
+requires: [Window, Document, Array, Function, String, Object]
1118
+
1119
+provides: Event
1120
+
1121
+...
1122
+*/
1123
+
1124
+var Event = new Type('Event', function(event, win){
1125
+	if (!win) win = window;
1126
+	var doc = win.document;
1127
+	event = event || win.event;
1128
+	if (event.$extended) return event;
1129
+	this.$extended = true;
1130
+	var type = event.type,
1131
+		target = event.target || event.srcElement,
1132
+		page = {},
1133
+		client = {},
1134
+		related = null,
1135
+		rightClick, wheel, code, key;
1136
+	while (target && target.nodeType == 3) target = target.parentNode;
1137
+
1138
+	if (type.indexOf('key') != -1){
1139
+		code = event.which || event.keyCode;
1140
+		key = Object.keyOf(Event.Keys, code);
1141
+		if (type == 'keydown'){
1142
+			var fKey = code - 111;
1143
+			if (fKey > 0 && fKey < 13) key = 'f' + fKey;
1144
+		}
1145
+		if (!key) key = String.fromCharCode(code).toLowerCase();
1146
+	} else if ((/click|mouse|menu/i).test(type)){
1147
+		doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
1148
+		page = {
1149
+			x: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft,
1150
+			y: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop
1151
+		};
1152
+		client = {
1153
+			x: (event.pageX != null) ? event.pageX - win.pageXOffset : event.clientX,
1154
+			y: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY
1155
+		};
1156
+		if ((/DOMMouseScroll|mousewheel/).test(type)){
1157
+			wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3;
1158
+		}
1159
+		rightClick = (event.which == 3) || (event.button == 2);
1160
+		if ((/over|out/).test(type)){
1161
+			related = event.relatedTarget || event[(type == 'mouseover' ? 'from' : 'to') + 'Element'];
1162
+			var testRelated = function(){
1163
+				while (related && related.nodeType == 3) related = related.parentNode;
1164
+				return true;
1165
+			};
1166
+			var hasRelated = (Browser.firefox2) ? testRelated.attempt() : testRelated();
1167
+			related = (hasRelated) ? related : null;
1168
+		}
1169
+	} else if ((/gesture|touch/i).test(type)){
1170
+		this.rotation = event.rotation;
1171
+		this.scale = event.scale;
1172
+		this.targetTouches = event.targetTouches;
1173
+		this.changedTouches = event.changedTouches;
1174
+		var touches = this.touches = event.touches;
1175
+		if (touches && touches[0]){
1176
+			var touch = touches[0];
1177
+			page = {x: touch.pageX, y: touch.pageY};
1178
+			client = {x: touch.clientX, y: touch.clientY};
1179
+		}
1180
+	}
1181
+
1182
+	return Object.append(this, {
1183
+		event: event,
1184
+		type: type,
1185
+
1186
+		page: page,
1187
+		client: client,
1188
+		rightClick: rightClick,
1189
+
1190
+		wheel: wheel,
1191
+
1192
+		relatedTarget: document.id(related),
1193
+		target: document.id(target),
1194
+
1195
+		code: code,
1196
+		key: key,
1197
+
1198
+		shift: event.shiftKey,
1199
+		control: event.ctrlKey,
1200
+		alt: event.altKey,
1201
+		meta: event.metaKey
1202
+	});
1203
+});
1204
+
1205
+Event.Keys = {
1206
+	'enter': 13,
1207
+	'up': 38,
1208
+	'down': 40,
1209
+	'left': 37,
1210
+	'right': 39,
1211
+	'esc': 27,
1212
+	'space': 32,
1213
+	'backspace': 8,
1214
+	'tab': 9,
1215
+	'delete': 46
1216
+};
1217
+
1218
+
1219
+
1220
+Event.implement({
1221
+
1222
+	stop: function(){
1223
+		return this.stopPropagation().preventDefault();
1224
+	},
1225
+
1226
+	stopPropagation: function(){
1227
+		if (this.event.stopPropagation) this.event.stopPropagation();
1228
+		else this.event.cancelBubble = true;
1229
+		return this;
1230
+	},
1231
+
1232
+	preventDefault: function(){
1233
+		if (this.event.preventDefault) this.event.preventDefault();
1234
+		else this.event.returnValue = false;
1235
+		return this;
1236
+	}
1237
+
1238
+});
1239
+
1240
+
1241
+/*
1242
+---
1243
+
1244
+name: Class
1245
+
1246
+description: Contains the Class Function for easily creating, extending, and implementing reusable Classes.
1247
+
1248
+license: MIT-style license.
1249
+
1250
+requires: [Array, String, Function, Number]
1251
+
1252
+provides: Class
1253
+
1254
+...
1255
+*/
1256
+
1257
+(function(){
1258
+
1259
+var Class = this.Class = new Type('Class', function(params){
1260
+	if (instanceOf(params, Function)) params = {initialize: params};
1261
+
1262
+	var newClass = function(){
1263
+		reset(this);
1264
+		if (newClass.$prototyping) return this;
1265
+		this.$caller = null;
1266
+		var value = (this.initialize) ? this.initialize.apply(this, arguments) : this;
1267
+		this.$caller = this.caller = null;
1268
+		return value;
1269
+	}.extend(this).implement(params);
1270
+
1271
+	newClass.$constructor = Class;
1272
+	newClass.prototype.$constructor = newClass;
1273
+	newClass.prototype.parent = parent;
1274
+
1275
+	return newClass;
1276
+});
1277
+
1278
+var parent = function(){
1279
+	if (!this.$caller) throw new Error('The method "parent" cannot be called.');
1280
+	var name = this.$caller.$name,
1281
+		parent = this.$caller.$owner.parent,
1282
+		previous = (parent) ? parent.prototype[name] : null;
1283
+	if (!previous) throw new Error('The method "' + name + '" has no parent.');
1284
+	return previous.apply(this, arguments);
1285
+};
1286
+
1287
+var reset = function(object){
1288
+	for (var key in object){
1289
+		var value = object[key];
1290
+		switch (typeOf(value)){
1291
+			case 'object':
1292
+				var F = function(){};
1293
+				F.prototype = value;
1294
+				object[key] = reset(new F);
1295
+			break;
1296
+			case 'array': object[key] = value.clone(); break;
1297
+		}
1298
+	}
1299
+	return object;
1300
+};
1301
+
1302
+var wrap = function(self, key, method){
1303
+	if (method.$origin) method = method.$origin;
1304
+	var wrapper = function(){
1305
+		if (method.$protected && this.$caller == null) throw new Error('The method "' + key + '" cannot be called.');
1306
+		var caller = this.caller, current = this.$caller;
1307
+		this.caller = current; this.$caller = wrapper;
1308
+		var result = method.apply(this, arguments);
1309
+		this.$caller = current; this.caller = caller;
1310
+		return result;
1311
+	}.extend({$owner: self, $origin: method, $name: key});
1312
+	return wrapper;
1313
+};
1314
+
1315
+var implement = function(key, value, retain){
1316
+	if (Class.Mutators.hasOwnProperty(key)){
1317
+		value = Class.Mutators[key].call(this, value);
1318
+		if (value == null) return this;
1319
+	}
1320
+
1321
+	if (typeOf(value) == 'function'){
1322
+		if (value.$hidden) return this;
1323
+		this.prototype[key] = (retain) ? value : wrap(this, key, value);
1324
+	} else {
1325
+		Object.merge(this.prototype, key, value);
1326
+	}
1327
+
1328
+	return this;
1329
+};
1330
+
1331
+var getInstance = function(klass){
1332
+	klass.$prototyping = true;
1333
+	var proto = new klass;
1334
+	delete klass.$prototyping;
1335
+	return proto;
1336
+};
1337
+
1338
+Class.implement('implement', implement.overloadSetter());
1339
+
1340
+Class.Mutators = {
1341
+
1342
+	Extends: function(parent){
1343
+		this.parent = parent;
1344
+		this.prototype = getInstance(parent);
1345
+	},
1346
+
1347
+	Implements: function(items){
1348
+		Array.from(items).each(function(item){
1349
+			var instance = new item;
1350
+			for (var key in instance) implement.call(this, key, instance[key], true);
1351
+		}, this);
1352
+	}
1353
+};
1354
+
1355
+}).call(this);
1356
+
1357
+
1358
+/*
1359
+---
1360
+
1361
+name: Class.Extras
1362
+
1363
+description: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks.
1364
+
1365
+license: MIT-style license.
1366
+
1367
+requires: Class
1368
+
1369
+provides: [Class.Extras, Chain, Events, Options]
1370
+
1371
+...
1372
+*/
1373
+
1374
+(function(){
1375
+
1376
+this.Chain = new Class({
1377
+
1378
+	$chain: [],
1379
+
1380
+	chain: function(){
1381
+		this.$chain.append(Array.flatten(arguments));
1382
+		return this;
1383
+	},
1384
+
1385
+	callChain: function(){
1386
+		return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false;
1387
+	},
1388
+
1389
+	clearChain: function(){
1390
+		this.$chain.empty();
1391
+		return this;
1392
+	}
1393
+
1394
+});
1395
+
1396
+var removeOn = function(string){
1397
+	return string.replace(/^on([A-Z])/, function(full, first){
1398
+		return first.toLowerCase();
1399
+	});
1400
+};
1401
+
1402
+this.Events = new Class({
1403
+
1404
+	$events: {},
1405
+
1406
+	addEvent: function(type, fn, internal){
1407
+		type = removeOn(type);
1408
+
1409
+
1410
+
1411
+		this.$events[type] = (this.$events[type] || []).include(fn);
1412
+		if (internal) fn.internal = true;
1413
+		return this;
1414
+	},
1415
+
1416
+	addEvents: function(events){
1417
+		for (var type in events) this.addEvent(type, events[type]);
1418
+		return this;
1419
+	},
1420
+
1421
+	fireEvent: function(type, args, delay){
1422
+		type = removeOn(type);
1423
+		var events = this.$events[type];
1424
+		if (!events) return this;
1425
+		args = Array.from(args);
1426
+		events.each(function(fn){
1427
+			if (delay) fn.delay(delay, this, args);
1428
+			else fn.apply(this, args);
1429
+		}, this);
1430
+		return this;
1431
+	},
1432
+
1433
+	removeEvent: function(type, fn){
1434
+		type = removeOn(type);
1435
+		var events = this.$events[type];
1436
+		if (events && !fn.internal){
1437
+			var index =  events.indexOf(fn);
1438
+			if (index != -1) delete events[index];
1439
+		}
1440
+		return this;
1441
+	},
1442
+
1443
+	removeEvents: function(events){
1444
+		var type;
1445
+		if (typeOf(events) == 'object'){
1446
+			for (type in events) this.removeEvent(type, events[type]);
1447
+			return this;
1448
+		}
1449
+		if (events) events = removeOn(events);
1450
+		for (type in this.$events){
1451
+			if (events && events != type) continue;
1452
+			var fns = this.$events[type];
1453
+			for (var i = fns.length; i--;) if (i in fns){
1454
+				this.removeEvent(type, fns[i]);
1455
+			}
1456
+		}
1457
+		return this;
1458
+	}
1459
+
1460
+});
1461
+
1462
+this.Options = new Class({
1463
+
1464
+	setOptions: function(){
1465
+		var options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments));
1466
+		if (this.addEvent) for (var option in options){
1467
+			if (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue;
1468
+			this.addEvent(option, options[option]);
1469
+			delete options[option];
1470
+		}
1471
+		return this;
1472
+	}
1473
+
1474
+});
1475
+
1476
+}).call(this);
1477
+
1478
+
1479
+/*
1480
+---
1481
+name: Slick.Parser
1482
+description: Standalone CSS3 Selector parser
1483
+provides: Slick.Parser
1484
+...
1485
+*/
1486
+
1487
+;(function(){
1488
+
1489
+var parsed,
1490
+	separatorIndex,
1491
+	combinatorIndex,
1492
+	reversed,
1493
+	cache = {},
1494
+	reverseCache = {},
1495
+	reUnescape = /\\/g;
1496
+
1497
+var parse = function(expression, isReversed){
1498
+	if (expression == null) return null;
1499
+	if (expression.Slick === true) return expression;
1500
+	expression = ('' + expression).replace(/^\s+|\s+$/g, '');
1501
+	reversed = !!isReversed;
1502
+	var currentCache = (reversed) ? reverseCache : cache;
1503
+	if (currentCache[expression]) return currentCache[expression];
1504
+	parsed = {
1505
+		Slick: true,
1506
+		expressions: [],
1507
+		raw: expression,
1508
+		reverse: function(){
1509
+			return parse(this.raw, true);
1510
+		}
1511
+	};
1512
+	separatorIndex = -1;
1513
+	while (expression != (expression = expression.replace(regexp, parser)));
1514
+	parsed.length = parsed.expressions.length;
1515
+	return currentCache[parsed.raw] = (reversed) ? reverse(parsed) : parsed;
1516
+};
1517
+
1518
+var reverseCombinator = function(combinator){
1519
+	if (combinator === '!') return ' ';
1520
+	else if (combinator === ' ') return '!';
1521
+	else if ((/^!/).test(combinator)) return combinator.replace(/^!/, '');
1522
+	else return '!' + combinator;
1523
+};
1524
+
1525
+var reverse = function(expression){
1526
+	var expressions = expression.expressions;
1527
+	for (var i = 0; i < expressions.length; i++){
1528
+		var exp = expressions[i];
1529
+		var last = {parts: [], tag: '*', combinator: reverseCombinator(exp[0].combinator)};
1530
+
1531
+		for (var j = 0; j < exp.length; j++){
1532
+			var cexp = exp[j];
1533
+			if (!cexp.reverseCombinator) cexp.reverseCombinator = ' ';
1534
+			cexp.combinator = cexp.reverseCombinator;
1535
+			delete cexp.reverseCombinator;
1536
+		}
1537
+
1538
+		exp.reverse().push(last);
1539
+	}
1540
+	return expression;
1541
+};
1542
+
1543
+var escapeRegExp = function(string){// Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan <http://stevenlevithan.com/regex/xregexp/> MIT License
1544
+	return string.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, function(match){
1545
+		return '\\' + match;
1546
+	});
1547
+};
1548
+
1549
+var regexp = new RegExp(
1550
+/*
1551
+#!/usr/bin/env ruby
1552
+puts "\t\t" + DATA.read.gsub(/\(\?x\)|\s+#.*$|\s+|\\$|\\n/,'')
1553
+__END__
1554
+	"(?x)^(?:\
1555
+	  \\s* ( , ) \\s*               # Separator          \n\
1556
+	| \\s* ( <combinator>+ ) \\s*   # Combinator         \n\
1557
+	|      ( \\s+ )                 # CombinatorChildren \n\
1558
+	|      ( <unicode>+ | \\* )     # Tag                \n\
1559
+	| \\#  ( <unicode>+       )     # ID                 \n\
1560
+	| \\.  ( <unicode>+       )     # ClassName          \n\
1561
+	|                               # Attribute          \n\
1562
+	\\[  \
1563
+		\\s* (<unicode1>+)  (?:  \
1564
+			\\s* ([*^$!~|]?=)  (?:  \
1565
+				\\s* (?:\
1566
+					([\"']?)(.*?)\\9 \
1567
+				)\
1568
+			)  \
1569
+		)?  \\s*  \
1570
+	\\](?!\\]) \n\
1571
+	|   :+ ( <unicode>+ )(?:\
1572
+	\\( (?:\
1573
+		(?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+)\
1574
+	) \\)\
1575
+	)?\
1576
+	)"
1577
+*/
1578
+	"^(?:\\s*(,)\\s*|\\s*(<combinator>+)\\s*|(\\s+)|(<unicode>+|\\*)|\\#(<unicode>+)|\\.(<unicode>+)|\\[\\s*(<unicode1>+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(<unicode>+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)"
1579
+	.replace(/<combinator>/, '[' + escapeRegExp(">+~`!@$%^&={}\\;</") + ']')
1580
+	.replace(/<unicode>/g, '(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
1581
+	.replace(/<unicode1>/g, '(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
1582
+);
1583
+
1584
+function parser(
1585
+	rawMatch,
1586
+
1587
+	separator,
1588
+	combinator,
1589
+	combinatorChildren,
1590
+
1591
+	tagName,
1592
+	id,
1593
+	className,
1594
+
1595
+	attributeKey,
1596
+	attributeOperator,
1597
+	attributeQuote,
1598
+	attributeValue,
1599
+
1600
+	pseudoMarker,
1601
+	pseudoClass,
1602
+	pseudoQuote,
1603
+	pseudoClassQuotedValue,
1604
+	pseudoClassValue
1605
+){
1606
+	if (separator || separatorIndex === -1){
1607
+		parsed.expressions[++separatorIndex] = [];
1608
+		combinatorIndex = -1;
1609
+		if (separator) return '';
1610
+	}
1611
+
1612
+	if (combinator || combinatorChildren || combinatorIndex === -1){
1613
+		combinator = combinator || ' ';
1614
+		var currentSeparator = parsed.expressions[separatorIndex];
1615
+		if (reversed && currentSeparator[combinatorIndex])
1616
+			currentSeparator[combinatorIndex].reverseCombinator = reverseCombinator(combinator);
1617
+		currentSeparator[++combinatorIndex] = {combinator: combinator, tag: '*'};
1618
+	}
1619
+
1620
+	var currentParsed = parsed.expressions[separatorIndex][combinatorIndex];
1621
+
1622
+	if (tagName){
1623
+		currentParsed.tag = tagName.replace(reUnescape, '');
1624
+
1625
+	} else if (id){
1626
+		currentParsed.id = id.replace(reUnescape, '');
1627
+
1628
+	} else if (className){
1629
+		className = className.replace(reUnescape, '');
1630
+
1631
+		if (!currentParsed.classList) currentParsed.classList = [];
1632
+		if (!currentParsed.classes) currentParsed.classes = [];
1633
+		currentParsed.classList.push(className);
1634
+		currentParsed.classes.push({
1635
+			value: className,
1636
+			regexp: new RegExp('(^|\\s)' + escapeRegExp(className) + '(\\s|$)')
1637
+		});
1638
+
1639
+	} else if (pseudoClass){
1640
+		pseudoClassValue = pseudoClassValue || pseudoClassQuotedValue;
1641
+		pseudoClassValue = pseudoClassValue ? pseudoClassValue.replace(reUnescape, '') : null;
1642
+
1643
+		if (!currentParsed.pseudos) currentParsed.pseudos = [];
1644
+		currentParsed.pseudos.push({
1645
+			key: pseudoClass.replace(reUnescape, ''),
1646
+			value: pseudoClassValue,
1647
+			type: pseudoMarker.length == 1 ? 'class' : 'element'
1648
+		});
1649
+
1650
+	} else if (attributeKey){
1651
+		attributeKey = attributeKey.replace(reUnescape, '');
1652
+		attributeValue = (attributeValue || '').replace(reUnescape, '');
1653
+
1654
+		var test, regexp;
1655
+
1656
+		switch (attributeOperator){
1657
+			case '^=' : regexp = new RegExp(       '^'+ escapeRegExp(attributeValue)            ); break;
1658
+			case '$=' : regexp = new RegExp(            escapeRegExp(attributeValue) +'$'       ); break;
1659
+			case '~=' : regexp = new RegExp( '(^|\\s)'+ escapeRegExp(attributeValue) +'(\\s|$)' ); break;
1660
+			case '|=' : regexp = new RegExp(       '^'+ escapeRegExp(attributeValue) +'(-|$)'   ); break;
1661
+			case  '=' : test = function(value){
1662
+				return attributeValue == value;
1663
+			}; break;
1664
+			case '*=' : test = function(value){
1665
+				return value && value.indexOf(attributeValue) > -1;
1666
+			}; break;
1667
+			case '!=' : test = function(value){
1668
+				return attributeValue != value;
1669
+			}; break;
1670
+			default   : test = function(value){
1671
+				return !!value;
1672
+			};
1673
+		}
1674
+
1675
+		if (attributeValue == '' && (/^[*$^]=$/).test(attributeOperator)) test = function(){
1676
+			return false;
1677
+		};
1678
+
1679
+		if (!test) test = function(value){
1680
+			return value && regexp.test(value);
1681
+		};
1682
+
1683
+		if (!currentParsed.attributes) currentParsed.attributes = [];
1684
+		currentParsed.attributes.push({
1685
+			key: attributeKey,
1686
+			operator: attributeOperator,
1687
+			value: attributeValue,
1688
+			test: test
1689
+		});
1690
+
1691
+	}
1692
+
1693
+	return '';
1694
+};
1695
+
1696
+// Slick NS
1697
+
1698
+var Slick = (this.Slick || {});
1699
+
1700
+Slick.parse = function(expression){
1701
+	return parse(expression);
1702
+};
1703
+
1704
+Slick.escapeRegExp = escapeRegExp;
1705
+
1706
+if (!this.Slick) this.Slick = Slick;
1707
+
1708
+}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ? exports : /*</CommonJS>*/this);
1709
+
1710
+
1711
+/*
1712
+---
1713
+name: Slick.Finder
1714
+description: The new, superfast css selector engine.
1715
+provides: Slick.Finder
1716
+requires: Slick.Parser
1717
+...
1718
+*/
1719
+
1720
+;(function(){
1721
+
1722
+var local = {},
1723
+	featuresCache = {},
1724
+	toString = Object.prototype.toString;
1725
+
1726
+// Feature / Bug detection
1727
+
1728
+local.isNativeCode = function(fn){
1729
+	return (/\{\s*\[native code\]\s*\}/).test('' + fn);
1730
+};
1731
+
1732
+local.isXML = function(document){
1733
+	return (!!document.xmlVersion) || (!!document.xml) || (toString.call(document) == '[object XMLDocument]') ||
1734
+	(document.nodeType == 9 && document.documentElement.nodeName != 'HTML');
1735
+};
1736
+
1737
+local.setDocument = function(document){
1738
+
1739
+	// convert elements / window arguments to document. if document cannot be extrapolated, the function returns.
1740
+	var nodeType = document.nodeType;
1741
+	if (nodeType == 9); // document
1742
+	else if (nodeType) document = document.ownerDocument; // node
1743
+	else if (document.navigator) document = document.document; // window
1744
+	else return;
1745
+
1746
+	// check if it's the old document
1747
+
1748
+	if (this.document === document) return;
1749
+	this.document = document;
1750
+
1751
+	// check if we have done feature detection on this document before
1752
+
1753
+	var root = document.documentElement,
1754
+		rootUid = this.getUIDXML(root),
1755
+		features = featuresCache[rootUid],
1756
+		feature;
1757
+
1758
+	if (features){
1759
+		for (feature in features){
1760
+			this[feature] = features[feature];
1761
+		}
1762
+		return;
1763
+	}
1764
+
1765
+	features = featuresCache[rootUid] = {};
1766
+
1767
+	features.root = root;
1768
+	features.isXMLDocument = this.isXML(document);
1769
+
1770
+	features.brokenStarGEBTN
1771
+	= features.starSelectsClosedQSA
1772
+	= features.idGetsName
1773
+	= features.brokenMixedCaseQSA
1774
+	= features.brokenGEBCN
1775
+	= features.brokenCheckedQSA
1776
+	= features.brokenEmptyAttributeQSA
1777
+	= features.isHTMLDocument
1778
+	= features.nativeMatchesSelector
1779
+	= false;
1780
+
1781
+	var starSelectsClosed, starSelectsComments,
1782
+		brokenSecondClassNameGEBCN, cachedGetElementsByClassName,
1783
+		brokenFormAttributeGetter;
1784
+
1785
+	var selected, id = 'slick_uniqueid';
1786
+	var testNode = document.createElement('div');
1787
+
1788
+	var testRoot = document.body || document.getElementsByTagName('body')[0] || root;
1789
+	testRoot.appendChild(testNode);
1790
+
1791
+	// on non-HTML documents innerHTML and getElementsById doesnt work properly
1792
+	try {
1793
+		testNode.innerHTML = '<a id="'+id+'"></a>';
1794
+		features.isHTMLDocument = !!document.getElementById(id);
1795
+	} catch(e){};
1796
+
1797
+	if (features.isHTMLDocument){
1798
+
1799
+		testNode.style.display = 'none';
1800
+
1801
+		// IE returns comment nodes for getElementsByTagName('*') for some documents
1802
+		testNode.appendChild(document.createComment(''));
1803
+		starSelectsComments = (testNode.getElementsByTagName('*').length > 1);
1804
+
1805
+		// IE returns closed nodes (EG:"</foo>") for getElementsByTagName('*') for some documents
1806
+		try {
1807
+			testNode.innerHTML = 'foo</foo>';
1808
+			selected = testNode.getElementsByTagName('*');
1809
+			starSelectsClosed = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');
1810
+		} catch(e){};
1811
+
1812
+		features.brokenStarGEBTN = starSelectsComments || starSelectsClosed;
1813
+
1814
+		// IE returns elements with the name instead of just id for getElementsById for some documents
1815
+		try {
1816
+			testNode.innerHTML = '<a name="'+ id +'"></a><b id="'+ id +'"></b>';
1817
+			features.idGetsName = document.getElementById(id) === testNode.firstChild;
1818
+		} catch(e){};
1819
+
1820
+		if (testNode.getElementsByClassName){
1821
+
1822
+			// Safari 3.2 getElementsByClassName caches results
1823
+			try {
1824
+				testNode.innerHTML = '<a class="f"></a><a class="b"></a>';
1825
+				testNode.getElementsByClassName('b').length;
1826
+				testNode.firstChild.className = 'b';
1827
+				cachedGetElementsByClassName = (testNode.getElementsByClassName('b').length != 2);
1828
+			} catch(e){};
1829
+
1830
+			// Opera 9.6 getElementsByClassName doesnt detects the class if its not the first one
1831
+			try {
1832
+				testNode.innerHTML = '<a class="a"></a><a class="f b a"></a>';
1833
+				brokenSecondClassNameGEBCN = (testNode.getElementsByClassName('a').length != 2);
1834
+			} catch(e){};
1835
+
1836
+			features.brokenGEBCN = cachedGetElementsByClassName || brokenSecondClassNameGEBCN;
1837
+		}
1838
+
1839
+		if (testNode.querySelectorAll){
1840
+			// IE 8 returns closed nodes (EG:"</foo>") for querySelectorAll('*') for some documents
1841
+			try {
1842
+				testNode.innerHTML = 'foo</foo>';
1843
+				selected = testNode.querySelectorAll('*');
1844
+				features.starSelectsClosedQSA = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');
1845
+			} catch(e){};
1846
+
1847
+			// Safari 3.2 querySelectorAll doesnt work with mixedcase on quirksmode
1848
+			try {
1849
+				testNode.innerHTML = '<a class="MiX"></a>';
1850
+				features.brokenMixedCaseQSA = !testNode.querySelectorAll('.MiX').length;
1851
+			} catch(e){};
1852
+
1853
+			// Webkit and Opera dont return selected options on querySelectorAll
1854
+			try {
1855
+				testNode.innerHTML = '<select><option selected="selected">a</option></select>';
1856
+				features.brokenCheckedQSA = (testNode.querySelectorAll(':checked').length == 0);
1857
+			} catch(e){};
1858
+
1859
+			// IE returns incorrect results for attr[*^$]="" selectors on querySelectorAll
1860
+			try {
1861
+				testNode.innerHTML = '<a class=""></a>';
1862
+				features.brokenEmptyAttributeQSA = (testNode.querySelectorAll('[class*=""]').length != 0);
1863
+			} catch(e){};
1864
+
1865
+		}
1866
+
1867
+		// IE6-7, if a form has an input of id x, form.getAttribute(x) returns a reference to the input
1868
+		try {
1869
+			testNode.innerHTML = '<form action="s"><input id="action"/></form>';
1870
+			brokenFormAttributeGetter = (testNode.firstChild.getAttribute('action') != 's');
1871
+		} catch(e){};
1872
+
1873
+		// native matchesSelector function
1874
+
1875
+		features.nativeMatchesSelector = root.matchesSelector || /*root.msMatchesSelector ||*/ root.mozMatchesSelector || root.webkitMatchesSelector;
1876
+		if (features.nativeMatchesSelector) try {
1877
+			// if matchesSelector trows errors on incorrect sintaxes we can use it
1878
+			features.nativeMatchesSelector.call(root, ':slick');
1879
+			features.nativeMatchesSelector = null;
1880
+		} catch(e){};
1881
+
1882
+	}
1883
+
1884
+	try {
1885
+		root.slick_expando = 1;
1886
+		delete root.slick_expando;
1887
+		features.getUID = this.getUIDHTML;
1888
+	} catch(e) {
1889
+		features.getUID = this.getUIDXML;
1890
+	}
1891
+
1892
+	testRoot.removeChild(testNode);
1893
+	testNode = selected = testRoot = null;
1894
+
1895
+	// getAttribute
1896
+
1897
+	features.getAttribute = (features.isHTMLDocument && brokenFormAttributeGetter) ? function(node, name){
1898
+		var method = this.attributeGetters[name];
1899
+		if (method) return method.call(node);
1900
+		var attributeNode = node.getAttributeNode(name);
1901
+		return (attributeNode) ? attributeNode.nodeValue : null;
1902
+	} : function(node, name){
1903
+		var method = this.attributeGetters[name];
1904
+		return (method) ? method.call(node) : node.getAttribute(name);
1905
+	};
1906
+
1907
+	// hasAttribute
1908
+
1909
+	features.hasAttribute = (root && this.isNativeCode(root.hasAttribute)) ? function(node, attribute) {
1910
+		return node.hasAttribute(attribute);
1911
+	} : function(node, attribute) {
1912
+		node = node.getAttributeNode(attribute);
1913
+		return !!(node && (node.specified || node.nodeValue));
1914
+	};
1915
+
1916
+	// contains
1917
+	// FIXME: Add specs: local.contains should be different for xml and html documents?
1918
+	features.contains = (root && this.isNativeCode(root.contains)) ? function(context, node){
1919
+		return context.contains(node);
1920
+	} : (root && root.compareDocumentPosition) ? function(context, node){
1921
+		return context === node || !!(context.compareDocumentPosition(node) & 16);
1922
+	} : function(context, node){
1923
+		if (node) do {
1924
+			if (node === context) return true;
1925
+		} while ((node = node.parentNode));
1926
+		return false;
1927
+	};
1928
+
1929
+	// document order sorting
1930
+	// credits to Sizzle (http://sizzlejs.com/)
1931
+
1932
+	features.documentSorter = (root.compareDocumentPosition) ? function(a, b){
1933
+		if (!a.compareDocumentPosition || !b.compareDocumentPosition) return 0;
1934
+		return a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
1935
+	} : ('sourceIndex' in root) ? function(a, b){
1936
+		if (!a.sourceIndex || !b.sourceIndex) return 0;
1937
+		return a.sourceIndex - b.sourceIndex;
1938
+	} : (document.createRange) ? function(a, b){
1939
+		if (!a.ownerDocument || !b.ownerDocument) return 0;
1940
+		var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
1941
+		aRange.setStart(a, 0);
1942
+		aRange.setEnd(a, 0);
1943
+		bRange.setStart(b, 0);
1944
+		bRange.setEnd(b, 0);
1945
+		return aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
1946
+	} : null ;
1947
+
1948
+	root = null;
1949
+
1950
+	for (feature in features){
1951
+		this[feature] = features[feature];
1952
+	}
1953
+};
1954
+
1955
+// Main Method
1956
+
1957
+var reSimpleSelector = /^([#.]?)((?:[\w-]+|\*))$/,
1958
+	reEmptyAttribute = /\[.+[*$^]=(?:""|'')?\]/,
1959
+	qsaFailExpCache = {};
1960
+
1961
+local.search = function(context, expression, append, first){
1962
+
1963
+	var found = this.found = (first) ? null : (append || []);
1964
+
1965
+	if (!context) return found;
1966
+	else if (context.navigator) context = context.document; // Convert the node from a window to a document
1967
+	else if (!context.nodeType) return found;
1968
+
1969
+	// setup
1970
+
1971
+	var parsed, i,
1972
+		uniques = this.uniques = {},
1973
+		hasOthers = !!(append && append.length),
1974
+		contextIsDocument = (context.nodeType == 9);
1975
+
1976
+	if (this.document !== (contextIsDocument ? context : context.ownerDocument)) this.setDocument(context);
1977
+
1978
+	// avoid duplicating items already in the append array
1979
+	if (hasOthers) for (i = found.length; i--;) uniques[this.getUID(found[i])] = true;
1980
+
1981
+	// expression checks
1982
+
1983
+	if (typeof expression == 'string'){ // expression is a string
1984
+
1985
+		/*<simple-selectors-override>*/
1986
+		var simpleSelector = expression.match(reSimpleSelector);
1987
+		simpleSelectors: if (simpleSelector) {
1988
+
1989
+			var symbol = simpleSelector[1],
1990
+				name = simpleSelector[2],
1991
+				node, nodes;
1992
+
1993
+			if (!symbol){
1994
+
1995
+				if (name == '*' && this.brokenStarGEBTN) break simpleSelectors;
1996
+				nodes = context.getElementsByTagName(name);
1997
+				if (first) return nodes[0] || null;
1998
+				for (i = 0; node = nodes[i++];){
1999
+					if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
2000
+				}
2001
+
2002
+			} else if (symbol == '#'){
2003
+
2004
+				if (!this.isHTMLDocument || !contextIsDocument) break simpleSelectors;
2005
+				node = context.getElementById(name);
2006
+				if (!node) return found;
2007
+				if (this.idGetsName && node.getAttributeNode('id').nodeValue != name) break simpleSelectors;
2008
+				if (first) return node || null;
2009
+				if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
2010
+
2011
+			} else if (symbol == '.'){
2012
+
2013
+				if (!this.isHTMLDocument || ((!context.getElementsByClassName || this.brokenGEBCN) && context.querySelectorAll)) break simpleSelectors;
2014
+				if (context.getElementsByClassName && !this.brokenGEBCN){
2015
+					nodes = context.getElementsByClassName(name);
2016
+					if (first) return nodes[0] || null;
2017
+					for (i = 0; node = nodes[i++];){
2018
+						if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
2019
+					}
2020
+				} else {
2021
+					var matchClass = new RegExp('(^|\\s)'+ Slick.escapeRegExp(name) +'(\\s|$)');
2022
+					nodes = context.getElementsByTagName('*');
2023
+					for (i = 0; node = nodes[i++];){
2024
+						className = node.className;
2025
+						if (!(className && matchClass.test(className))) continue;
2026
+						if (first) return node;
2027
+						if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
2028
+					}
2029
+				}
2030
+
2031
+			}
2032
+
2033
+			if (hasOthers) this.sort(found);
2034
+			return (first) ? null : found;
2035
+
2036
+		}
2037
+		/*</simple-selectors-override>*/
2038
+
2039
+		/*<query-selector-override>*/
2040
+		querySelector: if (context.querySelectorAll) {
2041
+
2042
+			if (!this.isHTMLDocument || this.brokenMixedCaseQSA || qsaFailExpCache[expression] ||
2043
+			(this.brokenCheckedQSA && expression.indexOf(':checked') > -1) ||
2044
+			(this.brokenEmptyAttributeQSA && reEmptyAttribute.test(expression)) || Slick.disableQSA) break querySelector;
2045
+
2046
+			var _expression = expression;
2047
+			if (!contextIsDocument){
2048
+				// non-document rooted QSA
2049
+				// credits to Andrew Dupont
2050
+				var currentId = context.getAttribute('id'), slickid = 'slickid__';
2051
+				context.setAttribute('id', slickid);
2052
+				_expression = '#' + slickid + ' ' + _expression;
2053
+			}
2054
+
2055
+			try {
2056
+				if (first) return context.querySelector(_expression) || null;
2057
+				else nodes = context.querySelectorAll(_expression);
2058
+			} catch(e) {
2059
+				qsaFailExpCache[expression] = 1;
2060
+				break querySelector;
2061
+			} finally {
2062
+				if (!contextIsDocument){
2063
+					if (currentId) context.setAttribute('id', currentId);
2064
+					else context.removeAttribute('id');
2065
+				}
2066
+			}
2067
+
2068
+			if (this.starSelectsClosedQSA) for (i = 0; node = nodes[i++];){
2069
+				if (node.nodeName > '@' && !(hasOthers && uniques[this.getUID(node)])) found.push(node);
2070
+			} else for (i = 0; node = nodes[i++];){
2071
+				if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
2072
+			}
2073
+
2074
+			if (hasOthers) this.sort(found);
2075
+			return found;
2076
+
2077
+		}
2078
+		/*</query-selector-override>*/
2079
+
2080
+		parsed = this.Slick.parse(expression);
2081
+		if (!parsed.length) return found;
2082
+	} else if (expression == null){ // there is no expression
2083
+		return found;
2084
+	} else if (expression.Slick){ // expression is a parsed Slick object
2085
+		parsed = expression;
2086
+	} else if (this.contains(context.documentElement || context, expression)){ // expression is a node
2087
+		(found) ? found.push(expression) : found = expression;
2088
+		return found;
2089
+	} else { // other junk
2090
+		return found;
2091
+	}
2092
+
2093
+	/*<pseudo-selectors>*//*<nth-pseudo-selectors>*/
2094
+
2095
+	// cache elements for the nth selectors
2096
+
2097
+	this.posNTH = {};
2098
+	this.posNTHLast = {};
2099
+	this.posNTHType = {};
2100
+	this.posNTHTypeLast = {};
2101
+
2102
+	/*</nth-pseudo-selectors>*//*</pseudo-selectors>*/
2103
+
2104
+	// if append is null and there is only a single selector with one expression use pushArray, else use pushUID
2105
+	this.push = (!hasOthers && (first || (parsed.length == 1 && parsed.expressions[0].length == 1))) ? this.pushArray : this.pushUID;
2106
+
2107
+	if (found == null) found = [];
2108
+
2109
+	// default engine
2110
+
2111
+	var j, m, n;
2112
+	var combinator, tag, id, classList, classes, attributes, pseudos;
2113
+	var currentItems, currentExpression, currentBit, lastBit, expressions = parsed.expressions;
2114
+
2115
+	search: for (i = 0; (currentExpression = expressions[i]); i++) for (j = 0; (currentBit = currentExpression[j]); j++){
2116
+
2117
+		combinator = 'combinator:' + currentBit.combinator;
2118
+		if (!this[combinator]) continue search;
2119
+
2120
+		tag        = (this.isXMLDocument) ? currentBit.tag : currentBit.tag.toUpperCase();
2121
+		id         = currentBit.id;
2122
+		classList  = currentBit.classList;
2123
+		classes    = currentBit.classes;
2124
+		attributes = currentBit.attributes;
2125
+		pseudos    = currentBit.pseudos;
2126
+		lastBit    = (j === (currentExpression.length - 1));
2127
+
2128
+		this.bitUniques = {};
2129
+
2130
+		if (lastBit){
2131
+			this.uniques = uniques;
2132
+			this.found = found;
2133
+		} else {
2134
+			this.uniques = {};
2135
+			this.found = [];
2136
+		}
2137
+
2138
+		if (j === 0){
2139
+			this[combinator](context, tag, id, classes, attributes, pseudos, classList);
2140
+			if (first && lastBit && found.length) break search;
2141
+		} else {
2142
+			if (first && lastBit) for (m = 0, n = currentItems.length; m < n; m++){
2143
+				this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);
2144
+				if (found.length) break search;
2145
+			} else for (m = 0, n = currentItems.length; m < n; m++) this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);
2146
+		}
2147
+
2148
+		currentItems = this.found;
2149
+	}
2150
+
2151
+	// should sort if there are nodes in append and if you pass multiple expressions.
2152
+	if (hasOthers || (parsed.expressions.length > 1)) this.sort(found);
2153
+
2154
+	return (first) ? (found[0] || null) : found;
2155
+};
2156
+
2157
+// Utils
2158
+
2159
+local.uidx = 1;
2160
+local.uidk = 'slick-uniqueid';
2161
+
2162
+local.getUIDXML = function(node){
2163
+	var uid = node.getAttribute(this.uidk);
2164
+	if (!uid){
2165
+		uid = this.uidx++;
2166
+		node.setAttribute(this.uidk, uid);
2167
+	}
2168
+	return uid;
2169
+};
2170
+
2171
+local.getUIDHTML = function(node){
2172
+	return node.uniqueNumber || (node.uniqueNumber = this.uidx++);
2173
+};
2174
+
2175
+// sort based on the setDocument documentSorter method.
2176
+
2177
+local.sort = function(results){
2178
+	if (!this.documentSorter) return results;
2179
+	results.sort(this.documentSorter);
2180
+	return results;
2181
+};
2182
+
2183
+/*<pseudo-selectors>*//*<nth-pseudo-selectors>*/
2184
+
2185
+local.cacheNTH = {};
2186
+
2187
+local.matchNTH = /^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;
2188
+
2189
+local.parseNTHArgument = function(argument){
2190
+	var parsed = argument.match(this.matchNTH);
2191
+	if (!parsed) return false;
2192
+	var special = parsed[2] || false;
2193
+	var a = parsed[1] || 1;
2194
+	if (a == '-') a = -1;
2195
+	var b = +parsed[3] || 0;
2196
+	parsed =
2197
+		(special == 'n')	? {a: a, b: b} :
2198
+		(special == 'odd')	? {a: 2, b: 1} :
2199
+		(special == 'even')	? {a: 2, b: 0} : {a: 0, b: a};
2200
+
2201
+	return (this.cacheNTH[argument] = parsed);
2202
+};
2203
+
2204
+local.createNTHPseudo = function(child, sibling, positions, ofType){
2205
+	return function(node, argument){
2206
+		var uid = this.getUID(node);
2207
+		if (!this[positions][uid]){
2208
+			var parent = node.parentNode;
2209
+			if (!parent) return false;
2210
+			var el = parent[child], count = 1;
2211
+			if (ofType){
2212
+				var nodeName = node.nodeName;
2213
+				do {
2214
+					if (el.nodeName != nodeName) continue;
2215
+					this[positions][this.getUID(el)] = count++;
2216
+				} while ((el = el[sibling]));
2217
+			} else {
2218
+				do {
2219
+					if (el.nodeType != 1) continue;
2220
+					this[positions][this.getUID(el)] = count++;
2221
+				} while ((el = el[sibling]));
2222
+			}
2223
+		}
2224
+		argument = argument || 'n';
2225
+		var parsed = this.cacheNTH[argument] || this.parseNTHArgument(argument);
2226
+		if (!parsed) return false;
2227
+		var a = parsed.a, b = parsed.b, pos = this[positions][uid];
2228
+		if (a == 0) return b == pos;
2229
+		if (a > 0){
2230
+			if (pos < b) return false;
2231
+		} else {
2232
+			if (b < pos) return false;
2233
+		}
2234
+		return ((pos - b) % a) == 0;
2235
+	};
2236
+};
2237
+
2238
+/*</nth-pseudo-selectors>*//*</pseudo-selectors>*/
2239
+
2240
+local.pushArray = function(node, tag, id, classes, attributes, pseudos){
2241
+	if (this.matchSelector(node, tag, id, classes, attributes, pseudos)) this.found.push(node);
2242
+};
2243
+
2244
+local.pushUID = function(node, tag, id, classes, attributes, pseudos){
2245
+	var uid = this.getUID(node);
2246
+	if (!this.uniques[uid] && this.matchSelector(node, tag, id, classes, attributes, pseudos)){
2247
+		this.uniques[uid] = true;
2248
+		this.found.push(node);
2249
+	}
2250
+};
2251
+
2252
+local.matchNode = function(node, selector){
2253
+	if (this.isHTMLDocument && this.nativeMatchesSelector){
2254
+		try {
2255
+			return this.nativeMatchesSelector.call(node, selector.replace(/\[([^=]+)=\s*([^'"\]]+?)\s*\]/g, '[$1="$2"]'));
2256
+		} catch(matchError) {}
2257
+	}
2258
+
2259
+	var parsed = this.Slick.parse(selector);
2260
+	if (!parsed) return true;
2261
+
2262
+	// simple (single) selectors
2263
+	var expressions = parsed.expressions, reversedExpressions, simpleExpCounter = 0, i;
2264
+	for (i = 0; (currentExpression = expressions[i]); i++){
2265
+		if (currentExpression.length == 1){
2266
+			var exp = currentExpression[0];
2267
+			if (this.matchSelector(node, (this.isXMLDocument) ? exp.tag : exp.tag.toUpperCase(), exp.id, exp.classes, exp.attributes, exp.pseudos)) return true;
2268
+			simpleExpCounter++;
2269
+		}
2270
+	}
2271
+
2272
+	if (simpleExpCounter == parsed.length) return false;
2273
+
2274
+	var nodes = this.search(this.document, parsed), item;
2275
+	for (i = 0; item = nodes[i++];){
2276
+		if (item === node) return true;
2277
+	}
2278
+	return false;
2279
+};
2280
+
2281
+local.matchPseudo = function(node, name, argument){
2282
+	var pseudoName = 'pseudo:' + name;
2283
+	if (this[pseudoName]) return this[pseudoName](node, argument);
2284
+	var attribute = this.getAttribute(node, name);
2285
+	return (argument) ? argument == attribute : !!attribute;
2286
+};
2287
+
2288
+local.matchSelector = function(node, tag, id, classes, attributes, pseudos){
2289
+	if (tag){
2290
+		var nodeName = (this.isXMLDocument) ? node.nodeName : node.nodeName.toUpperCase();
2291
+		if (tag == '*'){
2292
+			if (nodeName < '@') return false; // Fix for comment nodes and closed nodes
2293
+		} else {
2294
+			if (nodeName != tag) return false;
2295
+		}
2296
+	}
2297
+
2298
+	if (id && node.getAttribute('id') != id) return false;
2299
+
2300
+	var i, part, cls;
2301
+	if (classes) for (i = classes.length; i--;){
2302
+		cls = node.getAttribute('class') || node.className;
2303
+		if (!(cls && classes[i].regexp.test(cls))) return false;
2304
+	}
2305
+	if (attributes) for (i = attributes.length; i--;){
2306
+		part = attributes[i];
2307
+		if (part.operator ? !part.test(this.getAttribute(node, part.key)) : !this.hasAttribute(node, part.key)) return false;
2308
+	}
2309
+	if (pseudos) for (i = pseudos.length; i--;){
2310
+		part = pseudos[i];
2311
+		if (!this.matchPseudo(node, part.key, part.value)) return false;
2312
+	}
2313
+	return true;
2314
+};
2315
+
2316
+var combinators = {
2317
+
2318
+	' ': function(node, tag, id, classes, attributes, pseudos, classList){ // all child nodes, any level
2319
+
2320
+		var i, item, children;
2321
+
2322
+		if (this.isHTMLDocument){
2323
+			getById: if (id){
2324
+				item = this.document.getElementById(id);
2325
+				if ((!item && node.all) || (this.idGetsName && item && item.getAttributeNode('id').nodeValue != id)){
2326
+					// all[id] returns all the elements with that name or id inside node
2327
+					// if theres just one it will return the element, else it will be a collection
2328
+					children = node.all[id];
2329
+					if (!children) return;
2330
+					if (!children[0]) children = [children];
2331
+					for (i = 0; item = children[i++];){
2332
+						var idNode = item.getAttributeNode('id');
2333
+						if (idNode && idNode.nodeValue == id){
2334
+							this.push(item, tag, null, classes, attributes, pseudos);
2335
+							break;
2336
+						}
2337
+					}
2338
+					return;
2339
+				}
2340
+				if (!item){
2341
+					// if the context is in the dom we return, else we will try GEBTN, breaking the getById label
2342
+					if (this.contains(this.root, node)) return;
2343
+					else break getById;
2344
+				} else if (this.document !== node && !this.contains(node, item)) return;
2345
+				this.push(item, tag, null, classes, attributes, pseudos);
2346
+				return;
2347
+			}
2348
+			getByClass: if (classes && node.getElementsByClassName && !this.brokenGEBCN){
2349
+				children = node.getElementsByClassName(classList.join(' '));
2350
+				if (!(children && children.length)) break getByClass;
2351
+				for (i = 0; item = children[i++];) this.push(item, tag, id, null, attributes, pseudos);
2352
+				return;
2353
+			}
2354
+		}
2355
+		getByTag: {
2356
+			children = node.getElementsByTagName(tag);
2357
+			if (!(children && children.length)) break getByTag;
2358
+			if (!this.brokenStarGEBTN) tag = null;
2359
+			for (i = 0; item = children[i++];) this.push(item, tag, id, classes, attributes, pseudos);
2360
+		}
2361
+	},
2362
+
2363
+	'>': function(node, tag, id, classes, attributes, pseudos){ // direct children
2364
+		if ((node = node.firstChild)) do {
2365
+			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
2366
+		} while ((node = node.nextSibling));
2367
+	},
2368
+
2369
+	'+': function(node, tag, id, classes, attributes, pseudos){ // next sibling
2370
+		while ((node = node.nextSibling)) if (node.nodeType == 1){
2371
+			this.push(node, tag, id, classes, attributes, pseudos);
2372
+			break;
2373
+		}
2374
+	},
2375
+
2376
+	'^': function(node, tag, id, classes, attributes, pseudos){ // first child
2377
+		node = node.firstChild;
2378
+		if (node){
2379
+			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
2380
+			else this['combinator:+'](node, tag, id, classes, attributes, pseudos);
2381
+		}
2382
+	},
2383
+
2384
+	'~': function(node, tag, id, classes, attributes, pseudos){ // next siblings
2385
+		while ((node = node.nextSibling)){
2386
+			if (node.nodeType != 1) continue;
2387
+			var uid = this.getUID(node);
2388
+			if (this.bitUniques[uid]) break;
2389
+			this.bitUniques[uid] = true;
2390
+			this.push(node, tag, id, classes, attributes, pseudos);
2391
+		}
2392
+	},
2393
+
2394
+	'++': function(node, tag, id, classes, attributes, pseudos){ // next sibling and previous sibling
2395
+		this['combinator:+'](node, tag, id, classes, attributes, pseudos);
2396
+		this['combinator:!+'](node, tag, id, classes, attributes, pseudos);
2397
+	},
2398
+
2399
+	'~~': function(node, tag, id, classes, attributes, pseudos){ // next siblings and previous siblings
2400
+		this['combinator:~'](node, tag, id, classes, attributes, pseudos);
2401
+		this['combinator:!~'](node, tag, id, classes, attributes, pseudos);
2402
+	},
2403
+
2404
+	'!': function(node, tag, id, classes, attributes, pseudos){ // all parent nodes up to document
2405
+		while ((node = node.parentNode)) if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);
2406
+	},
2407
+
2408
+	'!>': function(node, tag, id, classes, attributes, pseudos){ // direct parent (one level)
2409
+		node = node.parentNode;
2410
+		if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);
2411
+	},
2412
+
2413
+	'!+': function(node, tag, id, classes, attributes, pseudos){ // previous sibling
2414
+		while ((node = node.previousSibling)) if (node.nodeType == 1){
2415
+			this.push(node, tag, id, classes, attributes, pseudos);
2416
+			break;
2417
+		}
2418
+	},
2419
+
2420
+	'!^': function(node, tag, id, classes, attributes, pseudos){ // last child
2421
+		node = node.lastChild;
2422
+		if (node){
2423
+			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
2424
+			else this['combinator:!+'](node, tag, id, classes, attributes, pseudos);
2425
+		}
2426
+	},
2427
+
2428
+	'!~': function(node, tag, id, classes, attributes, pseudos){ // previous siblings
2429
+		while ((node = node.previousSibling)){
2430
+			if (node.nodeType != 1) continue;
2431
+			var uid = this.getUID(node);
2432
+			if (this.bitUniques[uid]) break;
2433
+			this.bitUniques[uid] = true;
2434
+			this.push(node, tag, id, classes, attributes, pseudos);
2435
+		}
2436
+	}
2437
+
2438
+};
2439
+
2440
+for (var c in combinators) local['combinator:' + c] = combinators[c];
2441
+
2442
+var pseudos = {
2443
+
2444
+	/*<pseudo-selectors>*/
2445
+
2446
+	'empty': function(node){
2447
+		var child = node.firstChild;
2448
+		return !(child && child.nodeType == 1) && !(node.innerText || node.textContent || '').length;
2449
+	},
2450
+
2451
+	'not': function(node, expression){
2452
+		return !this.matchNode(node, expression);
2453
+	},
2454
+
2455
+	'contains': function(node, text){
2456
+		return (node.innerText || node.textContent || '').indexOf(text) > -1;
2457
+	},
2458
+
2459
+	'first-child': function(node){
2460
+		while ((node = node.previousSibling)) if (node.nodeType == 1) return false;
2461
+		return true;
2462
+	},
2463
+
2464
+	'last-child': function(node){
2465
+		while ((node = node.nextSibling)) if (node.nodeType == 1) return false;
2466
+		return true;
2467
+	},
2468
+
2469
+	'only-child': function(node){
2470
+		var prev = node;
2471
+		while ((prev = prev.previousSibling)) if (prev.nodeType == 1) return false;
2472
+		var next = node;
2473
+		while ((next = next.nextSibling)) if (next.nodeType == 1) return false;
2474
+		return true;
2475
+	},
2476
+
2477
+	/*<nth-pseudo-selectors>*/
2478
+
2479
+	'nth-child': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTH'),
2480
+
2481
+	'nth-last-child': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHLast'),
2482
+
2483
+	'nth-of-type': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTHType', true),
2484
+
2485
+	'nth-last-of-type': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHTypeLast', true),
2486
+
2487
+	'index': function(node, index){
2488
+		return this['pseudo:nth-child'](node, '' + index + 1);
2489
+	},
2490
+
2491
+	'even': function(node){
2492
+		return this['pseudo:nth-child'](node, '2n');
2493
+	},
2494
+
2495
+	'odd': function(node){
2496
+		return this['pseudo:nth-child'](node, '2n+1');
2497
+	},
2498
+
2499
+	/*</nth-pseudo-selectors>*/
2500
+
2501
+	/*<of-type-pseudo-selectors>*/
2502
+
2503
+	'first-of-type': function(node){
2504
+		var nodeName = node.nodeName;
2505
+		while ((node = node.previousSibling)) if (node.nodeName == nodeName) return false;
2506
+		return true;
2507
+	},
2508
+
2509
+	'last-of-type': function(node){
2510
+		var nodeName = node.nodeName;
2511
+		while ((node = node.nextSibling)) if (node.nodeName == nodeName) return false;
2512
+		return true;
2513
+	},
2514
+
2515
+	'only-of-type': function(node){
2516
+		var prev = node, nodeName = node.nodeName;
2517
+		while ((prev = prev.previousSibling)) if (prev.nodeName == nodeName) return false;
2518
+		var next = node;
2519
+		while ((next = next.nextSibling)) if (next.nodeName == nodeName) return false;
2520
+		return true;
2521
+	},
2522
+
2523
+	/*</of-type-pseudo-selectors>*/
2524
+
2525
+	// custom pseudos
2526
+
2527
+	'enabled': function(node){
2528
+		return !node.disabled;
2529
+	},
2530
+
2531
+	'disabled': function(node){
2532
+		return node.disabled;
2533
+	},
2534
+
2535
+	'checked': function(node){
2536
+		return node.checked || node.selected;
2537
+	},
2538
+
2539
+	'focus': function(node){
2540
+		return this.isHTMLDocument && this.document.activeElement === node && (node.href || node.type || this.hasAttribute(node, 'tabindex'));
2541
+	},
2542
+
2543
+	'root': function(node){
2544
+		return (node === this.root);
2545
+	},
2546
+
2547
+	'selected': function(node){
2548
+		return node.selected;
2549
+	}
2550
+
2551
+	/*</pseudo-selectors>*/
2552
+};
2553
+
2554
+for (var p in pseudos) local['pseudo:' + p] = pseudos[p];
2555
+
2556
+// attributes methods
2557
+
2558
+local.attributeGetters = {
2559
+
2560
+	'class': function(){
2561
+		return this.getAttribute('class') || this.className;
2562
+	},
2563
+
2564
+	'for': function(){
2565
+		return ('htmlFor' in this) ? this.htmlFor : this.getAttribute('for');
2566
+	},
2567
+
2568
+	'href': function(){
2569
+		return ('href' in this) ? this.getAttribute('href', 2) : this.getAttribute('href');
2570
+	},
2571
+
2572
+	'style': function(){
2573
+		return (this.style) ? this.style.cssText : this.getAttribute('style');
2574
+	},
2575
+
2576
+	'tabindex': function(){
2577
+		var attributeNode = this.getAttributeNode('tabindex');
2578
+		return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null;
2579
+	},
2580
+
2581
+	'type': function(){
2582
+		return this.getAttribute('type');
2583
+	}
2584
+
2585
+};
2586
+
2587
+// Slick
2588
+
2589
+var Slick = local.Slick = (this.Slick || {});
2590
+
2591
+Slick.version = '1.1.5';
2592
+
2593
+// Slick finder
2594
+
2595
+Slick.search = function(context, expression, append){
2596
+	return local.search(context, expression, append);
2597
+};
2598
+
2599
+Slick.find = function(context, expression){
2600
+	return local.search(context, expression, null, true);
2601
+};
2602
+
2603
+// Slick containment checker
2604
+
2605
+Slick.contains = function(container, node){
2606
+	local.setDocument(container);
2607
+	return local.contains(container, node);
2608
+};
2609
+
2610
+// Slick attribute getter
2611
+
2612
+Slick.getAttribute = function(node, name){
2613
+	return local.getAttribute(node, name);
2614
+};
2615
+
2616
+// Slick matcher
2617
+
2618
+Slick.match = function(node, selector){
2619
+	if (!(node && selector)) return false;
2620
+	if (!selector || selector === node) return true;
2621
+	local.setDocument(node);
2622
+	return local.matchNode(node, selector);
2623
+};
2624
+
2625
+// Slick attribute accessor
2626
+
2627
+Slick.defineAttributeGetter = function(name, fn){
2628
+	local.attributeGetters[name] = fn;
2629
+	return this;
2630
+};
2631
+
2632
+Slick.lookupAttributeGetter = function(name){
2633
+	return local.attributeGetters[name];
2634
+};
2635
+
2636
+// Slick pseudo accessor
2637
+
2638
+Slick.definePseudo = function(name, fn){
2639
+	local['pseudo:' + name] = function(node, argument){
2640
+		return fn.call(node, argument);
2641
+	};
2642
+	return this;
2643
+};
2644
+
2645
+Slick.lookupPseudo = function(name){
2646
+	var pseudo = local['pseudo:' + name];
2647
+	if (pseudo) return function(argument){
2648
+		return pseudo.call(this, argument);
2649
+	};
2650
+	return null;
2651
+};
2652
+
2653
+// Slick overrides accessor
2654
+
2655
+Slick.override = function(regexp, fn){
2656
+	local.override(regexp, fn);
2657
+	return this;
2658
+};
2659
+
2660
+Slick.isXML = local.isXML;
2661
+
2662
+Slick.uidOf = function(node){
2663
+	return local.getUIDHTML(node);
2664
+};
2665
+
2666
+if (!this.Slick) this.Slick = Slick;
2667
+
2668
+}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ? exports : /*</CommonJS>*/this);
2669
+
2670
+
2671
+/*
2672
+---
2673
+
2674
+name: Element
2675
+
2676
+description: One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser, time-saver methods to let you easily work with HTML Elements.
2677
+
2678
+license: MIT-style license.
2679
+
2680
+requires: [Window, Document, Array, String, Function, Number, Slick.Parser, Slick.Finder]
2681
+
2682
+provides: [Element, Elements, $, $$, Iframe, Selectors]
2683
+
2684
+...
2685
+*/
2686
+
2687
+var Element = function(tag, props){
2688
+	var konstructor = Element.Constructors[tag];
2689
+	if (konstructor) return konstructor(props);
2690
+	if (typeof tag != 'string') return document.id(tag).set(props);
2691
+
2692
+	if (!props) props = {};
2693
+
2694
+	if (!(/^[\w-]+$/).test(tag)){
2695
+		var parsed = Slick.parse(tag).expressions[0][0];
2696
+		tag = (parsed.tag == '*') ? 'div' : parsed.tag;
2697
+		if (parsed.id && props.id == null) props.id = parsed.id;
2698
+
2699
+		var attributes = parsed.attributes;
2700
+		if (attributes) for (var i = 0, l = attributes.length; i < l; i++){
2701
+			var attr = attributes[i];
2702
+			if (attr.value != null && attr.operator == '=' && props[attr.key] == null)
2703
+				props[attr.key] = attr.value;
2704
+		}
2705
+
2706
+		if (parsed.classList && props['class'] == null) props['class'] = parsed.classList.join(' ');
2707
+	}
2708
+
2709
+	return document.newElement(tag, props);
2710
+};
2711
+
2712
+if (Browser.Element) Element.prototype = Browser.Element.prototype;
2713
+
2714
+new Type('Element', Element).mirror(function(name){
2715
+	if (Array.prototype[name]) return;
2716
+
2717
+	var obj = {};
2718
+	obj[name] = function(){
2719
+		var results = [], args = arguments, elements = true;
2720
+		for (var i = 0, l = this.length; i < l; i++){
2721
+			var element = this[i], result = results[i] = element[name].apply(element, args);
2722
+			elements = (elements && typeOf(result) == 'element');
2723
+		}
2724
+		return (elements) ? new Elements(results) : results;
2725
+	};
2726
+
2727
+	Elements.implement(obj);
2728
+});
2729
+
2730
+if (!Browser.Element){
2731
+	Element.parent = Object;
2732
+
2733
+	Element.Prototype = {'$family': Function.from('element').hide()};
2734
+
2735
+	Element.mirror(function(name, method){
2736
+		Element.Prototype[name] = method;
2737
+	});
2738
+}
2739
+
2740
+Element.Constructors = {};
2741
+
2742
+
2743
+
2744
+var IFrame = new Type('IFrame', function(){
2745
+	var params = Array.link(arguments, {
2746
+		properties: Type.isObject,
2747
+		iframe: function(obj){
2748
+			return (obj != null);
2749
+		}
2750
+	});
2751
+
2752
+	var props = params.properties || {}, iframe;
2753
+	if (params.iframe) iframe = document.id(params.iframe);
2754
+	var onload = props.onload || function(){};
2755
+	delete props.onload;
2756
+	props.id = props.name = [props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + String.uniqueID()].pick();
2757
+	iframe = new Element(iframe || 'iframe', props);
2758
+
2759
+	var onLoad = function(){
2760
+		onload.call(iframe.contentWindow);
2761
+	};
2762
+
2763
+	if (window.frames[props.id]) onLoad();
2764
+	else iframe.addListener('load', onLoad);
2765
+	return iframe;
2766
+});
2767
+
2768
+var Elements = this.Elements = function(nodes){
2769
+	if (nodes && nodes.length){
2770
+		var uniques = {}, node;
2771
+		for (var i = 0; node = nodes[i++];){
2772
+			var uid = Slick.uidOf(node);
2773
+			if (!uniques[uid]){
2774
+				uniques[uid] = true;
2775
+				this.push(node);
2776
+			}
2777
+		}
2778
+	}
2779
+};
2780
+
2781
+Elements.prototype = {length: 0};
2782
+Elements.parent = Array;
2783
+
2784
+new Type('Elements', Elements).implement({
2785
+
2786
+	filter: function(filter, bind){
2787
+		if (!filter) return this;
2788
+		return new Elements(Array.filter(this, (typeOf(filter) == 'string') ? function(item){
2789
+			return item.match(filter);
2790
+		} : filter, bind));
2791
+	}.protect(),
2792
+
2793
+	push: function(){
2794
+		var length = this.length;
2795
+		for (var i = 0, l = arguments.length; i < l; i++){
2796
+			var item = document.id(arguments[i]);
2797
+			if (item) this[length++] = item;
2798
+		}
2799
+		return (this.length = length);
2800
+	}.protect(),
2801
+
2802
+	unshift: function(){
2803
+		var items = [];
2804
+		for (var i = 0, l = arguments.length; i < l; i++){
2805
+			var item = document.id(arguments[i]);
2806
+			if (item) items.push(item);
2807
+		}
2808
+		return Array.prototype.unshift.apply(this, items);
2809
+	}.protect(),
2810
+
2811
+	concat: function(){
2812
+		var newElements = new Elements(this);
2813
+		for (var i = 0, l = arguments.length; i < l; i++){
2814
+			var item = arguments[i];
2815
+			if (Type.isEnumerable(item)) newElements.append(item);
2816
+			else newElements.push(item);
2817
+		}
2818
+		return newElements;
2819
+	}.protect(),
2820
+
2821
+	append: function(collection){
2822
+		for (var i = 0, l = collection.length; i < l; i++) this.push(collection[i]);
2823
+		return this;
2824
+	}.protect(),
2825
+
2826
+	empty: function(){
2827
+		while (this.length) delete this[--this.length];
2828
+		return this;
2829
+	}.protect()
2830
+
2831
+});
2832
+
2833
+
2834
+
2835
+(function(){
2836
+
2837
+// FF, IE
2838
+var splice = Array.prototype.splice, object = {'0': 0, '1': 1, length: 2};
2839
+
2840
+splice.call(object, 1, 1);
2841
+if (object[1] == 1) Elements.implement('splice', function(){
2842
+	var length = this.length;
2843
+	splice.apply(this, arguments);
2844
+	while (length >= this.length) delete this[length--];
2845
+	return this;
2846
+}.protect());
2847
+
2848
+Elements.implement(Array.prototype);
2849
+
2850
+Array.mirror(Elements);
2851
+
2852
+/*<ltIE8>*/
2853
+var createElementAcceptsHTML;
2854
+try {
2855
+	var x = document.createElement('<input name=x>');
2856
+	createElementAcceptsHTML = (x.name == 'x');
2857
+} catch(e){}
2858
+
2859
+var escapeQuotes = function(html){
2860
+	return ('' + html).replace(/&/g, '&amp;').replace(/"/g, '&quot;');
2861
+};
2862
+/*</ltIE8>*/
2863
+
2864
+Document.implement({
2865
+
2866
+	newElement: function(tag, props){
2867
+		if (props && props.checked != null) props.defaultChecked = props.checked;
2868
+		/*<ltIE8>*/// Fix for readonly name and type properties in IE < 8
2869
+		if (createElementAcceptsHTML && props){
2870
+			tag = '<' + tag;
2871
+			if (props.name) tag += ' name="' + escapeQuotes(props.name) + '"';
2872
+			if (props.type) tag += ' type="' + escapeQuotes(props.type) + '"';
2873
+			tag += '>';
2874
+			delete props.name;
2875
+			delete props.type;
2876
+		}
2877
+		/*</ltIE8>*/
2878
+		return this.id(this.createElement(tag)).set(props);
2879
+	}
2880
+
2881
+});
2882
+
2883
+})();
2884
+
2885
+Document.implement({
2886
+
2887
+	newTextNode: function(text){
2888
+		return this.createTextNode(text);
2889
+	},
2890
+
2891
+	getDocument: function(){
2892
+		return this;
2893
+	},
2894
+
2895
+	getWindow: function(){
2896
+		return this.window;
2897
+	},
2898
+
2899
+	id: (function(){
2900
+
2901
+		var types = {
2902
+
2903
+			string: function(id, nocash, doc){
2904
+				id = Slick.find(doc, '#' + id.replace(/(\W)/g, '\\$1'));
2905
+				return (id) ? types.element(id, nocash) : null;
2906
+			},
2907
+
2908
+			element: function(el, nocash){
2909
+				$uid(el);
2910
+				if (!nocash && !el.$family && !(/^(?:object|embed)$/i).test(el.tagName)){
2911
+					Object.append(el, Element.Prototype);
2912
+				}
2913
+				return el;
2914
+			},
2915
+
2916
+			object: function(obj, nocash, doc){
2917
+				if (obj.toElement) return types.element(obj.toElement(doc), nocash);
2918
+				return null;
2919
+			}
2920
+
2921
+		};
2922
+
2923
+		types.textnode = types.whitespace = types.window = types.document = function(zero){
2924
+			return zero;
2925
+		};
2926
+
2927
+		return function(el, nocash, doc){
2928
+			if (el && el.$family && el.uid) return el;
2929
+			var type = typeOf(el);
2930
+			return (types[type]) ? types[type](el, nocash, doc || document) : null;
2931
+		};
2932
+
2933
+	})()
2934
+
2935
+});
2936
+
2937
+if (window.$ == null) Window.implement('$', function(el, nc){
2938
+	return document.id(el, nc, this.document);
2939
+});
2940
+
2941
+Window.implement({
2942
+
2943
+	getDocument: function(){
2944
+		return this.document;
2945
+	},
2946
+
2947
+	getWindow: function(){
2948
+		return this;
2949
+	}
2950
+
2951
+});
2952
+
2953
+[Document, Element].invoke('implement', {
2954
+
2955
+	getElements: function(expression){
2956
+		return Slick.search(this, expression, new Elements);
2957
+	},
2958
+
2959
+	getElement: function(expression){
2960
+		return document.id(Slick.find(this, expression));
2961
+	}
2962
+
2963
+});
2964
+
2965
+
2966
+
2967
+if (window.$$ == null) Window.implement('$$', function(selector){
2968
+	if (arguments.length == 1){
2969
+		if (typeof selector == 'string') return Slick.search(this.document, selector, new Elements);
2970
+		else if (Type.isEnumerable(selector)) return new Elements(selector);
2971
+	}
2972
+	return new Elements(arguments);
2973
+});
2974
+
2975
+(function(){
2976
+
2977
+var collected = {}, storage = {};
2978
+var formProps = {input: 'checked', option: 'selected', textarea: 'value'};
2979
+
2980
+var get = function(uid){
2981
+	return (storage[uid] || (storage[uid] = {}));
2982
+};
2983
+
2984
+var clean = function(item){
2985
+	var uid = item.uid;
2986
+	if (item.removeEvents) item.removeEvents();
2987
+	if (item.clearAttributes) item.clearAttributes();
2988
+	if (uid != null){
2989
+		delete collected[uid];
2990
+		delete storage[uid];
2991
+	}
2992
+	return item;
2993
+};
2994
+
2995
+var camels = ['defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', 'frameBorder', 'maxLength', 'readOnly',
2996
+	'rowSpan', 'tabIndex', 'useMap'
2997
+];
2998
+var bools = ['compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', 'disabled', 'readOnly', 'multiple', 'selected',
2999
+	'noresize', 'defer', 'defaultChecked'
3000
+];
3001
+ var attributes = {
3002
+	'html': 'innerHTML',
3003
+	'class': 'className',
3004
+	'for': 'htmlFor',
3005
+	'text': (function(){
3006
+		var temp = document.createElement('div');
3007
+		return (temp.textContent == null) ? 'innerText' : 'textContent';
3008
+	})()
3009
+};
3010
+var readOnly = ['type'];
3011
+var expandos = ['value', 'defaultValue'];
3012
+var uriAttrs = /^(?:href|src|usemap)$/i;
3013
+
3014
+bools = bools.associate(bools);
3015
+camels = camels.associate(camels.map(String.toLowerCase));
3016
+readOnly = readOnly.associate(readOnly);
3017
+
3018
+Object.append(attributes, expandos.associate(expandos));
3019
+
3020
+var inserters = {
3021
+
3022
+	before: function(context, element){
3023
+		var parent = element.parentNode;
3024
+		if (parent) parent.insertBefore(context, element);
3025
+	},
3026
+
3027
+	after: function(context, element){
3028
+		var parent = element.parentNode;
3029
+		if (parent) parent.insertBefore(context, element.nextSibling);
3030
+	},
3031
+
3032
+	bottom: function(context, element){
3033
+		element.appendChild(context);
3034
+	},
3035
+
3036
+	top: function(context, element){
3037
+		element.insertBefore(context, element.firstChild);
3038
+	}
3039
+
3040
+};
3041
+
3042
+inserters.inside = inserters.bottom;
3043
+
3044
+
3045
+
3046
+var injectCombinator = function(expression, combinator){
3047
+	if (!expression) return combinator;
3048
+
3049
+	expression = Object.clone(Slick.parse(expression));
3050
+
3051
+	var expressions = expression.expressions;
3052
+	for (var i = expressions.length; i--;)
3053
+		expressions[i][0].combinator = combinator;
3054
+
3055
+	return expression;
3056
+};
3057
+
3058
+Element.implement({
3059
+
3060
+	set: function(prop, value){
3061
+		var property = Element.Properties[prop];
3062
+		(property && property.set) ? property.set.call(this, value) : this.setProperty(prop, value);
3063
+	}.overloadSetter(),
3064
+
3065
+	get: function(prop){
3066
+		var property = Element.Properties[prop];
3067
+		return (property && property.get) ? property.get.apply(this) : this.getProperty(prop);
3068
+	}.overloadGetter(),
3069
+
3070
+	erase: function(prop){
3071
+		var property = Element.Properties[prop];
3072
+		(property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop);
3073
+		return this;
3074
+	},
3075
+
3076
+	setProperty: function(attribute, value){
3077
+		attribute = camels[attribute] || attribute;
3078
+		if (value == null) return this.removeProperty(attribute);
3079
+		var key = attributes[attribute];
3080
+		(key) ? this[key] = value :
3081
+			(bools[attribute]) ? this[attribute] = !!value : this.setAttribute(attribute, '' + value);
3082
+		return this;
3083
+	},
3084
+
3085
+	setProperties: function(attributes){
3086
+		for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]);
3087
+		return this;
3088
+	},
3089
+
3090
+	getProperty: function(attribute){
3091
+		attribute = camels[attribute] || attribute;
3092
+		var key = attributes[attribute] || readOnly[attribute];
3093
+		return (key) ? this[key] :
3094
+			(bools[attribute]) ? !!this[attribute] :
3095
+			(uriAttrs.test(attribute) ? this.getAttribute(attribute, 2) :
3096
+			(key = this.getAttributeNode(attribute)) ? key.nodeValue : null) || null;
3097
+	},
3098
+
3099
+	getProperties: function(){
3100
+		var args = Array.from(arguments);
3101
+		return args.map(this.getProperty, this).associate(args);
3102
+	},
3103
+
3104
+	removeProperty: function(attribute){
3105
+		attribute = camels[attribute] || attribute;
3106
+		var key = attributes[attribute];
3107
+		(key) ? this[key] = '' :
3108
+			(bools[attribute]) ? this[attribute] = false : this.removeAttribute(attribute);
3109
+		return this;
3110
+	},
3111
+
3112
+	removeProperties: function(){
3113
+		Array.each(arguments, this.removeProperty, this);
3114
+		return this;
3115
+	},
3116
+
3117
+	hasClass: function(className){
3118
+		return this.className.clean().contains(className, ' ');
3119
+	},
3120
+
3121
+	addClass: function(className){
3122
+		if (!this.hasClass(className)) this.className = (this.className + ' ' + className).clean();
3123
+		return this;
3124
+	},
3125
+
3126
+	removeClass: function(className){
3127
+		this.className = this.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1');
3128
+		return this;
3129
+	},
3130
+
3131
+	toggleClass: function(className, force){
3132
+		if (force == null) force = !this.hasClass(className);
3133
+		return (force) ? this.addClass(className) : this.removeClass(className);
3134
+	},
3135
+
3136
+	adopt: function(){
3137
+		var parent = this, fragment, elements = Array.flatten(arguments), length = elements.length;
3138
+		if (length > 1) parent = fragment = document.createDocumentFragment();
3139
+
3140
+		for (var i = 0; i < length; i++){
3141
+			var element = document.id(elements[i], true);
3142
+			if (element) parent.appendChild(element);
3143
+		}
3144
+
3145
+		if (fragment) this.appendChild(fragment);
3146
+
3147
+		return this;
3148
+	},
3149
+
3150
+	appendText: function(text, where){
3151
+		return this.grab(this.getDocument().newTextNode(text), where);
3152
+	},
3153
+
3154
+	grab: function(el, where){
3155
+		inserters[where || 'bottom'](document.id(el, true), this);
3156
+		return this;
3157
+	},
3158
+
3159
+	inject: function(el, where){
3160
+		inserters[where || 'bottom'](this, document.id(el, true));
3161
+		return this;
3162
+	},
3163
+
3164
+	replaces: function(el){
3165
+		el = document.id(el, true);
3166
+		el.parentNode.replaceChild(this, el);
3167
+		return this;
3168
+	},
3169
+
3170
+	wraps: function(el, where){
3171
+		el = document.id(el, true);
3172
+		return this.replaces(el).grab(el, where);
3173
+	},
3174
+
3175
+	getPrevious: function(expression){
3176
+		return document.id(Slick.find(this, injectCombinator(expression, '!~')));
3177
+	},
3178
+
3179
+	getAllPrevious: function(expression){
3180
+		return Slick.search(this, injectCombinator(expression, '!~'), new Elements);
3181
+	},
3182
+
3183
+	getNext: function(expression){
3184
+		return document.id(Slick.find(this, injectCombinator(expression, '~')));
3185
+	},
3186
+
3187
+	getAllNext: function(expression){
3188
+		return Slick.search(this, injectCombinator(expression, '~'), new Elements);
3189
+	},
3190
+
3191
+	getFirst: function(expression){
3192
+		return document.id(Slick.search(this, injectCombinator(expression, '>'))[0]);
3193
+	},
3194
+
3195
+	getLast: function(expression){
3196
+		return document.id(Slick.search(this, injectCombinator(expression, '>')).getLast());
3197
+	},
3198
+
3199
+	getParent: function(expression){
3200
+		return document.id(Slick.find(this, injectCombinator(expression, '!')));
3201
+	},
3202
+
3203
+	getParents: function(expression){
3204
+		return Slick.search(this, injectCombinator(expression, '!'), new Elements);
3205
+	},
3206
+
3207
+	getSiblings: function(expression){
3208
+		return Slick.search(this, injectCombinator(expression, '~~'), new Elements);
3209
+	},
3210
+
3211
+	getChildren: function(expression){
3212
+		return Slick.search(this, injectCombinator(expression, '>'), new Elements);
3213
+	},
3214
+
3215
+	getWindow: function(){
3216
+		return this.ownerDocument.window;
3217
+	},
3218
+
3219
+	getDocument: function(){
3220
+		return this.ownerDocument;
3221
+	},
3222
+
3223
+	getElementById: function(id){
3224
+		return document.id(Slick.find(this, '#' + ('' + id).replace(/(\W)/g, '\\$1')));
3225
+	},
3226
+
3227
+	getSelected: function(){
3228
+		this.selectedIndex; // Safari 3.2.1
3229
+		return new Elements(Array.from(this.options).filter(function(option){
3230
+			return option.selected;
3231
+		}));
3232
+	},
3233
+
3234
+	toQueryString: function(){
3235
+		var queryString = [];
3236
+		this.getElements('input, select, textarea').each(function(el){
3237
+			var type = el.type;
3238
+			if (!el.name || el.disabled || type == 'submit' || type == 'reset' || type == 'file' || type == 'image') return;
3239
+
3240
+			var value = (el.get('tag') == 'select') ? el.getSelected().map(function(opt){
3241
+				// IE
3242
+				return document.id(opt).get('value');
3243
+			}) : ((type == 'radio' || type == 'checkbox') && !el.checked) ? null : el.get('value');
3244
+
3245
+			Array.from(value).each(function(val){
3246
+				if (typeof val != 'undefined') queryString.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(val));
3247
+			});
3248
+		});
3249
+		return queryString.join('&');
3250
+	},
3251
+
3252
+	destroy: function(){
3253
+		var children = clean(this).getElementsByTagName('*');
3254
+		Array.each(children, clean);
3255
+		Element.dispose(this);
3256
+		return null;
3257
+	},
3258
+
3259
+	empty: function(){
3260
+		Array.from(this.childNodes).each(Element.dispose);
3261
+		return this;
3262
+	},
3263
+
3264
+	dispose: function(){
3265
+		return (this.parentNode) ? this.parentNode.removeChild(this) : this;
3266
+	},
3267
+
3268
+	match: function(expression){
3269
+		return !expression || Slick.match(this, expression);
3270
+	}
3271
+
3272
+});
3273
+
3274
+var cleanClone = function(node, element, keepid){
3275
+	if (!keepid) node.setAttributeNode(document.createAttribute('id'));
3276
+	if (node.clearAttributes){
3277
+		node.clearAttributes();
3278
+		node.mergeAttributes(element);
3279
+		node.removeAttribute('uid');
3280
+		if (node.options){
3281
+			var no = node.options, eo = element.options;
3282
+			for (var i = no.length; i--;) no[i].selected = eo[i].selected;
3283
+		}
3284
+	}
3285
+
3286
+	var prop = formProps[element.tagName.toLowerCase()];
3287
+	if (prop && element[prop]) node[prop] = element[prop];
3288
+};
3289
+
3290
+Element.implement('clone', function(contents, keepid){
3291
+	contents = contents !== false;
3292
+	var clone = this.cloneNode(contents), i;
3293
+
3294
+	if (contents){
3295
+		var ce = clone.getElementsByTagName('*'), te = this.getElementsByTagName('*');
3296
+		for (i = ce.length; i--;) cleanClone(ce[i], te[i], keepid);
3297
+	}
3298
+
3299
+	cleanClone(clone, this, keepid);
3300
+
3301
+	if (Browser.ie){
3302
+		var co = clone.getElementsByTagName('object'), to = this.getElementsByTagName('object');
3303
+		for (i = co.length; i--;) co[i].outerHTML = to[i].outerHTML;
3304
+	}
3305
+	return document.id(clone);
3306
+});
3307
+
3308
+var contains = {contains: function(element){
3309
+	return Slick.contains(this, element);
3310
+}};
3311
+
3312
+if (!document.contains) Document.implement(contains);
3313
+if (!document.createElement('div').contains) Element.implement(contains);
3314
+
3315
+
3316
+
3317
+[Element, Window, Document].invoke('implement', {
3318
+
3319
+	addListener: function(type, fn){
3320
+		if (type == 'unload'){
3321
+			var old = fn, self = this;
3322
+			fn = function(){
3323
+				self.removeListener('unload', fn);
3324
+				old();
3325
+			};
3326
+		} else {
3327
+			collected[$uid(this)] = this;
3328
+		}
3329
+		if (this.addEventListener) this.addEventListener(type, fn, !!arguments[2]);
3330
+		else this.attachEvent('on' + type, fn);
3331
+		return this;
3332
+	},
3333
+
3334
+	removeListener: function(type, fn){
3335
+		if (this.removeEventListener) this.removeEventListener(type, fn, !!arguments[2]);
3336
+		else this.detachEvent('on' + type, fn);
3337
+		return this;
3338
+	},
3339
+
3340
+	retrieve: function(property, dflt){
3341
+		var storage = get($uid(this)), prop = storage[property];
3342
+		if (dflt != null && prop == null) prop = storage[property] = dflt;
3343
+		return prop != null ? prop : null;
3344
+	},
3345
+
3346
+	store: function(property, value){
3347
+		var storage = get($uid(this));
3348
+		storage[property] = value;
3349
+		return this;
3350
+	},
3351
+
3352
+	eliminate: function(property){
3353
+		var storage = get($uid(this));
3354
+		delete storage[property];
3355
+		return this;
3356
+	}
3357
+
3358
+});
3359
+
3360
+// IE purge
3361
+if (window.attachEvent && !window.addEventListener) window.addListener('unload', function(){
3362
+	Object.each(collected, clean);
3363
+	if (window.CollectGarbage) CollectGarbage();
3364
+});
3365
+
3366
+})();
3367
+
3368
+Element.Properties = {};
3369
+
3370
+
3371
+
3372
+Element.Properties.style = {
3373
+
3374
+	set: function(style){
3375
+		this.style.cssText = style;
3376
+	},
3377
+
3378
+	get: function(){
3379
+		return this.style.cssText;
3380
+	},
3381
+
3382
+	erase: function(){
3383
+		this.style.cssText = '';
3384
+	}
3385
+
3386
+};
3387
+
3388
+Element.Properties.tag = {
3389
+
3390
+	get: function(){
3391
+		return this.tagName.toLowerCase();
3392
+	}
3393
+
3394
+};
3395
+
3396
+(function(maxLength){
3397
+	if (maxLength != null) Element.Properties.maxlength = Element.Properties.maxLength = {
3398
+		get: function(){
3399
+			var maxlength = this.getAttribute('maxLength');
3400
+			return maxlength == maxLength ? null : maxlength;
3401
+		}
3402
+	};
3403
+})(document.createElement('input').getAttribute('maxLength'));
3404
+
3405
+Element.Properties.html = (function(){
3406
+
3407
+	var tableTest = Function.attempt(function(){
3408
+		var table = document.createElement('table');
3409
+		table.innerHTML = '<tr><td></td></tr>';
3410
+	});
3411
+
3412
+	var wrapper = document.createElement('div');
3413
+
3414
+	var translations = {
3415
+		table: [1, '<table>', '</table>'],
3416
+		select: [1, '<select>', '</select>'],
3417
+		tbody: [2, '<table><tbody>', '</tbody></table>'],
3418
+		tr: [3, '<table><tbody><tr>', '</tr></tbody></table>']
3419
+	};
3420
+	translations.thead = translations.tfoot = translations.tbody;
3421
+
3422
+	var html = {
3423
+		set: function(){
3424
+			var html = Array.flatten(arguments).join('');
3425
+			var wrap = (!tableTest && translations[this.get('tag')]);
3426
+			if (wrap){
3427
+				var first = wrapper;
3428
+				first.innerHTML = wrap[1] + html + wrap[2];
3429
+				for (var i = wrap[0]; i--;) first = first.firstChild;
3430
+				this.empty().adopt(first.childNodes);
3431
+			} else {
3432
+				this.innerHTML = html;
3433
+			}
3434
+		}
3435
+	};
3436
+
3437
+	html.erase = html.set;
3438
+
3439
+	return html;
3440
+})();
3441
+
3442
+
3443
+/*
3444
+---
3445
+
3446
+name: Element.Style
3447
+
3448
+description: Contains methods for interacting with the styles of Elements in a fashionable way.
3449
+
3450
+license: MIT-style license.
3451
+
3452
+requires: Element
3453
+
3454
+provides: Element.Style
3455
+
3456
+...
3457
+*/
3458
+
3459
+(function(){
3460
+
3461
+var html = document.html;
3462
+
3463
+Element.Properties.styles = {set: function(styles){
3464
+	this.setStyles(styles);
3465
+}};
3466
+
3467
+var hasOpacity = (html.style.opacity != null);
3468
+var reAlpha = /alpha\(opacity=([\d.]+)\)/i;
3469
+
3470
+var setOpacity = function(element, opacity){
3471
+	if (!element.currentStyle || !element.currentStyle.hasLayout) element.style.zoom = 1;
3472
+	if (hasOpacity){
3473
+		element.style.opacity = opacity;
3474
+	} else {
3475
+		opacity = (opacity == 1) ? '' : 'alpha(opacity=' + opacity * 100 + ')';
3476
+		var filter = element.style.filter || element.getComputedStyle('filter') || '';
3477
+		element.style.filter = reAlpha.test(filter) ? filter.replace(reAlpha, opacity) : filter + opacity;
3478
+	}
3479
+};
3480
+
3481
+Element.Properties.opacity = {
3482
+
3483
+	set: function(opacity){
3484
+		var visibility = this.style.visibility;
3485
+		if (opacity == 0 && visibility != 'hidden') this.style.visibility = 'hidden';
3486
+		else if (opacity != 0 && visibility != 'visible') this.style.visibility = 'visible';
3487
+
3488
+		setOpacity(this, opacity);
3489
+	},
3490
+
3491
+	get: (hasOpacity) ? function(){
3492
+		var opacity = this.style.opacity || this.getComputedStyle('opacity');
3493
+		return (opacity == '') ? 1 : opacity;
3494
+	} : function(){
3495
+		var opacity, filter = (this.style.filter || this.getComputedStyle('filter'));
3496
+		if (filter) opacity = filter.match(reAlpha);
3497
+		return (opacity == null || filter == null) ? 1 : (opacity[1] / 100);
3498
+	}
3499
+
3500
+};
3501
+
3502
+var floatName = (html.style.cssFloat == null) ? 'styleFloat' : 'cssFloat';
3503
+
3504
+Element.implement({
3505
+
3506
+	getComputedStyle: function(property){
3507
+		if (this.currentStyle) return this.currentStyle[property.camelCase()];
3508
+		var defaultView = Element.getDocument(this).defaultView,
3509
+			computed = defaultView ? defaultView.getComputedStyle(this, null) : null;
3510
+		return (computed) ? computed.getPropertyValue((property == floatName) ? 'float' : property.hyphenate()) : null;
3511
+	},
3512
+
3513
+	setOpacity: function(value){
3514
+		setOpacity(this, value);
3515
+		return this;
3516
+	},
3517
+
3518
+	getOpacity: function(){
3519
+		return this.get('opacity');
3520
+	},
3521
+
3522
+	setStyle: function(property, value){
3523
+		switch (property){
3524
+			case 'opacity': return this.set('opacity', parseFloat(value));
3525
+			case 'float': property = floatName;
3526
+		}
3527
+		property = property.camelCase();
3528
+		if (typeOf(value) != 'string'){
3529
+			var map = (Element.Styles[property] || '@').split(' ');
3530
+			value = Array.from(value).map(function(val, i){
3531
+				if (!map[i]) return '';
3532
+				return (typeOf(val) == 'number') ? map[i].replace('@', Math.round(val)) : val;
3533
+			}).join(' ');
3534
+		} else if (value == String(Number(value))){
3535
+			value = Math.round(value);
3536
+		}
3537
+		this.style[property] = value;
3538
+		return this;
3539
+	},
3540
+
3541
+	getStyle: function(property){
3542
+		switch (property){
3543
+			case 'opacity': return this.get('opacity');
3544
+			case 'float': property = floatName;
3545
+		}
3546
+		property = property.camelCase();
3547
+		var result = this.style[property];
3548
+		if (!result || property == 'zIndex'){
3549
+			result = [];
3550
+			for (var style in Element.ShortStyles){
3551
+				if (property != style) continue;
3552
+				for (var s in Element.ShortStyles[style]) result.push(this.getStyle(s));
3553
+				return result.join(' ');
3554
+			}
3555
+			result = this.getComputedStyle(property);
3556
+		}
3557
+		if (result){
3558
+			result = String(result);
3559
+			var color = result.match(/rgba?\([\d\s,]+\)/);
3560
+			if (color) result = result.replace(color[0], color[0].rgbToHex());
3561
+		}
3562
+		if (Browser.opera || (Browser.ie && isNaN(parseFloat(result)))){
3563
+			if ((/^(height|width)$/).test(property)){
3564
+				var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0;
3565
+				values.each(function(value){
3566
+					size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt();
3567
+				}, this);
3568
+				return this['offset' + property.capitalize()] - size + 'px';
3569
+			}
3570
+			if (Browser.opera && String(result).indexOf('px') != -1) return result;
3571
+			if ((/^border(.+)Width|margin|padding/).test(property)) return '0px';
3572
+		}
3573
+		return result;
3574
+	},
3575
+
3576
+	setStyles: function(styles){
3577
+		for (var style in styles) this.setStyle(style, styles[style]);
3578
+		return this;
3579
+	},
3580
+
3581
+	getStyles: function(){
3582
+		var result = {};
3583
+		Array.flatten(arguments).each(function(key){
3584
+			result[key] = this.getStyle(key);
3585
+		}, this);
3586
+		return result;
3587
+	}
3588
+
3589
+});
3590
+
3591
+Element.Styles = {
3592
+	left: '@px', top: '@px', bottom: '@px', right: '@px',
3593
+	width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px',
3594
+	backgroundColor: 'rgb(@, @, @)', backgroundPosition: '@px @px', color: 'rgb(@, @, @)',
3595
+	fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)',
3596
+	margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)',
3597
+	borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)',
3598
+	zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@'
3599
+};
3600
+
3601
+
3602
+
3603
+Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}};
3604
+
3605
+['Top', 'Right', 'Bottom', 'Left'].each(function(direction){
3606
+	var Short = Element.ShortStyles;
3607
+	var All = Element.Styles;
3608
+	['margin', 'padding'].each(function(style){
3609
+		var sd = style + direction;
3610
+		Short[style][sd] = All[sd] = '@px';
3611
+	});
3612
+	var bd = 'border' + direction;
3613
+	Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)';
3614
+	var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color';
3615
+	Short[bd] = {};
3616
+	Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px';
3617
+	Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@';
3618
+	Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)';
3619
+});
3620
+
3621
+}).call(this);
3622
+
3623
+
3624
+/*
3625
+---
3626
+
3627
+name: Element.Event
3628
+
3629
+description: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events.
3630
+
3631
+license: MIT-style license.
3632
+
3633
+requires: [Element, Event]
3634
+
3635
+provides: Element.Event
3636
+
3637
+...
3638
+*/
3639
+
3640
+(function(){
3641
+
3642
+Element.Properties.events = {set: function(events){
3643
+	this.addEvents(events);
3644
+}};
3645
+
3646
+[Element, Window, Document].invoke('implement', {
3647
+
3648
+	addEvent: function(type, fn){
3649
+		var events = this.retrieve('events', {});
3650
+		if (!events[type]) events[type] = {keys: [], values: []};
3651
+		if (events[type].keys.contains(fn)) return this;
3652
+		events[type].keys.push(fn);
3653
+		var realType = type,
3654
+			custom = Element.Events[type],
3655
+			condition = fn,
3656
+			self = this;
3657
+		if (custom){
3658
+			if (custom.onAdd) custom.onAdd.call(this, fn);
3659
+			if (custom.condition){
3660
+				condition = function(event){
3661
+					if (custom.condition.call(this, event)) return fn.call(this, event);
3662
+					return true;
3663
+				};
3664
+			}
3665
+			realType = custom.base || realType;
3666
+		}
3667
+		var defn = function(){
3668
+			return fn.call(self);
3669
+		};
3670
+		var nativeEvent = Element.NativeEvents[realType];
3671
+		if (nativeEvent){
3672
+			if (nativeEvent == 2){
3673
+				defn = function(event){
3674
+					event = new Event(event, self.getWindow());
3675
+					if (condition.call(self, event) === false) event.stop();
3676
+				};
3677
+			}
3678
+			this.addListener(realType, defn, arguments[2]);
3679
+		}
3680
+		events[type].values.push(defn);
3681
+		return this;
3682
+	},
3683
+
3684
+	removeEvent: function(type, fn){
3685
+		var events = this.retrieve('events');
3686
+		if (!events || !events[type]) return this;
3687
+		var list = events[type];
3688
+		var index = list.keys.indexOf(fn);
3689
+		if (index == -1) return this;
3690
+		var value = list.values[index];
3691
+		delete list.keys[index];
3692
+		delete list.values[index];
3693
+		var custom = Element.Events[type];
3694
+		if (custom){
3695
+			if (custom.onRemove) custom.onRemove.call(this, fn);
3696
+			type = custom.base || type;
3697
+		}
3698
+		return (Element.NativeEvents[type]) ? this.removeListener(type, value, arguments[2]) : this;
3699
+	},
3700
+
3701
+	addEvents: function(events){
3702
+		for (var event in events) this.addEvent(event, events[event]);
3703
+		return this;
3704
+	},
3705
+
3706
+	removeEvents: function(events){
3707
+		var type;
3708
+		if (typeOf(events) == 'object'){
3709
+			for (type in events) this.removeEvent(type, events[type]);
3710
+			return this;
3711
+		}
3712
+		var attached = this.retrieve('events');
3713
+		if (!attached) return this;
3714
+		if (!events){
3715
+			for (type in attached) this.removeEvents(type);
3716
+			this.eliminate('events');
3717
+		} else if (attached[events]){
3718
+			attached[events].keys.each(function(fn){
3719
+				this.removeEvent(events, fn);
3720
+			}, this);
3721
+			delete attached[events];
3722
+		}
3723
+		return this;
3724
+	},
3725
+
3726
+	fireEvent: function(type, args, delay){
3727
+		var events = this.retrieve('events');
3728
+		if (!events || !events[type]) return this;
3729
+		args = Array.from(args);
3730
+
3731
+		events[type].keys.each(function(fn){
3732
+			if (delay) fn.delay(delay, this, args);
3733
+			else fn.apply(this, args);
3734
+		}, this);
3735
+		return this;
3736
+	},
3737
+
3738
+	cloneEvents: function(from, type){
3739
+		from = document.id(from);
3740
+		var events = from.retrieve('events');
3741
+		if (!events) return this;
3742
+		if (!type){
3743
+			for (var eventType in events) this.cloneEvents(from, eventType);
3744
+		} else if (events[type]){
3745
+			events[type].keys.each(function(fn){
3746
+				this.addEvent(type, fn);
3747
+			}, this);
3748
+		}
3749
+		return this;
3750
+	}
3751
+
3752
+});
3753
+
3754
+Element.NativeEvents = {
3755
+	click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons
3756
+	mousewheel: 2, DOMMouseScroll: 2, //mouse wheel
3757
+	mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement
3758
+	keydown: 2, keypress: 2, keyup: 2, //keyboard
3759
+	orientationchange: 2, // mobile
3760
+	touchstart: 2, touchmove: 2, touchend: 2, touchcancel: 2, // touch
3761
+	gesturestart: 2, gesturechange: 2, gestureend: 2, // gesture
3762
+	focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, //form elements
3763
+	load: 2, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window
3764
+	error: 1, abort: 1, scroll: 1 //misc
3765
+};
3766
+
3767
+var check = function(event){
3768
+	var related = event.relatedTarget;
3769
+	if (related == null) return true;
3770
+	if (!related) return false;
3771
+	return (related != this && related.prefix != 'xul' && typeOf(this) != 'document' && !this.contains(related));
3772
+};
3773
+
3774
+Element.Events = {
3775
+
3776
+	mouseenter: {
3777
+		base: 'mouseover',
3778
+		condition: check
3779
+	},
3780
+
3781
+	mouseleave: {
3782
+		base: 'mouseout',
3783
+		condition: check
3784
+	},
3785
+
3786
+	mousewheel: {
3787
+		base: (Browser.firefox) ? 'DOMMouseScroll' : 'mousewheel'
3788
+	}
3789
+
3790
+};
3791
+
3792
+
3793
+
3794
+}).call(this);
3795
+
3796
+
3797
+/*
3798
+---
3799
+
3800
+name: Element.Dimensions
3801
+
3802
+description: Contains methods to work with size, scroll, or positioning of Elements and the window object.
3803
+
3804
+license: MIT-style license.
3805
+
3806
+credits:
3807
+  - Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html).
3808
+  - Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html).
3809
+
3810
+requires: [Element, Element.Style]
3811
+
3812
+provides: [Element.Dimensions]
3813
+
3814
+...
3815
+*/
3816
+
3817
+(function(){
3818
+
3819
+var element = document.createElement('div'),
3820
+	child = document.createElement('div');
3821
+element.style.height = '0';
3822
+element.appendChild(child);
3823
+var brokenOffsetParent = (child.offsetParent === element);
3824
+element = child = null;
3825
+
3826
+var isOffset = function(el){
3827
+	return styleString(el, 'position') != 'static' || isBody(el);
3828
+};
3829
+
3830
+var isOffsetStatic = function(el){
3831
+	return isOffset(el) || (/^(?:table|td|th)$/i).test(el.tagName);
3832
+};
3833
+
3834
+Element.implement({
3835
+
3836
+	scrollTo: function(x, y){
3837
+		if (isBody(this)){
3838
+			this.getWindow().scrollTo(x, y);
3839
+		} else {
3840
+			this.scrollLeft = x;
3841
+			this.scrollTop = y;
3842
+		}
3843
+		return this;
3844
+	},
3845
+
3846
+	getSize: function(){
3847
+		if (isBody(this)) return this.getWindow().getSize();
3848
+		return {x: this.offsetWidth, y: this.offsetHeight};
3849
+	},
3850
+
3851
+	getScrollSize: function(){
3852
+		if (isBody(this)) return this.getWindow().getScrollSize();
3853
+		return {x: this.scrollWidth, y: this.scrollHeight};
3854
+	},
3855
+
3856
+	getScroll: function(){
3857
+		if (isBody(this)) return this.getWindow().getScroll();
3858
+		return {x: this.scrollLeft, y: this.scrollTop};
3859
+	},
3860
+
3861
+	getScrolls: function(){
3862
+		var element = this.parentNode, position = {x: 0, y: 0};
3863
+		while (element && !isBody(element)){
3864
+			position.x += element.scrollLeft;
3865
+			position.y += element.scrollTop;
3866
+			element = element.parentNode;
3867
+		}
3868
+		return position;
3869
+	},
3870
+
3871
+	getOffsetParent: brokenOffsetParent ? function(){
3872
+		var element = this;
3873
+		if (isBody(element) || styleString(element, 'position') == 'fixed') return null;
3874
+
3875
+		var isOffsetCheck = (styleString(element, 'position') == 'static') ? isOffsetStatic : isOffset;
3876
+		while ((element = element.parentNode)){
3877
+			if (isOffsetCheck(element)) return element;
3878
+		}
3879
+		return null;
3880
+	} : function(){
3881
+		var element = this;
3882
+		if (isBody(element) || styleString(element, 'position') == 'fixed') return null;
3883
+
3884
+		try {
3885
+			return element.offsetParent;
3886
+		} catch(e) {}
3887
+		return null;
3888
+	},
3889
+
3890
+	getOffsets: function(){
3891
+		if (this.getBoundingClientRect && !Browser.Platform.ios){
3892
+			var bound = this.getBoundingClientRect(),
3893
+				html = document.id(this.getDocument().documentElement),
3894
+				htmlScroll = html.getScroll(),
3895
+				elemScrolls = this.getScrolls(),
3896
+				isFixed = (styleString(this, 'position') == 'fixed');
3897
+
3898
+			return {
3899
+				x: bound.left.toInt() + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft,
3900
+				y: bound.top.toInt()  + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop
3901
+			};
3902
+		}
3903
+
3904
+		var element = this, position = {x: 0, y: 0};
3905
+		if (isBody(this)) return position;
3906
+
3907
+		while (element && !isBody(element)){
3908
+			position.x += element.offsetLeft;
3909
+			position.y += element.offsetTop;
3910
+
3911
+			if (Browser.firefox){
3912
+				if (!borderBox(element)){
3913
+					position.x += leftBorder(element);
3914
+					position.y += topBorder(element);
3915
+				}
3916
+				var parent = element.parentNode;
3917
+				if (parent && styleString(parent, 'overflow') != 'visible'){
3918
+					position.x += leftBorder(parent);
3919
+					position.y += topBorder(parent);
3920
+				}
3921
+			} else if (element != this && Browser.safari){
3922
+				position.x += leftBorder(element);
3923
+				position.y += topBorder(element);
3924
+			}
3925
+
3926
+			element = element.offsetParent;
3927
+		}
3928
+		if (Browser.firefox && !borderBox(this)){
3929
+			position.x -= leftBorder(this);
3930
+			position.y -= topBorder(this);
3931
+		}
3932
+		return position;
3933
+	},
3934
+
3935
+	getPosition: function(relative){
3936
+		if (isBody(this)) return {x: 0, y: 0};
3937
+		var offset = this.getOffsets(),
3938
+			scroll = this.getScrolls();
3939
+		var position = {
3940
+			x: offset.x - scroll.x,
3941
+			y: offset.y - scroll.y
3942
+		};
3943
+
3944
+		if (relative && (relative = document.id(relative))){
3945
+			var relativePosition = relative.getPosition();
3946
+			return {x: position.x - relativePosition.x - leftBorder(relative), y: position.y - relativePosition.y - topBorder(relative)};
3947
+		}
3948
+		return position;
3949
+	},
3950
+
3951
+	getCoordinates: function(element){
3952
+		if (isBody(this)) return this.getWindow().getCoordinates();
3953
+		var position = this.getPosition(element),
3954
+			size = this.getSize();
3955
+		var obj = {
3956
+			left: position.x,
3957
+			top: position.y,
3958
+			width: size.x,
3959
+			height: size.y
3960
+		};
3961
+		obj.right = obj.left + obj.width;
3962
+		obj.bottom = obj.top + obj.height;
3963
+		return obj;
3964
+	},
3965
+
3966
+	computePosition: function(obj){
3967
+		return {
3968
+			left: obj.x - styleNumber(this, 'margin-left'),
3969
+			top: obj.y - styleNumber(this, 'margin-top')
3970
+		};
3971
+	},
3972
+
3973
+	setPosition: function(obj){
3974
+		return this.setStyles(this.computePosition(obj));
3975
+	}
3976
+
3977
+});
3978
+
3979
+
3980
+[Document, Window].invoke('implement', {
3981
+
3982
+	getSize: function(){
3983
+		var doc = getCompatElement(this);
3984
+		return {x: doc.clientWidth, y: doc.clientHeight};
3985
+	},
3986
+
3987
+	getScroll: function(){
3988
+		var win = this.getWindow(), doc = getCompatElement(this);
3989
+		return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop};
3990
+	},
3991
+
3992
+	getScrollSize: function(){
3993
+		var doc = getCompatElement(this),
3994
+			min = this.getSize(),
3995
+			body = this.getDocument().body;
3996
+
3997
+		return {x: Math.max(doc.scrollWidth, body.scrollWidth, min.x), y: Math.max(doc.scrollHeight, body.scrollHeight, min.y)};
3998
+	},
3999
+
4000
+	getPosition: function(){
4001
+		return {x: 0, y: 0};
4002
+	},
4003
+
4004
+	getCoordinates: function(){
4005
+		var size = this.getSize();
4006
+		return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x};
4007
+	}
4008
+
4009
+});
4010
+
4011
+// private methods
4012
+
4013
+var styleString = Element.getComputedStyle;
4014
+
4015
+function styleNumber(element, style){
4016
+	return styleString(element, style).toInt() || 0;
4017
+}
4018
+
4019
+function borderBox(element){
4020
+	return styleString(element, '-moz-box-sizing') == 'border-box';
4021
+}
4022
+
4023
+function topBorder(element){
4024
+	return styleNumber(element, 'border-top-width');
4025
+}
4026
+
4027
+function leftBorder(element){
4028
+	return styleNumber(element, 'border-left-width');
4029
+}
4030
+
4031
+function isBody(element){
4032
+	return (/^(?:body|html)$/i).test(element.tagName);
4033
+}
4034
+
4035
+function getCompatElement(element){
4036
+	var doc = element.getDocument();
4037
+	return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
4038
+}
4039
+
4040
+}).call(this);
4041
+
4042
+//aliases
4043
+Element.alias({position: 'setPosition'}); //compatability
4044
+
4045
+[Window, Document, Element].invoke('implement', {
4046
+
4047
+	getHeight: function(){
4048
+		return this.getSize().y;
4049
+	},
4050
+
4051
+	getWidth: function(){
4052
+		return this.getSize().x;
4053
+	},
4054
+
4055
+	getScrollTop: function(){
4056
+		return this.getScroll().y;
4057
+	},
4058
+
4059
+	getScrollLeft: function(){
4060
+		return this.getScroll().x;
4061
+	},
4062
+
4063
+	getScrollHeight: function(){
4064
+		return this.getScrollSize().y;
4065
+	},
4066
+
4067
+	getScrollWidth: function(){
4068
+		return this.getScrollSize().x;
4069
+	},
4070
+
4071
+	getTop: function(){
4072
+		return this.getPosition().y;
4073
+	},
4074
+
4075
+	getLeft: function(){
4076
+		return this.getPosition().x;
4077
+	}
4078
+
4079
+});
4080
+
4081
+
4082
+/*
4083
+---
4084
+
4085
+name: Fx
4086
+
4087
+description: Contains the basic animation logic to be extended by all other Fx Classes.
4088
+
4089
+license: MIT-style license.
4090
+
4091
+requires: [Chain, Events, Options]
4092
+
4093
+provides: Fx
4094
+
4095
+...
4096
+*/
4097
+
4098
+(function(){
4099
+
4100
+var Fx = this.Fx = new Class({
4101
+
4102
+	Implements: [Chain, Events, Options],
4103
+
4104
+	options: {
4105
+		/*
4106
+		onStart: nil,
4107
+		onCancel: nil,
4108
+		onComplete: nil,
4109
+		*/
4110
+		fps: 60,
4111
+		unit: false,
4112
+		duration: 500,
4113
+		frames: null,
4114
+		frameSkip: true,
4115
+		link: 'ignore'
4116
+	},
4117
+
4118
+	initialize: function(options){
4119
+		this.subject = this.subject || this;
4120
+		this.setOptions(options);
4121
+	},
4122
+
4123
+	getTransition: function(){
4124
+		return function(p){
4125
+			return -(Math.cos(Math.PI * p) - 1) / 2;
4126
+		};
4127
+	},
4128
+
4129
+	step: function(now){
4130
+		if (this.options.frameSkip){
4131
+			var diff = (this.time != null) ? (now - this.time) : 0, frames = diff / this.frameInterval;
4132
+			this.time = now;
4133
+			this.frame += frames;
4134
+		} else {
4135
+			this.frame++;
4136
+		}
4137
+
4138
+		if (this.frame < this.frames){
4139
+			var delta = this.transition(this.frame / this.frames);
4140
+			this.set(this.compute(this.from, this.to, delta));
4141
+		} else {
4142
+			this.frame = this.frames;
4143
+			this.set(this.compute(this.from, this.to, 1));
4144
+			this.stop();
4145
+		}
4146
+	},
4147
+
4148
+	set: function(now){
4149
+		return now;
4150
+	},
4151
+
4152
+	compute: function(from, to, delta){
4153
+		return Fx.compute(from, to, delta);
4154
+	},
4155
+
4156
+	check: function(){
4157
+		if (!this.isRunning()) return true;
4158
+		switch (this.options.link){
4159
+			case 'cancel': this.cancel(); return true;
4160
+			case 'chain': this.chain(this.caller.pass(arguments, this)); return false;
4161
+		}
4162
+		return false;
4163
+	},
4164
+
4165
+	start: function(from, to){
4166
+		if (!this.check(from, to)) return this;
4167
+		this.from = from;
4168
+		this.to = to;
4169
+		this.frame = (this.options.frameSkip) ? 0 : -1;
4170
+		this.time = null;
4171
+		this.transition = this.getTransition();
4172
+		var frames = this.options.frames, fps = this.options.fps, duration = this.options.duration;
4173
+		this.duration = Fx.Durations[duration] || duration.toInt();
4174
+		this.frameInterval = 1000 / fps;
4175
+		this.frames = frames || Math.round(this.duration / this.frameInterval);
4176
+		this.fireEvent('start', this.subject);
4177
+		pushInstance.call(this, fps);
4178
+		return this;
4179
+	},
4180
+
4181
+	stop: function(){
4182
+		if (this.isRunning()){
4183
+			this.time = null;
4184
+			pullInstance.call(this, this.options.fps);
4185
+			if (this.frames == this.frame){
4186
+				this.fireEvent('complete', this.subject);
4187
+				if (!this.callChain()) this.fireEvent('chainComplete', this.subject);
4188
+			} else {
4189
+				this.fireEvent('stop', this.subject);
4190
+			}
4191
+		}
4192
+		return this;
4193
+	},
4194
+
4195
+	cancel: function(){
4196
+		if (this.isRunning()){
4197
+			this.time = null;
4198
+			pullInstance.call(this, this.options.fps);
4199
+			this.frame = this.frames;
4200
+			this.fireEvent('cancel', this.subject).clearChain();
4201
+		}
4202
+		return this;
4203
+	},
4204
+
4205
+	pause: function(){
4206
+		if (this.isRunning()){
4207
+			this.time = null;
4208
+			pullInstance.call(this, this.options.fps);
4209
+		}
4210
+		return this;
4211
+	},
4212
+
4213
+	resume: function(){
4214
+		if ((this.frame < this.frames) && !this.isRunning()) pushInstance.call(this, this.options.fps);
4215
+		return this;
4216
+	},
4217
+
4218
+	isRunning: function(){
4219
+		var list = instances[this.options.fps];
4220
+		return list && list.contains(this);
4221
+	}
4222
+
4223
+});
4224
+
4225
+Fx.compute = function(from, to, delta){
4226
+	return (to - from) * delta + from;
4227
+};
4228
+
4229
+Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000};
4230
+
4231
+// global timers
4232
+
4233
+var instances = {}, timers = {};
4234
+
4235
+var loop = function(){
4236
+	var now = Date.now();
4237
+	for (var i = this.length; i--;){
4238
+		var instance = this[i];
4239
+		if (instance) instance.step(now);
4240
+	}
4241
+};
4242
+
4243
+var pushInstance = function(fps){
4244
+	var list = instances[fps] || (instances[fps] = []);
4245
+	list.push(this);
4246
+	if (!timers[fps]) timers[fps] = loop.periodical(Math.round(1000 / fps), list);
4247
+};
4248
+
4249
+var pullInstance = function(fps){
4250
+	var list = instances[fps];
4251
+	if (list){
4252
+		list.erase(this);
4253
+		if (!list.length && timers[fps]){
4254
+			delete instances[fps];
4255
+			timers[fps] = clearInterval(timers[fps]);
4256
+		}
4257
+	}
4258
+};
4259
+
4260
+}).call(this);
4261
+
4262
+
4263
+/*
4264
+---
4265
+
4266
+name: Fx.CSS
4267
+
4268
+description: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements.
4269
+
4270
+license: MIT-style license.
4271
+
4272
+requires: [Fx, Element.Style]
4273
+
4274
+provides: Fx.CSS
4275
+
4276
+...
4277
+*/
4278
+
4279
+Fx.CSS = new Class({
4280
+
4281
+	Extends: Fx,
4282
+
4283
+	//prepares the base from/to object
4284
+
4285
+	prepare: function(element, property, values){
4286
+		values = Array.from(values);
4287
+		if (values[1] == null){
4288
+			values[1] = values[0];
4289
+			values[0] = element.getStyle(property);
4290
+		}
4291
+		var parsed = values.map(this.parse);
4292
+		return {from: parsed[0], to: parsed[1]};
4293
+	},
4294
+
4295
+	//parses a value into an array
4296
+
4297
+	parse: function(value){
4298
+		value = Function.from(value)();
4299
+		value = (typeof value == 'string') ? value.split(' ') : Array.from(value);
4300
+		return value.map(function(val){
4301
+			val = String(val);
4302
+			var found = false;
4303
+			Object.each(Fx.CSS.Parsers, function(parser, key){
4304
+				if (found) return;
4305
+				var parsed = parser.parse(val);
4306
+				if (parsed || parsed === 0) found = {value: parsed, parser: parser};
4307
+			});
4308
+			found = found || {value: val, parser: Fx.CSS.Parsers.String};
4309
+			return found;
4310
+		});
4311
+	},
4312
+
4313
+	//computes by a from and to prepared objects, using their parsers.
4314
+
4315
+	compute: function(from, to, delta){
4316
+		var computed = [];
4317
+		(Math.min(from.length, to.length)).times(function(i){
4318
+			computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser});
4319
+		});
4320
+		computed.$family = Function.from('fx:css:value');
4321
+		return computed;
4322
+	},
4323
+
4324
+	//serves the value as settable
4325
+
4326
+	serve: function(value, unit){
4327
+		if (typeOf(value) != 'fx:css:value') value = this.parse(value);
4328
+		var returned = [];
4329
+		value.each(function(bit){
4330
+			returned = returned.concat(bit.parser.serve(bit.value, unit));
4331
+		});
4332
+		return returned;
4333
+	},
4334
+
4335
+	//renders the change to an element
4336
+
4337
+	render: function(element, property, value, unit){
4338
+		element.setStyle(property, this.serve(value, unit));
4339
+	},
4340
+
4341
+	//searches inside the page css to find the values for a selector
4342
+
4343
+	search: function(selector){
4344
+		if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector];
4345
+		var to = {}, selectorTest = new RegExp('^' + selector.escapeRegExp() + '$');
4346
+		Array.each(document.styleSheets, function(sheet, j){
4347
+			var href = sheet.href;
4348
+			if (href && href.contains('://') && !href.contains(document.domain)) return;
4349
+			var rules = sheet.rules || sheet.cssRules;
4350
+			Array.each(rules, function(rule, i){
4351
+				if (!rule.style) return;
4352
+				var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){
4353
+					return m.toLowerCase();
4354
+				}) : null;
4355
+				if (!selectorText || !selectorTest.test(selectorText)) return;
4356
+				Object.each(Element.Styles, function(value, style){
4357
+					if (!rule.style[style] || Element.ShortStyles[style]) return;
4358
+					value = String(rule.style[style]);
4359
+					to[style] = ((/^rgb/).test(value)) ? value.rgbToHex() : value;
4360
+				});
4361
+			});
4362
+		});
4363
+		return Fx.CSS.Cache[selector] = to;
4364
+	}
4365
+
4366
+});
4367
+
4368
+Fx.CSS.Cache = {};
4369
+
4370
+Fx.CSS.Parsers = {
4371
+
4372
+	Color: {
4373
+		parse: function(value){
4374
+			if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true);
4375
+			return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false;
4376
+		},
4377
+		compute: function(from, to, delta){
4378
+			return from.map(function(value, i){
4379
+				return Math.round(Fx.compute(from[i], to[i], delta));
4380
+			});
4381
+		},
4382
+		serve: function(value){
4383
+			return value.map(Number);
4384
+		}
4385
+	},
4386
+
4387
+	Number: {
4388
+		parse: parseFloat,
4389
+		compute: Fx.compute,
4390
+		serve: function(value, unit){
4391
+			return (unit) ? value + unit : value;
4392
+		}
4393
+	},
4394
+
4395
+	String: {
4396
+		parse: Function.from(false),
4397
+		compute: function(zero, one){
4398
+			return one;
4399
+		},
4400
+		serve: function(zero){
4401
+			return zero;
4402
+		}
4403
+	}
4404
+
4405
+};
4406
+
4407
+
4408
+
4409
+
4410
+/*
4411
+---
4412
+
4413
+name: Fx.Tween
4414
+
4415
+description: Formerly Fx.Style, effect to transition any CSS property for an element.
4416
+
4417
+license: MIT-style license.
4418
+
4419
+requires: Fx.CSS
4420
+
4421
+provides: [Fx.Tween, Element.fade, Element.highlight]
4422
+
4423
+...
4424
+*/
4425
+
4426
+Fx.Tween = new Class({
4427
+
4428
+	Extends: Fx.CSS,
4429
+
4430
+	initialize: function(element, options){
4431
+		this.element = this.subject = document.id(element);
4432
+		this.parent(options);
4433
+	},
4434
+
4435
+	set: function(property, now){
4436
+		if (arguments.length == 1){
4437
+			now = property;
4438
+			property = this.property || this.options.property;
4439
+		}
4440
+		this.render(this.element, property, now, this.options.unit);
4441
+		return this;
4442
+	},
4443
+
4444
+	start: function(property, from, to){
4445
+		if (!this.check(property, from, to)) return this;
4446
+		var args = Array.flatten(arguments);
4447
+		this.property = this.options.property || args.shift();
4448
+		var parsed = this.prepare(this.element, this.property, args);
4449
+		return this.parent(parsed.from, parsed.to);
4450
+	}
4451
+
4452
+});
4453
+
4454
+Element.Properties.tween = {
4455
+
4456
+	set: function(options){
4457
+		this.get('tween').cancel().setOptions(options);
4458
+		return this;
4459
+	},
4460
+
4461
+	get: function(){
4462
+		var tween = this.retrieve('tween');
4463
+		if (!tween){
4464
+			tween = new Fx.Tween(this, {link: 'cancel'});
4465
+			this.store('tween', tween);
4466
+		}
4467
+		return tween;
4468
+	}
4469
+
4470
+};
4471
+
4472
+Element.implement({
4473
+
4474
+	tween: function(property, from, to){
4475
+		this.get('tween').start(arguments);
4476
+		return this;
4477
+	},
4478
+
4479
+	fade: function(how){
4480
+		var fade = this.get('tween'), o = 'opacity', toggle;
4481
+		how = [how, 'toggle'].pick();
4482
+		switch (how){
4483
+			case 'in': fade.start(o, 1); break;
4484
+			case 'out': fade.start(o, 0); break;
4485
+			case 'show': fade.set(o, 1); break;
4486
+			case 'hide': fade.set(o, 0); break;
4487
+			case 'toggle':
4488
+				var flag = this.retrieve('fade:flag', this.get('opacity') == 1);
4489
+				fade.start(o, (flag) ? 0 : 1);
4490
+				this.store('fade:flag', !flag);
4491
+				toggle = true;
4492
+			break;
4493
+			default: fade.start(o, arguments);
4494
+		}
4495
+		if (!toggle) this.eliminate('fade:flag');
4496
+		return this;
4497
+	},
4498
+
4499
+	highlight: function(start, end){
4500
+		if (!end){
4501
+			end = this.retrieve('highlight:original', this.getStyle('background-color'));
4502
+			end = (end == 'transparent') ? '#fff' : end;
4503
+		}
4504
+		var tween = this.get('tween');
4505
+		tween.start('background-color', start || '#ffff88', end).chain(function(){
4506
+			this.setStyle('background-color', this.retrieve('highlight:original'));
4507
+			tween.callChain();
4508
+		}.bind(this));
4509
+		return this;
4510
+	}
4511
+
4512
+});
4513
+
4514
+
4515
+/*
4516
+---
4517
+
4518
+name: Fx.Morph
4519
+
4520
+description: Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules.
4521
+
4522
+license: MIT-style license.
4523
+
4524
+requires: Fx.CSS
4525
+
4526
+provides: Fx.Morph
4527
+
4528
+...
4529
+*/
4530
+
4531
+Fx.Morph = new Class({
4532
+
4533
+	Extends: Fx.CSS,
4534
+
4535
+	initialize: function(element, options){
4536
+		this.element = this.subject = document.id(element);
4537
+		this.parent(options);
4538
+	},
4539
+
4540
+	set: function(now){
4541
+		if (typeof now == 'string') now = this.search(now);
4542
+		for (var p in now) this.render(this.element, p, now[p], this.options.unit);
4543
+		return this;
4544
+	},
4545
+
4546
+	compute: function(from, to, delta){
4547
+		var now = {};
4548
+		for (var p in from) now[p] = this.parent(from[p], to[p], delta);
4549
+		return now;
4550
+	},
4551
+
4552
+	start: function(properties){
4553
+		if (!this.check(properties)) return this;
4554
+		if (typeof properties == 'string') properties = this.search(properties);
4555
+		var from = {}, to = {};
4556
+		for (var p in properties){
4557
+			var parsed = this.prepare(this.element, p, properties[p]);
4558
+			from[p] = parsed.from;
4559
+			to[p] = parsed.to;
4560
+		}
4561
+		return this.parent(from, to);
4562
+	}
4563
+
4564
+});
4565
+
4566
+Element.Properties.morph = {
4567
+
4568
+	set: function(options){
4569
+		this.get('morph').cancel().setOptions(options);
4570
+		return this;
4571
+	},
4572
+
4573
+	get: function(){
4574
+		var morph = this.retrieve('morph');
4575
+		if (!morph){
4576
+			morph = new Fx.Morph(this, {link: 'cancel'});
4577
+			this.store('morph', morph);
4578
+		}
4579
+		return morph;
4580
+	}
4581
+
4582
+};
4583
+
4584
+Element.implement({
4585
+
4586
+	morph: function(props){
4587
+		this.get('morph').start(props);
4588
+		return this;
4589
+	}
4590
+
4591
+});
4592
+
4593
+
4594
+/*
4595
+---
4596
+
4597
+name: Fx.Transitions
4598
+
4599
+description: Contains a set of advanced transitions to be used with any of the Fx Classes.
4600
+
4601
+license: MIT-style license.
4602
+
4603
+credits:
4604
+  - Easing Equations by Robert Penner, <http://www.robertpenner.com/easing/>, modified and optimized to be used with MooTools.
4605
+
4606
+requires: Fx
4607
+
4608
+provides: Fx.Transitions
4609
+
4610
+...
4611
+*/
4612
+
4613
+Fx.implement({
4614
+
4615
+	getTransition: function(){
4616
+		var trans = this.options.transition || Fx.Transitions.Sine.easeInOut;
4617
+		if (typeof trans == 'string'){
4618
+			var data = trans.split(':');
4619
+			trans = Fx.Transitions;
4620
+			trans = trans[data[0]] || trans[data[0].capitalize()];
4621
+			if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')];
4622
+		}
4623
+		return trans;
4624
+	}
4625
+
4626
+});
4627
+
4628
+Fx.Transition = function(transition, params){
4629
+	params = Array.from(params);
4630
+	var easeIn = function(pos){
4631
+		return transition(pos, params);
4632
+	};
4633
+	return Object.append(easeIn, {
4634
+		easeIn: easeIn,
4635
+		easeOut: function(pos){
4636
+			return 1 - transition(1 - pos, params);
4637
+		},
4638
+		easeInOut: function(pos){
4639
+			return (pos <= 0.5 ? transition(2 * pos, params) : (2 - transition(2 * (1 - pos), params))) / 2;
4640
+		}
4641
+	});
4642
+};
4643
+
4644
+Fx.Transitions = {
4645
+
4646
+	linear: function(zero){
4647
+		return zero;
4648
+	}
4649
+
4650
+};
4651
+
4652
+
4653
+
4654
+Fx.Transitions.extend = function(transitions){
4655
+	for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]);
4656
+};
4657
+
4658
+Fx.Transitions.extend({
4659
+
4660
+	Pow: function(p, x){
4661
+		return Math.pow(p, x && x[0] || 6);
4662
+	},
4663
+
4664
+	Expo: function(p){
4665
+		return Math.pow(2, 8 * (p - 1));
4666
+	},
4667
+
4668
+	Circ: function(p){
4669
+		return 1 - Math.sin(Math.acos(p));
4670
+	},
4671
+
4672
+	Sine: function(p){
4673
+		return 1 - Math.cos(p * Math.PI / 2);
4674
+	},
4675
+
4676
+	Back: function(p, x){
4677
+		x = x && x[0] || 1.618;
4678
+		return Math.pow(p, 2) * ((x + 1) * p - x);
4679
+	},
4680
+
4681
+	Bounce: function(p){
4682
+		var value;
4683
+		for (var a = 0, b = 1; 1; a += b, b /= 2){
4684
+			if (p >= (7 - 4 * a) / 11){
4685
+				value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2);
4686
+				break;
4687
+			}
4688
+		}
4689
+		return value;
4690
+	},
4691
+
4692
+	Elastic: function(p, x){
4693
+		return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x && x[0] || 1) / 3);
4694
+	}
4695
+
4696
+});
4697
+
4698
+['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){
4699
+	Fx.Transitions[transition] = new Fx.Transition(function(p){
4700
+		return Math.pow(p, i + 2);
4701
+	});
4702
+});
4703
+
4704
+
4705
+/*
4706
+---
4707
+
4708
+name: Request
4709
+
4710
+description: Powerful all purpose Request Class. Uses XMLHTTPRequest.
4711
+
4712
+license: MIT-style license.
4713
+
4714
+requires: [Object, Element, Chain, Events, Options, Browser]
4715
+
4716
+provides: Request
4717
+
4718
+...
4719
+*/
4720
+
4721
+(function(){
4722
+
4723
+var empty = function(){},
4724
+	progressSupport = ('onprogress' in new Browser.Request);
4725
+
4726
+var Request = this.Request = new Class({
4727
+
4728
+	Implements: [Chain, Events, Options],
4729
+
4730
+	options: {/*
4731
+		onRequest: function(){},
4732
+		onLoadstart: function(event, xhr){},
4733
+		onProgress: function(event, xhr){},
4734
+		onComplete: function(){},
4735
+		onCancel: function(){},
4736
+		onSuccess: function(responseText, responseXML){},
4737
+		onFailure: function(xhr){},
4738
+		onException: function(headerName, value){},
4739
+		onTimeout: function(){},
4740
+		user: '',
4741
+		password: '',*/
4742
+		url: '',
4743
+		data: '',
4744
+		headers: {
4745
+			'X-Requested-With': 'XMLHttpRequest',
4746
+			'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
4747
+		},
4748
+		async: true,
4749
+		format: false,
4750
+		method: 'post',
4751
+		link: 'ignore',
4752
+		isSuccess: null,
4753
+		emulation: true,
4754
+		urlEncoded: true,
4755
+		encoding: 'utf-8',
4756
+		evalScripts: false,
4757
+		evalResponse: false,
4758
+		timeout: 0,
4759
+		noCache: false
4760
+	},
4761
+
4762
+	initialize: function(options){
4763
+		this.xhr = new Browser.Request();
4764
+		this.setOptions(options);
4765
+		this.headers = this.options.headers;
4766
+	},
4767
+
4768
+	onStateChange: function(){
4769
+		var xhr = this.xhr;
4770
+		if (xhr.readyState != 4 || !this.running) return;
4771
+		this.running = false;
4772
+		this.status = 0;
4773
+		Function.attempt(function(){
4774
+			var status = xhr.status;
4775
+			this.status = (status == 1223) ? 204 : status;
4776
+		}.bind(this));
4777
+		xhr.onreadystatechange = empty;
4778
+		if (progressSupport) xhr.onprogress = xhr.onloadstart = empty;
4779
+		clearTimeout(this.timer);
4780
+
4781
+		this.response = {text: this.xhr.responseText || '', xml: this.xhr.responseXML};
4782
+		if (this.options.isSuccess.call(this, this.status))
4783
+			this.success(this.response.text, this.response.xml);
4784
+		else
4785
+			this.failure();
4786
+	},
4787
+
4788
+	isSuccess: function(){
4789
+		var status = this.status;
4790
+		return (status >= 200 && status < 300);
4791
+	},
4792
+
4793
+	isRunning: function(){
4794
+		return !!this.running;
4795
+	},
4796
+
4797
+	processScripts: function(text){
4798
+		if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return Browser.exec(text);
4799
+		return text.stripScripts(this.options.evalScripts);
4800
+	},
4801
+
4802
+	success: function(text, xml){
4803
+		this.onSuccess(this.processScripts(text), xml);
4804
+	},
4805
+
4806
+	onSuccess: function(){
4807
+		this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain();
4808
+	},
4809
+
4810
+	failure: function(){
4811
+		this.onFailure();
4812
+	},
4813
+
4814
+	onFailure: function(){
4815
+		this.fireEvent('complete').fireEvent('failure', this.xhr);
4816
+	},
4817
+
4818
+	loadstart: function(event){
4819
+		this.fireEvent('loadstart', [event, this.xhr]);
4820
+	},
4821
+
4822
+	progress: function(event){
4823
+		this.fireEvent('progress', [event, this.xhr]);
4824
+	},
4825
+
4826
+	timeout: function(){
4827
+		this.fireEvent('timeout', this.xhr);
4828
+	},
4829
+
4830
+	setHeader: function(name, value){
4831
+		this.headers[name] = value;
4832
+		return this;
4833
+	},
4834
+
4835
+	getHeader: function(name){
4836
+		return Function.attempt(function(){
4837
+			return this.xhr.getResponseHeader(name);
4838
+		}.bind(this));
4839
+	},
4840
+
4841
+	check: function(){
4842
+		if (!this.running) return true;
4843
+		switch (this.options.link){
4844
+			case 'cancel': this.cancel(); return true;
4845
+			case 'chain': this.chain(this.caller.pass(arguments, this)); return false;
4846
+		}
4847
+		return false;
4848
+	},
4849
+
4850
+	send: function(options){
4851
+		if (!this.check(options)) return this;
4852
+
4853
+		this.options.isSuccess = this.options.isSuccess || this.isSuccess;
4854
+		this.running = true;
4855
+
4856
+		var type = typeOf(options);
4857
+		if (type == 'string' || type == 'element') options = {data: options};
4858
+
4859
+		var old = this.options;
4860
+		options = Object.append({data: old.data, url: old.url, method: old.method}, options);
4861
+		var data = options.data, url = String(options.url), method = options.method.toLowerCase();
4862
+
4863
+		switch (typeOf(data)){
4864
+			case 'element': data = document.id(data).toQueryString(); break;
4865
+			case 'object': case 'hash': data = Object.toQueryString(data);
4866
+		}
4867
+
4868
+		if (this.options.format){
4869
+			var format = 'format=' + this.options.format;
4870
+			data = (data) ? format + '&' + data : format;
4871
+		}
4872
+
4873
+		if (this.options.emulation && !['get', 'post'].contains(method)){
4874
+			var _method = '_method=' + method;
4875
+			data = (data) ? _method + '&' + data : _method;
4876
+			method = 'post';
4877
+		}
4878
+
4879
+		if (this.options.urlEncoded && ['post', 'put'].contains(method)){
4880
+			var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : '';
4881
+			this.headers['Content-type'] = 'application/x-www-form-urlencoded' + encoding;
4882
+		}
4883
+
4884
+		if (!url) url = document.location.pathname;
4885
+
4886
+		var trimPosition = url.lastIndexOf('/');
4887
+		if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition);
4888
+
4889
+		if (this.options.noCache)
4890
+			url += (url.contains('?') ? '&' : '?') + String.uniqueID();
4891
+
4892
+		if (data && method == 'get'){
4893
+			url += (url.contains('?') ? '&' : '?') + data;
4894
+			data = null;
4895
+		}
4896
+
4897
+		var xhr = this.xhr;
4898
+		if (progressSupport){
4899
+			xhr.onloadstart = this.loadstart.bind(this);
4900
+			xhr.onprogress = this.progress.bind(this);
4901
+		}
4902
+
4903
+		xhr.open(method.toUpperCase(), url, this.options.async, this.options.user, this.options.password);
4904
+		if (this.options.user && 'withCredentials' in xhr) xhr.withCredentials = true;
4905
+
4906
+		xhr.onreadystatechange = this.onStateChange.bind(this);
4907
+
4908
+		Object.each(this.headers, function(value, key){
4909
+			try {
4910
+				xhr.setRequestHeader(key, value);
4911
+			} catch (e){
4912
+				this.fireEvent('exception', [key, value]);
4913
+			}
4914
+		}, this);
4915
+
4916
+		this.fireEvent('request');
4917
+		xhr.send(data);
4918
+		if (!this.options.async) this.onStateChange();
4919
+		if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this);
4920
+		return this;
4921
+	},
4922
+
4923
+	cancel: function(){
4924
+		if (!this.running) return this;
4925
+		this.running = false;
4926
+		var xhr = this.xhr;
4927
+		xhr.abort();
4928
+		clearTimeout(this.timer);
4929
+		xhr.onreadystatechange = empty;
4930
+		if (progressSupport) xhr.onprogress = xhr.onloadstart = empty;
4931
+		this.xhr = new Browser.Request();
4932
+		this.fireEvent('cancel');
4933
+		return this;
4934
+	}
4935
+
4936
+});
4937
+
4938
+var methods = {};
4939
+['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){
4940
+	methods[method] = function(data){
4941
+		var object = {
4942
+			method: method
4943
+		};
4944
+		if (data != null) object.data = data;
4945
+		return this.send(object);
4946
+	};
4947
+});
4948
+
4949
+Request.implement(methods);
4950
+
4951
+Element.Properties.send = {
4952
+
4953
+	set: function(options){
4954
+		var send = this.get('send').cancel();
4955
+		send.setOptions(options);
4956
+		return this;
4957
+	},
4958
+
4959
+	get: function(){
4960
+		var send = this.retrieve('send');
4961
+		if (!send){
4962
+			send = new Request({
4963
+				data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action')
4964
+			});
4965
+			this.store('send', send);
4966
+		}
4967
+		return send;
4968
+	}
4969
+
4970
+};
4971
+
4972
+Element.implement({
4973
+
4974
+	send: function(url){
4975
+		var sender = this.get('send');
4976
+		sender.send({data: this, url: url || sender.options.url});
4977
+		return this;
4978
+	}
4979
+
4980
+});
4981
+
4982
+})();
4983
+
4984
+/*
4985
+---
4986
+
4987
+name: Request.HTML
4988
+
4989
+description: Extends the basic Request Class with additional methods for interacting with HTML responses.
4990
+
4991
+license: MIT-style license.
4992
+
4993
+requires: [Element, Request]
4994
+
4995
+provides: Request.HTML
4996
+
4997
+...
4998
+*/
4999
+
5000
+Request.HTML = new Class({
5001
+
5002
+	Extends: Request,
5003
+
5004
+	options: {
5005
+		update: false,
5006
+		append: false,
5007
+		evalScripts: true,
5008
+		filter: false,
5009
+		headers: {
5010
+			Accept: 'text/html, application/xml, text/xml, */*'
5011
+		}
5012
+	},
5013
+
5014
+	success: function(text){
5015
+		var options = this.options, response = this.response;
5016
+
5017
+		response.html = text.stripScripts(function(script){
5018
+			response.javascript = script;
5019
+		});
5020
+
5021
+		var match = response.html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
5022
+		if (match) response.html = match[1];
5023
+		var temp = new Element('div').set('html', response.html);
5024
+
5025
+		response.tree = temp.childNodes;
5026
+		response.elements = temp.getElements('*');
5027
+
5028
+		if (options.filter) response.tree = response.elements.filter(options.filter);
5029
+		if (options.update) document.id(options.update).empty().set('html', response.html);
5030
+		else if (options.append) document.id(options.append).adopt(temp.getChildren());
5031
+		if (options.evalScripts) Browser.exec(response.javascript);
5032
+
5033
+		this.onSuccess(response.tree, response.elements, response.html, response.javascript);
5034
+	}
5035
+
5036
+});
5037
+
5038
+Element.Properties.load = {
5039
+
5040
+	set: function(options){
5041
+		var load = this.get('load').cancel();
5042
+		load.setOptions(options);
5043
+		return this;
5044
+	},
5045
+
5046
+	get: function(){
5047
+		var load = this.retrieve('load');
5048
+		if (!load){
5049
+			load = new Request.HTML({data: this, link: 'cancel', update: this, method: 'get'});
5050
+			this.store('load', load);
5051
+		}
5052
+		return load;
5053
+	}
5054
+
5055
+};
5056
+
5057
+Element.implement({
5058
+
5059
+	load: function(){
5060
+		this.get('load').send(Array.link(arguments, {data: Type.isObject, url: Type.isString}));
5061
+		return this;
5062
+	}
5063
+
5064
+});
5065
+
5066
+
5067
+/*
5068
+---
5069
+
5070
+name: JSON
5071
+
5072
+description: JSON encoder and decoder.
5073
+
5074
+license: MIT-style license.
5075
+
5076
+See Also: <http://www.json.org/>
5077
+
5078
+requires: [Array, String, Number, Function]
5079
+
5080
+provides: JSON
5081
+
5082
+...
5083
+*/
5084
+
5085
+if (typeof JSON == 'undefined') this.JSON = {};
5086
+
5087
+
5088
+
5089
+(function(){
5090
+
5091
+var special = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'};
5092
+
5093
+var escape = function(chr){
5094
+	return special[chr] || '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4);
5095
+};
5096
+
5097
+JSON.validate = function(string){
5098
+	string = string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
5099
+					replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
5100
+					replace(/(?:^|:|,)(?:\s*\[)+/g, '');
5101
+
5102
+	return (/^[\],:{}\s]*$/).test(string);
5103
+};
5104
+
5105
+JSON.encode = JSON.stringify ? function(obj){
5106
+	return JSON.stringify(obj);
5107
+} : function(obj){
5108
+	if (obj && obj.toJSON) obj = obj.toJSON();
5109
+
5110
+	switch (typeOf(obj)){
5111
+		case 'string':
5112
+			return '"' + obj.replace(/[\x00-\x1f\\"]/g, escape) + '"';
5113
+		case 'array':
5114
+			return '[' + obj.map(JSON.encode).clean() + ']';
5115
+		case 'object': case 'hash':
5116
+			var string = [];
5117
+			Object.each(obj, function(value, key){
5118
+				var json = JSON.encode(value);
5119
+				if (json) string.push(JSON.encode(key) + ':' + json);
5120
+			});
5121
+			return '{' + string + '}';
5122
+		case 'number': case 'boolean': return '' + obj;
5123
+		case 'null': return 'null';
5124
+	}
5125
+
5126
+	return null;
5127
+};
5128
+
5129
+JSON.decode = function(string, secure){
5130
+	if (!string || typeOf(string) != 'string') return null;
5131
+
5132
+	if (secure || JSON.secure){
5133
+		if (JSON.parse) return JSON.parse(string);
5134
+		if (!JSON.validate(string)) throw new Error('JSON could not decode the input; security is enabled and the value is not secure.');
5135
+	}
5136
+
5137
+	return eval('(' + string + ')');
5138
+};
5139
+
5140
+}).call(this);
5141
+
5142
+
5143
+/*
5144
+---
5145
+
5146
+name: Request.JSON
5147
+
5148
+description: Extends the basic Request Class with additional methods for sending and receiving JSON data.
5149
+
5150
+license: MIT-style license.
5151
+
5152
+requires: [Request, JSON]
5153
+
5154
+provides: Request.JSON
5155
+
5156
+...
5157
+*/
5158
+
5159
+Request.JSON = new Class({
5160
+
5161
+	Extends: Request,
5162
+
5163
+	options: {
5164
+		/*onError: function(text, error){},*/
5165
+		secure: true
5166
+	},
5167
+
5168
+	initialize: function(options){
5169
+		this.parent(options);
5170
+		Object.append(this.headers, {
5171
+			'Accept': 'application/json',
5172
+			'X-Request': 'JSON'
5173
+		});
5174
+	},
5175
+
5176
+	success: function(text){
5177
+		var json;
5178
+		try {
5179
+			json = this.response.json = JSON.decode(text, this.options.secure);
5180
+		} catch (error){
5181
+			this.fireEvent('error', [text, error]);
5182
+			return;
5183
+		}
5184
+		if (json == null) this.onFailure();
5185
+		else this.onSuccess(json, text);
5186
+	}
5187
+
5188
+});
5189
+
5190
+
5191
+/*
5192
+---
5193
+
5194
+name: Cookie
5195
+
5196
+description: Class for creating, reading, and deleting browser Cookies.
5197
+
5198
+license: MIT-style license.
5199
+
5200
+credits:
5201
+  - Based on the functions by Peter-Paul Koch (http://quirksmode.org).
5202
+
5203
+requires: [Options, Browser]
5204
+
5205
+provides: Cookie
5206
+
5207
+...
5208
+*/
5209
+
5210
+var Cookie = new Class({
5211
+
5212
+	Implements: Options,
5213
+
5214
+	options: {
5215
+		path: '/',
5216
+		domain: false,
5217
+		duration: false,
5218
+		secure: false,
5219
+		document: document,
5220
+		encode: true
5221
+	},
5222
+
5223
+	initialize: function(key, options){
5224
+		this.key = key;
5225
+		this.setOptions(options);
5226
+	},
5227
+
5228
+	write: function(value){
5229
+		if (this.options.encode) value = encodeURIComponent(value);
5230
+		if (this.options.domain) value += '; domain=' + this.options.domain;
5231
+		if (this.options.path) value += '; path=' + this.options.path;
5232
+		if (this.options.duration){
5233
+			var date = new Date();
5234
+			date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000);
5235
+			value += '; expires=' + date.toGMTString();
5236
+		}
5237
+		if (this.options.secure) value += '; secure';
5238
+		this.options.document.cookie = this.key + '=' + value;
5239
+		return this;
5240
+	},
5241
+
5242
+	read: function(){
5243
+		var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)');
5244
+		return (value) ? decodeURIComponent(value[1]) : null;
5245
+	},
5246
+
5247
+	dispose: function(){
5248
+		new Cookie(this.key, Object.merge({}, this.options, {duration: -1})).write('');
5249
+		return this;
5250
+	}
5251
+
5252
+});
5253
+
5254
+Cookie.write = function(key, value, options){
5255
+	return new Cookie(key, options).write(value);
5256
+};
5257
+
5258
+Cookie.read = function(key){
5259
+	return new Cookie(key).read();
5260
+};
5261
+
5262
+Cookie.dispose = function(key, options){
5263
+	return new Cookie(key, options).dispose();
5264
+};
5265
+
5266
+
5267
+/*
5268
+---
5269
+
5270
+name: DOMReady
5271
+
5272
+description: Contains the custom event domready.
5273
+
5274
+license: MIT-style license.
5275
+
5276
+requires: [Browser, Element, Element.Event]
5277
+
5278
+provides: [DOMReady, DomReady]
5279
+
5280
+...
5281
+*/
5282
+
5283
+(function(window, document){
5284
+
5285
+var ready,
5286
+	loaded,
5287
+	checks = [],
5288
+	shouldPoll,
5289
+	timer,
5290
+	isFramed = true;
5291
+
5292
+// Thanks to Rich Dougherty <http://www.richdougherty.com/>
5293
+try {
5294
+	isFramed = window.frameElement != null;
5295
+} catch(e){}
5296
+
5297
+var domready = function(){
5298
+	clearTimeout(timer);
5299
+	if (ready) return;
5300
+	Browser.loaded = ready = true;
5301
+	document.removeListener('DOMContentLoaded', domready).removeListener('readystatechange', check);
5302
+
5303
+	document.fireEvent('domready');
5304
+	window.fireEvent('domready');
5305
+};
5306
+
5307
+var check = function(){
5308
+	for (var i = checks.length; i--;) if (checks[i]()){
5309
+		domready();
5310
+		return true;
5311
+	}
5312
+
5313
+	return false;
5314
+};
5315
+
5316
+var poll = function(){
5317
+	clearTimeout(timer);
5318
+	if (!check()) timer = setTimeout(poll, 10);
5319
+};
5320
+
5321
+document.addListener('DOMContentLoaded', domready);
5322
+
5323
+// doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/
5324
+var testElement = document.createElement('div');
5325
+if (testElement.doScroll && !isFramed){
5326
+	checks.push(function(){
5327
+		try {
5328
+			testElement.doScroll();
5329
+			return true;
5330
+		} catch (e){}
5331
+
5332
+		return false;
5333
+	});
5334
+	shouldPoll = true;
5335
+}
5336
+
5337
+if (document.readyState) checks.push(function(){
5338
+	var state = document.readyState;
5339
+	return (state == 'loaded' || state == 'complete');
5340
+});
5341
+
5342
+if ('onreadystatechange' in document) document.addListener('readystatechange', check);
5343
+else shouldPoll = true;
5344
+
5345
+if (shouldPoll) poll();
5346
+
5347
+Element.Events.domready = {
5348
+	onAdd: function(fn){
5349
+		if (ready) fn.call(this);
5350
+	}
5351
+};
5352
+
5353
+// Make sure that domready fires before load
5354
+Element.Events.load = {
5355
+	base: 'load',
5356
+	onAdd: function(fn){
5357
+		if (loaded && this == window) fn.call(this);
5358
+	},
5359
+	condition: function(){
5360
+		if (this == window){
5361
+			domready();
5362
+			delete Element.Events.load;
5363
+		}
5364
+
5365
+		return true;
5366
+	}
5367
+};
5368
+
5369
+// This is based on the custom load event
5370
+window.addEvent('load', function(){
5371
+	loaded = true;
5372
+});
5373
+
5374
+})(window, document);
5375
+
5376
+
5377
+/*
5378
+---
5379
+
5380
+name: Swiff
5381
+
5382
+description: Wrapper for embedding SWF movies. Supports External Interface Communication.
5383
+
5384
+license: MIT-style license.
5385
+
5386
+credits:
5387
+  - Flash detection & Internet Explorer + Flash Player 9 fix inspired by SWFObject.
5388
+
5389
+requires: [Options, Object, Element]
5390
+
5391
+provides: Swiff
5392
+
5393
+...
5394
+*/
5395
+
5396
+(function(){
5397
+
5398
+var Swiff = this.Swiff = new Class({
5399
+
5400
+	Implements: Options,
5401
+
5402
+	options: {
5403
+		id: null,
5404
+		height: 1,
5405
+		width: 1,
5406
+		container: null,
5407
+		properties: {},
5408
+		params: {
5409
+			quality: 'high',
5410
+			allowScriptAccess: 'always',
5411
+			wMode: 'window',
5412
+			swLiveConnect: true
5413
+		},
5414
+		callBacks: {},
5415
+		vars: {}
5416
+	},
5417
+
5418
+	toElement: function(){
5419
+		return this.object;
5420
+	},
5421
+
5422
+	initialize: function(path, options){
5423
+		this.instance = 'Swiff_' + String.uniqueID();
5424
+
5425
+		this.setOptions(options);
5426
+		options = this.options;
5427
+		var id = this.id = options.id || this.instance;
5428
+		var container = document.id(options.container);
5429
+
5430
+		Swiff.CallBacks[this.instance] = {};
5431
+
5432
+		var params = options.params, vars = options.vars, callBacks = options.callBacks;
5433
+		var properties = Object.append({height: options.height, width: options.width}, options.properties);
5434
+
5435
+		var self = this;
5436
+
5437
+		for (var callBack in callBacks){
5438
+			Swiff.CallBacks[this.instance][callBack] = (function(option){
5439
+				return function(){
5440
+					return option.apply(self.object, arguments);
5441
+				};
5442
+			})(callBacks[callBack]);
5443
+			vars[callBack] = 'Swiff.CallBacks.' + this.instance + '.' + callBack;
5444
+		}
5445
+
5446
+		params.flashVars = Object.toQueryString(vars);
5447
+		if (Browser.ie){
5448
+			properties.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
5449
+			params.movie = path;
5450
+		} else {
5451
+			properties.type = 'application/x-shockwave-flash';
5452
+		}
5453
+		properties.data = path;
5454
+
5455
+		var build = '<object id="' + id + '"';
5456
+		for (var property in properties) build += ' ' + property + '="' + properties[property] + '"';
5457
+		build += '>';
5458
+		for (var param in params){
5459
+			if (params[param]) build += '<param name="' + param + '" value="' + params[param] + '" />';
5460
+		}
5461
+		build += '</object>';
5462
+		this.object = ((container) ? container.empty() : new Element('div')).set('html', build).firstChild;
5463
+	},
5464
+
5465
+	replaces: function(element){
5466
+		element = document.id(element, true);
5467
+		element.parentNode.replaceChild(this.toElement(), element);
5468
+		return this;
5469
+	},
5470
+
5471
+	inject: function(element){
5472
+		document.id(element, true).appendChild(this.toElement());
5473
+		return this;
5474
+	},
5475
+
5476
+	remote: function(){
5477
+		return Swiff.remote.apply(Swiff, [this.toElement()].append(arguments));
5478
+	}
5479
+
5480
+});
5481
+
5482
+Swiff.CallBacks = {};
5483
+
5484
+Swiff.remote = function(obj, fn){
5485
+	var rs = obj.CallFunction('<invoke name="' + fn + '" returntype="javascript">' + __flash__argumentsToXML(arguments, 2) + '</invoke>');
5486
+	return eval(rs);
5487
+};
5488
+
5489
+}).call(this);
5490
+
5491
+
0 5492
new file mode 100644
... ...
@@ -0,0 +1,76 @@
0
+window.addEvent('domready', function() {
1
+  codeblocks = $$('div.highlight');
2
+  codeblocks.each(addExpander);
3
+});
4
+
5
+window.addEvents({
6
+  domready: function(){
7
+    if(twitter_user){
8
+      new Request.Twitter(twitter_user, {
9
+        include_replies: false,
10
+        data: { count: 3 },
11
+        onSuccess: function(tweets){
12
+          $('tweets').empty();
13
+          for (var i = tweets.length; i--; ){
14
+            new Element('li', {
15
+              'class': 'tweet'
16
+              }).adopt(
17
+              new Element('p', { 'html': tweets[i].text+' ' }).adopt(
18
+                new Element('a', {
19
+                  'href': 'http://twitter.com/'+twitter_user+'/status/'+tweets[i].id_str,
20
+                  'text': new Date(tweets[i].created_at).timeDiffInWords()
21
+                }))
22
+            ).inject('tweets', 'top');
23
+          }
24
+        }
25
+      }).send();
26
+    }
27
+    $$('#recent_posts time').each(function(date){
28
+      date.set('text', new Date(date.get('text')).timeDiffInWords());
29
+    });
30
+  },
31
+});
32
+
33
+
34
+function addExpander(div){
35
+  new Element('span',{
36
+		html: 'expand &raquo;',
37
+		'class': 'pre_expander',
38
+    'events': {
39
+      'click': function(){
40
+        toggleExpander(this);
41
+      }
42
+    }
43
+	}).inject(div, 'top');
44
+}
45
+function toggleExpander(expander){
46
+  var html = '';
47
+  var expanderPos = expander.getPosition().y;
48
+  if($('page').toggleClass('expanded').hasClass('expanded'))
49
+    html = '&laquo; contract';
50
+  else
51
+    html = 'expand &raquo;';
52
+  $$('div.highlight span.pre_expander').each(function(span){
53
+      span.set('html',html);
54
+  });
55
+  fixScroll(expander, expanderPos);
56
+}
57
+function fixScroll(el, position){
58
+  pos = el.getPosition().y - position;
59
+  window.scrollTo(window.getScroll().x ,window.getScroll().y + pos);
60
+}
61
+function enableCompressedLayout(codeblocks){
62
+  if(!codeblocks.length) return;
63
+  new Element('span',{
64
+		html: 'Collapse layout',
65
+		'id': 'collapser',
66
+    'events': {
67
+      'click': function(){
68
+        if($('page').toggleClass('collapsed').hasClass('collapsed'))
69
+          this.set('html','Expand layout');
70
+        else
71
+          this.set('html','Collapse layout');
72
+      }
73
+    }
74
+	}).inject($('main'), 'top');
75
+}
0 76
new file mode 100644
... ...
@@ -0,0 +1,52 @@
0
+var count = pinboard_count;
1
+var linkroll = 'pinboard_linkroll';
2
+function pinboardNS_fetch_script(url) {
3
+  document.writeln('<s'+'cript type="text/javascript" src="' + url + '"></s'+'cript>');
4
+}
5
+
6
+function pinboardNS_show_bmarks(r) {
7
+  var lr = new Pinboard_Linkroll();
8
+  lr.set_items(r);
9
+  lr.show_bmarks();
10
+}
11
+
12
+var json_URL = "http://feeds.pinboard.in/json/v1/u:"+pinboard_user+"/?cb=pinboardNS_show_bmarks\&count=" + count;
13
+pinboardNS_fetch_script(json_URL);
14
+
15
+function Pinboard_Linkroll() {
16
+  var items;
17
+
18
+  this.set_items = function(i) {
19
+    this.items = i;
20
+  }
21
+  this.show_bmarks = function() {
22
+    var lines = [];
23
+    for (var i = 0; i < this.items.length; i++) {
24
+      var item = this.items[i];
25
+      var str = this.format_item(item);
26
+      lines.push(str);
27
+    }
28
+    $(linkroll).set('html', lines.join("\n"));
29
+  }
30
+  this.cook = function(v) {
31
+    return v.replace('<', '&lt;').replace('>', '&gt>');
32
+  }
33
+
34
+  this.format_item = function(it) {
35
+    var str = "<li class=\"pin-item\">";
36
+    if (!it.d) { return; }
37
+    str += "<p><a class=\"pin-title\" href=\"" + this.cook(it.u) + "\">" + this.cook(it.d) + "</a>";
38
+    if (it.n) {
39
+      str += "<span class=\"pin-description\">" + this.cook(it.n) + "</span>\n";
40
+    }
41
+    if (it.t.length > 0) {
42
+      for (var i = 0; i < it.t.length; i++) {
43
+        var tag = it.t[i];
44
+        str += " <a class=\"pin-tag\" href=\"http://pinboard.in/u:"+ this.cook(it.a) + "/t:" + this.cook(tag) + "\">" + this.cook(tag) + "</a>  ";
45
+      }
46
+    }
47
+    str += "</p></li>\n";
48
+    return str;
49
+  }
50
+}
51
+Pinboard_Linkroll.prototype = new Pinboard_Linkroll();
0 52
new file mode 100644
... ...
@@ -0,0 +1,52 @@
0
+Request.Twitter = new Class({
1
+
2
+  Extends: Request.JSONP,
3
+
4
+  options: {
5
+    linkify: true,
6
+    url: 'http://twitter.com/statuses/user_timeline/{term}.json',
7
+    include_replies: true,
8
+    data: {
9
+      count: 5,
10
+      trim_user: true
11
+    }
12
+  },
13
+
14
+  initialize: function(term, options){
15
+    this.parent(options);
16
+    if(this.options.include_replies == false){
17
+      this.options.count = this.options.data.count
18
+      this.options.data.count += 30; // adds 30 tweets to request for filtering
19
+    }
20
+    this.options.url = this.options.url.substitute({term: term});
21
+    console.log(this.options.url);
22
+  },
23
+
24
+  success: function(args, index){
25
+    if(!this.options.include_replies){
26
+      args[0] = args[0].filter(function(item, index, array){
27
+        return item.in_reply_to_screen_name == null;
28
+      });
29
+      if(args[0].length > this.options.count){ args[0].length = this.options.count; }
30
+    }
31
+    var data = args[0];
32
+
33
+    if (this.options.linkify) data.each(function(tweet){
34
+      tweet.text = this.linkify(tweet.text);
35
+    }, this);
36
+
37
+    if (data[0]) this.options.data.since_id = data[0].id; // keep subsequent calls newer
38
+
39
+    this.parent(args, index);
40
+  },
41
+
42
+  linkify: function(text){
43
+    // modified from TwitterGitter by David Walsh (davidwalsh.name)
44
+    // courtesy of Jeremy Parrish (rrish.org)
45
+    return text.replace(/(https?:\/\/[\w\-:;?&=+.%#\/]+)/gi, '<a href="$1">$1</a>')
46
+    .replace(/(^|\W)@(\w+)/g, '$1<a href="http://twitter.com/$2">@$2</a>')
47
+      .replace(/(^|\W)#(\w+)/g, '$1#<a href="http://search.twitter.com/search?q=%23$2">$2</a>');
48
+  }
49
+
50
+});
51
+
0 52
new file mode 100644
... ...
@@ -0,0 +1,35 @@
0
+<?xml version="1.0" encoding="UTF-8"?>
1
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
2
+  <url>
3
+      <loc>http://recursive-design.com/about.haml</loc>
4
+      <lastmod>2009-11-24</lastmod>
5
+  </url>
6
+  <url>
7
+      <loc>http://recursive-design.com/atom.xml</loc>
8
+      <lastmod>2011-03-13</lastmod>
9
+  </url>
10
+  <url>
11
+      <loc>http://recursive-design.com/</loc>
12
+      <lastmod>2011-04-08</lastmod>
13
+  </url>
14
+  <url>
15
+      <loc>http://recursive-design.com/test/syntax.html</loc>
16
+      <lastmod>2010-04-10</lastmod>
17
+  </url>
18
+  <url>
19
+      <loc>http://recursive-design.com/test/typography.haml</loc>
20
+      <lastmod>2009-11-24</lastmod>
21
+  </url>
22
+  <url>
23
+      <loc>http://recursive-design.com/2011/04/07/test-of-typography</loc>
24
+      <lastmod>2011-04-07</lastmod>
25
+  </url>
26
+  <url>
27
+      <loc>http://recursive-design.com/2011/03/14/test-post</loc>
28
+      <lastmod>2011-03-14</lastmod>
29
+  </url>
30
+  <url>
31
+      <loc>http://recursive-design.com/2009/11/13/hello-world</loc>
32
+      <lastmod>2009-11-13</lastmod>
33
+  </url>
34
+</urlset>
0 35
\ No newline at end of file
1 36
new file mode 100644
... ...
@@ -0,0 +1,3 @@
0
+@charset "UTF-8";html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}body{line-height:1}ol,ul{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,th,td{text-align:left;font-weight:normal;vertical-align:middle}q,blockquote{quotes:none}q:before,q:after,blockquote:before,blockquote:after{content:"";content:none}a img{border:none}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}.group,.inner-wrap,.core-layout > div,body > header > div,body > nav > div,body > footer > div,#page,#page > div{*zoom:1}.group:after,.inner-wrap:after,.core-layout > div:after,body > header > div:after,body > nav > div:after,body > footer > div:after,#page:after,#page > div:after{content:"\0020";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.inner-wrap,.core-layout > div,body > header > div,body > nav > div,body > footer > div{position:relative;margin:0 auto;padding:0 40px;max-width:1440px}body > header,body > nav,body > footer{min-width:320px}#page{padding:0;max-width:1520px;margin:0 auto}#page > div{margin-right:320px}#page > div > aside{float:left;width:260px;margin:0 -100% 0 0;padding:30px}#main{float:left;width:100%;padding-top:25px;padding-bottom:25px}#main > *{padding-right:40px;padding-left:40px}@media (min-device-width:1024px) and (max-width:800px),
1
+       screen and (max-device-width:480px), (max-device-width:480px) and (orientation:landscape),
2
+       (min-device-width:481px) and (max-device-width:1024px) and (orientation:portrait){#page > div{margin-right:0}#page > div #main{float:none}#page > div > aside{margin:0;float:none}page > div > aside{float:none}body > header > div,body > nav > div,body > footer > div{padding:0 15px}#main > *{padding-left:15px;padding-right:15px}}@media only screen and (min-device-width: 320px) and (max-device-width: 480px){body > header > div,body > nav > div,body > footer > div{padding:0 10px}#main > *{padding-left:10px;padding-right:10px}#page > div{margin:none}#page > div > aside{float:none}}@font-face{font-family:"Adelle";src:url('/fonts/adellebasic_bold-webfont.eot');src:url('/fonts/adellebasic_bold-webfont.eot?iefix') format('eot'), url('/fonts/adellebasic_bold-webfont.woff') format('woff'), url('/fonts/adellebasic_bold-webfont.ttf') format('truetype'), url('/fonts/adellebasic_bold-webfont.svg#webfontKykxqSyz') format('svg')}.heading-font,body > header h1,h1,h2,h3,h4,h5,h6{font-family:Adelle, "Helvetica Neue", Helvetica, Arial, sans}body > header h1{font-size:3em;line-height:1.2em;margin-bottom:0.6667em}body{font-size:1em;line-height:1.5em;color:black;font-family:Georgia, Times, serif}article{margin-bottom:1.5em;padding-bottom:1.5em;padding-top:1em}article + article{border-top:3px solid #555555}article:last-child{border-bottom:none}article h2{padding-top:0.8em;border-top:3px double #dddddd}article .author,article time{text-transform:uppercase}article .updated{font-size:.8em;color:#555555}article time span{font-size:.7em;line-height:0;position:relative;top:-0.4em}article header p{padding:0 0 1.5em;font-size:.8em;color:#555555;font-family:Palatino, Times, "Times New Roman";top-width:1px}h1,h2,h3,h4,h5,h6{font-weight:normal;line-height:1em;text-rendering:optimizelegibility}h1{font-size:2.6em;margin-bottom:0.6667em}h2,section h1{font-size:1.8em;margin-bottom:0.6667em}h3,section h2,section section h1{font-size:1.6em;margin-bottom:0.875em}h4,section h3,section section h2,section section section h1{font-size:1.3em;margin-bottom:0.875em}h5,section h4,section section h3{font-size:1.1em;margin-bottom:0.75em}h6,section h5,section section h4,section section section h3{font-size:1em;margin-bottom:0.5em}p,blockquote,ul,ol{margin-bottom:1.5em}ul{list-style-type:disc}ol{list-style-type:decimal}ol ol{list-style-type:lower-alpha}ul ul,ol ol{margin-left:1.75em}li{margin-bottom:.5em}strong{font-weight:bold}em{font-style:italic}sup,sub{font-size:0.8em;position:relative;display:inline-block}sup{top:-0.5em}sub{bottom:-0.5em}q{font-style:italic}q:before{content:"\201C"}q:after{content:"\201D"}em,dfn{font-style:italic}strong,dfn{font-weight:bold}del,s{text-decoration:line-through}abbr,acronym{border-bottom:1px dotted;cursor:help}sub,sup{line-height:0}hr{margin-bottom:0.2em}small{font-size:.8em}big{font-size:1.2em}blockquote{font-style:italic;position:relative;margin-left:2em}blockquote > p:first-child:before{content:"\201C";position:absolute;top:0.1em;left:-0.7em;font-size:3em;color:#dddddd}blockquote > p:last-child:after{content:"\201D";position:relative;top:0.3em;line-height:0;font-size:2em;color:#dddddd}blockquote + p > cite{margin-left:2em;text-align:right}blockquote + p > cite:before{content:'– ';color:#555555}blockquote + p > cite a{font-style:italic}
0 3
deleted file mode 100644
... ...
@@ -1,483 +0,0 @@
1
-#
2
-# = RubyPants - SmartyPants ported to Ruby
3
-#
4
-# Ported by Christian Neukirchen <mailto:chneukirchen@gmail.com>
5
-#   Copyright (C) 2004 Christian Neukirchen
6
-#
7
-# Incooporates ideas, comments and documentation by Chad Miller
8
-#   Copyright (C) 2004 Chad Miller
9
-#
10
-# Original SmartyPants by John Gruber
11
-#   Copyright (C) 2003 John Gruber
12
-#
13
-
14
-#
15
-# = RubyPants - SmartyPants ported to Ruby
16
-#
17
-# == Synopsis
18
-#
19
-# RubyPants is a Ruby port of the smart-quotes library SmartyPants.
20
-#
21
-# The original "SmartyPants" is a free web publishing plug-in for
22
-# Movable Type, Blosxom, and BBEdit that easily translates plain ASCII
23
-# punctuation characters into "smart" typographic punctuation HTML
24
-# entities.
25
-#
26
-#
27
-# == Description
28
-# 
29
-# RubyPants can perform the following transformations:
30
-# 
31
-# * Straight quotes (<tt>"</tt> and <tt>'</tt>) into "curly" quote
32
-#   HTML entities
33
-# * Backticks-style quotes (<tt>``like this''</tt>) into "curly" quote
34
-#   HTML entities
35
-# * Dashes (<tt>--</tt> and <tt>---</tt>) into en- and em-dash
36
-#   entities
37
-# * Three consecutive dots (<tt>...</tt> or <tt>. . .</tt>) into an
38
-#   ellipsis entity
39
-# 
40
-# This means you can write, edit, and save your posts using plain old
41
-# ASCII straight quotes, plain dashes, and plain dots, but your
42
-# published posts (and final HTML output) will appear with smart
43
-# quotes, em-dashes, and proper ellipses.
44
-# 
45
-# RubyPants does not modify characters within <tt><pre></tt>,
46
-# <tt><code></tt>, <tt><kbd></tt>, <tt><math></tt> or
47
-# <tt><script></tt> tag blocks. Typically, these tags are used to
48
-# display text where smart quotes and other "smart punctuation" would
49
-# not be appropriate, such as source code or example markup.
50
-#
51
-#
52
-# == Backslash Escapes
53
-# 
54
-# If you need to use literal straight quotes (or plain hyphens and
55
-# periods), RubyPants accepts the following backslash escape sequences
56
-# to force non-smart punctuation. It does so by transforming the
57
-# escape sequence into a decimal-encoded HTML entity:
58
-# 
59
-#   \\    \"    \'    \.    \-    \`
60
-#
61
-# This is useful, for example, when you want to use straight quotes as
62
-# foot and inch marks: 6'2" tall; a 17" iMac.  (Use <tt>6\'2\"</tt>
63
-# resp. <tt>17\"</tt>.)
64
-#
65
-# 
66
-# == Algorithmic Shortcomings
67
-# 
68
-# One situation in which quotes will get curled the wrong way is when
69
-# apostrophes are used at the start of leading contractions. For
70
-# example:
71
-# 
72
-#   'Twas the night before Christmas.
73
-# 
74
-# In the case above, RubyPants will turn the apostrophe into an
75
-# opening single-quote, when in fact it should be a closing one. I
76
-# don't think this problem can be solved in the general case--every
77
-# word processor I've tried gets this wrong as well. In such cases,
78
-# it's best to use the proper HTML entity for closing single-quotes
79
-# (``&#8217;``) by hand.
80
-# 
81
-# 
82
-# == Bugs
83
-#
84
-# To file bug reports or feature requests (except see above) please
85
-# send email to: mailto:chneukirchen@gmail.com
86
-#
87
-# If the bug involves quotes being curled the wrong way, please send
88
-# example text to illustrate.
89
-#
90
-#
91
-# == Authors
92
-# 
93
-# John Gruber did all of the hard work of writing this software in
94
-# Perl for Movable Type and almost all of this useful documentation.
95
-# Chad Miller ported it to Python to use with Pyblosxom.
96
-#
97
-# Christian Neukirchen provided the Ruby port, as a general-purpose
98
-# library that follows the *Cloth api.
99
-# 
100
-#
101
-# == Copyright and License
102
-# 
103
-# === SmartyPants license:
104
-# 
105
-# Copyright (c) 2003 John Gruber
106
-# (http://daringfireball.net)
107
-# All rights reserved.
108
-# 
109
-# Redistribution and use in source and binary forms, with or without
110
-# modification, are permitted provided that the following conditions
111
-# are met:
112
-# 
113
-# * Redistributions of source code must retain the above copyright
114
-#   notice, this list of conditions and the following disclaimer.
115
-# 
116
-# * Redistributions in binary form must reproduce the above copyright
117
-#   notice, this list of conditions and the following disclaimer in
118
-#   the documentation and/or other materials provided with the
119
-#   distribution.
120
-# 
121
-# * Neither the name "SmartyPants" nor the names of its contributors
122
-#   may be used to endorse or promote products derived from this
123
-#   software without specific prior written permission.
124
-# 
125
-# This software is provided by the copyright holders and contributors
126
-# "as is" and any express or implied warranties, including, but not
127
-# limited to, the implied warranties of merchantability and fitness
128
-# for a particular purpose are disclaimed. In no event shall the
129
-# copyright owner or contributors be liable for any direct, indirect,
130
-# incidental, special, exemplary, or consequential damages (including,
131
-# but not limited to, procurement of substitute goods or services;
132
-# loss of use, data, or profits; or business interruption) however
133
-# caused and on any theory of liability, whether in contract, strict
134
-# liability, or tort (including negligence or otherwise) arising in
135
-# any way out of the use of this software, even if advised of the
136
-# possibility of such damage.
137
-# 
138
-# === RubyPants license
139
-# 
140
-# RubyPants is a derivative work of SmartyPants and smartypants.py.
141
-# 
142
-# Redistribution and use in source and binary forms, with or without
143
-# modification, are permitted provided that the following conditions
144
-# are met:
145
-# 
146
-# * Redistributions of source code must retain the above copyright
147
-#   notice, this list of conditions and the following disclaimer.
148
-# 
149
-# * Redistributions in binary form must reproduce the above copyright
150
-#   notice, this list of conditions and the following disclaimer in
151
-#   the documentation and/or other materials provided with the
152
-#   distribution.
153
-# 
154
-# This software is provided by the copyright holders and contributors
155
-# "as is" and any express or implied warranties, including, but not
156
-# limited to, the implied warranties of merchantability and fitness
157
-# for a particular purpose are disclaimed. In no event shall the
158
-# copyright owner or contributors be liable for any direct, indirect,
159
-# incidental, special, exemplary, or consequential damages (including,
160
-# but not limited to, procurement of substitute goods or services;
161
-# loss of use, data, or profits; or business interruption) however
162
-# caused and on any theory of liability, whether in contract, strict
163
-# liability, or tort (including negligence or otherwise) arising in
164
-# any way out of the use of this software, even if advised of the
165
-# possibility of such damage.
166
-# 
167
-#
168
-# == Links
169
-#
170
-# John Gruber:: http://daringfireball.net
171
-# SmartyPants:: http://daringfireball.net/projects/smartypants
172
-#
173
-# Chad Miller:: http://web.chad.org
174
-#
175
-# Christian Neukirchen:: http://kronavita.de/chris
176
-#
177
-
178
-
179
-class RubyPants < String
180
-  VERSION = "0.1"
181
-
182
-  # Allowed elements in the options array:
183
-  # 
184
-  # 0 :: do nothing
185
-  # 1 :: set all
186
-  # 2 :: set all, using old school en- and em- dash shortcuts
187
-  # 3 :: set all, using inverted old school en and em- dash shortcuts
188
-  # -1 :: stupefy (translate HTML entities to their ASCII-counterparts)
189
-  #
190
-  # <tt>:quotes</tt>        :: quotes
191
-  # <tt>:backticks</tt>     :: backtick quotes (``double'' only)
192
-  # <tt>:allbackticks</tt>  :: backtick quotes (``double'' and `single')
193
-  # <tt>:dashes</tt>        :: dashes
194
-  # <tt>:oldschool</tt>     :: old school dashes
195
-  # <tt>:inverted</tt>      :: inverted old school dashes
196
-  # <tt>:ellipses</tt>      :: ellipses
197
-  # <tt>:convertquotes</tt> :: convert <tt>&quot;</tt> entities to
198
-  #                            <tt>"</tt> for Dreamweaver users
199
-  # <tt>:stupefy</tt>       :: translate SmartyPants HTML entities
200
-  #                            to their ASCII counterparts.
201
-  #
202
-  def initialize(string, options=[2])
203
-    super string
204
-    @options = [*options]
205
-  end
206
-
207
-  # Apply SmartyPants transformations.
208
-  def to_html
209
-    do_quotes = do_backticks = do_dashes = do_ellipses = do_stupify = nil
210
-    convert_quotes = false
211
-
212
-    if @options.include? 0
213
-      # Do nothing.
214
-      return self
215
-    elsif @options.include? 1
216
-      # Do everything, turn all options on.
217
-      do_quotes = do_backticks = do_ellipses = true
218
-      do_dashes = :normal
219
-    elsif @options.include? 2
220
-      # Do everything, turn all options on, use old school dash shorthand.
221
-      do_quotes = do_backticks = do_ellipses = true
222
-      do_dashes = :oldschool
223
-    elsif @options.include? 3
224
-      # Do everything, turn all options on, use inverted old school
225
-      # dash shorthand.
226
-      do_quotes = do_backticks = do_ellipses = true
227
-      do_dashes = :inverted
228
-    elsif @options.include?(-1)
229
-      do_stupefy = true
230
-    else
231
-      do_quotes =                @options.include? :quotes
232
-      do_backticks =             @options.include? :backticks
233
-      do_backticks = :both    if @options.include? :allbackticks
234
-      do_dashes = :normal     if @options.include? :dashes
235
-      do_dashes = :oldschool  if @options.include? :oldschool
236
-      do_dashes = :inverted   if @options.include? :inverted
237
-      do_ellipses =              @options.include? :ellipses
238
-      convert_quotes =           @options.include? :convertquotes
239
-      do_stupefy =               @options.include? :stupefy
240
-    end
241
-
242
-    # Parse the HTML
243
-    tokens = tokenize
244
-    
245
-    # Keep track of when we're inside <pre> or <code> tags.
246
-    in_pre = false
247
-
248
-    # Here is the result stored in.
249
-    result = ""
250
-
251
-    # This is a cheat, used to get some context for one-character
252
-    # tokens that consist of just a quote char. What we do is remember
253
-    # the last character of the previous text token, to use as context
254
-    # to curl single- character quote tokens correctly.
255
-    prev_token_last_char = ""
256
-
257
-    tokens.each { |token|
258
-      if token.first == :tag
259
-        result << token[1]
260
-        if token[1] =~ %r!<(/?)(?:pre|code|kbd|script|math)[\s>]!
261
-          in_pre = ($1 != "/")  # Opening or closing tag?
262
-        end
263
-      else
264
-        t = token[1]
265
-
266
-        # Remember last char of this token before processing.
267
-        last_char = t[-1]
268
-
269
-        unless in_pre
270
-          t = process_escapes t
271
-          
272
-          t.gsub!(/&quot;/, '"')  if convert_quotes
273
-
274
-          if do_dashes
275
-            t = educate_dashes t            if do_dashes == :normal
276
-            t = educate_dashes_oldschool t  if do_dashes == :oldschool
277
-            t = educate_dashes_inverted t   if do_dashes == :inverted
278
-          end
279
-
280
-          t = educate_ellipses t  if do_ellipses
281
-
282
-          # Note: backticks need to be processed before quotes.
283
-          if do_backticks
284
-            t = educate_backticks t
285
-            t = educate_single_backticks t  if do_backticks == :both
286
-          end
287
-
288
-          if do_quotes
289
-            if t == "'"
290
-              # Special case: single-character ' token
291
-              if prev_token_last_char =~ /\S/
292
-                t = "&#8217;"
293
-              else
294
-                t = "&#8216;"
295
-              end
296
-            elsif t == '"'
297
-              # Special case: single-character " token
298
-              if prev_token_last_char =~ /\S/
299
-                t = "&#8221;"
300
-              else
301
-                t = "&#8220;"
302
-              end
303
-            else
304
-              # Normal case:                  
305
-              t = educate_quotes t
306
-            end
307
-          end
308
-
309
-          t = stupefy_entities t  if do_stupefy
310
-        end
311
-
312
-        prev_token_last_char = last_char
313
-        result << t
314
-      end
315
-    }
316
-
317
-    # Done
318
-    result
319
-  end
320
-
321
-  protected
322
-
323
-  # Return the string, with after processing the following backslash
324
-  # escape sequences. This is useful if you want to force a "dumb" quote
325
-  # or other character to appear.
326
-  #
327
-  # Escaped are:
328
-  #      \\    \"    \'    \.    \-    \`
329
-  #
330
-  def process_escapes(str)
331
-    str.gsub(/\\\\/, '&#92;').
332
-      gsub(/\\"/, '&#34;').
333
-      gsub(/\\'/, '&#39;').
334
-      gsub(/\\\./, '&#46;').
335
-      gsub(/\\-/, '&#45;').
336
-      gsub(/\\`/, '&#96;')
337
-  end
338
-
339
-  # The string, with each instance of "<tt>--</tt>" translated to an
340
-  # em-dash HTML entity.
341
-  #
342
-  def educate_dashes(str)
343
-    str.gsub(/--/, '&#8212;')
344
-  end
345
-
346
-  # The string, with each instance of "<tt>--</tt>" translated to an
347
-  # en-dash HTML entity, and each "<tt>---</tt>" translated to an
348
-  # em-dash HTML entity.
349
-  #
350
-  def educate_dashes_oldschool(str)
351
-    str.gsub(/---/, '&#8212;').gsub(/--/, '&#8211;')
352
-  end
353
-
354
-  # Return the string, with each instance of "<tt>--</tt>" translated
355
-  # to an em-dash HTML entity, and each "<tt>---</tt>" translated to
356
-  # an en-dash HTML entity. Two reasons why: First, unlike the en- and
357
-  # em-dash syntax supported by +educate_dashes_oldschool+, it's
358
-  # compatible with existing entries written before SmartyPants 1.1,
359
-  # back when "<tt>--</tt>" was only used for em-dashes.  Second,
360
-  # em-dashes are more common than en-dashes, and so it sort of makes
361
-  # sense that the shortcut should be shorter to type. (Thanks to
362
-  # Aaron Swartz for the idea.)
363
-  #
364
-  def educate_dashes_inverted(str)
365
-    str.gsub(/---/, '&#8211;').gsub(/--/, '&#8212;')
366
-  end
367
-
368
-  # Return the string, with each instance of "<tt>...</tt>" translated
369
-  # to an ellipsis HTML entity. Also converts the case where there are
370
-  # spaces between the dots.
371
-  #
372
-  def educate_ellipses(str)
373
-    str.gsub('...', '&#8230;').gsub('. . .', '&#8230;')
374
-  end
375
-
376
-  # Return the string, with <tt>``backticks''</tt>-style single quotes
377
-  # translated into HTML curly quote entities.
378
-  #
379
-  def educate_backticks(str)
380
-    str.gsub("``", '&#8220;').gsub("''", '&#8221;')
381
-  end
382
-
383
-  # Return the string, with <tt>`backticks'</tt>-style single quotes
384
-  # translated into HTML curly quote entities.
385
-  #
386
-  def educate_single_backticks(str)
387
-    str.gsub("`", '&#8216;').gsub("'", '&#8217;')
388
-  end
389
-
390
-  # Return the string, with "educated" curly quote HTML entities.
391
-  #
392
-  def educate_quotes(str)
393
-    punct_class = '[!"#\$\%\'()*+,\-.\/:;<=>?\@\[\\\\\]\^_`{|}~]'
394
-
395
-    str = str.dup
396
-      
397
-    # Special case if the very first character is a quote followed by
398
-    # punctuation at a non-word-break. Close the quotes by brute
399
-    # force:
400
-    str.gsub!(/^'(?=#{punct_class}\B)/, '&#8217;')
401
-    str.gsub!(/^"(?=#{punct_class}\B)/, '&#8221;')
402
-
403
-    # Special case for double sets of quotes, e.g.:
404
-    #   <p>He said, "'Quoted' words in a larger quote."</p>
405
-    str.gsub!(/"'(?=\w)/, '&#8220;&#8216;')
406
-    str.gsub!(/'"(?=\w)/, '&#8216;&#8220;')
407
-
408
-    # Special case for decade abbreviations (the '80s):
409
-    str.gsub!(/'(?=\d\ds)/, '&#8217;')
410
-
411
-    close_class = %![^\ \t\r\n\\[\{\(\-]!
412
-    dec_dashes = '&#8211;|&#8212;'
413
-    
414
-    # Get most opening single quotes:
415
-    str.gsub!(/(\s|&nbsp;|--|&[mn]dash;|#{dec_dashes}|&#x201[34];)'(?=\w)/,
416
-             '\1&#8216;')
417
-    # Single closing quotes:
418
-    str.gsub!(/(#{close_class})'/, '\1&#8217;')
419
-    str.gsub!(/'(\s|s\b|$)/, '&#8217;\1')
420
-    # Any remaining single quotes should be opening ones:
421
-    str.gsub!(/'/, '&#8216;')
422
-
423
-    # Get most opening double quotes:
424
-    str.gsub!(/(\s|&nbsp;|--|&[mn]dash;|#{dec_dashes}|&#x201[34];)"(?=\w)/,
425
-             '\1&#8220;')
426
-    # Double closing quotes:
427
-    str.gsub!(/(#{close_class})"/, '\1&#8221;')
428
-    str.gsub!(/"(\s|s\b|$)/, '&#8221;\1')
429
-    # Any remaining quotes should be opening ones:
430
-    str.gsub!(/"/, '&#8220;')
431
-
432
-    str
433
-  end
434
-
435
-  # Return the string, with each SmartyPants HTML entity translated to
436
-  # its ASCII counterpart.
437
-  #
438
-  def stupefy_entities(str)
439
-    str.
440
-      gsub(/&#8211;/, '-').      # en-dash
441
-      gsub(/&#8212;/, '--').     # em-dash
442
-      
443
-      gsub(/&#8216;/, "'").      # open single quote
444
-      gsub(/&#8217;/, "'").      # close single quote
445
-      
446
-      gsub(/&#8220;/, '"').      # open double quote
447
-      gsub(/&#8221;/, '"').      # close double quote
448
-      
449
-      gsub(/&#8230;/, '...')     # ellipsis
450
-  end
451
-
452
-  # Return an array of the tokens comprising the string. Each token is
453
-  # either a tag (possibly with nested, tags contained therein, such
454
-  # as <tt><a href="<MTFoo>"></tt>, or a run of text between
455
-  # tags. Each element of the array is a two-element array; the first
456
-  # is either :tag or :text; the second is the actual value.
457
-  #
458
-  # Based on the <tt>_tokenize()</tt> subroutine from Brad Choate's
459
-  # MTRegex plugin.  <http://www.bradchoate.com/past/mtregex.php>
460
-  #
461
-  # This is actually the easier variant using tag_soup, as used by
462
-  # Chad Miller in the Python port of SmartyPants.
463
-  #
464
-  def tokenize
465
-    tag_soup = /([^<]*)(<[^>]*>)/
466
-
467
-    tokens = []
468
-
469
-    prev_end = 0
470
-    scan(tag_soup) {
471
-      tokens << [:text, $1]  if $1 != ""
472
-      tokens << [:tag, $2]
473
-      
474
-      prev_end = $~.end(0)
475
-    }
476
-
477
-    if prev_end < size
478
-      tokens << [:text, self[prev_end..-1]]
479
-    end
480
-
481
-    tokens
482
-  end
483
-end
484 1
\ No newline at end of file
485 2
deleted file mode 100644
... ...
@@ -1,219 +0,0 @@
1
-gem 'activesupport', "2.3.5"
2
-require 'active_support'
3
-require 'rubypants'
4
-
5
-module Helpers
6
-  module EscapeHelper
7
-    HTML_ESCAPE = { '&' => '&amp; ',  '>' => '&gt;',   '<' => '&lt;', '"' => '&quot;' }
8
-    JSON_ESCAPE = { '&' => '\u0026 ', '>' => '\u003E', '<' => '\u003C' }
9
-
10
-    # A utility method for escaping HTML tag characters.
11
-    # This method is also aliased as <tt>h</tt>.
12
-    #
13
-    # In your ERb templates, use this method to escape any unsafe content. For example:
14
-    #   <%=h @person.name %>
15
-    #
16
-    # ==== Example:
17
-    #   puts html_escape("is a > 0 & a < 10?")
18
-    #   # => is a &gt; 0 &amp; a &lt; 10?
19
-    def html_escape(html)
20
-      html.to_s.gsub(/[&"><]/) { |special| HTML_ESCAPE[special] }
21
-    end
22
-    def escape_once(html)
23
-      html.to_s.gsub(/[\"><]|&(?!([a-zA-Z]+|(#\d+));)/) { |special| HTML_ESCAPE[special] }
24
-    end
25
-    alias h escape_once
26
-
27
-    # A utility method for escaping HTML entities in JSON strings.
28
-    # This method is also aliased as <tt>j</tt>.
29
-    #
30
-    # In your ERb templates, use this method to escape any HTML entities:
31
-    #   <%=j @person.to_json %>
32
-    #
33
-    # ==== Example:
34
-    #   puts json_escape("is a > 0 & a < 10?")
35
-    #   # => is a \u003E 0 \u0026 a \u003C 10?
36
-    def json_escape(s)
37
-      s.to_s.gsub(/[&"><]/) { |special| JSON_ESCAPE[special] }
38
-    end
39
-
40
-    alias j json_escape
41
-  end
42
-  include EscapeHelper
43
-
44
-  module ParamsHelper
45
-    def params
46
-      @params ||= begin
47
-        q = request.query.dup
48
-        q.each { |(k,v)| q[k.to_s.intern] = v }
49
-        q
50
-      end
51
-    end
52
-  end
53
-  include ParamsHelper
54
-
55
-  module TagHelper
56
-    def content_tag(name, content, html_options={})
57
-      %{<#{name}#{html_attributes(html_options)}>#{content}</#{name}>}
58
-    end
59
-
60
-    def tag(name, html_options={})
61
-      %{<#{name}#{html_attributes(html_options)} />}
62
-    end
63
-
64
-    def image_tag(src, html_options = {})
65
-      tag(:img, html_options.merge({:src=>src}))
66
-    end
67
-
68
-    def javascript_tag(content = nil, html_options = {})
69
-      content_tag(:script, javascript_cdata_section(content), html_options.merge(:type => "text/javascript"))
70
-    end
71
-
72
-    def link_to(name, href, html_options = {})
73
-      html_options = html_options.stringify_keys
74
-      confirm = html_options.delete("confirm")
75
-      onclick = "if (!confirm('#{html_escape(confirm)}')) return false;" if confirm
76
-      content_tag(:a, name, html_options.merge(:href => href, :onclick=>onclick))
77
-    end
78
-
79
-    def link_to_function(name, *args, &block)
80
-      html_options = {}
81
-      html_options = args.pop if args.last.is_a? Hash
82
-      function = args[0] || ''
83
-      onclick = "#{"#{html_options[:onclick]}; " if html_options[:onclick]}#{function}; return false;"
84
-      href = html_options[:href] || '#'
85
-      content_tag(:a, name, html_options.merge(:href => href, :onclick => onclick))
86
-    end
87
-
88
-    private
89
-
90
-      def cdata_section(content)
91
-        "<![CDATA[#{content}]]>"
92
-      end
93
-
94
-      def javascript_cdata_section(content) #:nodoc:
95
-        "\n//#{cdata_section("\n#{content}\n//")}\n"
96
-      end
97
-
98
-      def html_attributes(options)
99
-        unless options.blank?
100
-          attrs = []
101
-          options.each_pair do |key, value|
102
-            if value == true
103
-              attrs << %(#{key}="#{key}") if value
104
-            else
105
-              attrs << %(#{key}="#{value}") unless value.nil?
106
-            end
107
-          end
108
-          " #{attrs.sort * ' '}" unless attrs.empty?
109
-        end
110
-      end
111
-  end
112
-  include TagHelper
113
-
114
-  def to_html_email(address)
115
-    email = string_to_html(address)
116
-    "<a href=\"#{string_to_html('mailto:')}#{email}\">#{email}</a>"
117
-  end
118
-
119
-  def string_to_html(s)
120
-    s.strip.unpack("C*").map{|ch| "&#" + ch.to_s + ";" }.to_s
121
-  end
122
-
123
-  def show_part (file)
124
-    data = ''
125
-    f = File.open(Dir.pwd+"/source/"+file)
126
-    f.each_line do |line|
127
-      data += line
128
-    end
129
-    data
130
-  end
131
-
132
-  def shorten_words (string, word_limit = 25)
133
-    words = string.split(/\s/)
134
-    if words.size >= word_limit
135
-      words[0,(word_limit-1)].join(" ") + '&hellip;'
136
-    else
137
-      string
138
-    end
139
-  end
140
-
141
-  def shorten (string, char_limit = 55)
142
-    chars = string.scan(/.{1,1}/)
143
-    if chars.size >= char_limit
144
-      chars[0,(char_limit-1)].join + '&hellip;'
145
-    else
146
-      "blah2"
147
-    end
148
-  end
149
-
150
-  def absolute_url(input, url)
151
-    input.gsub(/(href|src)(\s*=\s*)(["'])(\/.*?)\3/) { $1 + $2 + $3 + url + $4 + $3 }
152
-  end
153
-
154
-  def rp(input)
155
-    RubyPants.new(input).to_html
156
-  end
157
-  def style_amp(input)
158
-    input.gsub(" & "," <span class='amp'>&</span> ")
159
-  end
160
-
161
-  module PartialsHelper
162
-
163
-    # A very hackish way to handle partials.  We'll go with it till it breaks...
164
-    def include(partial_name)
165
-      file_ext = partial_name[(partial_name.index('.') + 1)..partial_name.length]
166
-      contents = IO.read("source/_includes/#{partial_name}")
167
-      case file_ext
168
-      when 'haml'
169
-        Haml::Engine.new(contents).render(binding)
170
-      when 'textile'
171
-        RedCloth.new(contents).to_html
172
-      when 'markdown'
173
-        RDiscount.new(contents).to_html
174
-      else
175
-        contents
176
-      end
177
-    end
178
-  end
179
-
180
-  include PartialsHelper
181
-
182
-end
183
-
184
-class String
185
-  def titlecase
186
-    small_words = %w(a an and as at but by en for if in of on or the to v v. via vs vs.)
187
-
188
-    x = split(" ").map do |word|
189
-      # note: word could contain non-word characters!
190
-      # downcase all small_words, capitalize the rest
191
-      small_words.include?(word.gsub(/\W/, "").downcase) ? word.downcase! : word.smart_capitalize!
192
-      word
193
-    end
194
-    # capitalize first and last words
195
-    x.first.to_s.smart_capitalize!
196
-    x.last.to_s.smart_capitalize!
197
-    # small words after colons are capitalized
198
-    x.join(" ").gsub(/:\s?(\W*#{small_words.join("|")}\W*)\s/) { ": #{$1.smart_capitalize} " }
199
-  end
200
-
201
-  def titlecase!
202
-    replace(titlecase)
203
-  end
204
-
205
-  def smart_capitalize
206
-    # ignore any leading crazy characters and capitalize the first real character
207
-    if self =~ /^['"\(\[']*([a-z])/
208
-      i = index($1)
209
-      x = self[i,self.length]
210
-      # word with capitals and periods mid-word are left alone
211
-      self[i,1] = self[i,1].upcase unless x =~ /[A-Z]/ or x =~ /\.\w+/
212
-    end
213
-    self
214
-  end
215
-
216
-  def smart_capitalize!
217
-    replace(smart_capitalize)
218
-  end
219
-end
220 1
new file mode 100644
... ...
@@ -0,0 +1,18 @@
0
+<header>
1
+  <p>
2
+    <time>{{ page.date | ordinalize }}</time>
3
+    {% if site.author or site.author == page.author %}
4
+      <span class="byline"><em>by</em> <span class="author">{{ site.author }}</span></span>
5
+    {% elsif page.author %}
6
+      <span class="byline"><em>by</em> <span class="author">{{ page.author }}</span></span>
7
+    {% endif %}
8
+  </p>
9
+  <h1><a href="{{ page.url }}">{{ page.title }}</a></h1>
10
+</header>
11
+{% if index %}
12
+<div class="entry">{{ content | exerpt(content, page.url, 'Continue reading &raquo;') | smart_quotes }}</div>
13
+{% else %}
14
+<div class="entry">{{ content | smart_quotes }}</div>
15
+{% endif %}
16
+
17
+{% if page.updated %}<p class="updated"><em>updated</em> <time>{{ page.updated | ordinalize }}</time></p>{% endif %}
0 18
deleted file mode 100644
... ...
@@ -1,3 +0,0 @@
1
-%h4 My Delicious <a class="small" href="http://delicious.com/#{page.delicious_user}">more &rarr;</a>
2
-#delicious
3
-  %script(type="text/javascript" src="http://feeds.delicious.com/v2/js/#{page.delicious_user}?title=&count=#{page.delicious_count}&sort=date&extended")
4 1
\ No newline at end of file
5 2
new file mode 100644
... ...
@@ -0,0 +1,3 @@
0
+<h4>On Delicious</h4>
1
+<script type="text/javascript" src="http://feeds.delicious.com/v2/js/{{ site.delicious_user }}?title=&count={{ site.delicious_count }}&sort=date&extended"></script>
2
+<p><a href="http://delicious.com/{{ site.delicious_user }}">My Delicious Bookmarks &raquo;</a></p>
0 3
deleted file mode 100644
... ...
@@ -1,11 +0,0 @@
1
-:javascript
2
-  (function() {
3
-      var links = document.getElementsByTagName('a');
4
-      var query = '?';
5
-      for(var i = 0; i < links.length; i++) {
6
-        if(links[i].href.indexOf('#disqus_thread') >= 0) {
7
-          query += 'url' + i + '=' + encodeURIComponent(links[i].href) + '&';
8
-        }
9
-      }
10
-      document.write('<script charset="utf-8" type="text/javascript" src="http://disqus.com/forums/#{page.disqus_short_name}/get_num_replies.js' + query + '"></' + 'script>');
11
-    })();
12 1
\ No newline at end of file
13 2
deleted file mode 100644
... ...
@@ -1,5 +0,0 @@
1
-:javascript
2
-  var disqus_url = "#{page.full_url}#{page.url}";
3
-%noscript
4
-  %a(href="http://#{page.disqus_short_name}.disqus.com/?url=ref") View the discussion thread
5
-%script(type="text/javascript" src="http://disqus.com/forums/#{page.disqus_short_name}/embed.js")
6 1
\ No newline at end of file
7 2
new file mode 100644
... ...
@@ -0,0 +1,7 @@
0
+<script type="text/javascript">
1
+  var disqus_url = "{{ site.url }}{{ page.url }}";
2
+</script>
3
+<noscript>
4
+  <a href="http://{{ site.disqus_short_name }}.disqus.com/?url=ref">View the discussion thread</a>
5
+</noscript>
6
+<script type="text/javascript" src="http://disqus.com/forums/{{ site.disqus_short_name }}/embed.js"></script>
0 7
deleted file mode 100644
... ...
@@ -1,7 +0,0 @@
1
-#footer
2
-  .content
3
-    Copyright &copy; #{Time.now.strftime('%Y')} - #{page.blog_title} -
4
-    %span.credit Powered by <a href="http://octopress.org">Octopress</a>
5
-
6
-= include "disqus_hook.haml" if page.respond_to?(:disqus_short_name) && page.disqus_short_name
7
-= include "google_analytics.haml" if page.respond_to?(:google_analytics_tracking_id) && page.google_analytics_tracking_id
8 1
\ No newline at end of file
9 2
new file mode 100644
... ...
@@ -0,0 +1,11 @@
0
+<p>
1
+  Copyright &copy; {{ site.time | date: "%Y" }} - {{ site.author }} -
2
+  <span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
3
+</p>
4
+{% if site.pinboard_user %}
5
+  <script language="javascript">
6
+    var pinboard_user = "{{ site.pinboard_user }}";
7
+    var pinboard_count = "{{ site.pinboard_count }}";
8
+  </script>
9
+  <script language="javascript" src="/javascripts/pinboard.js"></script>
10
+{% endif %}
0 11
deleted file mode 100644
... ...
@@ -1,10 +0,0 @@
1
-:javascript
2
-  var _gaq = _gaq || [];
3
-  _gaq.push(['_setAccount', '#{page.google_analytics_tracking_id}']);
4
-  _gaq.push(['_trackPageview']);
5
-
6
-  (function() {
7
-    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
8
-    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
9
-    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga);
10
-  })();
11 1
\ No newline at end of file
12 2
new file mode 100644
... ...
@@ -0,0 +1,12 @@
0
+<script src="http://www.google-analytics.com/ga.js" type="text/javascript"></script>
1
+<script type="text/javascript">
2
+  var _gaq = _gaq || [];
3
+  _gaq.push(['_setAccount', '#{page.google_analytics_tracking_id}']);
4
+  _gaq.push(['_trackPageview']);
5
+
6
+  (function() {
7
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
8
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
9
+    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga);
10
+  })();
11
+</script>
0 12
deleted file mode 100644
... ...
@@ -1,22 +0,0 @@
1
-%head
2
-  %title #{page.blog_title} :: #{page.title}
3
-  %meta(http-equiv="Content-Type" content="text/html; charset=utf-8")
4
-  - if page.respond_to? :description
5
-    %meta(name="description" content="#{page.description}")/
6
-  - if page.respond_to? :keywords
7
-    %meta(name="keywords" content="#{page.keywords}")/
8
-  %link(href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css")
9
-  %script(src="http://ajax.googleapis.com/ajax/libs/mootools/1.2.4/mootools-yui-compressed.js" type="text/javascript")
10
-  %script(src="/javascripts/mootools-1.2.4.2-more.js" type="text/javascript")
11
-  - if page.respond_to? :twitter_user
12
-    :javascript
13
-      var twitter_user = "#{page.twitter_user}"
14
-      var show_replies = #{page.show_replies};
15
-      var tweet_count = #{page.tweet_count};
16
-    %script(src="/javascripts/octopress.js" type="text/javascript")
17
-    %script(src="/javascripts/twitter.js" type="text/javascript")
18
-  - if page.respond_to? :google_analytics
19
-    %script(src="http://www.google-analytics.com/ga.js" type="text/javascript")
20
-
21
-  - # RSS Feed  
22
-  %link(href="/atom.xml" rel="alternate" title="#{page.blog_title}" type="application/atom+xml")
23 1
\ No newline at end of file
24 2
new file mode 100644
... ...
@@ -0,0 +1,28 @@
0
+<head>
1
+  <title>{{page.title}} - {{site.title}}</title>
2
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
3
+  {% if page.description %}
4
+    <meta name="description" content="{{page.description}}"/>
5
+  {% endif %}
6
+  {% if page.keywords %}
7
+    <meta name="keywords" content="{{page.keywords}}"/>
8
+  {% endif %}
9
+  <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
10
+  <script src="/javascripts/mootools-yui-compressed.js" type="text/javascript"></script>
11
+  <script src="/javascripts/mootools-more-1.3.1.1.js" type="text/javascript"></script>
12
+  <script src="/javascripts/octopress.js" type="text/javascript"></script>
13
+  <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
14
+  <meta name="viewport" content="initial-scale=1.0 width=device-width">
15
+  {% if site.twitter_user %}
16
+    <script>
17
+      var twitter_user = "{{site.twitter_user}}";
18
+      var show_replies = {{site.show_replies}};
19
+      var tweet_count = {{site.tweet_count}};
20
+    </script>
21
+    <script src="/javascripts/twitter.js" type="text/javascript"></script>
22
+  {% endif %}
23
+  {% if site.google_analytics_tracking_id %}
24
+    {% include google_analytics.html %}
25
+  {% endif %}
26
+  <link href="/atom.xml" rel="alternate" title="{{site.title}}" type="application/atom+xml"/>
27
+</head>
0 28
deleted file mode 100644
... ...
@@ -1,9 +0,0 @@
1
-.content
2
-  %h1
3
-    %a.title(href="/")=page.blog_title
4
-  - if page.respond_to?(:google_custom_search_id) && page.google_custom_search_id
5
-    #search
6
-      %form(action="http://www.google.com/cse" id="cse-search-box")
7
-        %input(type="hidden" name="cx" value="#{page.google_custom_search_id}")
8
-        %input(type="hidden" name="ie" value="UTF-8")
9
-        %input#q(type="text" name="q")
10 1
\ No newline at end of file
11 2
new file mode 100644
... ...
@@ -0,0 +1,10 @@
0
+<h1><a href="/">{{ site.title }}</a></h1>
1
+{% if site.google_custom_search_id && site.google_custom_search_id %}
2
+  <div id="search">
3
+    <form action="http://www.google.com/cse" id="cse-search-box">
4
+      <input type="hidden" name="cx" value="{{ site.google_custom_search_id }}">
5
+      <input type="hidden" name="ie" value="UTF-8">
6
+      <input#q type="text" name="q">
7
+    </form>
8
+  </div>
9
+{% endif %}
0 10
deleted file mode 100644
... ...
@@ -1,8 +0,0 @@
1
-.content
2
-  %ul
3
-    %li.alpha
4
-      %a(href="/") Blog
5
-    %li.omega
6
-      %a(href="/about.html") About
7
-    %li.subscribe
8
-      %a(href="/atom.xml") Subscribe
9 1
\ No newline at end of file
10 2
new file mode 100644
... ...
@@ -0,0 +1,5 @@
0
+<ul>
1
+  <li><a href="/">Blog</a></li>
2
+  <li><a href="/about/">About</a></li>
3
+  <li class="subscribe"><a href="/atom.xml">Subscribe</a></li>
4
+</ul>
0 5
new file mode 100644
... ...
@@ -0,0 +1,3 @@
0
+<h4>My Pinboard</h4>
1
+<ul id="pinboard_linkroll">Fetching linkroll...</ul>
2
+<p><a href="http://pinboard.in/u:{{ site.pinboard_user }}">My Pinboard Bookmarks &raquo;</a></p>
0 3
deleted file mode 100644
... ...
@@ -1,8 +0,0 @@
1
-.article
2
-  %h2= page.title
3
-  .meta
4
-    - author = (page.respond_to?(:author) && page.author) ? 'by: ' + page.author + ' |' : ''
5
-    #{author} posted: #{page.date.strftime("%B #{page.date.day.ordinalize}, %Y")}
6
-    = (page.respond_to?(:updated) && page.updated) ? " | updated: #{page.updated}" : ''
7
-  = preserve rp(content)
8
-  #disqus_thread= include "disqus_thread.haml" if page.respond_to?(:disqus_short_name) && page.disqus_short_name
9 1
deleted file mode 100644
... ...
@@ -1,2 +0,0 @@
1
-= include "twitter.haml" if page.respond_to?(:twitter_user) && page.twitter_user
2
-= include "delicious.haml" if page.respond_to?(:delicious_user) && page.delicious_user
3 1
\ No newline at end of file
4 2
new file mode 100644
... ...
@@ -0,0 +1,24 @@
0
+<h4>About Me</h4>
1
+<p> Yo everybody! </p>
2
+{% if site.recent_posts %}
3
+<section>
4
+  <h4>Recent Posts</h4>
5
+  <ul id="recent_posts">
6
+    {% for post in site.posts limit: site.recent_posts %}
7
+      <li class="post">
8
+        <a href="{{ post.url }}">{{ post.title }}</a>
9
+        <time>{{ post.date | date: "%B %d, %Y" }}</time>
10
+      </li>
11
+    {% endfor %}
12
+  </ul>
13
+  </section>
14
+{% endif %}
15
+{% if site.twitter_user %}
16
+  <section>{% include twitter.html %}</section>
17
+{% endif %}
18
+{% if site.delicious_user %}
19
+  <section>{% include delicious.html %}</section>
20
+{% endif %}
21
+{% if site.pinboard_user %}
22
+  <section>{% include pinboard.html %}</section>
23
+{% endif %}
0 24
deleted file mode 100644
... ...
@@ -1,4 +0,0 @@
1
-%h4 Twitter <a class="small" href="http://twitter.com/#{page.twitter_user}">@#{page.twitter_user}</a>
2
-#twitter
3
-  %ul#twitter_status
4
-    Status updating...
5 1
\ No newline at end of file
6 2
new file mode 100644
... ...
@@ -0,0 +1,5 @@
0
+<h4>On Twitter</h4>
1
+<ul id="tweets">
2
+  Status updating...
3
+</ul>
4
+<p>Follow <a href="http://twitter.com/#{page.twitter_user}">@{{ site.twitter_user }}</a></p>
0 5
deleted file mode 100644
... ...
@@ -1,32 +0,0 @@
1
-blog_title: My Octopress Blog
2
-author: 
3
-
4
-twitter_user: 
5
-tweet_count: 3
6
-show_replies: false
7
-
8
-delicious_user: 
9
-delicious_count: 3
10
-
11
-full_url: 
12
-disqus_short_name: 
13
-
14
-google_custom_search_id:
15
-google_analytics_tracking_id:
16
-
17
-
18
-!!! 1.1 Transitional
19
-%html(xmlns="http://www.w3.org/1999/xhtml" xml:lang="en")
20
-
21
-  = include "head.haml"
22
-  %body(id="#{(page.respond_to?(:body_id) ? page.body_id : nil)}")
23
-    #header= include "header.haml"
24
-    #nav= include "navigation.haml"
25
-    #page
26
-      #content
27
-        #main
28
-          .blog.content= include "post.haml"
29
-        #sidebar= include "sidebar.haml"
30
-    = include "footer.haml"
31 1
\ No newline at end of file
32 2
deleted file mode 100644
... ...
@@ -1,32 +0,0 @@
1
-blog_title: My Octopress Blog
2
-author: 
3
-
4
-twitter_user: imathis
5
-tweet_count: 3
6
-show_replies: false
7
-
8
-delicious_user: 
9
-delicious_count: 3
10
-
11
-full_url: 
12
-disqus_short_name: 
13
-
14
-google_custom_search_id:
15
-google_analytics_tracking_id:
16
-
17
-
18
-!!! 1.1 Transitional
19
-%html(xmlns="http://www.w3.org/1999/xhtml" xml:lang="en")
20
-
21
-  = include "head.haml"
22
-  %body(id="#{(page.respond_to?(:body_id) ? page.body_id : nil)}")
23
-    #header= include "header.haml"
24
-    #nav= include "navigation.haml"
25
-    #page
26
-      #content
27
-        #main
28
-          .content= preserve rp(content)
29
-        #sidebar= include "sidebar.haml"
30
-    = include "footer.haml"
31 1
\ No newline at end of file
32 2
new file mode 100644
... ...
@@ -0,0 +1,15 @@
0
+<!DOCTYPE html>
1
+<html>
2
+{% include head.html %}
3
+<body id="{{ page.body_id }}">
4
+  <header><div>{% include header.html %}</div></header>
5
+  <nav id="nav"><div>{% include navigation.html %}</div></nav>
6
+  <div id="page">
7
+    <div>
8
+      <div id="main"><article>{{ content }}</article></div>
9
+      <aside>{% include sidebar.html %}</aside>
10
+    </div>
11
+  </div>
12
+  <footer><div>{% include footer.html %}</div></footer>
13
+</body>
14
+</html>
0 15
new file mode 100644
... ...
@@ -0,0 +1,10 @@
0
+---
1
+layout: default
2
+---
3
+
4
+<article>
5
+  {% include article.html %}
6
+  {% if site.disqus_short_name %}
7
+    <div id="disqus_thread">{% include disqus_thread.html %}</div>
8
+  {% endif %}
9
+</article>
... ...
@@ -1,14 +1,16 @@
1 1
 ---
2 2
 title: Hello World! I'm Octopress!
3
+layout: post
3 4
 updated: March 10th, 2010
4 5
 ---
5 6
 
6 7
 **Octopress is a blogging framework designed for hackers**, based on [Jekyll](http://github.com/mojombo/jekyll) the blog aware static site generator powering [Github pages](http://pages.github.com/).
7 8
 If you don't know what Jekyll is, [Jack Moffitt](http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/) wrote a good summary:
8 9
 
9
-> Jekyll is a static blog generator; it transforms a directory of input files into another directory of files suitable for a blog. The management of the blog is handled by standard, familiar tools like creating and renaming files, the text editor of your choice, and version control.  
10
-> <cite>**Jack Moffitt** [Blogging with Git Emacs and Jekyll](http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/)</cite>
10
+> Jekyll is a static blog generator; it transforms a directory of input files into another directory of files suitable for a blog. The management of the blog is handled by standard, familiar tools like creating and renaming files, the text editor of your choice, and version control.
11 11
 
12
-There's no database to set up, and you get to use tools like Emacs, vim, or TextMate to write your posts, not some lame in-browser text editor. Just write, generate, deploy, using the same tools and patters you already use for your daily work.
12
+<cite>**Jack Moffitt** [Blogging with Git Emacs and Jekyll](http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/)</cite>
13 13
 
14
-[Read the wiki to learn more](http://wiki.github.com/imathis/octopress/)
15 14
\ No newline at end of file
15
+There's no database to set up, and you get to use tools like Emacs, Vim, or TextMate to write your posts, not some lame in-browser text editor. Just write, generate, deploy, using the same tools and patterns you already use for your daily work.
16
+
17
+[Read the wiki to learn more](http://wiki.github.com/imathis/octopress/)
16 18
new file mode 100644
... ...
@@ -0,0 +1,6 @@
0
+---
1
+title: Test Post
2
+layout: post
3
+---
4
+
5
+This is a test!
0 6
new file mode 100644
... ...
@@ -0,0 +1,50 @@
0
+---
1
+title: "Test of Typography"
2
+date: 2011-04-07 19:17
3
+layout: post
4
+---
5
+
6
+In the past I've always designed my own business cards, printed them on expensive card stock, and hand-cut them with an X-Acto knife. My cards were way nicer than those my clients had gotten *professionally* printed with bubbly ink, no-bleed designs, and cheap paper. Though I put tremendous care into my cards, I never was happy with the design.
7
+
8
+## Why Have Business Cards?
9
+I'm rarely asked for my business card except when I attend conferences, of which I attend one or two each year. As a freelance contractor, I leave work by walking twenty-five feet from my office to the couch. Many of the
10
+people I work for I've never met in-person.
11
+
12
+When someone gives me their business card, I read it, pocket it, and eventually throw it out &mdash; sometimes before I remember to copy the information to my address book (sorry, just being honest). The reality is, with the ubiquity of the internet and with frictionless social networks like Twitter, I can connect with people immediately. So why have business cards?
13
+
14
+<!-- more -->
15
+
16
+### Inspiration Demands Action
17
+In one of our campfire chats [Nathaniel Talbott](http://twitter.com/NTalbott) showed off his business cards which he printed through [Moo](http://moo.com). They were half the size of regular business cards featuring the company logo on the front, and the url on the back. The unique size of the card intrigued me, and days later I couldn't stop thinking about designing a set of mini-cards for myself.
18
+
19
+<img src="/content/blog/2010/cards/box.jpg" alt="cards in a box" width="300px" class="right"/> Moo's [MiniCard's](http://moo.com/products/minicards.php) are very unique. You can print 100 cards, each with a totally different back. With a typical printing service this would be prohibitively expensive, but with Moo the rules are different. This freedom encourages us to go beyond nicely styled contact information and branding. Some clever uses involve offering unique invite codes for a web application, or sharing a photography portfolio with Moo's Flickr import feature.
20
+
21
+I realized that I could print several design iterations and decide later which worked best. Without the pressure to choose a single design, I felt the freedom to create.
22
+
23
+### The Freedom to Fail
24
+<img src="/content/blog/2010/cards/concepts.jpg" alt="card concepts" width="270px" class="left"/> I could be cheeky and print up half of my cards with my logo on one side and only my Twitter name on the other. For less than $20 for 100 cards, I wasn't even concerned about possibly screwing up a whole batch. So that's what I did. I designed cards that were good enough and I printed them. If the cards did't turn out how I wanted them to, I could improve and print again.
25
+
26
+<img src="/content/blog/2010/cards/handout.jpg" alt="handout cards" width="220px" class="right"/> The process was fun and simple, and as soon as I finished, I wanted to do it again. When my cards arrived, I was absolutely delighted by the print quality and the care put into their presentation. Smartly Moo even included some beautiful promotional cards to hand out when people inevitably ask about mine.
27
+
28
+### A Second Iteration
29
+After holding the finished product, I began to see how my design could be improved. I learned that Gill Sans is harder to read at a small size in a high contrast print, so I switched to Futura. I showed my cards to some far-sighted friends and adjusted my font size accordingly. I discarded a background gradient (which I should have known wouldn't translate well to print) in favor of a solid color. **Sidenote:** On screen, gradients emulate the subtleties of a natural light source, but on a real object it doesn't make sense and generally looks bad.
30
+
31
+I changed my approach choosing a single design with multiple color variations. In the promotional cards Moo sent me, I learned that they do a fantastic job with bright colors and I wanted to use that boldness in my design. I was inspired by what [Seth Godin said](http://sethgodin.typepad.com/seths_blog/2009/07/welcome-to-island-marketing.html):
32
+
33
+> Every interaction is both precious and an opportunity to delight.
34
+
35
+<img src="/content/blog/2010/cards/holder.jpg" alt="MiniCard Holder" width="220px" class="right"/> I pictured sliding a card out of my [MiniCard Holder](http://moo.com/products/accessories/holders/moo_minicard_holders) and revealing another brightly-colored card beneath. As I hand someone a card they'll see the flash of color and realize that their card was special, and different from my other cards. That's what I want my clients and future clients to feel.
36
+
37
+### The Final Design
38
+
39
+<img src="/content/blog/2010/cards/all.jpg" alt="all card designs" width="640px"/>
40
+
41
+The MiniCard's unique constraints inspired me with a fresh challenge and their pricing model encouraged me to experiment. Instead of treating business cards like a necessary design task, I saw them as a opportunity to release quickly, fail cheaply, and improve. Now when I give someone a business card, it's something valuable to me, and I hope they're delighted.
42
+
43
+**Update:** I thought I'd share some other great uses of Moo's MiniCards. There's a fantastic [Flikr pool](http://www.flickr.com/groups/moo/pool/), but here are some of my favorites. Enjoy:
44
+
45
+- [Product](http://www.flickr.com/photos/lushlampwork/4131018201/in/pool-moo) [tags](http://www.flickr.com/photos/lushlampwork/4297224179/in/pool-moo)
46
+- [Photography](http://www.flickr.com/photos/thisiswoly/4206576342/in/pool-moo) or [art](http://www.flickr.com/photos/lesleybarnes/4276368956/in/pool-moo) [portfolios](http://www.flickr.com/photos/playinprogress/4158223112/in/pool-moo)
47
+- [Gift](http://www.flickr.com/photos/polkadotcreations/4167249758/in/pool-moo) [tags](http://www.flickr.com/photos/22338102@N04/4278114745/in/pool-moo)
48
+- [An advent calendar](http://www.flickr.com/photos/bcome/4177034036/in/pool-moo)
49
+
0 50
deleted file mode 100644
... ...
@@ -1,14 +0,0 @@
1
-layout: default
2
-title: Blog Archives
3
-%h2 Blog Archives
4
-
5
-- posts = site.posts.reverse.group_by { |p| p.date.strftime("%Y") }
6
-- posts.keys.each do |year|
7
-  %h3= year
8
-  %ul
9
-    - posts[year].each do |post|
10
-      %li(class="#{(post.data['link'] ? "link" : nil )}")
11
-        = link_to(post.title, post.url)
12
-        %span.pubdate= post.date.strftime("%d %b, %Y")
13 1
\ No newline at end of file
14 2
deleted file mode 100644
... ...
@@ -1,25 +0,0 @@
1
-layout: nil
2
-author: Your Name
3
-email: author@domain.com
4
-blog_title: My Octopress Blog
5
-full_url: http://yoursite.com
6
-!!! XML
7
-%feed(xmlns="http://www.w3.org/2005/Atom")
8
-  %title= page.blog_title
9
-  %link(href="#{page.full_url}/atom.xml" rel="self")
10
-  %link(href="#{page.full_url}")
11
-  %updated= Time.now.xmlschema
12
-  %id=page.full_url
13
-  %author
14
-    %name= page.author
15
-    %email= page.email
16
-  - site.posts.reverse[0..14].each do |post|
17
-    %entry
18
-      %title= rp(post.title)
19
-      %link(href="#{page.full_url}#{post.url}")
20
-      %updated=post.date.xmlschema
21
-      %id= "#{page.full_url}#{post.id}"
22
-      %content(type="html")
23
-        = h(absolute_url(rp(post.content), page.full_url))
24 1
\ No newline at end of file
25 2
new file mode 100644
... ...
@@ -0,0 +1,28 @@
0
+---
1
+layout: nil
2
+---
3
+<?xml version="1.0" encoding="utf-8"?>
4
+<feed xmlns="http://www.w3.org/2005/Atom">
5
+
6
+  <title>{{ site.blog_title }}</title>
7
+  <link href="{{ site.url }}/atom.xml" rel="self"/>
8
+  <link href="{{ site.url }}/"/>
9
+  <updated>{{ site.time | date_to_xmlschema }}</updated>
10
+  <id>{{ site.url }}/</id>
11
+  <author>
12
+    <name>{{ site.author }}</name>
13
+    {% if site.email %}
14
+      <email>{{ site.email }}</email>
15
+    {% endif %}
16
+  </author>
17
+
18
+  {% for post in site.posts %}
19
+  <entry>
20
+    <title>{{ post.title }}</title>
21
+    <link href="{{ site.url }}{{ post.url }}"/>
22
+    <updated>{{ post.date | date_to_xmlschema }}</updated>
23
+    <id>{{ site.url }}{{ post.id }}</id>
24
+    <content type="html">{{ post.content | full_urls: site.url | xml_escape }}</content>
25
+  </entry>
26
+  {% endfor %}
27
+</feed>
0 28
new file mode 100755
1 29
Binary files /dev/null and b/source/fonts/adellebasic_bold-webfont.eot differ
2 30
new file mode 100755
... ...
@@ -0,0 +1,139 @@
0
+<?xml version="1.0" standalone="no"?>
1
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
2
+<svg xmlns="http://www.w3.org/2000/svg">
3
+<metadata>
4
+This is a custom SVG webfont generated by Font Squirrel.
5
+Copyright   : Copyright c 2009 by TypeTogether All rights reserved
6
+Designer    : Veronika Burian Jos Scaglione
7
+Foundry     : TypeTogether
8
+Foundry URL : wwwtypetogethercom
9
+</metadata>
10
+<defs>
11
+<font id="webfontKykxqSyz" horiz-adv-x="1167" >
12
+<font-face units-per-em="2048" ascent="1546" descent="-502" />
13
+<missing-glyph horiz-adv-x="413" />
14
+<glyph unicode=" "  horiz-adv-x="413" />
15
+<glyph unicode="&#x09;" horiz-adv-x="413" />
16
+<glyph unicode="&#xa0;" horiz-adv-x="413" />
17
+<glyph unicode="!" horiz-adv-x="569" d="M414 401h-258l-37 719v363h330v-363zM461 135q0 -160 -176 -160t-176 160t176 160t176 -160z" />
18
+<glyph unicode="&#x22;" horiz-adv-x="825" d="M358 915h-276v531h276v-531zM743 915h-276v531h276v-531z" />
19
+<glyph unicode="#" horiz-adv-x="1243" d="M831 0h-210l34 248h-176l-37 -248h-213l37 248h-205l45 207h193l35 231h-205l43 209h193l32 217h213l-32 -217h176l32 217h213l-32 -217h207l-41 -209h-197l-35 -231h207l-41 -207h-199zM688 455l35 231h-176l-37 -231h178z" />
20
+<glyph unicode="$" horiz-adv-x="1083" d="M999 399q0 -158 -85 -254t-234 -129v-180h-254v166q-227 10 -356 74v327h223l26 -143q4 -23 11.5 -31t27.5 -14q51 -18 152 -18q207 0 207 145q0 72 -65.5 114t-159 66.5t-186.5 58t-158.5 113.5t-65.5 209q0 160 93 256t251 129v160h256v-150q152 -10 293 -59v-350 l-225 22l-25 136q-6 35 -41 45q-41 10 -117 10q-203 0 -202 -137q0 -68 65.5 -109t158.5 -67.5t186 -61.5t158.5 -118t65.5 -210z" />
21
+<glyph unicode="%" horiz-adv-x="1818" d="M410 526q-182 0 -263 99.5t-81 261.5q0 180 90 281.5t270 101.5q342 0 342 -357q0 -180 -91 -283.5t-267 -103.5zM662 -35h-285l772 1307h283zM420 694q61 0 89 51.5t28 159.5q0 100 -27 147.5t-88 47.5q-121 0 -121 -199q0 -207 119 -207zM1395 -25q-182 0 -263 99.5 t-81 261.5q0 180 90 281.5t270 101.5q342 0 342 -357q0 -180 -91 -283.5t-267 -103.5zM1402.5 143q63.5 0 90.5 50.5t27 160.5q0 100 -26 147.5t-89 47.5q-119 0 -119 -199q0 -106 26.5 -156.5t90 -50.5z" />
22
+<glyph unicode="&#x26;" horiz-adv-x="1470" d="M1409 0h-346l-113 131q-166 -156 -413 -156q-211 0 -338 112t-127 310q0 295 295 418q-76 119 -76 238q0 156 109.5 247t285.5 91q104 0 206.5 -28t158.5 -63v-321l-220 8l-24 137q-4 25 -29 33q-27 8 -73 8q-59 0 -90 -30.5t-31 -81.5q0 -86 112 -217l230 -271 q29 88 47 228h352v-158l-94 -19q-18 -4 -25.5 -9t-9.5 -25q-29 -133 -76 -232l129 -147q18 -23 39 -25l121 -18v-160zM784 317l-270 308q-145 -61 -145 -213q0 -82 47 -136.5t145 -54.5q135 0 223 96z" />
23
+<glyph unicode="'" horiz-adv-x="442" d="M358 915h-276v531h276v-531z" />
24
+<glyph unicode="(" horiz-adv-x="729" d="M655 -221l-235 -133q-145 190 -239.5 429.5t-94.5 497.5q0 485 352 951l232 -138q-131 -195 -192.5 -388t-61.5 -425q0 -238 59 -413.5t180 -380.5z" />
25
+<glyph unicode=")" horiz-adv-x="729" d="M297 -354l-231 135q125 190 187 380.5t62 428.5q0 231 -59 412.5t-186 386.5l233 135q147 -188 243.5 -433t96.5 -501q0 -483 -346 -944z" />
26
+<glyph unicode="*" horiz-adv-x="976" d="M342 782l-174 129l88 115l178 115l-213 -8l-137 45l70 204l137 -45l162 -133l-74 199v143h215v-143l-72 -199h-69l-19 -63l53 -41l-59 -201zM809 911l-174 -129l-86 117l-62 201l56 41l-21 63l164 133l137 45l68 -204l-137 -45l-211 8l178 -115z" />
27
+<glyph unicode="+" d="M705 248h-246v295h-273v237h273v287h246v-287h274v-237h-274v-295z" />
28
+<glyph unicode="," horiz-adv-x="516" d="M281 -244l-140 41l56 219q6 18 -11 25l-84 29l45 221q141 -2 214 -33t73 -127q0 -55 -43 -141z" />
29
+<glyph unicode="-" horiz-adv-x="636" d="M596 465h-555v260h555v-260z" />
30
+<glyph unicode="." horiz-adv-x="555" d="M453 135q0 -160 -174 -160q-176 0 -176.5 160t176.5 160q174 0 174 -160z" />
31
+<glyph unicode="/" horiz-adv-x="929" d="M315 -188h-292l575 1734h291z" />
32
+<glyph unicode="0" horiz-adv-x="1232" d="M606 -25q-291 0 -409.5 160t-118.5 459q0 616 553 616q287 0 405.5 -155.5t118.5 -444.5q0 -305 -128 -470t-421 -165zM618 195q113 0 161 93t48 310q0 213 -45 301t-157 88q-117 0 -167 -92t-50 -305q0 -211 46.5 -303t163.5 -92z" />
33
+<glyph unicode="1" horiz-adv-x="831" d="M791 0h-719v162l176 14q20 2 26.5 9.5t6.5 31.5v715q0 35 -27 43l-178 37l22 168h492v-963q0 -25 5 -32t28 -9l168 -14v-162z" />
34
+<glyph unicode="2" horiz-adv-x="1073" d="M1012 0h-946v190l274 269q129 125 175 173t83 108.5t37 117.5q0 131 -146 131q-88 0 -123.5 -38t-35.5 -144l-279 24q2 379 465 379q430 0 430 -327q0 -90 -45 -178.5t-92 -139.5t-145 -145l-232 -221h301q29 0 33 24l29 162h217v-385z" />
35
+<glyph unicode="3" horiz-adv-x="1062" d="M723 551v-8q270 -41 270 -316q0 -197 -134 -297t-361 -100q-154 0 -285 50t-211 138l164 181q139 -135 307 -136q213 0 213 185q0 176 -205 176q-66 0 -151 -14v204l100 13q227 29 227 221q0 141 -149 141q-88 0 -126 -39t-38 -143l-281 24q0 379 459 379 q229 0 332.5 -85t103.5 -255q0 -123 -66.5 -205.5t-168.5 -113.5z" />
36
+<glyph unicode="4" horiz-adv-x="1140" d="M934 -137h-283v264h-598v211l420 879l268 -123l-387 -727h297v329l283 43v-372h170v-240h-170v-264z" />
37
+<glyph unicode="5" horiz-adv-x="1110" d="M942 922h-543l-28 -281q106 70 260 70q184 0 289.5 -106.5t105.5 -311.5q0 -199 -133 -331t-371 -132q-340 0 -516 188l164 187q139 -139 326 -139q96 0 158.5 56t62.5 161q0 113 -57.5 155.5t-133.5 42.5q-113 0 -196 -88l-203 84l45 703h535q20 0 26 24l27 113l182 12 v-407z" />
38
+<glyph unicode="6" horiz-adv-x="1157" d="M1067 1004l-289 -35q0 92 -31.5 126.5t-113.5 34.5q-217 0 -230 -382q135 80 287 79q184 0 292 -100t108 -295q0 -229 -134.5 -343t-357.5 -114q-145 0 -246.5 50.5t-158 145.5t-81 211t-24.5 267q0 121 25.5 232.5t83 220t171 174t271.5 65.5q428 1 428 -337zM403 543 q2 -74 10.5 -126t28 -105.5t60.5 -82t102 -28.5q172 0 172 217q0 104 -37 147t-129 43q-101 1 -207 -65z" />
39
+<glyph unicode="7" horiz-adv-x="1089" d="M625 -137h-326q53 625 446 1059h-391q-14 0 -18 -5.5t-8 -21.5l-33 -172l-215 -16v473h989v-232q-186 -199 -311 -491.5t-133 -593.5z" />
40
+<glyph unicode="8" horiz-adv-x="1105" d="M823 696q215 -123 215 -325q0 -193 -139 -294.5t-367 -101.5q-223 0 -343.5 90.5t-120.5 264.5q0 111 51 192.5t143 157.5q-152 104 -151 281q0 182 124.5 281t323.5 99q201 0 313.5 -87t112.5 -240q0 -177 -162 -318zM459 575q-135 -125 -135 -229q0 -166 213 -166 q94 0 142 43t48 113q0 27 -6 49.5t-26 42.5l-31 34q-12 13 -47 33l-47 26q-13 7 -57 28.5t-54 25.5zM618 795q106 111 107 204q0 139 -164 140q-76 0 -115.5 -37t-39.5 -96q0 -37 15 -68t49 -56.5t63.5 -42.5t84.5 -44z" />
41
+<glyph unicode="9" d="M109 -18l131 188q131 -111 284 -111q135 0 186.5 90.5t57.5 251.5q-121 -78 -287 -77q-176 0 -287.5 113.5t-111.5 316.5q0 219 129 337.5t356 118.5q518 0 518 -659q0 -719 -546 -719q-123 0 -240.5 40t-189.5 110zM768 623q-4 78 -12 134t-28.5 113.5t-61.5 87 t-101 29.5q-170 0 -170 -217q0 -113 37 -167t127 -54q105 0 209 74z" />
42
+<glyph unicode=":" horiz-adv-x="555" d="M453 135q0 -160 -174 -160q-176 0 -176.5 160t176.5 160q174 0 174 -160zM453 913.5q0 -159.5 -174 -159.5q-176 0 -176.5 159.5t176.5 159.5q174 0 174 -159.5z" />
43
+<glyph unicode=";" horiz-adv-x="522" d="M281 -244l-140 41l56 219q6 18 -11 25l-84 29l45 221q141 -2 214 -33t73 -127q0 -55 -43 -141zM461 913.5q0 -159.5 -174 -159.5q-176 0 -176 159.5t176 159.5q174 0 174 -159.5z" />
44
+<glyph unicode="&#x3c;" d="M940 172l-799 281v286l795 291l70 -231l-598 -201l602 -201z" />
45
+<glyph unicode="=" d="M979 266h-791v240h791v-240zM979 647h-791v240h791v-240z" />
46
+<glyph unicode="&#x3e;" d="M1010 453l-799 -281l-70 225l602 201l-596 201l68 231l795 -291v-286z" />
47
+<glyph unicode="?" horiz-adv-x="1081" d="M600 401h-309v373q70 6 112.5 11.5t106 23.5t99.5 46t63.5 78t27.5 118q0 86 -43 133t-122 47q-78 0 -138 -25q-23 -8 -26 -41l-19 -131l-250 -18v377q236 90 447 90q496 0 495 -422q0 -199 -113.5 -322t-330.5 -149v-189zM621 135q0 -160 -175 -160q-176 0 -176 160 t176 160q175 0 175 -160z" />
48
+<glyph unicode="@" horiz-adv-x="1722" d="M1219 -143l49 -168q-164 -72 -416 -72q-340 0 -537.5 187.5t-197.5 539.5q0 369 220 594t574 225q322 0 515.5 -171t193.5 -480q0 -272 -108.5 -404.5t-294.5 -132.5q-184 0 -236 142q-145 -141 -250 -142q-109 0 -171 75t-62 214q0 229 121.5 389t328.5 160 q145 0 285 -65l-47 -302q-27 -147 -27 -217q0 -80 76 -79q51 0 89 35.5t56.5 93t26.5 111.5t8 106q0 231 -125 357t-385 126q-283 0 -432 -184.5t-149 -450.5q0 -268 144 -409.5t409 -141.5q168 1 342 64zM963 262l59 377q-35 25 -90 25q-92 0 -159.5 -103.5t-67.5 -263.5 q0 -143 82 -143.5t176 108.5z" />
49
+<glyph unicode="A" horiz-adv-x="1554" d="M1548 0h-647v160l168 18l-74 213h-508l-71 -213l162 -18v-160h-572v160l90 22q41 10 51 39l449 1262h362l447 -1266q8 -25 49 -35l94 -22v-160zM934 612l-182 557h-13l-188 -557h383z" />
50
+<glyph unicode="B" horiz-adv-x="1376" d="M750 0h-672v160l129 14q20 2 26.5 10.5t6.5 30.5v1049q0 25 -6.5 32t-26.5 9l-129 14v164h690q449 0 449 -363q0 -135 -72 -222t-178 -122v-6q342 -39 342 -362q0 -408 -559 -408zM555 221h141q141 0 213 47t72 172q0 215 -254 215h-172v-434zM555 860h82q129 0 203.5 45 t74.5 164q0 115 -62 153t-185 38h-113v-400z" />
51
+<glyph unicode="C" horiz-adv-x="1386" d="M1294 469v-381q-184 -113 -512 -113q-719 0 -719 773q0 342 197 551.5t565 209.5q287 0 465 -116v-402l-225 19l-33 200q-6 29 -33 37q-78 25 -182 25q-199 0 -312.5 -134t-113.5 -390q0 -266 108.5 -402.5t303.5 -136.5q119 0 205 27q18 4 25 12t11 31l31 190h219z" />
52
+<glyph unicode="D" horiz-adv-x="1540" d="M707 0h-629v164l129 14q20 2 26.5 9.5t6.5 31.5v1047q0 23 -6.5 31t-26.5 10l-129 14v162h663q375 0 555.5 -187.5t180.5 -531.5q0 -354 -192.5 -559t-577.5 -205zM557 221h117q481 0 481 524q0 279 -110.5 398t-358.5 119h-129v-1041z" />
53
+<glyph unicode="E" horiz-adv-x="1284" d="M1212 0h-1134v160l129 14q20 2 26.5 10.5t6.5 30.5v1051q0 25 -6.5 32t-26.5 9l-129 14v162h1089v-414l-225 10l-29 156q-6 27 -34 27h-322v-404h479v-227h-479v-412h367q29 0 32 23l33 180h223v-422z" />
54
+<glyph unicode="F" horiz-adv-x="1234" d="M891 0h-813v160l129 14q20 2 26.5 10.5t6.5 30.5v1051q0 25 -6.5 32t-26.5 9l-129 14v162h1081v-414l-225 10l-29 156q-6 27 -35 27h-313v-402h471v-227h-471v-414q0 -25 5 -32t28 -9l301 -16v-162z" />
55
+<glyph unicode="G" horiz-adv-x="1478" d="M1460 551l-84 -8q-33 -2 -33 -29v-440q-207 -98 -530 -99q-205 0 -353.5 57.5t-233.5 164t-125 241.5t-40 307q0 342 197 553t571 211q119 0 247 -30.5t216 -87.5v-387l-227 16l-31 184q-8 35 -33 41q-94 27 -188 27q-197 0 -309.5 -140.5t-112.5 -381.5 q0 -258 109.5 -398.5t326.5 -140.5q88 0 170 14q33 6 33 37v268h-227l28 185h629v-164z" />
56
+<glyph unicode="H" horiz-adv-x="1675" d="M1604 0h-648v160l129 14q20 2 26.5 10.5t6.5 30.5v432h-561v-430q0 -25 5 -32t28 -9l137 -16v-160h-649v160l129 14q20 2 26.5 10.5t6.5 30.5v1049q0 25 -6.5 32t-26.5 9l-129 14v164h649v-164l-137 -16q-23 -2 -28 -9.5t-5 -29.5v-387h561v387q0 25 -6 32t-27 9l-129 14 v164h648v-164l-138 -16q-23 -2 -27.5 -9.5t-4.5 -29.5v-1047q0 -25 5 -32t27 -9l138 -16v-160z" />
57
+<glyph unicode="I" horiz-adv-x="827" d="M762 0h-688v160l149 14q20 2 26.5 9t6.5 32v1049q0 25 -6 32t-27 9l-149 14v164h688v-164l-158 -16q-23 -2 -28 -9.5t-5 -29.5v-1047q0 -25 5.5 -32t27.5 -9l158 -16v-160z" />
58
+<glyph unicode="J" horiz-adv-x="1056" d="M526 336v930q0 23 -6 30t-26 9l-185 14v164h705v-164l-137 -16q-23 -2 -28 -8.5t-5 -28.5v-932q0 -182 -92.5 -270.5t-294.5 -88.5q-117 0 -227.5 25t-157.5 55v365l229 -17l21 -147q2 -20 22 -27q37 -12 82 -12q55 0 77.5 26.5t22.5 92.5z" />
59
+<glyph unicode="K" horiz-adv-x="1540" d="M1522 0h-453l-383 592l-129 -154v-219q0 -25 5 -32t28 -9l158 -16v-162h-670v162l129 14q20 2 26.5 9.5t6.5 31.5v1049q0 23 -6.5 31t-26.5 10l-129 14v162h649v-162l-137 -16q-23 -2 -28 -9.5t-5 -29.5v-512l483 549l-127 16v164h537v-164l-86 -14q-41 -6 -64 -35 l-376 -426l411 -629q18 -29 60 -33l127 -20v-162z" />
60
+<glyph unicode="L" horiz-adv-x="1277" d="M1212 0h-1134v162l129 14q20 2 26.5 10.5t6.5 30.5v1049q0 25 -6.5 32t-26.5 9l-129 14v162h682v-162l-170 -16q-23 -2 -28 -9.5t-5 -29.5v-1047h365q29 0 32 23l33 204h225v-446z" />
61
+<glyph unicode="M" horiz-adv-x="1970" d="M1898 0h-673v160l168 14q20 2 26 10.5t6 30.5v778h-8l-293 -698h-333l-289 700h-10v-778q0 -25 5 -32t27 -9l176 -16v-160h-622v160l129 14q20 2 26.5 10.5t6.5 30.5v1051q0 23 -6.5 31t-26.5 10l-129 14v162h549l356 -928h8l375 928h532v-160l-137 -16 q-23 -2 -27.5 -9.5t-4.5 -29.5v-1053q0 -35 32 -39l137 -16v-160z" />
62
+<glyph unicode="N" horiz-adv-x="1693" d="M1466 0h-336l-653 1069v-852q0 -25 5 -32t28 -9l137 -16v-160h-569v160l129 14q20 2 26.5 10.5t6.5 30.5v1053q0 25 -6.5 32t-26.5 9l-129 14v160h508l643 -1071v852q0 25 -6 32t-27 9l-129 14v164h569v-164l-137 -16q-23 -2 -28 -9.5t-5 -29.5v-1264z" />
63
+<glyph unicode="O" horiz-adv-x="1554" d="M768 -25q-356 0 -530.5 206t-174.5 556q0 342 190.5 557t543.5 215q346 0 520 -207.5t174 -537.5q0 -371 -183.5 -580t-539.5 -209zM780 227q385 0 385 518q0 506 -372 506q-184 0 -293 -127t-109 -381q0 -516 389 -516z" />
64
+<glyph unicode="P" horiz-adv-x="1323" d="M881 0h-803v162l129 14q20 2 26.5 10.5t6.5 30.5v1047q0 25 -6.5 32t-26.5 9l-129 14v164h694q264 0 379 -120t115 -316q0 -500 -561 -500h-150v-328q0 -25 5 -32t28 -9l293 -16v-162zM555 766h102q59 0 103.5 9t88.5 35t68.5 81t24.5 137q0 135 -69.5 183.5t-196.5 48.5 h-121v-494z" />
65
+<glyph unicode="Q" horiz-adv-x="1552" d="M1182 -176l59 -180q-143 -76 -291 -76q-324 0 -323 305q0 55 6 111q-291 35 -434.5 235.5t-143.5 517.5q0 342 190.5 557t542.5 215q236 0 395.5 -102t229.5 -266t70 -377q0 -326 -143.5 -528.5t-421.5 -245.5q-4 -25 -5 -70q0 -63 28 -95t93 -32q72 0 148 31zM774 227 q385 0 385 518q0 506 -373 506q-186 0 -294.5 -127t-108.5 -381q0 -516 391 -516z" />
66
+<glyph unicode="R" horiz-adv-x="1406" d="M1403 0h-447l-184 514q-18 53 -44 72.5t-77 19.5h-96v-385q0 -25 5 -32t28 -9l143 -16v-164h-653v164l129 14q20 2 26.5 9.5t6.5 31.5v1047q0 23 -6.5 31t-26.5 10l-129 14v162h698q256 0 366.5 -115t110.5 -295q0 -274 -270 -393q70 -33 119 -164l112 -293 q18 -33 62 -39l127 -20v-164zM555 819h94q131 0 205 49.5t74 186.5q0 115 -64.5 160t-206.5 45h-102v-441z" />
67
+<glyph unicode="S" horiz-adv-x="1214" d="M1090 1028l-232 21l-24 165q-4 31 -25 39q-72 23 -150 23q-113 0 -171 -47t-58 -127q0 -39 18.5 -71t38 -50t70.5 -39.5t74.5 -30t93.5 -28.5q94 -29 149.5 -52.5t125 -72.5t103.5 -128t34 -188q0 -238 -161 -352.5t-415 -114.5q-129 0 -266 27t-203 57v400h230l40 -195 q4 -31 35 -37q90 -23 172 -22q258 0 258 190q0 47 -18 82t-58 59.5t-78 38t-100 31.5q-201 57 -274 101q-178 106 -178 342q0 227 151.5 343.5t397.5 116.5q225 0 420 -82v-399z" />
68
+<glyph unicode="T" horiz-adv-x="1421" d="M1128 0h-819v162l211 14q20 2 26.5 9.5t6.5 31.5v1043h-211q-29 0 -33 -23l-33 -178h-225v424h1319v-424h-223l-33 178q-4 23 -33 23h-211v-1043q0 -23 5.5 -30t27.5 -9l225 -16v-162z" />
69
+<glyph unicode="U" horiz-adv-x="1607" d="M1112 588v678q0 25 -6 32t-27 9l-129 14v162h606v-162l-137 -16q-23 -2 -28 -9.5t-5 -29.5v-736q0 -283 -151.5 -419t-431.5 -136q-303 0 -442.5 137.5t-139.5 426.5v727q0 25 -6 32t-27 9l-127 14v162h648v-162l-138 -16q-23 -2 -27.5 -9.5t-4.5 -29.5v-670 q0 -188 58 -275.5t218 -87.5q164 0 230.5 80t66.5 275z" />
70
+<glyph unicode="V" horiz-adv-x="1505" d="M981 0h-418l-411 1266q-8 25 -50 34l-92 23l21 160h620v-160l-166 -18l308 -1024h16l297 1024l-164 18l21 160h530v-160l-86 -23q-45 -10 -51 -38z" />
71
+<glyph unicode="W" horiz-adv-x="2136" d="M1688 0h-414l-201 750h-12l-189 -750h-401l-309 1264q-6 27 -45 36l-105 23l21 160h626v-160l-172 -20l209 -1002h17l235 907h312l233 -913h16l211 1008l-172 20l21 160h553v-160l-97 -23q-37 -6 -47 -36z" />
72
+<glyph unicode="X" horiz-adv-x="1583" d="M1548 0h-671v160l161 18l-278 375l-277 -375l158 -18v-160h-586v160l119 22q35 8 53 39l389 504l-409 541q-16 27 -49 34l-107 23l21 160h641v-160l-160 -18l266 -373l279 373l-158 18l21 160h540v-160l-100 -23q-29 -8 -51 -38l-383 -496l419 -545q31 -33 52 -39 l110 -22v-160z" />
73
+<glyph unicode="Y" horiz-adv-x="1384" d="M1120 0h-803v162l205 14q20 2 26.5 9.5t6.5 31.5v336l-408 713q-14 23 -49 34l-92 23l21 160h614v-160l-160 -18l248 -484h16l248 484l-157 18l20 160h522v-160l-86 -23q-39 -10 -51 -38l-371 -705v-340q0 -23 5.5 -30t27.5 -9l217 -16v-162z" />
74
+<glyph unicode="Z" horiz-adv-x="1376" d="M1284 0h-1180v199l766 1063h-454q-29 0 -33 -23l-39 -192l-221 -7v443h1124v-207l-755 -1057h499q29 0 33 23l39 219h221v-461z" />
75
+<glyph unicode="[" horiz-adv-x="630" d="M557 -293h-459v1776h459v-156l-127 -22q-33 -4 -33 -41v-1336q0 -39 33 -43l127 -22v-156z" />
76
+<glyph unicode="\" horiz-adv-x="921" d="M897 -188h-283l-573 1734h281z" />
77
+<glyph unicode="]" horiz-adv-x="630" d="M532 1483v-1776h-464v156l133 22q33 4 32 43v1295q0 76 -32 82l-133 22v156h464z" />
78
+<glyph unicode="^" horiz-adv-x="1247" d="M1186 612h-295l-273 492l-266 -492h-291l404 748h313z" />
79
+<glyph unicode="_" horiz-adv-x="1024" d="M1024 -371h-1024v219h1024v-219z" />
80
+<glyph unicode="`" horiz-adv-x="1024" d="M762 1251l-117 -102l-364 299l168 160z" />
81
+<glyph unicode="a" horiz-adv-x="1140" d="M1118 0h-377l-20 111l-10 2q-141 -137 -344 -138q-299 0 -299 304q0 152 94 227.5t289 87.5l235 16v113q0 84 -24.5 123t-112.5 39q-82 0 -116 -25.5t-34 -111.5l-288 24q0 315 440 315q240 0 338 -79.5t98 -290.5v-498q0 -25 5 -32t28 -9l98 -16v-162zM686 270v170 l-139 -10q-90 -6 -127 -32.5t-37 -88.5q0 -113 117 -112q86 -1 186 73z" />
82
+<glyph unicode="b" horiz-adv-x="1247" d="M420 0h-293q31 197 31 299v999q0 35 -27 43l-113 39l23 166h422v-567l8 -2q135 111 309 110q178 0 287 -126.5t109 -397.5q0 -303 -115 -445.5t-316 -142.5q-186 0 -301 129l-10 -2zM465 774v-479q88 -80 188 -80q199 0 199 332q0 131 -46 215t-142 84q-90 0 -199 -72z " />
83
+<glyph unicode="c" horiz-adv-x="1044" d="M901 266l80 -190q-166 -100 -389 -101q-266 0 -401.5 148.5t-135.5 394.5q0 279 152.5 424t408.5 145q113 0 212.5 -25.5t152.5 -60.5v-321l-219 10l-25 135q-4 27 -24 33q-43 14 -105 14q-100 0 -163.5 -77.5t-63.5 -245.5q0 -342 264 -342q119 0 256 59z" />
84
+<glyph unicode="d" horiz-adv-x="1251" d="M1221 0h-381l-21 115l-14 2q-145 -141 -336 -142q-397 0 -397 545q0 289 122.5 428t311.5 139q156 0 289 -98v311q0 33 -27 41l-113 39l23 166h412v-1331q0 -23 5 -30t27 -9l99 -14v-162zM782 305v483q-90 61 -176 62q-109 0 -160 -88t-51 -236q0 -309 187 -309 q98 0 200 88z" />
85
+<glyph unicode="e" horiz-adv-x="1075" d="M930 283l76 -203q-215 -104 -420 -105q-281 0 -406 153t-125 413q0 266 142.5 406t365.5 140q213 0 332 -119.5t119 -375.5q0 -55 -4 -137h-627q16 -242 242 -242q117 0 305 70zM385 649h326q-2 217 -154 217q-156 0 -172 -217z" />
86
+<glyph unicode="f" horiz-adv-x="894" d="M799 0h-744v164l115 12q20 2 26.5 10.5t6.5 32.5v623q0 20 -17 20h-137v205h154v113q0 203 110.5 297t327.5 94q80 0 139.5 -12.5t113.5 -42t84 -90t30 -150.5l-287 -35v13q0 65 -20 89q-22 27 -74 27q-72 0 -93.5 -36t-21.5 -117v-130q0 -20 16 -20h324v-205h-340v-637 q0 -25 7 -32t30 -9l250 -22v-162z" />
87
+<glyph unicode="g" horiz-adv-x="1165" d="M1139 893l-189 -14q76 -96 76 -207q0 -168 -120 -264.5t-316 -96.5q-96 0 -162 19l-68 -109l201 -12q299 -18 391 -51q150 -49 168 -199q4 -25 4 -55q0 -176 -147.5 -272.5t-415.5 -96.5q-512 0 -512 256q0 63 25.5 107.5t87.5 101.5q-90 39 -90 135q0 61 59 125 q47 49 127 123q-80 39 -128 119t-48 188q0 182 120 289.5t349 107.5q111 0 188 -20h400v-174zM756 700q0 90 -49.5 137.5t-137.5 47.5q-90 0 -143 -46t-53 -143q0 -170 190 -170q86 0 139.5 47t53.5 127zM643 -76l-299 21q-53 -66 -53 -109q0 -106 248 -106q281 0 280 118 q0 25 -11 39.5t-42 21.5t-52.5 10t-70.5 5z" />
88
+<glyph unicode="h" horiz-adv-x="1277" d="M1253 0h-444v668q0 174 -108.5 174t-213.5 -76v-549q0 -25 5.5 -32t27.5 -9l98 -14v-162h-565v162l92 14q20 2 26.5 10.5t6.5 30.5v1081q0 35 -26 43l-113 39l22 166h422v-579l11 -2q150 123 327 122q158 0 227.5 -82.5t69.5 -248.5v-539q0 -25 5 -32t28 -9l102 -14v-162 z" />
89
+<glyph unicode="i" horiz-adv-x="647" d="M492 1415q0 -88 -49.5 -136t-137.5 -48t-136 48t-48 136t48 134t136 46q90 0 138.5 -46t48.5 -134zM625 0h-584v162l104 14q20 2 26.5 10.5t6.5 30.5v602q0 35 -26 43l-111 39l22 166h424v-850q0 -25 5.5 -32t27.5 -9l105 -14v-162z" />
90
+<glyph unicode="j" horiz-adv-x="622" d="M174 -57v876q0 35 -27 43l-116 39l24 166h428v-1176q0 -348 -356 -348q-113 0 -206 34t-136 71l88 170q86 -53 178 -54q66 0 94.5 38.5t28.5 140.5zM489 1415q0 -88 -49 -136t-137 -48t-137 48t-49 136q0 86 49 133t137 47q90 0 138 -46t48 -134z" />
91
+<glyph unicode="k" horiz-adv-x="1269" d="M1255 0h-397l-260 522l-111 -121v-184q0 -25 5.5 -32t27.5 -9l123 -14v-162h-600v162l102 14q20 2 26.5 10.5t6.5 30.5v1081q0 35 -26 43l-113 39l22 166h426v-874l375 395h283v-162l-107 -20q-27 -4 -51 -31l-145 -154l262 -489q16 -31 61 -37l90 -14v-160z" />
92
+<glyph unicode="l" horiz-adv-x="647" d="M621 0h-578v162l102 14q20 2 26.5 10.5t6.5 30.5v1081q0 35 -26 43l-113 39l22 166h426v-1329q0 -25 5.5 -32t27.5 -9l101 -14v-162z" />
93
+<glyph unicode="m" horiz-adv-x="1820" d="M1794 0h-444v662q0 51 -5.5 83.5t-33 62.5t-76.5 30q-82 0 -166 -56q6 -49 6 -100v-465q0 -27 5 -34t28 -9l82 -12v-162h-424v672q0 35 -3 58.5t-12.5 51t-33 42t-60.5 14.5q-92 0 -170 -66v-555q0 -25 4.5 -31t28.5 -10l101 -14v-162h-568v162l92 14q20 2 26.5 10.5 t6.5 30.5v602q0 35 -26 43l-111 39l22 166h361l16 -106l11 -3q158 129 327 129q176 0 250 -122q156 123 330 122q162 0 231.5 -82.5t69.5 -263.5v-524q0 -25 5 -33t28 -10l102 -12v-162z" />
94
+<glyph unicode="n" horiz-adv-x="1277" d="M1253 0h-444v662q0 59 -5 91.5t-29.5 60.5t-74.5 28q-53 0 -114.5 -23.5t-98.5 -52.5v-549q0 -25 5.5 -32t27.5 -9l98 -14v-162h-565v164l92 12q20 2 26.5 10.5t6.5 30.5v602q0 35 -26 43l-111 39l25 166h358l16 -106l9 -5q176 131 360 131q164 0 236.5 -87t72.5 -261 v-522q0 -25 5 -32t28 -9l102 -14v-162z" />
95
+<glyph unicode="o" horiz-adv-x="1189" d="M582 -25q-268 0 -397.5 148.5t-129.5 402.5q0 262 139.5 411.5t413.5 149.5q270 0 398.5 -144t128.5 -394q0 -268 -139.5 -421t-413.5 -153zM596 190q215 0 215 349q0 176 -51 251.5t-156 75.5q-225 0 -225 -329q0 -347 217 -347z" />
96
+<glyph unicode="p" horiz-adv-x="1259" d="M719 -434h-668v164l82 12q23 4 30 12t7 31v1034q0 35 -27 43l-108 39l22 166h361l18 -104l10 -5q160 129 349 129q182 0 287.5 -125.5t105.5 -398.5q0 -80 -11.5 -155.5t-41 -156.5t-74.5 -140.5t-122 -97.5t-173 -38q-164 0 -293 105v-293q0 -25 5 -32t28 -9l213 -18 v-162zM477 770v-477q90 -78 193 -78q195 0 194 332q0 297 -174 297q-104 0 -213 -74z" />
97
+<glyph unicode="q" horiz-adv-x="1220" d="M1219 -434h-623v164l176 14q25 2 33 9t8 28v321l-10 4q-154 -131 -324 -131q-190 0 -298.5 130.5t-108.5 406.5q0 293 126 434t312 141q162 0 297 -116l31 96h268q-16 -154 -16 -332v-954q0 -23 5 -30t27 -9l97 -14v-162zM780 301v483q-96 66 -180 66q-104 0 -155.5 -89 t-51.5 -235q0 -309 193 -309q96 0 194 84z" />
98
+<glyph unicode="r" horiz-adv-x="968" d="M723 0h-670v166l92 12q20 2 26.5 10.5t6.5 30.5v600q0 35 -26 43l-111 39l22 166h361l25 -164h12q119 184 289 184q113 0 178 -18v-373l-246 9l-20 108q-4 23 -27 23q-66 0 -148 -72v-543q0 -25 5.5 -32t27.5 -9l203 -16v-164z" />
99
+<glyph unicode="s" horiz-adv-x="997" d="M911 731l-219 14l-20 107q-2 25 -21 29q-53 16 -131 16q-160 0 -160 -104q0 -37 32 -61.5t70 -36t107 -27.5q18 -4 29 -6q74 -16 124 -35t106.5 -54.5t85 -97t28.5 -147.5q0 -178 -127 -265.5t-336 -87.5q-127 0 -250 26t-155 48v297l219 -16l20 -117q2 -27 25 -31 q61 -20 158 -20q170 0 170 106q0 55 -47.5 82t-139.5 43l-77.5 14.5t-75 18.5t-77 27.5t-64.5 40t-56 57.5t-32.5 77t-14.5 101q0 178 130 268t323 90q225 0 376 -59v-297z" />
100
+<glyph unicode="t" horiz-adv-x="892" d="M791 238l55 -181q-168 -82 -334 -82q-180 0 -258 78t-78 252v537q0 20 -16 20h-144v182q135 14 196.5 90t78.5 244h194v-291q0 -20 17 -20h289v-205h-306v-489q0 -94 29 -131t111 -37q78 0 166 33z" />
101
+<glyph unicode="u" horiz-adv-x="1275" d="M1241 0h-381l-16 111l-10 2q-53 -41 -94.5 -65.5t-115 -48.5t-155.5 -24q-158 0 -227.5 89.5t-69.5 271.5v500q0 25 -5 31.5t-28 11.5l-98 20l20 168h420v-678q0 -96 22.5 -134t86.5 -38q109 0 211 94v527q0 25 -5 30.5t-28 10.5l-88 20l22 168h408v-850q0 -23 5 -30 t24 -9l102 -14v-164z" />
102
+<glyph unicode="v" horiz-adv-x="1275" d="M819 0h-358l-326 848q-10 27 -43 35l-86 18l33 166h555v-166l-131 -16l209 -584h14l217 584l-133 16l27 166h473v-166l-74 -12q-41 -10 -51 -35z" />
103
+<glyph unicode="w" horiz-adv-x="1800" d="M1419 0h-323l-160 686h-12l-162 -686h-369l-258 848q-8 27 -43 35l-86 18l33 166h518v-170l-115 -12l164 -576h15l182 731h309l176 -731h12l154 576l-117 12l27 170h430v-166l-74 -14q-39 -6 -49 -41z" />
104
+<glyph unicode="x" horiz-adv-x="1234" d="M1214 0h-581v160l96 18l-156 205l-170 -203l115 -18v-162h-491v160l92 18q27 4 53 35l270 299l-278 332q-25 27 -49 35l-82 22l20 166h545v-166l-100 -16l151 -191l168 191l-112 16l20 166h453v-166l-95 -20q-12 -4 -51 -39l-250 -277l287 -350q33 -33 53 -37l92 -16 v-162z" />
105
+<glyph unicode="y" horiz-adv-x="1267" d="M907 -434h-682v166l160 18q33 2 51 45l88 195l-391 856q-8 27 -43 35l-84 20l33 166h543v-166l-129 -16l227 -541h14l217 541l-133 16l27 166h457v-166l-66 -12q-39 -6 -51 -35l-451 -1102l213 -22v-164z" />
106
+<glyph unicode="z" horiz-adv-x="1058" d="M1001 0h-929v172l549 702h-287q-18 0 -23 -26l-24 -115l-217 -12v346h899v-176l-539 -701h301q18 0 23 27l24 141l223 11v-369z" />
107
+<glyph unicode="{" horiz-adv-x="677" d="M610 -141l-20 -164q-246 4 -343 64.5t-97 220.5q0 53 14 177t14 201q0 84 -33.5 116t-109.5 36v162q76 4 109.5 35.5t33.5 115.5q0 78 -14 203t-14 178q0 160 97 220.5t343 64.5l20 -164q-86 -20 -115.5 -47t-29.5 -100q0 -51 16.5 -170t16.5 -185q0 -178 -129 -233 q129 -55 129 -232q0 -63 -16.5 -182t-16.5 -170q0 -74 29.5 -100.5t115.5 -46.5z" />
108
+<glyph unicode="|" horiz-adv-x="573" d="M426 -293h-281v1839h281v-1839z" />
109
+<glyph unicode="}" horiz-adv-x="677" d="M88 -305l-20 164q86 20 115.5 46.5t29.5 100.5q0 51 -16.5 170t-16.5 182q0 176 129 232q-129 55 -129 233q0 66 16.5 184.5t16.5 170.5q0 74 -29.5 100.5t-115.5 46.5l20 164q246 -4 343 -64.5t97 -220.5q0 -53 -14 -178t-14 -203q0 -84 33.5 -115.5t109.5 -35.5v-162 q-76 -4 -109.5 -36t-33.5 -116q0 -78 14 -201.5t14 -176.5q0 -160 -97 -220.5t-343 -64.5z" />
110
+<glyph unicode="~" horiz-adv-x="1073" d="M868 942l160 -59q-25 -147 -80 -218t-151 -71q-78 0 -237 47t-216 47q-51 0 -83 -20.5t-62 -77.5l-152 74q33 121 101.5 196.5t162.5 75.5q82 0 231.5 -47t213.5 -47q47 0 69.5 21.5t42.5 78.5z" />
111
+<glyph unicode="&#xad;" horiz-adv-x="636" d="M596 465h-555v260h555v-260z" />
112
+<glyph unicode="&#x2000;" horiz-adv-x="802" />
113
+<glyph unicode="&#x2001;" horiz-adv-x="1607" />
114
+<glyph unicode="&#x2002;" horiz-adv-x="802" />
115
+<glyph unicode="&#x2003;" horiz-adv-x="1607" />
116
+<glyph unicode="&#x2004;" horiz-adv-x="534" />
117
+<glyph unicode="&#x2005;" horiz-adv-x="401" />
118
+<glyph unicode="&#x2006;" horiz-adv-x="266" />
119
+<glyph unicode="&#x2007;" horiz-adv-x="266" />
120
+<glyph unicode="&#x2008;" horiz-adv-x="200" />
121
+<glyph unicode="&#x2009;" horiz-adv-x="321" />
122
+<glyph unicode="&#x200a;" horiz-adv-x="88" />
123
+<glyph unicode="&#x2010;" horiz-adv-x="636" d="M596 465h-555v260h555v-260z" />
124
+<glyph unicode="&#x2011;" horiz-adv-x="636" d="M596 465h-555v260h555v-260z" />
125
+<glyph unicode="&#x2012;" horiz-adv-x="636" d="M596 465h-555v260h555v-260z" />
126
+<glyph unicode="&#x2013;" horiz-adv-x="1024" d="M1022 465h-1022v219h1022v-219z" />
127
+<glyph unicode="&#x2014;" horiz-adv-x="2048" d="M2048 465h-2048v219h2048v-219z" />
128
+<glyph unicode="&#x2018;" horiz-adv-x="460" d="M389 1296l-41 -196q-86 2 -137 10t-90 43t-39 96q0 53 39 131l98 207l129 -39l-47 -202q-2 -16 10 -23z" />
129
+<glyph unicode="&#x2019;" horiz-adv-x="460" d="M244 1100l-131 39l47 202q6 18 -10 25l-78 25l41 196q63 0 104 -5t82 -19.5t60.5 -46t19.5 -78.5q0 -57 -37 -131z" />
130
+<glyph unicode="&#x201c;" horiz-adv-x="829" d="M389 1296l-41 -196q-86 2 -137 10t-90 43t-39 96q0 53 39 131l98 207l129 -39l-47 -202q-2 -16 10 -23zM758 1296l-41 -196q-86 2 -137.5 10t-90 43t-38.5 96q0 53 38 131l99 207l129 -39l-47 -202q-2 -16 10 -23z" />
131
+<glyph unicode="&#x201d;" horiz-adv-x="829" d="M244 1100l-131 39l47 202q6 18 -10 25l-78 25l41 196q63 0 104 -5t82 -19.5t60.5 -46t19.5 -78.5q0 -57 -37 -131zM612 1100l-131 39l47 202q6 18 -10 25l-78 25l41 196q63 0 104.5 -5t82.5 -19.5t60.5 -46t19.5 -78.5q0 -57 -37 -131z" />
132
+<glyph unicode="&#x2026;" horiz-adv-x="1443" d="M432 135q0 -160 -174 -160q-176 0 -176 160t176 160q174 0 174 -160zM899 135q0 -160 -174 -160q-176 0 -176 160t176 160q174 0 174 -160zM1362 135q0 -160 -174 -160q-176 0 -176 160t176 160q174 0 174 -160z" />
133
+<glyph unicode="&#x202f;" horiz-adv-x="321" />
134
+<glyph unicode="&#x205f;" horiz-adv-x="401" />
135
+<glyph unicode="&#xe000;" horiz-adv-x="1065" d="M0 1065h1065v-1065h-1065v1065z" />
136
+<glyph horiz-adv-x="1024" />
137
+</font>
138
+</defs></svg> 
0 139
\ No newline at end of file
1 140
new file mode 100755
2 141
Binary files /dev/null and b/source/fonts/adellebasic_bold-webfont.ttf differ
3 142
new file mode 100755
4 143
Binary files /dev/null and b/source/fonts/adellebasic_bold-webfont.woff differ
5 144
deleted file mode 100644
... ...
@@ -1,22 +0,0 @@
1
-layout: default
2
-title: Blog
3
-author: 
4
-disqus: 
5
-.blog
6
-  - site.posts.sort_by(&:date).reverse[0..9].each_with_index do |post,index|
7
-    .article
8
-      %h2= link_to(post.title, post.url, {:class=>"title"})
9
-      .meta
10
-        - author = (page.respond_to?(:author) && page.author) ? 'by: ' + page.author + ' |' : ''
11
-        #{author} posted: #{post.date.strftime("%B #{post.date.day.ordinalize}, %Y")}
12
-        = (page.respond_to?(:updated) && page.updated) ? " | updated: #{page.updated}" : ''
13
-      = preserve rp(post.content)
14
-      - if page.respond_to?(:disqus) && page.disqus
15
-        - if post.data["comments_off"]
16
-          %em.comments_off Comments disabled
17
-        - else
18
-          %a(href="#{post.url}/#disqus_thread")Comments
19
-  .footer
20
-    %a(href="/archives.html" title="archives") &laquo; Blog Archives
21 1
new file mode 100644
... ...
@@ -0,0 +1,12 @@
0
+---
1
+layout: default
2
+title: Octopress
3
+---
4
+{% for page in site.posts limit:3 %}
5
+{% assign content = page.content %}
6
+{% assign index = true %}
7
+  <article>
8
+    {% include article.html %}
9
+  </article>
10
+{% endfor %}
11
+
0 12
new file mode 100644
... ...
@@ -0,0 +1,1322 @@
0
+// MooTools: the javascript framework.
1
+// Load this file's selection again by visiting: http://mootools.net/more/0a2b8625655481363709ef8d9ab1d0f4
2
+// Or build this file again with packager using: packager build More/Date More/Date.Extras More/Hash More/Request.JSONP
3
+/*
4
+---
5
+
6
+script: More.js
7
+
8
+name: More
9
+
10
+description: MooTools More
11
+
12
+license: MIT-style license
13
+
14
+authors:
15
+  - Guillermo Rauch
16
+  - Thomas Aylott
17
+  - Scott Kyle
18
+  - Arian Stolwijk
19
+  - Tim Wienk
20
+  - Christoph Pojer
21
+  - Aaron Newton
22
+
23
+requires:
24
+  - Core/MooTools
25
+
26
+provides: [MooTools.More]
27
+
28
+...
29
+*/
30
+
31
+MooTools.More = {
32
+	'version': '1.3.1.1',
33
+	'build': '0292a3af1eea242b817fecf9daa127417d10d4ce'
34
+};
35
+
36
+
37
+/*
38
+---
39
+
40
+script: Object.Extras.js
41
+
42
+name: Object.Extras
43
+
44
+description: Extra Object generics, like getFromPath which allows a path notation to child elements.
45
+
46
+license: MIT-style license
47
+
48
+authors:
49
+  - Aaron Newton
50
+
51
+requires:
52
+  - Core/Object
53
+  - /MooTools.More
54
+
55
+provides: [Object.Extras]
56
+
57
+...
58
+*/
59
+
60
+(function(){
61
+
62
+var defined = function(value){
63
+	return value != null;
64
+};
65
+
66
+var hasOwnProperty = Object.prototype.hasOwnProperty;
67
+
68
+Object.extend({
69
+
70
+	getFromPath: function(source, parts){
71
+		if (typeof parts == 'string') parts = parts.split('.');
72
+		for (var i = 0, l = parts.length; i < l; i++){
73
+			if (hasOwnProperty.call(source, parts[i])) source = source[parts[i]];
74
+			else return null;
75
+		}
76
+		return source;
77
+	},
78
+
79
+	cleanValues: function(object, method){
80
+		method = method || defined;
81
+		for (var key in object) if (!method(object[key])){
82
+			delete object[key];
83
+		}
84
+		return object;
85
+	},
86
+
87
+	erase: function(object, key){
88
+		if (hasOwnProperty.call(object, key)) delete object[key];
89
+		return object;
90
+	},
91
+
92
+	run: function(object){
93
+		var args = Array.slice(arguments, 1);
94
+		for (var key in object) if (object[key].apply){
95
+			object[key].apply(object, args);
96
+		}
97
+		return object;
98
+	}
99
+
100
+});
101
+
102
+}).call(this);
103
+
104
+
105
+/*
106
+---
107
+
108
+script: Locale.js
109
+
110
+name: Locale
111
+
112
+description: Provides methods for localization.
113
+
114
+license: MIT-style license
115
+
116
+authors:
117
+  - Aaron Newton
118
+  - Arian Stolwijk
119
+
120
+requires:
121
+  - Core/Events
122
+  - /Object.Extras
123
+  - /MooTools.More
124
+
125
+provides: [Locale, Lang]
126
+
127
+...
128
+*/
129
+
130
+(function(){
131
+
132
+var current = null,
133
+	locales = {},
134
+	inherits = {};
135
+
136
+var getSet = function(set){
137
+	if (instanceOf(set, Locale.Set)) return set;
138
+	else return locales[set];
139
+};
140
+
141
+var Locale = this.Locale = {
142
+
143
+	define: function(locale, set, key, value){
144
+		var name;
145
+		if (instanceOf(locale, Locale.Set)){
146
+			name = locale.name;
147
+			if (name) locales[name] = locale;
148
+		} else {
149
+			name = locale;
150
+			if (!locales[name]) locales[name] = new Locale.Set(name);
151
+			locale = locales[name];
152
+		}
153
+
154
+		if (set) locale.define(set, key, value);
155
+
156
+
157
+
158
+		if (!current) current = locale;
159
+
160
+		return locale;
161
+	},
162
+
163
+	use: function(locale){
164
+		locale = getSet(locale);
165
+
166
+		if (locale){
167
+			current = locale;
168
+
169
+			this.fireEvent('change', locale);
170
+
171
+
172
+		}
173
+
174
+		return this;
175
+	},
176
+
177
+	getCurrent: function(){
178
+		return current;
179
+	},
180
+
181
+	get: function(key, args){
182
+		return (current) ? current.get(key, args) : '';
183
+	},
184
+
185
+	inherit: function(locale, inherits, set){
186
+		locale = getSet(locale);
187
+
188
+		if (locale) locale.inherit(inherits, set);
189
+		return this;
190
+	},
191
+
192
+	list: function(){
193
+		return Object.keys(locales);
194
+	}
195
+
196
+};
197
+
198
+Object.append(Locale, new Events);
199
+
200
+Locale.Set = new Class({
201
+
202
+	sets: {},
203
+
204
+	inherits: {
205
+		locales: [],
206
+		sets: {}
207
+	},
208
+
209
+	initialize: function(name){
210
+		this.name = name || '';
211
+	},
212
+
213
+	define: function(set, key, value){
214
+		var defineData = this.sets[set];
215
+		if (!defineData) defineData = {};
216
+
217
+		if (key){
218
+			if (typeOf(key) == 'object') defineData = Object.merge(defineData, key);
219
+			else defineData[key] = value;
220
+		}
221
+		this.sets[set] = defineData;
222
+
223
+		return this;
224
+	},
225
+
226
+	get: function(key, args, _base){
227
+		var value = Object.getFromPath(this.sets, key);
228
+		if (value != null){
229
+			var type = typeOf(value);
230
+			if (type == 'function') value = value.apply(null, Array.from(args));
231
+			else if (type == 'object') value = Object.clone(value);
232
+			return value;
233
+		}
234
+
235
+		// get value of inherited locales
236
+		var index = key.indexOf('.'),
237
+			set = index < 0 ? key : key.substr(0, index),
238
+			names = (this.inherits.sets[set] || []).combine(this.inherits.locales).include('en-US');
239
+		if (!_base) _base = [];
240
+
241
+		for (var i = 0, l = names.length; i < l; i++){
242
+			if (_base.contains(names[i])) continue;
243
+			_base.include(names[i]);
244
+
245
+			var locale = locales[names[i]];
246
+			if (!locale) continue;
247
+
248
+			value = locale.get(key, args, _base);
249
+			if (value != null) return value;
250
+		}
251
+
252
+		return '';
253
+	},
254
+
255
+	inherit: function(names, set){
256
+		names = Array.from(names);
257
+
258
+		if (set && !this.inherits.sets[set]) this.inherits.sets[set] = [];
259
+
260
+		var l = names.length;
261
+		while (l--) (set ? this.inherits.sets[set] : this.inherits.locales).unshift(names[l]);
262
+
263
+		return this;
264
+	}
265
+
266
+});
267
+
268
+
269
+
270
+}).call(this);
271
+
272
+
273
+/*
274
+---
275
+
276
+name: Locale.en-US.Date
277
+
278
+description: Date messages for US English.
279
+
280
+license: MIT-style license
281
+
282
+authors:
283
+  - Aaron Newton
284
+
285
+requires:
286
+  - /Locale
287
+
288
+provides: [Locale.en-US.Date]
289
+
290
+...
291
+*/
292
+
293
+Locale.define('en-US', 'Date', {
294
+
295
+	months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
296
+	months_abbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
297
+	days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
298
+	days_abbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
299
+
300
+	// Culture's date order: MM/DD/YYYY
301
+	dateOrder: ['month', 'date', 'year'],
302
+	shortDate: '%m/%d/%Y',
303
+	shortTime: '%I:%M%p',
304
+	AM: 'AM',
305
+	PM: 'PM',
306
+	firstDayOfWeek: 0,
307
+
308
+	// Date.Extras
309
+	ordinal: function(dayOfMonth){
310
+		// 1st, 2nd, 3rd, etc.
311
+		return (dayOfMonth > 3 && dayOfMonth < 21) ? 'th' : ['th', 'st', 'nd', 'rd', 'th'][Math.min(dayOfMonth % 10, 4)];
312
+	},
313
+
314
+	lessThanMinuteAgo: 'less than a minute ago',
315
+	minuteAgo: 'about a minute ago',
316
+	minutesAgo: '{delta} minutes ago',
317
+	hourAgo: 'about an hour ago',
318
+	hoursAgo: 'about {delta} hours ago',
319
+	dayAgo: '1 day ago',
320
+	daysAgo: '{delta} days ago',
321
+	weekAgo: '1 week ago',
322
+	weeksAgo: '{delta} weeks ago',
323
+	monthAgo: '1 month ago',
324
+	monthsAgo: '{delta} months ago',
325
+	yearAgo: '1 year ago',
326
+	yearsAgo: '{delta} years ago',
327
+
328
+	lessThanMinuteUntil: 'less than a minute from now',
329
+	minuteUntil: 'about a minute from now',
330
+	minutesUntil: '{delta} minutes from now',
331
+	hourUntil: 'about an hour from now',
332
+	hoursUntil: 'about {delta} hours from now',
333
+	dayUntil: '1 day from now',
334
+	daysUntil: '{delta} days from now',
335
+	weekUntil: '1 week from now',
336
+	weeksUntil: '{delta} weeks from now',
337
+	monthUntil: '1 month from now',
338
+	monthsUntil: '{delta} months from now',
339
+	yearUntil: '1 year from now',
340
+	yearsUntil: '{delta} years from now'
341
+
342
+});
343
+
344
+
345
+/*
346
+---
347
+
348
+script: Date.js
349
+
350
+name: Date
351
+
352
+description: Extends the Date native object to include methods useful in managing dates.
353
+
354
+license: MIT-style license
355
+
356
+authors:
357
+  - Aaron Newton
358
+  - Nicholas Barthelemy - https://svn.nbarthelemy.com/date-js/
359
+  - Harald Kirshner - mail [at] digitarald.de; http://digitarald.de
360
+  - Scott Kyle - scott [at] appden.com; http://appden.com
361
+
362
+requires:
363
+  - Core/Array
364
+  - Core/String
365
+  - Core/Number
366
+  - MooTools.More
367
+  - Locale
368
+  - Locale.en-US.Date
369
+
370
+provides: [Date]
371
+
372
+...
373
+*/
374
+
375
+(function(){
376
+
377
+var Date = this.Date;
378
+
379
+var DateMethods = Date.Methods = {
380
+	ms: 'Milliseconds',
381
+	year: 'FullYear',
382
+	min: 'Minutes',
383
+	mo: 'Month',
384
+	sec: 'Seconds',
385
+	hr: 'Hours'
386
+};
387
+
388
+['Date', 'Day', 'FullYear', 'Hours', 'Milliseconds', 'Minutes', 'Month', 'Seconds', 'Time', 'TimezoneOffset',
389
+	'Week', 'Timezone', 'GMTOffset', 'DayOfYear', 'LastMonth', 'LastDayOfMonth', 'UTCDate', 'UTCDay', 'UTCFullYear',
390
+	'AMPM', 'Ordinal', 'UTCHours', 'UTCMilliseconds', 'UTCMinutes', 'UTCMonth', 'UTCSeconds', 'UTCMilliseconds'].each(function(method){
391
+	Date.Methods[method.toLowerCase()] = method;
392
+});
393
+
394
+var pad = function(n, digits, string){
395
+	if (digits == 1) return n;
396
+	return n < Math.pow(10, digits - 1) ? (string || '0') + pad(n, digits - 1, string) : n;
397
+};
398
+
399
+Date.implement({
400
+
401
+	set: function(prop, value){
402
+		prop = prop.toLowerCase();
403
+		var method = DateMethods[prop] && 'set' + DateMethods[prop];
404
+		if (method && this[method]) this[method](value);
405
+		return this;
406
+	}.overloadSetter(),
407
+
408
+	get: function(prop){
409
+		prop = prop.toLowerCase();
410
+		var method = DateMethods[prop] && 'get' + DateMethods[prop];
411
+		if (method && this[method]) return this[method]();
412
+		return null;
413
+	}.overloadGetter(),
414
+
415
+	clone: function(){
416
+		return new Date(this.get('time'));
417
+	},
418
+
419
+	increment: function(interval, times){
420
+		interval = interval || 'day';
421
+		times = times != null ? times : 1;
422
+
423
+		switch (interval){
424
+			case 'year':
425
+				return this.increment('month', times * 12);
426
+			case 'month':
427
+				var d = this.get('date');
428
+				this.set('date', 1).set('mo', this.get('mo') + times);
429
+				return this.set('date', d.min(this.get('lastdayofmonth')));
430
+			case 'week':
431
+				return this.increment('day', times * 7);
432
+			case 'day':
433
+				return this.set('date', this.get('date') + times);
434
+		}
435
+
436
+		if (!Date.units[interval]) throw new Error(interval + ' is not a supported interval');
437
+
438
+		return this.set('time', this.get('time') + times * Date.units[interval]());
439
+	},
440
+
441
+	decrement: function(interval, times){
442
+		return this.increment(interval, -1 * (times != null ? times : 1));
443
+	},
444
+
445
+	isLeapYear: function(){
446
+		return Date.isLeapYear(this.get('year'));
447
+	},
448
+
449
+	clearTime: function(){
450
+		return this.set({hr: 0, min: 0, sec: 0, ms: 0});
451
+	},
452
+
453
+	diff: function(date, resolution){
454
+		if (typeOf(date) == 'string') date = Date.parse(date);
455
+
456
+		return ((date - this) / Date.units[resolution || 'day'](3, 3)).round(); // non-leap year, 30-day month
457
+	},
458
+
459
+	getLastDayOfMonth: function(){
460
+		return Date.daysInMonth(this.get('mo'), this.get('year'));
461
+	},
462
+
463
+	getDayOfYear: function(){
464
+		return (Date.UTC(this.get('year'), this.get('mo'), this.get('date') + 1)
465
+			- Date.UTC(this.get('year'), 0, 1)) / Date.units.day();
466
+	},
467
+
468
+	setDay: function(day, firstDayOfWeek){
469
+		if (firstDayOfWeek == null){
470
+			firstDayOfWeek = Date.getMsg('firstDayOfWeek');
471
+			if (firstDayOfWeek === '') firstDayOfWeek = 1;
472
+		}
473
+
474
+		day = (7 + Date.parseDay(day, true) - firstDayOfWeek) % 7;
475
+		var currentDay = (7 + this.get('day') - firstDayOfWeek) % 7;
476
+
477
+		return this.increment('day', day - currentDay);
478
+	},
479
+
480
+	getWeek: function(firstDayOfWeek){
481
+		if (firstDayOfWeek == null){
482
+			firstDayOfWeek = Date.getMsg('firstDayOfWeek');
483
+			if (firstDayOfWeek === '') firstDayOfWeek = 1;
484
+		}
485
+
486
+		var date = this,
487
+			dayOfWeek = (7 + date.get('day') - firstDayOfWeek) % 7,
488
+			dividend = 0,
489
+			firstDayOfYear;
490
+
491
+		if (firstDayOfWeek == 1){
492
+			// ISO-8601, week belongs to year that has the most days of the week (i.e. has the thursday of the week)
493
+			var month = date.get('month'),
494
+				startOfWeek = date.get('date') - dayOfWeek;
495
+
496
+			if (month == 11 && startOfWeek > 28) return 1; // Week 1 of next year
497
+
498
+			if (month == 0 && startOfWeek < -2){
499
+				// Use a date from last year to determine the week
500
+				date = new Date(date).decrement('day', dayOfWeek);
501
+				dayOfWeek = 0;
502
+			}
503
+
504
+			firstDayOfYear = new Date(date.get('year'), 0, 1).get('day') || 7;
505
+			if (firstDayOfYear > 4) dividend = -7; // First week of the year is not week 1
506
+		} else {
507
+			// In other cultures the first week of the year is always week 1 and the last week always 53 or 54.
508
+			// Days in the same week can have a different weeknumber if the week spreads across two years.
509
+			firstDayOfYear = new Date(date.get('year'), 0, 1).get('day');
510
+		}
511
+
512
+		dividend += date.get('dayofyear');
513
+		dividend += 6 - dayOfWeek; // Add days so we calculate the current date's week as a full week
514
+		dividend += (7 + firstDayOfYear - firstDayOfWeek) % 7; // Make up for first week of the year not being a full week
515
+
516
+		return (dividend / 7);
517
+	},
518
+
519
+	getOrdinal: function(day){
520
+		return Date.getMsg('ordinal', day || this.get('date'));
521
+	},
522
+
523
+	getTimezone: function(){
524
+		return this.toString()
525
+			.replace(/^.*? ([A-Z]{3}).[0-9]{4}.*$/, '$1')
526
+			.replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, '$1$2$3');
527
+	},
528
+
529
+	getGMTOffset: function(){
530
+		var off = this.get('timezoneOffset');
531
+		return ((off > 0) ? '-' : '+') + pad((off.abs() / 60).floor(), 2) + pad(off % 60, 2);
532
+	},
533
+
534
+	setAMPM: function(ampm){
535
+		ampm = ampm.toUpperCase();
536
+		var hr = this.get('hr');
537
+		if (hr > 11 && ampm == 'AM') return this.decrement('hour', 12);
538
+		else if (hr < 12 && ampm == 'PM') return this.increment('hour', 12);
539
+		return this;
540
+	},
541
+
542
+	getAMPM: function(){
543
+		return (this.get('hr') < 12) ? 'AM' : 'PM';
544
+	},
545
+
546
+	parse: function(str){
547
+		this.set('time', Date.parse(str));
548
+		return this;
549
+	},
550
+
551
+	isValid: function(date){
552
+		return !isNaN((date || this).valueOf());
553
+	},
554
+
555
+	format: function(f){
556
+		if (!this.isValid()) return 'invalid date';
557
+		if (!f) f = '%x %X';
558
+
559
+		var formatLower = f.toLowerCase();
560
+		if (formatters[formatLower]) return formatters[formatLower](this); // it's a formatter!
561
+		f = formats[formatLower] || f; // replace short-hand with actual format
562
+
563
+		var d = this;
564
+		return f.replace(/%([a-z%])/gi,
565
+			function($0, $1){
566
+				switch ($1){
567
+					case 'a': return Date.getMsg('days_abbr')[d.get('day')];
568
+					case 'A': return Date.getMsg('days')[d.get('day')];
569
+					case 'b': return Date.getMsg('months_abbr')[d.get('month')];
570
+					case 'B': return Date.getMsg('months')[d.get('month')];
571
+					case 'c': return d.format('%a %b %d %H:%M:%S %Y');
572
+					case 'd': return pad(d.get('date'), 2);
573
+					case 'e': return pad(d.get('date'), 2, ' ');
574
+					case 'H': return pad(d.get('hr'), 2);
575
+					case 'I': return pad((d.get('hr') % 12) || 12, 2);
576
+					case 'j': return pad(d.get('dayofyear'), 3);
577
+					case 'k': return pad(d.get('hr'), 2, ' ');
578
+					case 'l': return pad((d.get('hr') % 12) || 12, 2, ' ');
579
+					case 'L': return pad(d.get('ms'), 3);
580
+					case 'm': return pad((d.get('mo') + 1), 2);
581
+					case 'M': return pad(d.get('min'), 2);
582
+					case 'o': return d.get('ordinal');
583
+					case 'p': return Date.getMsg(d.get('ampm'));
584
+					case 's': return Math.round(d / 1000);
585
+					case 'S': return pad(d.get('seconds'), 2);
586
+					case 'T': return d.format('%H:%M:%S');
587
+					case 'U': return pad(d.get('week'), 2);
588
+					case 'w': return d.get('day');
589
+					case 'x': return d.format(Date.getMsg('shortDate'));
590
+					case 'X': return d.format(Date.getMsg('shortTime'));
591
+					case 'y': return d.get('year').toString().substr(2);
592
+					case 'Y': return d.get('year');
593
+					case 'z': return d.get('GMTOffset');
594
+					case 'Z': return d.get('Timezone');
595
+				}
596
+				return $1;
597
+			}
598
+		);
599
+	},
600
+
601
+	toISOString: function(){
602
+		return this.format('iso8601');
603
+	}
604
+
605
+}).alias({
606
+	toJSON: 'toISOString',
607
+	compare: 'diff',
608
+	strftime: 'format'
609
+});
610
+
611
+var formats = {
612
+	db: '%Y-%m-%d %H:%M:%S',
613
+	compact: '%Y%m%dT%H%M%S',
614
+	'short': '%d %b %H:%M',
615
+	'long': '%B %d, %Y %H:%M'
616
+};
617
+
618
+// The day and month abbreviations are standardized, so we cannot use simply %a and %b because they will get localized
619
+var rfcDayAbbr = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
620
+	rfcMonthAbbr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
621
+
622
+var formatters = {
623
+	rfc822: function(date){
624
+		return rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %Z');
625
+	},
626
+	rfc2822: function(date){
627
+		return rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %z');
628
+	},
629
+	iso8601: function(date){
630
+		return (
631
+			date.getUTCFullYear() + '-' +
632
+			pad(date.getUTCMonth() + 1, 2) + '-' +
633
+			pad(date.getUTCDate(), 2) + 'T' +
634
+			pad(date.getUTCHours(), 2) + ':' +
635
+			pad(date.getUTCMinutes(), 2) + ':' +
636
+			pad(date.getUTCSeconds(), 2) + '.' +
637
+			pad(date.getUTCMilliseconds(), 3) + 'Z'
638
+		);
639
+	}
640
+};
641
+
642
+
643
+var parsePatterns = [],
644
+	nativeParse = Date.parse;
645
+
646
+var parseWord = function(type, word, num){
647
+	var ret = -1,
648
+		translated = Date.getMsg(type + 's');
649
+	switch (typeOf(word)){
650
+		case 'object':
651
+			ret = translated[word.get(type)];
652
+			break;
653
+		case 'number':
654
+			ret = translated[word];
655
+			if (!ret) throw new Error('Invalid ' + type + ' index: ' + word);
656
+			break;
657
+		case 'string':
658
+			var match = translated.filter(function(name){
659
+				return this.test(name);
660
+			}, new RegExp('^' + word, 'i'));
661
+			if (!match.length) throw new Error('Invalid ' + type + ' string');
662
+			if (match.length > 1) throw new Error('Ambiguous ' + type);
663
+			ret = match[0];
664
+	}
665
+
666
+	return (num) ? translated.indexOf(ret) : ret;
667
+};
668
+
669
+var startCentury = 1900,
670
+	startYear = 70;
671
+
672
+Date.extend({
673
+
674
+	getMsg: function(key, args){
675
+		return Locale.get('Date.' + key, args);
676
+	},
677
+
678
+	units: {
679
+		ms: Function.from(1),
680
+		second: Function.from(1000),
681
+		minute: Function.from(60000),
682
+		hour: Function.from(3600000),
683
+		day: Function.from(86400000),
684
+		week: Function.from(608400000),
685
+		month: function(month, year){
686
+			var d = new Date;
687
+			return Date.daysInMonth(month != null ? month : d.get('mo'), year != null ? year : d.get('year')) * 86400000;
688
+		},
689
+		year: function(year){
690
+			year = year || new Date().get('year');
691
+			return Date.isLeapYear(year) ? 31622400000 : 31536000000;
692
+		}
693
+	},
694
+
695
+	daysInMonth: function(month, year){
696
+		return [31, Date.isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
697
+	},
698
+
699
+	isLeapYear: function(year){
700
+		return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);
701
+	},
702
+
703
+	parse: function(from){
704
+		var t = typeOf(from);
705
+		if (t == 'number') return new Date(from);
706
+		if (t != 'string') return from;
707
+		from = from.clean();
708
+		if (!from.length) return null;
709
+
710
+		var parsed;
711
+		parsePatterns.some(function(pattern){
712
+			var bits = pattern.re.exec(from);
713
+			return (bits) ? (parsed = pattern.handler(bits)) : false;
714
+		});
715
+
716
+		if (!(parsed && parsed.isValid())){
717
+			parsed = new Date(nativeParse(from));
718
+			if (!(parsed && parsed.isValid())) parsed = new Date(from.toInt());
719
+		}
720
+		return parsed;
721
+	},
722
+
723
+	parseDay: function(day, num){
724
+		return parseWord('day', day, num);
725
+	},
726
+
727
+	parseMonth: function(month, num){
728
+		return parseWord('month', month, num);
729
+	},
730
+
731
+	parseUTC: function(value){
732
+		var localDate = new Date(value);
733
+		var utcSeconds = Date.UTC(
734
+			localDate.get('year'),
735
+			localDate.get('mo'),
736
+			localDate.get('date'),
737
+			localDate.get('hr'),
738
+			localDate.get('min'),
739
+			localDate.get('sec'),
740
+			localDate.get('ms')
741
+		);
742
+		return new Date(utcSeconds);
743
+	},
744
+
745
+	orderIndex: function(unit){
746
+		return Date.getMsg('dateOrder').indexOf(unit) + 1;
747
+	},
748
+
749
+	defineFormat: function(name, format){
750
+		formats[name] = format;
751
+		return this;
752
+	},
753
+
754
+	defineFormats: function(formats){
755
+		for (var name in formats) Date.defineFormat(name, formats[name]);
756
+		return this;
757
+	},
758
+
759
+
760
+
761
+	defineParser: function(pattern){
762
+		parsePatterns.push((pattern.re && pattern.handler) ? pattern : build(pattern));
763
+		return this;
764
+	},
765
+
766
+	defineParsers: function(){
767
+		Array.flatten(arguments).each(Date.defineParser);
768
+		return this;
769
+	},
770
+
771
+	define2DigitYearStart: function(year){
772
+		startYear = year % 100;
773
+		startCentury = year - startYear;
774
+		return this;
775
+	}
776
+
777
+});
778
+
779
+var regexOf = function(type){
780
+	return new RegExp('(?:' + Date.getMsg(type).map(function(name){
781
+		return name.substr(0, 3);
782
+	}).join('|') + ')[a-z]*');
783
+};
784
+
785
+var replacers = function(key){
786
+	switch (key){
787
+		case 'T':
788
+			return '%H:%M:%S';
789
+		case 'x': // iso8601 covers yyyy-mm-dd, so just check if month is first
790
+			return ((Date.orderIndex('month') == 1) ? '%m[-./]%d' : '%d[-./]%m') + '([-./]%y)?';
791
+		case 'X':
792
+			return '%H([.:]%M)?([.:]%S([.:]%s)?)? ?%p? ?%z?';
793
+	}
794
+	return null;
795
+};
796
+
797
+var keys = {
798
+	d: /[0-2]?[0-9]|3[01]/,
799
+	H: /[01]?[0-9]|2[0-3]/,
800
+	I: /0?[1-9]|1[0-2]/,
801
+	M: /[0-5]?\d/,
802
+	s: /\d+/,
803
+	o: /[a-z]*/,
804
+	p: /[ap]\.?m\.?/,
805
+	y: /\d{2}|\d{4}/,
806
+	Y: /\d{4}/,
807
+	z: /Z|[+-]\d{2}(?::?\d{2})?/
808
+};
809
+
810
+keys.m = keys.I;
811
+keys.S = keys.M;
812
+
813
+var currentLanguage;
814
+
815
+var recompile = function(language){
816
+	currentLanguage = language;
817
+
818
+	keys.a = keys.A = regexOf('days');
819
+	keys.b = keys.B = regexOf('months');
820
+
821
+	parsePatterns.each(function(pattern, i){
822
+		if (pattern.format) parsePatterns[i] = build(pattern.format);
823
+	});
824
+};
825
+
826
+var build = function(format){
827
+	if (!currentLanguage) return {format: format};
828
+
829
+	var parsed = [];
830
+	var re = (format.source || format) // allow format to be regex
831
+	 .replace(/%([a-z])/gi,
832
+		function($0, $1){
833
+			return replacers($1) || $0;
834
+		}
835
+	).replace(/\((?!\?)/g, '(?:') // make all groups non-capturing
836
+	 .replace(/ (?!\?|\*)/g, ',? ') // be forgiving with spaces and commas
837
+	 .replace(/%([a-z%])/gi,
838
+		function($0, $1){
839
+			var p = keys[$1];
840
+			if (!p) return $1;
841
+			parsed.push($1);
842
+			return '(' + p.source + ')';
843
+		}
844
+	).replace(/\[a-z\]/gi, '[a-z\\u00c0-\\uffff;\&]'); // handle unicode words
845
+
846
+	return {
847
+		format: format,
848
+		re: new RegExp('^' + re + '$', 'i'),
849
+		handler: function(bits){
850
+			bits = bits.slice(1).associate(parsed);
851
+			var date = new Date().clearTime(),
852
+				year = bits.y || bits.Y;
853
+
854
+			if (year != null) handle.call(date, 'y', year); // need to start in the right year
855
+			if ('d' in bits) handle.call(date, 'd', 1);
856
+			if ('m' in bits || bits.b || bits.B) handle.call(date, 'm', 1);
857
+
858
+			for (var key in bits) handle.call(date, key, bits[key]);
859
+			return date;
860
+		}
861
+	};
862
+};
863
+
864
+var handle = function(key, value){
865
+	if (!value) return this;
866
+
867
+	switch (key){
868
+		case 'a': case 'A': return this.set('day', Date.parseDay(value, true));
869
+		case 'b': case 'B': return this.set('mo', Date.parseMonth(value, true));
870
+		case 'd': return this.set('date', value);
871
+		case 'H': case 'I': return this.set('hr', value);
872
+		case 'm': return this.set('mo', value - 1);
873
+		case 'M': return this.set('min', value);
874
+		case 'p': return this.set('ampm', value.replace(/\./g, ''));
875
+		case 'S': return this.set('sec', value);
876
+		case 's': return this.set('ms', ('0.' + value) * 1000);
877
+		case 'w': return this.set('day', value);
878
+		case 'Y': return this.set('year', value);
879
+		case 'y':
880
+			value = +value;
881
+			if (value < 100) value += startCentury + (value < startYear ? 100 : 0);
882
+			return this.set('year', value);
883
+		case 'z':
884
+			if (value == 'Z') value = '+00';
885
+			var offset = value.match(/([+-])(\d{2}):?(\d{2})?/);
886
+			offset = (offset[1] + '1') * (offset[2] * 60 + (+offset[3] || 0)) + this.getTimezoneOffset();
887
+			return this.set('time', this - offset * 60000);
888
+	}
889
+
890
+	return this;
891
+};
892
+
893
+Date.defineParsers(
894
+	'%Y([-./]%m([-./]%d((T| )%X)?)?)?', // "1999-12-31", "1999-12-31 11:59pm", "1999-12-31 23:59:59", ISO8601
895
+	'%Y%m%d(T%H(%M%S?)?)?', // "19991231", "19991231T1159", compact
896
+	'%x( %X)?', // "12/31", "12.31.99", "12-31-1999", "12/31/2008 11:59 PM"
897
+	'%d%o( %b( %Y)?)?( %X)?', // "31st", "31st December", "31 Dec 1999", "31 Dec 1999 11:59pm"
898
+	'%b( %d%o)?( %Y)?( %X)?', // Same as above with month and day switched
899
+	'%Y %b( %d%o( %X)?)?', // Same as above with year coming first
900
+	'%o %b %d %X %z %Y', // "Thu Oct 22 08:11:23 +0000 2009"
901
+	'%T', // %H:%M:%S
902
+	'%H:%M( ?%p)?' // "11:05pm", "11:05 am" and "11:05"
903
+);
904
+
905
+Locale.addEvent('change', function(language){
906
+	if (Locale.get('Date')) recompile(language);
907
+}).fireEvent('change', Locale.getCurrent());
908
+
909
+}).call(this);
910
+
911
+
912
+/*
913
+---
914
+
915
+script: Date.Extras.js
916
+
917
+name: Date.Extras
918
+
919
+description: Extends the Date native object to include extra methods (on top of those in Date.js).
920
+
921
+license: MIT-style license
922
+
923
+authors:
924
+  - Aaron Newton
925
+  - Scott Kyle
926
+
927
+requires:
928
+  - /Date
929
+
930
+provides: [Date.Extras]
931
+
932
+...
933
+*/
934
+
935
+Date.implement({
936
+
937
+	timeDiffInWords: function(to){
938
+		return Date.distanceOfTimeInWords(this, to || new Date);
939
+	},
940
+
941
+	timeDiff: function(to, separator){
942
+		if (to == null) to = new Date;
943
+		var delta = ((to - this) / 1000).floor();
944
+
945
+		var vals = [],
946
+			durations = [60, 60, 24, 365, 0],
947
+			names = ['s', 'm', 'h', 'd', 'y'],
948
+			value, duration;
949
+
950
+		for (var item = 0; item < durations.length; item++){
951
+			if (item && !delta) break;
952
+			value = delta;
953
+			if ((duration = durations[item])){
954
+				value = (delta % duration);
955
+				delta = (delta / duration).floor();
956
+			}
957
+			vals.unshift(value + (names[item] || ''));
958
+		}
959
+
960
+		return vals.join(separator || ':');
961
+	}
962
+
963
+}).extend({
964
+
965
+	distanceOfTimeInWords: function(from, to){
966
+		return Date.getTimePhrase(((to - from) / 1000).toInt());
967
+	},
968
+
969
+	getTimePhrase: function(delta){
970
+		var suffix = (delta < 0) ? 'Until' : 'Ago';
971
+		if (delta < 0) delta *= -1;
972
+
973
+		var units = {
974
+			minute: 60,
975
+			hour: 60,
976
+			day: 24,
977
+			week: 7,
978
+			month: 52 / 12,
979
+			year: 12,
980
+			eon: Infinity
981
+		};
982
+
983
+		var msg = 'lessThanMinute';
984
+
985
+		for (var unit in units){
986
+			var interval = units[unit];
987
+			if (delta < 1.5 * interval){
988
+				if (delta > 0.75 * interval) msg = unit;
989
+				break;
990
+			}
991
+			delta /= interval;
992
+			msg = unit + 's';
993
+		}
994
+
995
+		delta = delta.round();
996
+		return Date.getMsg(msg + suffix, delta).substitute({delta: delta});
997
+	}
998
+
999
+}).defineParsers(
1000
+
1001
+	{
1002
+		// "today", "tomorrow", "yesterday"
1003
+		re: /^(?:tod|tom|yes)/i,
1004
+		handler: function(bits){
1005
+			var d = new Date().clearTime();
1006
+			switch (bits[0]){
1007
+				case 'tom': return d.increment();
1008
+				case 'yes': return d.decrement();
1009
+				default: return d;
1010
+			}
1011
+		}
1012
+	},
1013
+
1014
+	{
1015
+		// "next Wednesday", "last Thursday"
1016
+		re: /^(next|last) ([a-z]+)$/i,
1017
+		handler: function(bits){
1018
+			var d = new Date().clearTime();
1019
+			var day = d.getDay();
1020
+			var newDay = Date.parseDay(bits[2], true);
1021
+			var addDays = newDay - day;
1022
+			if (newDay <= day) addDays += 7;
1023
+			if (bits[1] == 'last') addDays -= 7;
1024
+			return d.set('date', d.getDate() + addDays);
1025
+		}
1026
+	}
1027
+
1028
+).alias('timeAgoInWords', 'timeDiffInWords');
1029
+
1030
+
1031
+/*
1032
+---
1033
+
1034
+name: Hash
1035
+
1036
+description: Contains Hash Prototypes. Provides a means for overcoming the JavaScript practical impossibility of extending native Objects.
1037
+
1038
+license: MIT-style license.
1039
+
1040
+requires:
1041
+  - Core/Object
1042
+  - /MooTools.More
1043
+
1044
+provides: [Hash]
1045
+
1046
+...
1047
+*/
1048
+
1049
+(function(){
1050
+
1051
+if (this.Hash) return;
1052
+
1053
+var Hash = this.Hash = new Type('Hash', function(object){
1054
+	if (typeOf(object) == 'hash') object = Object.clone(object.getClean());
1055
+	for (var key in object) this[key] = object[key];
1056
+	return this;
1057
+});
1058
+
1059
+this.$H = function(object){
1060
+	return new Hash(object);
1061
+};
1062
+
1063
+Hash.implement({
1064
+
1065
+	forEach: function(fn, bind){
1066
+		Object.forEach(this, fn, bind);
1067
+	},
1068
+
1069
+	getClean: function(){
1070
+		var clean = {};
1071
+		for (var key in this){
1072
+			if (this.hasOwnProperty(key)) clean[key] = this[key];
1073
+		}
1074
+		return clean;
1075
+	},
1076
+
1077
+	getLength: function(){
1078
+		var length = 0;
1079
+		for (var key in this){
1080
+			if (this.hasOwnProperty(key)) length++;
1081
+		}
1082
+		return length;
1083
+	}
1084
+
1085
+});
1086
+
1087
+Hash.alias('each', 'forEach');
1088
+
1089
+Hash.implement({
1090
+
1091
+	has: Object.prototype.hasOwnProperty,
1092
+
1093
+	keyOf: function(value){
1094
+		return Object.keyOf(this, value);
1095
+	},
1096
+
1097
+	hasValue: function(value){
1098
+		return Object.contains(this, value);
1099
+	},
1100
+
1101
+	extend: function(properties){
1102
+		Hash.each(properties || {}, function(value, key){
1103
+			Hash.set(this, key, value);
1104
+		}, this);
1105
+		return this;
1106
+	},
1107
+
1108
+	combine: function(properties){
1109
+		Hash.each(properties || {}, function(value, key){
1110
+			Hash.include(this, key, value);
1111
+		}, this);
1112
+		return this;
1113
+	},
1114
+
1115
+	erase: function(key){
1116
+		if (this.hasOwnProperty(key)) delete this[key];
1117
+		return this;
1118
+	},
1119
+
1120
+	get: function(key){
1121
+		return (this.hasOwnProperty(key)) ? this[key] : null;
1122
+	},
1123
+
1124
+	set: function(key, value){
1125
+		if (!this[key] || this.hasOwnProperty(key)) this[key] = value;
1126
+		return this;
1127
+	},
1128
+
1129
+	empty: function(){
1130
+		Hash.each(this, function(value, key){
1131
+			delete this[key];
1132
+		}, this);
1133
+		return this;
1134
+	},
1135
+
1136
+	include: function(key, value){
1137
+		if (this[key] == undefined) this[key] = value;
1138
+		return this;
1139
+	},
1140
+
1141
+	map: function(fn, bind){
1142
+		return new Hash(Object.map(this, fn, bind));
1143
+	},
1144
+
1145
+	filter: function(fn, bind){
1146
+		return new Hash(Object.filter(this, fn, bind));
1147
+	},
1148
+
1149
+	every: function(fn, bind){
1150
+		return Object.every(this, fn, bind);
1151
+	},
1152
+
1153
+	some: function(fn, bind){
1154
+		return Object.some(this, fn, bind);
1155
+	},
1156
+
1157
+	getKeys: function(){
1158
+		return Object.keys(this);
1159
+	},
1160
+
1161
+	getValues: function(){
1162
+		return Object.values(this);
1163
+	},
1164
+
1165
+	toQueryString: function(base){
1166
+		return Object.toQueryString(this, base);
1167
+	}
1168
+
1169
+});
1170
+
1171
+Hash.alias({indexOf: 'keyOf', contains: 'hasValue'});
1172
+
1173
+
1174
+}).call(this);
1175
+
1176
+
1177
+
1178
+/*
1179
+---
1180
+
1181
+script: Request.JSONP.js
1182
+
1183
+name: Request.JSONP
1184
+
1185
+description: Defines Request.JSONP, a class for cross domain javascript via script injection.
1186
+
1187
+license: MIT-style license
1188
+
1189
+authors:
1190
+  - Aaron Newton
1191
+  - Guillermo Rauch
1192
+  - Arian Stolwijk
1193
+
1194
+requires:
1195
+  - Core/Element
1196
+  - Core/Request
1197
+  - MooTools.More
1198
+
1199
+provides: [Request.JSONP]
1200
+
1201
+...
1202
+*/
1203
+
1204
+Request.JSONP = new Class({
1205
+
1206
+	Implements: [Chain, Events, Options],
1207
+
1208
+	options: {
1209
+	/*
1210
+		onRequest: function(src, scriptElement){},
1211
+		onComplete: function(data){},
1212
+		onSuccess: function(data){},
1213
+		onCancel: function(){},
1214
+		onTimeout: function(){},
1215
+		onError: function(){}, */
1216
+		onRequest: function(src){
1217
+			if (this.options.log && window.console && console.log){
1218
+				console.log('JSONP retrieving script with url:' + src);
1219
+			}
1220
+		},
1221
+		onError: function(src){
1222
+			if (this.options.log && window.console && console.warn){
1223
+				console.warn('JSONP '+ src +' will fail in Internet Explorer, which enforces a 2083 bytes length limit on URIs');
1224
+			}
1225
+		},
1226
+		url: '',
1227
+		callbackKey: 'callback',
1228
+		injectScript: document.head,
1229
+		data: '',
1230
+		link: 'ignore',
1231
+		timeout: 0,
1232
+		log: false
1233
+	},
1234
+
1235
+	initialize: function(options){
1236
+		this.setOptions(options);
1237
+	},
1238
+
1239
+	send: function(options){
1240
+		if (!Request.prototype.check.call(this, options)) return this;
1241
+		this.running = true;
1242
+
1243
+		var type = typeOf(options);
1244
+		if (type == 'string' || type == 'element') options = {data: options};
1245
+		options = Object.merge(this.options, options || {});
1246
+
1247
+		var data = options.data;
1248
+		switch (typeOf(data)){
1249
+			case 'element': data = document.id(data).toQueryString(); break;
1250
+			case 'object': case 'hash': data = Object.toQueryString(data);
1251
+		}
1252
+
1253
+		var index = this.index = Request.JSONP.counter++;
1254
+
1255
+		var src = options.url +
1256
+			(options.url.test('\\?') ? '&' :'?') +
1257
+			(options.callbackKey) +
1258
+			'=Request.JSONP.request_map.request_'+ index +
1259
+			(data ? '&' + data : '');
1260
+
1261
+		if (src.length > 2083) this.fireEvent('error', src);
1262
+
1263
+		Request.JSONP.request_map['request_' + index] = function(){
1264
+			this.success(arguments, index);
1265
+		}.bind(this);
1266
+
1267
+		var script = this.getScript(src).inject(options.injectScript);
1268
+		this.fireEvent('request', [src, script]);
1269
+
1270
+		if (options.timeout) this.timeout.delay(options.timeout, this);
1271
+
1272
+		return this;
1273
+	},
1274
+
1275
+	getScript: function(src){
1276
+		if (!this.script) this.script = new Element('script[type=text/javascript]', {
1277
+			async: true,
1278
+			src: src
1279
+		});
1280
+		return this.script;
1281
+	},
1282
+
1283
+	success: function(args, index){
1284
+		if (!this.running) return false;
1285
+		this.clear()
1286
+			.fireEvent('complete', args).fireEvent('success', args)
1287
+			.callChain();
1288
+	},
1289
+
1290
+	cancel: function(){
1291
+		if (this.running) this.clear().fireEvent('cancel');
1292
+		return this;
1293
+	},
1294
+
1295
+	isRunning: function(){
1296
+		return !!this.running;
1297
+	},
1298
+
1299
+	clear: function(){
1300
+		this.running = false;
1301
+		if (this.script){
1302
+			this.script.destroy();
1303
+			this.script = null;
1304
+		}
1305
+		return this;
1306
+	},
1307
+
1308
+	timeout: function(){
1309
+		if (this.running){
1310
+			this.running = false;
1311
+			this.fireEvent('timeout', [this.script.get('src'), this.script]).fireEvent('failure').cancel();
1312
+		}
1313
+		return this;
1314
+	}
1315
+
1316
+});
1317
+
1318
+Request.JSONP.counter = 0;
1319
+Request.JSONP.request_map = {};
1320
+
1321
+
... ...
@@ -1,356 +1,5492 @@
1
-//MooTools, <http://mootools.net>, My Object Oriented (JavaScript) Tools. Copyright (c) 2006-2009 Valerio Proietti, <http://mad4milk.net>, MIT Style License.
2
-
3
-var MooTools={version:"1.2.3",build:"4980aa0fb74d2f6eb80bcd9f5b8e1fd6fbb8f607"};var Native=function(k){k=k||{};var a=k.name;var i=k.legacy;var b=k.protect;
4
-var c=k.implement;var h=k.generics;var f=k.initialize;var g=k.afterImplement||function(){};var d=f||i;h=h!==false;d.constructor=Native;d.$family={name:"native"};
5
-if(i&&f){d.prototype=i.prototype;}d.prototype.constructor=d;if(a){var e=a.toLowerCase();d.prototype.$family={name:e};Native.typize(d,e);}var j=function(n,l,o,m){if(!b||m||!n.prototype[l]){n.prototype[l]=o;
6
-}if(h){Native.genericize(n,l,b);}g.call(n,l,o);return n;};d.alias=function(n,l,p){if(typeof n=="string"){var o=this.prototype[n];if((n=o)){return j(this,l,n,p);
7
-}}for(var m in n){this.alias(m,n[m],l);}return this;};d.implement=function(m,l,o){if(typeof m=="string"){return j(this,m,l,o);}for(var n in m){j(this,n,m[n],l);
8
-}return this;};if(c){d.implement(c);}return d;};Native.genericize=function(b,c,a){if((!a||!b[c])&&typeof b.prototype[c]=="function"){b[c]=function(){var d=Array.prototype.slice.call(arguments);
9
-return b.prototype[c].apply(d.shift(),d);};}};Native.implement=function(d,c){for(var b=0,a=d.length;b<a;b++){d[b].implement(c);}};Native.typize=function(a,b){if(!a.type){a.type=function(c){return($type(c)===b);
10
-};}};(function(){var a={Array:Array,Date:Date,Function:Function,Number:Number,RegExp:RegExp,String:String};for(var h in a){new Native({name:h,initialize:a[h],protect:true});
11
-}var d={"boolean":Boolean,"native":Native,object:Object};for(var c in d){Native.typize(d[c],c);}var f={Array:["concat","indexOf","join","lastIndexOf","pop","push","reverse","shift","slice","sort","splice","toString","unshift","valueOf"],String:["charAt","charCodeAt","concat","indexOf","lastIndexOf","match","replace","search","slice","split","substr","substring","toLowerCase","toUpperCase","valueOf"]};
12
-for(var e in f){for(var b=f[e].length;b--;){Native.genericize(a[e],f[e][b],true);}}})();var Hash=new Native({name:"Hash",initialize:function(a){if($type(a)=="hash"){a=$unlink(a.getClean());
13
-}for(var b in a){this[b]=a[b];}return this;}});Hash.implement({forEach:function(b,c){for(var a in this){if(this.hasOwnProperty(a)){b.call(c,this[a],a,this);
14
-}}},getClean:function(){var b={};for(var a in this){if(this.hasOwnProperty(a)){b[a]=this[a];}}return b;},getLength:function(){var b=0;for(var a in this){if(this.hasOwnProperty(a)){b++;
15
-}}return b;}});Hash.alias("forEach","each");Array.implement({forEach:function(c,d){for(var b=0,a=this.length;b<a;b++){c.call(d,this[b],b,this);}}});Array.alias("forEach","each");
16
-function $A(b){if(b.item){var a=b.length,c=new Array(a);while(a--){c[a]=b[a];}return c;}return Array.prototype.slice.call(b);}function $arguments(a){return function(){return arguments[a];
17
-};}function $chk(a){return !!(a||a===0);}function $clear(a){clearTimeout(a);clearInterval(a);return null;}function $defined(a){return(a!=undefined);}function $each(c,b,d){var a=$type(c);
18
-((a=="arguments"||a=="collection"||a=="array")?Array:Hash).each(c,b,d);}function $empty(){}function $extend(c,a){for(var b in (a||{})){c[b]=a[b];}return c;
19
-}function $H(a){return new Hash(a);}function $lambda(a){return($type(a)=="function")?a:function(){return a;};}function $merge(){var a=Array.slice(arguments);
20
-a.unshift({});return $mixin.apply(null,a);}function $mixin(e){for(var d=1,a=arguments.length;d<a;d++){var b=arguments[d];if($type(b)!="object"){continue;
21
-}for(var c in b){var g=b[c],f=e[c];e[c]=(f&&$type(g)=="object"&&$type(f)=="object")?$mixin(f,g):$unlink(g);}}return e;}function $pick(){for(var b=0,a=arguments.length;
22
-b<a;b++){if(arguments[b]!=undefined){return arguments[b];}}return null;}function $random(b,a){return Math.floor(Math.random()*(a-b+1)+b);}function $splat(b){var a=$type(b);
23
-return(a)?((a!="array"&&a!="arguments")?[b]:b):[];}var $time=Date.now||function(){return +new Date;};function $try(){for(var b=0,a=arguments.length;b<a;
24
-b++){try{return arguments[b]();}catch(c){}}return null;}function $type(a){if(a==undefined){return false;}if(a.$family){return(a.$family.name=="number"&&!isFinite(a))?false:a.$family.name;
25
-}if(a.nodeName){switch(a.nodeType){case 1:return"element";case 3:return(/\S/).test(a.nodeValue)?"textnode":"whitespace";}}else{if(typeof a.length=="number"){if(a.callee){return"arguments";
26
-}else{if(a.item){return"collection";}}}}return typeof a;}function $unlink(c){var b;switch($type(c)){case"object":b={};for(var e in c){b[e]=$unlink(c[e]);
27
-}break;case"hash":b=new Hash(c);break;case"array":b=[];for(var d=0,a=c.length;d<a;d++){b[d]=$unlink(c[d]);}break;default:return c;}return b;}var Browser=$merge({Engine:{name:"unknown",version:0},Platform:{name:(window.orientation!=undefined)?"ipod":(navigator.platform.match(/mac|win|linux/i)||["other"])[0].toLowerCase()},Features:{xpath:!!(document.evaluate),air:!!(window.runtime),query:!!(document.querySelector)},Plugins:{},Engines:{presto:function(){return(!window.opera)?false:((arguments.callee.caller)?960:((document.getElementsByClassName)?950:925));
28
-},trident:function(){return(!window.ActiveXObject)?false:((window.XMLHttpRequest)?5:4);},webkit:function(){return(navigator.taintEnabled)?false:((Browser.Features.xpath)?((Browser.Features.query)?525:420):419);
29
-},gecko:function(){return(document.getBoxObjectFor==undefined)?false:((document.getElementsByClassName)?19:18);}}},Browser||{});Browser.Platform[Browser.Platform.name]=true;
30
-Browser.detect=function(){for(var b in this.Engines){var a=this.Engines[b]();if(a){this.Engine={name:b,version:a};this.Engine[b]=this.Engine[b+a]=true;
31
-break;}}return{name:b,version:a};};Browser.detect();Browser.Request=function(){return $try(function(){return new XMLHttpRequest();},function(){return new ActiveXObject("MSXML2.XMLHTTP");
32
-});};Browser.Features.xhr=!!(Browser.Request());Browser.Plugins.Flash=(function(){var a=($try(function(){return navigator.plugins["Shockwave Flash"].description;
33
-},function(){return new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version");})||"0 r0").match(/\d+/g);return{version:parseInt(a[0]||0+"."+a[1],10)||0,build:parseInt(a[2],10)||0};
34
-})();function $exec(b){if(!b){return b;}if(window.execScript){window.execScript(b);}else{var a=document.createElement("script");a.setAttribute("type","text/javascript");
35
-a[(Browser.Engine.webkit&&Browser.Engine.version<420)?"innerText":"text"]=b;document.head.appendChild(a);document.head.removeChild(a);}return b;}Native.UID=1;
36
-var $uid=(Browser.Engine.trident)?function(a){return(a.uid||(a.uid=[Native.UID++]))[0];}:function(a){return a.uid||(a.uid=Native.UID++);};var Window=new Native({name:"Window",legacy:(Browser.Engine.trident)?null:window.Window,initialize:function(a){$uid(a);
37
-if(!a.Element){a.Element=$empty;if(Browser.Engine.webkit){a.document.createElement("iframe");}a.Element.prototype=(Browser.Engine.webkit)?window["[[DOMElement.prototype]]"]:{};
38
-}a.document.window=a;return $extend(a,Window.Prototype);},afterImplement:function(b,a){window[b]=Window.Prototype[b]=a;}});Window.Prototype={$family:{name:"window"}};
39
-new Window(window);var Document=new Native({name:"Document",legacy:(Browser.Engine.trident)?null:window.Document,initialize:function(a){$uid(a);a.head=a.getElementsByTagName("head")[0];
40
-a.html=a.getElementsByTagName("html")[0];if(Browser.Engine.trident&&Browser.Engine.version<=4){$try(function(){a.execCommand("BackgroundImageCache",false,true);
41
-});}if(Browser.Engine.trident){a.window.attachEvent("onunload",function(){a.window.detachEvent("onunload",arguments.callee);a.head=a.html=a.window=null;
42
-});}return $extend(a,Document.Prototype);},afterImplement:function(b,a){document[b]=Document.Prototype[b]=a;}});Document.Prototype={$family:{name:"document"}};
43
-new Document(document);Array.implement({every:function(c,d){for(var b=0,a=this.length;b<a;b++){if(!c.call(d,this[b],b,this)){return false;}}return true;
44
-},filter:function(d,e){var c=[];for(var b=0,a=this.length;b<a;b++){if(d.call(e,this[b],b,this)){c.push(this[b]);}}return c;},clean:function(){return this.filter($defined);
45
-},indexOf:function(c,d){var a=this.length;for(var b=(d<0)?Math.max(0,a+d):d||0;b<a;b++){if(this[b]===c){return b;}}return -1;},map:function(d,e){var c=[];
46
-for(var b=0,a=this.length;b<a;b++){c[b]=d.call(e,this[b],b,this);}return c;},some:function(c,d){for(var b=0,a=this.length;b<a;b++){if(c.call(d,this[b],b,this)){return true;
47
-}}return false;},associate:function(c){var d={},b=Math.min(this.length,c.length);for(var a=0;a<b;a++){d[c[a]]=this[a];}return d;},link:function(c){var a={};
48
-for(var e=0,b=this.length;e<b;e++){for(var d in c){if(c[d](this[e])){a[d]=this[e];delete c[d];break;}}}return a;},contains:function(a,b){return this.indexOf(a,b)!=-1;
49
-},extend:function(c){for(var b=0,a=c.length;b<a;b++){this.push(c[b]);}return this;},getLast:function(){return(this.length)?this[this.length-1]:null;},getRandom:function(){return(this.length)?this[$random(0,this.length-1)]:null;
50
-},include:function(a){if(!this.contains(a)){this.push(a);}return this;},combine:function(c){for(var b=0,a=c.length;b<a;b++){this.include(c[b]);}return this;
51
-},erase:function(b){for(var a=this.length;a--;a){if(this[a]===b){this.splice(a,1);}}return this;},empty:function(){this.length=0;return this;},flatten:function(){var d=[];
52
-for(var b=0,a=this.length;b<a;b++){var c=$type(this[b]);if(!c){continue;}d=d.concat((c=="array"||c=="collection"||c=="arguments")?Array.flatten(this[b]):this[b]);
53
-}return d;},hexToRgb:function(b){if(this.length!=3){return null;}var a=this.map(function(c){if(c.length==1){c+=c;}return c.toInt(16);});return(b)?a:"rgb("+a+")";
54
-},rgbToHex:function(d){if(this.length<3){return null;}if(this.length==4&&this[3]==0&&!d){return"transparent";}var b=[];for(var a=0;a<3;a++){var c=(this[a]-0).toString(16);
55
-b.push((c.length==1)?"0"+c:c);}return(d)?b:"#"+b.join("");}});Function.implement({extend:function(a){for(var b in a){this[b]=a[b];}return this;},create:function(b){var a=this;
56
-b=b||{};return function(d){var c=b.arguments;c=(c!=undefined)?$splat(c):Array.slice(arguments,(b.event)?1:0);if(b.event){c=[d||window.event].extend(c);
57
-}var e=function(){return a.apply(b.bind||null,c);};if(b.delay){return setTimeout(e,b.delay);}if(b.periodical){return setInterval(e,b.periodical);}if(b.attempt){return $try(e);
58
-}return e();};},run:function(a,b){return this.apply(b,$splat(a));},pass:function(a,b){return this.create({bind:b,arguments:a});},bind:function(b,a){return this.create({bind:b,arguments:a});
59
-},bindWithEvent:function(b,a){return this.create({bind:b,arguments:a,event:true});},attempt:function(a,b){return this.create({bind:b,arguments:a,attempt:true})();
60
-},delay:function(b,c,a){return this.create({bind:c,arguments:a,delay:b})();},periodical:function(c,b,a){return this.create({bind:b,arguments:a,periodical:c})();
61
-}});Number.implement({limit:function(b,a){return Math.min(a,Math.max(b,this));},round:function(a){a=Math.pow(10,a||0);return Math.round(this*a)/a;},times:function(b,c){for(var a=0;
62
-a<this;a++){b.call(c,a,this);}},toFloat:function(){return parseFloat(this);},toInt:function(a){return parseInt(this,a||10);}});Number.alias("times","each");
63
-(function(b){var a={};b.each(function(c){if(!Number[c]){a[c]=function(){return Math[c].apply(null,[this].concat($A(arguments)));};}});Number.implement(a);
64
-})(["abs","acos","asin","atan","atan2","ceil","cos","exp","floor","log","max","min","pow","sin","sqrt","tan"]);String.implement({test:function(a,b){return((typeof a=="string")?new RegExp(a,b):a).test(this);
65
-},contains:function(a,b){return(b)?(b+this+b).indexOf(b+a+b)>-1:this.indexOf(a)>-1;},trim:function(){return this.replace(/^\s+|\s+$/g,"");},clean:function(){return this.replace(/\s+/g," ").trim();
66
-},camelCase:function(){return this.replace(/-\D/g,function(a){return a.charAt(1).toUpperCase();});},hyphenate:function(){return this.replace(/[A-Z]/g,function(a){return("-"+a.charAt(0).toLowerCase());
67
-});},capitalize:function(){return this.replace(/\b[a-z]/g,function(a){return a.toUpperCase();});},escapeRegExp:function(){return this.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1");
68
-},toInt:function(a){return parseInt(this,a||10);},toFloat:function(){return parseFloat(this);},hexToRgb:function(b){var a=this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
69
-return(a)?a.slice(1).hexToRgb(b):null;},rgbToHex:function(b){var a=this.match(/\d{1,3}/g);return(a)?a.rgbToHex(b):null;},stripScripts:function(b){var a="";
70
-var c=this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,function(){a+=arguments[1]+"\n";return"";});if(b===true){$exec(a);}else{if($type(b)=="function"){b(a,c);
71
-}}return c;},substitute:function(a,b){return this.replace(b||(/\\?\{([^{}]+)\}/g),function(d,c){if(d.charAt(0)=="\\"){return d.slice(1);}return(a[c]!=undefined)?a[c]:"";
72
-});}});Hash.implement({has:Object.prototype.hasOwnProperty,keyOf:function(b){for(var a in this){if(this.hasOwnProperty(a)&&this[a]===b){return a;}}return null;
73
-},hasValue:function(a){return(Hash.keyOf(this,a)!==null);},extend:function(a){Hash.each(a||{},function(c,b){Hash.set(this,b,c);},this);return this;},combine:function(a){Hash.each(a||{},function(c,b){Hash.include(this,b,c);
74
-},this);return this;},erase:function(a){if(this.hasOwnProperty(a)){delete this[a];}return this;},get:function(a){return(this.hasOwnProperty(a))?this[a]:null;
75
-},set:function(a,b){if(!this[a]||this.hasOwnProperty(a)){this[a]=b;}return this;},empty:function(){Hash.each(this,function(b,a){delete this[a];},this);
76
-return this;},include:function(a,b){if(this[a]==undefined){this[a]=b;}return this;},map:function(b,c){var a=new Hash;Hash.each(this,function(e,d){a.set(d,b.call(c,e,d,this));
77
-},this);return a;},filter:function(b,c){var a=new Hash;Hash.each(this,function(e,d){if(b.call(c,e,d,this)){a.set(d,e);}},this);return a;},every:function(b,c){for(var a in this){if(this.hasOwnProperty(a)&&!b.call(c,this[a],a)){return false;
78
-}}return true;},some:function(b,c){for(var a in this){if(this.hasOwnProperty(a)&&b.call(c,this[a],a)){return true;}}return false;},getKeys:function(){var a=[];
79
-Hash.each(this,function(c,b){a.push(b);});return a;},getValues:function(){var a=[];Hash.each(this,function(b){a.push(b);});return a;},toQueryString:function(a){var b=[];
80
-Hash.each(this,function(f,e){if(a){e=a+"["+e+"]";}var d;switch($type(f)){case"object":d=Hash.toQueryString(f,e);break;case"array":var c={};f.each(function(h,g){c[g]=h;
81
-});d=Hash.toQueryString(c,e);break;default:d=e+"="+encodeURIComponent(f);}if(f!=undefined){b.push(d);}});return b.join("&");}});Hash.alias({keyOf:"indexOf",hasValue:"contains"});
82
-var Event=new Native({name:"Event",initialize:function(a,f){f=f||window;var k=f.document;a=a||f.event;if(a.$extended){return a;}this.$extended=true;var j=a.type;
83
-var g=a.target||a.srcElement;while(g&&g.nodeType==3){g=g.parentNode;}if(j.test(/key/)){var b=a.which||a.keyCode;var m=Event.Keys.keyOf(b);if(j=="keydown"){var d=b-111;
84
-if(d>0&&d<13){m="f"+d;}}m=m||String.fromCharCode(b).toLowerCase();}else{if(j.match(/(click|mouse|menu)/i)){k=(!k.compatMode||k.compatMode=="CSS1Compat")?k.html:k.body;
85
-var i={x:a.pageX||a.clientX+k.scrollLeft,y:a.pageY||a.clientY+k.scrollTop};var c={x:(a.pageX)?a.pageX-f.pageXOffset:a.clientX,y:(a.pageY)?a.pageY-f.pageYOffset:a.clientY};
86
-if(j.match(/DOMMouseScroll|mousewheel/)){var h=(a.wheelDelta)?a.wheelDelta/120:-(a.detail||0)/3;}var e=(a.which==3)||(a.button==2);var l=null;if(j.match(/over|out/)){switch(j){case"mouseover":l=a.relatedTarget||a.fromElement;
87
-break;case"mouseout":l=a.relatedTarget||a.toElement;}if(!(function(){while(l&&l.nodeType==3){l=l.parentNode;}return true;}).create({attempt:Browser.Engine.gecko})()){l=false;
88
-}}}}return $extend(this,{event:a,type:j,page:i,client:c,rightClick:e,wheel:h,relatedTarget:l,target:g,code:b,key:m,shift:a.shiftKey,control:a.ctrlKey,alt:a.altKey,meta:a.metaKey});
89
-}});Event.Keys=new Hash({enter:13,up:38,down:40,left:37,right:39,esc:27,space:32,backspace:8,tab:9,"delete":46});Event.implement({stop:function(){return this.stopPropagation().preventDefault();
90
-},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault();
91
-}else{this.event.returnValue=false;}return this;}});function Class(b){if(b instanceof Function){b={initialize:b};}var a=function(){Object.reset(this);if(a._prototyping){return this;
92
-}this._current=$empty;var c=(this.initialize)?this.initialize.apply(this,arguments):this;delete this._current;delete this.caller;return c;}.extend(this);
93
-a.implement(b);a.constructor=Class;a.prototype.constructor=a;return a;}Function.prototype.protect=function(){this._protected=true;return this;};Object.reset=function(a,c){if(c==null){for(var e in a){Object.reset(a,e);
94
-}return a;}delete a[c];switch($type(a[c])){case"object":var d=function(){};d.prototype=a[c];var b=new d;a[c]=Object.reset(b);break;case"array":a[c]=$unlink(a[c]);
95
-break;}return a;};new Native({name:"Class",initialize:Class}).extend({instantiate:function(b){b._prototyping=true;var a=new b;delete b._prototyping;return a;
96
-},wrap:function(a,b,c){if(c._origin){c=c._origin;}return function(){if(c._protected&&this._current==null){throw new Error('The method "'+b+'" cannot be called.');
97
-}var e=this.caller,f=this._current;this.caller=f;this._current=arguments.callee;var d=c.apply(this,arguments);this._current=f;this.caller=e;return d;}.extend({_owner:a,_origin:c,_name:b});
98
-}});Class.implement({implement:function(a,d){if($type(a)=="object"){for(var e in a){this.implement(e,a[e]);}return this;}var f=Class.Mutators[a];if(f){d=f.call(this,d);
99
-if(d==null){return this;}}var c=this.prototype;switch($type(d)){case"function":if(d._hidden){return this;}c[a]=Class.wrap(this,a,d);break;case"object":var b=c[a];
100
-if($type(b)=="object"){$mixin(b,d);}else{c[a]=$unlink(d);}break;case"array":c[a]=$unlink(d);break;default:c[a]=d;}return this;}});Class.Mutators={Extends:function(a){this.parent=a;
101
-this.prototype=Class.instantiate(a);this.implement("parent",function(){var b=this.caller._name,c=this.caller._owner.parent.prototype[b];if(!c){throw new Error('The method "'+b+'" has no parent.');
102
-}return c.apply(this,arguments);}.protect());},Implements:function(a){$splat(a).each(function(b){if(b instanceof Function){b=Class.instantiate(b);}this.implement(b);
103
-},this);}};var Chain=new Class({$chain:[],chain:function(){this.$chain.extend(Array.flatten(arguments));return this;},callChain:function(){return(this.$chain.length)?this.$chain.shift().apply(this,arguments):false;
104
-},clearChain:function(){this.$chain.empty();return this;}});var Events=new Class({$events:{},addEvent:function(c,b,a){c=Events.removeOn(c);if(b!=$empty){this.$events[c]=this.$events[c]||[];
105
-this.$events[c].include(b);if(a){b.internal=true;}}return this;},addEvents:function(a){for(var b in a){this.addEvent(b,a[b]);}return this;},fireEvent:function(c,b,a){c=Events.removeOn(c);
106
-if(!this.$events||!this.$events[c]){return this;}this.$events[c].each(function(d){d.create({bind:this,delay:a,"arguments":b})();},this);return this;},removeEvent:function(b,a){b=Events.removeOn(b);
107
-if(!this.$events[b]){return this;}if(!a.internal){this.$events[b].erase(a);}return this;},removeEvents:function(c){var d;if($type(c)=="object"){for(d in c){this.removeEvent(d,c[d]);
108
-}return this;}if(c){c=Events.removeOn(c);}for(d in this.$events){if(c&&c!=d){continue;}var b=this.$events[d];for(var a=b.length;a--;a){this.removeEvent(d,b[a]);
109
-}}return this;}});Events.removeOn=function(a){return a.replace(/^on([A-Z])/,function(b,c){return c.toLowerCase();});};var Options=new Class({setOptions:function(){this.options=$merge.run([this.options].extend(arguments));
110
-if(!this.addEvent){return this;}for(var a in this.options){if($type(this.options[a])!="function"||!(/^on[A-Z]/).test(a)){continue;}this.addEvent(a,this.options[a]);
111
-delete this.options[a];}return this;}});var Element=new Native({name:"Element",legacy:window.Element,initialize:function(a,b){var c=Element.Constructors.get(a);
112
-if(c){return c(b);}if(typeof a=="string"){return document.newElement(a,b);}return document.id(a).set(b);},afterImplement:function(a,b){Element.Prototype[a]=b;
113
-if(Array[a]){return;}Elements.implement(a,function(){var c=[],g=true;for(var e=0,d=this.length;e<d;e++){var f=this[e][a].apply(this[e],arguments);c.push(f);
114
-if(g){g=($type(f)=="element");}}return(g)?new Elements(c):c;});}});Element.Prototype={$family:{name:"element"}};Element.Constructors=new Hash;var IFrame=new Native({name:"IFrame",generics:false,initialize:function(){var f=Array.link(arguments,{properties:Object.type,iframe:$defined});
115
-var d=f.properties||{};var c=document.id(f.iframe);var e=d.onload||$empty;delete d.onload;d.id=d.name=$pick(d.id,d.name,c?(c.id||c.name):"IFrame_"+$time());
116
-c=new Element(c||"iframe",d);var b=function(){var g=$try(function(){return c.contentWindow.location.host;});if(!g||g==window.location.host){var h=new Window(c.contentWindow);
117
-new Document(c.contentWindow.document);$extend(h.Element.prototype,Element.Prototype);}e.call(c.contentWindow,c.contentWindow.document);};var a=$try(function(){return c.contentWindow;
118
-});((a&&a.document.body)||window.frames[d.id])?b():c.addListener("load",b);return c;}});var Elements=new Native({initialize:function(f,b){b=$extend({ddup:true,cash:true},b);
119
-f=f||[];if(b.ddup||b.cash){var g={},e=[];for(var c=0,a=f.length;c<a;c++){var d=document.id(f[c],!b.cash);if(b.ddup){if(g[d.uid]){continue;}g[d.uid]=true;
120
-}e.push(d);}f=e;}return(b.cash)?$extend(f,this):f;}});Elements.implement({filter:function(a,b){if(!a){return this;}return new Elements(Array.filter(this,(typeof a=="string")?function(c){return c.match(a);
121
-}:a,b));}});Document.implement({newElement:function(a,b){if(Browser.Engine.trident&&b){["name","type","checked"].each(function(c){if(!b[c]){return;}a+=" "+c+'="'+b[c]+'"';
122
-if(c!="checked"){delete b[c];}});a="<"+a+">";}return document.id(this.createElement(a)).set(b);},newTextNode:function(a){return this.createTextNode(a);
123
-},getDocument:function(){return this;},getWindow:function(){return this.window;},id:(function(){var a={string:function(d,c,b){d=b.getElementById(d);return(d)?a.element(d,c):null;
124
-},element:function(b,e){$uid(b);if(!e&&!b.$family&&!(/^object|embed$/i).test(b.tagName)){var c=Element.Prototype;for(var d in c){b[d]=c[d];}}return b;},object:function(c,d,b){if(c.toElement){return a.element(c.toElement(b),d);
125
-}return null;}};a.textnode=a.whitespace=a.window=a.document=$arguments(0);return function(c,e,d){if(c&&c.$family&&c.uid){return c;}var b=$type(c);return(a[b])?a[b](c,e,d||document):null;
126
-};})()});if(window.$==null){Window.implement({$:function(a,b){return document.id(a,b,this.document);}});}Window.implement({$$:function(a){if(arguments.length==1&&typeof a=="string"){return this.document.getElements(a);
127
-}var f=[];var c=Array.flatten(arguments);for(var d=0,b=c.length;d<b;d++){var e=c[d];switch($type(e)){case"element":f.push(e);break;case"string":f.extend(this.document.getElements(e,true));
128
-}}return new Elements(f);},getDocument:function(){return this.document;},getWindow:function(){return this;}});Native.implement([Element,Document],{getElement:function(a,b){return document.id(this.getElements(a,true)[0]||null,b);
129
-},getElements:function(a,d){a=a.split(",");var c=[];var b=(a.length>1);a.each(function(e){var f=this.getElementsByTagName(e.trim());(b)?c.extend(f):c=f;
130
-},this);return new Elements(c,{ddup:b,cash:!d});}});(function(){var h={},f={};var i={input:"checked",option:"selected",textarea:(Browser.Engine.webkit&&Browser.Engine.version<420)?"innerHTML":"value"};
131
-var c=function(l){return(f[l]||(f[l]={}));};var g=function(n,l){if(!n){return;}var m=n.uid;if(Browser.Engine.trident){if(n.clearAttributes){var q=l&&n.cloneNode(false);
132
-n.clearAttributes();if(q){n.mergeAttributes(q);}}else{if(n.removeEvents){n.removeEvents();}}if((/object/i).test(n.tagName)){for(var o in n){if(typeof n[o]=="function"){n[o]=$empty;
133
-}}Element.dispose(n);}}if(!m){return;}h[m]=f[m]=null;};var d=function(){Hash.each(h,g);if(Browser.Engine.trident){$A(document.getElementsByTagName("object")).each(g);
134
-}if(window.CollectGarbage){CollectGarbage();}h=f=null;};var j=function(n,l,s,m,p,r){var o=n[s||l];var q=[];while(o){if(o.nodeType==1&&(!m||Element.match(o,m))){if(!p){return document.id(o,r);
135
-}q.push(o);}o=o[l];}return(p)?new Elements(q,{ddup:false,cash:!r}):null;};var e={html:"innerHTML","class":"className","for":"htmlFor",defaultValue:"defaultValue",text:(Browser.Engine.trident||(Browser.Engine.webkit&&Browser.Engine.version<420))?"innerText":"textContent"};
136
-var b=["compact","nowrap","ismap","declare","noshade","checked","disabled","readonly","multiple","selected","noresize","defer"];var k=["value","type","defaultValue","accessKey","cellPadding","cellSpacing","colSpan","frameBorder","maxLength","readOnly","rowSpan","tabIndex","useMap"];
137
-b=b.associate(b);Hash.extend(e,b);Hash.extend(e,k.associate(k.map(String.toLowerCase)));var a={before:function(m,l){if(l.parentNode){l.parentNode.insertBefore(m,l);
138
-}},after:function(m,l){if(!l.parentNode){return;}var n=l.nextSibling;(n)?l.parentNode.insertBefore(m,n):l.parentNode.appendChild(m);},bottom:function(m,l){l.appendChild(m);
139
-},top:function(m,l){var n=l.firstChild;(n)?l.insertBefore(m,n):l.appendChild(m);}};a.inside=a.bottom;Hash.each(a,function(l,m){m=m.capitalize();Element.implement("inject"+m,function(n){l(this,document.id(n,true));
140
-return this;});Element.implement("grab"+m,function(n){l(document.id(n,true),this);return this;});});Element.implement({set:function(o,m){switch($type(o)){case"object":for(var n in o){this.set(n,o[n]);
141
-}break;case"string":var l=Element.Properties.get(o);(l&&l.set)?l.set.apply(this,Array.slice(arguments,1)):this.setProperty(o,m);}return this;},get:function(m){var l=Element.Properties.get(m);
142
-return(l&&l.get)?l.get.apply(this,Array.slice(arguments,1)):this.getProperty(m);},erase:function(m){var l=Element.Properties.get(m);(l&&l.erase)?l.erase.apply(this):this.removeProperty(m);
143
-return this;},setProperty:function(m,n){var l=e[m];if(n==undefined){return this.removeProperty(m);}if(l&&b[m]){n=!!n;}(l)?this[l]=n:this.setAttribute(m,""+n);
144
-return this;},setProperties:function(l){for(var m in l){this.setProperty(m,l[m]);}return this;},getProperty:function(m){var l=e[m];var n=(l)?this[l]:this.getAttribute(m,2);
145
-return(b[m])?!!n:(l)?n:n||null;},getProperties:function(){var l=$A(arguments);return l.map(this.getProperty,this).associate(l);},removeProperty:function(m){var l=e[m];
146
-(l)?this[l]=(l&&b[m])?false:"":this.removeAttribute(m);return this;},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this;
147
-},hasClass:function(l){return this.className.contains(l," ");},addClass:function(l){if(!this.hasClass(l)){this.className=(this.className+" "+l).clean();
148
-}return this;},removeClass:function(l){this.className=this.className.replace(new RegExp("(^|\\s)"+l+"(?:\\s|$)"),"$1");return this;},toggleClass:function(l){return this.hasClass(l)?this.removeClass(l):this.addClass(l);
149
-},adopt:function(){Array.flatten(arguments).each(function(l){l=document.id(l,true);if(l){this.appendChild(l);}},this);return this;},appendText:function(m,l){return this.grab(this.getDocument().newTextNode(m),l);
150
-},grab:function(m,l){a[l||"bottom"](document.id(m,true),this);return this;},inject:function(m,l){a[l||"bottom"](this,document.id(m,true));return this;},replaces:function(l){l=document.id(l,true);
151
-l.parentNode.replaceChild(this,l);return this;},wraps:function(m,l){m=document.id(m,true);return this.replaces(m).grab(m,l);},getPrevious:function(l,m){return j(this,"previousSibling",null,l,false,m);
152
-},getAllPrevious:function(l,m){return j(this,"previousSibling",null,l,true,m);},getNext:function(l,m){return j(this,"nextSibling",null,l,false,m);},getAllNext:function(l,m){return j(this,"nextSibling",null,l,true,m);
153
-},getFirst:function(l,m){return j(this,"nextSibling","firstChild",l,false,m);},getLast:function(l,m){return j(this,"previousSibling","lastChild",l,false,m);
154
-},getParent:function(l,m){return j(this,"parentNode",null,l,false,m);},getParents:function(l,m){return j(this,"parentNode",null,l,true,m);},getSiblings:function(l,m){return this.getParent().getChildren(l,m).erase(this);
155
-},getChildren:function(l,m){return j(this,"nextSibling","firstChild",l,true,m);},getWindow:function(){return this.ownerDocument.window;},getDocument:function(){return this.ownerDocument;
156
-},getElementById:function(o,n){var m=this.ownerDocument.getElementById(o);if(!m){return null;}for(var l=m.parentNode;l!=this;l=l.parentNode){if(!l){return null;
157
-}}return document.id(m,n);},getSelected:function(){return new Elements($A(this.options).filter(function(l){return l.selected;}));},getComputedStyle:function(m){if(this.currentStyle){return this.currentStyle[m.camelCase()];
158
-}var l=this.getDocument().defaultView.getComputedStyle(this,null);return(l)?l.getPropertyValue([m.hyphenate()]):null;},toQueryString:function(){var l=[];
159
-this.getElements("input, select, textarea",true).each(function(m){if(!m.name||m.disabled||m.type=="submit"||m.type=="reset"||m.type=="file"){return;}var n=(m.tagName.toLowerCase()=="select")?Element.getSelected(m).map(function(o){return o.value;
160
-}):((m.type=="radio"||m.type=="checkbox")&&!m.checked)?null:m.value;$splat(n).each(function(o){if(typeof o!="undefined"){l.push(m.name+"="+encodeURIComponent(o));
161
-}});});return l.join("&");},clone:function(o,l){o=o!==false;var r=this.cloneNode(o);var n=function(v,u){if(!l){v.removeAttribute("id");}if(Browser.Engine.trident){v.clearAttributes();
162
-v.mergeAttributes(u);v.removeAttribute("uid");if(v.options){var w=v.options,s=u.options;for(var t=w.length;t--;){w[t].selected=s[t].selected;}}}var x=i[u.tagName.toLowerCase()];
163
-if(x&&u[x]){v[x]=u[x];}};if(o){var p=r.getElementsByTagName("*"),q=this.getElementsByTagName("*");for(var m=p.length;m--;){n(p[m],q[m]);}}n(r,this);return document.id(r);
164
-},destroy:function(){Element.empty(this);Element.dispose(this);g(this,true);return null;},empty:function(){$A(this.childNodes).each(function(l){Element.destroy(l);
165
-});return this;},dispose:function(){return(this.parentNode)?this.parentNode.removeChild(this):this;},hasChild:function(l){l=document.id(l,true);if(!l){return false;
166
-}if(Browser.Engine.webkit&&Browser.Engine.version<420){return $A(this.getElementsByTagName(l.tagName)).contains(l);}return(this.contains)?(this!=l&&this.contains(l)):!!(this.compareDocumentPosition(l)&16);
167
-},match:function(l){return(!l||(l==this)||(Element.get(this,"tag")==l));}});Native.implement([Element,Window,Document],{addListener:function(o,n){if(o=="unload"){var l=n,m=this;
168
-n=function(){m.removeListener("unload",n);l();};}else{h[this.uid]=this;}if(this.addEventListener){this.addEventListener(o,n,false);}else{this.attachEvent("on"+o,n);
169
-}return this;},removeListener:function(m,l){if(this.removeEventListener){this.removeEventListener(m,l,false);}else{this.detachEvent("on"+m,l);}return this;
170
-},retrieve:function(m,l){var o=c(this.uid),n=o[m];if(l!=undefined&&n==undefined){n=o[m]=l;}return $pick(n);},store:function(m,l){var n=c(this.uid);n[m]=l;
171
-return this;},eliminate:function(l){var m=c(this.uid);delete m[l];return this;}});window.addListener("unload",d);})();Element.Properties=new Hash;Element.Properties.style={set:function(a){this.style.cssText=a;
172
-},get:function(){return this.style.cssText;},erase:function(){this.style.cssText="";}};Element.Properties.tag={get:function(){return this.tagName.toLowerCase();
173
-}};Element.Properties.html=(function(){var c=document.createElement("div");var a={table:[1,"<table>","</table>"],select:[1,"<select>","</select>"],tbody:[2,"<table><tbody>","</tbody></table>"],tr:[3,"<table><tbody><tr>","</tr></tbody></table>"]};
174
-a.thead=a.tfoot=a.tbody;var b={set:function(){var e=Array.flatten(arguments).join("");var f=Browser.Engine.trident&&a[this.get("tag")];if(f){var g=c;g.innerHTML=f[1]+e+f[2];
175
-for(var d=f[0];d--;){g=g.firstChild;}this.empty().adopt(g.childNodes);}else{this.innerHTML=e;}}};b.erase=b.set;return b;})();if(Browser.Engine.webkit&&Browser.Engine.version<420){Element.Properties.text={get:function(){if(this.innerText){return this.innerText;
176
-}var a=this.ownerDocument.newElement("div",{html:this.innerHTML}).inject(this.ownerDocument.body);var b=a.innerText;a.destroy();return b;}};}Element.Properties.events={set:function(a){this.addEvents(a);
177
-}};Native.implement([Element,Window,Document],{addEvent:function(e,g){var h=this.retrieve("events",{});h[e]=h[e]||{keys:[],values:[]};if(h[e].keys.contains(g)){return this;
178
-}h[e].keys.push(g);var f=e,a=Element.Events.get(e),c=g,i=this;if(a){if(a.onAdd){a.onAdd.call(this,g);}if(a.condition){c=function(j){if(a.condition.call(this,j)){return g.call(this,j);
179
-}return true;};}f=a.base||f;}var d=function(){return g.call(i);};var b=Element.NativeEvents[f];if(b){if(b==2){d=function(j){j=new Event(j,i.getWindow());
180
-if(c.call(i,j)===false){j.stop();}};}this.addListener(f,d);}h[e].values.push(d);return this;},removeEvent:function(c,b){var a=this.retrieve("events");if(!a||!a[c]){return this;
181
-}var f=a[c].keys.indexOf(b);if(f==-1){return this;}a[c].keys.splice(f,1);var e=a[c].values.splice(f,1)[0];var d=Element.Events.get(c);if(d){if(d.onRemove){d.onRemove.call(this,b);
182
-}c=d.base||c;}return(Element.NativeEvents[c])?this.removeListener(c,e):this;},addEvents:function(a){for(var b in a){this.addEvent(b,a[b]);}return this;
183
-},removeEvents:function(a){var c;if($type(a)=="object"){for(c in a){this.removeEvent(c,a[c]);}return this;}var b=this.retrieve("events");if(!b){return this;
184
-}if(!a){for(c in b){this.removeEvents(c);}this.eliminate("events");}else{if(b[a]){while(b[a].keys[0]){this.removeEvent(a,b[a].keys[0]);}b[a]=null;}}return this;
185
-},fireEvent:function(d,b,a){var c=this.retrieve("events");if(!c||!c[d]){return this;}c[d].keys.each(function(e){e.create({bind:this,delay:a,"arguments":b})();
186
-},this);return this;},cloneEvents:function(d,a){d=document.id(d);var c=d.retrieve("events");if(!c){return this;}if(!a){for(var b in c){this.cloneEvents(d,b);
187
-}}else{if(c[a]){c[a].keys.each(function(e){this.addEvent(a,e);},this);}}return this;}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,load:1,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1};
188
-(function(){var a=function(b){var c=b.relatedTarget;if(c==undefined){return true;}if(c===false){return false;}return($type(this)!="document"&&c!=this&&c.prefix!="xul"&&!this.hasChild(c));
189
-};Element.Events=new Hash({mouseenter:{base:"mouseover",condition:a},mouseleave:{base:"mouseout",condition:a},mousewheel:{base:(Browser.Engine.gecko)?"DOMMouseScroll":"mousewheel"}});
190
-})();Element.Properties.styles={set:function(a){this.setStyles(a);}};Element.Properties.opacity={set:function(a,b){if(!b){if(a==0){if(this.style.visibility!="hidden"){this.style.visibility="hidden";
191
-}}else{if(this.style.visibility!="visible"){this.style.visibility="visible";}}}if(!this.currentStyle||!this.currentStyle.hasLayout){this.style.zoom=1;}if(Browser.Engine.trident){this.style.filter=(a==1)?"":"alpha(opacity="+a*100+")";
192
-}this.style.opacity=a;this.store("opacity",a);},get:function(){return this.retrieve("opacity",1);}};Element.implement({setOpacity:function(a){return this.set("opacity",a,true);
193
-},getOpacity:function(){return this.get("opacity");},setStyle:function(b,a){switch(b){case"opacity":return this.set("opacity",parseFloat(a));case"float":b=(Browser.Engine.trident)?"styleFloat":"cssFloat";
194
-}b=b.camelCase();if($type(a)!="string"){var c=(Element.Styles.get(b)||"@").split(" ");a=$splat(a).map(function(e,d){if(!c[d]){return"";}return($type(e)=="number")?c[d].replace("@",Math.round(e)):e;
195
-}).join(" ");}else{if(a==String(Number(a))){a=Math.round(a);}}this.style[b]=a;return this;},getStyle:function(g){switch(g){case"opacity":return this.get("opacity");
196
-case"float":g=(Browser.Engine.trident)?"styleFloat":"cssFloat";}g=g.camelCase();var a=this.style[g];if(!$chk(a)){a=[];for(var f in Element.ShortStyles){if(g!=f){continue;
197
-}for(var e in Element.ShortStyles[f]){a.push(this.getStyle(e));}return a.join(" ");}a=this.getComputedStyle(g);}if(a){a=String(a);var c=a.match(/rgba?\([\d\s,]+\)/);
198
-if(c){a=a.replace(c[0],c[0].rgbToHex());}}if(Browser.Engine.presto||(Browser.Engine.trident&&!$chk(parseInt(a,10)))){if(g.test(/^(height|width)$/)){var b=(g=="width")?["left","right"]:["top","bottom"],d=0;
199
-b.each(function(h){d+=this.getStyle("border-"+h+"-width").toInt()+this.getStyle("padding-"+h).toInt();},this);return this["offset"+g.capitalize()]-d+"px";
200
-}if((Browser.Engine.presto)&&String(a).test("px")){return a;}if(g.test(/(border(.+)Width|margin|padding)/)){return"0px";}}return a;},setStyles:function(b){for(var a in b){this.setStyle(a,b[a]);
201
-}return this;},getStyles:function(){var a={};Array.flatten(arguments).each(function(b){a[b]=this.getStyle(b);},this);return a;}});Element.Styles=new Hash({left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"});
202
-Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};["Top","Right","Bottom","Left"].each(function(g){var f=Element.ShortStyles;
203
-var b=Element.Styles;["margin","padding"].each(function(h){var i=h+g;f[h][i]=b[i]="@px";});var e="border"+g;f.border[e]=b[e]="@px @ rgb(@, @, @)";var d=e+"Width",a=e+"Style",c=e+"Color";
204
-f[e]={};f.borderWidth[d]=f[e][d]=b[d]="@px";f.borderStyle[a]=f[e][a]=b[a]="@";f.borderColor[c]=f[e][c]=b[c]="rgb(@, @, @)";});(function(){Element.implement({scrollTo:function(h,i){if(b(this)){this.getWindow().scrollTo(h,i);
205
-}else{this.scrollLeft=h;this.scrollTop=i;}return this;},getSize:function(){if(b(this)){return this.getWindow().getSize();}return{x:this.offsetWidth,y:this.offsetHeight};
206
-},getScrollSize:function(){if(b(this)){return this.getWindow().getScrollSize();}return{x:this.scrollWidth,y:this.scrollHeight};},getScroll:function(){if(b(this)){return this.getWindow().getScroll();
207
-}return{x:this.scrollLeft,y:this.scrollTop};},getScrolls:function(){var i=this,h={x:0,y:0};while(i&&!b(i)){h.x+=i.scrollLeft;h.y+=i.scrollTop;i=i.parentNode;
208
-}return h;},getOffsetParent:function(){var h=this;if(b(h)){return null;}if(!Browser.Engine.trident){return h.offsetParent;}while((h=h.parentNode)&&!b(h)){if(d(h,"position")!="static"){return h;
209
-}}return null;},getOffsets:function(){if(this.getBoundingClientRect){var m=this.getBoundingClientRect(),k=document.id(this.getDocument().documentElement),i=k.getScroll(),n=(d(this,"position")=="fixed");
210
-return{x:parseInt(m.left,10)+((n)?0:i.x)-k.clientLeft,y:parseInt(m.top,10)+((n)?0:i.y)-k.clientTop};}var j=this,h={x:0,y:0};if(b(this)){return h;}while(j&&!b(j)){h.x+=j.offsetLeft;
211
-h.y+=j.offsetTop;if(Browser.Engine.gecko){if(!f(j)){h.x+=c(j);h.y+=g(j);}var l=j.parentNode;if(l&&d(l,"overflow")!="visible"){h.x+=c(l);h.y+=g(l);}}else{if(j!=this&&Browser.Engine.webkit){h.x+=c(j);
212
-h.y+=g(j);}}j=j.offsetParent;}if(Browser.Engine.gecko&&!f(this)){h.x-=c(this);h.y-=g(this);}return h;},getPosition:function(k){if(b(this)){return{x:0,y:0};
213
-}var l=this.getOffsets(),i=this.getScrolls();var h={x:l.x-i.x,y:l.y-i.y};var j=(k&&(k=document.id(k)))?k.getPosition():{x:0,y:0};return{x:h.x-j.x,y:h.y-j.y};
214
-},getCoordinates:function(j){if(b(this)){return this.getWindow().getCoordinates();}var h=this.getPosition(j),i=this.getSize();var k={left:h.x,top:h.y,width:i.x,height:i.y};
215
-k.right=k.left+k.width;k.bottom=k.top+k.height;return k;},computePosition:function(h){return{left:h.x-e(this,"margin-left"),top:h.y-e(this,"margin-top")};
216
-},setPosition:function(h){return this.setStyles(this.computePosition(h));}});Native.implement([Document,Window],{getSize:function(){if(Browser.Engine.presto||Browser.Engine.webkit){var i=this.getWindow();
217
-return{x:i.innerWidth,y:i.innerHeight};}var h=a(this);return{x:h.clientWidth,y:h.clientHeight};},getScroll:function(){var i=this.getWindow(),h=a(this);
218
-return{x:i.pageXOffset||h.scrollLeft,y:i.pageYOffset||h.scrollTop};},getScrollSize:function(){var i=a(this),h=this.getSize();return{x:Math.max(i.scrollWidth,h.x),y:Math.max(i.scrollHeight,h.y)};
219
-},getPosition:function(){return{x:0,y:0};},getCoordinates:function(){var h=this.getSize();return{top:0,left:0,bottom:h.y,right:h.x,height:h.y,width:h.x};
220
-}});var d=Element.getComputedStyle;function e(h,i){return d(h,i).toInt()||0;}function f(h){return d(h,"-moz-box-sizing")=="border-box";}function g(h){return e(h,"border-top-width");
221
-}function c(h){return e(h,"border-left-width");}function b(h){return(/^(?:body|html)$/i).test(h.tagName);}function a(h){var i=h.getDocument();return(!i.compatMode||i.compatMode=="CSS1Compat")?i.html:i.body;
222
-}})();Element.alias("setPosition","position");Native.implement([Window,Document,Element],{getHeight:function(){return this.getSize().y;},getWidth:function(){return this.getSize().x;
223
-},getScrollTop:function(){return this.getScroll().y;},getScrollLeft:function(){return this.getScroll().x;},getScrollHeight:function(){return this.getScrollSize().y;
224
-},getScrollWidth:function(){return this.getScrollSize().x;},getTop:function(){return this.getPosition().y;},getLeft:function(){return this.getPosition().x;
225
-}});Native.implement([Document,Element],{getElements:function(h,g){h=h.split(",");var c,e={};for(var d=0,b=h.length;d<b;d++){var a=h[d],f=Selectors.Utils.search(this,a,e);
226
-if(d!=0&&f.item){f=$A(f);}c=(d==0)?f:(c.item)?$A(c).concat(f):c.concat(f);}return new Elements(c,{ddup:(h.length>1),cash:!g});}});Element.implement({match:function(b){if(!b||(b==this)){return true;
227
-}var d=Selectors.Utils.parseTagAndID(b);var a=d[0],e=d[1];if(!Selectors.Filters.byID(this,e)||!Selectors.Filters.byTag(this,a)){return false;}var c=Selectors.Utils.parseSelector(b);
228
-return(c)?Selectors.Utils.filter(this,c,{}):true;}});var Selectors={Cache:{nth:{},parsed:{}}};Selectors.RegExps={id:(/#([\w-]+)/),tag:(/^(\w+|\*)/),quick:(/^(\w+|\*)$/),splitter:(/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g),combined:(/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)(["']?)([^\4]*?)\4)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g)};
229
-Selectors.Utils={chk:function(b,c){if(!c){return true;}var a=$uid(b);if(!c[a]){return c[a]=true;}return false;},parseNthArgument:function(h){if(Selectors.Cache.nth[h]){return Selectors.Cache.nth[h];
230
-}var e=h.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/);if(!e){return false;}var g=parseInt(e[1],10);var d=(g||g===0)?g:1;var f=e[2]||false;var c=parseInt(e[3],10)||0;
231
-if(d!=0){c--;while(c<1){c+=d;}while(c>=d){c-=d;}}else{d=c;f="index";}switch(f){case"n":e={a:d,b:c,special:"n"};break;case"odd":e={a:2,b:0,special:"n"};
232
-break;case"even":e={a:2,b:1,special:"n"};break;case"first":e={a:0,special:"index"};break;case"last":e={special:"last-child"};break;case"only":e={special:"only-child"};
233
-break;default:e={a:(d-1),special:"index"};}return Selectors.Cache.nth[h]=e;},parseSelector:function(e){if(Selectors.Cache.parsed[e]){return Selectors.Cache.parsed[e];
234
-}var d,h={classes:[],pseudos:[],attributes:[]};while((d=Selectors.RegExps.combined.exec(e))){var i=d[1],g=d[2],f=d[3],b=d[5],c=d[6],j=d[7];if(i){h.classes.push(i);
235
-}else{if(c){var a=Selectors.Pseudo.get(c);if(a){h.pseudos.push({parser:a,argument:j});}else{h.attributes.push({name:c,operator:"=",value:j});}}else{if(g){h.attributes.push({name:g,operator:f,value:b});
236
-}}}}if(!h.classes.length){delete h.classes;}if(!h.attributes.length){delete h.attributes;}if(!h.pseudos.length){delete h.pseudos;}if(!h.classes&&!h.attributes&&!h.pseudos){h=null;
237
-}return Selectors.Cache.parsed[e]=h;},parseTagAndID:function(b){var a=b.match(Selectors.RegExps.tag);var c=b.match(Selectors.RegExps.id);return[(a)?a[1]:"*",(c)?c[1]:false];
238
-},filter:function(f,c,e){var d;if(c.classes){for(d=c.classes.length;d--;d){var g=c.classes[d];if(!Selectors.Filters.byClass(f,g)){return false;}}}if(c.attributes){for(d=c.attributes.length;
239
-d--;d){var b=c.attributes[d];if(!Selectors.Filters.byAttribute(f,b.name,b.operator,b.value)){return false;}}}if(c.pseudos){for(d=c.pseudos.length;d--;d){var a=c.pseudos[d];
240
-if(!Selectors.Filters.byPseudo(f,a.parser,a.argument,e)){return false;}}}return true;},getByTagAndID:function(b,a,d){if(d){var c=(b.getElementById)?b.getElementById(d,true):Element.getElementById(b,d,true);
241
-return(c&&Selectors.Filters.byTag(c,a))?[c]:[];}else{return b.getElementsByTagName(a);}},search:function(o,h,t){var b=[];var c=h.trim().replace(Selectors.RegExps.splitter,function(k,j,i){b.push(j);
242
-return":)"+i;}).split(":)");var p,e,A;for(var z=0,v=c.length;z<v;z++){var y=c[z];if(z==0&&Selectors.RegExps.quick.test(y)){p=o.getElementsByTagName(y);
243
-continue;}var a=b[z-1];var q=Selectors.Utils.parseTagAndID(y);var B=q[0],r=q[1];if(z==0){p=Selectors.Utils.getByTagAndID(o,B,r);}else{var d={},g=[];for(var x=0,w=p.length;
244
-x<w;x++){g=Selectors.Getters[a](g,p[x],B,r,d);}p=g;}var f=Selectors.Utils.parseSelector(y);if(f){e=[];for(var u=0,s=p.length;u<s;u++){A=p[u];if(Selectors.Utils.filter(A,f,t)){e.push(A);
245
-}}p=e;}}return p;}};Selectors.Getters={" ":function(h,g,j,a,e){var d=Selectors.Utils.getByTagAndID(g,j,a);for(var c=0,b=d.length;c<b;c++){var f=d[c];if(Selectors.Utils.chk(f,e)){h.push(f);
246
-}}return h;},">":function(h,g,j,a,f){var c=Selectors.Utils.getByTagAndID(g,j,a);for(var e=0,d=c.length;e<d;e++){var b=c[e];if(b.parentNode==g&&Selectors.Utils.chk(b,f)){h.push(b);
247
-}}return h;},"+":function(c,b,a,e,d){while((b=b.nextSibling)){if(b.nodeType==1){if(Selectors.Utils.chk(b,d)&&Selectors.Filters.byTag(b,a)&&Selectors.Filters.byID(b,e)){c.push(b);
248
-}break;}}return c;},"~":function(c,b,a,e,d){while((b=b.nextSibling)){if(b.nodeType==1){if(!Selectors.Utils.chk(b,d)){break;}if(Selectors.Filters.byTag(b,a)&&Selectors.Filters.byID(b,e)){c.push(b);
249
-}}}return c;}};Selectors.Filters={byTag:function(b,a){return(a=="*"||(b.tagName&&b.tagName.toLowerCase()==a));},byID:function(a,b){return(!b||(a.id&&a.id==b));
250
-},byClass:function(b,a){return(b.className&&b.className.contains(a," "));},byPseudo:function(a,d,c,b){return d.call(a,c,b);},byAttribute:function(c,d,b,e){var a=Element.prototype.getProperty.call(c,d);
251
-if(!a){return(b=="!=");}if(!b||e==undefined){return true;}switch(b){case"=":return(a==e);case"*=":return(a.contains(e));case"^=":return(a.substr(0,e.length)==e);
252
-case"$=":return(a.substr(a.length-e.length)==e);case"!=":return(a!=e);case"~=":return a.contains(e," ");case"|=":return a.contains(e,"-");}return false;
253
-}};Selectors.Pseudo=new Hash({checked:function(){return this.checked;},empty:function(){return !(this.innerText||this.textContent||"").length;},not:function(a){return !Element.match(this,a);
254
-},contains:function(a){return(this.innerText||this.textContent||"").contains(a);},"first-child":function(){return Selectors.Pseudo.index.call(this,0);},"last-child":function(){var a=this;
255
-while((a=a.nextSibling)){if(a.nodeType==1){return false;}}return true;},"only-child":function(){var b=this;while((b=b.previousSibling)){if(b.nodeType==1){return false;
256
-}}var a=this;while((a=a.nextSibling)){if(a.nodeType==1){return false;}}return true;},"nth-child":function(g,e){g=(g==undefined)?"n":g;var c=Selectors.Utils.parseNthArgument(g);
257
-if(c.special!="n"){return Selectors.Pseudo[c.special].call(this,c.a,e);}var f=0;e.positions=e.positions||{};var d=$uid(this);if(!e.positions[d]){var b=this;
258
-while((b=b.previousSibling)){if(b.nodeType!=1){continue;}f++;var a=e.positions[$uid(b)];if(a!=undefined){f=a+f;break;}}e.positions[d]=f;}return(e.positions[d]%c.a==c.b);
259
-},index:function(a){var b=this,c=0;while((b=b.previousSibling)){if(b.nodeType==1&&++c>a){return false;}}return(c==a);},even:function(b,a){return Selectors.Pseudo["nth-child"].call(this,"2n+1",a);
260
-},odd:function(b,a){return Selectors.Pseudo["nth-child"].call(this,"2n",a);},selected:function(){return this.selected;},enabled:function(){return(this.disabled===false);
261
-}});Element.Events.domready={onAdd:function(a){if(Browser.loaded){a.call(this);}}};(function(){var b=function(){if(Browser.loaded){return;}Browser.loaded=true;
262
-window.fireEvent("domready");document.fireEvent("domready");};if(Browser.Engine.trident){var a=document.createElement("div");(function(){($try(function(){a.doScroll();
263
-return document.id(a).inject(document.body).set("html","temp").dispose();}))?b():arguments.callee.delay(50);})();}else{if(Browser.Engine.webkit&&Browser.Engine.version<525){(function(){(["loaded","complete"].contains(document.readyState))?b():arguments.callee.delay(50);
264
-})();}else{window.addEvent("load",b);document.addEvent("DOMContentLoaded",b);}}})();var JSON=new Hash({$specialChars:{"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},$replaceChars:function(a){return JSON.$specialChars[a]||"\\u00"+Math.floor(a.charCodeAt()/16).toString(16)+(a.charCodeAt()%16).toString(16);
265
-},encode:function(b){switch($type(b)){case"string":return'"'+b.replace(/[\x00-\x1f\\"]/g,JSON.$replaceChars)+'"';case"array":return"["+String(b.map(JSON.encode).clean())+"]";
266
-case"object":case"hash":var a=[];Hash.each(b,function(e,d){var c=JSON.encode(e);if(c){a.push(JSON.encode(d)+":"+c);}});return"{"+a+"}";case"number":case"boolean":return String(b);
267
-case false:return"null";}return null;},decode:function(string,secure){if($type(string)!="string"||!string.length){return null;}if(secure&&!(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,""))){return null;
268
-}return eval("("+string+")");}});Native.implement([Hash,Array,String,Number],{toJSON:function(){return JSON.encode(this);}});var Cookie=new Class({Implements:Options,options:{path:false,domain:false,duration:false,secure:false,document:document},initialize:function(b,a){this.key=b;
269
-this.setOptions(a);},write:function(b){b=encodeURIComponent(b);if(this.options.domain){b+="; domain="+this.options.domain;}if(this.options.path){b+="; path="+this.options.path;
270
-}if(this.options.duration){var a=new Date();a.setTime(a.getTime()+this.options.duration*24*60*60*1000);b+="; expires="+a.toGMTString();}if(this.options.secure){b+="; secure";
271
-}this.options.document.cookie=this.key+"="+b;return this;},read:function(){var a=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)");
272
-return(a)?decodeURIComponent(a[1]):null;},dispose:function(){new Cookie(this.key,$merge(this.options,{duration:-1})).write("");return this;}});Cookie.write=function(b,c,a){return new Cookie(b,a).write(c);
273
-};Cookie.read=function(a){return new Cookie(a).read();};Cookie.dispose=function(b,a){return new Cookie(b,a).dispose();};var Swiff=new Class({Implements:[Options],options:{id:null,height:1,width:1,container:null,properties:{},params:{quality:"high",allowScriptAccess:"always",wMode:"transparent",swLiveConnect:true},callBacks:{},vars:{}},toElement:function(){return this.object;
274
-},initialize:function(l,m){this.instance="Swiff_"+$time();this.setOptions(m);m=this.options;var b=this.id=m.id||this.instance;var a=document.id(m.container);
275
-Swiff.CallBacks[this.instance]={};var e=m.params,g=m.vars,f=m.callBacks;var h=$extend({height:m.height,width:m.width},m.properties);var k=this;for(var d in f){Swiff.CallBacks[this.instance][d]=(function(n){return function(){return n.apply(k.object,arguments);
276
-};})(f[d]);g[d]="Swiff.CallBacks."+this.instance+"."+d;}e.flashVars=Hash.toQueryString(g);if(Browser.Engine.trident){h.classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000";
277
-e.movie=l;}else{h.type="application/x-shockwave-flash";h.data=l;}var j='<object id="'+b+'"';for(var i in h){j+=" "+i+'="'+h[i]+'"';}j+=">";for(var c in e){if(e[c]){j+='<param name="'+c+'" value="'+e[c]+'" />';
278
-}}j+="</object>";this.object=((a)?a.empty():new Element("div")).set("html",j).firstChild;},replaces:function(a){a=document.id(a,true);a.parentNode.replaceChild(this.toElement(),a);
279
-return this;},inject:function(a){document.id(a,true).appendChild(this.toElement());return this;},remote:function(){return Swiff.remote.apply(Swiff,[this.toElement()].extend(arguments));
280
-}});Swiff.CallBacks={};Swiff.remote=function(obj,fn){var rs=obj.CallFunction('<invoke name="'+fn+'" returntype="javascript">'+__flash__argumentsToXML(arguments,2)+"</invoke>");
281
-return eval(rs);};var Fx=new Class({Implements:[Chain,Events,Options],options:{fps:50,unit:false,duration:500,link:"ignore"},initialize:function(a){this.subject=this.subject||this;
282
-this.setOptions(a);this.options.duration=Fx.Durations[this.options.duration]||this.options.duration.toInt();var b=this.options.wait;if(b===false){this.options.link="cancel";
283
-}},getTransition:function(){return function(a){return -(Math.cos(Math.PI*a)-1)/2;};},step:function(){var a=$time();if(a<this.time+this.options.duration){var b=this.transition((a-this.time)/this.options.duration);
284
-this.set(this.compute(this.from,this.to,b));}else{this.set(this.compute(this.from,this.to,1));this.complete();}},set:function(a){return a;},compute:function(c,b,a){return Fx.compute(c,b,a);
285
-},check:function(){if(!this.timer){return true;}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.bind(this,arguments));
286
-return false;}return false;},start:function(b,a){if(!this.check(b,a)){return this;}this.from=b;this.to=a;this.time=0;this.transition=this.getTransition();
287
-this.startTimer();this.onStart();return this;},complete:function(){if(this.stopTimer()){this.onComplete();}return this;},cancel:function(){if(this.stopTimer()){this.onCancel();
288
-}return this;},onStart:function(){this.fireEvent("start",this.subject);},onComplete:function(){this.fireEvent("complete",this.subject);if(!this.callChain()){this.fireEvent("chainComplete",this.subject);
289
-}},onCancel:function(){this.fireEvent("cancel",this.subject).clearChain();},pause:function(){this.stopTimer();return this;},resume:function(){this.startTimer();
290
-return this;},stopTimer:function(){if(!this.timer){return false;}this.time=$time()-this.time;this.timer=$clear(this.timer);return true;},startTimer:function(){if(this.timer){return false;
291
-}this.time=$time()-this.time;this.timer=this.step.periodical(Math.round(1000/this.options.fps),this);return true;}});Fx.compute=function(c,b,a){return(b-c)*a+c;
292
-};Fx.Durations={"short":250,normal:500,"long":1000};Fx.CSS=new Class({Extends:Fx,prepare:function(d,e,b){b=$splat(b);var c=b[1];if(!$chk(c)){b[1]=b[0];
293
-b[0]=d.getStyle(e);}var a=b.map(this.parse);return{from:a[0],to:a[1]};},parse:function(a){a=$lambda(a)();a=(typeof a=="string")?a.split(" "):$splat(a);
294
-return a.map(function(c){c=String(c);var b=false;Fx.CSS.Parsers.each(function(f,e){if(b){return;}var d=f.parse(c);if($chk(d)){b={value:d,parser:f};}});
295
-b=b||{value:c,parser:Fx.CSS.Parsers.String};return b;});},compute:function(d,c,b){var a=[];(Math.min(d.length,c.length)).times(function(e){a.push({value:d[e].parser.compute(d[e].value,c[e].value,b),parser:d[e].parser});
296
-});a.$family={name:"fx:css:value"};return a;},serve:function(c,b){if($type(c)!="fx:css:value"){c=this.parse(c);}var a=[];c.each(function(d){a=a.concat(d.parser.serve(d.value,b));
297
-});return a;},render:function(a,d,c,b){a.setStyle(d,this.serve(c,b));},search:function(a){if(Fx.CSS.Cache[a]){return Fx.CSS.Cache[a];}var b={};Array.each(document.styleSheets,function(e,d){var c=e.href;
298
-if(c&&c.contains("://")&&!c.contains(document.domain)){return;}var f=e.rules||e.cssRules;Array.each(f,function(j,g){if(!j.style){return;}var h=(j.selectorText)?j.selectorText.replace(/^\w+/,function(i){return i.toLowerCase();
299
-}):null;if(!h||!h.test("^"+a+"$")){return;}Element.Styles.each(function(k,i){if(!j.style[i]||Element.ShortStyles[i]){return;}k=String(j.style[i]);b[i]=(k.test(/^rgb/))?k.rgbToHex():k;
300
-});});});return Fx.CSS.Cache[a]=b;}});Fx.CSS.Cache={};Fx.CSS.Parsers=new Hash({Color:{parse:function(a){if(a.match(/^#[0-9a-f]{3,6}$/i)){return a.hexToRgb(true);
301
-}return((a=a.match(/(\d+),\s*(\d+),\s*(\d+)/)))?[a[1],a[2],a[3]]:false;},compute:function(c,b,a){return c.map(function(e,d){return Math.round(Fx.compute(c[d],b[d],a));
302
-});},serve:function(a){return a.map(Number);}},Number:{parse:parseFloat,compute:Fx.compute,serve:function(b,a){return(a)?b+a:b;}},String:{parse:$lambda(false),compute:$arguments(1),serve:$arguments(0)}});
303
-Fx.Tween=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a);},set:function(b,a){if(arguments.length==1){a=b;
304
-b=this.property||this.options.property;}this.render(this.element,b,a,this.options.unit);return this;},start:function(c,e,d){if(!this.check(c,e,d)){return this;
305
-}var b=Array.flatten(arguments);this.property=this.options.property||b.shift();var a=this.prepare(this.element,this.property,b);return this.parent(a.from,a.to);
306
-}});Element.Properties.tween={set:function(a){var b=this.retrieve("tween");if(b){b.cancel();}return this.eliminate("tween").store("tween:options",$extend({link:"cancel"},a));
307
-},get:function(a){if(a||!this.retrieve("tween")){if(a||!this.retrieve("tween:options")){this.set("tween",a);}this.store("tween",new Fx.Tween(this,this.retrieve("tween:options")));
308
-}return this.retrieve("tween");}};Element.implement({tween:function(a,c,b){this.get("tween").start(arguments);return this;},fade:function(c){var e=this.get("tween"),d="opacity",a;
309
-c=$pick(c,"toggle");switch(c){case"in":e.start(d,1);break;case"out":e.start(d,0);break;case"show":e.set(d,1);break;case"hide":e.set(d,0);break;case"toggle":var b=this.retrieve("fade:flag",this.get("opacity")==1);
310
-e.start(d,(b)?0:1);this.store("fade:flag",!b);a=true;break;default:e.start(d,arguments);}if(!a){this.eliminate("fade:flag");}return this;},highlight:function(c,a){if(!a){a=this.retrieve("highlight:original",this.getStyle("background-color"));
311
-a=(a=="transparent")?"#fff":a;}var b=this.get("tween");b.start("background-color",c||"#ffff88",a).chain(function(){this.setStyle("background-color",this.retrieve("highlight:original"));
312
-b.callChain();}.bind(this));return this;}});Fx.Morph=new Class({Extends:Fx.CSS,initialize:function(b,a){this.element=this.subject=document.id(b);this.parent(a);
313
-},set:function(a){if(typeof a=="string"){a=this.search(a);}for(var b in a){this.render(this.element,b,a[b],this.options.unit);}return this;},compute:function(e,d,c){var a={};
314
-for(var b in e){a[b]=this.parent(e[b],d[b],c);}return a;},start:function(b){if(!this.check(b)){return this;}if(typeof b=="string"){b=this.search(b);}var e={},d={};
315
-for(var c in b){var a=this.prepare(this.element,c,b[c]);e[c]=a.from;d[c]=a.to;}return this.parent(e,d);}});Element.Properties.morph={set:function(a){var b=this.retrieve("morph");
316
-if(b){b.cancel();}return this.eliminate("morph").store("morph:options",$extend({link:"cancel"},a));},get:function(a){if(a||!this.retrieve("morph")){if(a||!this.retrieve("morph:options")){this.set("morph",a);
317
-}this.store("morph",new Fx.Morph(this,this.retrieve("morph:options")));}return this.retrieve("morph");}};Element.implement({morph:function(a){this.get("morph").start(a);
318
-return this;}});Fx.implement({getTransition:function(){var a=this.options.transition||Fx.Transitions.Sine.easeInOut;if(typeof a=="string"){var b=a.split(":");
319
-a=Fx.Transitions;a=a[b[0]]||a[b[0].capitalize()];if(b[1]){a=a["ease"+b[1].capitalize()+(b[2]?b[2].capitalize():"")];}}return a;}});Fx.Transition=function(b,a){a=$splat(a);
320
-return $extend(b,{easeIn:function(c){return b(c,a);},easeOut:function(c){return 1-b(1-c,a);},easeInOut:function(c){return(c<=0.5)?b(2*c,a)/2:(2-b(2*(1-c),a))/2;
321
-}});};Fx.Transitions=new Hash({linear:$arguments(0)});Fx.Transitions.extend=function(a){for(var b in a){Fx.Transitions[b]=new Fx.Transition(a[b]);}};Fx.Transitions.extend({Pow:function(b,a){return Math.pow(b,a[0]||6);
322
-},Expo:function(a){return Math.pow(2,8*(a-1));},Circ:function(a){return 1-Math.sin(Math.acos(a));},Sine:function(a){return 1-Math.sin((1-a)*Math.PI/2);
323
-},Back:function(b,a){a=a[0]||1.618;return Math.pow(b,2)*((a+1)*b-a);},Bounce:function(f){var e;for(var d=0,c=1;1;d+=c,c/=2){if(f>=(7-4*d)/11){e=c*c-Math.pow((11-6*d-11*f)/4,2);
324
-break;}}return e;},Elastic:function(b,a){return Math.pow(2,10*--b)*Math.cos(20*b*Math.PI*(a[0]||1)/3);}});["Quad","Cubic","Quart","Quint"].each(function(b,a){Fx.Transitions[b]=new Fx.Transition(function(c){return Math.pow(c,[a+2]);
325
-});});var Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false,noCache:false},initialize:function(a){this.xhr=new Browser.Request();
326
-this.setOptions(a);this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.headers=new Hash(this.options.headers);},onStateChange:function(){if(this.xhr.readyState!=4||!this.running){return;
327
-}this.running=false;this.status=0;$try(function(){this.status=this.xhr.status;}.bind(this));this.xhr.onreadystatechange=$empty;if(this.options.isSuccess.call(this,this.status)){this.response={text:this.xhr.responseText,xml:this.xhr.responseXML};
328
-this.success(this.response.text,this.response.xml);}else{this.response={text:null,xml:null};this.failure();}},isSuccess:function(){return((this.status>=200)&&(this.status<300));
329
-},processScripts:function(a){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return $exec(a);}return a.stripScripts(this.options.evalScripts);
330
-},success:function(b,a){this.onSuccess(this.processScripts(b),a);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain();
331
-},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},setHeader:function(a,b){this.headers.set(a,b);
332
-return this;},getHeader:function(a){return $try(function(){return this.xhr.getResponseHeader(a);}.bind(this));},check:function(){if(!this.running){return true;
333
-}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.bind(this,arguments));return false;}return false;},send:function(k){if(!this.check(k)){return this;
334
-}this.running=true;var i=$type(k);if(i=="string"||i=="element"){k={data:k};}var d=this.options;k=$extend({data:d.data,url:d.url,method:d.method},k);var g=k.data,b=k.url,a=k.method.toLowerCase();
335
-switch($type(g)){case"element":g=document.id(g).toQueryString();break;case"object":case"hash":g=Hash.toQueryString(g);}if(this.options.format){var j="format="+this.options.format;
336
-g=(g)?j+"&"+g:j;}if(this.options.emulation&&!["get","post"].contains(a)){var h="_method="+a;g=(g)?h+"&"+g:h;a="post";}if(this.options.urlEncoded&&a=="post"){var c=(this.options.encoding)?"; charset="+this.options.encoding:"";
337
-this.headers.set("Content-type","application/x-www-form-urlencoded"+c);}if(this.options.noCache){var f="noCache="+new Date().getTime();g=(g)?f+"&"+g:f;
338
-}var e=b.lastIndexOf("/");if(e>-1&&(e=b.indexOf("#"))>-1){b=b.substr(0,e);}if(g&&a=="get"){b=b+(b.contains("?")?"&":"?")+g;g=null;}this.xhr.open(a.toUpperCase(),b,this.options.async);
339
-this.xhr.onreadystatechange=this.onStateChange.bind(this);this.headers.each(function(m,l){try{this.xhr.setRequestHeader(l,m);}catch(n){this.fireEvent("exception",[l,m]);
340
-}},this);this.fireEvent("request");this.xhr.send(g);if(!this.options.async){this.onStateChange();}return this;},cancel:function(){if(!this.running){return this;
341
-}this.running=false;this.xhr.abort();this.xhr.onreadystatechange=$empty;this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});(function(){var a={};
342
-["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(b){a[b]=function(){var c=Array.link(arguments,{url:String.type,data:$defined});
343
-return this.send($extend(c,{method:b}));};});Request.implement(a);})();Element.Properties.send={set:function(a){var b=this.retrieve("send");if(b){b.cancel();
344
-}return this.eliminate("send").store("send:options",$extend({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")},a));},get:function(a){if(a||!this.retrieve("send")){if(a||!this.retrieve("send:options")){this.set("send",a);
345
-}this.store("send",new Request(this.retrieve("send:options")));}return this.retrieve("send");}};Element.implement({send:function(a){var b=this.get("send");
346
-b.send({data:this,url:a||b.options.url});return this;}});Request.HTML=new Class({Extends:Request,options:{update:false,append:false,evalScripts:true,filter:false},processHTML:function(c){var b=c.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
347
-c=(b)?b[1]:c;var a=new Element("div");return $try(function(){var d="<root>"+c+"</root>",g;if(Browser.Engine.trident){g=new ActiveXObject("Microsoft.XMLDOM");
348
-g.async=false;g.loadXML(d);}else{g=new DOMParser().parseFromString(d,"text/xml");}d=g.getElementsByTagName("root")[0];if(!d){return null;}for(var f=0,e=d.childNodes.length;
349
-f<e;f++){var h=Element.clone(d.childNodes[f],true,true);if(h){a.grab(h);}}return a;})||a.set("html",c);},success:function(d){var c=this.options,b=this.response;
350
-b.html=d.stripScripts(function(e){b.javascript=e;});var a=this.processHTML(b.html);b.tree=a.childNodes;b.elements=a.getElements("*");if(c.filter){b.tree=b.elements.filter(c.filter);
351
-}if(c.update){document.id(c.update).empty().set("html",b.html);}else{if(c.append){document.id(c.append).adopt(a.getChildren());}}if(c.evalScripts){$exec(b.javascript);
352
-}this.onSuccess(b.tree,b.elements,b.html,b.javascript);}});Element.Properties.load={set:function(a){var b=this.retrieve("load");if(b){b.cancel();}return this.eliminate("load").store("load:options",$extend({data:this,link:"cancel",update:this,method:"get"},a));
353
-},get:function(a){if(a||!this.retrieve("load")){if(a||!this.retrieve("load:options")){this.set("load",a);}this.store("load",new Request.HTML(this.retrieve("load:options")));
354
-}return this.retrieve("load");}};Element.implement({load:function(){this.get("load").send(Array.link(arguments,{data:Object.type,url:String.type}));return this;
355
-}});Request.JSON=new Class({Extends:Request,options:{secure:true},initialize:function(a){this.parent(a);this.headers.extend({Accept:"application/json","X-Request":"JSON"});
356
-},success:function(a){this.response.json=JSON.decode(a,this.options.secure);this.onSuccess(this.response.json,a);}});
357 1
\ No newline at end of file
2
+/*
3
+---
4
+MooTools: the javascript framework
5
+
6
+web build:
7
+ - http://mootools.net/core/7c56cfef9dddcf170a5d68e3fb61cfd7
8
+
9
+packager build:
10
+ - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady Core/Swiff
11
+
12
+/*
13
+---
14
+
15
+name: Core
16
+
17
+description: The heart of MooTools.
18
+
19
+license: MIT-style license.
20
+
21
+copyright: Copyright (c) 2006-2010 [Valerio Proietti](http://mad4milk.net/).
22
+
23
+authors: The MooTools production team (http://mootools.net/developers/)
24
+
25
+inspiration:
26
+  - Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php)
27
+  - Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php)
28
+
29
+provides: [Core, MooTools, Type, typeOf, instanceOf, Native]
30
+
31
+...
32
+*/
33
+
34
+(function(){
35
+
36
+this.MooTools = {
37
+	version: '1.3.1',
38
+	build: 'af48c8d589f43f32212f9bb8ff68a127e6a3ba6c'
39
+};
40
+
41
+// typeOf, instanceOf
42
+
43
+var typeOf = this.typeOf = function(item){
44
+	if (item == null) return 'null';
45
+	if (item.$family) return item.$family();
46
+
47
+	if (item.nodeName){
48
+		if (item.nodeType == 1) return 'element';
49
+		if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? 'textnode' : 'whitespace';
50
+	} else if (typeof item.length == 'number'){
51
+		if (item.callee) return 'arguments';
52
+		if ('item' in item) return 'collection';
53
+	}
54
+
55
+	return typeof item;
56
+};
57
+
58
+var instanceOf = this.instanceOf = function(item, object){
59
+	if (item == null) return false;
60
+	var constructor = item.$constructor || item.constructor;
61
+	while (constructor){
62
+		if (constructor === object) return true;
63
+		constructor = constructor.parent;
64
+	}
65
+	return item instanceof object;
66
+};
67
+
68
+// Function overloading
69
+
70
+var Function = this.Function;
71
+
72
+var enumerables = true;
73
+for (var i in {toString: 1}) enumerables = null;
74
+if (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor'];
75
+
76
+Function.prototype.overloadSetter = function(usePlural){
77
+	var self = this;
78
+	return function(a, b){
79
+		if (a == null) return this;
80
+		if (usePlural || typeof a != 'string'){
81
+			for (var k in a) self.call(this, k, a[k]);
82
+			if (enumerables) for (var i = enumerables.length; i--;){
83
+				k = enumerables[i];
84
+				if (a.hasOwnProperty(k)) self.call(this, k, a[k]);
85
+			}
86
+		} else {
87
+			self.call(this, a, b);
88
+		}
89
+		return this;
90
+	};
91
+};
92
+
93
+Function.prototype.overloadGetter = function(usePlural){
94
+	var self = this;
95
+	return function(a){
96
+		var args, result;
97
+		if (usePlural || typeof a != 'string') args = a;
98
+		else if (arguments.length > 1) args = arguments;
99
+		if (args){
100
+			result = {};
101
+			for (var i = 0; i < args.length; i++) result[args[i]] = self.call(this, args[i]);
102
+		} else {
103
+			result = self.call(this, a);
104
+		}
105
+		return result;
106
+	};
107
+};
108
+
109
+Function.prototype.extend = function(key, value){
110
+	this[key] = value;
111
+}.overloadSetter();
112
+
113
+Function.prototype.implement = function(key, value){
114
+	this.prototype[key] = value;
115
+}.overloadSetter();
116
+
117
+// From
118
+
119
+var slice = Array.prototype.slice;
120
+
121
+Function.from = function(item){
122
+	return (typeOf(item) == 'function') ? item : function(){
123
+		return item;
124
+	};
125
+};
126
+
127
+Array.from = function(item){
128
+	if (item == null) return [];
129
+	return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item];
130
+};
131
+
132
+Number.from = function(item){
133
+	var number = parseFloat(item);
134
+	return isFinite(number) ? number : null;
135
+};
136
+
137
+String.from = function(item){
138
+	return item + '';
139
+};
140
+
141
+// hide, protect
142
+
143
+Function.implement({
144
+
145
+	hide: function(){
146
+		this.$hidden = true;
147
+		return this;
148
+	},
149
+
150
+	protect: function(){
151
+		this.$protected = true;
152
+		return this;
153
+	}
154
+
155
+});
156
+
157
+// Type
158
+
159
+var Type = this.Type = function(name, object){
160
+	if (name){
161
+		var lower = name.toLowerCase();
162
+		var typeCheck = function(item){
163
+			return (typeOf(item) == lower);
164
+		};
165
+
166
+		Type['is' + name] = typeCheck;
167
+		if (object != null){
168
+			object.prototype.$family = (function(){
169
+				return lower;
170
+			}).hide();
171
+
172
+		}
173
+	}
174
+
175
+	if (object == null) return null;
176
+
177
+	object.extend(this);
178
+	object.$constructor = Type;
179
+	object.prototype.$constructor = object;
180
+
181
+	return object;
182
+};
183
+
184
+var toString = Object.prototype.toString;
185
+
186
+Type.isEnumerable = function(item){
187
+	return (item != null && typeof item.length == 'number' && toString.call(item) != '[object Function]' );
188
+};
189
+
190
+var hooks = {};
191
+
192
+var hooksOf = function(object){
193
+	var type = typeOf(object.prototype);
194
+	return hooks[type] || (hooks[type] = []);
195
+};
196
+
197
+var implement = function(name, method){
198
+	if (method && method.$hidden) return;
199
+
200
+	var hooks = hooksOf(this);
201
+
202
+	for (var i = 0; i < hooks.length; i++){
203
+		var hook = hooks[i];
204
+		if (typeOf(hook) == 'type') implement.call(hook, name, method);
205
+		else hook.call(this, name, method);
206
+	}
207
+
208
+	var previous = this.prototype[name];
209
+	if (previous == null || !previous.$protected) this.prototype[name] = method;
210
+
211
+	if (this[name] == null && typeOf(method) == 'function') extend.call(this, name, function(item){
212
+		return method.apply(item, slice.call(arguments, 1));
213
+	});
214
+};
215
+
216
+var extend = function(name, method){
217
+	if (method && method.$hidden) return;
218
+	var previous = this[name];
219
+	if (previous == null || !previous.$protected) this[name] = method;
220
+};
221
+
222
+Type.implement({
223
+
224
+	implement: implement.overloadSetter(),
225
+
226
+	extend: extend.overloadSetter(),
227
+
228
+	alias: function(name, existing){
229
+		implement.call(this, name, this.prototype[existing]);
230
+	}.overloadSetter(),
231
+
232
+	mirror: function(hook){
233
+		hooksOf(this).push(hook);
234
+		return this;
235
+	}
236
+
237
+});
238
+
239
+new Type('Type', Type);
240
+
241
+// Default Types
242
+
243
+var force = function(name, object, methods){
244
+	var isType = (object != Object),
245
+		prototype = object.prototype;
246
+
247
+	if (isType) object = new Type(name, object);
248
+
249
+	for (var i = 0, l = methods.length; i < l; i++){
250
+		var key = methods[i],
251
+			generic = object[key],
252
+			proto = prototype[key];
253
+
254
+		if (generic) generic.protect();
255
+
256
+		if (isType && proto){
257
+			delete prototype[key];
258
+			prototype[key] = proto.protect();
259
+		}
260
+	}
261
+
262
+	if (isType) object.implement(prototype);
263
+
264
+	return force;
265
+};
266
+
267
+force('String', String, [
268
+	'charAt', 'charCodeAt', 'concat', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search',
269
+	'slice', 'split', 'substr', 'substring', 'toLowerCase', 'toUpperCase'
270
+])('Array', Array, [
271
+	'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice',
272
+	'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight'
273
+])('Number', Number, [
274
+	'toExponential', 'toFixed', 'toLocaleString', 'toPrecision'
275
+])('Function', Function, [
276
+	'apply', 'call', 'bind'
277
+])('RegExp', RegExp, [
278
+	'exec', 'test'
279
+])('Object', Object, [
280
+	'create', 'defineProperty', 'defineProperties', 'keys',
281
+	'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames',
282
+	'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen'
283
+])('Date', Date, ['now']);
284
+
285
+Object.extend = extend.overloadSetter();
286
+
287
+Date.extend('now', function(){
288
+	return +(new Date);
289
+});
290
+
291
+new Type('Boolean', Boolean);
292
+
293
+// fixes NaN returning as Number
294
+
295
+Number.prototype.$family = function(){
296
+	return isFinite(this) ? 'number' : 'null';
297
+}.hide();
298
+
299
+// Number.random
300
+
301
+Number.extend('random', function(min, max){
302
+	return Math.floor(Math.random() * (max - min + 1) + min);
303
+});
304
+
305
+// forEach, each
306
+
307
+var hasOwnProperty = Object.prototype.hasOwnProperty;
308
+Object.extend('forEach', function(object, fn, bind){
309
+	for (var key in object){
310
+		if (hasOwnProperty.call(object, key)) fn.call(bind, object[key], key, object);
311
+	}
312
+});
313
+
314
+Object.each = Object.forEach;
315
+
316
+Array.implement({
317
+
318
+	forEach: function(fn, bind){
319
+		for (var i = 0, l = this.length; i < l; i++){
320
+			if (i in this) fn.call(bind, this[i], i, this);
321
+		}
322
+	},
323
+
324
+	each: function(fn, bind){
325
+		Array.forEach(this, fn, bind);
326
+		return this;
327
+	}
328
+
329
+});
330
+
331
+// Array & Object cloning, Object merging and appending
332
+
333
+var cloneOf = function(item){
334
+	switch (typeOf(item)){
335
+		case 'array': return item.clone();
336
+		case 'object': return Object.clone(item);
337
+		default: return item;
338
+	}
339
+};
340
+
341
+Array.implement('clone', function(){
342
+	var i = this.length, clone = new Array(i);
343
+	while (i--) clone[i] = cloneOf(this[i]);
344
+	return clone;
345
+});
346
+
347
+var mergeOne = function(source, key, current){
348
+	switch (typeOf(current)){
349
+		case 'object':
350
+			if (typeOf(source[key]) == 'object') Object.merge(source[key], current);
351
+			else source[key] = Object.clone(current);
352
+		break;
353
+		case 'array': source[key] = current.clone(); break;
354
+		default: source[key] = current;
355
+	}
356
+	return source;
357
+};
358
+
359
+Object.extend({
360
+
361
+	merge: function(source, k, v){
362
+		if (typeOf(k) == 'string') return mergeOne(source, k, v);
363
+		for (var i = 1, l = arguments.length; i < l; i++){
364
+			var object = arguments[i];
365
+			for (var key in object) mergeOne(source, key, object[key]);
366
+		}
367
+		return source;
368
+	},
369
+
370
+	clone: function(object){
371
+		var clone = {};
372
+		for (var key in object) clone[key] = cloneOf(object[key]);
373
+		return clone;
374
+	},
375
+
376
+	append: function(original){
377
+		for (var i = 1, l = arguments.length; i < l; i++){
378
+			var extended = arguments[i] || {};
379
+			for (var key in extended) original[key] = extended[key];
380
+		}
381
+		return original;
382
+	}
383
+
384
+});
385
+
386
+// Object-less types
387
+
388
+['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each(function(name){
389
+	new Type(name);
390
+});
391
+
392
+// Unique ID
393
+
394
+var UID = Date.now();
395
+
396
+String.extend('uniqueID', function(){
397
+	return (UID++).toString(36);
398
+});
399
+
400
+
401
+
402
+}).call(this);
403
+
404
+
405
+/*
406
+---
407
+
408
+name: Array
409
+
410
+description: Contains Array Prototypes like each, contains, and erase.
411
+
412
+license: MIT-style license.
413
+
414
+requires: Type
415
+
416
+provides: Array
417
+
418
+...
419
+*/
420
+
421
+Array.implement({
422
+
423
+	invoke: function(methodName){
424
+		var args = Array.slice(arguments, 1);
425
+		return this.map(function(item){
426
+			return item[methodName].apply(item, args);
427
+		});
428
+	},
429
+
430
+	every: function(fn, bind){
431
+		for (var i = 0, l = this.length; i < l; i++){
432
+			if ((i in this) && !fn.call(bind, this[i], i, this)) return false;
433
+		}
434
+		return true;
435
+	},
436
+
437
+	filter: function(fn, bind){
438
+		var results = [];
439
+		for (var i = 0, l = this.length; i < l; i++){
440
+			if ((i in this) && fn.call(bind, this[i], i, this)) results.push(this[i]);
441
+		}
442
+		return results;
443
+	},
444
+
445
+	clean: function(){
446
+		return this.filter(function(item){
447
+			return item != null;
448
+		});
449
+	},
450
+
451
+	indexOf: function(item, from){
452
+		var len = this.length;
453
+		for (var i = (from < 0) ? Math.max(0, len + from) : from || 0; i < len; i++){
454
+			if (this[i] === item) return i;
455
+		}
456
+		return -1;
457
+	},
458
+
459
+	map: function(fn, bind){
460
+		var results = [];
461
+		for (var i = 0, l = this.length; i < l; i++){
462
+			if (i in this) results[i] = fn.call(bind, this[i], i, this);
463
+		}
464
+		return results;
465
+	},
466
+
467
+	some: function(fn, bind){
468
+		for (var i = 0, l = this.length; i < l; i++){
469
+			if ((i in this) && fn.call(bind, this[i], i, this)) return true;
470
+		}
471
+		return false;
472
+	},
473
+
474
+	associate: function(keys){
475
+		var obj = {}, length = Math.min(this.length, keys.length);
476
+		for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
477
+		return obj;
478
+	},
479
+
480
+	link: function(object){
481
+		var result = {};
482
+		for (var i = 0, l = this.length; i < l; i++){
483
+			for (var key in object){
484
+				if (object[key](this[i])){
485
+					result[key] = this[i];
486
+					delete object[key];
487
+					break;
488
+				}
489
+			}
490
+		}
491
+		return result;
492
+	},
493
+
494
+	contains: function(item, from){
495
+		return this.indexOf(item, from) != -1;
496
+	},
497
+
498
+	append: function(array){
499
+		this.push.apply(this, array);
500
+		return this;
501
+	},
502
+
503
+	getLast: function(){
504
+		return (this.length) ? this[this.length - 1] : null;
505
+	},
506
+
507
+	getRandom: function(){
508
+		return (this.length) ? this[Number.random(0, this.length - 1)] : null;
509
+	},
510
+
511
+	include: function(item){
512
+		if (!this.contains(item)) this.push(item);
513
+		return this;
514
+	},
515
+
516
+	combine: function(array){
517
+		for (var i = 0, l = array.length; i < l; i++) this.include(array[i]);
518
+		return this;
519
+	},
520
+
521
+	erase: function(item){
522
+		for (var i = this.length; i--;){
523
+			if (this[i] === item) this.splice(i, 1);
524
+		}
525
+		return this;
526
+	},
527
+
528
+	empty: function(){
529
+		this.length = 0;
530
+		return this;
531
+	},
532
+
533
+	flatten: function(){
534
+		var array = [];
535
+		for (var i = 0, l = this.length; i < l; i++){
536
+			var type = typeOf(this[i]);
537
+			if (type == 'null') continue;
538
+			array = array.concat((type == 'array' || type == 'collection' || type == 'arguments' || instanceOf(this[i], Array)) ? Array.flatten(this[i]) : this[i]);
539
+		}
540
+		return array;
541
+	},
542
+
543
+	pick: function(){
544
+		for (var i = 0, l = this.length; i < l; i++){
545
+			if (this[i] != null) return this[i];
546
+		}
547
+		return null;
548
+	},
549
+
550
+	hexToRgb: function(array){
551
+		if (this.length != 3) return null;
552
+		var rgb = this.map(function(value){
553
+			if (value.length == 1) value += value;
554
+			return value.toInt(16);
555
+		});
556
+		return (array) ? rgb : 'rgb(' + rgb + ')';
557
+	},
558
+
559
+	rgbToHex: function(array){
560
+		if (this.length < 3) return null;
561
+		if (this.length == 4 && this[3] == 0 && !array) return 'transparent';
562
+		var hex = [];
563
+		for (var i = 0; i < 3; i++){
564
+			var bit = (this[i] - 0).toString(16);
565
+			hex.push((bit.length == 1) ? '0' + bit : bit);
566
+		}
567
+		return (array) ? hex : '#' + hex.join('');
568
+	}
569
+
570
+});
571
+
572
+
573
+
574
+
575
+/*
576
+---
577
+
578
+name: String
579
+
580
+description: Contains String Prototypes like camelCase, capitalize, test, and toInt.
581
+
582
+license: MIT-style license.
583
+
584
+requires: Type
585
+
586
+provides: String
587
+
588
+...
589
+*/
590
+
591
+String.implement({
592
+
593
+	test: function(regex, params){
594
+		return ((typeOf(regex) == 'regexp') ? regex : new RegExp('' + regex, params)).test(this);
595
+	},
596
+
597
+	contains: function(string, separator){
598
+		return (separator) ? (separator + this + separator).indexOf(separator + string + separator) > -1 : this.indexOf(string) > -1;
599
+	},
600
+
601
+	trim: function(){
602
+		return this.replace(/^\s+|\s+$/g, '');
603
+	},
604
+
605
+	clean: function(){
606
+		return this.replace(/\s+/g, ' ').trim();
607
+	},
608
+
609
+	camelCase: function(){
610
+		return this.replace(/-\D/g, function(match){
611
+			return match.charAt(1).toUpperCase();
612
+		});
613
+	},
614
+
615
+	hyphenate: function(){
616
+		return this.replace(/[A-Z]/g, function(match){
617
+			return ('-' + match.charAt(0).toLowerCase());
618
+		});
619
+	},
620
+
621
+	capitalize: function(){
622
+		return this.replace(/\b[a-z]/g, function(match){
623
+			return match.toUpperCase();
624
+		});
625
+	},
626
+
627
+	escapeRegExp: function(){
628
+		return this.replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1');
629
+	},
630
+
631
+	toInt: function(base){
632
+		return parseInt(this, base || 10);
633
+	},
634
+
635
+	toFloat: function(){
636
+		return parseFloat(this);
637
+	},
638
+
639
+	hexToRgb: function(array){
640
+		var hex = this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
641
+		return (hex) ? hex.slice(1).hexToRgb(array) : null;
642
+	},
643
+
644
+	rgbToHex: function(array){
645
+		var rgb = this.match(/\d{1,3}/g);
646
+		return (rgb) ? rgb.rgbToHex(array) : null;
647
+	},
648
+
649
+	substitute: function(object, regexp){
650
+		return this.replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){
651
+			if (match.charAt(0) == '\\') return match.slice(1);
652
+			return (object[name] != null) ? object[name] : '';
653
+		});
654
+	}
655
+
656
+});
657
+
658
+
659
+/*
660
+---
661
+
662
+name: Number
663
+
664
+description: Contains Number Prototypes like limit, round, times, and ceil.
665
+
666
+license: MIT-style license.
667
+
668
+requires: Type
669
+
670
+provides: Number
671
+
672
+...
673
+*/
674
+
675
+Number.implement({
676
+
677
+	limit: function(min, max){
678
+		return Math.min(max, Math.max(min, this));
679
+	},
680
+
681
+	round: function(precision){
682
+		precision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0);
683
+		return Math.round(this * precision) / precision;
684
+	},
685
+
686
+	times: function(fn, bind){
687
+		for (var i = 0; i < this; i++) fn.call(bind, i, this);
688
+	},
689
+
690
+	toFloat: function(){
691
+		return parseFloat(this);
692
+	},
693
+
694
+	toInt: function(base){
695
+		return parseInt(this, base || 10);
696
+	}
697
+
698
+});
699
+
700
+Number.alias('each', 'times');
701
+
702
+(function(math){
703
+	var methods = {};
704
+	math.each(function(name){
705
+		if (!Number[name]) methods[name] = function(){
706
+			return Math[name].apply(null, [this].concat(Array.from(arguments)));
707
+		};
708
+	});
709
+	Number.implement(methods);
710
+})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']);
711
+
712
+
713
+/*
714
+---
715
+
716
+name: Function
717
+
718
+description: Contains Function Prototypes like create, bind, pass, and delay.
719
+
720
+license: MIT-style license.
721
+
722
+requires: Type
723
+
724
+provides: Function
725
+
726
+...
727
+*/
728
+
729
+Function.extend({
730
+
731
+	attempt: function(){
732
+		for (var i = 0, l = arguments.length; i < l; i++){
733
+			try {
734
+				return arguments[i]();
735
+			} catch (e){}
736
+		}
737
+		return null;
738
+	}
739
+
740
+});
741
+
742
+Function.implement({
743
+
744
+	attempt: function(args, bind){
745
+		try {
746
+			return this.apply(bind, Array.from(args));
747
+		} catch (e){}
748
+
749
+		return null;
750
+	},
751
+
752
+	bind: function(bind){
753
+		var self = this,
754
+			args = (arguments.length > 1) ? Array.slice(arguments, 1) : null;
755
+
756
+		return function(){
757
+			if (!args && !arguments.length) return self.call(bind);
758
+			if (args && arguments.length) return self.apply(bind, args.concat(Array.from(arguments)));
759
+			return self.apply(bind, args || arguments);
760
+		};
761
+	},
762
+
763
+	pass: function(args, bind){
764
+		var self = this;
765
+		if (args != null) args = Array.from(args);
766
+		return function(){
767
+			return self.apply(bind, args || arguments);
768
+		};
769
+	},
770
+
771
+	delay: function(delay, bind, args){
772
+		return setTimeout(this.pass((args == null ? [] : args), bind), delay);
773
+	},
774
+
775
+	periodical: function(periodical, bind, args){
776
+		return setInterval(this.pass((args == null ? [] : args), bind), periodical);
777
+	}
778
+
779
+});
780
+
781
+
782
+
783
+
784
+/*
785
+---
786
+
787
+name: Object
788
+
789
+description: Object generic methods
790
+
791
+license: MIT-style license.
792
+
793
+requires: Type
794
+
795
+provides: [Object, Hash]
796
+
797
+...
798
+*/
799
+
800
+(function(){
801
+
802
+var hasOwnProperty = Object.prototype.hasOwnProperty;
803
+
804
+Object.extend({
805
+
806
+	subset: function(object, keys){
807
+		var results = {};
808
+		for (var i = 0, l = keys.length; i < l; i++){
809
+			var k = keys[i];
810
+			results[k] = object[k];
811
+		}
812
+		return results;
813
+	},
814
+
815
+	map: function(object, fn, bind){
816
+		var results = {};
817
+		for (var key in object){
818
+			if (hasOwnProperty.call(object, key)) results[key] = fn.call(bind, object[key], key, object);
819
+		}
820
+		return results;
821
+	},
822
+
823
+	filter: function(object, fn, bind){
824
+		var results = {};
825
+		Object.each(object, function(value, key){
826
+			if (fn.call(bind, value, key, object)) results[key] = value;
827
+		});
828
+		return results;
829
+	},
830
+
831
+	every: function(object, fn, bind){
832
+		for (var key in object){
833
+			if (hasOwnProperty.call(object, key) && !fn.call(bind, object[key], key)) return false;
834
+		}
835
+		return true;
836
+	},
837
+
838
+	some: function(object, fn, bind){
839
+		for (var key in object){
840
+			if (hasOwnProperty.call(object, key) && fn.call(bind, object[key], key)) return true;
841
+		}
842
+		return false;
843
+	},
844
+
845
+	keys: function(object){
846
+		var keys = [];
847
+		for (var key in object){
848
+			if (hasOwnProperty.call(object, key)) keys.push(key);
849
+		}
850
+		return keys;
851
+	},
852
+
853
+	values: function(object){
854
+		var values = [];
855
+		for (var key in object){
856
+			if (hasOwnProperty.call(object, key)) values.push(object[key]);
857
+		}
858
+		return values;
859
+	},
860
+
861
+	getLength: function(object){
862
+		return Object.keys(object).length;
863
+	},
864
+
865
+	keyOf: function(object, value){
866
+		for (var key in object){
867
+			if (hasOwnProperty.call(object, key) && object[key] === value) return key;
868
+		}
869
+		return null;
870
+	},
871
+
872
+	contains: function(object, value){
873
+		return Object.keyOf(object, value) != null;
874
+	},
875
+
876
+	toQueryString: function(object, base){
877
+		var queryString = [];
878
+
879
+		Object.each(object, function(value, key){
880
+			if (base) key = base + '[' + key + ']';
881
+			var result;
882
+			switch (typeOf(value)){
883
+				case 'object': result = Object.toQueryString(value, key); break;
884
+				case 'array':
885
+					var qs = {};
886
+					value.each(function(val, i){
887
+						qs[i] = val;
888
+					});
889
+					result = Object.toQueryString(qs, key);
890
+				break;
891
+				default: result = key + '=' + encodeURIComponent(value);
892
+			}
893
+			if (value != null) queryString.push(result);
894
+		});
895
+
896
+		return queryString.join('&');
897
+	}
898
+
899
+});
900
+
901
+})();
902
+
903
+
904
+
905
+
906
+/*
907
+---
908
+
909
+name: Browser
910
+
911
+description: The Browser Object. Contains Browser initialization, Window and Document, and the Browser Hash.
912
+
913
+license: MIT-style license.
914
+
915
+requires: [Array, Function, Number, String]
916
+
917
+provides: [Browser, Window, Document]
918
+
919
+...
920
+*/
921
+
922
+(function(){
923
+
924
+var document = this.document;
925
+var window = document.window = this;
926
+
927
+var UID = 1;
928
+
929
+this.$uid = (window.ActiveXObject) ? function(item){
930
+	return (item.uid || (item.uid = [UID++]))[0];
931
+} : function(item){
932
+	return item.uid || (item.uid = UID++);
933
+};
934
+
935
+$uid(window);
936
+$uid(document);
937
+
938
+var ua = navigator.userAgent.toLowerCase(),
939
+	platform = navigator.platform.toLowerCase(),
940
+	UA = ua.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/) || [null, 'unknown', 0],
941
+	mode = UA[1] == 'ie' && document.documentMode;
942
+
943
+var Browser = this.Browser = {
944
+
945
+	extend: Function.prototype.extend,
946
+
947
+	name: (UA[1] == 'version') ? UA[3] : UA[1],
948
+
949
+	version: mode || parseFloat((UA[1] == 'opera' && UA[4]) ? UA[4] : UA[2]),
950
+
951
+	Platform: {
952
+		name: ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || platform.match(/mac|win|linux/) || ['other'])[0]
953
+	},
954
+
955
+	Features: {
956
+		xpath: !!(document.evaluate),
957
+		air: !!(window.runtime),
958
+		query: !!(document.querySelector),
959
+		json: !!(window.JSON)
960
+	},
961
+
962
+	Plugins: {}
963
+
964
+};
965
+
966
+Browser[Browser.name] = true;
967
+Browser[Browser.name + parseInt(Browser.version, 10)] = true;
968
+Browser.Platform[Browser.Platform.name] = true;
969
+
970
+// Request
971
+
972
+Browser.Request = (function(){
973
+
974
+	var XMLHTTP = function(){
975
+		return new XMLHttpRequest();
976
+	};
977
+
978
+	var MSXML2 = function(){
979
+		return new ActiveXObject('MSXML2.XMLHTTP');
980
+	};
981
+
982
+	var MSXML = function(){
983
+		return new ActiveXObject('Microsoft.XMLHTTP');
984
+	};
985
+
986
+	return Function.attempt(function(){
987
+		XMLHTTP();
988
+		return XMLHTTP;
989
+	}, function(){
990
+		MSXML2();
991
+		return MSXML2;
992
+	}, function(){
993
+		MSXML();
994
+		return MSXML;
995
+	});
996
+
997
+})();
998
+
999
+Browser.Features.xhr = !!(Browser.Request);
1000
+
1001
+// Flash detection
1002
+
1003
+var version = (Function.attempt(function(){
1004
+	return navigator.plugins['Shockwave Flash'].description;
1005
+}, function(){
1006
+	return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
1007
+}) || '0 r0').match(/\d+/g);
1008
+
1009
+Browser.Plugins.Flash = {
1010
+	version: Number(version[0] || '0.' + version[1]) || 0,
1011
+	build: Number(version[2]) || 0
1012
+};
1013
+
1014
+// String scripts
1015
+
1016
+Browser.exec = function(text){
1017
+	if (!text) return text;
1018
+	if (window.execScript){
1019
+		window.execScript(text);
1020
+	} else {
1021
+		var script = document.createElement('script');
1022
+		script.setAttribute('type', 'text/javascript');
1023
+		script.text = text;
1024
+		document.head.appendChild(script);
1025
+		document.head.removeChild(script);
1026
+	}
1027
+	return text;
1028
+};
1029
+
1030
+String.implement('stripScripts', function(exec){
1031
+	var scripts = '';
1032
+	var text = this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(all, code){
1033
+		scripts += code + '\n';
1034
+		return '';
1035
+	});
1036
+	if (exec === true) Browser.exec(scripts);
1037
+	else if (typeOf(exec) == 'function') exec(scripts, text);
1038
+	return text;
1039
+});
1040
+
1041
+// Window, Document
1042
+
1043
+Browser.extend({
1044
+	Document: this.Document,
1045
+	Window: this.Window,
1046
+	Element: this.Element,
1047
+	Event: this.Event
1048
+});
1049
+
1050
+this.Window = this.$constructor = new Type('Window', function(){});
1051
+
1052
+this.$family = Function.from('window').hide();
1053
+
1054
+Window.mirror(function(name, method){
1055
+	window[name] = method;
1056
+});
1057
+
1058
+this.Document = document.$constructor = new Type('Document', function(){});
1059
+
1060
+document.$family = Function.from('document').hide();
1061
+
1062
+Document.mirror(function(name, method){
1063
+	document[name] = method;
1064
+});
1065
+
1066
+document.html = document.documentElement;
1067
+document.head = document.getElementsByTagName('head')[0];
1068
+
1069
+if (document.execCommand) try {
1070
+	document.execCommand("BackgroundImageCache", false, true);
1071
+} catch (e){}
1072
+
1073
+if (this.attachEvent && !this.addEventListener){
1074
+	var unloadEvent = function(){
1075
+		this.detachEvent('onunload', unloadEvent);
1076
+		document.head = document.html = document.window = null;
1077
+	};
1078
+	this.attachEvent('onunload', unloadEvent);
1079
+}
1080
+
1081
+// IE fails on collections and <select>.options (refers to <select>)
1082
+var arrayFrom = Array.from;
1083
+try {
1084
+	arrayFrom(document.html.childNodes);
1085
+} catch(e){
1086
+	Array.from = function(item){
1087
+		if (typeof item != 'string' && Type.isEnumerable(item) && typeOf(item) != 'array'){
1088
+			var i = item.length, array = new Array(i);
1089
+			while (i--) array[i] = item[i];
1090
+			return array;
1091
+		}
1092
+		return arrayFrom(item);
1093
+	};
1094
+
1095
+	var prototype = Array.prototype,
1096
+		slice = prototype.slice;
1097
+	['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice'].each(function(name){
1098
+		var method = prototype[name];
1099
+		Array[name] = function(item){
1100
+			return method.apply(Array.from(item), slice.call(arguments, 1));
1101
+		};
1102
+	});
1103
+}
1104
+
1105
+
1106
+
1107
+}).call(this);
1108
+
1109
+
1110
+/*
1111
+---
1112
+
1113
+name: Event
1114
+
1115
+description: Contains the Event Class, to make the event object cross-browser.
1116
+
1117
+license: MIT-style license.
1118
+
1119
+requires: [Window, Document, Array, Function, String, Object]
1120
+
1121
+provides: Event
1122
+
1123
+...
1124
+*/
1125
+
1126
+var Event = new Type('Event', function(event, win){
1127
+	if (!win) win = window;
1128
+	var doc = win.document;
1129
+	event = event || win.event;
1130
+	if (event.$extended) return event;
1131
+	this.$extended = true;
1132
+	var type = event.type,
1133
+		target = event.target || event.srcElement,
1134
+		page = {},
1135
+		client = {},
1136
+		related = null,
1137
+		rightClick, wheel, code, key;
1138
+	while (target && target.nodeType == 3) target = target.parentNode;
1139
+
1140
+	if (type.indexOf('key') != -1){
1141
+		code = event.which || event.keyCode;
1142
+		key = Object.keyOf(Event.Keys, code);
1143
+		if (type == 'keydown'){
1144
+			var fKey = code - 111;
1145
+			if (fKey > 0 && fKey < 13) key = 'f' + fKey;
1146
+		}
1147
+		if (!key) key = String.fromCharCode(code).toLowerCase();
1148
+	} else if ((/click|mouse|menu/i).test(type)){
1149
+		doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
1150
+		page = {
1151
+			x: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft,
1152
+			y: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop
1153
+		};
1154
+		client = {
1155
+			x: (event.pageX != null) ? event.pageX - win.pageXOffset : event.clientX,
1156
+			y: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY
1157
+		};
1158
+		if ((/DOMMouseScroll|mousewheel/).test(type)){
1159
+			wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3;
1160
+		}
1161
+		rightClick = (event.which == 3) || (event.button == 2);
1162
+		if ((/over|out/).test(type)){
1163
+			related = event.relatedTarget || event[(type == 'mouseover' ? 'from' : 'to') + 'Element'];
1164
+			var testRelated = function(){
1165
+				while (related && related.nodeType == 3) related = related.parentNode;
1166
+				return true;
1167
+			};
1168
+			var hasRelated = (Browser.firefox2) ? testRelated.attempt() : testRelated();
1169
+			related = (hasRelated) ? related : null;
1170
+		}
1171
+	} else if ((/gesture|touch/i).test(type)){
1172
+		this.rotation = event.rotation;
1173
+		this.scale = event.scale;
1174
+		this.targetTouches = event.targetTouches;
1175
+		this.changedTouches = event.changedTouches;
1176
+		var touches = this.touches = event.touches;
1177
+		if (touches && touches[0]){
1178
+			var touch = touches[0];
1179
+			page = {x: touch.pageX, y: touch.pageY};
1180
+			client = {x: touch.clientX, y: touch.clientY};
1181
+		}
1182
+	}
1183
+
1184
+	return Object.append(this, {
1185
+		event: event,
1186
+		type: type,
1187
+
1188
+		page: page,
1189
+		client: client,
1190
+		rightClick: rightClick,
1191
+
1192
+		wheel: wheel,
1193
+
1194
+		relatedTarget: document.id(related),
1195
+		target: document.id(target),
1196
+
1197
+		code: code,
1198
+		key: key,
1199
+
1200
+		shift: event.shiftKey,
1201
+		control: event.ctrlKey,
1202
+		alt: event.altKey,
1203
+		meta: event.metaKey
1204
+	});
1205
+});
1206
+
1207
+Event.Keys = {
1208
+	'enter': 13,
1209
+	'up': 38,
1210
+	'down': 40,
1211
+	'left': 37,
1212
+	'right': 39,
1213
+	'esc': 27,
1214
+	'space': 32,
1215
+	'backspace': 8,
1216
+	'tab': 9,
1217
+	'delete': 46
1218
+};
1219
+
1220
+
1221
+
1222
+Event.implement({
1223
+
1224
+	stop: function(){
1225
+		return this.stopPropagation().preventDefault();
1226
+	},
1227
+
1228
+	stopPropagation: function(){
1229
+		if (this.event.stopPropagation) this.event.stopPropagation();
1230
+		else this.event.cancelBubble = true;
1231
+		return this;
1232
+	},
1233
+
1234
+	preventDefault: function(){
1235
+		if (this.event.preventDefault) this.event.preventDefault();
1236
+		else this.event.returnValue = false;
1237
+		return this;
1238
+	}
1239
+
1240
+});
1241
+
1242
+
1243
+/*
1244
+---
1245
+
1246
+name: Class
1247
+
1248
+description: Contains the Class Function for easily creating, extending, and implementing reusable Classes.
1249
+
1250
+license: MIT-style license.
1251
+
1252
+requires: [Array, String, Function, Number]
1253
+
1254
+provides: Class
1255
+
1256
+...
1257
+*/
1258
+
1259
+(function(){
1260
+
1261
+var Class = this.Class = new Type('Class', function(params){
1262
+	if (instanceOf(params, Function)) params = {initialize: params};
1263
+
1264
+	var newClass = function(){
1265
+		reset(this);
1266
+		if (newClass.$prototyping) return this;
1267
+		this.$caller = null;
1268
+		var value = (this.initialize) ? this.initialize.apply(this, arguments) : this;
1269
+		this.$caller = this.caller = null;
1270
+		return value;
1271
+	}.extend(this).implement(params);
1272
+
1273
+	newClass.$constructor = Class;
1274
+	newClass.prototype.$constructor = newClass;
1275
+	newClass.prototype.parent = parent;
1276
+
1277
+	return newClass;
1278
+});
1279
+
1280
+var parent = function(){
1281
+	if (!this.$caller) throw new Error('The method "parent" cannot be called.');
1282
+	var name = this.$caller.$name,
1283
+		parent = this.$caller.$owner.parent,
1284
+		previous = (parent) ? parent.prototype[name] : null;
1285
+	if (!previous) throw new Error('The method "' + name + '" has no parent.');
1286
+	return previous.apply(this, arguments);
1287
+};
1288
+
1289
+var reset = function(object){
1290
+	for (var key in object){
1291
+		var value = object[key];
1292
+		switch (typeOf(value)){
1293
+			case 'object':
1294
+				var F = function(){};
1295
+				F.prototype = value;
1296
+				object[key] = reset(new F);
1297
+			break;
1298
+			case 'array': object[key] = value.clone(); break;
1299
+		}
1300
+	}
1301
+	return object;
1302
+};
1303
+
1304
+var wrap = function(self, key, method){
1305
+	if (method.$origin) method = method.$origin;
1306
+	var wrapper = function(){
1307
+		if (method.$protected && this.$caller == null) throw new Error('The method "' + key + '" cannot be called.');
1308
+		var caller = this.caller, current = this.$caller;
1309
+		this.caller = current; this.$caller = wrapper;
1310
+		var result = method.apply(this, arguments);
1311
+		this.$caller = current; this.caller = caller;
1312
+		return result;
1313
+	}.extend({$owner: self, $origin: method, $name: key});
1314
+	return wrapper;
1315
+};
1316
+
1317
+var implement = function(key, value, retain){
1318
+	if (Class.Mutators.hasOwnProperty(key)){
1319
+		value = Class.Mutators[key].call(this, value);
1320
+		if (value == null) return this;
1321
+	}
1322
+
1323
+	if (typeOf(value) == 'function'){
1324
+		if (value.$hidden) return this;
1325
+		this.prototype[key] = (retain) ? value : wrap(this, key, value);
1326
+	} else {
1327
+		Object.merge(this.prototype, key, value);
1328
+	}
1329
+
1330
+	return this;
1331
+};
1332
+
1333
+var getInstance = function(klass){
1334
+	klass.$prototyping = true;
1335
+	var proto = new klass;
1336
+	delete klass.$prototyping;
1337
+	return proto;
1338
+};
1339
+
1340
+Class.implement('implement', implement.overloadSetter());
1341
+
1342
+Class.Mutators = {
1343
+
1344
+	Extends: function(parent){
1345
+		this.parent = parent;
1346
+		this.prototype = getInstance(parent);
1347
+	},
1348
+
1349
+	Implements: function(items){
1350
+		Array.from(items).each(function(item){
1351
+			var instance = new item;
1352
+			for (var key in instance) implement.call(this, key, instance[key], true);
1353
+		}, this);
1354
+	}
1355
+};
1356
+
1357
+}).call(this);
1358
+
1359
+
1360
+/*
1361
+---
1362
+
1363
+name: Class.Extras
1364
+
1365
+description: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks.
1366
+
1367
+license: MIT-style license.
1368
+
1369
+requires: Class
1370
+
1371
+provides: [Class.Extras, Chain, Events, Options]
1372
+
1373
+...
1374
+*/
1375
+
1376
+(function(){
1377
+
1378
+this.Chain = new Class({
1379
+
1380
+	$chain: [],
1381
+
1382
+	chain: function(){
1383
+		this.$chain.append(Array.flatten(arguments));
1384
+		return this;
1385
+	},
1386
+
1387
+	callChain: function(){
1388
+		return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false;
1389
+	},
1390
+
1391
+	clearChain: function(){
1392
+		this.$chain.empty();
1393
+		return this;
1394
+	}
1395
+
1396
+});
1397
+
1398
+var removeOn = function(string){
1399
+	return string.replace(/^on([A-Z])/, function(full, first){
1400
+		return first.toLowerCase();
1401
+	});
1402
+};
1403
+
1404
+this.Events = new Class({
1405
+
1406
+	$events: {},
1407
+
1408
+	addEvent: function(type, fn, internal){
1409
+		type = removeOn(type);
1410
+
1411
+
1412
+
1413
+		this.$events[type] = (this.$events[type] || []).include(fn);
1414
+		if (internal) fn.internal = true;
1415
+		return this;
1416
+	},
1417
+
1418
+	addEvents: function(events){
1419
+		for (var type in events) this.addEvent(type, events[type]);
1420
+		return this;
1421
+	},
1422
+
1423
+	fireEvent: function(type, args, delay){
1424
+		type = removeOn(type);
1425
+		var events = this.$events[type];
1426
+		if (!events) return this;
1427
+		args = Array.from(args);
1428
+		events.each(function(fn){
1429
+			if (delay) fn.delay(delay, this, args);
1430
+			else fn.apply(this, args);
1431
+		}, this);
1432
+		return this;
1433
+	},
1434
+
1435
+	removeEvent: function(type, fn){
1436
+		type = removeOn(type);
1437
+		var events = this.$events[type];
1438
+		if (events && !fn.internal){
1439
+			var index =  events.indexOf(fn);
1440
+			if (index != -1) delete events[index];
1441
+		}
1442
+		return this;
1443
+	},
1444
+
1445
+	removeEvents: function(events){
1446
+		var type;
1447
+		if (typeOf(events) == 'object'){
1448
+			for (type in events) this.removeEvent(type, events[type]);
1449
+			return this;
1450
+		}
1451
+		if (events) events = removeOn(events);
1452
+		for (type in this.$events){
1453
+			if (events && events != type) continue;
1454
+			var fns = this.$events[type];
1455
+			for (var i = fns.length; i--;) if (i in fns){
1456
+				this.removeEvent(type, fns[i]);
1457
+			}
1458
+		}
1459
+		return this;
1460
+	}
1461
+
1462
+});
1463
+
1464
+this.Options = new Class({
1465
+
1466
+	setOptions: function(){
1467
+		var options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments));
1468
+		if (this.addEvent) for (var option in options){
1469
+			if (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue;
1470
+			this.addEvent(option, options[option]);
1471
+			delete options[option];
1472
+		}
1473
+		return this;
1474
+	}
1475
+
1476
+});
1477
+
1478
+}).call(this);
1479
+
1480
+
1481
+/*
1482
+---
1483
+name: Slick.Parser
1484
+description: Standalone CSS3 Selector parser
1485
+provides: Slick.Parser
1486
+...
1487
+*/
1488
+
1489
+;(function(){
1490
+
1491
+var parsed,
1492
+	separatorIndex,
1493
+	combinatorIndex,
1494
+	reversed,
1495
+	cache = {},
1496
+	reverseCache = {},
1497
+	reUnescape = /\\/g;
1498
+
1499
+var parse = function(expression, isReversed){
1500
+	if (expression == null) return null;
1501
+	if (expression.Slick === true) return expression;
1502
+	expression = ('' + expression).replace(/^\s+|\s+$/g, '');
1503
+	reversed = !!isReversed;
1504
+	var currentCache = (reversed) ? reverseCache : cache;
1505
+	if (currentCache[expression]) return currentCache[expression];
1506
+	parsed = {
1507
+		Slick: true,
1508
+		expressions: [],
1509
+		raw: expression,
1510
+		reverse: function(){
1511
+			return parse(this.raw, true);
1512
+		}
1513
+	};
1514
+	separatorIndex = -1;
1515
+	while (expression != (expression = expression.replace(regexp, parser)));
1516
+	parsed.length = parsed.expressions.length;
1517
+	return currentCache[parsed.raw] = (reversed) ? reverse(parsed) : parsed;
1518
+};
1519
+
1520
+var reverseCombinator = function(combinator){
1521
+	if (combinator === '!') return ' ';
1522
+	else if (combinator === ' ') return '!';
1523
+	else if ((/^!/).test(combinator)) return combinator.replace(/^!/, '');
1524
+	else return '!' + combinator;
1525
+};
1526
+
1527
+var reverse = function(expression){
1528
+	var expressions = expression.expressions;
1529
+	for (var i = 0; i < expressions.length; i++){
1530
+		var exp = expressions[i];
1531
+		var last = {parts: [], tag: '*', combinator: reverseCombinator(exp[0].combinator)};
1532
+
1533
+		for (var j = 0; j < exp.length; j++){
1534
+			var cexp = exp[j];
1535
+			if (!cexp.reverseCombinator) cexp.reverseCombinator = ' ';
1536
+			cexp.combinator = cexp.reverseCombinator;
1537
+			delete cexp.reverseCombinator;
1538
+		}
1539
+
1540
+		exp.reverse().push(last);
1541
+	}
1542
+	return expression;
1543
+};
1544
+
1545
+var escapeRegExp = function(string){// Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan <http://stevenlevithan.com/regex/xregexp/> MIT License
1546
+	return string.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, function(match){
1547
+		return '\\' + match;
1548
+	});
1549
+};
1550
+
1551
+var regexp = new RegExp(
1552
+/*
1553
+#!/usr/bin/env ruby
1554
+puts "\t\t" + DATA.read.gsub(/\(\?x\)|\s+#.*$|\s+|\\$|\\n/,'')
1555
+__END__
1556
+	"(?x)^(?:\
1557
+	  \\s* ( , ) \\s*               # Separator          \n\
1558
+	| \\s* ( <combinator>+ ) \\s*   # Combinator         \n\
1559
+	|      ( \\s+ )                 # CombinatorChildren \n\
1560
+	|      ( <unicode>+ | \\* )     # Tag                \n\
1561
+	| \\#  ( <unicode>+       )     # ID                 \n\
1562
+	| \\.  ( <unicode>+       )     # ClassName          \n\
1563
+	|                               # Attribute          \n\
1564
+	\\[  \
1565
+		\\s* (<unicode1>+)  (?:  \
1566
+			\\s* ([*^$!~|]?=)  (?:  \
1567
+				\\s* (?:\
1568
+					([\"']?)(.*?)\\9 \
1569
+				)\
1570
+			)  \
1571
+		)?  \\s*  \
1572
+	\\](?!\\]) \n\
1573
+	|   :+ ( <unicode>+ )(?:\
1574
+	\\( (?:\
1575
+		(?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+)\
1576
+	) \\)\
1577
+	)?\
1578
+	)"
1579
+*/
1580
+	"^(?:\\s*(,)\\s*|\\s*(<combinator>+)\\s*|(\\s+)|(<unicode>+|\\*)|\\#(<unicode>+)|\\.(<unicode>+)|\\[\\s*(<unicode1>+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(<unicode>+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)"
1581
+	.replace(/<combinator>/, '[' + escapeRegExp(">+~`!@$%^&={}\\;</") + ']')
1582
+	.replace(/<unicode>/g, '(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
1583
+	.replace(/<unicode1>/g, '(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
1584
+);
1585
+
1586
+function parser(
1587
+	rawMatch,
1588
+
1589
+	separator,
1590
+	combinator,
1591
+	combinatorChildren,
1592
+
1593
+	tagName,
1594
+	id,
1595
+	className,
1596
+
1597
+	attributeKey,
1598
+	attributeOperator,
1599
+	attributeQuote,
1600
+	attributeValue,
1601
+
1602
+	pseudoMarker,
1603
+	pseudoClass,
1604
+	pseudoQuote,
1605
+	pseudoClassQuotedValue,
1606
+	pseudoClassValue
1607
+){
1608
+	if (separator || separatorIndex === -1){
1609
+		parsed.expressions[++separatorIndex] = [];
1610
+		combinatorIndex = -1;
1611
+		if (separator) return '';
1612
+	}
1613
+
1614
+	if (combinator || combinatorChildren || combinatorIndex === -1){
1615
+		combinator = combinator || ' ';
1616
+		var currentSeparator = parsed.expressions[separatorIndex];
1617
+		if (reversed && currentSeparator[combinatorIndex])
1618
+			currentSeparator[combinatorIndex].reverseCombinator = reverseCombinator(combinator);
1619
+		currentSeparator[++combinatorIndex] = {combinator: combinator, tag: '*'};
1620
+	}
1621
+
1622
+	var currentParsed = parsed.expressions[separatorIndex][combinatorIndex];
1623
+
1624
+	if (tagName){
1625
+		currentParsed.tag = tagName.replace(reUnescape, '');
1626
+
1627
+	} else if (id){
1628
+		currentParsed.id = id.replace(reUnescape, '');
1629
+
1630
+	} else if (className){
1631
+		className = className.replace(reUnescape, '');
1632
+
1633
+		if (!currentParsed.classList) currentParsed.classList = [];
1634
+		if (!currentParsed.classes) currentParsed.classes = [];
1635
+		currentParsed.classList.push(className);
1636
+		currentParsed.classes.push({
1637
+			value: className,
1638
+			regexp: new RegExp('(^|\\s)' + escapeRegExp(className) + '(\\s|$)')
1639
+		});
1640
+
1641
+	} else if (pseudoClass){
1642
+		pseudoClassValue = pseudoClassValue || pseudoClassQuotedValue;
1643
+		pseudoClassValue = pseudoClassValue ? pseudoClassValue.replace(reUnescape, '') : null;
1644
+
1645
+		if (!currentParsed.pseudos) currentParsed.pseudos = [];
1646
+		currentParsed.pseudos.push({
1647
+			key: pseudoClass.replace(reUnescape, ''),
1648
+			value: pseudoClassValue,
1649
+			type: pseudoMarker.length == 1 ? 'class' : 'element'
1650
+		});
1651
+
1652
+	} else if (attributeKey){
1653
+		attributeKey = attributeKey.replace(reUnescape, '');
1654
+		attributeValue = (attributeValue || '').replace(reUnescape, '');
1655
+
1656
+		var test, regexp;
1657
+
1658
+		switch (attributeOperator){
1659
+			case '^=' : regexp = new RegExp(       '^'+ escapeRegExp(attributeValue)            ); break;
1660
+			case '$=' : regexp = new RegExp(            escapeRegExp(attributeValue) +'$'       ); break;
1661
+			case '~=' : regexp = new RegExp( '(^|\\s)'+ escapeRegExp(attributeValue) +'(\\s|$)' ); break;
1662
+			case '|=' : regexp = new RegExp(       '^'+ escapeRegExp(attributeValue) +'(-|$)'   ); break;
1663
+			case  '=' : test = function(value){
1664
+				return attributeValue == value;
1665
+			}; break;
1666
+			case '*=' : test = function(value){
1667
+				return value && value.indexOf(attributeValue) > -1;
1668
+			}; break;
1669
+			case '!=' : test = function(value){
1670
+				return attributeValue != value;
1671
+			}; break;
1672
+			default   : test = function(value){
1673
+				return !!value;
1674
+			};
1675
+		}
1676
+
1677
+		if (attributeValue == '' && (/^[*$^]=$/).test(attributeOperator)) test = function(){
1678
+			return false;
1679
+		};
1680
+
1681
+		if (!test) test = function(value){
1682
+			return value && regexp.test(value);
1683
+		};
1684
+
1685
+		if (!currentParsed.attributes) currentParsed.attributes = [];
1686
+		currentParsed.attributes.push({
1687
+			key: attributeKey,
1688
+			operator: attributeOperator,
1689
+			value: attributeValue,
1690
+			test: test
1691
+		});
1692
+
1693
+	}
1694
+
1695
+	return '';
1696
+};
1697
+
1698
+// Slick NS
1699
+
1700
+var Slick = (this.Slick || {});
1701
+
1702
+Slick.parse = function(expression){
1703
+	return parse(expression);
1704
+};
1705
+
1706
+Slick.escapeRegExp = escapeRegExp;
1707
+
1708
+if (!this.Slick) this.Slick = Slick;
1709
+
1710
+}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ? exports : /*</CommonJS>*/this);
1711
+
1712
+
1713
+/*
1714
+---
1715
+name: Slick.Finder
1716
+description: The new, superfast css selector engine.
1717
+provides: Slick.Finder
1718
+requires: Slick.Parser
1719
+...
1720
+*/
1721
+
1722
+;(function(){
1723
+
1724
+var local = {},
1725
+	featuresCache = {},
1726
+	toString = Object.prototype.toString;
1727
+
1728
+// Feature / Bug detection
1729
+
1730
+local.isNativeCode = function(fn){
1731
+	return (/\{\s*\[native code\]\s*\}/).test('' + fn);
1732
+};
1733
+
1734
+local.isXML = function(document){
1735
+	return (!!document.xmlVersion) || (!!document.xml) || (toString.call(document) == '[object XMLDocument]') ||
1736
+	(document.nodeType == 9 && document.documentElement.nodeName != 'HTML');
1737
+};
1738
+
1739
+local.setDocument = function(document){
1740
+
1741
+	// convert elements / window arguments to document. if document cannot be extrapolated, the function returns.
1742
+	var nodeType = document.nodeType;
1743
+	if (nodeType == 9); // document
1744
+	else if (nodeType) document = document.ownerDocument; // node
1745
+	else if (document.navigator) document = document.document; // window
1746
+	else return;
1747
+
1748
+	// check if it's the old document
1749
+
1750
+	if (this.document === document) return;
1751
+	this.document = document;
1752
+
1753
+	// check if we have done feature detection on this document before
1754
+
1755
+	var root = document.documentElement,
1756
+		rootUid = this.getUIDXML(root),
1757
+		features = featuresCache[rootUid],
1758
+		feature;
1759
+
1760
+	if (features){
1761
+		for (feature in features){
1762
+			this[feature] = features[feature];
1763
+		}
1764
+		return;
1765
+	}
1766
+
1767
+	features = featuresCache[rootUid] = {};
1768
+
1769
+	features.root = root;
1770
+	features.isXMLDocument = this.isXML(document);
1771
+
1772
+	features.brokenStarGEBTN
1773
+	= features.starSelectsClosedQSA
1774
+	= features.idGetsName
1775
+	= features.brokenMixedCaseQSA
1776
+	= features.brokenGEBCN
1777
+	= features.brokenCheckedQSA
1778
+	= features.brokenEmptyAttributeQSA
1779
+	= features.isHTMLDocument
1780
+	= features.nativeMatchesSelector
1781
+	= false;
1782
+
1783
+	var starSelectsClosed, starSelectsComments,
1784
+		brokenSecondClassNameGEBCN, cachedGetElementsByClassName,
1785
+		brokenFormAttributeGetter;
1786
+
1787
+	var selected, id = 'slick_uniqueid';
1788
+	var testNode = document.createElement('div');
1789
+
1790
+	var testRoot = document.body || document.getElementsByTagName('body')[0] || root;
1791
+	testRoot.appendChild(testNode);
1792
+
1793
+	// on non-HTML documents innerHTML and getElementsById doesnt work properly
1794
+	try {
1795
+		testNode.innerHTML = '<a id="'+id+'"></a>';
1796
+		features.isHTMLDocument = !!document.getElementById(id);
1797
+	} catch(e){};
1798
+
1799
+	if (features.isHTMLDocument){
1800
+
1801
+		testNode.style.display = 'none';
1802
+
1803
+		// IE returns comment nodes for getElementsByTagName('*') for some documents
1804
+		testNode.appendChild(document.createComment(''));
1805
+		starSelectsComments = (testNode.getElementsByTagName('*').length > 1);
1806
+
1807
+		// IE returns closed nodes (EG:"</foo>") for getElementsByTagName('*') for some documents
1808
+		try {
1809
+			testNode.innerHTML = 'foo</foo>';
1810
+			selected = testNode.getElementsByTagName('*');
1811
+			starSelectsClosed = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');
1812
+		} catch(e){};
1813
+
1814
+		features.brokenStarGEBTN = starSelectsComments || starSelectsClosed;
1815
+
1816
+		// IE returns elements with the name instead of just id for getElementsById for some documents
1817
+		try {
1818
+			testNode.innerHTML = '<a name="'+ id +'"></a><b id="'+ id +'"></b>';
1819
+			features.idGetsName = document.getElementById(id) === testNode.firstChild;
1820
+		} catch(e){};
1821
+
1822
+		if (testNode.getElementsByClassName){
1823
+
1824
+			// Safari 3.2 getElementsByClassName caches results
1825
+			try {
1826
+				testNode.innerHTML = '<a class="f"></a><a class="b"></a>';
1827
+				testNode.getElementsByClassName('b').length;
1828
+				testNode.firstChild.className = 'b';
1829
+				cachedGetElementsByClassName = (testNode.getElementsByClassName('b').length != 2);
1830
+			} catch(e){};
1831
+
1832
+			// Opera 9.6 getElementsByClassName doesnt detects the class if its not the first one
1833
+			try {
1834
+				testNode.innerHTML = '<a class="a"></a><a class="f b a"></a>';
1835
+				brokenSecondClassNameGEBCN = (testNode.getElementsByClassName('a').length != 2);
1836
+			} catch(e){};
1837
+
1838
+			features.brokenGEBCN = cachedGetElementsByClassName || brokenSecondClassNameGEBCN;
1839
+		}
1840
+
1841
+		if (testNode.querySelectorAll){
1842
+			// IE 8 returns closed nodes (EG:"</foo>") for querySelectorAll('*') for some documents
1843
+			try {
1844
+				testNode.innerHTML = 'foo</foo>';
1845
+				selected = testNode.querySelectorAll('*');
1846
+				features.starSelectsClosedQSA = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');
1847
+			} catch(e){};
1848
+
1849
+			// Safari 3.2 querySelectorAll doesnt work with mixedcase on quirksmode
1850
+			try {
1851
+				testNode.innerHTML = '<a class="MiX"></a>';
1852
+				features.brokenMixedCaseQSA = !testNode.querySelectorAll('.MiX').length;
1853
+			} catch(e){};
1854
+
1855
+			// Webkit and Opera dont return selected options on querySelectorAll
1856
+			try {
1857
+				testNode.innerHTML = '<select><option selected="selected">a</option></select>';
1858
+				features.brokenCheckedQSA = (testNode.querySelectorAll(':checked').length == 0);
1859
+			} catch(e){};
1860
+
1861
+			// IE returns incorrect results for attr[*^$]="" selectors on querySelectorAll
1862
+			try {
1863
+				testNode.innerHTML = '<a class=""></a>';
1864
+				features.brokenEmptyAttributeQSA = (testNode.querySelectorAll('[class*=""]').length != 0);
1865
+			} catch(e){};
1866
+
1867
+		}
1868
+
1869
+		// IE6-7, if a form has an input of id x, form.getAttribute(x) returns a reference to the input
1870
+		try {
1871
+			testNode.innerHTML = '<form action="s"><input id="action"/></form>';
1872
+			brokenFormAttributeGetter = (testNode.firstChild.getAttribute('action') != 's');
1873
+		} catch(e){};
1874
+
1875
+		// native matchesSelector function
1876
+
1877
+		features.nativeMatchesSelector = root.matchesSelector || /*root.msMatchesSelector ||*/ root.mozMatchesSelector || root.webkitMatchesSelector;
1878
+		if (features.nativeMatchesSelector) try {
1879
+			// if matchesSelector trows errors on incorrect sintaxes we can use it
1880
+			features.nativeMatchesSelector.call(root, ':slick');
1881
+			features.nativeMatchesSelector = null;
1882
+		} catch(e){};
1883
+
1884
+	}
1885
+
1886
+	try {
1887
+		root.slick_expando = 1;
1888
+		delete root.slick_expando;
1889
+		features.getUID = this.getUIDHTML;
1890
+	} catch(e) {
1891
+		features.getUID = this.getUIDXML;
1892
+	}
1893
+
1894
+	testRoot.removeChild(testNode);
1895
+	testNode = selected = testRoot = null;
1896
+
1897
+	// getAttribute
1898
+
1899
+	features.getAttribute = (features.isHTMLDocument && brokenFormAttributeGetter) ? function(node, name){
1900
+		var method = this.attributeGetters[name];
1901
+		if (method) return method.call(node);
1902
+		var attributeNode = node.getAttributeNode(name);
1903
+		return (attributeNode) ? attributeNode.nodeValue : null;
1904
+	} : function(node, name){
1905
+		var method = this.attributeGetters[name];
1906
+		return (method) ? method.call(node) : node.getAttribute(name);
1907
+	};
1908
+
1909
+	// hasAttribute
1910
+
1911
+	features.hasAttribute = (root && this.isNativeCode(root.hasAttribute)) ? function(node, attribute) {
1912
+		return node.hasAttribute(attribute);
1913
+	} : function(node, attribute) {
1914
+		node = node.getAttributeNode(attribute);
1915
+		return !!(node && (node.specified || node.nodeValue));
1916
+	};
1917
+
1918
+	// contains
1919
+	// FIXME: Add specs: local.contains should be different for xml and html documents?
1920
+	features.contains = (root && this.isNativeCode(root.contains)) ? function(context, node){
1921
+		return context.contains(node);
1922
+	} : (root && root.compareDocumentPosition) ? function(context, node){
1923
+		return context === node || !!(context.compareDocumentPosition(node) & 16);
1924
+	} : function(context, node){
1925
+		if (node) do {
1926
+			if (node === context) return true;
1927
+		} while ((node = node.parentNode));
1928
+		return false;
1929
+	};
1930
+
1931
+	// document order sorting
1932
+	// credits to Sizzle (http://sizzlejs.com/)
1933
+
1934
+	features.documentSorter = (root.compareDocumentPosition) ? function(a, b){
1935
+		if (!a.compareDocumentPosition || !b.compareDocumentPosition) return 0;
1936
+		return a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
1937
+	} : ('sourceIndex' in root) ? function(a, b){
1938
+		if (!a.sourceIndex || !b.sourceIndex) return 0;
1939
+		return a.sourceIndex - b.sourceIndex;
1940
+	} : (document.createRange) ? function(a, b){
1941
+		if (!a.ownerDocument || !b.ownerDocument) return 0;
1942
+		var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
1943
+		aRange.setStart(a, 0);
1944
+		aRange.setEnd(a, 0);
1945
+		bRange.setStart(b, 0);
1946
+		bRange.setEnd(b, 0);
1947
+		return aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
1948
+	} : null ;
1949
+
1950
+	root = null;
1951
+
1952
+	for (feature in features){
1953
+		this[feature] = features[feature];
1954
+	}
1955
+};
1956
+
1957
+// Main Method
1958
+
1959
+var reSimpleSelector = /^([#.]?)((?:[\w-]+|\*))$/,
1960
+	reEmptyAttribute = /\[.+[*$^]=(?:""|'')?\]/,
1961
+	qsaFailExpCache = {};
1962
+
1963
+local.search = function(context, expression, append, first){
1964
+
1965
+	var found = this.found = (first) ? null : (append || []);
1966
+
1967
+	if (!context) return found;
1968
+	else if (context.navigator) context = context.document; // Convert the node from a window to a document
1969
+	else if (!context.nodeType) return found;
1970
+
1971
+	// setup
1972
+
1973
+	var parsed, i,
1974
+		uniques = this.uniques = {},
1975
+		hasOthers = !!(append && append.length),
1976
+		contextIsDocument = (context.nodeType == 9);
1977
+
1978
+	if (this.document !== (contextIsDocument ? context : context.ownerDocument)) this.setDocument(context);
1979
+
1980
+	// avoid duplicating items already in the append array
1981
+	if (hasOthers) for (i = found.length; i--;) uniques[this.getUID(found[i])] = true;
1982
+
1983
+	// expression checks
1984
+
1985
+	if (typeof expression == 'string'){ // expression is a string
1986
+
1987
+		/*<simple-selectors-override>*/
1988
+		var simpleSelector = expression.match(reSimpleSelector);
1989
+		simpleSelectors: if (simpleSelector) {
1990
+
1991
+			var symbol = simpleSelector[1],
1992
+				name = simpleSelector[2],
1993
+				node, nodes;
1994
+
1995
+			if (!symbol){
1996
+
1997
+				if (name == '*' && this.brokenStarGEBTN) break simpleSelectors;
1998
+				nodes = context.getElementsByTagName(name);
1999
+				if (first) return nodes[0] || null;
2000
+				for (i = 0; node = nodes[i++];){
2001
+					if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
2002
+				}
2003
+
2004
+			} else if (symbol == '#'){
2005
+
2006
+				if (!this.isHTMLDocument || !contextIsDocument) break simpleSelectors;
2007
+				node = context.getElementById(name);
2008
+				if (!node) return found;
2009
+				if (this.idGetsName && node.getAttributeNode('id').nodeValue != name) break simpleSelectors;
2010
+				if (first) return node || null;
2011
+				if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
2012
+
2013
+			} else if (symbol == '.'){
2014
+
2015
+				if (!this.isHTMLDocument || ((!context.getElementsByClassName || this.brokenGEBCN) && context.querySelectorAll)) break simpleSelectors;
2016
+				if (context.getElementsByClassName && !this.brokenGEBCN){
2017
+					nodes = context.getElementsByClassName(name);
2018
+					if (first) return nodes[0] || null;
2019
+					for (i = 0; node = nodes[i++];){
2020
+						if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
2021
+					}
2022
+				} else {
2023
+					var matchClass = new RegExp('(^|\\s)'+ Slick.escapeRegExp(name) +'(\\s|$)');
2024
+					nodes = context.getElementsByTagName('*');
2025
+					for (i = 0; node = nodes[i++];){
2026
+						className = node.className;
2027
+						if (!(className && matchClass.test(className))) continue;
2028
+						if (first) return node;
2029
+						if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
2030
+					}
2031
+				}
2032
+
2033
+			}
2034
+
2035
+			if (hasOthers) this.sort(found);
2036
+			return (first) ? null : found;
2037
+
2038
+		}
2039
+		/*</simple-selectors-override>*/
2040
+
2041
+		/*<query-selector-override>*/
2042
+		querySelector: if (context.querySelectorAll) {
2043
+
2044
+			if (!this.isHTMLDocument || this.brokenMixedCaseQSA || qsaFailExpCache[expression] ||
2045
+			(this.brokenCheckedQSA && expression.indexOf(':checked') > -1) ||
2046
+			(this.brokenEmptyAttributeQSA && reEmptyAttribute.test(expression)) || Slick.disableQSA) break querySelector;
2047
+
2048
+			var _expression = expression;
2049
+			if (!contextIsDocument){
2050
+				// non-document rooted QSA
2051
+				// credits to Andrew Dupont
2052
+				var currentId = context.getAttribute('id'), slickid = 'slickid__';
2053
+				context.setAttribute('id', slickid);
2054
+				_expression = '#' + slickid + ' ' + _expression;
2055
+			}
2056
+
2057
+			try {
2058
+				if (first) return context.querySelector(_expression) || null;
2059
+				else nodes = context.querySelectorAll(_expression);
2060
+			} catch(e) {
2061
+				qsaFailExpCache[expression] = 1;
2062
+				break querySelector;
2063
+			} finally {
2064
+				if (!contextIsDocument){
2065
+					if (currentId) context.setAttribute('id', currentId);
2066
+					else context.removeAttribute('id');
2067
+				}
2068
+			}
2069
+
2070
+			if (this.starSelectsClosedQSA) for (i = 0; node = nodes[i++];){
2071
+				if (node.nodeName > '@' && !(hasOthers && uniques[this.getUID(node)])) found.push(node);
2072
+			} else for (i = 0; node = nodes[i++];){
2073
+				if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
2074
+			}
2075
+
2076
+			if (hasOthers) this.sort(found);
2077
+			return found;
2078
+
2079
+		}
2080
+		/*</query-selector-override>*/
2081
+
2082
+		parsed = this.Slick.parse(expression);
2083
+		if (!parsed.length) return found;
2084
+	} else if (expression == null){ // there is no expression
2085
+		return found;
2086
+	} else if (expression.Slick){ // expression is a parsed Slick object
2087
+		parsed = expression;
2088
+	} else if (this.contains(context.documentElement || context, expression)){ // expression is a node
2089
+		(found) ? found.push(expression) : found = expression;
2090
+		return found;
2091
+	} else { // other junk
2092
+		return found;
2093
+	}
2094
+
2095
+	/*<pseudo-selectors>*//*<nth-pseudo-selectors>*/
2096
+
2097
+	// cache elements for the nth selectors
2098
+
2099
+	this.posNTH = {};
2100
+	this.posNTHLast = {};
2101
+	this.posNTHType = {};
2102
+	this.posNTHTypeLast = {};
2103
+
2104
+	/*</nth-pseudo-selectors>*//*</pseudo-selectors>*/
2105
+
2106
+	// if append is null and there is only a single selector with one expression use pushArray, else use pushUID
2107
+	this.push = (!hasOthers && (first || (parsed.length == 1 && parsed.expressions[0].length == 1))) ? this.pushArray : this.pushUID;
2108
+
2109
+	if (found == null) found = [];
2110
+
2111
+	// default engine
2112
+
2113
+	var j, m, n;
2114
+	var combinator, tag, id, classList, classes, attributes, pseudos;
2115
+	var currentItems, currentExpression, currentBit, lastBit, expressions = parsed.expressions;
2116
+
2117
+	search: for (i = 0; (currentExpression = expressions[i]); i++) for (j = 0; (currentBit = currentExpression[j]); j++){
2118
+
2119
+		combinator = 'combinator:' + currentBit.combinator;
2120
+		if (!this[combinator]) continue search;
2121
+
2122
+		tag        = (this.isXMLDocument) ? currentBit.tag : currentBit.tag.toUpperCase();
2123
+		id         = currentBit.id;
2124
+		classList  = currentBit.classList;
2125
+		classes    = currentBit.classes;
2126
+		attributes = currentBit.attributes;
2127
+		pseudos    = currentBit.pseudos;
2128
+		lastBit    = (j === (currentExpression.length - 1));
2129
+
2130
+		this.bitUniques = {};
2131
+
2132
+		if (lastBit){
2133
+			this.uniques = uniques;
2134
+			this.found = found;
2135
+		} else {
2136
+			this.uniques = {};
2137
+			this.found = [];
2138
+		}
2139
+
2140
+		if (j === 0){
2141
+			this[combinator](context, tag, id, classes, attributes, pseudos, classList);
2142
+			if (first && lastBit && found.length) break search;
2143
+		} else {
2144
+			if (first && lastBit) for (m = 0, n = currentItems.length; m < n; m++){
2145
+				this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);
2146
+				if (found.length) break search;
2147
+			} else for (m = 0, n = currentItems.length; m < n; m++) this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);
2148
+		}
2149
+
2150
+		currentItems = this.found;
2151
+	}
2152
+
2153
+	// should sort if there are nodes in append and if you pass multiple expressions.
2154
+	if (hasOthers || (parsed.expressions.length > 1)) this.sort(found);
2155
+
2156
+	return (first) ? (found[0] || null) : found;
2157
+};
2158
+
2159
+// Utils
2160
+
2161
+local.uidx = 1;
2162
+local.uidk = 'slick-uniqueid';
2163
+
2164
+local.getUIDXML = function(node){
2165
+	var uid = node.getAttribute(this.uidk);
2166
+	if (!uid){
2167
+		uid = this.uidx++;
2168
+		node.setAttribute(this.uidk, uid);
2169
+	}
2170
+	return uid;
2171
+};
2172
+
2173
+local.getUIDHTML = function(node){
2174
+	return node.uniqueNumber || (node.uniqueNumber = this.uidx++);
2175
+};
2176
+
2177
+// sort based on the setDocument documentSorter method.
2178
+
2179
+local.sort = function(results){
2180
+	if (!this.documentSorter) return results;
2181
+	results.sort(this.documentSorter);
2182
+	return results;
2183
+};
2184
+
2185
+/*<pseudo-selectors>*//*<nth-pseudo-selectors>*/
2186
+
2187
+local.cacheNTH = {};
2188
+
2189
+local.matchNTH = /^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;
2190
+
2191
+local.parseNTHArgument = function(argument){
2192
+	var parsed = argument.match(this.matchNTH);
2193
+	if (!parsed) return false;
2194
+	var special = parsed[2] || false;
2195
+	var a = parsed[1] || 1;
2196
+	if (a == '-') a = -1;
2197
+	var b = +parsed[3] || 0;
2198
+	parsed =
2199
+		(special == 'n')	? {a: a, b: b} :
2200
+		(special == 'odd')	? {a: 2, b: 1} :
2201
+		(special == 'even')	? {a: 2, b: 0} : {a: 0, b: a};
2202
+
2203
+	return (this.cacheNTH[argument] = parsed);
2204
+};
2205
+
2206
+local.createNTHPseudo = function(child, sibling, positions, ofType){
2207
+	return function(node, argument){
2208
+		var uid = this.getUID(node);
2209
+		if (!this[positions][uid]){
2210
+			var parent = node.parentNode;
2211
+			if (!parent) return false;
2212
+			var el = parent[child], count = 1;
2213
+			if (ofType){
2214
+				var nodeName = node.nodeName;
2215
+				do {
2216
+					if (el.nodeName != nodeName) continue;
2217
+					this[positions][this.getUID(el)] = count++;
2218
+				} while ((el = el[sibling]));
2219
+			} else {
2220
+				do {
2221
+					if (el.nodeType != 1) continue;
2222
+					this[positions][this.getUID(el)] = count++;
2223
+				} while ((el = el[sibling]));
2224
+			}
2225
+		}
2226
+		argument = argument || 'n';
2227
+		var parsed = this.cacheNTH[argument] || this.parseNTHArgument(argument);
2228
+		if (!parsed) return false;
2229
+		var a = parsed.a, b = parsed.b, pos = this[positions][uid];
2230
+		if (a == 0) return b == pos;
2231
+		if (a > 0){
2232
+			if (pos < b) return false;
2233
+		} else {
2234
+			if (b < pos) return false;
2235
+		}
2236
+		return ((pos - b) % a) == 0;
2237
+	};
2238
+};
2239
+
2240
+/*</nth-pseudo-selectors>*//*</pseudo-selectors>*/
2241
+
2242
+local.pushArray = function(node, tag, id, classes, attributes, pseudos){
2243
+	if (this.matchSelector(node, tag, id, classes, attributes, pseudos)) this.found.push(node);
2244
+};
2245
+
2246
+local.pushUID = function(node, tag, id, classes, attributes, pseudos){
2247
+	var uid = this.getUID(node);
2248
+	if (!this.uniques[uid] && this.matchSelector(node, tag, id, classes, attributes, pseudos)){
2249
+		this.uniques[uid] = true;
2250
+		this.found.push(node);
2251
+	}
2252
+};
2253
+
2254
+local.matchNode = function(node, selector){
2255
+	if (this.isHTMLDocument && this.nativeMatchesSelector){
2256
+		try {
2257
+			return this.nativeMatchesSelector.call(node, selector.replace(/\[([^=]+)=\s*([^'"\]]+?)\s*\]/g, '[$1="$2"]'));
2258
+		} catch(matchError) {}
2259
+	}
2260
+
2261
+	var parsed = this.Slick.parse(selector);
2262
+	if (!parsed) return true;
2263
+
2264
+	// simple (single) selectors
2265
+	var expressions = parsed.expressions, reversedExpressions, simpleExpCounter = 0, i;
2266
+	for (i = 0; (currentExpression = expressions[i]); i++){
2267
+		if (currentExpression.length == 1){
2268
+			var exp = currentExpression[0];
2269
+			if (this.matchSelector(node, (this.isXMLDocument) ? exp.tag : exp.tag.toUpperCase(), exp.id, exp.classes, exp.attributes, exp.pseudos)) return true;
2270
+			simpleExpCounter++;
2271
+		}
2272
+	}
2273
+
2274
+	if (simpleExpCounter == parsed.length) return false;
2275
+
2276
+	var nodes = this.search(this.document, parsed), item;
2277
+	for (i = 0; item = nodes[i++];){
2278
+		if (item === node) return true;
2279
+	}
2280
+	return false;
2281
+};
2282
+
2283
+local.matchPseudo = function(node, name, argument){
2284
+	var pseudoName = 'pseudo:' + name;
2285
+	if (this[pseudoName]) return this[pseudoName](node, argument);
2286
+	var attribute = this.getAttribute(node, name);
2287
+	return (argument) ? argument == attribute : !!attribute;
2288
+};
2289
+
2290
+local.matchSelector = function(node, tag, id, classes, attributes, pseudos){
2291
+	if (tag){
2292
+		var nodeName = (this.isXMLDocument) ? node.nodeName : node.nodeName.toUpperCase();
2293
+		if (tag == '*'){
2294
+			if (nodeName < '@') return false; // Fix for comment nodes and closed nodes
2295
+		} else {
2296
+			if (nodeName != tag) return false;
2297
+		}
2298
+	}
2299
+
2300
+	if (id && node.getAttribute('id') != id) return false;
2301
+
2302
+	var i, part, cls;
2303
+	if (classes) for (i = classes.length; i--;){
2304
+		cls = node.getAttribute('class') || node.className;
2305
+		if (!(cls && classes[i].regexp.test(cls))) return false;
2306
+	}
2307
+	if (attributes) for (i = attributes.length; i--;){
2308
+		part = attributes[i];
2309
+		if (part.operator ? !part.test(this.getAttribute(node, part.key)) : !this.hasAttribute(node, part.key)) return false;
2310
+	}
2311
+	if (pseudos) for (i = pseudos.length; i--;){
2312
+		part = pseudos[i];
2313
+		if (!this.matchPseudo(node, part.key, part.value)) return false;
2314
+	}
2315
+	return true;
2316
+};
2317
+
2318
+var combinators = {
2319
+
2320
+	' ': function(node, tag, id, classes, attributes, pseudos, classList){ // all child nodes, any level
2321
+
2322
+		var i, item, children;
2323
+
2324
+		if (this.isHTMLDocument){
2325
+			getById: if (id){
2326
+				item = this.document.getElementById(id);
2327
+				if ((!item && node.all) || (this.idGetsName && item && item.getAttributeNode('id').nodeValue != id)){
2328
+					// all[id] returns all the elements with that name or id inside node
2329
+					// if theres just one it will return the element, else it will be a collection
2330
+					children = node.all[id];
2331
+					if (!children) return;
2332
+					if (!children[0]) children = [children];
2333
+					for (i = 0; item = children[i++];){
2334
+						var idNode = item.getAttributeNode('id');
2335
+						if (idNode && idNode.nodeValue == id){
2336
+							this.push(item, tag, null, classes, attributes, pseudos);
2337
+							break;
2338
+						}
2339
+					}
2340
+					return;
2341
+				}
2342
+				if (!item){
2343
+					// if the context is in the dom we return, else we will try GEBTN, breaking the getById label
2344
+					if (this.contains(this.root, node)) return;
2345
+					else break getById;
2346
+				} else if (this.document !== node && !this.contains(node, item)) return;
2347
+				this.push(item, tag, null, classes, attributes, pseudos);
2348
+				return;
2349
+			}
2350
+			getByClass: if (classes && node.getElementsByClassName && !this.brokenGEBCN){
2351
+				children = node.getElementsByClassName(classList.join(' '));
2352
+				if (!(children && children.length)) break getByClass;
2353
+				for (i = 0; item = children[i++];) this.push(item, tag, id, null, attributes, pseudos);
2354
+				return;
2355
+			}
2356
+		}
2357
+		getByTag: {
2358
+			children = node.getElementsByTagName(tag);
2359
+			if (!(children && children.length)) break getByTag;
2360
+			if (!this.brokenStarGEBTN) tag = null;
2361
+			for (i = 0; item = children[i++];) this.push(item, tag, id, classes, attributes, pseudos);
2362
+		}
2363
+	},
2364
+
2365
+	'>': function(node, tag, id, classes, attributes, pseudos){ // direct children
2366
+		if ((node = node.firstChild)) do {
2367
+			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
2368
+		} while ((node = node.nextSibling));
2369
+	},
2370
+
2371
+	'+': function(node, tag, id, classes, attributes, pseudos){ // next sibling
2372
+		while ((node = node.nextSibling)) if (node.nodeType == 1){
2373
+			this.push(node, tag, id, classes, attributes, pseudos);
2374
+			break;
2375
+		}
2376
+	},
2377
+
2378
+	'^': function(node, tag, id, classes, attributes, pseudos){ // first child
2379
+		node = node.firstChild;
2380
+		if (node){
2381
+			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
2382
+			else this['combinator:+'](node, tag, id, classes, attributes, pseudos);
2383
+		}
2384
+	},
2385
+
2386
+	'~': function(node, tag, id, classes, attributes, pseudos){ // next siblings
2387
+		while ((node = node.nextSibling)){
2388
+			if (node.nodeType != 1) continue;
2389
+			var uid = this.getUID(node);
2390
+			if (this.bitUniques[uid]) break;
2391
+			this.bitUniques[uid] = true;
2392
+			this.push(node, tag, id, classes, attributes, pseudos);
2393
+		}
2394
+	},
2395
+
2396
+	'++': function(node, tag, id, classes, attributes, pseudos){ // next sibling and previous sibling
2397
+		this['combinator:+'](node, tag, id, classes, attributes, pseudos);
2398
+		this['combinator:!+'](node, tag, id, classes, attributes, pseudos);
2399
+	},
2400
+
2401
+	'~~': function(node, tag, id, classes, attributes, pseudos){ // next siblings and previous siblings
2402
+		this['combinator:~'](node, tag, id, classes, attributes, pseudos);
2403
+		this['combinator:!~'](node, tag, id, classes, attributes, pseudos);
2404
+	},
2405
+
2406
+	'!': function(node, tag, id, classes, attributes, pseudos){ // all parent nodes up to document
2407
+		while ((node = node.parentNode)) if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);
2408
+	},
2409
+
2410
+	'!>': function(node, tag, id, classes, attributes, pseudos){ // direct parent (one level)
2411
+		node = node.parentNode;
2412
+		if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);
2413
+	},
2414
+
2415
+	'!+': function(node, tag, id, classes, attributes, pseudos){ // previous sibling
2416
+		while ((node = node.previousSibling)) if (node.nodeType == 1){
2417
+			this.push(node, tag, id, classes, attributes, pseudos);
2418
+			break;
2419
+		}
2420
+	},
2421
+
2422
+	'!^': function(node, tag, id, classes, attributes, pseudos){ // last child
2423
+		node = node.lastChild;
2424
+		if (node){
2425
+			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
2426
+			else this['combinator:!+'](node, tag, id, classes, attributes, pseudos);
2427
+		}
2428
+	},
2429
+
2430
+	'!~': function(node, tag, id, classes, attributes, pseudos){ // previous siblings
2431
+		while ((node = node.previousSibling)){
2432
+			if (node.nodeType != 1) continue;
2433
+			var uid = this.getUID(node);
2434
+			if (this.bitUniques[uid]) break;
2435
+			this.bitUniques[uid] = true;
2436
+			this.push(node, tag, id, classes, attributes, pseudos);
2437
+		}
2438
+	}
2439
+
2440
+};
2441
+
2442
+for (var c in combinators) local['combinator:' + c] = combinators[c];
2443
+
2444
+var pseudos = {
2445
+
2446
+	/*<pseudo-selectors>*/
2447
+
2448
+	'empty': function(node){
2449
+		var child = node.firstChild;
2450
+		return !(child && child.nodeType == 1) && !(node.innerText || node.textContent || '').length;
2451
+	},
2452
+
2453
+	'not': function(node, expression){
2454
+		return !this.matchNode(node, expression);
2455
+	},
2456
+
2457
+	'contains': function(node, text){
2458
+		return (node.innerText || node.textContent || '').indexOf(text) > -1;
2459
+	},
2460
+
2461
+	'first-child': function(node){
2462
+		while ((node = node.previousSibling)) if (node.nodeType == 1) return false;
2463
+		return true;
2464
+	},
2465
+
2466
+	'last-child': function(node){
2467
+		while ((node = node.nextSibling)) if (node.nodeType == 1) return false;
2468
+		return true;
2469
+	},
2470
+
2471
+	'only-child': function(node){
2472
+		var prev = node;
2473
+		while ((prev = prev.previousSibling)) if (prev.nodeType == 1) return false;
2474
+		var next = node;
2475
+		while ((next = next.nextSibling)) if (next.nodeType == 1) return false;
2476
+		return true;
2477
+	},
2478
+
2479
+	/*<nth-pseudo-selectors>*/
2480
+
2481
+	'nth-child': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTH'),
2482
+
2483
+	'nth-last-child': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHLast'),
2484
+
2485
+	'nth-of-type': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTHType', true),
2486
+
2487
+	'nth-last-of-type': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHTypeLast', true),
2488
+
2489
+	'index': function(node, index){
2490
+		return this['pseudo:nth-child'](node, '' + index + 1);
2491
+	},
2492
+
2493
+	'even': function(node){
2494
+		return this['pseudo:nth-child'](node, '2n');
2495
+	},
2496
+
2497
+	'odd': function(node){
2498
+		return this['pseudo:nth-child'](node, '2n+1');
2499
+	},
2500
+
2501
+	/*</nth-pseudo-selectors>*/
2502
+
2503
+	/*<of-type-pseudo-selectors>*/
2504
+
2505
+	'first-of-type': function(node){
2506
+		var nodeName = node.nodeName;
2507
+		while ((node = node.previousSibling)) if (node.nodeName == nodeName) return false;
2508
+		return true;
2509
+	},
2510
+
2511
+	'last-of-type': function(node){
2512
+		var nodeName = node.nodeName;
2513
+		while ((node = node.nextSibling)) if (node.nodeName == nodeName) return false;
2514
+		return true;
2515
+	},
2516
+
2517
+	'only-of-type': function(node){
2518
+		var prev = node, nodeName = node.nodeName;
2519
+		while ((prev = prev.previousSibling)) if (prev.nodeName == nodeName) return false;
2520
+		var next = node;
2521
+		while ((next = next.nextSibling)) if (next.nodeName == nodeName) return false;
2522
+		return true;
2523
+	},
2524
+
2525
+	/*</of-type-pseudo-selectors>*/
2526
+
2527
+	// custom pseudos
2528
+
2529
+	'enabled': function(node){
2530
+		return !node.disabled;
2531
+	},
2532
+
2533
+	'disabled': function(node){
2534
+		return node.disabled;
2535
+	},
2536
+
2537
+	'checked': function(node){
2538
+		return node.checked || node.selected;
2539
+	},
2540
+
2541
+	'focus': function(node){
2542
+		return this.isHTMLDocument && this.document.activeElement === node && (node.href || node.type || this.hasAttribute(node, 'tabindex'));
2543
+	},
2544
+
2545
+	'root': function(node){
2546
+		return (node === this.root);
2547
+	},
2548
+
2549
+	'selected': function(node){
2550
+		return node.selected;
2551
+	}
2552
+
2553
+	/*</pseudo-selectors>*/
2554
+};
2555
+
2556
+for (var p in pseudos) local['pseudo:' + p] = pseudos[p];
2557
+
2558
+// attributes methods
2559
+
2560
+local.attributeGetters = {
2561
+
2562
+	'class': function(){
2563
+		return this.getAttribute('class') || this.className;
2564
+	},
2565
+
2566
+	'for': function(){
2567
+		return ('htmlFor' in this) ? this.htmlFor : this.getAttribute('for');
2568
+	},
2569
+
2570
+	'href': function(){
2571
+		return ('href' in this) ? this.getAttribute('href', 2) : this.getAttribute('href');
2572
+	},
2573
+
2574
+	'style': function(){
2575
+		return (this.style) ? this.style.cssText : this.getAttribute('style');
2576
+	},
2577
+
2578
+	'tabindex': function(){
2579
+		var attributeNode = this.getAttributeNode('tabindex');
2580
+		return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null;
2581
+	},
2582
+
2583
+	'type': function(){
2584
+		return this.getAttribute('type');
2585
+	}
2586
+
2587
+};
2588
+
2589
+// Slick
2590
+
2591
+var Slick = local.Slick = (this.Slick || {});
2592
+
2593
+Slick.version = '1.1.5';
2594
+
2595
+// Slick finder
2596
+
2597
+Slick.search = function(context, expression, append){
2598
+	return local.search(context, expression, append);
2599
+};
2600
+
2601
+Slick.find = function(context, expression){
2602
+	return local.search(context, expression, null, true);
2603
+};
2604
+
2605
+// Slick containment checker
2606
+
2607
+Slick.contains = function(container, node){
2608
+	local.setDocument(container);
2609
+	return local.contains(container, node);
2610
+};
2611
+
2612
+// Slick attribute getter
2613
+
2614
+Slick.getAttribute = function(node, name){
2615
+	return local.getAttribute(node, name);
2616
+};
2617
+
2618
+// Slick matcher
2619
+
2620
+Slick.match = function(node, selector){
2621
+	if (!(node && selector)) return false;
2622
+	if (!selector || selector === node) return true;
2623
+	local.setDocument(node);
2624
+	return local.matchNode(node, selector);
2625
+};
2626
+
2627
+// Slick attribute accessor
2628
+
2629
+Slick.defineAttributeGetter = function(name, fn){
2630
+	local.attributeGetters[name] = fn;
2631
+	return this;
2632
+};
2633
+
2634
+Slick.lookupAttributeGetter = function(name){
2635
+	return local.attributeGetters[name];
2636
+};
2637
+
2638
+// Slick pseudo accessor
2639
+
2640
+Slick.definePseudo = function(name, fn){
2641
+	local['pseudo:' + name] = function(node, argument){
2642
+		return fn.call(node, argument);
2643
+	};
2644
+	return this;
2645
+};
2646
+
2647
+Slick.lookupPseudo = function(name){
2648
+	var pseudo = local['pseudo:' + name];
2649
+	if (pseudo) return function(argument){
2650
+		return pseudo.call(this, argument);
2651
+	};
2652
+	return null;
2653
+};
2654
+
2655
+// Slick overrides accessor
2656
+
2657
+Slick.override = function(regexp, fn){
2658
+	local.override(regexp, fn);
2659
+	return this;
2660
+};
2661
+
2662
+Slick.isXML = local.isXML;
2663
+
2664
+Slick.uidOf = function(node){
2665
+	return local.getUIDHTML(node);
2666
+};
2667
+
2668
+if (!this.Slick) this.Slick = Slick;
2669
+
2670
+}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ? exports : /*</CommonJS>*/this);
2671
+
2672
+
2673
+/*
2674
+---
2675
+
2676
+name: Element
2677
+
2678
+description: One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser, time-saver methods to let you easily work with HTML Elements.
2679
+
2680
+license: MIT-style license.
2681
+
2682
+requires: [Window, Document, Array, String, Function, Number, Slick.Parser, Slick.Finder]
2683
+
2684
+provides: [Element, Elements, $, $$, Iframe, Selectors]
2685
+
2686
+...
2687
+*/
2688
+
2689
+var Element = function(tag, props){
2690
+	var konstructor = Element.Constructors[tag];
2691
+	if (konstructor) return konstructor(props);
2692
+	if (typeof tag != 'string') return document.id(tag).set(props);
2693
+
2694
+	if (!props) props = {};
2695
+
2696
+	if (!(/^[\w-]+$/).test(tag)){
2697
+		var parsed = Slick.parse(tag).expressions[0][0];
2698
+		tag = (parsed.tag == '*') ? 'div' : parsed.tag;
2699
+		if (parsed.id && props.id == null) props.id = parsed.id;
2700
+
2701
+		var attributes = parsed.attributes;
2702
+		if (attributes) for (var i = 0, l = attributes.length; i < l; i++){
2703
+			var attr = attributes[i];
2704
+			if (attr.value != null && attr.operator == '=' && props[attr.key] == null)
2705
+				props[attr.key] = attr.value;
2706
+		}
2707
+
2708
+		if (parsed.classList && props['class'] == null) props['class'] = parsed.classList.join(' ');
2709
+	}
2710
+
2711
+	return document.newElement(tag, props);
2712
+};
2713
+
2714
+if (Browser.Element) Element.prototype = Browser.Element.prototype;
2715
+
2716
+new Type('Element', Element).mirror(function(name){
2717
+	if (Array.prototype[name]) return;
2718
+
2719
+	var obj = {};
2720
+	obj[name] = function(){
2721
+		var results = [], args = arguments, elements = true;
2722
+		for (var i = 0, l = this.length; i < l; i++){
2723
+			var element = this[i], result = results[i] = element[name].apply(element, args);
2724
+			elements = (elements && typeOf(result) == 'element');
2725
+		}
2726
+		return (elements) ? new Elements(results) : results;
2727
+	};
2728
+
2729
+	Elements.implement(obj);
2730
+});
2731
+
2732
+if (!Browser.Element){
2733
+	Element.parent = Object;
2734
+
2735
+	Element.Prototype = {'$family': Function.from('element').hide()};
2736
+
2737
+	Element.mirror(function(name, method){
2738
+		Element.Prototype[name] = method;
2739
+	});
2740
+}
2741
+
2742
+Element.Constructors = {};
2743
+
2744
+
2745
+
2746
+var IFrame = new Type('IFrame', function(){
2747
+	var params = Array.link(arguments, {
2748
+		properties: Type.isObject,
2749
+		iframe: function(obj){
2750
+			return (obj != null);
2751
+		}
2752
+	});
2753
+
2754
+	var props = params.properties || {}, iframe;
2755
+	if (params.iframe) iframe = document.id(params.iframe);
2756
+	var onload = props.onload || function(){};
2757
+	delete props.onload;
2758
+	props.id = props.name = [props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + String.uniqueID()].pick();
2759
+	iframe = new Element(iframe || 'iframe', props);
2760
+
2761
+	var onLoad = function(){
2762
+		onload.call(iframe.contentWindow);
2763
+	};
2764
+
2765
+	if (window.frames[props.id]) onLoad();
2766
+	else iframe.addListener('load', onLoad);
2767
+	return iframe;
2768
+});
2769
+
2770
+var Elements = this.Elements = function(nodes){
2771
+	if (nodes && nodes.length){
2772
+		var uniques = {}, node;
2773
+		for (var i = 0; node = nodes[i++];){
2774
+			var uid = Slick.uidOf(node);
2775
+			if (!uniques[uid]){
2776
+				uniques[uid] = true;
2777
+				this.push(node);
2778
+			}
2779
+		}
2780
+	}
2781
+};
2782
+
2783
+Elements.prototype = {length: 0};
2784
+Elements.parent = Array;
2785
+
2786
+new Type('Elements', Elements).implement({
2787
+
2788
+	filter: function(filter, bind){
2789
+		if (!filter) return this;
2790
+		return new Elements(Array.filter(this, (typeOf(filter) == 'string') ? function(item){
2791
+			return item.match(filter);
2792
+		} : filter, bind));
2793
+	}.protect(),
2794
+
2795
+	push: function(){
2796
+		var length = this.length;
2797
+		for (var i = 0, l = arguments.length; i < l; i++){
2798
+			var item = document.id(arguments[i]);
2799
+			if (item) this[length++] = item;
2800
+		}
2801
+		return (this.length = length);
2802
+	}.protect(),
2803
+
2804
+	unshift: function(){
2805
+		var items = [];
2806
+		for (var i = 0, l = arguments.length; i < l; i++){
2807
+			var item = document.id(arguments[i]);
2808
+			if (item) items.push(item);
2809
+		}
2810
+		return Array.prototype.unshift.apply(this, items);
2811
+	}.protect(),
2812
+
2813
+	concat: function(){
2814
+		var newElements = new Elements(this);
2815
+		for (var i = 0, l = arguments.length; i < l; i++){
2816
+			var item = arguments[i];
2817
+			if (Type.isEnumerable(item)) newElements.append(item);
2818
+			else newElements.push(item);
2819
+		}
2820
+		return newElements;
2821
+	}.protect(),
2822
+
2823
+	append: function(collection){
2824
+		for (var i = 0, l = collection.length; i < l; i++) this.push(collection[i]);
2825
+		return this;
2826
+	}.protect(),
2827
+
2828
+	empty: function(){
2829
+		while (this.length) delete this[--this.length];
2830
+		return this;
2831
+	}.protect()
2832
+
2833
+});
2834
+
2835
+
2836
+
2837
+(function(){
2838
+
2839
+// FF, IE
2840
+var splice = Array.prototype.splice, object = {'0': 0, '1': 1, length: 2};
2841
+
2842
+splice.call(object, 1, 1);
2843
+if (object[1] == 1) Elements.implement('splice', function(){
2844
+	var length = this.length;
2845
+	splice.apply(this, arguments);
2846
+	while (length >= this.length) delete this[length--];
2847
+	return this;
2848
+}.protect());
2849
+
2850
+Elements.implement(Array.prototype);
2851
+
2852
+Array.mirror(Elements);
2853
+
2854
+/*<ltIE8>*/
2855
+var createElementAcceptsHTML;
2856
+try {
2857
+	var x = document.createElement('<input name=x>');
2858
+	createElementAcceptsHTML = (x.name == 'x');
2859
+} catch(e){}
2860
+
2861
+var escapeQuotes = function(html){
2862
+	return ('' + html).replace(/&/g, '&amp;').replace(/"/g, '&quot;');
2863
+};
2864
+/*</ltIE8>*/
2865
+
2866
+Document.implement({
2867
+
2868
+	newElement: function(tag, props){
2869
+		if (props && props.checked != null) props.defaultChecked = props.checked;
2870
+		/*<ltIE8>*/// Fix for readonly name and type properties in IE < 8
2871
+		if (createElementAcceptsHTML && props){
2872
+			tag = '<' + tag;
2873
+			if (props.name) tag += ' name="' + escapeQuotes(props.name) + '"';
2874
+			if (props.type) tag += ' type="' + escapeQuotes(props.type) + '"';
2875
+			tag += '>';
2876
+			delete props.name;
2877
+			delete props.type;
2878
+		}
2879
+		/*</ltIE8>*/
2880
+		return this.id(this.createElement(tag)).set(props);
2881
+	}
2882
+
2883
+});
2884
+
2885
+})();
2886
+
2887
+Document.implement({
2888
+
2889
+	newTextNode: function(text){
2890
+		return this.createTextNode(text);
2891
+	},
2892
+
2893
+	getDocument: function(){
2894
+		return this;
2895
+	},
2896
+
2897
+	getWindow: function(){
2898
+		return this.window;
2899
+	},
2900
+
2901
+	id: (function(){
2902
+
2903
+		var types = {
2904
+
2905
+			string: function(id, nocash, doc){
2906
+				id = Slick.find(doc, '#' + id.replace(/(\W)/g, '\\$1'));
2907
+				return (id) ? types.element(id, nocash) : null;
2908
+			},
2909
+
2910
+			element: function(el, nocash){
2911
+				$uid(el);
2912
+				if (!nocash && !el.$family && !(/^(?:object|embed)$/i).test(el.tagName)){
2913
+					Object.append(el, Element.Prototype);
2914
+				}
2915
+				return el;
2916
+			},
2917
+
2918
+			object: function(obj, nocash, doc){
2919
+				if (obj.toElement) return types.element(obj.toElement(doc), nocash);
2920
+				return null;
2921
+			}
2922
+
2923
+		};
2924
+
2925
+		types.textnode = types.whitespace = types.window = types.document = function(zero){
2926
+			return zero;
2927
+		};
2928
+
2929
+		return function(el, nocash, doc){
2930
+			if (el && el.$family && el.uid) return el;
2931
+			var type = typeOf(el);
2932
+			return (types[type]) ? types[type](el, nocash, doc || document) : null;
2933
+		};
2934
+
2935
+	})()
2936
+
2937
+});
2938
+
2939
+if (window.$ == null) Window.implement('$', function(el, nc){
2940
+	return document.id(el, nc, this.document);
2941
+});
2942
+
2943
+Window.implement({
2944
+
2945
+	getDocument: function(){
2946
+		return this.document;
2947
+	},
2948
+
2949
+	getWindow: function(){
2950
+		return this;
2951
+	}
2952
+
2953
+});
2954
+
2955
+[Document, Element].invoke('implement', {
2956
+
2957
+	getElements: function(expression){
2958
+		return Slick.search(this, expression, new Elements);
2959
+	},
2960
+
2961
+	getElement: function(expression){
2962
+		return document.id(Slick.find(this, expression));
2963
+	}
2964
+
2965
+});
2966
+
2967
+
2968
+
2969
+if (window.$$ == null) Window.implement('$$', function(selector){
2970
+	if (arguments.length == 1){
2971
+		if (typeof selector == 'string') return Slick.search(this.document, selector, new Elements);
2972
+		else if (Type.isEnumerable(selector)) return new Elements(selector);
2973
+	}
2974
+	return new Elements(arguments);
2975
+});
2976
+
2977
+(function(){
2978
+
2979
+var collected = {}, storage = {};
2980
+var formProps = {input: 'checked', option: 'selected', textarea: 'value'};
2981
+
2982
+var get = function(uid){
2983
+	return (storage[uid] || (storage[uid] = {}));
2984
+};
2985
+
2986
+var clean = function(item){
2987
+	var uid = item.uid;
2988
+	if (item.removeEvents) item.removeEvents();
2989
+	if (item.clearAttributes) item.clearAttributes();
2990
+	if (uid != null){
2991
+		delete collected[uid];
2992
+		delete storage[uid];
2993
+	}
2994
+	return item;
2995
+};
2996
+
2997
+var camels = ['defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', 'frameBorder', 'maxLength', 'readOnly',
2998
+	'rowSpan', 'tabIndex', 'useMap'
2999
+];
3000
+var bools = ['compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', 'disabled', 'readOnly', 'multiple', 'selected',
3001
+	'noresize', 'defer', 'defaultChecked'
3002
+];
3003
+ var attributes = {
3004
+	'html': 'innerHTML',
3005
+	'class': 'className',
3006
+	'for': 'htmlFor',
3007
+	'text': (function(){
3008
+		var temp = document.createElement('div');
3009
+		return (temp.textContent == null) ? 'innerText' : 'textContent';
3010
+	})()
3011
+};
3012
+var readOnly = ['type'];
3013
+var expandos = ['value', 'defaultValue'];
3014
+var uriAttrs = /^(?:href|src|usemap)$/i;
3015
+
3016
+bools = bools.associate(bools);
3017
+camels = camels.associate(camels.map(String.toLowerCase));
3018
+readOnly = readOnly.associate(readOnly);
3019
+
3020
+Object.append(attributes, expandos.associate(expandos));
3021
+
3022
+var inserters = {
3023
+
3024
+	before: function(context, element){
3025
+		var parent = element.parentNode;
3026
+		if (parent) parent.insertBefore(context, element);
3027
+	},
3028
+
3029
+	after: function(context, element){
3030
+		var parent = element.parentNode;
3031
+		if (parent) parent.insertBefore(context, element.nextSibling);
3032
+	},
3033
+
3034
+	bottom: function(context, element){
3035
+		element.appendChild(context);
3036
+	},
3037
+
3038
+	top: function(context, element){
3039
+		element.insertBefore(context, element.firstChild);
3040
+	}
3041
+
3042
+};
3043
+
3044
+inserters.inside = inserters.bottom;
3045
+
3046
+
3047
+
3048
+var injectCombinator = function(expression, combinator){
3049
+	if (!expression) return combinator;
3050
+
3051
+	expression = Object.clone(Slick.parse(expression));
3052
+
3053
+	var expressions = expression.expressions;
3054
+	for (var i = expressions.length; i--;)
3055
+		expressions[i][0].combinator = combinator;
3056
+
3057
+	return expression;
3058
+};
3059
+
3060
+Element.implement({
3061
+
3062
+	set: function(prop, value){
3063
+		var property = Element.Properties[prop];
3064
+		(property && property.set) ? property.set.call(this, value) : this.setProperty(prop, value);
3065
+	}.overloadSetter(),
3066
+
3067
+	get: function(prop){
3068
+		var property = Element.Properties[prop];
3069
+		return (property && property.get) ? property.get.apply(this) : this.getProperty(prop);
3070
+	}.overloadGetter(),
3071
+
3072
+	erase: function(prop){
3073
+		var property = Element.Properties[prop];
3074
+		(property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop);
3075
+		return this;
3076
+	},
3077
+
3078
+	setProperty: function(attribute, value){
3079
+		attribute = camels[attribute] || attribute;
3080
+		if (value == null) return this.removeProperty(attribute);
3081
+		var key = attributes[attribute];
3082
+		(key) ? this[key] = value :
3083
+			(bools[attribute]) ? this[attribute] = !!value : this.setAttribute(attribute, '' + value);
3084
+		return this;
3085
+	},
3086
+
3087
+	setProperties: function(attributes){
3088
+		for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]);
3089
+		return this;
3090
+	},
3091
+
3092
+	getProperty: function(attribute){
3093
+		attribute = camels[attribute] || attribute;
3094
+		var key = attributes[attribute] || readOnly[attribute];
3095
+		return (key) ? this[key] :
3096
+			(bools[attribute]) ? !!this[attribute] :
3097
+			(uriAttrs.test(attribute) ? this.getAttribute(attribute, 2) :
3098
+			(key = this.getAttributeNode(attribute)) ? key.nodeValue : null) || null;
3099
+	},
3100
+
3101
+	getProperties: function(){
3102
+		var args = Array.from(arguments);
3103
+		return args.map(this.getProperty, this).associate(args);
3104
+	},
3105
+
3106
+	removeProperty: function(attribute){
3107
+		attribute = camels[attribute] || attribute;
3108
+		var key = attributes[attribute];
3109
+		(key) ? this[key] = '' :
3110
+			(bools[attribute]) ? this[attribute] = false : this.removeAttribute(attribute);
3111
+		return this;
3112
+	},
3113
+
3114
+	removeProperties: function(){
3115
+		Array.each(arguments, this.removeProperty, this);
3116
+		return this;
3117
+	},
3118
+
3119
+	hasClass: function(className){
3120
+		return this.className.clean().contains(className, ' ');
3121
+	},
3122
+
3123
+	addClass: function(className){
3124
+		if (!this.hasClass(className)) this.className = (this.className + ' ' + className).clean();
3125
+		return this;
3126
+	},
3127
+
3128
+	removeClass: function(className){
3129
+		this.className = this.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1');
3130
+		return this;
3131
+	},
3132
+
3133
+	toggleClass: function(className, force){
3134
+		if (force == null) force = !this.hasClass(className);
3135
+		return (force) ? this.addClass(className) : this.removeClass(className);
3136
+	},
3137
+
3138
+	adopt: function(){
3139
+		var parent = this, fragment, elements = Array.flatten(arguments), length = elements.length;
3140
+		if (length > 1) parent = fragment = document.createDocumentFragment();
3141
+
3142
+		for (var i = 0; i < length; i++){
3143
+			var element = document.id(elements[i], true);
3144
+			if (element) parent.appendChild(element);
3145
+		}
3146
+
3147
+		if (fragment) this.appendChild(fragment);
3148
+
3149
+		return this;
3150
+	},
3151
+
3152
+	appendText: function(text, where){
3153
+		return this.grab(this.getDocument().newTextNode(text), where);
3154
+	},
3155
+
3156
+	grab: function(el, where){
3157
+		inserters[where || 'bottom'](document.id(el, true), this);
3158
+		return this;
3159
+	},
3160
+
3161
+	inject: function(el, where){
3162
+		inserters[where || 'bottom'](this, document.id(el, true));
3163
+		return this;
3164
+	},
3165
+
3166
+	replaces: function(el){
3167
+		el = document.id(el, true);
3168
+		el.parentNode.replaceChild(this, el);
3169
+		return this;
3170
+	},
3171
+
3172
+	wraps: function(el, where){
3173
+		el = document.id(el, true);
3174
+		return this.replaces(el).grab(el, where);
3175
+	},
3176
+
3177
+	getPrevious: function(expression){
3178
+		return document.id(Slick.find(this, injectCombinator(expression, '!~')));
3179
+	},
3180
+
3181
+	getAllPrevious: function(expression){
3182
+		return Slick.search(this, injectCombinator(expression, '!~'), new Elements);
3183
+	},
3184
+
3185
+	getNext: function(expression){
3186
+		return document.id(Slick.find(this, injectCombinator(expression, '~')));
3187
+	},
3188
+
3189
+	getAllNext: function(expression){
3190
+		return Slick.search(this, injectCombinator(expression, '~'), new Elements);
3191
+	},
3192
+
3193
+	getFirst: function(expression){
3194
+		return document.id(Slick.search(this, injectCombinator(expression, '>'))[0]);
3195
+	},
3196
+
3197
+	getLast: function(expression){
3198
+		return document.id(Slick.search(this, injectCombinator(expression, '>')).getLast());
3199
+	},
3200
+
3201
+	getParent: function(expression){
3202
+		return document.id(Slick.find(this, injectCombinator(expression, '!')));
3203
+	},
3204
+
3205
+	getParents: function(expression){
3206
+		return Slick.search(this, injectCombinator(expression, '!'), new Elements);
3207
+	},
3208
+
3209
+	getSiblings: function(expression){
3210
+		return Slick.search(this, injectCombinator(expression, '~~'), new Elements);
3211
+	},
3212
+
3213
+	getChildren: function(expression){
3214
+		return Slick.search(this, injectCombinator(expression, '>'), new Elements);
3215
+	},
3216
+
3217
+	getWindow: function(){
3218
+		return this.ownerDocument.window;
3219
+	},
3220
+
3221
+	getDocument: function(){
3222
+		return this.ownerDocument;
3223
+	},
3224
+
3225
+	getElementById: function(id){
3226
+		return document.id(Slick.find(this, '#' + ('' + id).replace(/(\W)/g, '\\$1')));
3227
+	},
3228
+
3229
+	getSelected: function(){
3230
+		this.selectedIndex; // Safari 3.2.1
3231
+		return new Elements(Array.from(this.options).filter(function(option){
3232
+			return option.selected;
3233
+		}));
3234
+	},
3235
+
3236
+	toQueryString: function(){
3237
+		var queryString = [];
3238
+		this.getElements('input, select, textarea').each(function(el){
3239
+			var type = el.type;
3240
+			if (!el.name || el.disabled || type == 'submit' || type == 'reset' || type == 'file' || type == 'image') return;
3241
+
3242
+			var value = (el.get('tag') == 'select') ? el.getSelected().map(function(opt){
3243
+				// IE
3244
+				return document.id(opt).get('value');
3245
+			}) : ((type == 'radio' || type == 'checkbox') && !el.checked) ? null : el.get('value');
3246
+
3247
+			Array.from(value).each(function(val){
3248
+				if (typeof val != 'undefined') queryString.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(val));
3249
+			});
3250
+		});
3251
+		return queryString.join('&');
3252
+	},
3253
+
3254
+	destroy: function(){
3255
+		var children = clean(this).getElementsByTagName('*');
3256
+		Array.each(children, clean);
3257
+		Element.dispose(this);
3258
+		return null;
3259
+	},
3260
+
3261
+	empty: function(){
3262
+		Array.from(this.childNodes).each(Element.dispose);
3263
+		return this;
3264
+	},
3265
+
3266
+	dispose: function(){
3267
+		return (this.parentNode) ? this.parentNode.removeChild(this) : this;
3268
+	},
3269
+
3270
+	match: function(expression){
3271
+		return !expression || Slick.match(this, expression);
3272
+	}
3273
+
3274
+});
3275
+
3276
+var cleanClone = function(node, element, keepid){
3277
+	if (!keepid) node.setAttributeNode(document.createAttribute('id'));
3278
+	if (node.clearAttributes){
3279
+		node.clearAttributes();
3280
+		node.mergeAttributes(element);
3281
+		node.removeAttribute('uid');
3282
+		if (node.options){
3283
+			var no = node.options, eo = element.options;
3284
+			for (var i = no.length; i--;) no[i].selected = eo[i].selected;
3285
+		}
3286
+	}
3287
+
3288
+	var prop = formProps[element.tagName.toLowerCase()];
3289
+	if (prop && element[prop]) node[prop] = element[prop];
3290
+};
3291
+
3292
+Element.implement('clone', function(contents, keepid){
3293
+	contents = contents !== false;
3294
+	var clone = this.cloneNode(contents), i;
3295
+
3296
+	if (contents){
3297
+		var ce = clone.getElementsByTagName('*'), te = this.getElementsByTagName('*');
3298
+		for (i = ce.length; i--;) cleanClone(ce[i], te[i], keepid);
3299
+	}
3300
+
3301
+	cleanClone(clone, this, keepid);
3302
+
3303
+	if (Browser.ie){
3304
+		var co = clone.getElementsByTagName('object'), to = this.getElementsByTagName('object');
3305
+		for (i = co.length; i--;) co[i].outerHTML = to[i].outerHTML;
3306
+	}
3307
+	return document.id(clone);
3308
+});
3309
+
3310
+var contains = {contains: function(element){
3311
+	return Slick.contains(this, element);
3312
+}};
3313
+
3314
+if (!document.contains) Document.implement(contains);
3315
+if (!document.createElement('div').contains) Element.implement(contains);
3316
+
3317
+
3318
+
3319
+[Element, Window, Document].invoke('implement', {
3320
+
3321
+	addListener: function(type, fn){
3322
+		if (type == 'unload'){
3323
+			var old = fn, self = this;
3324
+			fn = function(){
3325
+				self.removeListener('unload', fn);
3326
+				old();
3327
+			};
3328
+		} else {
3329
+			collected[$uid(this)] = this;
3330
+		}
3331
+		if (this.addEventListener) this.addEventListener(type, fn, !!arguments[2]);
3332
+		else this.attachEvent('on' + type, fn);
3333
+		return this;
3334
+	},
3335
+
3336
+	removeListener: function(type, fn){
3337
+		if (this.removeEventListener) this.removeEventListener(type, fn, !!arguments[2]);
3338
+		else this.detachEvent('on' + type, fn);
3339
+		return this;
3340
+	},
3341
+
3342
+	retrieve: function(property, dflt){
3343
+		var storage = get($uid(this)), prop = storage[property];
3344
+		if (dflt != null && prop == null) prop = storage[property] = dflt;
3345
+		return prop != null ? prop : null;
3346
+	},
3347
+
3348
+	store: function(property, value){
3349
+		var storage = get($uid(this));
3350
+		storage[property] = value;
3351
+		return this;
3352
+	},
3353
+
3354
+	eliminate: function(property){
3355
+		var storage = get($uid(this));
3356
+		delete storage[property];
3357
+		return this;
3358
+	}
3359
+
3360
+});
3361
+
3362
+// IE purge
3363
+if (window.attachEvent && !window.addEventListener) window.addListener('unload', function(){
3364
+	Object.each(collected, clean);
3365
+	if (window.CollectGarbage) CollectGarbage();
3366
+});
3367
+
3368
+})();
3369
+
3370
+Element.Properties = {};
3371
+
3372
+
3373
+
3374
+Element.Properties.style = {
3375
+
3376
+	set: function(style){
3377
+		this.style.cssText = style;
3378
+	},
3379
+
3380
+	get: function(){
3381
+		return this.style.cssText;
3382
+	},
3383
+
3384
+	erase: function(){
3385
+		this.style.cssText = '';
3386
+	}
3387
+
3388
+};
3389
+
3390
+Element.Properties.tag = {
3391
+
3392
+	get: function(){
3393
+		return this.tagName.toLowerCase();
3394
+	}
3395
+
3396
+};
3397
+
3398
+(function(maxLength){
3399
+	if (maxLength != null) Element.Properties.maxlength = Element.Properties.maxLength = {
3400
+		get: function(){
3401
+			var maxlength = this.getAttribute('maxLength');
3402
+			return maxlength == maxLength ? null : maxlength;
3403
+		}
3404
+	};
3405
+})(document.createElement('input').getAttribute('maxLength'));
3406
+
3407
+Element.Properties.html = (function(){
3408
+
3409
+	var tableTest = Function.attempt(function(){
3410
+		var table = document.createElement('table');
3411
+		table.innerHTML = '<tr><td></td></tr>';
3412
+	});
3413
+
3414
+	var wrapper = document.createElement('div');
3415
+
3416
+	var translations = {
3417
+		table: [1, '<table>', '</table>'],
3418
+		select: [1, '<select>', '</select>'],
3419
+		tbody: [2, '<table><tbody>', '</tbody></table>'],
3420
+		tr: [3, '<table><tbody><tr>', '</tr></tbody></table>']
3421
+	};
3422
+	translations.thead = translations.tfoot = translations.tbody;
3423
+
3424
+	var html = {
3425
+		set: function(){
3426
+			var html = Array.flatten(arguments).join('');
3427
+			var wrap = (!tableTest && translations[this.get('tag')]);
3428
+			if (wrap){
3429
+				var first = wrapper;
3430
+				first.innerHTML = wrap[1] + html + wrap[2];
3431
+				for (var i = wrap[0]; i--;) first = first.firstChild;
3432
+				this.empty().adopt(first.childNodes);
3433
+			} else {
3434
+				this.innerHTML = html;
3435
+			}
3436
+		}
3437
+	};
3438
+
3439
+	html.erase = html.set;
3440
+
3441
+	return html;
3442
+})();
3443
+
3444
+
3445
+/*
3446
+---
3447
+
3448
+name: Element.Style
3449
+
3450
+description: Contains methods for interacting with the styles of Elements in a fashionable way.
3451
+
3452
+license: MIT-style license.
3453
+
3454
+requires: Element
3455
+
3456
+provides: Element.Style
3457
+
3458
+...
3459
+*/
3460
+
3461
+(function(){
3462
+
3463
+var html = document.html;
3464
+
3465
+Element.Properties.styles = {set: function(styles){
3466
+	this.setStyles(styles);
3467
+}};
3468
+
3469
+var hasOpacity = (html.style.opacity != null);
3470
+var reAlpha = /alpha\(opacity=([\d.]+)\)/i;
3471
+
3472
+var setOpacity = function(element, opacity){
3473
+	if (!element.currentStyle || !element.currentStyle.hasLayout) element.style.zoom = 1;
3474
+	if (hasOpacity){
3475
+		element.style.opacity = opacity;
3476
+	} else {
3477
+		opacity = (opacity == 1) ? '' : 'alpha(opacity=' + opacity * 100 + ')';
3478
+		var filter = element.style.filter || element.getComputedStyle('filter') || '';
3479
+		element.style.filter = reAlpha.test(filter) ? filter.replace(reAlpha, opacity) : filter + opacity;
3480
+	}
3481
+};
3482
+
3483
+Element.Properties.opacity = {
3484
+
3485
+	set: function(opacity){
3486
+		var visibility = this.style.visibility;
3487
+		if (opacity == 0 && visibility != 'hidden') this.style.visibility = 'hidden';
3488
+		else if (opacity != 0 && visibility != 'visible') this.style.visibility = 'visible';
3489
+
3490
+		setOpacity(this, opacity);
3491
+	},
3492
+
3493
+	get: (hasOpacity) ? function(){
3494
+		var opacity = this.style.opacity || this.getComputedStyle('opacity');
3495
+		return (opacity == '') ? 1 : opacity;
3496
+	} : function(){
3497
+		var opacity, filter = (this.style.filter || this.getComputedStyle('filter'));
3498
+		if (filter) opacity = filter.match(reAlpha);
3499
+		return (opacity == null || filter == null) ? 1 : (opacity[1] / 100);
3500
+	}
3501
+
3502
+};
3503
+
3504
+var floatName = (html.style.cssFloat == null) ? 'styleFloat' : 'cssFloat';
3505
+
3506
+Element.implement({
3507
+
3508
+	getComputedStyle: function(property){
3509
+		if (this.currentStyle) return this.currentStyle[property.camelCase()];
3510
+		var defaultView = Element.getDocument(this).defaultView,
3511
+			computed = defaultView ? defaultView.getComputedStyle(this, null) : null;
3512
+		return (computed) ? computed.getPropertyValue((property == floatName) ? 'float' : property.hyphenate()) : null;
3513
+	},
3514
+
3515
+	setOpacity: function(value){
3516
+		setOpacity(this, value);
3517
+		return this;
3518
+	},
3519
+
3520
+	getOpacity: function(){
3521
+		return this.get('opacity');
3522
+	},
3523
+
3524
+	setStyle: function(property, value){
3525
+		switch (property){
3526
+			case 'opacity': return this.set('opacity', parseFloat(value));
3527
+			case 'float': property = floatName;
3528
+		}
3529
+		property = property.camelCase();
3530
+		if (typeOf(value) != 'string'){
3531
+			var map = (Element.Styles[property] || '@').split(' ');
3532
+			value = Array.from(value).map(function(val, i){
3533
+				if (!map[i]) return '';
3534
+				return (typeOf(val) == 'number') ? map[i].replace('@', Math.round(val)) : val;
3535
+			}).join(' ');
3536
+		} else if (value == String(Number(value))){
3537
+			value = Math.round(value);
3538
+		}
3539
+		this.style[property] = value;
3540
+		return this;
3541
+	},
3542
+
3543
+	getStyle: function(property){
3544
+		switch (property){
3545
+			case 'opacity': return this.get('opacity');
3546
+			case 'float': property = floatName;
3547
+		}
3548
+		property = property.camelCase();
3549
+		var result = this.style[property];
3550
+		if (!result || property == 'zIndex'){
3551
+			result = [];
3552
+			for (var style in Element.ShortStyles){
3553
+				if (property != style) continue;
3554
+				for (var s in Element.ShortStyles[style]) result.push(this.getStyle(s));
3555
+				return result.join(' ');
3556
+			}
3557
+			result = this.getComputedStyle(property);
3558
+		}
3559
+		if (result){
3560
+			result = String(result);
3561
+			var color = result.match(/rgba?\([\d\s,]+\)/);
3562
+			if (color) result = result.replace(color[0], color[0].rgbToHex());
3563
+		}
3564
+		if (Browser.opera || (Browser.ie && isNaN(parseFloat(result)))){
3565
+			if ((/^(height|width)$/).test(property)){
3566
+				var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0;
3567
+				values.each(function(value){
3568
+					size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt();
3569
+				}, this);
3570
+				return this['offset' + property.capitalize()] - size + 'px';
3571
+			}
3572
+			if (Browser.opera && String(result).indexOf('px') != -1) return result;
3573
+			if ((/^border(.+)Width|margin|padding/).test(property)) return '0px';
3574
+		}
3575
+		return result;
3576
+	},
3577
+
3578
+	setStyles: function(styles){
3579
+		for (var style in styles) this.setStyle(style, styles[style]);
3580
+		return this;
3581
+	},
3582
+
3583
+	getStyles: function(){
3584
+		var result = {};
3585
+		Array.flatten(arguments).each(function(key){
3586
+			result[key] = this.getStyle(key);
3587
+		}, this);
3588
+		return result;
3589
+	}
3590
+
3591
+});
3592
+
3593
+Element.Styles = {
3594
+	left: '@px', top: '@px', bottom: '@px', right: '@px',
3595
+	width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px',
3596
+	backgroundColor: 'rgb(@, @, @)', backgroundPosition: '@px @px', color: 'rgb(@, @, @)',
3597
+	fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)',
3598
+	margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)',
3599
+	borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)',
3600
+	zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@'
3601
+};
3602
+
3603
+
3604
+
3605
+Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}};
3606
+
3607
+['Top', 'Right', 'Bottom', 'Left'].each(function(direction){
3608
+	var Short = Element.ShortStyles;
3609
+	var All = Element.Styles;
3610
+	['margin', 'padding'].each(function(style){
3611
+		var sd = style + direction;
3612
+		Short[style][sd] = All[sd] = '@px';
3613
+	});
3614
+	var bd = 'border' + direction;
3615
+	Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)';
3616
+	var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color';
3617
+	Short[bd] = {};
3618
+	Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px';
3619
+	Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@';
3620
+	Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)';
3621
+});
3622
+
3623
+}).call(this);
3624
+
3625
+
3626
+/*
3627
+---
3628
+
3629
+name: Element.Event
3630
+
3631
+description: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events.
3632
+
3633
+license: MIT-style license.
3634
+
3635
+requires: [Element, Event]
3636
+
3637
+provides: Element.Event
3638
+
3639
+...
3640
+*/
3641
+
3642
+(function(){
3643
+
3644
+Element.Properties.events = {set: function(events){
3645
+	this.addEvents(events);
3646
+}};
3647
+
3648
+[Element, Window, Document].invoke('implement', {
3649
+
3650
+	addEvent: function(type, fn){
3651
+		var events = this.retrieve('events', {});
3652
+		if (!events[type]) events[type] = {keys: [], values: []};
3653
+		if (events[type].keys.contains(fn)) return this;
3654
+		events[type].keys.push(fn);
3655
+		var realType = type,
3656
+			custom = Element.Events[type],
3657
+			condition = fn,
3658
+			self = this;
3659
+		if (custom){
3660
+			if (custom.onAdd) custom.onAdd.call(this, fn);
3661
+			if (custom.condition){
3662
+				condition = function(event){
3663
+					if (custom.condition.call(this, event)) return fn.call(this, event);
3664
+					return true;
3665
+				};
3666
+			}
3667
+			realType = custom.base || realType;
3668
+		}
3669
+		var defn = function(){
3670
+			return fn.call(self);
3671
+		};
3672
+		var nativeEvent = Element.NativeEvents[realType];
3673
+		if (nativeEvent){
3674
+			if (nativeEvent == 2){
3675
+				defn = function(event){
3676
+					event = new Event(event, self.getWindow());
3677
+					if (condition.call(self, event) === false) event.stop();
3678
+				};
3679
+			}
3680
+			this.addListener(realType, defn, arguments[2]);
3681
+		}
3682
+		events[type].values.push(defn);
3683
+		return this;
3684
+	},
3685
+
3686
+	removeEvent: function(type, fn){
3687
+		var events = this.retrieve('events');
3688
+		if (!events || !events[type]) return this;
3689
+		var list = events[type];
3690
+		var index = list.keys.indexOf(fn);
3691
+		if (index == -1) return this;
3692
+		var value = list.values[index];
3693
+		delete list.keys[index];
3694
+		delete list.values[index];
3695
+		var custom = Element.Events[type];
3696
+		if (custom){
3697
+			if (custom.onRemove) custom.onRemove.call(this, fn);
3698
+			type = custom.base || type;
3699
+		}
3700
+		return (Element.NativeEvents[type]) ? this.removeListener(type, value, arguments[2]) : this;
3701
+	},
3702
+
3703
+	addEvents: function(events){
3704
+		for (var event in events) this.addEvent(event, events[event]);
3705
+		return this;
3706
+	},
3707
+
3708
+	removeEvents: function(events){
3709
+		var type;
3710
+		if (typeOf(events) == 'object'){
3711
+			for (type in events) this.removeEvent(type, events[type]);
3712
+			return this;
3713
+		}
3714
+		var attached = this.retrieve('events');
3715
+		if (!attached) return this;
3716
+		if (!events){
3717
+			for (type in attached) this.removeEvents(type);
3718
+			this.eliminate('events');
3719
+		} else if (attached[events]){
3720
+			attached[events].keys.each(function(fn){
3721
+				this.removeEvent(events, fn);
3722
+			}, this);
3723
+			delete attached[events];
3724
+		}
3725
+		return this;
3726
+	},
3727
+
3728
+	fireEvent: function(type, args, delay){
3729
+		var events = this.retrieve('events');
3730
+		if (!events || !events[type]) return this;
3731
+		args = Array.from(args);
3732
+
3733
+		events[type].keys.each(function(fn){
3734
+			if (delay) fn.delay(delay, this, args);
3735
+			else fn.apply(this, args);
3736
+		}, this);
3737
+		return this;
3738
+	},
3739
+
3740
+	cloneEvents: function(from, type){
3741
+		from = document.id(from);
3742
+		var events = from.retrieve('events');
3743
+		if (!events) return this;
3744
+		if (!type){
3745
+			for (var eventType in events) this.cloneEvents(from, eventType);
3746
+		} else if (events[type]){
3747
+			events[type].keys.each(function(fn){
3748
+				this.addEvent(type, fn);
3749
+			}, this);
3750
+		}
3751
+		return this;
3752
+	}
3753
+
3754
+});
3755
+
3756
+Element.NativeEvents = {
3757
+	click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons
3758
+	mousewheel: 2, DOMMouseScroll: 2, //mouse wheel
3759
+	mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement
3760
+	keydown: 2, keypress: 2, keyup: 2, //keyboard
3761
+	orientationchange: 2, // mobile
3762
+	touchstart: 2, touchmove: 2, touchend: 2, touchcancel: 2, // touch
3763
+	gesturestart: 2, gesturechange: 2, gestureend: 2, // gesture
3764
+	focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, //form elements
3765
+	load: 2, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window
3766
+	error: 1, abort: 1, scroll: 1 //misc
3767
+};
3768
+
3769
+var check = function(event){
3770
+	var related = event.relatedTarget;
3771
+	if (related == null) return true;
3772
+	if (!related) return false;
3773
+	return (related != this && related.prefix != 'xul' && typeOf(this) != 'document' && !this.contains(related));
3774
+};
3775
+
3776
+Element.Events = {
3777
+
3778
+	mouseenter: {
3779
+		base: 'mouseover',
3780
+		condition: check
3781
+	},
3782
+
3783
+	mouseleave: {
3784
+		base: 'mouseout',
3785
+		condition: check
3786
+	},
3787
+
3788
+	mousewheel: {
3789
+		base: (Browser.firefox) ? 'DOMMouseScroll' : 'mousewheel'
3790
+	}
3791
+
3792
+};
3793
+
3794
+
3795
+
3796
+}).call(this);
3797
+
3798
+
3799
+/*
3800
+---
3801
+
3802
+name: Element.Dimensions
3803
+
3804
+description: Contains methods to work with size, scroll, or positioning of Elements and the window object.
3805
+
3806
+license: MIT-style license.
3807
+
3808
+credits:
3809
+  - Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html).
3810
+  - Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html).
3811
+
3812
+requires: [Element, Element.Style]
3813
+
3814
+provides: [Element.Dimensions]
3815
+
3816
+...
3817
+*/
3818
+
3819
+(function(){
3820
+
3821
+var element = document.createElement('div'),
3822
+	child = document.createElement('div');
3823
+element.style.height = '0';
3824
+element.appendChild(child);
3825
+var brokenOffsetParent = (child.offsetParent === element);
3826
+element = child = null;
3827
+
3828
+var isOffset = function(el){
3829
+	return styleString(el, 'position') != 'static' || isBody(el);
3830
+};
3831
+
3832
+var isOffsetStatic = function(el){
3833
+	return isOffset(el) || (/^(?:table|td|th)$/i).test(el.tagName);
3834
+};
3835
+
3836
+Element.implement({
3837
+
3838
+	scrollTo: function(x, y){
3839
+		if (isBody(this)){
3840
+			this.getWindow().scrollTo(x, y);
3841
+		} else {
3842
+			this.scrollLeft = x;
3843
+			this.scrollTop = y;
3844
+		}
3845
+		return this;
3846
+	},
3847
+
3848
+	getSize: function(){
3849
+		if (isBody(this)) return this.getWindow().getSize();
3850
+		return {x: this.offsetWidth, y: this.offsetHeight};
3851
+	},
3852
+
3853
+	getScrollSize: function(){
3854
+		if (isBody(this)) return this.getWindow().getScrollSize();
3855
+		return {x: this.scrollWidth, y: this.scrollHeight};
3856
+	},
3857
+
3858
+	getScroll: function(){
3859
+		if (isBody(this)) return this.getWindow().getScroll();
3860
+		return {x: this.scrollLeft, y: this.scrollTop};
3861
+	},
3862
+
3863
+	getScrolls: function(){
3864
+		var element = this.parentNode, position = {x: 0, y: 0};
3865
+		while (element && !isBody(element)){
3866
+			position.x += element.scrollLeft;
3867
+			position.y += element.scrollTop;
3868
+			element = element.parentNode;
3869
+		}
3870
+		return position;
3871
+	},
3872
+
3873
+	getOffsetParent: brokenOffsetParent ? function(){
3874
+		var element = this;
3875
+		if (isBody(element) || styleString(element, 'position') == 'fixed') return null;
3876
+
3877
+		var isOffsetCheck = (styleString(element, 'position') == 'static') ? isOffsetStatic : isOffset;
3878
+		while ((element = element.parentNode)){
3879
+			if (isOffsetCheck(element)) return element;
3880
+		}
3881
+		return null;
3882
+	} : function(){
3883
+		var element = this;
3884
+		if (isBody(element) || styleString(element, 'position') == 'fixed') return null;
3885
+
3886
+		try {
3887
+			return element.offsetParent;
3888
+		} catch(e) {}
3889
+		return null;
3890
+	},
3891
+
3892
+	getOffsets: function(){
3893
+		if (this.getBoundingClientRect && !Browser.Platform.ios){
3894
+			var bound = this.getBoundingClientRect(),
3895
+				html = document.id(this.getDocument().documentElement),
3896
+				htmlScroll = html.getScroll(),
3897
+				elemScrolls = this.getScrolls(),
3898
+				isFixed = (styleString(this, 'position') == 'fixed');
3899
+
3900
+			return {
3901
+				x: bound.left.toInt() + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft,
3902
+				y: bound.top.toInt()  + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop
3903
+			};
3904
+		}
3905
+
3906
+		var element = this, position = {x: 0, y: 0};
3907
+		if (isBody(this)) return position;
3908
+
3909
+		while (element && !isBody(element)){
3910
+			position.x += element.offsetLeft;
3911
+			position.y += element.offsetTop;
3912
+
3913
+			if (Browser.firefox){
3914
+				if (!borderBox(element)){
3915
+					position.x += leftBorder(element);
3916
+					position.y += topBorder(element);
3917
+				}
3918
+				var parent = element.parentNode;
3919
+				if (parent && styleString(parent, 'overflow') != 'visible'){
3920
+					position.x += leftBorder(parent);
3921
+					position.y += topBorder(parent);
3922
+				}
3923
+			} else if (element != this && Browser.safari){
3924
+				position.x += leftBorder(element);
3925
+				position.y += topBorder(element);
3926
+			}
3927
+
3928
+			element = element.offsetParent;
3929
+		}
3930
+		if (Browser.firefox && !borderBox(this)){
3931
+			position.x -= leftBorder(this);
3932
+			position.y -= topBorder(this);
3933
+		}
3934
+		return position;
3935
+	},
3936
+
3937
+	getPosition: function(relative){
3938
+		if (isBody(this)) return {x: 0, y: 0};
3939
+		var offset = this.getOffsets(),
3940
+			scroll = this.getScrolls();
3941
+		var position = {
3942
+			x: offset.x - scroll.x,
3943
+			y: offset.y - scroll.y
3944
+		};
3945
+
3946
+		if (relative && (relative = document.id(relative))){
3947
+			var relativePosition = relative.getPosition();
3948
+			return {x: position.x - relativePosition.x - leftBorder(relative), y: position.y - relativePosition.y - topBorder(relative)};
3949
+		}
3950
+		return position;
3951
+	},
3952
+
3953
+	getCoordinates: function(element){
3954
+		if (isBody(this)) return this.getWindow().getCoordinates();
3955
+		var position = this.getPosition(element),
3956
+			size = this.getSize();
3957
+		var obj = {
3958
+			left: position.x,
3959
+			top: position.y,
3960
+			width: size.x,
3961
+			height: size.y
3962
+		};
3963
+		obj.right = obj.left + obj.width;
3964
+		obj.bottom = obj.top + obj.height;
3965
+		return obj;
3966
+	},
3967
+
3968
+	computePosition: function(obj){
3969
+		return {
3970
+			left: obj.x - styleNumber(this, 'margin-left'),
3971
+			top: obj.y - styleNumber(this, 'margin-top')
3972
+		};
3973
+	},
3974
+
3975
+	setPosition: function(obj){
3976
+		return this.setStyles(this.computePosition(obj));
3977
+	}
3978
+
3979
+});
3980
+
3981
+
3982
+[Document, Window].invoke('implement', {
3983
+
3984
+	getSize: function(){
3985
+		var doc = getCompatElement(this);
3986
+		return {x: doc.clientWidth, y: doc.clientHeight};
3987
+	},
3988
+
3989
+	getScroll: function(){
3990
+		var win = this.getWindow(), doc = getCompatElement(this);
3991
+		return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop};
3992
+	},
3993
+
3994
+	getScrollSize: function(){
3995
+		var doc = getCompatElement(this),
3996
+			min = this.getSize(),
3997
+			body = this.getDocument().body;
3998
+
3999
+		return {x: Math.max(doc.scrollWidth, body.scrollWidth, min.x), y: Math.max(doc.scrollHeight, body.scrollHeight, min.y)};
4000
+	},
4001
+
4002
+	getPosition: function(){
4003
+		return {x: 0, y: 0};
4004
+	},
4005
+
4006
+	getCoordinates: function(){
4007
+		var size = this.getSize();
4008
+		return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x};
4009
+	}
4010
+
4011
+});
4012
+
4013
+// private methods
4014
+
4015
+var styleString = Element.getComputedStyle;
4016
+
4017
+function styleNumber(element, style){
4018
+	return styleString(element, style).toInt() || 0;
4019
+}
4020
+
4021
+function borderBox(element){
4022
+	return styleString(element, '-moz-box-sizing') == 'border-box';
4023
+}
4024
+
4025
+function topBorder(element){
4026
+	return styleNumber(element, 'border-top-width');
4027
+}
4028
+
4029
+function leftBorder(element){
4030
+	return styleNumber(element, 'border-left-width');
4031
+}
4032
+
4033
+function isBody(element){
4034
+	return (/^(?:body|html)$/i).test(element.tagName);
4035
+}
4036
+
4037
+function getCompatElement(element){
4038
+	var doc = element.getDocument();
4039
+	return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
4040
+}
4041
+
4042
+}).call(this);
4043
+
4044
+//aliases
4045
+Element.alias({position: 'setPosition'}); //compatability
4046
+
4047
+[Window, Document, Element].invoke('implement', {
4048
+
4049
+	getHeight: function(){
4050
+		return this.getSize().y;
4051
+	},
4052
+
4053
+	getWidth: function(){
4054
+		return this.getSize().x;
4055
+	},
4056
+
4057
+	getScrollTop: function(){
4058
+		return this.getScroll().y;
4059
+	},
4060
+
4061
+	getScrollLeft: function(){
4062
+		return this.getScroll().x;
4063
+	},
4064
+
4065
+	getScrollHeight: function(){
4066
+		return this.getScrollSize().y;
4067
+	},
4068
+
4069
+	getScrollWidth: function(){
4070
+		return this.getScrollSize().x;
4071
+	},
4072
+
4073
+	getTop: function(){
4074
+		return this.getPosition().y;
4075
+	},
4076
+
4077
+	getLeft: function(){
4078
+		return this.getPosition().x;
4079
+	}
4080
+
4081
+});
4082
+
4083
+
4084
+/*
4085
+---
4086
+
4087
+name: Fx
4088
+
4089
+description: Contains the basic animation logic to be extended by all other Fx Classes.
4090
+
4091
+license: MIT-style license.
4092
+
4093
+requires: [Chain, Events, Options]
4094
+
4095
+provides: Fx
4096
+
4097
+...
4098
+*/
4099
+
4100
+(function(){
4101
+
4102
+var Fx = this.Fx = new Class({
4103
+
4104
+	Implements: [Chain, Events, Options],
4105
+
4106
+	options: {
4107
+		/*
4108
+		onStart: nil,
4109
+		onCancel: nil,
4110
+		onComplete: nil,
4111
+		*/
4112
+		fps: 60,
4113
+		unit: false,
4114
+		duration: 500,
4115
+		frames: null,
4116
+		frameSkip: true,
4117
+		link: 'ignore'
4118
+	},
4119
+
4120
+	initialize: function(options){
4121
+		this.subject = this.subject || this;
4122
+		this.setOptions(options);
4123
+	},
4124
+
4125
+	getTransition: function(){
4126
+		return function(p){
4127
+			return -(Math.cos(Math.PI * p) - 1) / 2;
4128
+		};
4129
+	},
4130
+
4131
+	step: function(now){
4132
+		if (this.options.frameSkip){
4133
+			var diff = (this.time != null) ? (now - this.time) : 0, frames = diff / this.frameInterval;
4134
+			this.time = now;
4135
+			this.frame += frames;
4136
+		} else {
4137
+			this.frame++;
4138
+		}
4139
+
4140
+		if (this.frame < this.frames){
4141
+			var delta = this.transition(this.frame / this.frames);
4142
+			this.set(this.compute(this.from, this.to, delta));
4143
+		} else {
4144
+			this.frame = this.frames;
4145
+			this.set(this.compute(this.from, this.to, 1));
4146
+			this.stop();
4147
+		}
4148
+	},
4149
+
4150
+	set: function(now){
4151
+		return now;
4152
+	},
4153
+
4154
+	compute: function(from, to, delta){
4155
+		return Fx.compute(from, to, delta);
4156
+	},
4157
+
4158
+	check: function(){
4159
+		if (!this.isRunning()) return true;
4160
+		switch (this.options.link){
4161
+			case 'cancel': this.cancel(); return true;
4162
+			case 'chain': this.chain(this.caller.pass(arguments, this)); return false;
4163
+		}
4164
+		return false;
4165
+	},
4166
+
4167
+	start: function(from, to){
4168
+		if (!this.check(from, to)) return this;
4169
+		this.from = from;
4170
+		this.to = to;
4171
+		this.frame = (this.options.frameSkip) ? 0 : -1;
4172
+		this.time = null;
4173
+		this.transition = this.getTransition();
4174
+		var frames = this.options.frames, fps = this.options.fps, duration = this.options.duration;
4175
+		this.duration = Fx.Durations[duration] || duration.toInt();
4176
+		this.frameInterval = 1000 / fps;
4177
+		this.frames = frames || Math.round(this.duration / this.frameInterval);
4178
+		this.fireEvent('start', this.subject);
4179
+		pushInstance.call(this, fps);
4180
+		return this;
4181
+	},
4182
+
4183
+	stop: function(){
4184
+		if (this.isRunning()){
4185
+			this.time = null;
4186
+			pullInstance.call(this, this.options.fps);
4187
+			if (this.frames == this.frame){
4188
+				this.fireEvent('complete', this.subject);
4189
+				if (!this.callChain()) this.fireEvent('chainComplete', this.subject);
4190
+			} else {
4191
+				this.fireEvent('stop', this.subject);
4192
+			}
4193
+		}
4194
+		return this;
4195
+	},
4196
+
4197
+	cancel: function(){
4198
+		if (this.isRunning()){
4199
+			this.time = null;
4200
+			pullInstance.call(this, this.options.fps);
4201
+			this.frame = this.frames;
4202
+			this.fireEvent('cancel', this.subject).clearChain();
4203
+		}
4204
+		return this;
4205
+	},
4206
+
4207
+	pause: function(){
4208
+		if (this.isRunning()){
4209
+			this.time = null;
4210
+			pullInstance.call(this, this.options.fps);
4211
+		}
4212
+		return this;
4213
+	},
4214
+
4215
+	resume: function(){
4216
+		if ((this.frame < this.frames) && !this.isRunning()) pushInstance.call(this, this.options.fps);
4217
+		return this;
4218
+	},
4219
+
4220
+	isRunning: function(){
4221
+		var list = instances[this.options.fps];
4222
+		return list && list.contains(this);
4223
+	}
4224
+
4225
+});
4226
+
4227
+Fx.compute = function(from, to, delta){
4228
+	return (to - from) * delta + from;
4229
+};
4230
+
4231
+Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000};
4232
+
4233
+// global timers
4234
+
4235
+var instances = {}, timers = {};
4236
+
4237
+var loop = function(){
4238
+	var now = Date.now();
4239
+	for (var i = this.length; i--;){
4240
+		var instance = this[i];
4241
+		if (instance) instance.step(now);
4242
+	}
4243
+};
4244
+
4245
+var pushInstance = function(fps){
4246
+	var list = instances[fps] || (instances[fps] = []);
4247
+	list.push(this);
4248
+	if (!timers[fps]) timers[fps] = loop.periodical(Math.round(1000 / fps), list);
4249
+};
4250
+
4251
+var pullInstance = function(fps){
4252
+	var list = instances[fps];
4253
+	if (list){
4254
+		list.erase(this);
4255
+		if (!list.length && timers[fps]){
4256
+			delete instances[fps];
4257
+			timers[fps] = clearInterval(timers[fps]);
4258
+		}
4259
+	}
4260
+};
4261
+
4262
+}).call(this);
4263
+
4264
+
4265
+/*
4266
+---
4267
+
4268
+name: Fx.CSS
4269
+
4270
+description: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements.
4271
+
4272
+license: MIT-style license.
4273
+
4274
+requires: [Fx, Element.Style]
4275
+
4276
+provides: Fx.CSS
4277
+
4278
+...
4279
+*/
4280
+
4281
+Fx.CSS = new Class({
4282
+
4283
+	Extends: Fx,
4284
+
4285
+	//prepares the base from/to object
4286
+
4287
+	prepare: function(element, property, values){
4288
+		values = Array.from(values);
4289
+		if (values[1] == null){
4290
+			values[1] = values[0];
4291
+			values[0] = element.getStyle(property);
4292
+		}
4293
+		var parsed = values.map(this.parse);
4294
+		return {from: parsed[0], to: parsed[1]};
4295
+	},
4296
+
4297
+	//parses a value into an array
4298
+
4299
+	parse: function(value){
4300
+		value = Function.from(value)();
4301
+		value = (typeof value == 'string') ? value.split(' ') : Array.from(value);
4302
+		return value.map(function(val){
4303
+			val = String(val);
4304
+			var found = false;
4305
+			Object.each(Fx.CSS.Parsers, function(parser, key){
4306
+				if (found) return;
4307
+				var parsed = parser.parse(val);
4308
+				if (parsed || parsed === 0) found = {value: parsed, parser: parser};
4309
+			});
4310
+			found = found || {value: val, parser: Fx.CSS.Parsers.String};
4311
+			return found;
4312
+		});
4313
+	},
4314
+
4315
+	//computes by a from and to prepared objects, using their parsers.
4316
+
4317
+	compute: function(from, to, delta){
4318
+		var computed = [];
4319
+		(Math.min(from.length, to.length)).times(function(i){
4320
+			computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser});
4321
+		});
4322
+		computed.$family = Function.from('fx:css:value');
4323
+		return computed;
4324
+	},
4325
+
4326
+	//serves the value as settable
4327
+
4328
+	serve: function(value, unit){
4329
+		if (typeOf(value) != 'fx:css:value') value = this.parse(value);
4330
+		var returned = [];
4331
+		value.each(function(bit){
4332
+			returned = returned.concat(bit.parser.serve(bit.value, unit));
4333
+		});
4334
+		return returned;
4335
+	},
4336
+
4337
+	//renders the change to an element
4338
+
4339
+	render: function(element, property, value, unit){
4340
+		element.setStyle(property, this.serve(value, unit));
4341
+	},
4342
+
4343
+	//searches inside the page css to find the values for a selector
4344
+
4345
+	search: function(selector){
4346
+		if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector];
4347
+		var to = {}, selectorTest = new RegExp('^' + selector.escapeRegExp() + '$');
4348
+		Array.each(document.styleSheets, function(sheet, j){
4349
+			var href = sheet.href;
4350
+			if (href && href.contains('://') && !href.contains(document.domain)) return;
4351
+			var rules = sheet.rules || sheet.cssRules;
4352
+			Array.each(rules, function(rule, i){
4353
+				if (!rule.style) return;
4354
+				var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){
4355
+					return m.toLowerCase();
4356
+				}) : null;
4357
+				if (!selectorText || !selectorTest.test(selectorText)) return;
4358
+				Object.each(Element.Styles, function(value, style){
4359
+					if (!rule.style[style] || Element.ShortStyles[style]) return;
4360
+					value = String(rule.style[style]);
4361
+					to[style] = ((/^rgb/).test(value)) ? value.rgbToHex() : value;
4362
+				});
4363
+			});
4364
+		});
4365
+		return Fx.CSS.Cache[selector] = to;
4366
+	}
4367
+
4368
+});
4369
+
4370
+Fx.CSS.Cache = {};
4371
+
4372
+Fx.CSS.Parsers = {
4373
+
4374
+	Color: {
4375
+		parse: function(value){
4376
+			if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true);
4377
+			return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false;
4378
+		},
4379
+		compute: function(from, to, delta){
4380
+			return from.map(function(value, i){
4381
+				return Math.round(Fx.compute(from[i], to[i], delta));
4382
+			});
4383
+		},
4384
+		serve: function(value){
4385
+			return value.map(Number);
4386
+		}
4387
+	},
4388
+
4389
+	Number: {
4390
+		parse: parseFloat,
4391
+		compute: Fx.compute,
4392
+		serve: function(value, unit){
4393
+			return (unit) ? value + unit : value;
4394
+		}
4395
+	},
4396
+
4397
+	String: {
4398
+		parse: Function.from(false),
4399
+		compute: function(zero, one){
4400
+			return one;
4401
+		},
4402
+		serve: function(zero){
4403
+			return zero;
4404
+		}
4405
+	}
4406
+
4407
+};
4408
+
4409
+
4410
+
4411
+
4412
+/*
4413
+---
4414
+
4415
+name: Fx.Tween
4416
+
4417
+description: Formerly Fx.Style, effect to transition any CSS property for an element.
4418
+
4419
+license: MIT-style license.
4420
+
4421
+requires: Fx.CSS
4422
+
4423
+provides: [Fx.Tween, Element.fade, Element.highlight]
4424
+
4425
+...
4426
+*/
4427
+
4428
+Fx.Tween = new Class({
4429
+
4430
+	Extends: Fx.CSS,
4431
+
4432
+	initialize: function(element, options){
4433
+		this.element = this.subject = document.id(element);
4434
+		this.parent(options);
4435
+	},
4436
+
4437
+	set: function(property, now){
4438
+		if (arguments.length == 1){
4439
+			now = property;
4440
+			property = this.property || this.options.property;
4441
+		}
4442
+		this.render(this.element, property, now, this.options.unit);
4443
+		return this;
4444
+	},
4445
+
4446
+	start: function(property, from, to){
4447
+		if (!this.check(property, from, to)) return this;
4448
+		var args = Array.flatten(arguments);
4449
+		this.property = this.options.property || args.shift();
4450
+		var parsed = this.prepare(this.element, this.property, args);
4451
+		return this.parent(parsed.from, parsed.to);
4452
+	}
4453
+
4454
+});
4455
+
4456
+Element.Properties.tween = {
4457
+
4458
+	set: function(options){
4459
+		this.get('tween').cancel().setOptions(options);
4460
+		return this;
4461
+	},
4462
+
4463
+	get: function(){
4464
+		var tween = this.retrieve('tween');
4465
+		if (!tween){
4466
+			tween = new Fx.Tween(this, {link: 'cancel'});
4467
+			this.store('tween', tween);
4468
+		}
4469
+		return tween;
4470
+	}
4471
+
4472
+};
4473
+
4474
+Element.implement({
4475
+
4476
+	tween: function(property, from, to){
4477
+		this.get('tween').start(arguments);
4478
+		return this;
4479
+	},
4480
+
4481
+	fade: function(how){
4482
+		var fade = this.get('tween'), o = 'opacity', toggle;
4483
+		how = [how, 'toggle'].pick();
4484
+		switch (how){
4485
+			case 'in': fade.start(o, 1); break;
4486
+			case 'out': fade.start(o, 0); break;
4487
+			case 'show': fade.set(o, 1); break;
4488
+			case 'hide': fade.set(o, 0); break;
4489
+			case 'toggle':
4490
+				var flag = this.retrieve('fade:flag', this.get('opacity') == 1);
4491
+				fade.start(o, (flag) ? 0 : 1);
4492
+				this.store('fade:flag', !flag);
4493
+				toggle = true;
4494
+			break;
4495
+			default: fade.start(o, arguments);
4496
+		}
4497
+		if (!toggle) this.eliminate('fade:flag');
4498
+		return this;
4499
+	},
4500
+
4501
+	highlight: function(start, end){
4502
+		if (!end){
4503
+			end = this.retrieve('highlight:original', this.getStyle('background-color'));
4504
+			end = (end == 'transparent') ? '#fff' : end;
4505
+		}
4506
+		var tween = this.get('tween');
4507
+		tween.start('background-color', start || '#ffff88', end).chain(function(){
4508
+			this.setStyle('background-color', this.retrieve('highlight:original'));
4509
+			tween.callChain();
4510
+		}.bind(this));
4511
+		return this;
4512
+	}
4513
+
4514
+});
4515
+
4516
+
4517
+/*
4518
+---
4519
+
4520
+name: Fx.Morph
4521
+
4522
+description: Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules.
4523
+
4524
+license: MIT-style license.
4525
+
4526
+requires: Fx.CSS
4527
+
4528
+provides: Fx.Morph
4529
+
4530
+...
4531
+*/
4532
+
4533
+Fx.Morph = new Class({
4534
+
4535
+	Extends: Fx.CSS,
4536
+
4537
+	initialize: function(element, options){
4538
+		this.element = this.subject = document.id(element);
4539
+		this.parent(options);
4540
+	},
4541
+
4542
+	set: function(now){
4543
+		if (typeof now == 'string') now = this.search(now);
4544
+		for (var p in now) this.render(this.element, p, now[p], this.options.unit);
4545
+		return this;
4546
+	},
4547
+
4548
+	compute: function(from, to, delta){
4549
+		var now = {};
4550
+		for (var p in from) now[p] = this.parent(from[p], to[p], delta);
4551
+		return now;
4552
+	},
4553
+
4554
+	start: function(properties){
4555
+		if (!this.check(properties)) return this;
4556
+		if (typeof properties == 'string') properties = this.search(properties);
4557
+		var from = {}, to = {};
4558
+		for (var p in properties){
4559
+			var parsed = this.prepare(this.element, p, properties[p]);
4560
+			from[p] = parsed.from;
4561
+			to[p] = parsed.to;
4562
+		}
4563
+		return this.parent(from, to);
4564
+	}
4565
+
4566
+});
4567
+
4568
+Element.Properties.morph = {
4569
+
4570
+	set: function(options){
4571
+		this.get('morph').cancel().setOptions(options);
4572
+		return this;
4573
+	},
4574
+
4575
+	get: function(){
4576
+		var morph = this.retrieve('morph');
4577
+		if (!morph){
4578
+			morph = new Fx.Morph(this, {link: 'cancel'});
4579
+			this.store('morph', morph);
4580
+		}
4581
+		return morph;
4582
+	}
4583
+
4584
+};
4585
+
4586
+Element.implement({
4587
+
4588
+	morph: function(props){
4589
+		this.get('morph').start(props);
4590
+		return this;
4591
+	}
4592
+
4593
+});
4594
+
4595
+
4596
+/*
4597
+---
4598
+
4599
+name: Fx.Transitions
4600
+
4601
+description: Contains a set of advanced transitions to be used with any of the Fx Classes.
4602
+
4603
+license: MIT-style license.
4604
+
4605
+credits:
4606
+  - Easing Equations by Robert Penner, <http://www.robertpenner.com/easing/>, modified and optimized to be used with MooTools.
4607
+
4608
+requires: Fx
4609
+
4610
+provides: Fx.Transitions
4611
+
4612
+...
4613
+*/
4614
+
4615
+Fx.implement({
4616
+
4617
+	getTransition: function(){
4618
+		var trans = this.options.transition || Fx.Transitions.Sine.easeInOut;
4619
+		if (typeof trans == 'string'){
4620
+			var data = trans.split(':');
4621
+			trans = Fx.Transitions;
4622
+			trans = trans[data[0]] || trans[data[0].capitalize()];
4623
+			if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')];
4624
+		}
4625
+		return trans;
4626
+	}
4627
+
4628
+});
4629
+
4630
+Fx.Transition = function(transition, params){
4631
+	params = Array.from(params);
4632
+	var easeIn = function(pos){
4633
+		return transition(pos, params);
4634
+	};
4635
+	return Object.append(easeIn, {
4636
+		easeIn: easeIn,
4637
+		easeOut: function(pos){
4638
+			return 1 - transition(1 - pos, params);
4639
+		},
4640
+		easeInOut: function(pos){
4641
+			return (pos <= 0.5 ? transition(2 * pos, params) : (2 - transition(2 * (1 - pos), params))) / 2;
4642
+		}
4643
+	});
4644
+};
4645
+
4646
+Fx.Transitions = {
4647
+
4648
+	linear: function(zero){
4649
+		return zero;
4650
+	}
4651
+
4652
+};
4653
+
4654
+
4655
+
4656
+Fx.Transitions.extend = function(transitions){
4657
+	for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]);
4658
+};
4659
+
4660
+Fx.Transitions.extend({
4661
+
4662
+	Pow: function(p, x){
4663
+		return Math.pow(p, x && x[0] || 6);
4664
+	},
4665
+
4666
+	Expo: function(p){
4667
+		return Math.pow(2, 8 * (p - 1));
4668
+	},
4669
+
4670
+	Circ: function(p){
4671
+		return 1 - Math.sin(Math.acos(p));
4672
+	},
4673
+
4674
+	Sine: function(p){
4675
+		return 1 - Math.cos(p * Math.PI / 2);
4676
+	},
4677
+
4678
+	Back: function(p, x){
4679
+		x = x && x[0] || 1.618;
4680
+		return Math.pow(p, 2) * ((x + 1) * p - x);
4681
+	},
4682
+
4683
+	Bounce: function(p){
4684
+		var value;
4685
+		for (var a = 0, b = 1; 1; a += b, b /= 2){
4686
+			if (p >= (7 - 4 * a) / 11){
4687
+				value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2);
4688
+				break;
4689
+			}
4690
+		}
4691
+		return value;
4692
+	},
4693
+
4694
+	Elastic: function(p, x){
4695
+		return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x && x[0] || 1) / 3);
4696
+	}
4697
+
4698
+});
4699
+
4700
+['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){
4701
+	Fx.Transitions[transition] = new Fx.Transition(function(p){
4702
+		return Math.pow(p, i + 2);
4703
+	});
4704
+});
4705
+
4706
+
4707
+/*
4708
+---
4709
+
4710
+name: Request
4711
+
4712
+description: Powerful all purpose Request Class. Uses XMLHTTPRequest.
4713
+
4714
+license: MIT-style license.
4715
+
4716
+requires: [Object, Element, Chain, Events, Options, Browser]
4717
+
4718
+provides: Request
4719
+
4720
+...
4721
+*/
4722
+
4723
+(function(){
4724
+
4725
+var empty = function(){},
4726
+	progressSupport = ('onprogress' in new Browser.Request);
4727
+
4728
+var Request = this.Request = new Class({
4729
+
4730
+	Implements: [Chain, Events, Options],
4731
+
4732
+	options: {/*
4733
+		onRequest: function(){},
4734
+		onLoadstart: function(event, xhr){},
4735
+		onProgress: function(event, xhr){},
4736
+		onComplete: function(){},
4737
+		onCancel: function(){},
4738
+		onSuccess: function(responseText, responseXML){},
4739
+		onFailure: function(xhr){},
4740
+		onException: function(headerName, value){},
4741
+		onTimeout: function(){},
4742
+		user: '',
4743
+		password: '',*/
4744
+		url: '',
4745
+		data: '',
4746
+		headers: {
4747
+			'X-Requested-With': 'XMLHttpRequest',
4748
+			'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
4749
+		},
4750
+		async: true,
4751
+		format: false,
4752
+		method: 'post',
4753
+		link: 'ignore',
4754
+		isSuccess: null,
4755
+		emulation: true,
4756
+		urlEncoded: true,
4757
+		encoding: 'utf-8',
4758
+		evalScripts: false,
4759
+		evalResponse: false,
4760
+		timeout: 0,
4761
+		noCache: false
4762
+	},
4763
+
4764
+	initialize: function(options){
4765
+		this.xhr = new Browser.Request();
4766
+		this.setOptions(options);
4767
+		this.headers = this.options.headers;
4768
+	},
4769
+
4770
+	onStateChange: function(){
4771
+		var xhr = this.xhr;
4772
+		if (xhr.readyState != 4 || !this.running) return;
4773
+		this.running = false;
4774
+		this.status = 0;
4775
+		Function.attempt(function(){
4776
+			var status = xhr.status;
4777
+			this.status = (status == 1223) ? 204 : status;
4778
+		}.bind(this));
4779
+		xhr.onreadystatechange = empty;
4780
+		if (progressSupport) xhr.onprogress = xhr.onloadstart = empty;
4781
+		clearTimeout(this.timer);
4782
+
4783
+		this.response = {text: this.xhr.responseText || '', xml: this.xhr.responseXML};
4784
+		if (this.options.isSuccess.call(this, this.status))
4785
+			this.success(this.response.text, this.response.xml);
4786
+		else
4787
+			this.failure();
4788
+	},
4789
+
4790
+	isSuccess: function(){
4791
+		var status = this.status;
4792
+		return (status >= 200 && status < 300);
4793
+	},
4794
+
4795
+	isRunning: function(){
4796
+		return !!this.running;
4797
+	},
4798
+
4799
+	processScripts: function(text){
4800
+		if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return Browser.exec(text);
4801
+		return text.stripScripts(this.options.evalScripts);
4802
+	},
4803
+
4804
+	success: function(text, xml){
4805
+		this.onSuccess(this.processScripts(text), xml);
4806
+	},
4807
+
4808
+	onSuccess: function(){
4809
+		this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain();
4810
+	},
4811
+
4812
+	failure: function(){
4813
+		this.onFailure();
4814
+	},
4815
+
4816
+	onFailure: function(){
4817
+		this.fireEvent('complete').fireEvent('failure', this.xhr);
4818
+	},
4819
+
4820
+	loadstart: function(event){
4821
+		this.fireEvent('loadstart', [event, this.xhr]);
4822
+	},
4823
+
4824
+	progress: function(event){
4825
+		this.fireEvent('progress', [event, this.xhr]);
4826
+	},
4827
+
4828
+	timeout: function(){
4829
+		this.fireEvent('timeout', this.xhr);
4830
+	},
4831
+
4832
+	setHeader: function(name, value){
4833
+		this.headers[name] = value;
4834
+		return this;
4835
+	},
4836
+
4837
+	getHeader: function(name){
4838
+		return Function.attempt(function(){
4839
+			return this.xhr.getResponseHeader(name);
4840
+		}.bind(this));
4841
+	},
4842
+
4843
+	check: function(){
4844
+		if (!this.running) return true;
4845
+		switch (this.options.link){
4846
+			case 'cancel': this.cancel(); return true;
4847
+			case 'chain': this.chain(this.caller.pass(arguments, this)); return false;
4848
+		}
4849
+		return false;
4850
+	},
4851
+
4852
+	send: function(options){
4853
+		if (!this.check(options)) return this;
4854
+
4855
+		this.options.isSuccess = this.options.isSuccess || this.isSuccess;
4856
+		this.running = true;
4857
+
4858
+		var type = typeOf(options);
4859
+		if (type == 'string' || type == 'element') options = {data: options};
4860
+
4861
+		var old = this.options;
4862
+		options = Object.append({data: old.data, url: old.url, method: old.method}, options);
4863
+		var data = options.data, url = String(options.url), method = options.method.toLowerCase();
4864
+
4865
+		switch (typeOf(data)){
4866
+			case 'element': data = document.id(data).toQueryString(); break;
4867
+			case 'object': case 'hash': data = Object.toQueryString(data);
4868
+		}
4869
+
4870
+		if (this.options.format){
4871
+			var format = 'format=' + this.options.format;
4872
+			data = (data) ? format + '&' + data : format;
4873
+		}
4874
+
4875
+		if (this.options.emulation && !['get', 'post'].contains(method)){
4876
+			var _method = '_method=' + method;
4877
+			data = (data) ? _method + '&' + data : _method;
4878
+			method = 'post';
4879
+		}
4880
+
4881
+		if (this.options.urlEncoded && ['post', 'put'].contains(method)){
4882
+			var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : '';
4883
+			this.headers['Content-type'] = 'application/x-www-form-urlencoded' + encoding;
4884
+		}
4885
+
4886
+		if (!url) url = document.location.pathname;
4887
+
4888
+		var trimPosition = url.lastIndexOf('/');
4889
+		if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition);
4890
+
4891
+		if (this.options.noCache)
4892
+			url += (url.contains('?') ? '&' : '?') + String.uniqueID();
4893
+
4894
+		if (data && method == 'get'){
4895
+			url += (url.contains('?') ? '&' : '?') + data;
4896
+			data = null;
4897
+		}
4898
+
4899
+		var xhr = this.xhr;
4900
+		if (progressSupport){
4901
+			xhr.onloadstart = this.loadstart.bind(this);
4902
+			xhr.onprogress = this.progress.bind(this);
4903
+		}
4904
+
4905
+		xhr.open(method.toUpperCase(), url, this.options.async, this.options.user, this.options.password);
4906
+		if (this.options.user && 'withCredentials' in xhr) xhr.withCredentials = true;
4907
+
4908
+		xhr.onreadystatechange = this.onStateChange.bind(this);
4909
+
4910
+		Object.each(this.headers, function(value, key){
4911
+			try {
4912
+				xhr.setRequestHeader(key, value);
4913
+			} catch (e){
4914
+				this.fireEvent('exception', [key, value]);
4915
+			}
4916
+		}, this);
4917
+
4918
+		this.fireEvent('request');
4919
+		xhr.send(data);
4920
+		if (!this.options.async) this.onStateChange();
4921
+		if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this);
4922
+		return this;
4923
+	},
4924
+
4925
+	cancel: function(){
4926
+		if (!this.running) return this;
4927
+		this.running = false;
4928
+		var xhr = this.xhr;
4929
+		xhr.abort();
4930
+		clearTimeout(this.timer);
4931
+		xhr.onreadystatechange = empty;
4932
+		if (progressSupport) xhr.onprogress = xhr.onloadstart = empty;
4933
+		this.xhr = new Browser.Request();
4934
+		this.fireEvent('cancel');
4935
+		return this;
4936
+	}
4937
+
4938
+});
4939
+
4940
+var methods = {};
4941
+['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){
4942
+	methods[method] = function(data){
4943
+		var object = {
4944
+			method: method
4945
+		};
4946
+		if (data != null) object.data = data;
4947
+		return this.send(object);
4948
+	};
4949
+});
4950
+
4951
+Request.implement(methods);
4952
+
4953
+Element.Properties.send = {
4954
+
4955
+	set: function(options){
4956
+		var send = this.get('send').cancel();
4957
+		send.setOptions(options);
4958
+		return this;
4959
+	},
4960
+
4961
+	get: function(){
4962
+		var send = this.retrieve('send');
4963
+		if (!send){
4964
+			send = new Request({
4965
+				data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action')
4966
+			});
4967
+			this.store('send', send);
4968
+		}
4969
+		return send;
4970
+	}
4971
+
4972
+};
4973
+
4974
+Element.implement({
4975
+
4976
+	send: function(url){
4977
+		var sender = this.get('send');
4978
+		sender.send({data: this, url: url || sender.options.url});
4979
+		return this;
4980
+	}
4981
+
4982
+});
4983
+
4984
+})();
4985
+
4986
+/*
4987
+---
4988
+
4989
+name: Request.HTML
4990
+
4991
+description: Extends the basic Request Class with additional methods for interacting with HTML responses.
4992
+
4993
+license: MIT-style license.
4994
+
4995
+requires: [Element, Request]
4996
+
4997
+provides: Request.HTML
4998
+
4999
+...
5000
+*/
5001
+
5002
+Request.HTML = new Class({
5003
+
5004
+	Extends: Request,
5005
+
5006
+	options: {
5007
+		update: false,
5008
+		append: false,
5009
+		evalScripts: true,
5010
+		filter: false,
5011
+		headers: {
5012
+			Accept: 'text/html, application/xml, text/xml, */*'
5013
+		}
5014
+	},
5015
+
5016
+	success: function(text){
5017
+		var options = this.options, response = this.response;
5018
+
5019
+		response.html = text.stripScripts(function(script){
5020
+			response.javascript = script;
5021
+		});
5022
+
5023
+		var match = response.html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
5024
+		if (match) response.html = match[1];
5025
+		var temp = new Element('div').set('html', response.html);
5026
+
5027
+		response.tree = temp.childNodes;
5028
+		response.elements = temp.getElements('*');
5029
+
5030
+		if (options.filter) response.tree = response.elements.filter(options.filter);
5031
+		if (options.update) document.id(options.update).empty().set('html', response.html);
5032
+		else if (options.append) document.id(options.append).adopt(temp.getChildren());
5033
+		if (options.evalScripts) Browser.exec(response.javascript);
5034
+
5035
+		this.onSuccess(response.tree, response.elements, response.html, response.javascript);
5036
+	}
5037
+
5038
+});
5039
+
5040
+Element.Properties.load = {
5041
+
5042
+	set: function(options){
5043
+		var load = this.get('load').cancel();
5044
+		load.setOptions(options);
5045
+		return this;
5046
+	},
5047
+
5048
+	get: function(){
5049
+		var load = this.retrieve('load');
5050
+		if (!load){
5051
+			load = new Request.HTML({data: this, link: 'cancel', update: this, method: 'get'});
5052
+			this.store('load', load);
5053
+		}
5054
+		return load;
5055
+	}
5056
+
5057
+};
5058
+
5059
+Element.implement({
5060
+
5061
+	load: function(){
5062
+		this.get('load').send(Array.link(arguments, {data: Type.isObject, url: Type.isString}));
5063
+		return this;
5064
+	}
5065
+
5066
+});
5067
+
5068
+
5069
+/*
5070
+---
5071
+
5072
+name: JSON
5073
+
5074
+description: JSON encoder and decoder.
5075
+
5076
+license: MIT-style license.
5077
+
5078
+See Also: <http://www.json.org/>
5079
+
5080
+requires: [Array, String, Number, Function]
5081
+
5082
+provides: JSON
5083
+
5084
+...
5085
+*/
5086
+
5087
+if (typeof JSON == 'undefined') this.JSON = {};
5088
+
5089
+
5090
+
5091
+(function(){
5092
+
5093
+var special = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'};
5094
+
5095
+var escape = function(chr){
5096
+	return special[chr] || '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4);
5097
+};
5098
+
5099
+JSON.validate = function(string){
5100
+	string = string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
5101
+					replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
5102
+					replace(/(?:^|:|,)(?:\s*\[)+/g, '');
5103
+
5104
+	return (/^[\],:{}\s]*$/).test(string);
5105
+};
5106
+
5107
+JSON.encode = JSON.stringify ? function(obj){
5108
+	return JSON.stringify(obj);
5109
+} : function(obj){
5110
+	if (obj && obj.toJSON) obj = obj.toJSON();
5111
+
5112
+	switch (typeOf(obj)){
5113
+		case 'string':
5114
+			return '"' + obj.replace(/[\x00-\x1f\\"]/g, escape) + '"';
5115
+		case 'array':
5116
+			return '[' + obj.map(JSON.encode).clean() + ']';
5117
+		case 'object': case 'hash':
5118
+			var string = [];
5119
+			Object.each(obj, function(value, key){
5120
+				var json = JSON.encode(value);
5121
+				if (json) string.push(JSON.encode(key) + ':' + json);
5122
+			});
5123
+			return '{' + string + '}';
5124
+		case 'number': case 'boolean': return '' + obj;
5125
+		case 'null': return 'null';
5126
+	}
5127
+
5128
+	return null;
5129
+};
5130
+
5131
+JSON.decode = function(string, secure){
5132
+	if (!string || typeOf(string) != 'string') return null;
5133
+
5134
+	if (secure || JSON.secure){
5135
+		if (JSON.parse) return JSON.parse(string);
5136
+		if (!JSON.validate(string)) throw new Error('JSON could not decode the input; security is enabled and the value is not secure.');
5137
+	}
5138
+
5139
+	return eval('(' + string + ')');
5140
+};
5141
+
5142
+}).call(this);
5143
+
5144
+
5145
+/*
5146
+---
5147
+
5148
+name: Request.JSON
5149
+
5150
+description: Extends the basic Request Class with additional methods for sending and receiving JSON data.
5151
+
5152
+license: MIT-style license.
5153
+
5154
+requires: [Request, JSON]
5155
+
5156
+provides: Request.JSON
5157
+
5158
+...
5159
+*/
5160
+
5161
+Request.JSON = new Class({
5162
+
5163
+	Extends: Request,
5164
+
5165
+	options: {
5166
+		/*onError: function(text, error){},*/
5167
+		secure: true
5168
+	},
5169
+
5170
+	initialize: function(options){
5171
+		this.parent(options);
5172
+		Object.append(this.headers, {
5173
+			'Accept': 'application/json',
5174
+			'X-Request': 'JSON'
5175
+		});
5176
+	},
5177
+
5178
+	success: function(text){
5179
+		var json;
5180
+		try {
5181
+			json = this.response.json = JSON.decode(text, this.options.secure);
5182
+		} catch (error){
5183
+			this.fireEvent('error', [text, error]);
5184
+			return;
5185
+		}
5186
+		if (json == null) this.onFailure();
5187
+		else this.onSuccess(json, text);
5188
+	}
5189
+
5190
+});
5191
+
5192
+
5193
+/*
5194
+---
5195
+
5196
+name: Cookie
5197
+
5198
+description: Class for creating, reading, and deleting browser Cookies.
5199
+
5200
+license: MIT-style license.
5201
+
5202
+credits:
5203
+  - Based on the functions by Peter-Paul Koch (http://quirksmode.org).
5204
+
5205
+requires: [Options, Browser]
5206
+
5207
+provides: Cookie
5208
+
5209
+...
5210
+*/
5211
+
5212
+var Cookie = new Class({
5213
+
5214
+	Implements: Options,
5215
+
5216
+	options: {
5217
+		path: '/',
5218
+		domain: false,
5219
+		duration: false,
5220
+		secure: false,
5221
+		document: document,
5222
+		encode: true
5223
+	},
5224
+
5225
+	initialize: function(key, options){
5226
+		this.key = key;
5227
+		this.setOptions(options);
5228
+	},
5229
+
5230
+	write: function(value){
5231
+		if (this.options.encode) value = encodeURIComponent(value);
5232
+		if (this.options.domain) value += '; domain=' + this.options.domain;
5233
+		if (this.options.path) value += '; path=' + this.options.path;
5234
+		if (this.options.duration){
5235
+			var date = new Date();
5236
+			date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000);
5237
+			value += '; expires=' + date.toGMTString();
5238
+		}
5239
+		if (this.options.secure) value += '; secure';
5240
+		this.options.document.cookie = this.key + '=' + value;
5241
+		return this;
5242
+	},
5243
+
5244
+	read: function(){
5245
+		var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)');
5246
+		return (value) ? decodeURIComponent(value[1]) : null;
5247
+	},
5248
+
5249
+	dispose: function(){
5250
+		new Cookie(this.key, Object.merge({}, this.options, {duration: -1})).write('');
5251
+		return this;
5252
+	}
5253
+
5254
+});
5255
+
5256
+Cookie.write = function(key, value, options){
5257
+	return new Cookie(key, options).write(value);
5258
+};
5259
+
5260
+Cookie.read = function(key){
5261
+	return new Cookie(key).read();
5262
+};
5263
+
5264
+Cookie.dispose = function(key, options){
5265
+	return new Cookie(key, options).dispose();
5266
+};
5267
+
5268
+
5269
+/*
5270
+---
5271
+
5272
+name: DOMReady
5273
+
5274
+description: Contains the custom event domready.
5275
+
5276
+license: MIT-style license.
5277
+
5278
+requires: [Browser, Element, Element.Event]
5279
+
5280
+provides: [DOMReady, DomReady]
5281
+
5282
+...
5283
+*/
5284
+
5285
+(function(window, document){
5286
+
5287
+var ready,
5288
+	loaded,
5289
+	checks = [],
5290
+	shouldPoll,
5291
+	timer,
5292
+	isFramed = true;
5293
+
5294
+// Thanks to Rich Dougherty <http://www.richdougherty.com/>
5295
+try {
5296
+	isFramed = window.frameElement != null;
5297
+} catch(e){}
5298
+
5299
+var domready = function(){
5300
+	clearTimeout(timer);
5301
+	if (ready) return;
5302
+	Browser.loaded = ready = true;
5303
+	document.removeListener('DOMContentLoaded', domready).removeListener('readystatechange', check);
5304
+
5305
+	document.fireEvent('domready');
5306
+	window.fireEvent('domready');
5307
+};
5308
+
5309
+var check = function(){
5310
+	for (var i = checks.length; i--;) if (checks[i]()){
5311
+		domready();
5312
+		return true;
5313
+	}
5314
+
5315
+	return false;
5316
+};
5317
+
5318
+var poll = function(){
5319
+	clearTimeout(timer);
5320
+	if (!check()) timer = setTimeout(poll, 10);
5321
+};
5322
+
5323
+document.addListener('DOMContentLoaded', domready);
5324
+
5325
+// doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/
5326
+var testElement = document.createElement('div');
5327
+if (testElement.doScroll && !isFramed){
5328
+	checks.push(function(){
5329
+		try {
5330
+			testElement.doScroll();
5331
+			return true;
5332
+		} catch (e){}
5333
+
5334
+		return false;
5335
+	});
5336
+	shouldPoll = true;
5337
+}
5338
+
5339
+if (document.readyState) checks.push(function(){
5340
+	var state = document.readyState;
5341
+	return (state == 'loaded' || state == 'complete');
5342
+});
5343
+
5344
+if ('onreadystatechange' in document) document.addListener('readystatechange', check);
5345
+else shouldPoll = true;
5346
+
5347
+if (shouldPoll) poll();
5348
+
5349
+Element.Events.domready = {
5350
+	onAdd: function(fn){
5351
+		if (ready) fn.call(this);
5352
+	}
5353
+};
5354
+
5355
+// Make sure that domready fires before load
5356
+Element.Events.load = {
5357
+	base: 'load',
5358
+	onAdd: function(fn){
5359
+		if (loaded && this == window) fn.call(this);
5360
+	},
5361
+	condition: function(){
5362
+		if (this == window){
5363
+			domready();
5364
+			delete Element.Events.load;
5365
+		}
5366
+
5367
+		return true;
5368
+	}
5369
+};
5370
+
5371
+// This is based on the custom load event
5372
+window.addEvent('load', function(){
5373
+	loaded = true;
5374
+});
5375
+
5376
+})(window, document);
5377
+
5378
+
5379
+/*
5380
+---
5381
+
5382
+name: Swiff
5383
+
5384
+description: Wrapper for embedding SWF movies. Supports External Interface Communication.
5385
+
5386
+license: MIT-style license.
5387
+
5388
+credits:
5389
+  - Flash detection & Internet Explorer + Flash Player 9 fix inspired by SWFObject.
5390
+
5391
+requires: [Options, Object, Element]
5392
+
5393
+provides: Swiff
5394
+
5395
+...
5396
+*/
5397
+
5398
+(function(){
5399
+
5400
+var Swiff = this.Swiff = new Class({
5401
+
5402
+	Implements: Options,
5403
+
5404
+	options: {
5405
+		id: null,
5406
+		height: 1,
5407
+		width: 1,
5408
+		container: null,
5409
+		properties: {},
5410
+		params: {
5411
+			quality: 'high',
5412
+			allowScriptAccess: 'always',
5413
+			wMode: 'window',
5414
+			swLiveConnect: true
5415
+		},
5416
+		callBacks: {},
5417
+		vars: {}
5418
+	},
5419
+
5420
+	toElement: function(){
5421
+		return this.object;
5422
+	},
5423
+
5424
+	initialize: function(path, options){
5425
+		this.instance = 'Swiff_' + String.uniqueID();
5426
+
5427
+		this.setOptions(options);
5428
+		options = this.options;
5429
+		var id = this.id = options.id || this.instance;
5430
+		var container = document.id(options.container);
5431
+
5432
+		Swiff.CallBacks[this.instance] = {};
5433
+
5434
+		var params = options.params, vars = options.vars, callBacks = options.callBacks;
5435
+		var properties = Object.append({height: options.height, width: options.width}, options.properties);
5436
+
5437
+		var self = this;
5438
+
5439
+		for (var callBack in callBacks){
5440
+			Swiff.CallBacks[this.instance][callBack] = (function(option){
5441
+				return function(){
5442
+					return option.apply(self.object, arguments);
5443
+				};
5444
+			})(callBacks[callBack]);
5445
+			vars[callBack] = 'Swiff.CallBacks.' + this.instance + '.' + callBack;
5446
+		}
5447
+
5448
+		params.flashVars = Object.toQueryString(vars);
5449
+		if (Browser.ie){
5450
+			properties.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
5451
+			params.movie = path;
5452
+		} else {
5453
+			properties.type = 'application/x-shockwave-flash';
5454
+		}
5455
+		properties.data = path;
5456
+
5457
+		var build = '<object id="' + id + '"';
5458
+		for (var property in properties) build += ' ' + property + '="' + properties[property] + '"';
5459
+		build += '>';
5460
+		for (var param in params){
5461
+			if (params[param]) build += '<param name="' + param + '" value="' + params[param] + '" />';
5462
+		}
5463
+		build += '</object>';
5464
+		this.object = ((container) ? container.empty() : new Element('div')).set('html', build).firstChild;
5465
+	},
5466
+
5467
+	replaces: function(element){
5468
+		element = document.id(element, true);
5469
+		element.parentNode.replaceChild(this.toElement(), element);
5470
+		return this;
5471
+	},
5472
+
5473
+	inject: function(element){
5474
+		document.id(element, true).appendChild(this.toElement());
5475
+		return this;
5476
+	},
5477
+
5478
+	remote: function(){
5479
+		return Swiff.remote.apply(Swiff, [this.toElement()].append(arguments));
5480
+	}
5481
+
5482
+});
5483
+
5484
+Swiff.CallBacks = {};
5485
+
5486
+Swiff.remote = function(obj, fn){
5487
+	var rs = obj.CallFunction('<invoke name="' + fn + '" returntype="javascript">' + __flash__argumentsToXML(arguments, 2) + '</invoke>');
5488
+	return eval(rs);
5489
+};
5490
+
5491
+}).call(this);
5492
+
5493
+
... ...
@@ -3,6 +3,35 @@ window.addEvent('domready', function() {
3 3
   codeblocks.each(addExpander);
4 4
 });
5 5
 
6
+window.addEvents({
7
+  domready: function(){
8
+    if(twitter_user){
9
+      new Request.Twitter(twitter_user, {
10
+        include_replies: false,
11
+        data: { count: 3 },
12
+        onSuccess: function(tweets){
13
+          $('tweets').empty();
14
+          for (var i = tweets.length; i--; ){
15
+            new Element('li', {
16
+              'class': 'tweet'
17
+              }).adopt(
18
+              new Element('p', { 'html': tweets[i].text+' ' }).adopt(
19
+                new Element('a', {
20
+                  'href': 'http://twitter.com/'+twitter_user+'/status/'+tweets[i].id_str,
21
+                  'text': new Date(tweets[i].created_at).timeDiffInWords()
22
+                }))
23
+            ).inject('tweets', 'top');
24
+          }
25
+        }
26
+      }).send();
27
+    }
28
+    $$('#recent_posts time').each(function(date){
29
+      date.set('text', new Date(date.get('text')).timeDiffInWords());
30
+    });
31
+  },
32
+});
33
+
34
+
6 35
 function addExpander(div){
7 36
   new Element('span',{
8 37
 		html: 'expand &raquo;',
... ...
@@ -44,4 +73,4 @@ function enableCompressedLayout(codeblocks){
44 44
       }
45 45
     }
46 46
 	}).inject($('main'), 'top');
47
-}
48 47
\ No newline at end of file
48
+}
49 49
new file mode 100644
... ...
@@ -0,0 +1,52 @@
0
+var count = pinboard_count;
1
+var linkroll = 'pinboard_linkroll';
2
+function pinboardNS_fetch_script(url) {
3
+  document.writeln('<s'+'cript type="text/javascript" src="' + url + '"></s'+'cript>');
4
+}
5
+
6
+function pinboardNS_show_bmarks(r) {
7
+  var lr = new Pinboard_Linkroll();
8
+  lr.set_items(r);
9
+  lr.show_bmarks();
10
+}
11
+
12
+var json_URL = "http://feeds.pinboard.in/json/v1/u:"+pinboard_user+"/?cb=pinboardNS_show_bmarks\&count=" + count;
13
+pinboardNS_fetch_script(json_URL);
14
+
15
+function Pinboard_Linkroll() {
16
+  var items;
17
+
18
+  this.set_items = function(i) {
19
+    this.items = i;
20
+  }
21
+  this.show_bmarks = function() {
22
+    var lines = [];
23
+    for (var i = 0; i < this.items.length; i++) {
24
+      var item = this.items[i];
25
+      var str = this.format_item(item);
26
+      lines.push(str);
27
+    }
28
+    $(linkroll).set('html', lines.join("\n"));
29
+  }
30
+  this.cook = function(v) {
31
+    return v.replace('<', '&lt;').replace('>', '&gt>');
32
+  }
33
+
34
+  this.format_item = function(it) {
35
+    var str = "<li class=\"pin-item\">";
36
+    if (!it.d) { return; }
37
+    str += "<p><a class=\"pin-title\" href=\"" + this.cook(it.u) + "\">" + this.cook(it.d) + "</a>";
38
+    if (it.n) {
39
+      str += "<span class=\"pin-description\">" + this.cook(it.n) + "</span>\n";
40
+    }
41
+    if (it.t.length > 0) {
42
+      for (var i = 0; i < it.t.length; i++) {
43
+        var tag = it.t[i];
44
+        str += " <a class=\"pin-tag\" href=\"http://pinboard.in/u:"+ this.cook(it.a) + "/t:" + this.cook(tag) + "\">" + this.cook(tag) + "</a>  ";
45
+      }
46
+    }
47
+    str += "</p></li>\n";
48
+    return str;
49
+  }
50
+}
51
+Pinboard_Linkroll.prototype = new Pinboard_Linkroll();
... ...
@@ -1,151 +1,52 @@
1
-//
2
-// The Octopress Twitter Feed is based on the following work:
3
-// Valerio's javascript framework Mootools: Mootools.net
4
-// David Walsh's Twitter Gitter plugin: http://davidwalsh.name/mootools-twitter-plugin
5
-// Aaron Newton’s JSONP plugin: http://clientcide.com/js
6
-// PrettyDate by John Resig at http://ejohn.org/files/pretty.js
7
-//
8
-
9
-/*
10
-	Plugin:   	Octopress Twitter Feed
11
-	Author:   	Brandon Mathis
12
-	Website:    http://brandonmathis.com
13
-	Date:     	11/07/2009
14
-*/
15
-
16
-var tweet_container = 'li';
17
-var twitter_container = 'twitter_status';
18
-var key = '-!-!-';
19
-var show_source = false;
20
-
21
-window.addEvent('domready',function() {
22
-	getTwitterStatus(twitter_user);
23
-});
24
-
25
-function showTweets(the_tweets, from_cookie){
26
-  if(from_cookie){
27
-    the_tweets = the_tweets.split('^!^!^');
1
+Request.Twitter = new Class({
2
+
3
+  Extends: Request.JSONP,
4
+
5
+  options: {
6
+    linkify: true,
7
+    url: 'http://twitter.com/statuses/user_timeline/{term}.json',
8
+    include_replies: true,
9
+    data: {
10
+      count: 5,
11
+      trim_user: true
12
+    }
13
+  },
14
+
15
+  initialize: function(term, options){
16
+    this.parent(options);
17
+    if(this.options.include_replies == false){
18
+      this.options.count = this.options.data.count
19
+      this.options.data.count += 30; // adds 30 tweets to request for filtering
20
+    }
21
+    this.options.url = this.options.url.substitute({term: term});
22
+    console.log(this.options.url);
23
+  },
24
+
25
+  success: function(args, index){
26
+    if(!this.options.include_replies){
27
+      args[0] = args[0].filter(function(item, index, array){
28
+        return item.in_reply_to_screen_name == null;
29
+      });
30
+      if(args[0].length > this.options.count){ args[0].length = this.options.count; }
31
+    }
32
+    var data = args[0];
33
+
34
+    if (this.options.linkify) data.each(function(tweet){
35
+      tweet.text = this.linkify(tweet.text);
36
+    }, this);
37
+
38
+    if (data[0]) this.options.data.since_id = data[0].id; // keep subsequent calls newer
39
+
40
+    this.parent(args, index);
41
+  },
42
+
43
+  linkify: function(text){
44
+    // modified from TwitterGitter by David Walsh (davidwalsh.name)
45
+    // courtesy of Jeremy Parrish (rrish.org)
46
+    return text.replace(/(https?:\/\/[\w\-:;?&=+.%#\/]+)/gi, '<a href="$1">$1</a>')
47
+    .replace(/(^|\W)@(\w+)/g, '$1<a href="http://twitter.com/$2">@$2</a>')
48
+      .replace(/(^|\W)#(\w+)/g, '$1#<a href="http://search.twitter.com/search?q=%23$2">$2</a>');
28 49
   }
29
-  $(twitter_container).set('html', '');
30
-  the_tweets.each(function(tweet){
31
-    tweet = parseTweetMeta(tweet)
32
-    tweet = '<p>' + tweet.replace(/\n\n/gi,'</p><p>') + '</p>';
33
-    new Element(tweet_container,{
34
-  		html: tweet
35
-  	}).inject(twitter_container);
36
-  });
37
-}
38
-
39
-function parseTweetMeta(tweet_data){
40
-  var tweet_data = tweet_data.split(key);
41
-  var tweet = tweet_data[0];
42
-  var date = tweet_data[1];
43
-  var tweet_id = tweet_data[2];
44
-  var source = tweet_data[3];
45
-  
46
-  date = prettyDate(new Date().parse(date));
47
-  return tweet + '<span class="meta"><a href="http://twitter.com/'+twitter_user + '/status/' + tweet_id + '">' + date + '</a>' + (show_source ? ' from '+source : '') + '</span>';
48
-}
49 50
 
50
-function prettyDate(time){
51
-	var date = time;
52
-	var diff = (((new Date()).getTime() - date.getTime()) / 1000)
53
-	var day_diff = Math.floor(diff / 86400);
54
-			
55
-	if ( isNaN(day_diff) || day_diff < 0)
56
-		return;
57
-			
58
-	return day_diff == 0 && (
59
-			diff < 60 && "just now" ||
60
-			diff < 120 && "1 minute ago" ||
61
-			diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" ||
62
-			diff < 7200 && "1 hour ago" ||
63
-			diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") ||
64
-		day_diff == 1 && "1 day ago" ||
65
-		day_diff < 7 && day_diff + " days ago" ||
66
-		day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago" ||
67
-		true && Math.ceil( day_diff / 30 ) + " months ago";
68
-}
69
-
70
-function getTwitterStatus(twitter_name){
71
-  var container = $(twitter_container);
72
-  if(!container) return;
73
-  var tweet_cookie = 'tweets_by_' + twitter_name + tweet_count;
74
-  container.set('html', 'Fetching tweets...');
75
-  if(!Cookie.read(tweet_cookie)) {
76
-  	var myTwitterGitter = new TwitterGitter(twitter_name,{
77
-  	  count: ((show_replies) ? tweet_count : 15 + tweet_count),
78
-  		onComplete: function(tweets,user) {
79
-        the_tweets = Array();
80
-  			tweets.each(function(tweet,i) {
81
-  			  if((tweet.in_reply_to_status_id && show_replies) || !tweet.in_reply_to_status_id){
82
-  			    if(the_tweets.length == tweet_count) return;
83
-    			  the_tweets.push(tweet.text + key + tweet.created_at + key + tweet.id + key + tweet.source);
84
-  				}
85
-  			});
86
-  			Cookie.write(tweet_cookie,the_tweets.join('^!^!^'), { duration: 0.02 });
87
-  			showTweets(the_tweets);
88
-  		}
89
-  	}).retrieve();
90
-	} else {
91
-	  showTweets(Cookie.read(tweet_cookie),true);
92
-	}
93
-}
94
-
95
-/*
96
-	Plugin:   	TwitterGitter
97
-	Author:   	David Walsh
98
-	Website:    http://davidwalsh.name
99
-	Date:     	2/21/2009
100
-*/
101
-
102
-var TwitterGitter = new Class({
103
-
104
-	//implements
105
-	Implements: [Options,Events],
106
-
107
-	//options
108
-	options: {
109
-		count: 2,
110
-		sinceID: 1,
111
-		link: true,
112
-		onRequest: $empty,
113
-		onComplete: $empty
114
-	},
115
-	
116
-	//initialization
117
-	initialize: function(username,options) {
118
-		//set options
119
-		this.setOptions(options);
120
-		this.info = {};
121
-		this.username = username;
122
-	},
123
-	
124
-	//get it!
125
-	retrieve: function() {
126
-		new JsonP('http://twitter.com/statuses/user_timeline/' + this.username + '.json',{
127
-			data: {
128
-				count: this.options.count,
129
-				since_id: this.options.sinceID
130
-			},
131
-			onRequest: this.fireEvent('request'),
132
-			onComplete: function(data) {
133
-				//linkify?
134
-				if(this.options.link) {
135
-					data.each(function(tweet) { tweet.text = this.linkify(tweet.text); },this);
136
-				}
137
-				//complete!
138
-				this.fireEvent('complete',[data,data[0].user]);
139
-			}.bind(this)
140
-		}).request();
141
-		return this;
142
-	},
143
-	
144
-	//format
145
-	linkify: function(text) {
146
-		//courtesy of Jeremy Parrish (rrish.org)
147
-		return text.replace(/(https?:\/\/[\w\-:;?&=+.%#\/]+)/gi,'<a href="$1">$1</a>').replace(/(^|\s)@(\w+)/g,'$1<a class="user" href="http://twitter.com/$2">@$2</a>').replace(/(^|\s)#(\w+)/g,'$1<a class="topic" href="http://search.twitter.com/search?q=%23$2">#$2</a>');
148
-	}
149 51
 });
150
-//Compact Jsonp from http://clientcide.com/js
151
-MooTools.More={'version':'1.2.3.1'};var Log=new Class({log:function(){Log.logger.call(this,arguments)}});Log.logged=[];Log.logger=function(){if(window.console&&console.log)console.log.apply(console,arguments);else Log.logged.push(arguments)};Class.refactor=function(original,refactors){$each(refactors,function(item,name){var origin=original.prototype[name];if(origin&&(origin=origin._origin)&&typeof item=='function')original.implement(name,function(){var old=this.previous;this.previous=origin;var value=item.apply(this,arguments);this.previous=old;return value});else original.implement(name,item)});return original};Request.JSONP=new Class({Implements:[Chain,Events,Options,Log],options:{url:'',data:{},retries:0,timeout:0,link:'ignore',callbackKey:'callback',injectScript:document.head},initialize:function(options){this.setOptions(options);this.running=false;this.requests=0;this.triesRemaining=[]},check:function(){if(!this.running)return true;switch(this.options.link){case'cancel':this.cancel();return true;case'chain':this.chain(this.caller.bind(this,arguments));return false}return false},send:function(options){if(!$chk(arguments[1])&&!this.check(options))return this;var type=$type(options),old=this.options,index=$chk(arguments[1])?arguments[1]:this.requests++;if(type=='string'||type=='element')options={data:options};options=$extend({data:old.data,url:old.url},options);if(!$chk(this.triesRemaining[index]))this.triesRemaining[index]=this.options.retries;var remaining=this.triesRemaining[index];(function(){var script=this.getScript(options);this.log('JSONP retrieving script with url: '+script.get('src'));this.fireEvent('request',script);this.running=true;(function(){if(remaining){this.triesRemaining[index]=remaining-1;if(script){script.destroy();this.send(options,index);this.fireEvent('retry',this.triesRemaining[index])}}else if(script&&this.options.timeout){script.destroy();this.cancel();this.fireEvent('failure')}}).delay(this.options.timeout,this)}).delay(Browser.Engine.trident?50:0,this);return this},cancel:function(){if(!this.running)return this;this.running=false;this.fireEvent('cancel');return this},getScript:function(options){var index=Request.JSONP.counter,data;Request.JSONP.counter++;switch($type(options.data)){case'element':data=document.id(options.data).toQueryString();break;case'object':case'hash':data=Hash.toQueryString(options.data)}var src=options.url+(options.url.test('\\?')?'&':'?')+(options.callbackKey||this.options.callbackKey)+'=Request.JSONP.request_map.request_'+index+(data?'&'+data:'');if(src.length>2083)this.log('JSONP '+src+' will fail in Internet Explorer, which enforces a 2083 bytes length limit on URIs');var script=new Element('script',{type:'text/javascript',src:src});Request.JSONP.request_map['request_'+index]=function(data){this.success(data,script)}.bind(this);return script.inject(this.options.injectScript)},success:function(data,script){if(script)script.destroy();this.running=false;this.log('JSONP successfully retrieved: ',data);this.fireEvent('complete',[data]).fireEvent('success',[data]).callChain()}});Request.JSONP.counter=0;Request.JSONP.request_map={};var JsonP=Class.refactor(Request.JSONP,{initialize:function(){var params=Array.link(arguments,{url:String.type,options:Object.type});options=(params.options||{});options.url=options.url||params.url;if(options.callBackKey)options.callbackKey=options.callBackKey;this.previous(options)},getScript:function(options){var queryString=options.queryString||this.options.queryString;if(options.url&&queryString)options.url+=(options.url.indexOf("?")>=0?"&":"?")+queryString;var script=this.previous(options);if($chk(options.globalFunction)){window[options.globalFunction]=function(r){JsonP.requestors[index].handleResults(r)}}return script},request:function(url){this.send({url:url||this.options.url})}});
52
+
152 53
new file mode 100644
... ...
@@ -0,0 +1,17 @@
0
+@import "compass";
1
+@import "compass/layout";
2
+
3
+@include global-reset;
4
+
5
+@include reset-html5;
6
+
7
+/* SASS mixins */
8
+//@import "library/typography";
9
+
10
+/* primary SASS */
11
+//@import "theme";
12
+//@import "typography";
13
+@import "themes/classic/style";
14
+
15
+/* specific SASS */
16
+//@import "partials";
0 17
new file mode 100644
... ...
@@ -0,0 +1,13 @@
0
+@import "partials/shared";
1
+@import "partials/syntax";
2
+@import "partials/search";
3
+@import "partials/sidebar";
4
+@import "partials/twitter";
5
+
6
+/* layout partials */
7
+@import "partials/header";
8
+@import "partials/navigation";
9
+@import "partials/page";
10
+@import "partials/sidebar";
11
+@import "partials/blog";
12
+@import "partials/footer";
0 13
new file mode 100644
... ...
@@ -0,0 +1,4 @@
0
+@import "core/layout";
1
+@import "core/theme";
2
+@import "core/typography";
3
+//@import "partials";
0 4
new file mode 100644
... ...
@@ -0,0 +1,91 @@
0
+$page-pad: 40px;
1
+$min-width: 320px;
2
+$max-width: 1440px;
3
+$sidebar-width: 320px;
4
+$sidebar-pad: 30px;
5
+$default-border-radius: 4px;
6
+
7
+//html { background-color: $body_bg; }
8
+
9
+//body { color: $body_color; }
10
+
11
+//a {
12
+  //color: $link_color;
13
+  //&:hover, &:focus {
14
+    //color: saturate(darken($link_color, 15), 20); }
15
+  //&:visited {
16
+    //color: darken(adjust_hue($link_color, 70), 10); } }
17
+
18
+.group { @include pie-clearfix; }
19
+
20
+.inner-wrap {
21
+  position: relative;
22
+  margin: 0 auto;
23
+  padding: 0 $page_pad;
24
+  max-width: $max-width;
25
+  @extend .group;
26
+}
27
+
28
+.core-layout { > div { @extend .inner-wrap; } }
29
+
30
+body { > header, > nav, > footer {
31
+    @extend .core-layout;
32
+    min-width: $min-width;
33
+  }
34
+}
35
+
36
+#page {
37
+  @extend .group;
38
+  padding: 0;
39
+  max-width: $max-width + $page-pad*2;
40
+  margin: 0 auto;
41
+  > div {
42
+    @extend .group;
43
+    //min-width: 480px;
44
+    margin-right: $sidebar-width;
45
+    > aside {
46
+      float: left;
47
+      width: $sidebar-width - $sidebar-pad*2;
48
+      margin: 0 -100% 0 0;
49
+      padding: $sidebar-pad;
50
+    }
51
+  }
52
+}
53
+
54
+#main {
55
+  float: left;
56
+  width: 100%;
57
+  padding-top: 25px;
58
+  padding-bottom: 25px;
59
+  > * {
60
+    padding-right: $page-pad;
61
+    padding-left: $page-pad;
62
+  }
63
+}
64
+
65
+@media (min-device-width:1024px) and (max-width:800px),
66
+       screen and (max-device-width:480px), (max-device-width:480px) and (orientation:landscape),
67
+       (min-device-width:481px) and (max-device-width:1024px) and (orientation:portrait) {
68
+  #page > div { margin-right: 0;
69
+    #main { float: none; }
70
+    > aside { margin: 0; float: none; }
71
+  }
72
+  page > div > aside { float: none; }
73
+  body { > header, > nav, > footer { > div { padding: 0 15px; }}}
74
+  #main > * { padding-left: 15px; padding-right: 15px; }
75
+}
76
+
77
+@media only screen and (min-device-width: 320px) and (max-device-width: 480px) {
78
+  body { > header, > nav, > footer { > div { padding: 0 10px; }}}
79
+  #main > * { padding-left: 10px; padding-right: 10px; }
80
+  #page > div { margin: none; > aside { float: none; }}
81
+}
82
+
83
+//*{
84
+    //transition: width .5s;
85
+    //-moz-transition: width .5s;
86
+    //-webkit-transition: margin .5s;
87
+//}
88
+
89
+
90
+//#search { left: $page-width + $sidebar-margin - $sidebar-width; }
0 91
new file mode 100644
... ...
@@ -0,0 +1,45 @@
0
+// Link Colors
1
+$link_color: lighten(#165b94, 0.3);
2
+
3
+// Main Section Colors
4
+$body_color: #333333;
5
+$light_text: #999999;
6
+$body_bg: #323232;
7
+
8
+$header_bg: #323232;
9
+$header_border: #181818;
10
+$title_color: #dddddd;
11
+
12
+$nav_color: #555555;
13
+$nav_color_hover: black;
14
+$nav_bg: #e8e8e8;
15
+$nav_border_top: white;
16
+$nav_border_bottom: #aaaaaa;
17
+$nav_border_left: #cccccc;
18
+$nav_border_right: white;
19
+
20
+$sidebar_bg: #f2f2f2;
21
+$sidebar_border: #d5d5d5;
22
+
23
+// Blog
24
+$article_border: #eeeeee;
25
+$main_bg: #fff;
26
+
27
+$footer_color: #999999;
28
+$footer_bg: #444444;
29
+
30
+// Form Colors
31
+$fieldset_bg: #ececec;
32
+$fieldset_border: #c3c3c3;
33
+
34
+$textinput_color: #333333;
35
+$textinput_bg: #f4f4f4;
36
+$textinput_bg_focus: #fefeee;
37
+
38
+$textinput_border_top: #aaaaaa;
39
+$textinput_border_bottom: #c6c6c6;
40
+$textinput_border_left: #c3c3c3;
41
+$textinput_border_right: #c3c3c3;
42
+$textinput_border_focus: #989898;
43
+
44
+$twitter_topic: #888888;
0 45
new file mode 100644
... ...
@@ -0,0 +1,159 @@
0
+$type-border: #ddd;
1
+$type-color-light: #555;
2
+$type-color: #000;
3
+$blockquote: $type-border !default; //darken($type-border, 20) !default;
4
+
5
+
6
+// Fonts
7
+@include font-face("Adelle", font-files("adellebasic_bold-webfont.woff", woff, "adellebasic_bold-webfont.ttf", truetype, "adellebasic_bold-webfont.svg#webfontKykxqSyz", svg), $eot: "adellebasic_bold-webfont.eot" );
8
+.heading-font { font-family: Adelle, "Helvetica Neue", Helvetica, Arial, sans; }
9
+
10
+body > header h1 {
11
+  font-size: 3em;
12
+  @extend .heading-font;
13
+  line-height: 1.2em;
14
+  margin-bottom: 0.6667em;
15
+}
16
+
17
+
18
+body {
19
+  font-size: 1em;
20
+  line-height: 1.5em;
21
+  color: $type-color;
22
+  font-family: Georgia, Times, serif;
23
+}
24
+
25
+article {
26
+  margin-bottom: 1.5em;
27
+  padding-bottom: 1.5em;
28
+  padding-top: 1em;
29
+  + article { border-top: 3px solid $type-color-light; }
30
+  &:last-child { border-bottom: none; }
31
+  h2 {
32
+    padding-top: 0.8em;
33
+    border-top: 3px double $type-border;
34
+  }
35
+  .author, time { text-transform: uppercase; }
36
+  .updated { font-size: .8em; color: $type-color-light; }
37
+  time span {
38
+    font-size: .7em;
39
+    line-height: 0;
40
+    position: relative;
41
+    top: -.4em;
42
+  }
43
+  header {
44
+    p {
45
+      padding: 0 0 1.5em;
46
+      font-size: .8em;
47
+      color: $type-color-light;
48
+      font-family: Palatino, Times, "Times New Roman";
49
+      //margin-top: -1.2em;
50
+      //border: {
51
+        top-width: 1px;
52
+        //bottom-width: 1px;
53
+        //style: dashed;
54
+        //color: $type-border;
55
+      //}
56
+    }
57
+  }
58
+}
59
+
60
+#{headings()}{
61
+  @extend .heading-font; font-weight: normal;
62
+  line-height: 1em;
63
+  text-rendering: optimizelegibility;
64
+}
65
+h1 {
66
+  font-size: 2.6em;
67
+  margin-bottom: 0.6667em;
68
+}
69
+h2, section h1 {
70
+  font-size: 1.8em;
71
+  margin-bottom: 0.6667em;
72
+}
73
+h3, section h2, section section h1 {
74
+  font-size: 1.6em;
75
+  margin-bottom: 0.875em;
76
+}
77
+h4, section h3, section section h2, section section section h1 {
78
+  font-size: 1.3em;
79
+  margin-bottom: 0.875em;
80
+}
81
+h5, section h4, section section h3 {
82
+  font-size: 1.1em;
83
+  margin-bottom: 0.75em;
84
+}
85
+h6, section h5, section section h4, section section section h3 {
86
+  font-size: 1em;
87
+  margin-bottom: 0.5em;
88
+}
89
+p, blockquote, ul, ol { margin-bottom: 1.5em; }
90
+
91
+ul{ list-style-type: disc; }
92
+
93
+ol{ list-style-type: decimal; ol { list-style-type: lower-alpha; } }
94
+ul ul, ol ol { margin-left: 1.75em; }
95
+
96
+li { margin-bottom: .5em; }
97
+
98
+strong { font-weight: bold; }
99
+
100
+em { font-style: italic; }
101
+
102
+sup, sub { font-size: 0.8em; position: relative;  display: inline-block; }
103
+sup { top: -.5em; }
104
+sub { bottom: -.5em; }
105
+
106
+q { font-style: italic;
107
+  &:before { content: "\201C"; }
108
+  &:after { content: "\201D"; }
109
+}
110
+
111
+em, dfn { font-style: italic; }
112
+
113
+strong, dfn { font-weight: bold; }
114
+
115
+del, s { text-decoration: line-through; }
116
+
117
+abbr, acronym { border-bottom: 1px dotted; cursor: help; }
118
+
119
+pre, code, tt { @extend .mono-font; }
120
+
121
+sub, sup { line-height: 0; }
122
+
123
+hr { margin-bottom: 0.2em; }
124
+
125
+small { font-size: .8em; }
126
+
127
+big { font-size: 1.2em; }
128
+
129
+blockquote {
130
+  $bq-margin: 2em;
131
+  font-style: italic;
132
+  position: relative;
133
+  margin-left: $bq-margin;
134
+  > p {
135
+    &:first-child:before {
136
+      content: "\201C";
137
+      position: absolute;
138
+      top: 0.1em;
139
+      left: -.7em;
140
+      font-size: 3em;
141
+      color: $blockquote;
142
+    }
143
+    &:last-child:after {
144
+      content: "\201D";
145
+      position: relative;
146
+      top: 0.3em;
147
+      line-height: 0;
148
+      font-size: 2em;
149
+      color: $blockquote;
150
+    }
151
+  }
152
+  + p > cite {
153
+    margin-left: $bq-margin;
154
+    text-align: right;
155
+    &:before { content: '– '; color: $type-color-light; }
156
+    a { font-style: italic; }
157
+  }
158
+}
0 159
new file mode 100644
... ...
@@ -0,0 +1,23 @@
0
+article {
1
+  h2 {
2
+    padding-top: 0;
3
+    margin-bottom: 0.1em; }
4
+  .title {
5
+    text-decoration: none;
6
+    &:hover {
7
+      text-decoration: underline; } }
8
+  .entry {
9
+    border-bottom: 1px solid $article-border;
10
+    &:first-child {
11
+      padding-top: 0; } }
12
+  #disqus_thread { }
13
+  .meta {
14
+    border-bottom: 1px dashed #dddddd;
15
+    text-transform: uppercase;
16
+    color: #777777;
17
+    padding: 8px 0 5px;
18
+    margin-bottom: 1.5em;
19
+    font-size: 75%;
20
+    letter-spacing: 1px; }
21
+  .footer {
22
+    padding-top: 15px; } }
0 23
new file mode 100644
... ...
@@ -0,0 +1,11 @@
0
+footer {
1
+  @include background(linear-gradient(darken($body-bg, 5), $body-bg));
2
+  //color: $footer-color;
3
+  //border-top: 10px solid $footer-bg;
4
+  padding: 15px 0;
5
+  position: relative;
6
+  z-index: 2;
7
+  a {
8
+    color: #dddddd;
9
+    &:hover {
10
+      color: white; } } }
0 11
new file mode 100644
... ...
@@ -0,0 +1,11 @@
0
+body > header {
1
+  background-color: $header_bg;
2
+  border-bottom: 1px solid $header_border;
3
+  padding: 25px 0;
4
+  h1 {
5
+    display: inline-block;
6
+    margin: 0;
7
+    a, a:visited {
8
+      font-weight: normal;
9
+      color: $title_color;
10
+      text-decoration: none; } } }
0 11
new file mode 100644
... ...
@@ -0,0 +1,30 @@
0
+#nav {
1
+  @extend .group;
2
+  position: relative;
3
+  z-index: 1;
4
+  background-color: $nav-bg;
5
+  @include background-image(linear-gradient(#fcfcfc, #f4f4f4 0.3, #dddddd));
6
+  border: {
7
+    top: 1px solid $nav-border-top;
8
+    bottom: 1px solid $nav-border-bottom; };
9
+  ul {
10
+    position: relative;
11
+    @include horizontal-list;
12
+    margin: 0 auto;
13
+    padding: 6px 0;
14
+    li {
15
+      padding: 0 15px;
16
+      border-left: 1px solid $nav-border-left;
17
+      border-right: 1px solid $nav-border-right;
18
+      &:first-child {
19
+        border-left: none;
20
+        padding-left: 0; }
21
+      &:last-child {
22
+        border-right: 0; }
23
+      a {
24
+        display: inline-block;
25
+        color: $nav-color;
26
+        line-height: 150%;
27
+        text-decoration: none;
28
+        &:hover {
29
+          color: $nav-color-hover; } } } } }
0 30
new file mode 100644
... ...
@@ -0,0 +1,8 @@
0
+body {
1
+  background-color: $sidebar_bg;
2
+}
3
+
4
+#page > div {
5
+  background-color: $main_bg; border-right: 1px solid $sidebar_border;
6
+  @include box-shadow(rgba(#000, .1) 0 0 18px);
7
+}
0 8
new file mode 100644
... ...
@@ -0,0 +1,19 @@
0
+#search {
1
+  position: absolute;
2
+  top: 30%;
3
+  form {
4
+    background: image-url("search_bg.png") no-repeat;
5
+    padding: 0;
6
+    height: 28px;
7
+    width: 218px; }
8
+  #q {
9
+    background: none;
10
+    position: relative;
11
+    top: 1px;
12
+    width: 160px;
13
+    margin-left: 30px;
14
+    font-size: 15px;
15
+    border: none;
16
+    color: #aaaaaa;
17
+    &:focus {
18
+      outline: none; } } }
0 19
new file mode 100644
... ...
@@ -0,0 +1,12 @@
0
+#collapser {
1
+  display: block;
2
+  cursor: pointer;
3
+  background: #f8f8f8;
4
+  color: #888888;
5
+  padding: 5px 10px;
6
+  font-size: 10px;
7
+  line-height: 150%;
8
+  cursor: pointer;
9
+  position: absolute;
10
+  top: 0;
11
+  right: 0; }
0 12
new file mode 100644
... ...
@@ -0,0 +1,38 @@
0
+.subscribe a {
1
+  display: inline-block;
2
+  padding-left: 28px;
3
+  background: image-url("rss.png") left top no-repeat; }
4
+#sidebar {
5
+  line-height: 1.45em;
6
+  font-size: 90%;
7
+  h3 {
8
+    margin: 20px -15px 10px;
9
+    padding: 12px 15px;
10
+    background: white;
11
+    border-bottom: 1px solid #e5e5e5;
12
+    border-top: 1px solid #e5e5e5;
13
+    &:first-child {
14
+      margin-top: 0; } } }
15
+
16
+#twitter, #delicious {
17
+  @include border-radius;
18
+  background: #f8f8f8;
19
+  border: 1px solid #eeeeee;
20
+  padding: 5px 0;
21
+  ul {
22
+    list-style-type: none;
23
+    margin: 0; }
24
+  li {
25
+    margin: 0 15px;
26
+    padding: 10px 0 0;
27
+    border-bottom: #dddddd 1px dashed;
28
+    &:last-child {
29
+      border-bottom: 0; } } }
30
+
31
+#delicious {
32
+  p {
33
+    font-style: italic; }
34
+  li {
35
+    color: #666666;
36
+    font-style: normal;
37
+    padding-bottom: 8px; } }
0 38
new file mode 100644
... ...
@@ -0,0 +1,279 @@
0
+.code_window {
1
+  @include border-top-radius(5px);
2
+  @include border-bottom-radius(2px);
3
+  background: #aaaaaa image-url("code_bg.png") top repeat-x;
4
+  position: relative;
5
+  margin: 0.3em 0 1.3em;
6
+  padding: 0 3px 3px;
7
+  font-size: 14px;
8
+  border: 1px solid #898989;
9
+  border-top-color: #cbcbcb;
10
+  border-left-color: #a5a5a5;
11
+  border-right-color: #a5a5a5;
12
+  em {
13
+    text-align: center;
14
+    text-shadow: #cccccc 1px 1px 1px;
15
+    display: block;
16
+    padding: 1px 0;
17
+    color: #333333;
18
+    font-style: normal; }
19
+  .highlight {
20
+    margin: 0; } }
21
+
22
+pre {
23
+  color: #cccccc;
24
+  font-size: 13px;
25
+  background: #222222;
26
+  line-height: 1.5em;
27
+  border: #aaaaaa 1px solid;
28
+  overflow-x: auto;
29
+  overflow-y: hidden;
30
+  padding: 25px 20px;
31
+  .lineno {
32
+    color: #888888;
33
+    background: #e3e3e3;
34
+    display: inline-block;
35
+    padding: 0 0 0 10px;
36
+    &:first-child {
37
+      padding-top: 15px;
38
+      display: inline-block; } } }
39
+
40
+.highlight {
41
+  position: relative;
42
+  .pre_expander {
43
+    font-size: 10px;
44
+    text-align: right;
45
+    padding: 4px 8px;
46
+    line-height: 150%;
47
+    position: absolute;
48
+    cursor: pointer;
49
+    top: 2px;
50
+    right: 2px;
51
+    @include border-bottom-left-radius;
52
+    display: block;
53
+    color: #777777;
54
+    background: #333333;
55
+    &:hover {
56
+      background: #444444;
57
+      color: #cccccc; } } }
58
+
59
+// based on: http://github.com/mojombo/tpw/raw/master/css/syntax.css
60
+.editor {
61
+  background: rgb(0, 22, 41);
62
+  line-height: 1.25; }
63
+
64
+pre.console {
65
+  background-color: black;
66
+  color: lighten(green, 25);
67
+  letter-spacing: 1px;
68
+  padding: 0.5em;
69
+  .prompt {
70
+    color: lighten(navy, 50);
71
+    &:before {
72
+      color: white;
73
+      content: "["; }
74
+    &:after {
75
+      color: white;
76
+      content: "]"; } }
77
+  .stdin {
78
+    font-weight: bold;
79
+    color: lighten(green, 75); } }
80
+
81
+.highlight {
82
+  padding: 0 0 0.1em;
83
+  color: white;
84
+  // Comment
85
+  .c {
86
+    color: #999988;
87
+    font-style: italic; }
88
+  // Error
89
+  .err {
90
+    color: #a61717;
91
+    background-color: #e3d2d2; }
92
+  // Name
93
+  .n {
94
+    color: white; }
95
+  // Keyword
96
+  .k {
97
+    color: rgb(255, 157, 0); }
98
+  // Paren
99
+  .p {
100
+    color: darken(#ff9d00, 33); }
101
+  // Operator
102
+  .o {
103
+    color: rgb(255, 157, 0); }
104
+  // Comment.Multiline
105
+  .cm {
106
+    color: #999988;
107
+    font-style: italic; }
108
+  // Comment.Preproc
109
+  .cp {
110
+    color: #999999; }
111
+  // Comment.Single
112
+  .c1 {
113
+    color: #999988;
114
+    font-style: italic; }
115
+  // Comment.Special
116
+  .cs {
117
+    color: #999999;
118
+    font-style: italic; }
119
+  // Generic.Deleted
120
+  .gd {
121
+    color: black;
122
+    background-color: #ffdddd; }
123
+  // Generic.Deleted.Specific
124
+  .gd .x {
125
+    color: black;
126
+    background-color: #ffaaaa; }
127
+  // Generic.Emph
128
+  .ge {
129
+    font-style: italic; }
130
+  // Generic.Error
131
+  .gr {
132
+    color: #aa0000; }
133
+  // Generic.Heading
134
+  .gh {
135
+    color: #999999; }
136
+  // Generic.Inserted
137
+  .gi {
138
+    color: black;
139
+    background-color: #ddffdd; }
140
+  // Generic.Inserted.Specific
141
+  .gi .x {
142
+    color: black;
143
+    background-color: #aaffaa; }
144
+  // Generic.Output
145
+  .go {
146
+    color: #888888; }
147
+  // Generic.Prompt
148
+  .gp {
149
+    color: #555555; }
150
+  // Generic.Strong
151
+  .gs {
152
+    color: white; }
153
+  // Generic.Subheading
154
+  .gu {
155
+    color: #aaaaaa; }
156
+  // Generic.Traceback
157
+  .gt {
158
+    color: #aa0000; }
159
+  // Keyword.Constant
160
+  .kc {
161
+    color: white; }
162
+  // Keyword.Declaration
163
+  .kd {
164
+    color: white; }
165
+  // Keyword.Pseudo
166
+  .kp {
167
+    color: white; }
168
+  // Keyword.Reserved
169
+  .kr {
170
+    color: white; }
171
+  // Keyword.Type
172
+  .kt {
173
+    color: #445588; }
174
+  // Literal.Number
175
+  .m {
176
+    color: rgb(255, 98, 140); }
177
+  // Literal.String
178
+  .s {
179
+    color: #dd1144; }
180
+  // Name.Attribute
181
+  .na {
182
+    color: teal; }
183
+  // Name.Builtin
184
+  .nb {
185
+    color: darken(rgb(128, 255, 187), 20); }
186
+  // Name.Class
187
+  .nc {
188
+    color: darken(rgb(128, 255, 187), 20); }
189
+  // Name.Constant
190
+  .no {
191
+    color: rgb(128, 255, 187); }
192
+  // Name.Entity
193
+  .ni {
194
+    color: purple; }
195
+  // Name.Exception
196
+  .ne {
197
+    color: rgb(255, 221, 0); }
198
+  // Name.Function
199
+  .nf {
200
+    color: rgb(255, 221, 0); }
201
+  // Name.Namespace
202
+  .nn {
203
+    color: #555555; }
204
+  // Name.Tag
205
+  .nt {
206
+    color: white; }
207
+  // Name.Variable
208
+  .nv {
209
+    color: teal; }
210
+  // Operator.Word
211
+  .ow {
212
+    color: white; }
213
+  // Text.Whitespace
214
+  .w {
215
+    color: #bbbbbb; }
216
+  // Literal.Number
217
+  .nl {
218
+    color: rgb(255, 98, 140); }
219
+  // Literal.Number.Float
220
+  .mf {
221
+    color: rgb(255, 98, 140); }
222
+  // Literal.Number.Hex
223
+  .mh {
224
+    color: rgb(255, 98, 140); }
225
+  // Literal.Number.Integer
226
+  .mi {
227
+    color: rgb(255, 98, 140); }
228
+  // Literal.Number.Oct
229
+  .mo {
230
+    color: rgb(255, 98, 140); }
231
+  // Literal.String.Backtick
232
+  .sb {
233
+    color: rgb(58, 217, 0); }
234
+  // Literal.String.Char
235
+  .sc {
236
+    color: rgb(58, 217, 0); }
237
+  // Literal.String.Doc
238
+  .sd {
239
+    color: rgb(58, 217, 0); }
240
+  // Literal.String.Double
241
+  .s2 {
242
+    color: rgb(58, 217, 0); }
243
+  // Literal.String.Escape
244
+  .se {
245
+    color: rgb(58, 217, 0); }
246
+  // Literal.String.Heredoc
247
+  .sh {
248
+    color: rgb(58, 217, 0); }
249
+  // Literal.String.Interpol
250
+  .si {
251
+    color: rgb(158, 255, 128); }
252
+  // Literal.String.Other
253
+  .sx {
254
+    color: rgb(58, 217, 0); }
255
+  // Literal.String.Regex
256
+  .sr {
257
+    color: #009926; }
258
+  // Literal.String.Single
259
+  .s1 {
260
+    color: rgb(58, 217, 0); }
261
+  // Literal.String.Symbol
262
+  .ss {
263
+    color: rgb(255, 98, 140); }
264
+  // Name.Builtin.Pseudo
265
+  .bp {
266
+    color: #999999; }
267
+  // Name.Variable.Class
268
+  .vc {
269
+    color: teal; }
270
+  // Name.Variable.Global
271
+  .vg {
272
+    color: teal; }
273
+  // Name.Variable.Instance
274
+  .vi {
275
+    color: teal; }
276
+  // Literal.Number.Integer.Long
277
+  .il {
278
+    color: rgb(255, 98, 140); } }
0 279
new file mode 100644
... ...
@@ -0,0 +1,15 @@
0
+#twitter {
1
+  p {
2
+    padding-bottom: 10px;
3
+    a.topic {
4
+      color: $twitter_topic; } }
5
+  .meta {
6
+    color: $light_text;
7
+    font-size: 80%;
8
+    display: block;
9
+    padding: 8px 0 0;
10
+    a {
11
+      color: inherit;
12
+      text-decoration: none;
13
+      &:hover {
14
+        text-decoration: underline; } } } }
0 15
deleted file mode 100644
... ...
@@ -1,3 +0,0 @@
1
-//compass default reset
2
-+global-reset
3
-@import compass
4 1
\ No newline at end of file
5 2
deleted file mode 100644
... ...
@@ -1,51 +0,0 @@
1
-$page_pad: 30px
2
-$page_width: 980px
3
-$sidebar_margin: 20px
4
-$sidebar_width: 280px
5
-$default_border_radius: 4px
6
-
7
-html body
8
-  background-color: $body_bg
9
-  color: $body_color
10
-  a
11
-    color: $link_color
12
-    &:hover, &:focus
13
-      color: saturate(darken($link_color, 15), 20)
14
-    &:visited
15
-      color: darken(adjust_hue($link_color, 70), 10)
16
-
17
-#header, #footer, #nav
18
-  .content
19
-    position: relative
20
-    margin: 0 auto
21
-    width: $page_width - $page_pad
22
-    padding: 0 $page_pad/2
23
-
24
-#page, #header, #footer, #nav
25
-  min-width: $page_width
26
-#page, #content, .content
27
-  +pie-clearfix
28
-#content
29
-  margin: 0 auto
30
-  width: $page_width - $sidebar_width - $page_pad/2
31
-  padding: 0 $sidebar_width 0 $page_pad/2
32
-#main
33
-  float: left
34
-  width: 100%
35
-  .content
36
-    padding-right: $sidebar_margin
37
-
38
-#sidebar
39
-  float: left
40
-  width: $sidebar_width - $sidebar_margin
41
-  margin: 0 -100% 0 0
42
-  padding: $page_pad 0 $page_pad $sidebar_margin
43
-
44
-#page.expanded
45
-  #content
46
-    width: $page_width - $page_pad/2
47
-    padding: 0 0 0 $page_pad/2
48
-  #sidebar
49
-    float: none
50
-    margin: 0
51
-    padding: 0 0 $page_pad
52 1
\ No newline at end of file
53 2
deleted file mode 100644
... ...
@@ -1,7 +0,0 @@
1
-@import compass/utilities
2
-@import compass/css3
3
-        
4
-@import library/reset
5
-@import library/list_borders
6
-@import library/typography
7
-@import library/link_colors
8 1
\ No newline at end of file
9 2
deleted file mode 100644
... ...
@@ -1,13 +0,0 @@
1
-@import partials/shared
2
-@import partials/syntax
3
-@import partials/search
4
-@import partials/sidebar
5
-@import partials/twitter
6
-
7
-/* layout partials */
8
-@import partials/header
9
-@import partials/navigation
10
-@import partials/page
11
-@import partials/sidebar
12
-@import partials/blog
13
-@import partials/footer
14 1
\ No newline at end of file
15 2
deleted file mode 100644
... ...
@@ -1,47 +0,0 @@
1
-// Link Colors
2
-$link_color: lighten(#165B94, .30)
3
-
4
-// Main Section Colors
5
-$body_color: #333
6
-$light_text: #999
7
-$body_bg: #323232
8
-
9
-$header_bg: #323232
10
-$header_border: #181818
11
-$title_color: #ddd
12
-
13
-$nav_color: #555
14
-$nav_color_hover: #000
15
-$nav_bg: #e8e8e8
16
-$nav_border_top: #fff
17
-$nav_border_bottom: #aaa
18
-$nav_border_left: #ccc
19
-$nav_border_right: #fff
20
-
21
-$page_border_sides: #ccc
22
-$page_bg: #f0f0f0
23
-$sidebar_bg: #fcfcfc
24
-$sidebar_border: #eee
25
-
26
-// Blog 
27
-$article_border: #eee
28
-$main_bg: #fff
29
-
30
-$footer_color: #999
31
-$footer_bg: #444
32
-
33
-// Form Colors
34
-$fieldset_bg: #ececec
35
-$fieldset_border: #c3c3c3
36
-
37
-$textinput_color: #333
38
-$textinput_bg: #f4f4f4
39
-$textinput_bg_focus: #fefeee
40
-
41
-$textinput_border_top: #aaa
42
-$textinput_border_bottom: #c6c6c6
43
-$textinput_border_left: #c3c3c3
44
-$textinput_border_right: #c3c3c3
45
-$textinput_border_focus: #989898
46
-
47
-$twitter_topic: #888
48 1
\ No newline at end of file
49 2
deleted file mode 100644
... ...
@@ -1,45 +0,0 @@
1
-$base_font_size: 16px
2
-$base_font_size_small: 13px
3
-$base_font_color: #333
4
-$default_border_radius: 6px
5
-
6
-+general-typography
7
-=heading-font
8
-  +serif-font
9
-=quote-font
10
-  +serif-font
11
-
12
-body
13
-  font-size: $base_font_size
14
-  +serif-font
15
-  
16
-h1,h2,h3,h4,h5,h6
17
-  color: #333
18
-  font-weight: bold
19
-  +heading-font
20
-
21
-h1,h2,h3,h4
22
-  letter-spacing: -1px
23
-
24
-blockquote
25
-  +quote-font
26
-  font-style: italic
27
-  color: #555
28
-  background: #f8f8f8
29
-  border:
30
-    top: 1px solid #e5e5e5
31
-    bottom: 1px solid #e5e5e5
32
-  &:before
33
-    color: #ddd
34
-  cite
35
-    +sans-font
36
-    font-size: $base_font_size - 2px
37
-    display: block
38
-    padding-top: $base_font_size
39
-    &:before
40
-      content: "\30FC"
41
-      padding-right: 2px
42
-    a
43
-      color: inherit !important
44
-      &:hover
45
-        color: $link_color !important
46 1
\ No newline at end of file
47 2
deleted file mode 100644
48 3
deleted file mode 100644
... ...
@@ -1,16 +0,0 @@
1
-// based on compass float
2
-
3
-@import modules/_clearfix.sass
4
-
5
-// Available as alternate syntax with just +float
6
-=float($side: "left")
7
-  display: inline
8
-  float: !side
9
-
10
-// Implementation of float:left with fix for double-margin bug
11
-=float-left
12
-  +float("left")
13
-
14
-// Implementation of float:right with fix for double-margin bug
15
-=float-right
16
-  +float("right")
17 1
\ No newline at end of file
18 2
deleted file mode 100644
... ...
@@ -1,24 +0,0 @@
1
-$default_link_color:           #165B94  !default
2
-$default_link_color_hover:     #fff     !default
3
-$default_link_color_alt:       #91D5F1  !default
4
-$default_link_color_hover_alt: #000     !default
5
-
6
-=link-color($hover: true)
7
-  +link-color-style($default_link_color, $default_link_color_hover, $default_link_color, $hover)
8
-
9
-=link-color-alt($hover: true)
10
-  +link-color-style($default_link_color_alt, $default_link_color_hover_alt, $default_link_color_alt, $hover)
11
-  
12
-=link-color-heading($link_color: "inherit", $hover_bg_color: #ccc)
13
-  +link-color-style($link_color)
14
-
15
-=link-color-style($color: $default_link_color, $color_hover: $default_link_color_hover, $link_hover_bg: $color, $hover: true)
16
-  color: $color
17
-  padding: 2px
18
-  margin: 0 -2px
19
-  +border-radius(3px)
20
-  @if $hover
21
-    &:hover
22
-      background-color: $link_hover_bg
23
-      color: $color_hover
24
-      text-decoration: none
25 1
\ No newline at end of file
26 2
deleted file mode 100644
... ...
@@ -1,7 +0,0 @@
1
-=list-borders($color1, $color2)
2
-  border-left: 1px solid $color1
3
-  border-right: 1px solid $color2
4
-  &.alpha
5
-    border-left: none
6
-  &.omega
7
-    border-right: 0
8 1
\ No newline at end of file
9 2
deleted file mode 100644
... ...
@@ -1,58 +0,0 @@
1
-// Borrowed from the blueprint reset
2
-
3
-// Global reset rules.
4
-// For more specific resets, use the reset mixins provided below
5
-=global-reset
6
-  html, body
7
-    +reset
8
-  +nested-reset
9
-
10
-// Reset all elements within some selector scope.To reset the selector itself,
11
-// mixin the appropriate reset mixin for that element type as well. This could be
12
-// useful if you want to style a part of your page in a dramatically different way.
13
-=nested-reset
14
-  div, span, object, iframe, h1, h2, h3, h4, h5, h6, p,
15
-  pre, a, abbr, acronym, address, code, del, dfn, em, img,
16
-  dl, dt, dd, ol, ul, li, fieldset, form, label, legend, caption, tbody, tfoot, thead, tr
17
-    +reset
18
-  blockquote, q
19
-    +reset-quotation
20
-  th, td, caption
21
-    +reset-table-cell
22
-  table
23
-    +reset-table
24
-  a img
25
-    border: none
26
-
27
-=reset-box-model
28
-  margin: 0
29
-  padding: 0
30
-  border: 0
31
-
32
-=reset
33
-  +reset-box-model
34
-  font:
35
-    weight: inherit
36
-    style: inherit
37
-    size: 100%
38
-    family: inherit
39
-  vertical-align: baseline
40
-
41
-=reset-quotation
42
-  +reset
43
-  quotes: "" ""
44
-  &:before,
45
-  &:after
46
-    content: ""
47
-
48
-=reset-table-cell
49
-  +reset
50
-  text-align: left
51
-  font-weight: normal
52
-  vertical-align: middle
53
-
54
-=reset-table
55
-  +reset
56
-  border-collapse: separate
57
-  border-spacing: 0
58
-  vertical-align: middle
59 1
deleted file mode 100644
... ...
@@ -1,171 +0,0 @@
1
-$base-font-size: 16px !default
2
-$small: floor($base-font-size * 0.85) !default
3
-$big: floor($base-font-size * 1.25) !default
4
-$base-font-color: #333333 !default
5
-$h6: ceil($base-font-size * 1)
6
-$h5: ceil($base-font-size * 1)
7
-$h4: ceil($base-font-size * 1.2)
8
-$h3: ceil($base-font-size * 1.8)
9
-$h2: ceil($base-font-size * 2.8)
10
-$h1: ceil($base-font-size * 3.2)
11
-
12
-=heading-font
13
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif
14
-
15
-=sans-font
16
-  font-family: "Lucida Grande", "Lucida Sans Unicode", "Trebuchet MS", Helvetica, Arial, Verdana, sans-serif
17
-
18
-=serif-font
19
-  font-family: Georgia, Times, "Times New Roman", serif
20
-
21
-=fixed-font
22
-  font-family: "Menlo", "Bitstream Vera Sans", Monaco, "Andale Mono", "Lucida Console", monospace
23
-
24
-=mono-font
25
-  +fixed-font
26
-
27
-=general-typography($font-size: $base-font-size)
28
-  +set-heading-sizes($font-size)
29
-  +typography-defaults($font-size)
30
-
31
-=set-heading-sizes($font-size: $base-font-size)
32
-  $h6: ceil($font-size * 1)
33
-  $h5: ceil($font-size * 1)
34
-  $h4: ceil($font-size * 1.2)
35
-  $h3: ceil($font-size * 1.8)
36
-  $h2: ceil($font-size * 2.8)
37
-  $h1: ceil($font-size * 3.2)
38
-  h1, h2, h3, h4
39
-    &:first-child
40
-      margin-top: 0
41
-  h1,h2,h3,h4,h5,h6
42
-    line-height: 1.1em
43
-    margin-bottom: 0.7em
44
-    margin-top: 0.3em
45
-  h1
46
-    font-size: $h1
47
-  h2
48
-    font-size: $h2
49
-  h3
50
-    font-size: $h3
51
-  h4
52
-    font-size: $h4
53
-  h5
54
-    font-size: $h5
55
-  h6
56
-    font-size: $h6
57
-
58
-=typography-defaults($font-size: $base-font-size)
59
-  body
60
-    line-height: 1.45em
61
-    color: $base-font-color
62
-  p
63
-    +p-style($font-size)
64
-  table
65
-    +table-style($font-size)
66
-  ol
67
-    +ol-style($font-size)
68
-  ul
69
-    +ul-style($font-size)
70
-  dl
71
-    +dl-style($font-size)
72
-  blockquote
73
-    +quote-style
74
-  q
75
-    font-style: italic
76
-    &:before
77
-      content: "\201C"
78
-    &:after
79
-      content: "\201D"
80
-  em, dfn
81
-    font-style: italic
82
-  strong, dfn
83
-    font-weight: bold
84
-  del
85
-    text-decoration: line-through
86
-  span.highlight, em.highlight, strong.highlight
87
-    background-color: #ffff66
88
-    padding: 2px
89
-    margin: 0 -2px
90
-  abbr, acronym
91
-    border-bottom: 1px dotted
92
-    cursor: help
93
-  address
94
-    margin-top: $font-size * 1.625
95
-    font-style: italic
96
-  pre, code, tt
97
-    +fixed-font
98
-    line-height: $font-size * 1.5
99
-  tt
100
-    display: block
101
-    margin: $font-size * 1.625 0
102
-  sub, sup
103
-    line-height: 0
104
-  hr
105
-    margin-bottom: 0.2em
106
-  small, .small
107
-    font-size: floor($font-size * 0.85)
108
-  big, .big
109
-    font-size: floor($font-size * 1.25)
110
-
111
-=ol-style($font-size: $base-font-size)
112
-  list-style: inside decimal
113
-  margin: 0 0 $font-size * 1.625
114
-  li ol
115
-    margin: 0 0 $font-size * 1.625
116
-
117
-=ul-style($font-size: $base-font-size)
118
-  list-style: inside
119
-  margin: 0 0 $font-size * 1.625
120
-  li ul
121
-    margin: 0 0 $font-size * 1.625
122
-
123
-=dl-style($font-size: $base-font-size)
124
-  margin: 0 0 $font-size * 1.625
125
-  dt
126
-    font-weight: bold
127
-  dd
128
-    margin-left: $font-size * 1.625
129
-
130
-=quote-style($font-size: $base-font-size)
131
-  padding: $font-size * 1.5 $font-size * 1.5 $font-size * 1.5 $font-size * 1.8
132
-  position: relative
133
-  margin-bottom: $font-size * 0.813
134
-  &:before
135
-    content: "\201C"
136
-    font-size: $font-size * 3
137
-    margin: 5px 0 0 -0.525em
138
-    position: absolute
139
-    font-family: Times, Georgia, serif
140
-    line-height: 0
141
-  > p
142
-    padding: 0
143
-    margin: 0
144
-
145
-=p-style($font-size: $base-font-size)
146
-  padding-bottom: 1.3em
147
-  img
148
-    float: left
149
-    margin:
150
-      top: $font-size * 0.5
151
-      right: $font-size * 0.813
152
-      bottom: $font-size * 0.813
153
-      left: 0
154
-    padding: 0
155
-    &.right
156
-      margin:
157
-        right: 0
158
-        left: $font-size * 0.813
159
-
160
-=table-style($font-size: $base-font-size)
161
-  margin: 0 0 $font-size * 1.625
162
-  border-collapse: collapse
163
-  th
164
-    font-weight: bold
165
-  tr, th, td
166
-    margin: 0
167
-    padding: 0 $font-size * 1.625 0 $font-size
168
-  tfoot
169
-    font-style: italic
170
-  caption
171
-    text-align: center
172 1
deleted file mode 100644
... ...
@@ -1,26 +0,0 @@
1
-.blog
2
-  h2
3
-    padding-top: 0
4
-    margin-bottom: 0.1em
5
-  .title
6
-    text-decoration: none
7
-    &:hover
8
-      text-decoration: underline
9
-  .article
10
-    padding: $base-font-size * 1.5 0 $base-font-size * 1.5
11
-    border-bottom: 1px solid $article-border
12
-    &:first-child
13
-      padding-top: 0
14
-  #disqus_thread
15
-    padding-top: $base-font-size
16
-  .meta
17
-    +sans-font
18
-    border-bottom: 1px dashed #dddddd
19
-    text-transform: uppercase
20
-    color: #777777
21
-    padding: 8px 0 5px
22
-    margin-bottom: 1.5em
23
-    font-size: 75%
24
-    letter-spacing: 1px
25
-  .footer
26
-    padding-top: 15px
27 1
deleted file mode 100644
... ...
@@ -1,12 +0,0 @@
1
-#footer
2
-  +linear-gradient(color-stops(darken($body-bg, 5), $body-bg))
3
-  font-size: $base-font-size-small
4
-  color: $footer-color
5
-  border-top: 10px solid $footer-bg
6
-  padding: 15px 0
7
-  position: relative
8
-  z-index: 2
9
-  a
10
-    color: #dddddd
11
-    &:hover
12
-      color: white
13 1
deleted file mode 100644
... ...
@@ -1,11 +0,0 @@
1
-#header
2
-  background-color: $header_bg
3
-  border-bottom: 1px solid $header_border
4
-  padding: 25px 0
5
-  h1
6
-    display: inline-block
7
-    margin: 0
8
-    a.title
9
-      font-weight: normal
10
-      color: $title_color
11
-      text-decoration: none
12 1
\ No newline at end of file
13 2
deleted file mode 100644
... ...
@@ -1,38 +0,0 @@
1
-#nav
2
-  +clearfix
3
-  position: relative
4
-  z-index: 1
5
-  background-color: $nav-bg
6
-  +linear-gradient(color-stops(#fcfcfc, #f4f4f4 0.3, #dddddd))
7
-  border:
8
-    top: 1px solid $nav-border-top
9
-    bottom: 1px solid $nav-border-bottom
10
-  ul
11
-    position: relative
12
-    +horizontal-list
13
-    margin: 0 auto
14
-    padding: 6px 0
15
-    li
16
-      padding: 0 15px
17
-      border-left: 1px solid $nav-border-left
18
-      border-right: 1px solid $nav-border-right
19
-      &.alpha
20
-        border-left: none
21
-        padding-left: 0
22
-      &.omega
23
-        border-right: 0
24
-      &.subscribe
25
-        position: absolute
26
-        left: $page-width - $sidebar-width - $sidebar-margin / 2
27
-        border: none
28
-        a
29
-          display: inline-block
30
-          padding-left: 28px
31
-          background: image-url("rss.png") left top no-repeat
32
-      a
33
-        display: inline-block
34
-        color: $nav-color
35
-        line-height: 150%
36
-        text-decoration: none
37
-        &:hover
38
-          color: $nav-color-hover
39 1
deleted file mode 100644
... ...
@@ -1,8 +0,0 @@
1
-#page
2
-  background-color: $main_bg
3
-#main
4
-  background-color: $main_bg
5
-  border-right: 1px solid $sidebar_border
6
-  padding:
7
-    top: 25px
8
-    bottom: 25px
9 1
\ No newline at end of file
10 2
deleted file mode 100644
... ...
@@ -1,20 +0,0 @@
1
-#search
2
-  position: absolute
3
-  left: $page-width + $sidebar-margin - $sidebar-width
4
-  top: 30%
5
-  form
6
-    background: image-url("search_bg.png") no-repeat
7
-    padding: 0
8
-    height: 28px
9
-    width: 218px
10
-  #q
11
-    background: none
12
-    position: relative
13
-    top: 1px
14
-    width: 160px
15
-    margin-left: 30px
16
-    font-size: 15px
17
-    border: none
18
-    color: #aaaaaa
19
-    &:focus
20
-      outline: none
21 1
deleted file mode 100644
... ...
@@ -1,13 +0,0 @@
1
-#collapser
2
-  +sans-font
3
-  display: block
4
-  cursor: pointer
5
-  background: #f8f8f8
6
-  color: #888
7
-  padding: 5px 10px
8
-  font-size: 10px
9
-  line-height: 150%
10
-  cursor: pointer
11
-  position: absolute
12
-  top: 0
13
-  right: 0
14 1
\ No newline at end of file
15 2
deleted file mode 100644
... ...
@@ -1,37 +0,0 @@
1
-#sidebar
2
-  line-height: 1.45em
3
-  font-size: 90%
4
-  h3
5
-    font-size: $h4 + 2
6
-    margin: 20px -15px 10px
7
-    padding: 12px 15px
8
-    background: white
9
-    border-bottom: 1px solid #e5e5e5
10
-    border-top: 1px solid #e5e5e5
11
-    &:first-child
12
-      margin-top: 0
13
-  h4
14
-    font-size: $h5
15
-
16
-#twitter, #delicious
17
-  +border-radius
18
-  background: #f8f8f8
19
-  border: 1px solid #eeeeee
20
-  padding: 5px 0
21
-  ul
22
-    list-style-type: none
23
-    margin: 0
24
-  li
25
-    margin: 0 15px
26
-    padding: 10px 0 0
27
-    border-bottom: #dddddd 1px dashed
28
-    &:last-child
29
-      border-bottom: 0
30
-
31
-#delicious
32
-  p
33
-    font-style: italic
34
-  li
35
-    color: #666666
36
-    font-style: normal
37
-    padding-bottom: 8px
38 1
deleted file mode 100644
... ...
@@ -1,281 +0,0 @@
1
-.code_window
2
-  +border-top-radius(5px)
3
-  +border-bottom-radius(2px)
4
-  background: #aaaaaa image-url("code_bg.png") top repeat-x
5
-  position: relative
6
-  margin: 0.3em 0 1.3em
7
-  padding: 0 3px 3px
8
-  font-size: 14px
9
-  border: 1px solid #898989
10
-  border-top-color: #cbcbcb
11
-  border-left-color: #a5a5a5
12
-  border-right-color: #a5a5a5
13
-  em
14
-    text-align: center
15
-    +text-shadow(#cccccc, 1px, 1px, 1px)
16
-    display: block
17
-    padding: 1px 0
18
-    color: #333333
19
-    font-style: normal
20
-    +sans-font
21
-  .highlight
22
-    margin: 0
23
-
24
-pre
25
-  color: #cccccc
26
-  font-size: 13px
27
-  background: #222222
28
-  line-height: 1.5em
29
-  border: #aaaaaa 1px solid
30
-  overflow-x: auto
31
-  overflow-y: hidden
32
-  padding: 25px 20px
33
-  .lineno
34
-    color: #888888
35
-    background: #e3e3e3
36
-    display: inline-block
37
-    padding: 0 0 0 10px
38
-    &:first-child
39
-      padding-top: 15px
40
-      display: inline-block
41
-
42
-.highlight
43
-  position: relative
44
-  .pre_expander
45
-    +mono-font
46
-    font-size: 10px
47
-    text-align: right
48
-    padding: 4px 8px
49
-    line-height: 150%
50
-    position: absolute
51
-    cursor: pointer
52
-    top: 2px
53
-    right: 2px
54
-    +border-bottom-left-radius
55
-    display: block
56
-    color: #777777
57
-    background: #333333
58
-    &:hover
59
-      background: #444444
60
-      color: #cccccc
61
-
62
-// based on: http://github.com/mojombo/tpw/raw/master/css/syntax.css
63
-.editor
64
-  background: rgb(0, 22, 41)
65
-  line-height: 1.25
66
-
67
-pre.console
68
-  background-color: black
69
-  color: lighten(green, 25)
70
-  letter-spacing: 1px
71
-  padding: 0.5em
72
-  .prompt
73
-    color: lighten(navy, 50)
74
-    &:before
75
-      color: white
76
-      content: "["
77
-    &:after
78
-      color: white
79
-      content: "]"
80
-  .stdin
81
-    font-weight: bold
82
-    color: lighten(green, 75)
83
-
84
-.highlight
85
-  padding: 0 0 0.1em
86
-  color: white
87
-  // Comment
88
-  .c
89
-    color: #999988
90
-    font-style: italic
91
-  // Error
92
-  .err
93
-    color: #a61717
94
-    background-color: #e3d2d2
95
-  // Name
96
-  .n
97
-    color: white
98
-  // Keyword
99
-  .k
100
-    color: rgb(255, 157, 0)
101
-  // Paren
102
-  .p
103
-    color: darken(#ff9d00, 33)
104
-  // Operator
105
-  .o
106
-    color: rgb(255, 157, 0)
107
-  // Comment.Multiline
108
-  .cm
109
-    color: #999988
110
-    font-style: italic
111
-  // Comment.Preproc
112
-  .cp
113
-    color: #999999
114
-  // Comment.Single
115
-  .c1
116
-    color: #999988
117
-    font-style: italic
118
-  // Comment.Special
119
-  .cs
120
-    color: #999999
121
-    font-style: italic
122
-  // Generic.Deleted
123
-  .gd
124
-    color: black
125
-    background-color: #ffdddd
126
-  // Generic.Deleted.Specific
127
-  .gd .x
128
-    color: black
129
-    background-color: #ffaaaa
130
-  // Generic.Emph
131
-  .ge
132
-    font-style: italic
133
-  // Generic.Error
134
-  .gr
135
-    color: #aa0000
136
-  // Generic.Heading
137
-  .gh
138
-    color: #999999
139
-  // Generic.Inserted
140
-  .gi
141
-    color: black
142
-    background-color: #ddffdd
143
-  // Generic.Inserted.Specific
144
-  .gi .x
145
-    color: black
146
-    background-color: #aaffaa
147
-  // Generic.Output
148
-  .go
149
-    color: #888888
150
-  // Generic.Prompt
151
-  .gp
152
-    color: #555555
153
-  // Generic.Strong
154
-  .gs
155
-    color: white
156
-  // Generic.Subheading
157
-  .gu
158
-    color: #aaaaaa
159
-  // Generic.Traceback
160
-  .gt
161
-    color: #aa0000
162
-  // Keyword.Constant
163
-  .kc
164
-    color: white
165
-  // Keyword.Declaration
166
-  .kd
167
-    color: white
168
-  // Keyword.Pseudo
169
-  .kp
170
-    color: white
171
-  // Keyword.Reserved
172
-  .kr
173
-    color: white
174
-  // Keyword.Type
175
-  .kt
176
-    color: #445588
177
-  // Literal.Number
178
-  .m
179
-    color: rgb(255, 98, 140)
180
-  // Literal.String
181
-  .s
182
-    color: #dd1144
183
-  // Name.Attribute
184
-  .na
185
-    color: teal
186
-  // Name.Builtin
187
-  .nb
188
-    color: darken(rgb(128, 255, 187), 20)
189
-  // Name.Class
190
-  .nc
191
-    color: darken(rgb(128, 255, 187), 20)
192
-  // Name.Constant
193
-  .no
194
-    color: rgb(128, 255, 187)
195
-  // Name.Entity
196
-  .ni
197
-    color: purple
198
-  // Name.Exception
199
-  .ne
200
-    color: rgb(255, 221, 0)
201
-  // Name.Function
202
-  .nf
203
-    color: rgb(255, 221, 0)
204
-  // Name.Namespace
205
-  .nn
206
-    color: #555555
207
-  // Name.Tag
208
-  .nt
209
-    color: white
210
-  // Name.Variable
211
-  .nv
212
-    color: teal
213
-  // Operator.Word
214
-  .ow
215
-    color: white
216
-  // Text.Whitespace
217
-  .w
218
-    color: #bbbbbb
219
-  // Literal.Number
220
-  .nl
221
-    color: rgb(255, 98, 140)
222
-  // Literal.Number.Float
223
-  .mf
224
-    color: rgb(255, 98, 140)
225
-  // Literal.Number.Hex
226
-  .mh
227
-    color: rgb(255, 98, 140)
228
-  // Literal.Number.Integer
229
-  .mi
230
-    color: rgb(255, 98, 140)
231
-  // Literal.Number.Oct
232
-  .mo
233
-    color: rgb(255, 98, 140)
234
-  // Literal.String.Backtick
235
-  .sb
236
-    color: rgb(58, 217, 0)
237
-  // Literal.String.Char
238
-  .sc
239
-    color: rgb(58, 217, 0)
240
-  // Literal.String.Doc
241
-  .sd
242
-    color: rgb(58, 217, 0)
243
-  // Literal.String.Double
244
-  .s2
245
-    color: rgb(58, 217, 0)
246
-  // Literal.String.Escape
247
-  .se
248
-    color: rgb(58, 217, 0)
249
-  // Literal.String.Heredoc
250
-  .sh
251
-    color: rgb(58, 217, 0)
252
-  // Literal.String.Interpol
253
-  .si
254
-    color: rgb(158, 255, 128)
255
-  // Literal.String.Other
256
-  .sx
257
-    color: rgb(58, 217, 0)
258
-  // Literal.String.Regex
259
-  .sr
260
-    color: #009926
261
-  // Literal.String.Single
262
-  .s1
263
-    color: rgb(58, 217, 0)
264
-  // Literal.String.Symbol
265
-  .ss
266
-    color: rgb(255, 98, 140)
267
-  // Name.Builtin.Pseudo
268
-  .bp
269
-    color: #999999
270
-  // Name.Variable.Class
271
-  .vc
272
-    color: teal
273
-  // Name.Variable.Global
274
-  .vg
275
-    color: teal
276
-  // Name.Variable.Instance
277
-  .vi
278
-    color: teal
279
-  // Literal.Number.Integer.Long
280
-  .il
281
-    color: rgb(255, 98, 140)
282 1
deleted file mode 100644
... ...
@@ -1,15 +0,0 @@
1
-#twitter
2
-  p
3
-    padding-bottom: 10px
4
-    a.topic
5
-      color: $twitter_topic
6
-  .meta
7
-    color: $light_text
8
-    font-size: 80%
9
-    display: block
10
-    padding: 8px 0 0
11
-    a
12
-      color: inherit
13
-      text-decoration: none
14
-      &:hover
15
-        text-decoration: underline
16 1
\ No newline at end of file
17 2
deleted file mode 100644
18 3
deleted file mode 100644
... ...
@@ -1,11 +0,0 @@
1
-/* SASS mixins */
2
-@import library
3
-
4
-/* primary SASS */
5
-@import base
6
-@import theme
7
-@import typography
8
-@import layout
9
-
10
-/* specific SASS */
11
-@import partials
12 1
\ No newline at end of file
13 2
new file mode 100644
... ...
@@ -0,0 +1,51 @@
0
+# Major changes
1
+
2
+## New Jekyll
3
+
4
+Octopress is leaving [Henrik's stale fork of jekyll](https://github.com/henrik/jekyll) for [Mojombo's official Jekyll](https://github.com/mojombo/jekyll). Why? Back when Henrik's Jekyll fork was current, it offered some nice features
5
+like the option to use Haml and ruby instead of html and the liquid templating system. Switching from henrik-jekyll to jekyll, means Octopress will no longer support Haml layouts (until Jekyll does), but after using Octopress
6
+for a year and a half, I can see that it's far better for Octopress to be able to take advantage of the jekyll's active development, than to hold out for full Haml support.
7
+
8
+### Jekyll is Pluggable
9
+
10
+Some new features make the transition worth it. You can write your own [plugins](https://github.com/mojombo/jekyll/wiki/Plugins) which consist of generators, converters, and liquid tags.
11
+Now it's much easier to hack Jekyll without forking. I expect to see some great plugins emerge from the Jekyll community, and I'll be adding my favorites into Octopress.
12
+
13
+
14
+## More Than a Starting Point
15
+
16
+I initially saw Octopress as the fastest way to get started with a fairly nice Jekyll blog, but now that Jekyll is so hackable, I'm hoping that Octopress will also become a great introduction to hacking Jekyll and a place to find great plugins from the community.
17
+
18
+I've already been combing through plugins that other people are writing and I've found some gems. Octopress now has:
19
+
20
+- **Sitemap generator** - suitable xml for submitting to search engines
21
+- **Haml converter** - currently pages and posts can be converted, but not layouts
22
+- **Liquid tag Github gists** - embeds gists in a noscript tag for RSS readers and crawlers, then uses Github's javascript to display gists to site visitors
23
+
24
+Octopress also has custom filters which work through Liquid's filtering system. I've added these for now:
25
+
26
+- **Smart quotes** for posts and pages
27
+- **Title case** an adaptation of John Gruber's intelligent title capitalization script
28
+- **Absolute urls** using '/' as a url opener for relative paths gets converted to an absolute url for RSS readers
29
+- **Ordinal dates** dates are output like "October 5th" or "July 3rd"
30
+
31
+Of course Octopress still supports simple setup for Twitter, Disqus Comments, Google Custom Search, Google Analytics, Delicious Bookmarks, and now Pinboard Bookmarks.
32
+
33
+## Upgrading
34
+
35
+Unfortunately upgrading isn't as smooth as I would like. Some things have changed that require a bit of fiddling on your part. It's less than ideal, but if you were adverse to fiddling, you'd be using Wordpress right?
36
+
37
+#### Update configs
38
+I've moved configurations out of layouts and into the _config.yml. This means settings like title, url, and twitter_user can be accessed on the site object, eg. site.title, site.twitter_user.
39
+
40
+#### Post dates
41
+Before you could add date and time to the post filename, but for some reason Jekyll is more strict and won't see posts with that format. If you had a post `2009-11-13_14-23-hello-world` it should be renamed to `2009-11-13-hello-world`, leaving out the time-stamp.
42
+If you want to keep the time-stamp data, you can now add dates to the post in the yaml front-matter, eg. `date: 2009-11-13 14:23`. It seems that you can also use parseable strings like November 13, 2009 2:23pm and Jekyll will generate the proper url and post metadata.
43
+
44
+I've updated the new post rake task `rake post[title for your new post]` to correctly name new posts, and to automatically insert the time-stamp into the yaml front-matter for a new post. This way you can set the time when you want to publish without having to write out the whole post date.
45
+
46
+
47
+
48
+Here are some steps you can take to get your blog running again on this update:
49
+
50
+1.