From 8dc0cb0b4b0de3c6f40674198cb2bd44aeee9b86 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Sun, 18 Oct 2009 16:43:12 -0500 Subject: [PATCH 001/715] initial commit --- README | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README diff --git a/README b/README new file mode 100644 index 0000000..e69de29 From 2b4c5948b36ed1054dab270444df51fd4c38196f Mon Sep 17 00:00:00 2001 From: B Mathis Date: Sun, 18 Oct 2009 17:11:20 -0500 Subject: [PATCH 002/715] initial _config.yml --- README | 0 source/_config.yml | 11 +++++++++++ 2 files changed, 11 insertions(+) delete mode 100644 README create mode 100644 source/_config.yml diff --git a/README b/README deleted file mode 100644 index e69de29..0000000 diff --git a/source/_config.yml b/source/_config.yml new file mode 100644 index 0000000..b6865c9 --- /dev/null +++ b/source/_config.yml @@ -0,0 +1,11 @@ +source: . +destination: ../site +markdown: rdiscount +pygments: true +permalink: /blog/:year/:month/:day/:title +url: +multiviews: true +sass: false +haml: true +post_defaults: + layout: post \ No newline at end of file From 82d0251da120186c27791b7c073aa103d73c2b31 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Sun, 18 Oct 2009 19:07:36 -0500 Subject: [PATCH 003/715] improved starting point --- .gitignore | 1 + Rakefile | 63 +++ source/_config.yml => _config.yml | 6 +- config.rb | 10 + rubypants.rb | 483 ++++++++++++++++++ source/_helpers.rb | 191 +++++++ source/_layouts/default.haml | 20 + source/_layouts/post.haml | 20 + source/_posts/2009-10-18-hello-world.markdown | 5 + source/archives.haml | 14 + source/atom.haml | 21 + source/index.haml | 8 + 12 files changed, 839 insertions(+), 3 deletions(-) create mode 100644 .gitignore create mode 100644 Rakefile rename source/_config.yml => _config.yml (64%) create mode 100644 config.rb create mode 100644 rubypants.rb create mode 100644 source/_helpers.rb create mode 100644 source/_layouts/default.haml create mode 100644 source/_layouts/post.haml create mode 100644 source/_posts/2009-10-18-hello-world.markdown create mode 100644 source/archives.haml create mode 100644 source/atom.haml create mode 100644 source/index.haml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d97e100 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +site \ No newline at end of file diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..75f89b9 --- /dev/null +++ b/Rakefile @@ -0,0 +1,63 @@ +require 'active_support' + +def ok_failed(condition) + if (condition) + puts "OK" + else + puts "FAILED" + end +end + +port = "4000" +site = "site" + +desc "list tasks" +task :default do + puts "Tasks: #{(Rake::Task.tasks - [Rake::Task[:default]]).to_sentence}" + puts "(type rake -T for more detail)\n\n" +end + +desc "remove files in output directory" +task :clean do + puts "Removing output..." + Dir["#{site}/*"].each { |f| rm_rf(f) } +end + +desc "generate website in output directory" +task :generate => :clean do + puts "Generating website..." + system "compass" + system "jekyll" + Dir["#{site}/stylesheets/*.sass"].each { |f| rm_rf(f) } + system "mv #{site}/atom.html #{site}/blog/atom.xml" +end + +desc "generate and deploy website" +task :deploy => :generate do + print "Deploying website..." + ok_failed system("rsync -avz --delete #{site}/ user@host.com:~/document_root/") +end + +desc "start up an instance of serve on the output files" +task :start_serve => :stop_serve do + cd "#{site}" do + print "Starting serve..." + ok_failed system("serve #{port} > /dev/null 2>&1 &") + end +end + +desc "stop all instances of serve" +task :stop_serve do + pid = `ps auxw | awk '/bin\\/serve\\ #{port}/ { print $2 }'`.strip + if pid.empty? + puts "Serve is not running" + else + print "Stoping serve..." + ok_failed system("kill -9 #{pid}") + end +end + +desc "preview the site in a web browser" +multitask :preview => [:generate, :start_serve] do + system "open http://localhost:#{port}" +end \ No newline at end of file diff --git a/source/_config.yml b/_config.yml similarity index 64% rename from source/_config.yml rename to _config.yml index b6865c9..43a6460 100644 --- a/source/_config.yml +++ b/_config.yml @@ -1,9 +1,9 @@ -source: . -destination: ../site +source: source +destination: site markdown: rdiscount pygments: true permalink: /blog/:year/:month/:day/:title -url: +url: http://yoursite.com multiviews: true sass: false haml: true diff --git a/config.rb b/config.rb new file mode 100644 index 0000000..8fcaa80 --- /dev/null +++ b/config.rb @@ -0,0 +1,10 @@ +# Require any additional compass plugins here. +project_type = :stand_alone +# Set this to the root of your project when deployed: +http_path = "/" +css_dir = "_site/stylesheets" +sass_dir = "_source/stylesheets" +images_dir = "images" + +# To enable relative paths to assets via compass helper functions. Uncomment: +# relative_assets = true diff --git a/rubypants.rb b/rubypants.rb new file mode 100644 index 0000000..6897228 --- /dev/null +++ b/rubypants.rb @@ -0,0 +1,483 @@ +# +# = RubyPants - SmartyPants ported to Ruby +# +# Ported by Christian Neukirchen +# Copyright (C) 2004 Christian Neukirchen +# +# Incooporates ideas, comments and documentation by Chad Miller +# Copyright (C) 2004 Chad Miller +# +# Original SmartyPants by John Gruber +# Copyright (C) 2003 John Gruber +# + +# +# = RubyPants - SmartyPants ported to Ruby +# +# == Synopsis +# +# RubyPants is a Ruby port of the smart-quotes library SmartyPants. +# +# The original "SmartyPants" is a free web publishing plug-in for +# Movable Type, Blosxom, and BBEdit that easily translates plain ASCII +# punctuation characters into "smart" typographic punctuation HTML +# entities. +# +# +# == Description +# +# RubyPants can perform the following transformations: +# +# * Straight quotes (" and ') into "curly" quote +# HTML entities +# * Backticks-style quotes (``like this'') into "curly" quote +# HTML entities +# * Dashes (-- and ---) into en- and em-dash +# entities +# * Three consecutive dots (... or . . .) into an +# ellipsis entity +# +# This means you can write, edit, and save your posts using plain old +# ASCII straight quotes, plain dashes, and plain dots, but your +# published posts (and final HTML output) will appear with smart +# quotes, em-dashes, and proper ellipses. +# +# RubyPants does not modify characters within
,
+# , ,  or
+# "
+      elsif encode == "hex"
+        email_address_encoded = ''
+        email_address_obfuscated.each_byte do |c|
+          email_address_encoded << sprintf("&#%d;", c)
+        end
+        
+        protocol = 'mailto:'
+        protocol.each_byte { |c| string << sprintf("&#%d;", c) }
+        
+        email_address.each_byte do |c|
+          char = c.chr
+          string << (char =~ /\w/ ? sprintf("%%%x", c) : char)
+        end
+        content_tag "a", name || email_address_encoded, html_options.merge({ "href" => "#{string}#{extras}" })
+      else
+        content_tag "a", name || email_address_obfuscated, html_options.merge({ "href" => "mailto:#{email_address}#{extras}" })
+      end
+    end
+    
+    private
+    
+      def cdata_section(content)
+        ""
+      end
+      
+      def javascript_cdata_section(content) #:nodoc:
+        "\n//#{cdata_section("\n#{content}\n//")}\n"
+      end
+      
+      def html_attributes(options)
+        unless options.blank?
+          attrs = []
+          options.each_pair do |key, value|
+            if value == true
+              attrs << %(#{key}="#{key}") if value
+            else
+              attrs << %(#{key}="#{value}") unless value.nil?
+            end
+          end
+          " #{attrs.sort * ' '}" unless attrs.empty?
+        end
+      end
+  end
+  include TagHelper
+  
+  # My added helpers
+  
+  def shorten_words (string, word_limit = 25)
+    words = string.split(/\s/)
+    if words.size >= word_limit
+      words[0,(word_limit-1)].join(" ") + '…'
+    else 
+      string
+    end
+  end
+  
+  def shorten (string, char_limit = 55)
+    chars = string.scan(/.{1,1}/)
+    if chars.size >= char_limit
+      chars[0,(char_limit-1)].join + '…'
+    else
+      "blah2"
+    end
+  end
+  
+  def absolute_url(input)
+    input.gsub(/(href|src)(\s*=\s*)(["'])(\/.*?)\3/) { $1 + $2 + $3 + "http://brandonmathis.com" + $4 + $3 }
+  end
+  
+  def full_url(input)
+    'http://brandonmathis.com'+input
+  end
+  def rp(input)
+    RubyPants.new(input).to_html
+  end
+  def style_amp(input)
+    input.gsub(" & "," & ")
+  end
+end
+
diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml
new file mode 100644
index 0000000..43dae4f
--- /dev/null
+++ b/source/_layouts/default.haml
@@ -0,0 +1,20 @@
+!!! 1.1 Transitional
+%html(xmlns="http://www.w3.org/1999/xhtml" xml:lang="en")
+  %head
+    %title= page.title
+    - if page.respond_to? :description
+      %meta{:name=>"description", :content=>page.description}/
+    - if page.respond_to? :keywords
+      %meta{:name=>"keywords", :content=>page.keywords}/
+  %body
+    #header
+      .page_width
+        %a.title(href="/")Blog
+        %ul#header_nav.nav
+          %li.alpha
+            %a(href="/") Home
+    #page
+      .page_width
+        = content
+    #footer
+      .page_width Footer
\ No newline at end of file
diff --git a/source/_layouts/post.haml b/source/_layouts/post.haml
new file mode 100644
index 0000000..42ccde4
--- /dev/null
+++ b/source/_layouts/post.haml
@@ -0,0 +1,20 @@
+!!! 1.1 Transitional
+%html(xmlns="http://www.w3.org/1999/xhtml" xml:lang="en")
+  %head
+    %title= page.title
+    - if page.respond_to? :description
+      %meta{:name=>"description", :content=>page.description}/
+    - if page.respond_to? :keywords
+      %meta{:name=>"keywords", :content=>page.keywords}/
+  %body
+    #header
+      .page_width
+        %a.title(href="/")Page Title
+        %ul#header_nav.nav
+          %li.alpha
+            %a(href="/") Home
+    #page
+      .page_width
+        = content
+    #footer
+      .page_width Footer
\ No newline at end of file
diff --git a/source/_posts/2009-10-18-hello-world.markdown b/source/_posts/2009-10-18-hello-world.markdown
new file mode 100644
index 0000000..492d50a
--- /dev/null
+++ b/source/_posts/2009-10-18-hello-world.markdown
@@ -0,0 +1,5 @@
+---
+title: Hello World!
+---
+
+How's it going?
\ No newline at end of file
diff --git a/source/archives.haml b/source/archives.haml
new file mode 100644
index 0000000..5d78d94
--- /dev/null
+++ b/source/archives.haml
@@ -0,0 +1,14 @@
+---
+layout: default
+title: Blog Archives
+---
+%h2 Blog Archives
+
+- posts = site.posts.group_by { |p| p.date.strftime("%Y") }
+- posts.keys.each do |year|
+  %h3= year
+  %ul
+    - posts[year].each do |post|
+      %li(class="#{(post.data['link'] ? "link" : nil )}")
+        = link_to(post.title, post.url)
+        %span.pubdate= post.date.strftime("%d %b, %Y")
\ No newline at end of file
diff --git a/source/atom.haml b/source/atom.haml
new file mode 100644
index 0000000..d8cfe04
--- /dev/null
+++ b/source/atom.haml
@@ -0,0 +1,21 @@
+---
+layout: nil
+---
+
+%feed(xmlns="http://www.w3.org/2005/Atom")
+  %title Your Name - Your Site
+  %link(href="yoursite.com/atom.xml" rel="self")
+  %link(href="yoursite.com")
+  %updated= Time.now.xmlschema
+  %id http://yoursite.com/
+  %author
+    %name Your Name
+    %email user[at]domain.com
+  - site.posts[0..14].each do |post|
+    %entry
+      %title= rp(post.title)
+      %link(href="#{full_url(post.url)}")
+      %updated=post.date.xmlschema
+      %id= full_url(post.id)
+      %content(type="html")
+        = h(absolute_url(rp(post.content)))
\ No newline at end of file
diff --git a/source/index.haml b/source/index.haml
new file mode 100644
index 0000000..af77e06
--- /dev/null
+++ b/source/index.haml
@@ -0,0 +1,8 @@
+---
+layout: basic/default
+title: Blog
+---
+.blog
+  - site.posts.sort_by(&:date).reverse[0..9].each_with_index do |post,index|
+    %h2= link_to(post.title, post.url, {:class=>"title"})
+    .article= post.content
\ No newline at end of file

From d8d51719fb2ec7cb2ee70dab4665c74baa0fb783 Mon Sep 17 00:00:00 2001
From: B Mathis 
Date: Sun, 18 Oct 2009 20:10:45 -0500
Subject: [PATCH 004/715] added compass, added some basic stylesheets

---
 .gitignore                                    |  3 +-
 Rakefile                                      |  2 +-
 config.rb                                     |  4 +-
 source/_layouts/default.haml                  |  7 +-
 source/_layouts/post.haml                     |  7 +-
 .../_posts/2009-10-18-Groove-Pocket.markdown  |  5 ++
 source/_posts/2009-10-18-Latin-Rocks.markdown |  7 ++
 source/index.haml                             |  2 +-
 source/stylesheets/_library.sass              |  9 +++
 source/stylesheets/ie.sass                    |  0
 .../stylesheets/library/_border_radius.sass   | 47 +++++++++++++
 source/stylesheets/library/_box_shadow.sass   | 10 +++
 source/stylesheets/library/_button_style.sass | 45 +++++++++++++
 source/stylesheets/library/_clearfix.sass     | 24 +++++++
 source/stylesheets/library/_float.sass        | 16 +++++
 source/stylesheets/library/_gradient.sass     | 15 +++++
 source/stylesheets/library/_hacks.sass        |  8 +++
 source/stylesheets/library/_link_colors.sass  | 24 +++++++
 source/stylesheets/library/_list_borders.sass |  7 ++
 source/stylesheets/library/_opacity.sass      | 18 +++++
 source/stylesheets/library/_reset.sass        | 58 ++++++++++++++++
 source/stylesheets/library/_sprite_hover.sass |  4 ++
 source/stylesheets/library/_sprite_img.sass   | 52 ++++++++++++++
 source/stylesheets/library/_typography.sass   | 67 +++++++++++++++++++
 source/stylesheets/partials/_base.sass        | 16 +++++
 source/stylesheets/partials/_main.sass        |  4 ++
 .../partials/base/_typography.sass            | 26 +++++++
 .../partials/main/_flash_messages.sass        | 36 ++++++++++
 source/stylesheets/partials/main/_form.sass   | 61 +++++++++++++++++
 source/stylesheets/partials/main/_layout.sass | 62 +++++++++++++++++
 source/stylesheets/partials/main/_theme.sass  | 50 ++++++++++++++
 source/stylesheets/print.sass                 |  0
 source/stylesheets/screen.sass                |  3 +
 33 files changed, 691 insertions(+), 8 deletions(-)
 create mode 100644 source/_posts/2009-10-18-Groove-Pocket.markdown
 create mode 100644 source/_posts/2009-10-18-Latin-Rocks.markdown
 create mode 100644 source/stylesheets/_library.sass
 create mode 100644 source/stylesheets/ie.sass
 create mode 100644 source/stylesheets/library/_border_radius.sass
 create mode 100644 source/stylesheets/library/_box_shadow.sass
 create mode 100644 source/stylesheets/library/_button_style.sass
 create mode 100644 source/stylesheets/library/_clearfix.sass
 create mode 100644 source/stylesheets/library/_float.sass
 create mode 100644 source/stylesheets/library/_gradient.sass
 create mode 100644 source/stylesheets/library/_hacks.sass
 create mode 100644 source/stylesheets/library/_link_colors.sass
 create mode 100644 source/stylesheets/library/_list_borders.sass
 create mode 100644 source/stylesheets/library/_opacity.sass
 create mode 100644 source/stylesheets/library/_reset.sass
 create mode 100644 source/stylesheets/library/_sprite_hover.sass
 create mode 100644 source/stylesheets/library/_sprite_img.sass
 create mode 100644 source/stylesheets/library/_typography.sass
 create mode 100644 source/stylesheets/partials/_base.sass
 create mode 100644 source/stylesheets/partials/_main.sass
 create mode 100644 source/stylesheets/partials/base/_typography.sass
 create mode 100644 source/stylesheets/partials/main/_flash_messages.sass
 create mode 100644 source/stylesheets/partials/main/_form.sass
 create mode 100644 source/stylesheets/partials/main/_layout.sass
 create mode 100644 source/stylesheets/partials/main/_theme.sass
 create mode 100644 source/stylesheets/print.sass
 create mode 100644 source/stylesheets/screen.sass

diff --git a/.gitignore b/.gitignore
index d97e100..26c08c3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
-site
\ No newline at end of file
+site
+source/stylesheets/.sass-cache
\ No newline at end of file
diff --git a/Rakefile b/Rakefile
index 75f89b9..d36a84d 100644
--- a/Rakefile
+++ b/Rakefile
@@ -29,7 +29,7 @@ task :generate => :clean do
   system "compass"
   system "jekyll"
   Dir["#{site}/stylesheets/*.sass"].each { |f| rm_rf(f) }
-  system "mv #{site}/atom.html #{site}/blog/atom.xml"
+  system "mv #{site}/atom.html #{site}/atom.xml"
 end
 
 desc "generate and deploy website"
diff --git a/config.rb b/config.rb
index 8fcaa80..6c61491 100644
--- a/config.rb
+++ b/config.rb
@@ -2,8 +2,8 @@
 project_type = :stand_alone
 # Set this to the root of your project when deployed:
 http_path = "/"
-css_dir = "_site/stylesheets"
-sass_dir = "_source/stylesheets"
+css_dir = "site/stylesheets"
+sass_dir = "source/stylesheets"
 images_dir = "images"
 
 # To enable relative paths to assets via compass helper functions. Uncomment:
diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml
index 43dae4f..cec5376 100644
--- a/source/_layouts/default.haml
+++ b/source/_layouts/default.haml
@@ -6,13 +6,16 @@
       %meta{:name=>"description", :content=>page.description}/
     - if page.respond_to? :keywords
       %meta{:name=>"keywords", :content=>page.keywords}/
+    %link{:href=>"/stylesheets/screen.css", :rel=>"stylesheet", :media=>"screen, projection", :type=>"text/css"}
   %body
     #header
       .page_width
-        %a.title(href="/")Blog
+        %a.title(href="/") My Blog
         %ul#header_nav.nav
           %li.alpha
-            %a(href="/") Home
+            %a(href="/archives") Archives
+          %li.omega
+            %a(href="/atom.xml") Subscribe
     #page
       .page_width
         = content
diff --git a/source/_layouts/post.haml b/source/_layouts/post.haml
index 42ccde4..4accb53 100644
--- a/source/_layouts/post.haml
+++ b/source/_layouts/post.haml
@@ -6,15 +6,20 @@
       %meta{:name=>"description", :content=>page.description}/
     - if page.respond_to? :keywords
       %meta{:name=>"keywords", :content=>page.keywords}/
+    %link{:href=>"/stylesheets/screen.css", :rel=>"stylesheet", :media=>"screen, projection", :type=>"text/css"}
   %body
     #header
       .page_width
-        %a.title(href="/")Page Title
+        %a.title(href="/")My Blog
         %ul#header_nav.nav
           %li.alpha
             %a(href="/") Home
     #page
       .page_width
+        %h2= rp(page.title)
         = content
+        %p.pubdate
+          Published:
+          =page.date.strftime("%d %b, %Y")
     #footer
       .page_width Footer
\ No newline at end of file
diff --git a/source/_posts/2009-10-18-Groove-Pocket.markdown b/source/_posts/2009-10-18-Groove-Pocket.markdown
new file mode 100644
index 0000000..2f14850
--- /dev/null
+++ b/source/_posts/2009-10-18-Groove-Pocket.markdown
@@ -0,0 +1,5 @@
+---
+title: Groove Pocket
+---
+
+> You can't hold no groove if you ain't got no pocket!
\ No newline at end of file
diff --git a/source/_posts/2009-10-18-Latin-Rocks.markdown b/source/_posts/2009-10-18-Latin-Rocks.markdown
new file mode 100644
index 0000000..f444681
--- /dev/null
+++ b/source/_posts/2009-10-18-Latin-Rocks.markdown
@@ -0,0 +1,7 @@
+---
+title: Latin Rocks!
+---
+
+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 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.
+
+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 luptatum zzril delenit augue duis dolore te feugait nulla.
\ No newline at end of file
diff --git a/source/index.haml b/source/index.haml
index af77e06..12afdcf 100644
--- a/source/index.haml
+++ b/source/index.haml
@@ -1,5 +1,5 @@
 ---
-layout: basic/default
+layout: default
 title: Blog
 ---
 .blog
diff --git a/source/stylesheets/_library.sass b/source/stylesheets/_library.sass
new file mode 100644
index 0000000..85425cd
--- /dev/null
+++ b/source/stylesheets/_library.sass
@@ -0,0 +1,9 @@
+@import library/reset.sass
+@import library/clearfix.sass
+@import library/border_radius.sass
+@import library/box_shadow.sass
+@import library/list_borders.sass
+@import library/typography.sass
+@import library/link_colors.sass
+@import library/gradient.sass
+@import library/button_style.sass
\ No newline at end of file
diff --git a/source/stylesheets/ie.sass b/source/stylesheets/ie.sass
new file mode 100644
index 0000000..e69de29
diff --git a/source/stylesheets/library/_border_radius.sass b/source/stylesheets/library/_border_radius.sass
new file mode 100644
index 0000000..475b66d
--- /dev/null
+++ b/source/stylesheets/library/_border_radius.sass
@@ -0,0 +1,47 @@
+!default_border_radius ||= 5px
+
+// Round all borders by amount
+=border-radius(!radius = !default_border_radius)
+  border-radius= !radius
+  -moz-border-radius= !radius
+  -webkit-border-radius= !radius
+
+// Round radius at position by amount.
+// values for !vert: "top", "bottom"
+// values for !horz: "left", "right
+=border-corner-radius(!vert, !horz, !radius = !default_border_radius)
+  border-#{!vert}-#{!horz}-radius= !radius
+  -moz-border-radius-#{!vert}#{!horz}= !radius
+  -webkit-border-#{!vert}-#{!horz}-radius= !radius
+  
+=border-top-left-radius(!radius = !default_border_radius)
+  +border-corner-radius("top", "left", !radius)
+
+=border-top-right-radius(!radius = !default_border_radius)
+  +border-corner-radius("top", "right", !radius)
+
+=border-bottom-left-radius(!radius = !default_border_radius)
+  +border-corner-radius("bottom", "left", !radius)
+
+=border-bottom-right-radius(!radius = !default_border_radius)
+  +border-corner-radius("bottom", "right", !radius)
+
+// Round top corners by amount
+=border-top-radius(!radius = !default_border_radius)
+  +border-top-left-radius(!radius)
+  +border-top-right-radius(!radius)
+
+// Round right corners by amount
+=border-right-radius(!radius = !default_border_radius)
+  +border-top-right-radius(!radius)
+  +border-bottom-right-radius(!radius)
+
+// Round bottom corners by amount
+=border-bottom-radius(!radius = !default_border_radius)
+  +border-bottom-left-radius(!radius)
+  +border-bottom-right-radius(!radius)
+
+// Round left corners by amount
+=border-left-radius(!radius = !default_border_radius)
+  +border-top-left-radius(!radius)
+  +border-bottom-left-radius(!radius)
\ No newline at end of file
diff --git a/source/stylesheets/library/_box_shadow.sass b/source/stylesheets/library/_box_shadow.sass
new file mode 100644
index 0000000..728a894
--- /dev/null
+++ b/source/stylesheets/library/_box_shadow.sass
@@ -0,0 +1,10 @@
+!default_box_shadow_color = #333
+!default_box_shadow_x_offset = 1px
+!default_box_shadow_y_offset = 1px
+!default_box_shadow_blur_radius = 8px
+
+=box-shadow(!color = !default_box_shadow_color, !x_offset = !default_box_shadow_x_offset, !y_offset = !default_box_shadow_y_offset, !blur_radius = !default_box_shadow_blur_radius)
+  box-shadow= !x_offset !y_offset !blur_radius !color
+  -webkit-box-shadow= !x_offset !y_offset !blur_radius !color
+  -moz-box-shadow= !x_offset !y_offset !blur_radius !color
+  
\ No newline at end of file
diff --git a/source/stylesheets/library/_button_style.sass b/source/stylesheets/library/_button_style.sass
new file mode 100644
index 0000000..2b68d5d
--- /dev/null
+++ b/source/stylesheets/library/_button_style.sass
@@ -0,0 +1,45 @@
+=btn-border-color(!color)
+  border-color= darken(!color, 25)
+
+=btn-text-shadow(!color)
+  !text_shadow = darken(!color, 25)
+  text-shadow= !text_shadow  "1px 1px 1px"
+
+=btn-style(!color)
+  !color1 = lighten(!color, 30)
+  !color2 = darken(!color, 20)
+  +h-linear-gradient(!color1, !color2)
+  background-color= !color
+  +btn-border-color(!color)
+  +btn-text-shadow(!color)
+
+=btn-style-hover(!color)
+  !color = lighten(!color, 8)
+  !color1 = lighten(!color, 22)
+  !color2 = darken(!color, 38)
+  +h-linear-gradient(!color1, !color2)
+  background-color= !color
+  +btn-border-color(!color)
+  +btn-text-shadow(!color)
+
+=btn-style-active(!color)
+  !color = darken(!color, 5)
+  !color1 = lighten(!color, 25)
+  !color2 = darken(!color, 35)
+  +h-linear-gradient(!color1, !color2)
+  background-color= !color
+  +btn-border-color(!color)
+  +btn-text-shadow(!color)
+
+=btn-structure(!font_size, !border_width, !line_height = !font_size *1.2)
+  !v_padding = floor(!font_size/2.5)
+  !h_padding = floor(!font_size)
+  !v_padding_active = !v_padding - 1px
+  !h_padding_active = !h_padding - 1px
+  border-width= !border_width
+  font-size= !font_size
+  padding= !v_padding !h_padding
+  line-height= !line_height
+  &:active
+    border-width= !border_width + 1px
+    padding= !v_padding_active !h_padding_active
\ No newline at end of file
diff --git a/source/stylesheets/library/_clearfix.sass b/source/stylesheets/library/_clearfix.sass
new file mode 100644
index 0000000..29548fe
--- /dev/null
+++ b/source/stylesheets/library/_clearfix.sass
@@ -0,0 +1,24 @@
+// based on compass clearfix
+
+@import _hacks.sass
+
+// Extends the element to enclose any floats it contains.
+// This basic method is preferred for the usual case, when positioned content will not show outside the bounds of the container.
+// Recommendations include using this in conjunction with a width:
+// http://www.quirksmode.org/blog/archives/2005/03/clearing_floats.html
+=clearfix
+  :overflow hidden
+  +has-layout
+
+// Extends the element to enclose any floats it contains.
+// This older "Easy Clearing" method has the advantage of allowing positioned elements to hang outside the bounds of the container, at the expense of more tricky CSS.
+// http://www.positioniseverything.net/easyclearing.html
+=pie-clearfix
+  &:after
+    :content " "
+    :display block
+    :height 0
+    :clear both
+    :overflow hidden
+    :visibility hidden
+  +has-layout
\ No newline at end of file
diff --git a/source/stylesheets/library/_float.sass b/source/stylesheets/library/_float.sass
new file mode 100644
index 0000000..b459e81
--- /dev/null
+++ b/source/stylesheets/library/_float.sass
@@ -0,0 +1,16 @@
+// based on compass float
+
+@import modules/_clearfix.sass
+
+// Available as alternate syntax with just +float
+=float(!side = "left")
+  :display inline
+  :float= !side
+
+// Implementation of float:left with fix for double-margin bug
+=float-left
+  +float("left")
+
+// Implementation of float:right with fix for double-margin bug
+=float-right
+  +float("right")
\ No newline at end of file
diff --git a/source/stylesheets/library/_gradient.sass b/source/stylesheets/library/_gradient.sass
new file mode 100644
index 0000000..31c498e
--- /dev/null
+++ b/source/stylesheets/library/_gradient.sass
@@ -0,0 +1,15 @@
+=linear-gradient(!from_coord, !to_coord, !color_start, !color_end, !color_stop1 = 0, !color_stop1_pos = .3, !color_stop_2 = 0, !color_stop2_pos = .9)
+  !gradient = "#{!from_coord}, #{!to_coord}, from(#{!color_start}), to(#{!color_end})"
+  //@if !color_stop1 != 0
+  //  !gradient += "color-stop(#{!color_stop1_pos}, #{!color_stop1})"
+  background= "-webkit-gradient(linear, #{!gradient})"
+  background= "-moz-linear-gradient(#{!gradient})"
+
+=h-linear-gradient(!color1, !color2)
+  +linear-gradient("left top", "left bottom", !color1, !color2)
+
+=v-linear-gradient(!color1, !color2)
+  +linear-gradient("left top", "right top", !color1, !color2)
+
+//=h-three-color-gradient(!color1, !color2, !color3, !color3_pos = .5)
+//  +linear-gradient("left top", "left bottom", !color1, !color2, !color3, !color3_pos)
\ No newline at end of file
diff --git a/source/stylesheets/library/_hacks.sass b/source/stylesheets/library/_hacks.sass
new file mode 100644
index 0000000..33b442b
--- /dev/null
+++ b/source/stylesheets/library/_hacks.sass
@@ -0,0 +1,8 @@
+// based on compass hacks
+
+=has-layout
+  // This makes ie6 get layout
+  :display inline-block
+  // and this puts it back to block
+  &
+    :display block
\ No newline at end of file
diff --git a/source/stylesheets/library/_link_colors.sass b/source/stylesheets/library/_link_colors.sass
new file mode 100644
index 0000000..546c436
--- /dev/null
+++ b/source/stylesheets/library/_link_colors.sass
@@ -0,0 +1,24 @@
+!default_link_color           ||= #165B94
+!default_link_color_hover     ||= #fff
+!default_link_color_alt       ||= #91D5F1
+!default_link_color_hover_alt ||= #000
+
+=link-color(!hover = true)
+  +link-color-style(!default_link_color, !default_link_color_hover, !default_link_color, !hover)
+
+=link-color-alt(!hover = true)
+  +link-color-style(!default_link_color_alt, !default_link_color_hover_alt, !default_link_color_alt, !hover)
+  
+=link-color-heading(!link_color = "inherit", !hover_bg_color = #ccc)
+  +link-color-style(!link_color,)
+
+=link-color-style(!color = !default_link_color, !color_hover = !default_link_color_hover, !link_hover_bg = !color, !hover = true)
+  color= !color
+  padding: 2px
+  margin: 0 -2px
+  +border-radius(3px)
+  @if !hover
+    &:hover
+      background-color= !link_hover_bg
+      color= !color_hover
+      text-decoration: none
\ No newline at end of file
diff --git a/source/stylesheets/library/_list_borders.sass b/source/stylesheets/library/_list_borders.sass
new file mode 100644
index 0000000..b4fe6db
--- /dev/null
+++ b/source/stylesheets/library/_list_borders.sass
@@ -0,0 +1,7 @@
+=list-borders(!color1,!color2)
+  border-left= "1px solid" !color1
+  border-right= "1px solid" !color2
+  &.alpha
+    border-left: none
+  &.omega
+    border-right: 0
\ No newline at end of file
diff --git a/source/stylesheets/library/_opacity.sass b/source/stylesheets/library/_opacity.sass
new file mode 100644
index 0000000..f8d2a05
--- /dev/null
+++ b/source/stylesheets/library/_opacity.sass
@@ -0,0 +1,18 @@
+//**
+  Provides cross-browser css opacity.
+  @param !opacity
+    A number between 0 and 1, where 0 is transparent and 1 is opaque.
+=opacity(!opacity)
+  :opacity= !opacity
+  :-moz-opacity= !opacity
+  :-khtml-opacity= !opacity
+  :-ms-filter= "progid:DXImageTransform.Microsoft.Alpha(Opacity=" + round(!opacity*100) + ")"
+  :filter= "alpha(opacity=" + round(!opacity*100) + ")"
+
+// Make an element completely transparent.
+=transparent
+  +opacity(0)
+
+// Make an element completely opaque.
+=opaque
+  +opacity(1)
diff --git a/source/stylesheets/library/_reset.sass b/source/stylesheets/library/_reset.sass
new file mode 100644
index 0000000..af4fe75
--- /dev/null
+++ b/source/stylesheets/library/_reset.sass
@@ -0,0 +1,58 @@
+// Borrowed from the blueprint reset
+
+// Global reset rules.
+// For more specific resets, use the reset mixins provided below
+=global-reset
+  html, body
+    +reset
+  +nested-reset
+
+// Reset all elements within some selector scope.To reset the selector itself,
+// mixin the appropriate reset mixin for that element type as well. This could be
+// useful if you want to style a part of your page in a dramatically different way.
+=nested-reset
+  div, span, object, iframe, h1, h2, h3, h4, h5, h6, p,
+  pre, a, abbr, acronym, address, code, del, dfn, em, img,
+  dl, dt, dd, ol, ul, li, fieldset, form, label, legend, caption, tbody, tfoot, thead, tr
+    +reset
+  blockquote, q
+    +reset-quotation
+  th, td, caption
+    +reset-table-cell
+  table
+    +reset-table
+  a img
+    :border none
+
+=reset-box-model
+  :margin 0
+  :padding 0
+  :border 0
+
+=reset
+  +reset-box-model
+  :font
+    :weight inherit
+    :style inherit
+    :size 100%
+    :family inherit
+  :vertical-align baseline
+
+=reset-quotation
+  +reset
+  :quotes "" ""
+  &:before,
+  &:after
+    :content ""
+
+=reset-table-cell
+  +reset
+  :text-align left
+  :font-weight normal
+  :vertical-align middle
+
+=reset-table
+  +reset
+  :border-collapse separate
+  :border-spacing 0
+  :vertical-align middle
diff --git a/source/stylesheets/library/_sprite_hover.sass b/source/stylesheets/library/_sprite_hover.sass
new file mode 100644
index 0000000..13c644f
--- /dev/null
+++ b/source/stylesheets/library/_sprite_hover.sass
@@ -0,0 +1,4 @@
+=sprite-column-hover-row(!col, !row_hover=2, !width=!sprite_default_size, !height=!sprite_default_size, !margin=!sprite_default_margin)
+  +sprite-position(!col, 1, !width, !height, !margin)
+  &:hover
+    +sprite-position(!col, !row_hover, !width, !height, !margin)
\ No newline at end of file
diff --git a/source/stylesheets/library/_sprite_img.sass b/source/stylesheets/library/_sprite_img.sass
new file mode 100644
index 0000000..dadac12
--- /dev/null
+++ b/source/stylesheets/library/_sprite_img.sass
@@ -0,0 +1,52 @@
+//**
+  Example 1:
+  a.twitter
+    +sprite-img("icons-32.png", 1)
+  a.facebook
+    +sprite-img("icons-32png", 2)
+  ...
+  Example 2:
+  a
+    +sprite-background("icons-32.png")
+    a.twitter
+      +sprite-column(1)
+    a.facebook
+      +sprite-row(2)
+    ...
+ 
+!sprite_default_size  ||= 32px
+!sprite_default_margin ||= 0px
+!sprite_image_default_width ||= !sprite_default_size
+!sprite_image_default_height ||= !sprite_default_size
+ 
+ 
+// Sets all the rules for a sprite from a given sprite image to show just one of the sprites.
+// To reduce duplication use a sprite-bg mixin for common properties and a sprite-select mixin for positioning.
+=sprite-img(!img, !col, !row = 1, !width = !sprite_image_default_width, !height = !sprite_image_default_height, !margin = !sprite_default_margin)
+  +sprite-background(!img, !width, !height)
+  +sprite-position(!col, !row, !width, !height, !margin)
+ 
+// Sets rules common for all sprites, assumes you want a square, but allows a rectangular region.
+=sprite-background(!img, !width = !sprite_default_size, !height = !width)
+  +sprite-background-rectangle(!img, !width, !height)
+ 
+// Sets rules common for all sprites, assumes a rectangular region.
+=sprite-background-rectangle(!img, !width = !sprite_image_default_width, !height = !sprite_image_default_height)
+  :background= image_url(!img) "no-repeat"
+  :width= !width
+  :height= !height
+  :overflow hidden
+ 
+// Allows horizontal sprite positioning optimized for a single row of sprites.
+=sprite-column(!col, !width = !sprite_image_default_width, !margin = !sprite_default_margin)
+  +sprite-position(!col, 1, !width, 0px, !margin)
+ 
+// Allows vertical sprite positioning optimized for a single column of sprites.
+=sprite-row(!row, !height = !sprite_image_default_height, !margin = !sprite_default_margin)
+  +sprite-position(1, !row, 0px, !height, !margin)
+ 
+// Allows vertical and horizontal sprite positioning from a grid of equal dimensioned sprites.
+=sprite-position(!col, !row = 1, !width = !sprite_image_default_width, !height = !sprite_image_default_height, !margin = !sprite_default_margin)
+  !x = ((!col - 1) * -!width) - ((!col - 1) * !margin)
+  !y = ((!row - 1) * -!height) - ((!row - 1) * !margin)
+  :background-position= !x !y
\ No newline at end of file
diff --git a/source/stylesheets/library/_typography.sass b/source/stylesheets/library/_typography.sass
new file mode 100644
index 0000000..8b2c67c
--- /dev/null
+++ b/source/stylesheets/library/_typography.sass
@@ -0,0 +1,67 @@
+!base_font_size ||= 14px
+!base_font_size_small ||= 12px
+!h6 ||= !base_font_size
+!h5 ||= ceil(!h6*1.1)
+!h4 ||= ceil(!h5*1.1)
+!h3 ||= ceil(!h4*1.2)
+!h2 ||= ceil(!h3*1.25)
+!h1 ||= ceil(!h2*1.255)
+
+=set-heading-sizes(!font_size = !base_font_size)
+  !h6 = !font_size
+  !h5 = ceil(!h6*1.1)
+  !h4 = ceil(!h5*1.1)
+  !h3 = ceil(!h4*1.2)
+  !h2 = ceil(!h3*1.25)
+  !h1 = ceil(!h2*1.255)
+  h1, h2, h3, h4
+    &:first-child
+      margin-top: 0
+  h1
+    font-size= !h1
+    margin-bottom= !h2/2
+    line-height= !h1 * 1.2
+  h2
+    font-size= !h2
+    margin= !h2/2 0 !h2/2
+    line-height= !h2 * 1.2
+  h3
+    font-size= !h3
+    margin= !h2/2 0 !h2/2
+    line-height= !h3 * 1.2
+  h4
+    font-size= !h4
+    margin= !h4/2 0 !h4/2
+    line-height= !h4 * 1.2
+  h5
+    font-size= !h5
+    margin= !h4/2 0 !h4/2
+    line-height= !h5 * 1.2
+  h6
+    font-size= !h6
+    margin= !h4/2 0 !h4/2
+    line-height= !h6 * 1.2
+
+=typography-defaults(!font_size = !base_font_size)
+  line-height= ceil(!font_size * 1.5)
+  p
+    padding-bottom= !font_size * 2
+  h1,h2,h3,h4,h5,h6
+    font-weight: bold
+  em
+    font-style: italic
+  strong
+    font-weight: bold
+  span.highlight, em.highlight, strong.highlight
+    background-color: #ff6
+    padding: 2px
+    margin: 0 -2px
+  ul, ol, dl
+    list-style: inside
+    margin= 0 0 (!font_size)
+  li
+    padding: 0 0 2px
+  small
+    font-size= floor(!font_size * .85)
+  big
+    font-size= floor(!font_size * 1.25)
\ No newline at end of file
diff --git a/source/stylesheets/partials/_base.sass b/source/stylesheets/partials/_base.sass
new file mode 100644
index 0000000..c88d3c0
--- /dev/null
+++ b/source/stylesheets/partials/_base.sass
@@ -0,0 +1,16 @@
+//compass default reset
++global-reset
+//my reset
+button
+  margin: 0
+  padding: 0
+  background: none
+  border: none
+  cursor: pointer
+
+button::-moz-focus-inner
+  border: none
+  padding: 0
+
+@import compass/utilities.sass
+@import base/typography.sass
\ No newline at end of file
diff --git a/source/stylesheets/partials/_main.sass b/source/stylesheets/partials/_main.sass
new file mode 100644
index 0000000..4494b8a
--- /dev/null
+++ b/source/stylesheets/partials/_main.sass
@@ -0,0 +1,4 @@
+@import main/theme.sass
+@import main/layout.sass
+@import main/form.sass
+@import main/flash_messages.sass
\ No newline at end of file
diff --git a/source/stylesheets/partials/base/_typography.sass b/source/stylesheets/partials/base/_typography.sass
new file mode 100644
index 0000000..3a607b5
--- /dev/null
+++ b/source/stylesheets/partials/base/_typography.sass
@@ -0,0 +1,26 @@
+!base_font_size = 15px
+!base_font_size_small = 13px
+!default_border_radius = 6px
+
+=heading-font 
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif
+=sans-font
+  font-family: "Lucida Grande", "Lucida Sans Unicode", "Trebuchet MS", Helvetica, Arial, Verdana, sans-serif
+=serif-font
+  font-family: Baskerville, "Times New Roman", Times, Georgia, serif
+=fixed-font
+  font-family: "Menlo", "Bitstream Vera Sans", Monaco, "Andale Mono", "Lucida Console", monospace
+    
+body
+  font-size= !base_font_size
+  +set-heading-sizes
+  +typography-defaults
+  +sans-font
+  
+h1,h2,h3,h4,h5,h6
+  color: #333
+  letter-spacing: -1px
+  font-weight: bold
+ol li
+  list-style: decimal
+  margin-left: 1.9em
\ No newline at end of file
diff --git a/source/stylesheets/partials/main/_flash_messages.sass b/source/stylesheets/partials/main/_flash_messages.sass
new file mode 100644
index 0000000..bdc9f9c
--- /dev/null
+++ b/source/stylesheets/partials/main/_flash_messages.sass
@@ -0,0 +1,36 @@
+!flash_notice       ||= #00529B
+!flash_success      ||= #4F8A10
+!flash_warning      ||= #FBF4BD
+!flash_error        ||= #D8000C
+!flash_notice_bg    ||= #BDE5F8
+!flash_success_bg   ||= #DFF2BF
+!flash_warning_bg   ||= #FBF4BD
+!flash_error_bg     ||= #FFD9DA
+
+=flash-message-style
+  +flash-message-structure
+  &.notice
+    +flash-color(!flash_notice, !flash_notice_bg)
+  &.success
+    +flash-color(!flash_success, !flash_success_bg)
+  &.warning
+    +flash-color(!flash_warning, !flash_warning_bg)
+  &.error
+    +flash-color(!flash_error, !flash_error_bg)
+
+=flash-message-structure
+  background-repeat: no-repeat
+  background-position: 10px center
+  border: 1px dashed
+  padding: 10px 15px
+  margin: 0 0 15px
+
+=flash-color(!color, !bg = 0)
+  color= !color
+  @if !bg == 0
+    background-color= desaturate(lighten(adjust_hue(!color, -10), 83), 20)
+  @else
+    background-color= !bg
+
+#flash
+  +flash-message-style
\ No newline at end of file
diff --git a/source/stylesheets/partials/main/_form.sass b/source/stylesheets/partials/main/_form.sass
new file mode 100644
index 0000000..dc28ff0
--- /dev/null
+++ b/source/stylesheets/partials/main/_form.sass
@@ -0,0 +1,61 @@
+#page
+  form
+    clear: both
+    padding-bottom= !pad
+    fieldset, fieldset input.textbox, fieldset textarea
+      +border-radius
+    fieldset
+      background-color= !fieldset_bg
+      width: 480px
+      border= "1px solid" !fieldset_border
+      padding: 35px 25px 20px
+      margin-bottom= !pad*2.2
+    label
+      font-size: 90%
+      display: block
+      padding-bottom: 4px
+    select
+      font-size: 110%
+    input.textbox, textarea
+      font-size: 115%
+      color= !textinput_color
+      background-color= !textinput_bg
+      
+      width: 70%
+      padding: 6px 8px
+      outline: 0
+      display: inline-block
+      
+      border: 1px solid
+      border-top-color= !textinput_border_top
+      border-bottom-color= !textinput_border_bottom
+      border-left-color= !textinput_border_left
+      border-right-color= !textinput_border_right
+      
+      &:focus
+        background= !textinput_bg_focus
+        border-color= !textinput_border_focus
+        
+    input.checkbox, label.checkbox
+      display: inline-block
+    p
+      +clearfix
+      padding= 0 8px !pad
+    input.wrong:focus
+      outline: 2px solid #d0a5a5
+      background: #fef2f2
+    button
+      +border-radius(5px)
+      +btn-style(!blue_btn)
+      +btn-structure(18px, 1px)
+      color= !default_button_text_color
+      border:
+        width: 1px
+        style: solid
+      &:hover, &:focus
+        +btn-style-hover(!blue_btn)
+        outline: none
+      &:active
+        +btn-style-active(!blue_btn)
+    a.cancel
+      color= !cancel_link
\ No newline at end of file
diff --git a/source/stylesheets/partials/main/_layout.sass b/source/stylesheets/partials/main/_layout.sass
new file mode 100644
index 0000000..dfc937a
--- /dev/null
+++ b/source/stylesheets/partials/main/_layout.sass
@@ -0,0 +1,62 @@
+!page_width = 560px
+!pad = 15px
+!default_border_radius = 4px
+
+html body
+  background-color= !body_bg
+  color= !body_color
+  a
+    color= !link_color
+
+#header
+  background-color= !header_bg
+  border-bottom= "1px solid" !header_border
+  padding: 20px 0
+  a.title
+    font-size= !h3
+    display: inline-block
+    color= !header_nav
+    text-decoration: none
+  #header_nav
+    float: right
+    +horizontal-list
+    a
+      color: #ccc
+    li.alpha a
+      color: #f2f2f2
+
+.page_width
+  width= !page_width
+  margin: 0 auto
+  padding:
+    left: 30px
+    right: 30px
+
+#page
+  background-color= !page_bg
+  border-top= "1px solid" !page_border
+  padding: 25px 0
+
+#subnav
+  +clearfix
+  margin: -25px 0 25px
+  padding: 10px 0
+  background-color= !subnav_bg
+  border-bottom= "1px solid" !subnav_border
+  font-size: 85%
+  #account
+    float: right
+    a
+      color= !subnav_logout_color
+      display: inline-block
+      padding-left: 10px
+      margin-left: 8px
+      border-left= "1px solid" #aaa
+
+#footer
+  font-size= !base_font_size_small
+  clear: both
+  padding: 15px 0
+  color= !footer_color
+  +h-linear-gradient(darken(!body_bg, 25), !body_bg)
+  border-top= "4px solid" !footer_bg
\ No newline at end of file
diff --git a/source/stylesheets/partials/main/_theme.sass b/source/stylesheets/partials/main/_theme.sass
new file mode 100644
index 0000000..6d70f79
--- /dev/null
+++ b/source/stylesheets/partials/main/_theme.sass
@@ -0,0 +1,50 @@
+// Main Section Colors
+!body_color = #333
+!body_bg = #323232
+!test = darken(!body_bg, 20)
+!header_bg = #323232
+!header_border = #181818
+!header_nav = #ddd
+!header_nav_hover = #fff
+!page_border = #fff
+!page_bg = #ececec
+!footer_color = #999
+!footer_bg = #444
+!subnav_bg = #fff
+!subnav_border = #ccc
+!subnav_link_color = #333
+!subnav_logout_color = #777
+
+// Link Colors
+!link_color = #165B94
+
+// Form Colors
+!fieldset_bg = #fff
+!fieldset_border = #c3c3c3
+
+!textinput_color = #333
+!textinput_bg = #f4f4f4
+!textinput_bg_focus = #fefeee
+
+!textinput_border_top = #aaa
+!textinput_border_bottom = #c6c6c6
+!textinput_border_left = #c3c3c3
+!textinput_border_right = #c3c3c3
+!textinput_border_focus = #989898
+
+!cancel_link = #555
+
+// Button Colors
+!default_button_text_color = #fff
+!default_button_bg = yellow
+!blue_btn = desaturate(adjust_hue(!default_button_bg, -16), 25)
+
+// Flash Message Colors
+!flash_notice   	= #00529B
+!flash_notice_bg  = #BDE5F8
+!flash_success    = #4F8A10
+!flash_success_bg = #DFF2BF
+!flash_warning    = #FBF4BD
+!flash_warning_bg = #FBF4BD
+!flash_error      = #D8000C
+!flash_error_bg   = #FFD9DA
\ No newline at end of file
diff --git a/source/stylesheets/print.sass b/source/stylesheets/print.sass
new file mode 100644
index 0000000..e69de29
diff --git a/source/stylesheets/screen.sass b/source/stylesheets/screen.sass
new file mode 100644
index 0000000..51e46f6
--- /dev/null
+++ b/source/stylesheets/screen.sass
@@ -0,0 +1,3 @@
+@import library.sass
+@import partials/base.sass
+@import partials/main.sass
\ No newline at end of file

From f5aca904350a52e108464c7ba641d7a0a0d9d108 Mon Sep 17 00:00:00 2001
From: B Mathis 
Date: Sun, 18 Oct 2009 20:42:54 -0500
Subject: [PATCH 005/715] paramaterized layout and page files

---
 source/_layouts/default.haml |  6 +++++-
 source/atom.haml             | 16 ++++++++++------
 2 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml
index cec5376..4df3c39 100644
--- a/source/_layouts/default.haml
+++ b/source/_layouts/default.haml
@@ -1,3 +1,7 @@
+---
+blog_title: My Blog
+---
+
 !!! 1.1 Transitional
 %html(xmlns="http://www.w3.org/1999/xhtml" xml:lang="en")
   %head
@@ -10,7 +14,7 @@
   %body
     #header
       .page_width
-        %a.title(href="/") My Blog
+        %a.title(href="/")=page.blog_title
         %ul#header_nav.nav
           %li.alpha
             %a(href="/archives") Archives
diff --git a/source/atom.haml b/source/atom.haml
index d8cfe04..67038c1 100644
--- a/source/atom.haml
+++ b/source/atom.haml
@@ -1,16 +1,20 @@
 ---
 layout: nil
+address: http://yoursite.com
+email: author@domain.com
+name: Your Name
+blog_title: My Blog
 ---
 
 %feed(xmlns="http://www.w3.org/2005/Atom")
-  %title Your Name - Your Site
-  %link(href="yoursite.com/atom.xml" rel="self")
-  %link(href="yoursite.com")
+  %title= "#{page.name} - #{page.blog_title}"
+  %link(href="#{page.address}/atom.xml" rel="self")
+  %link(href="#{page.address}")
   %updated= Time.now.xmlschema
-  %id http://yoursite.com/
+  %id=page.address
   %author
-    %name Your Name
-    %email user[at]domain.com
+    %name= page.name
+    %email= page.email
   - site.posts[0..14].each do |post|
     %entry
       %title= rp(post.title)

From a72b96142a3a9c55ef661863484a26bc02103169 Mon Sep 17 00:00:00 2001
From: B Mathis 
Date: Sun, 18 Oct 2009 20:52:00 -0500
Subject: [PATCH 006/715] added rss metadata to layouts

---
 source/_layouts/default.haml | 3 ++-
 source/_layouts/post.haml    | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml
index 4df3c39..08ff656 100644
--- a/source/_layouts/default.haml
+++ b/source/_layouts/default.haml
@@ -10,7 +10,8 @@ blog_title: My Blog
       %meta{:name=>"description", :content=>page.description}/
     - if page.respond_to? :keywords
       %meta{:name=>"keywords", :content=>page.keywords}/
-    %link{:href=>"/stylesheets/screen.css", :rel=>"stylesheet", :media=>"screen, projection", :type=>"text/css"}
+    %link(href="/stylesheets/screen.css" rel="stylesheet" media="screen projection" type="text/css")
+    %link(href="/blog/atom.xml" rel="alternate" title="Brandon Mathis - Design Enthusiast" type="application/atom+xml")
   %body
     #header
       .page_width
diff --git a/source/_layouts/post.haml b/source/_layouts/post.haml
index 4accb53..aafa881 100644
--- a/source/_layouts/post.haml
+++ b/source/_layouts/post.haml
@@ -6,7 +6,8 @@
       %meta{:name=>"description", :content=>page.description}/
     - if page.respond_to? :keywords
       %meta{:name=>"keywords", :content=>page.keywords}/
-    %link{:href=>"/stylesheets/screen.css", :rel=>"stylesheet", :media=>"screen, projection", :type=>"text/css"}
+    %link(href="/stylesheets/screen.css" rel="stylesheet" media="screen projection" type="text/css")
+    %link(href="/blog/atom.xml" rel="alternate" title="Brandon Mathis - Design Enthusiast" type="application/atom+xml")
   %body
     #header
       .page_width

From e0a0d093c44481d1fada3ab4bb9a0c5cf1276524 Mon Sep 17 00:00:00 2001
From: B Mathis 
Date: Tue, 20 Oct 2009 08:50:16 -0500
Subject: [PATCH 007/715] paramaterized feed, rsync deployment, and unified
 layouts

---
 Rakefile                     | 16 ++++++++++++----
 _config.yml                  |  2 +-
 source/_helpers.rb           |  3 ---
 source/_layouts/default.haml | 24 ++++++++++++++++--------
 source/_layouts/post.haml    | 26 --------------------------
 source/atom.haml             | 22 +++++++++++-----------
 6 files changed, 40 insertions(+), 53 deletions(-)
 delete mode 100644 source/_layouts/post.haml

diff --git a/Rakefile b/Rakefile
index d36a84d..04881b3 100644
--- a/Rakefile
+++ b/Rakefile
@@ -1,5 +1,16 @@
 require 'active_support'
 
+# preview project on this port - http://localhost:4000
+port = "4000"
+
+# compiled site directory
+site = "site"
+
+# for rsync deployment
+ssh_user      = "user@host.com"
+document_root = "~/document_root/"
+
+
 def ok_failed(condition)
   if (condition)
     puts "OK"
@@ -8,9 +19,6 @@ def ok_failed(condition)
   end
 end
 
-port = "4000"
-site = "site"
-
 desc "list tasks"
 task :default do
   puts "Tasks: #{(Rake::Task.tasks - [Rake::Task[:default]]).to_sentence}"
@@ -35,7 +43,7 @@ end
 desc "generate and deploy website"
 task :deploy => :generate do
   print "Deploying website..."
-  ok_failed system("rsync -avz --delete #{site}/ user@host.com:~/document_root/")
+  ok_failed system("rsync -avz --delete #{site}/ #{ssh_user}:#{document_root}")
 end
 
 desc "start up an instance of serve on the output files"
diff --git a/_config.yml b/_config.yml
index 43a6460..f4f0f42 100644
--- a/_config.yml
+++ b/_config.yml
@@ -8,4 +8,4 @@ multiviews: true
 sass: false
 haml: true
 post_defaults:
-  layout: post
\ No newline at end of file
+  layout: default
\ No newline at end of file
diff --git a/source/_helpers.rb b/source/_helpers.rb
index bbff39f..0c767f7 100644
--- a/source/_helpers.rb
+++ b/source/_helpers.rb
@@ -178,9 +178,6 @@ module Helpers
     input.gsub(/(href|src)(\s*=\s*)(["'])(\/.*?)\3/) { $1 + $2 + $3 + "http://brandonmathis.com" + $4 + $3 }
   end
   
-  def full_url(input)
-    'http://brandonmathis.com'+input
-  end
   def rp(input)
     RubyPants.new(input).to_html
   end
diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml
index 08ff656..a3f4431 100644
--- a/source/_layouts/default.haml
+++ b/source/_layouts/default.haml
@@ -1,5 +1,6 @@
 ---
-blog_title: My Blog
+blog_title: My Octopress Blog
+root_url: 
 ---
 
 !!! 1.1 Transitional
@@ -7,22 +8,29 @@ blog_title: My Blog
   %head
     %title= page.title
     - if page.respond_to? :description
-      %meta{:name=>"description", :content=>page.description}/
+      %meta(name="description" content="#{page.description}")/
     - if page.respond_to? :keywords
-      %meta{:name=>"keywords", :content=>page.keywords}/
-    %link(href="/stylesheets/screen.css" rel="stylesheet" media="screen projection" type="text/css")
-    %link(href="/blog/atom.xml" rel="alternate" title="Brandon Mathis - Design Enthusiast" type="application/atom+xml")
+      %meta(name="keywords" content="#{page.keywords}")/
+    %link(href="#{page.root_url}/stylesheets/screen.css" rel="stylesheet" media="screen projection" type="text/css")
+    %link(href="#{page.root_url}/atom.xml" rel="alternate" title="##{page.blog_title}" type="application/atom+xml")
   %body
     #header
       .page_width
         %a.title(href="/")=page.blog_title
         %ul#header_nav.nav
           %li.alpha
-            %a(href="/archives") Archives
+            %a(href="#{page.root_url}/archives") Archives
           %li.omega
-            %a(href="/atom.xml") Subscribe
+            %a(href="#{page.root_url}/atom.xml") Subscribe
     #page
       .page_width
-        = content
+        - if page.respond_to? :date
+          %h2= page.title
+          = content
+          %p.pubdate
+            Published:
+            =page.date.strftime("%d %b, %Y")
+        - else
+          = content
     #footer
       .page_width Footer
\ No newline at end of file
diff --git a/source/_layouts/post.haml b/source/_layouts/post.haml
deleted file mode 100644
index aafa881..0000000
--- a/source/_layouts/post.haml
+++ /dev/null
@@ -1,26 +0,0 @@
-!!! 1.1 Transitional
-%html(xmlns="http://www.w3.org/1999/xhtml" xml:lang="en")
-  %head
-    %title= page.title
-    - if page.respond_to? :description
-      %meta{:name=>"description", :content=>page.description}/
-    - if page.respond_to? :keywords
-      %meta{:name=>"keywords", :content=>page.keywords}/
-    %link(href="/stylesheets/screen.css" rel="stylesheet" media="screen projection" type="text/css")
-    %link(href="/blog/atom.xml" rel="alternate" title="Brandon Mathis - Design Enthusiast" type="application/atom+xml")
-  %body
-    #header
-      .page_width
-        %a.title(href="/")My Blog
-        %ul#header_nav.nav
-          %li.alpha
-            %a(href="/") Home
-    #page
-      .page_width
-        %h2= rp(page.title)
-        = content
-        %p.pubdate
-          Published:
-          =page.date.strftime("%d %b, %Y")
-    #footer
-      .page_width Footer
\ No newline at end of file
diff --git a/source/atom.haml b/source/atom.haml
index 67038c1..bcb370f 100644
--- a/source/atom.haml
+++ b/source/atom.haml
@@ -1,25 +1,25 @@
 ---
 layout: nil
-address: http://yoursite.com
+author: Your Name
 email: author@domain.com
-name: Your Name
-blog_title: My Blog
+blog_title: My Octopress Blog
+root_url: http://yoursite.com
 ---
-
+!!! XML
 %feed(xmlns="http://www.w3.org/2005/Atom")
-  %title= "#{page.name} - #{page.blog_title}"
-  %link(href="#{page.address}/atom.xml" rel="self")
-  %link(href="#{page.address}")
+  %title= page.blog_title
+  %link(href="#{page.root_url}/atom.xml" rel="self")
+  %link(href="#{page.root_url}")
   %updated= Time.now.xmlschema
-  %id=page.address
+  %id=page.root_url
   %author
-    %name= page.name
+    %name= page.author
     %email= page.email
   - site.posts[0..14].each do |post|
     %entry
       %title= rp(post.title)
-      %link(href="#{full_url(post.url)}")
+      %link(href="#{page.root_url}#{post.url}")
       %updated=post.date.xmlschema
-      %id= full_url(post.id)
+      %id= "#{page.root_url}#{post.id}"
       %content(type="html")
         = h(absolute_url(rp(post.content)))
\ No newline at end of file

From fd32bcaba026d0e31b3396eb31450b8ac7a15242 Mon Sep 17 00:00:00 2001
From: B Mathis 
Date: Tue, 20 Oct 2009 09:08:12 -0500
Subject: [PATCH 008/715] added auto generated copyright to footer as well as
 credit for Jekyll and Octopress

---
 source/_layouts/default.haml                  | 4 +++-
 source/stylesheets/partials/main/_layout.sass | 2 ++
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml
index a3f4431..b32b026 100644
--- a/source/_layouts/default.haml
+++ b/source/_layouts/default.haml
@@ -33,4 +33,6 @@ root_url:
         - else
           = content
     #footer
-      .page_width Footer
\ No newline at end of file
+      .page_width
+        = "Copyright © #{Time.now.strftime('%Y')} - #{page.blog_title} | "
+        %span.credit Powered by Jekyll & Octopress
\ No newline at end of file
diff --git a/source/stylesheets/partials/main/_layout.sass b/source/stylesheets/partials/main/_layout.sass
index dfc937a..5ad0250 100644
--- a/source/stylesheets/partials/main/_layout.sass
+++ b/source/stylesheets/partials/main/_layout.sass
@@ -36,6 +36,8 @@ html body
   background-color= !page_bg
   border-top= "1px solid" !page_border
   padding: 25px 0
+  .page_width
+    background-color= !page_bg
 
 #subnav
   +clearfix

From 6c8b67d0698d9f3fa984b20ccd53ad196adb3533 Mon Sep 17 00:00:00 2001
From: B Mathis 
Date: Tue, 20 Oct 2009 09:16:14 -0500
Subject: [PATCH 009/715] page titles are now formatted "Title - Blog Title"

---
 source/_layouts/default.haml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml
index b32b026..77bd29e 100644
--- a/source/_layouts/default.haml
+++ b/source/_layouts/default.haml
@@ -6,13 +6,13 @@ root_url:
 !!! 1.1 Transitional
 %html(xmlns="http://www.w3.org/1999/xhtml" xml:lang="en")
   %head
-    %title= page.title
+    %title= "#{page.title} - #{page.blog_title}"
     - if page.respond_to? :description
       %meta(name="description" content="#{page.description}")/
     - if page.respond_to? :keywords
       %meta(name="keywords" content="#{page.keywords}")/
     %link(href="#{page.root_url}/stylesheets/screen.css" rel="stylesheet" media="screen projection" type="text/css")
-    %link(href="#{page.root_url}/atom.xml" rel="alternate" title="##{page.blog_title}" type="application/atom+xml")
+    %link(href="#{page.root_url}/atom.xml" rel="alternate" title="#{page.blog_title}" type="application/atom+xml")
   %body
     #header
       .page_width

From c94e6f531d02e658d96a3b6255bbf424367765e9 Mon Sep 17 00:00:00 2001
From: B Mathis 
Date: Tue, 20 Oct 2009 23:30:52 -0500
Subject: [PATCH 010/715] updated typography, added typography debugging page

---
 source/stylesheets/library/_typography.sass   | 156 ++++++++++++++----
 .../partials/base/_typography.sass            |  26 ++-
 source/stylesheets/partials/main/_layout.sass |   1 +
 source/typography.haml                        | 108 ++++++++++++
 4 files changed, 239 insertions(+), 52 deletions(-)
 create mode 100644 source/typography.haml

diff --git a/source/stylesheets/library/_typography.sass b/source/stylesheets/library/_typography.sass
index 8b2c67c..f013938 100644
--- a/source/stylesheets/library/_typography.sass
+++ b/source/stylesheets/library/_typography.sass
@@ -1,67 +1,151 @@
 !base_font_size ||= 14px
 !base_font_size_small ||= 12px
-!h6 ||= !base_font_size
-!h5 ||= ceil(!h6*1.1)
-!h4 ||= ceil(!h5*1.1)
-!h3 ||= ceil(!h4*1.2)
-!h2 ||= ceil(!h3*1.25)
-!h1 ||= ceil(!h2*1.255)
+!h6 = ceil(!base_font_size*1.3)
+!h5 = ceil(!base_font_size*1.4)
+!h4 = ceil(!base_font_size*1.7)
+!h3 = ceil(!base_font_size*1.9)
+!h2 = ceil(!base_font_size*2.2)
+!h1 = ceil(!base_font_size*2.5)
+
+=heading-font 
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif
+=sans-font
+  font-family: "Lucida Grande", "Lucida Sans Unicode", "Trebuchet MS", Helvetica, Arial, Verdana, sans-serif
+=serif-font
+  font-family: Times, "Times New Roman" Georgia, serif
+=fixed-font
+  font-family: "Menlo", "Bitstream Vera Sans", Monaco, "Andale Mono", "Lucida Console", monospace
+
+=general-typography(!font_size = !base_font_size)
+  +set-heading-sizes(!font_size)
+  +typography-defaults(!font_size)
 
 =set-heading-sizes(!font_size = !base_font_size)
-  !h6 = !font_size
-  !h5 = ceil(!h6*1.1)
-  !h4 = ceil(!h5*1.1)
-  !h3 = ceil(!h4*1.2)
-  !h2 = ceil(!h3*1.25)
-  !h1 = ceil(!h2*1.255)
+  !h6 = ceil(!font_size*1.3)
+  !h5 = ceil(!font_size*1.4)
+  !h4 = ceil(!font_size*1.7)
+  !h3 = ceil(!font_size*1.9)
+  !h2 = ceil(!font_size*2.2)
+  !h1 = ceil(!font_size*2.5)
   h1, h2, h3, h4
     &:first-child
       margin-top: 0
   h1
     font-size= !h1
-    margin-bottom= !h2/2
-    line-height= !h1 * 1.2
+    margin-bottom= !font_size * .765
+    line-height= !h1 * 1.625
   h2
     font-size= !h2
-    margin= !h2/2 0 !h2/2
-    line-height= !h2 * 1.2
+    margin-bottom= !font_size * .855
+    line-height= !h2 * 1.625
   h3
     font-size= !h3
-    margin= !h2/2 0 !h2/2
-    line-height= !h3 * 1.2
+    margin-bottom= !font_size * .956
+    line-height= !h3 * 1.625
   h4
     font-size= !h4
-    margin= !h4/2 0 !h4/2
-    line-height= !h4 * 1.2
+    margin-bottom= !font_size * 1.161
+    line-height= !h4 * 1.625
   h5
     font-size= !h5
-    margin= !h4/2 0 !h4/2
-    line-height= !h5 * 1.2
+    margin-bottom= !font_size * 1.238
+    line-height= !h5 * 1.625
   h6
     font-size= !h6
-    margin= !h4/2 0 !h4/2
-    line-height= !h6 * 1.2
+    margin-bottom= !font_size * 1.625
+    line-height= !h6 * 1.625
 
 =typography-defaults(!font_size = !base_font_size)
-  line-height= ceil(!font_size * 1.5)
+  body
+    line-height= ceil(!font_size * 1.625)
   p
-    padding-bottom= !font_size * 2
-  h1,h2,h3,h4,h5,h6
-    font-weight: bold
-  em
+    +p-style(!font_size)
+  em, dfn
     font-style: italic
-  strong
+  strong, dfn
     font-weight: bold
+  del
+    text-decoration: line-through
   span.highlight, em.highlight, strong.highlight
     background-color: #ff6
     padding: 2px
     margin: 0 -2px
-  ul, ol, dl
-    list-style: inside
-    margin= 0 0 (!font_size)
-  li
-    padding: 0 0 2px
+  ol li
+    list-style: decimal
+  ul, ol
+    list-style: outside
+    margin= 0 0 !font_size * 1.625
+  li ul, li ol
+    margin= 0 0 !font_size * 1.625
+  dl
+    margin= 0 0 !font_size * 1.625
+    dt
+      font-weight: bold
+    dd
+      margin-left= !font_size * 1.625
+  table
+    margin= 0 0 !font_size * 1.625
+    border-collapse: collapse
+    th
+      font-weight: bold
+    tr, th, td
+      margin: 0
+      margin= 0 !font_size * 1.625 0 !font_size
+    tfoot
+      font-style: italic
+    caption
+      text-align: center
+  abbr, acronym
+    border-bottom: 1px dotted
+  address
+    margin-top= !font_size * 1.625
+    font-style: italic
+  
+  blockquote
+    padding= !font_size !font_size !font_size * 1.625 !font_size * 1.4
+    +serif-font
+    font-size= !font_size * 1.2
+    font-style: italic
+    &:before
+      content: "\201C"
+      font-size= !font_size * 3
+      margin= 0 0 0 -.625em
+      position: absolute
+      font-family: Times, Georgia, serif
+      color: #aaa
+      line-height: 0
+    > p
+      padding: 0
+      margin: 0
+  pre, code
+    margin= !font_size * 1.625 0
+    white-space: pre
+  pre, code, tt
+    +fixed-font
+    font-size= !font_size
+    line-height= !font_size * 1.5
+  tt
+    display: block
+    margin= !font_size * 1.625 0
+  hr
+    margin-bottom= !font_size * 1.625
+  
   small
     font-size= floor(!font_size * .85)
   big
-    font-size= floor(!font_size * 1.25)
\ No newline at end of file
+    font-size= floor(!font_size * 1.25)
+
+=p-style(!font_size = !base_font_size)
+  padding-bottom= !font_size * 0.8125
+  img
+    float: left
+    margin:
+      top= !font_size * .5
+      right= !font_size * .8125
+      bottom= !font_size* .8125
+      left= 0
+    padding: 0
+    &.right
+      margin:
+        right= 0
+        left= !font_size * .8125
\ No newline at end of file
diff --git a/source/stylesheets/partials/base/_typography.sass b/source/stylesheets/partials/base/_typography.sass
index 3a607b5..65e0010 100644
--- a/source/stylesheets/partials/base/_typography.sass
+++ b/source/stylesheets/partials/base/_typography.sass
@@ -1,26 +1,20 @@
-!base_font_size = 15px
+!base_font_size = 16px
 !base_font_size_small = 13px
 !default_border_radius = 6px
 
-=heading-font 
-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif
-=sans-font
-  font-family: "Lucida Grande", "Lucida Sans Unicode", "Trebuchet MS", Helvetica, Arial, Verdana, sans-serif
-=serif-font
-  font-family: Baskerville, "Times New Roman", Times, Georgia, serif
-=fixed-font
-  font-family: "Menlo", "Bitstream Vera Sans", Monaco, "Andale Mono", "Lucida Console", monospace
-    
++general-typography
+=heading-font
+  +serif-font
+
 body
   font-size= !base_font_size
-  +set-heading-sizes
-  +typography-defaults
   +sans-font
   
 h1,h2,h3,h4,h5,h6
   color: #333
-  letter-spacing: -1px
   font-weight: bold
-ol li
-  list-style: decimal
-  margin-left: 1.9em
\ No newline at end of file
+  +heading-font
+.quote blockquote
+  font-size= !h4
+  line-height= !h5 * 1.625
+  color: #555
\ No newline at end of file
diff --git a/source/stylesheets/partials/main/_layout.sass b/source/stylesheets/partials/main/_layout.sass
index 5ad0250..0b6bf27 100644
--- a/source/stylesheets/partials/main/_layout.sass
+++ b/source/stylesheets/partials/main/_layout.sass
@@ -14,6 +14,7 @@ html body
   padding: 20px 0
   a.title
     font-size= !h3
+    +heading-font
     display: inline-block
     color= !header_nav
     text-decoration: none
diff --git a/source/typography.haml b/source/typography.haml
new file mode 100644
index 0000000..84746c1
--- /dev/null
+++ b/source/typography.haml
@@ -0,0 +1,108 @@
+---
+layout: default
+title: Typography Debug
+---
+
+%h1 Level 01 Heading
+%h2 Level 02 Heading
+%h3 Level 03 Heading
+%h4 Level 04 Heading
+%h5 Level 05 Heading
+%h6 Level 06 Heading
+
+%p
+  Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Fusce sodales ligula sed urna. Aliquam posuere arcu
+  viverra erat. Pellentesque et enim dapibus ante facilisis bibendum. Nam congue dapibus urna. Vestibulum consequat
+  arcu at magna. Nunc faucibus mollis lacus. Nulla tempor luctus tellus. Donec blandit lobortis pede. Vestibulum
+  vel pede ut urna eleifend lacinia.
+%p
+  Maecenas ligula nibh, imperdiet at, interdum eget, sagittis eu, enim. Vivamus vel urna. Donec fringilla
+  ullamcorper sem. In risus arcu, pellentesque cursus, faucibus cursus, consequat quis, est. Aliquam id erat.
+  Aliquam arcu. Phasellus vulputate. Integer sem diam, mattis vel, viverra ullamcorper, ultricies quis, nisl. Sed
+  sollicitudin quam ut nisi. Vivamus velit sapien, volutpat eu, faucibus id, nonummy id, urna.
+%p
+  Praesent iaculis pellentesque est. Nulla facilisi. Etiam fringilla vehicula orci. Aliquam fermentum ipsum id
+  nulla. Aliquam interdum laoreet leo. Cras accumsan. Nam pharetra diam id nunc. Integer blandit tellus vulputate
+  felis. Cras aliquam, eros in euismod aliquam, enim nisl mollis metus, quis fringilla ipsum diam ut pede. Mauris a
+  libero ac velit interdum pulvinar. Nunc ipsum mauris, semper rhoncus, feugiat ut, egestas id, diam. Nullam
+  porttitor condimentum risus. Vivamus nec enim eget nisi commodo euismod. Ut turpis. Nullam malesuada rutrum
+  neque. Nam sodales porta elit. Mauris mollis nisl vel augue.
+
+%h3 Unordered lists
+%ul
+  %li Lorem ipsum dolor sit amet
+  %li Consectetur adipisicing elit
+  %li Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua
+  %li Ut enim ad minim veniam
+
+%h3 Ordered lists
+%ol
+  %li Consectetur adipisicing elit
+  %li Sed do eiusmod tempor incididunt ut labore
+  %li Et dolore magna aliqua
+  
+%h3 Blockquotes
+%blockquote
+  %p
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore
+    magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+    consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+    Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+%h3 Tables
+%table
+  %caption
+    Jimi Hendrix - albums
+    %thead
+      %tr
+        %th Album
+        %th Year
+        %th Price
+    %tfoot
+      %tr
+        %td Album
+        %td Year
+        %td Price
+    %tbody
+      %tr
+        %td Are You Experienced
+        %td 1967
+        %td $10.00
+      %tr
+        %td Axis: Bold as Love
+        %td 1967
+        %td $12.00
+      %tr
+        %td Electric Ladyland
+        %td 1968
+        %td $10.00
+      %tr
+        %td Band of Gypsys
+        %td 1970
+        %td $12.00
+%p
+  %a(href="#")Link
+  %br/
+  %strong <strong>
+  %br/
+  %del <del> deleted
+  %br/
+  %dfn <dfn> dfn
+  %br/
+  %em <em> emphasis
+  %br/
+
+%pre
+  %code
+    <html>
+    <head>
+    </head>
+    <body>
+    <div class = "main"> <div>
+    </body>
+    </html>
+
+%tt
+  <tt>
+  Pellentesque tempor, dui ut ultrices viverra, neque urna blandit nisi, id accumsan dolor est vitae risus.
+%hr
\ No newline at end of file

From 8867d7c5824d86a85dcb2ddfbfca954dc29331c9 Mon Sep 17 00:00:00 2001
From: B Mathis 
Date: Wed, 21 Oct 2009 07:48:31 -0500
Subject: [PATCH 011/715] separated table, p, blockquote, ol, ul, dl styling
 into mixins, added abbr

---
 source/stylesheets/library/_typography.sass   | 106 ++++++++++--------
 .../partials/base/_typography.sass            |   7 ++
 source/typography.haml                        |   1 +
 3 files changed, 70 insertions(+), 44 deletions(-)

diff --git a/source/stylesheets/library/_typography.sass b/source/stylesheets/library/_typography.sass
index f013938..e532f67 100644
--- a/source/stylesheets/library/_typography.sass
+++ b/source/stylesheets/library/_typography.sass
@@ -1,5 +1,6 @@
 !base_font_size ||= 14px
 !base_font_size_small ||= 12px
+!base_font_color ||= #333
 !h6 = ceil(!base_font_size*1.3)
 !h5 = ceil(!base_font_size*1.4)
 !h4 = ceil(!base_font_size*1.7)
@@ -58,8 +59,19 @@
 =typography-defaults(!font_size = !base_font_size)
   body
     line-height= ceil(!font_size * 1.625)
+    color= !base_font_color
   p
     +p-style(!font_size)
+  table
+    +table-style(!font_size)
+  ol
+    +ol-style(!font_size)
+  ul
+    +ul-style(!font_size)
+  dl
+    +dl-style(!font_size)
+  blockquote
+    +quote-style
   em, dfn
     font-style: italic
   strong, dfn
@@ -70,59 +82,17 @@
     background-color: #ff6
     padding: 2px
     margin: 0 -2px
-  ol li
-    list-style: decimal
-  ul, ol
-    list-style: outside
-    margin= 0 0 !font_size * 1.625
-  li ul, li ol
-    margin= 0 0 !font_size * 1.625
-  dl
-    margin= 0 0 !font_size * 1.625
-    dt
-      font-weight: bold
-    dd
-      margin-left= !font_size * 1.625
-  table
-    margin= 0 0 !font_size * 1.625
-    border-collapse: collapse
-    th
-      font-weight: bold
-    tr, th, td
-      margin: 0
-      margin= 0 !font_size * 1.625 0 !font_size
-    tfoot
-      font-style: italic
-    caption
-      text-align: center
   abbr, acronym
     border-bottom: 1px dotted
+    cursor: help
   address
     margin-top= !font_size * 1.625
     font-style: italic
-  
-  blockquote
-    padding= !font_size !font_size !font_size * 1.625 !font_size * 1.4
-    +serif-font
-    font-size= !font_size * 1.2
-    font-style: italic
-    &:before
-      content: "\201C"
-      font-size= !font_size * 3
-      margin= 0 0 0 -.625em
-      position: absolute
-      font-family: Times, Georgia, serif
-      color: #aaa
-      line-height: 0
-    > p
-      padding: 0
-      margin: 0
   pre, code
     margin= !font_size * 1.625 0
     white-space: pre
   pre, code, tt
     +fixed-font
-    font-size= !font_size
     line-height= !font_size * 1.5
   tt
     display: block
@@ -135,6 +105,41 @@
   big
     font-size= floor(!font_size * 1.25)
 
+=ol-style(!font_size = !base_font_size)
+  list-style: outside
+  margin= 0 0 !font_size * 1.625
+  li
+    list-style: decimal
+    ol
+      margin= 0 0 !font_size * 1.625
+      
+=ul-style(!font_size = !base_font_size)
+  list-style: outside
+  margin= 0 0 !font_size * 1.625
+  li ul
+    margin= 0 0 !font_size * 1.625
+    
+=dl-style(!font_size = !base_font_size)
+  margin= 0 0 !font_size * 1.625
+  dt
+    font-weight: bold
+  dd
+    margin-left= !font_size * 1.625
+
+=quote-style(!font_size = !base_font_size)
+  padding= !font_size !font_size !font_size * 1.625 !font_size * 1.4
+  &:before
+    content: "\201C"
+    font-size= !font_size * 3
+    margin= 0 0 0 -.625em
+    position: absolute
+    font-family: Times, Georgia, serif
+    color: #aaa
+    line-height: 0
+  > p
+    padding: 0
+    margin: 0
+    
 =p-style(!font_size = !base_font_size)
   padding-bottom= !font_size * 0.8125
   img
@@ -148,4 +153,17 @@
     &.right
       margin:
         right= 0
-        left= !font_size * .8125
\ No newline at end of file
+        left= !font_size * .8125
+
+=table-style(!font_size = !base_font_size)
+  margin= 0 0 !font_size * 1.625
+  border-collapse: collapse
+  th
+    font-weight: bold
+  tr, th, td
+    margin: 0
+    padding= 0 !font_size * 1.625 0 !font_size
+  tfoot
+    font-style: italic
+  caption
+    text-align: center
\ No newline at end of file
diff --git a/source/stylesheets/partials/base/_typography.sass b/source/stylesheets/partials/base/_typography.sass
index 65e0010..b5fcd56 100644
--- a/source/stylesheets/partials/base/_typography.sass
+++ b/source/stylesheets/partials/base/_typography.sass
@@ -1,10 +1,13 @@
 !base_font_size = 16px
 !base_font_size_small = 13px
+!base_font_color = #333
 !default_border_radius = 6px
 
 +general-typography
 =heading-font
   +serif-font
+=quote-font
+  +serif-font
 
 body
   font-size= !base_font_size
@@ -14,6 +17,10 @@ h1,h2,h3,h4,h5,h6
   color: #333
   font-weight: bold
   +heading-font
+
+blockquote
+  +heading-font
+  font-size= !base_font_size * 1.2
 .quote blockquote
   font-size= !h4
   line-height= !h5 * 1.625
diff --git a/source/typography.haml b/source/typography.haml
index 84746c1..885758c 100644
--- a/source/typography.haml
+++ b/source/typography.haml
@@ -27,6 +27,7 @@ title: Typography Debug
   libero ac velit interdum pulvinar. Nunc ipsum mauris, semper rhoncus, feugiat ut, egestas id, diam. Nullam
   porttitor condimentum risus. Vivamus nec enim eget nisi commodo euismod. Ut turpis. Nullam malesuada rutrum
   neque. Nam sodales porta elit. Mauris mollis nisl vel augue.
+  %abbr(title="For The Win!") FTW!
 
 %h3 Unordered lists
 %ul

From f17271f6e2a237ab2aa80088caf872933cea3ffb Mon Sep 17 00:00:00 2001
From: B Mathis 
Date: Wed, 21 Oct 2009 08:21:05 -0500
Subject: [PATCH 012/715] support for sub, sup, and q elements

---
 source/stylesheets/library/_typography.sass | 8 ++++++++
 source/typography.haml                      | 8 ++++++++
 2 files changed, 16 insertions(+)

diff --git a/source/stylesheets/library/_typography.sass b/source/stylesheets/library/_typography.sass
index e532f67..a1b5c63 100644
--- a/source/stylesheets/library/_typography.sass
+++ b/source/stylesheets/library/_typography.sass
@@ -72,6 +72,12 @@
     +dl-style(!font_size)
   blockquote
     +quote-style
+  q
+    font-style: italic
+    &:before
+      content: "\201C"
+    &:after
+      content: "\201D"
   em, dfn
     font-style: italic
   strong, dfn
@@ -97,6 +103,8 @@
   tt
     display: block
     margin= !font_size * 1.625 0
+  sub, sup
+    line-height: 0
   hr
     margin-bottom= !font_size * 1.625
   
diff --git a/source/typography.haml b/source/typography.haml
index 885758c..4f7c2e3 100644
--- a/source/typography.haml
+++ b/source/typography.haml
@@ -21,13 +21,21 @@ title: Typography Debug
   Aliquam arcu. Phasellus vulputate. Integer sem diam, mattis vel, viverra ullamcorper, ultricies quis, nisl. Sed
   sollicitudin quam ut nisi. Vivamus velit sapien, volutpat eu, faucibus id, nonummy id, urna.
 %p
+  Take it2 to the power of3
   Praesent iaculis pellentesque est. Nulla facilisi. Etiam fringilla vehicula orci. Aliquam fermentum ipsum id
   nulla. Aliquam interdum laoreet leo. Cras accumsan. Nam pharetra diam id nunc. Integer blandit tellus vulputate
   felis. Cras aliquam, eros in euismod aliquam, enim nisl mollis metus, quis fringilla ipsum diam ut pede. Mauris a
   libero ac velit interdum pulvinar. Nunc ipsum mauris, semper rhoncus, feugiat ut, egestas id, diam. Nullam
   porttitor condimentum risus. Vivamus nec enim eget nisi commodo euismod. Ut turpis. Nullam malesuada rutrum
   neque. Nam sodales porta elit. Mauris mollis nisl vel augue.
+
+%p
+  And we were like Woah, and he was like Woah, and they were like WOAH!
+
+%p
   %abbr(title="For The Win!") FTW!
+%p
+  
 
 %h3 Unordered lists
 %ul

From 77bb406a9344eb669bf33b951e6156de62094b58 Mon Sep 17 00:00:00 2001
From: B Mathis 
Date: Wed, 21 Oct 2009 11:39:53 -0500
Subject: [PATCH 013/715] improved layout styling, added about page, added
 archive page link to footer

---
 source/_layouts/default.haml                  |  10 +-
 source/about.haml                             |  12 +++
 source/images/rss.png                         | Bin 0 -> 6905 bytes
 source/index.haml                             |   7 +-
 source/stylesheets/partials/main/_layout.sass |  95 ++++++++++++------
 source/stylesheets/partials/main/_theme.sass  |  21 ++--
 6 files changed, 103 insertions(+), 42 deletions(-)
 create mode 100644 source/about.haml
 create mode 100644 source/images/rss.png

diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml
index 77bd29e..ceadff3 100644
--- a/source/_layouts/default.haml
+++ b/source/_layouts/default.haml
@@ -17,10 +17,14 @@ root_url:
     #header
       .page_width
         %a.title(href="/")=page.blog_title
-        %ul#header_nav.nav
+    #nav
+      .page_width
+        %ul
           %li.alpha
-            %a(href="#{page.root_url}/archives") Archives
+            %a(href="#{page.root_url}/") Blog
           %li.omega
+            %a(href="#{page.root_url}/about") About
+          %li.subscribe
             %a(href="#{page.root_url}/atom.xml") Subscribe
     #page
       .page_width
@@ -35,4 +39,4 @@ root_url:
     #footer
       .page_width
         = "Copyright © #{Time.now.strftime('%Y')} - #{page.blog_title} | "
-        %span.credit Powered by Jekyll & Octopress
\ No newline at end of file
+        %span.credit Powered by Octopress
\ No newline at end of file
diff --git a/source/about.haml b/source/about.haml
new file mode 100644
index 0000000..bc272eb
--- /dev/null
+++ b/source/about.haml
@@ -0,0 +1,12 @@
+---
+layout: default
+title: About Me
+---
+:markdown
+  # About Me
+
+  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.
+
+  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.
+
+  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.
\ No newline at end of file
diff --git a/source/images/rss.png b/source/images/rss.png
new file mode 100644
index 0000000000000000000000000000000000000000..723559bc4bf35a481342c96a11c5e5ca258f641b
GIT binary patch
literal 6905
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

literal 0
HcmV?d00001

diff --git a/source/index.haml b/source/index.haml
index 12afdcf..a244f7e 100644
--- a/source/index.haml
+++ b/source/index.haml
@@ -4,5 +4,8 @@ title: Blog
 ---
 .blog
   - site.posts.sort_by(&:date).reverse[0..9].each_with_index do |post,index|
-    %h2= link_to(post.title, post.url, {:class=>"title"})
-    .article= post.content
\ No newline at end of file
+    .article
+      %h2= link_to(post.title, post.url, {:class=>"title"})
+      = post.content
+  .footer
+    %a(href="/archives.html" title="archives") « Blog Archives
\ No newline at end of file
diff --git a/source/stylesheets/partials/main/_layout.sass b/source/stylesheets/partials/main/_layout.sass
index 0b6bf27..3fbb3f9 100644
--- a/source/stylesheets/partials/main/_layout.sass
+++ b/source/stylesheets/partials/main/_layout.sass
@@ -1,4 +1,5 @@
 !page_width = 560px
+!sidebar_width = 0
 !pad = 15px
 !default_border_radius = 4px
 
@@ -8,23 +9,63 @@ html body
   a
     color= !link_color
 
+#footer a
+  color= #ddd
+  &:hover
+    color = #fff
 #header
   background-color= !header_bg
   border-bottom= "1px solid" !header_border
-  padding: 20px 0
+  padding: 30px 0
   a.title
-    font-size= !h3
+    font-size= !h1
     +heading-font
     display: inline-block
-    color= !header_nav
+    color= !title_color
     text-decoration: none
-  #header_nav
-    float: right
+
+#nav
+  +clearfix
+  position: relative
+  z-index: 1
+  padding: 6px 0
+  background:
+    color= !nav_bg
+    image: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#ddd), color-stop(0.3, #f4f4f4))
+    image: -moz-linear-gradient(left top, left bottom, from(#fcfcfc), to(#ddd), color-stop(0.3, #f4f4f4))
+  border:
+    top= "1px solid" !nav_border_top
+    bottom= "1px solid" !nav_border_bottom
+  ul
+    position: relative
     +horizontal-list
-    a
-      color: #ccc
-    li.alpha a
-      color: #f2f2f2
+    margin: 0 auto
+    overflow: visible
+    li
+      padding: 0 15px
+      border-left: 1px solid #d3d3d3
+      border-right: 1px solid #f4f4f4
+      &.alpha
+        border-left: none
+        padding-left: 0
+      &.omega
+        border-right: 0
+      &.subscribe
+        position: absolute
+        right: 0
+        //left= !page_width - 25px
+        border: none
+        a
+          display: inline-block
+          padding-left: 28px
+          background: url("/images/rss.png") left top no-repeat
+      a
+        display: inline-block
+        color= !nav_color
+        line-height: 150%
+        text-decoration: none
+        &:hover
+          color= !nav_color_hover
 
 .page_width
   width= !page_width
@@ -35,31 +76,27 @@ html body
 
 #page
   background-color= !page_bg
-  border-top= "1px solid" !page_border
-  padding: 25px 0
   .page_width
-    background-color= !page_bg
+    padding:
+      top: 25px
+      bottom: 25px
+    background-color= !content_bg
+    +box-shadow(#ccc)
+  .article
+    padding= !base_font_size * 1.5 0 !base_font_size * 1.5
+    border-bottom= "1px solid" !article_border
+    &:first-child
+      padding-top: 0
+  .blog .footer
+    padding-top= !base_font_size
 
-#subnav
-  +clearfix
-  margin: -25px 0 25px
-  padding: 10px 0
-  background-color= !subnav_bg
-  border-bottom= "1px solid" !subnav_border
-  font-size: 85%
-  #account
-    float: right
-    a
-      color= !subnav_logout_color
-      display: inline-block
-      padding-left: 10px
-      margin-left: 8px
-      border-left= "1px solid" #aaa
 
 #footer
+  position: relative
+  z-index: 2
   font-size= !base_font_size_small
   clear: both
-  padding: 15px 0
+  padding= !base_font_size * 1.5 0
   color= !footer_color
   +h-linear-gradient(darken(!body_bg, 25), !body_bg)
-  border-top= "4px solid" !footer_bg
\ No newline at end of file
+  border-top= "14px solid" !footer_bg
\ No newline at end of file
diff --git a/source/stylesheets/partials/main/_theme.sass b/source/stylesheets/partials/main/_theme.sass
index 6d70f79..2feff31 100644
--- a/source/stylesheets/partials/main/_theme.sass
+++ b/source/stylesheets/partials/main/_theme.sass
@@ -1,19 +1,24 @@
 // Main Section Colors
 !body_color = #333
 !body_bg = #323232
-!test = darken(!body_bg, 20)
+
 !header_bg = #323232
 !header_border = #181818
-!header_nav = #ddd
-!header_nav_hover = #fff
+!title_color = #ddd
+
+!nav_color = #555
+!nav_color_hover = #000
+!nav_bg = #e8e8e8
+!nav_border_top = #fff
+!nav_border_bottom = #aaa
+
 !page_border = #fff
-!page_bg = #ececec
+!page_bg = #f0f0f0
+!article_border = #eee
+!content_bg = #fff
+
 !footer_color = #999
 !footer_bg = #444
-!subnav_bg = #fff
-!subnav_border = #ccc
-!subnav_link_color = #333
-!subnav_logout_color = #777
 
 // Link Colors
 !link_color = #165B94

From 80a70068ed7fda704c769e123c77bb8c78c7d9a3 Mon Sep 17 00:00:00 2001
From: B Mathis 
Date: Wed, 21 Oct 2009 12:15:33 -0500
Subject: [PATCH 014/715] updated about page to explain markdown filter, added
 more theme colors

---
 source/about.haml                             |  1 +
 source/stylesheets/partials/main/_layout.sass | 12 +++++---
 source/stylesheets/partials/main/_theme.sass  | 28 ++++++++-----------
 source/typography.haml                        |  1 -
 4 files changed, 20 insertions(+), 22 deletions(-)

diff --git a/source/about.haml b/source/about.haml
index bc272eb..0a5e431 100644
--- a/source/about.haml
+++ b/source/about.haml
@@ -2,6 +2,7 @@
 layout: default
 title: About Me
 ---
+/ use the :mardown filter if you want to write pages with Markdown
 :markdown
   # About Me
 
diff --git a/source/stylesheets/partials/main/_layout.sass b/source/stylesheets/partials/main/_layout.sass
index 3fbb3f9..31548d6 100644
--- a/source/stylesheets/partials/main/_layout.sass
+++ b/source/stylesheets/partials/main/_layout.sass
@@ -43,8 +43,8 @@ html body
     overflow: visible
     li
       padding: 0 15px
-      border-left: 1px solid #d3d3d3
-      border-right: 1px solid #f4f4f4
+      border-left= "1px solid" !nav_border_left
+      border-right= "1px solid" !nav_border_right
       &.alpha
         border-left: none
         padding-left: 0
@@ -80,14 +80,18 @@ html body
     padding:
       top: 25px
       bottom: 25px
-    background-color= !content_bg
+    background-color= !blog_bg
     +box-shadow(#ccc)
+    border:
+      left= "1px solid" !page_border_sides
+      right= "1px solid" !page_border_sides
+.blog
   .article
     padding= !base_font_size * 1.5 0 !base_font_size * 1.5
     border-bottom= "1px solid" !article_border
     &:first-child
       padding-top: 0
-  .blog .footer
+  .footer
     padding-top= !base_font_size
 
 
diff --git a/source/stylesheets/partials/main/_theme.sass b/source/stylesheets/partials/main/_theme.sass
index 2feff31..b159019 100644
--- a/source/stylesheets/partials/main/_theme.sass
+++ b/source/stylesheets/partials/main/_theme.sass
@@ -1,3 +1,6 @@
+// Link Colors
+!link_color = #165B94
+
 // Main Section Colors
 !body_color = #333
 !body_bg = #323232
@@ -11,20 +14,21 @@
 !nav_bg = #e8e8e8
 !nav_border_top = #fff
 !nav_border_bottom = #aaa
+!nav_border_left = #ccc
+!nav_border_right = #fff
 
-!page_border = #fff
+!page_border_sides = #ccc
 !page_bg = #f0f0f0
+
+// Blog 
 !article_border = #eee
-!content_bg = #fff
+!blog_bg = #fff
 
 !footer_color = #999
 !footer_bg = #444
 
-// Link Colors
-!link_color = #165B94
-
 // Form Colors
-!fieldset_bg = #fff
+!fieldset_bg = #ececec
 !fieldset_border = #c3c3c3
 
 !textinput_color = #333
@@ -42,14 +46,4 @@
 // Button Colors
 !default_button_text_color = #fff
 !default_button_bg = yellow
-!blue_btn = desaturate(adjust_hue(!default_button_bg, -16), 25)
-
-// Flash Message Colors
-!flash_notice   	= #00529B
-!flash_notice_bg  = #BDE5F8
-!flash_success    = #4F8A10
-!flash_success_bg = #DFF2BF
-!flash_warning    = #FBF4BD
-!flash_warning_bg = #FBF4BD
-!flash_error      = #D8000C
-!flash_error_bg   = #FFD9DA
\ No newline at end of file
+!blue_btn = desaturate(adjust_hue(!default_button_bg, -16), 25)
\ No newline at end of file
diff --git a/source/typography.haml b/source/typography.haml
index 4f7c2e3..f7e7b17 100644
--- a/source/typography.haml
+++ b/source/typography.haml
@@ -36,7 +36,6 @@ title: Typography Debug
   %abbr(title="For The Win!") FTW!
 %p
   
-
 %h3 Unordered lists
 %ul
   %li Lorem ipsum dolor sit amet

From 5c736f5eb03d7b51defe27ac027124557c4c7a3b Mon Sep 17 00:00:00 2001
From: B Mathis 
Date: Fri, 30 Oct 2009 00:31:02 -0500
Subject: [PATCH 015/715] added twitter feed to sidebar, moved to compass-edge
 gem

---
 config.rb                                     |   1 +
 source/_layouts/default.haml                  |  30 +-
 source/javascripts/jsonp.js                   |   3 +
 source/javascripts/mootools-yui-compressed.js | 356 ++++++++++++++++++
 source/javascripts/twitter.js                 |  57 +++
 source/javascripts/twitter_gitter.js          |  57 +++
 source/stylesheets/_library.sass              |   2 +-
 source/stylesheets/library/_box_shadow.sass   |  10 -
 .../stylesheets/library/_easy_box_shadow.sass |   8 +
 source/stylesheets/partials/_main.sass        |   2 +-
 source/stylesheets/partials/main/_layout.sass |  21 +-
 .../stylesheets/partials/main/_twitter.sass   |   2 +
 12 files changed, 522 insertions(+), 27 deletions(-)
 create mode 100644 source/javascripts/jsonp.js
 create mode 100644 source/javascripts/mootools-yui-compressed.js
 create mode 100644 source/javascripts/twitter.js
 create mode 100644 source/javascripts/twitter_gitter.js
 delete mode 100644 source/stylesheets/library/_box_shadow.sass
 create mode 100644 source/stylesheets/library/_easy_box_shadow.sass
 create mode 100644 source/stylesheets/partials/main/_twitter.sass

diff --git a/config.rb b/config.rb
index 6c61491..1d7be82 100644
--- a/config.rb
+++ b/config.rb
@@ -1,4 +1,5 @@
 # Require any additional compass plugins here.
+#require 'compass-colors'
 project_type = :stand_alone
 # Set this to the root of your project when deployed:
 http_path = "/"
diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml
index ceadff3..481791c 100644
--- a/source/_layouts/default.haml
+++ b/source/_layouts/default.haml
@@ -11,8 +11,13 @@ root_url:
       %meta(name="description" content="#{page.description}")/
     - if page.respond_to? :keywords
       %meta(name="keywords" content="#{page.keywords}")/
-    %link(href="#{page.root_url}/stylesheets/screen.css" rel="stylesheet" media="screen projection" type="text/css")
-    %link(href="#{page.root_url}/atom.xml" rel="alternate" title="#{page.blog_title}" type="application/atom+xml")
+    %link(href="/stylesheets/screen.css" rel="stylesheet" media="screen projection" type="text/css")
+    %link(href="/atom.xml" rel="alternate" title="#{page.blog_title}" type="application/atom+xml")
+    /%script(src="http://ajax.googleapis.com/ajax/libs/mootools/1.2.3/mootools-yui-compressed.js" type="text/javascript")/
+    %script(src="/javascripts/mootools-yui-compressed.js" type="text/javascript")
+    %script(src="/javascripts/jsonp.js" type="text/javascript")
+    %script(src="/javascripts/twitter_gitter.js" type="text/javascript")
+    %script(src="/javascripts/twitter.js" type="text/javascript")
   %body
     #header
       .page_width
@@ -28,14 +33,19 @@ root_url:
             %a(href="#{page.root_url}/atom.xml") Subscribe
     #page
       .page_width
-        - if page.respond_to? :date
-          %h2= page.title
-          = content
-          %p.pubdate
-            Published:
-            =page.date.strftime("%d %b, %Y")
-        - else
-          = content
+        #main
+          - if page.respond_to? :date
+            %h2= page.title
+            = content
+            %p.pubdate
+              Published:
+              =page.date.strftime("%d %b, %Y")
+          - else
+            = content
+        #sidebar
+          #twitter
+            #twitter_status
+              Status updating...
     #footer
       .page_width
         = "Copyright © #{Time.now.strftime('%Y')} - #{page.blog_title} | "
diff --git a/source/javascripts/jsonp.js b/source/javascripts/jsonp.js
new file mode 100644
index 0000000..94b30bf
--- /dev/null
+++ b/source/javascripts/jsonp.js
@@ -0,0 +1,3 @@
+/*MooTools, My Object Oriented Javascript Tools. Copyright (c) 2006-2007 Valerio Proietti, , MIT Style License.||Clientcide Copyright (c) 2006-2008, http://www.clientcide.com/wiki/cnet-libraries#license*/
+
+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})}});
\ No newline at end of file
diff --git a/source/javascripts/mootools-yui-compressed.js b/source/javascripts/mootools-yui-compressed.js
new file mode 100644
index 0000000..e4e214b
--- /dev/null
+++ b/source/javascripts/mootools-yui-compressed.js
@@ -0,0 +1,356 @@
+//MooTools, , My Object Oriented (JavaScript) Tools. Copyright (c) 2006-2009 Valerio Proietti, , MIT Style License.
+
+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;
+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"};
+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;
+}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);
+}}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);
+}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);
+return b.prototype[c].apply(d.shift(),d);};}};Native.implement=function(d,c){for(var b=0,a=d.length;b-1:this.indexOf(a)>-1;},trim:function(){return this.replace(/^\s+|\s+$/g,"");},clean:function(){return this.replace(/\s+/g," ").trim();
+},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());
+});},capitalize:function(){return this.replace(/\b[a-z]/g,function(a){return a.toUpperCase();});},escapeRegExp:function(){return this.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1");
+},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})$/);
+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="";
+var c=this.replace(/]*>([\s\S]*?)<\/script>/gi,function(){a+=arguments[1]+"\n";return"";});if(b===true){$exec(a);}else{if($type(b)=="function"){b(a,c);
+}}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]:"";
+});}});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;
+},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);
+},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;
+},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);
+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));
+},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;
+}}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=[];
+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=[];
+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;
+});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"});
+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;
+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;
+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;
+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};
+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;
+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;
+}}}}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});
+}});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();
+},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();
+}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;
+}this._current=$empty;var c=(this.initialize)?this.initialize.apply(this,arguments):this;delete this._current;delete this.caller;return c;}.extend(this);
+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);
+}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]);
+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;
+},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.');
+}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});
+}});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);
+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];
+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;
+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.');
+}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);
+},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;
+},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]||[];
+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);
+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);
+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]);
+}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]);
+}}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));
+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]);
+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);
+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;
+if(Array[a]){return;}Elements.implement(a,function(){var c=[],g=true;for(var e=0,d=this.length;e";}return document.id(this.createElement(a)).set(b);},newTextNode:function(a){return this.createTextNode(a);
+},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;
+},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);
+}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;
+};})()});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);
+}var f=[];var c=Array.flatten(arguments);for(var d=0,b=c.length;d1);a.each(function(e){var f=this.getElementsByTagName(e.trim());(b)?c.extend(f):c=f;
+},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"};
+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);
+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;
+}}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);
+}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);
+}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"};
+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"];
+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);
+}},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);
+},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));
+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]);
+}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);
+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);
+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);
+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);
+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];
+(l)?this[l]=(l&&b[m])?false:"":this.removeAttribute(m);return this;},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this;
+},hasClass:function(l){return this.className.contains(l," ");},addClass:function(l){if(!this.hasClass(l)){this.className=(this.className+" "+l).clean();
+}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);
+},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);
+},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);
+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);
+},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);
+},getFirst:function(l,m){return j(this,"nextSibling","firstChild",l,false,m);},getLast:function(l,m){return j(this,"previousSibling","lastChild",l,false,m);
+},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);
+},getChildren:function(l,m){return j(this,"nextSibling","firstChild",l,true,m);},getWindow:function(){return this.ownerDocument.window;},getDocument:function(){return this.ownerDocument;
+},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;
+}}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()];
+}var l=this.getDocument().defaultView.getComputedStyle(this,null);return(l)?l.getPropertyValue([m.hyphenate()]):null;},toQueryString:function(){var l=[];
+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;
+}):((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));
+}});});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();
+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()];
+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);
+},destroy:function(){Element.empty(this);Element.dispose(this);g(this,true);return null;},empty:function(){$A(this.childNodes).each(function(l){Element.destroy(l);
+});return this;},dispose:function(){return(this.parentNode)?this.parentNode.removeChild(this):this;},hasChild:function(l){l=document.id(l,true);if(!l){return false;
+}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);
+},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;
+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);
+}return this;},removeListener:function(m,l){if(this.removeEventListener){this.removeEventListener(m,l,false);}else{this.detachEvent("on"+m,l);}return this;
+},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;
+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;
+},get:function(){return this.style.cssText;},erase:function(){this.style.cssText="";}};Element.Properties.tag={get:function(){return this.tagName.toLowerCase();
+}};Element.Properties.html=(function(){var c=document.createElement("div");var a={table:[1,"","
"],select:[1,""],tbody:[2,"","
"],tr:[3,"","
"]}; +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]; +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; +}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); +}};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; +}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); +}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()); +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; +}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); +}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; +},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; +}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; +},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})(); +},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); +}}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}; +(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)); +};Element.Events=new Hash({mouseenter:{base:"mouseover",condition:a},mouseleave:{base:"mouseout",condition:a},mousewheel:{base:(Browser.Engine.gecko)?"DOMMouseScroll":"mousewheel"}}); +})();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"; +}}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+")"; +}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); +},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"; +}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; +}).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"); +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; +}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,]+\)/); +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; +b.each(function(h){d+=this.getStyle("border-"+h+"-width").toInt()+this.getStyle("padding-"+h).toInt();},this);return this["offset"+g.capitalize()]-d+"px"; +}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]); +}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:"@"}); +Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};["Top","Right","Bottom","Left"].each(function(g){var f=Element.ShortStyles; +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"; +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); +}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}; +},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(); +}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; +}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; +}}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"); +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; +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); +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}; +}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}; +},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}; +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")}; +},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(); +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); +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)}; +},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}; +}});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"); +}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; +}})();Element.alias("setPosition","position");Native.implement([Window,Document,Element],{getHeight:function(){return this.getSize().y;},getWidth:function(){return this.getSize().x; +},getScrollTop:function(){return this.getScroll().y;},getScrollLeft:function(){return this.getScroll().x;},getScrollHeight:function(){return this.getScrollSize().y; +},getScrollWidth:function(){return this.getScrollSize().x;},getTop:function(){return this.getPosition().y;},getLeft:function(){return this.getPosition().x; +}});Native.implement([Document,Element],{getElements:function(h,g){h=h.split(",");var c,e={};for(var d=0,b=h.length;d1),cash:!g});}});Element.implement({match:function(b){if(!b||(b==this)){return true; +}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); +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)}; +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]; +}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; +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"}; +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"}; +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]; +}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); +}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}); +}}}}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; +}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]; +},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; +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]; +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); +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); +return":)"+i;}).split(":)");var p,e,A;for(var z=0,v=c.length;z":function(h,g,j,a,f){var c=Selectors.Utils.getByTagAndID(g,j,a);for(var e=0,d=c.length;ea){return false;}}return(c==a);},even:function(b,a){return Selectors.Pseudo["nth-child"].call(this,"2n+1",a); +},odd:function(b,a){return Selectors.Pseudo["nth-child"].call(this,"2n",a);},selected:function(){return this.selected;},enabled:function(){return(this.disabled===false); +}});Element.Events.domready={onAdd:function(a){if(Browser.loaded){a.call(this);}}};(function(){var b=function(){if(Browser.loaded){return;}Browser.loaded=true; +window.fireEvent("domready");document.fireEvent("domready");};if(Browser.Engine.trident){var a=document.createElement("div");(function(){($try(function(){a.doScroll(); +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); +})();}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); +},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())+"]"; +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); +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; +}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; +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; +}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"; +}this.options.document.cookie=this.key+"="+b;return this;},read:function(){var a=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)"); +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); +};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; +},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); +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); +};})(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"; +e.movie=l;}else{h.type="application/x-shockwave-flash";h.data=l;}var j=''; +}}j+="";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); +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)); +}});Swiff.CallBacks={};Swiff.remote=function(obj,fn){var rs=obj.CallFunction(''+__flash__argumentsToXML(arguments,2)+""); +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; +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"; +}},getTransition:function(){return function(a){return -(Math.cos(Math.PI*a)-1)/2;};},step:function(){var a=$time();if(a=(7-4*d)/11){e=c*c-Math.pow((11-6*d-11*f)/4,2); +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]); +});});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(); +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; +}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}; +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)); +},processScripts:function(a){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return $exec(a);}return a.stripScripts(this.options.evalScripts); +},success:function(b,a){this.onSuccess(this.processScripts(b),a);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain(); +},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},setHeader:function(a,b){this.headers.set(a,b); +return this;},getHeader:function(a){return $try(function(){return this.xhr.getResponseHeader(a);}.bind(this));},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(k){if(!this.check(k)){return this; +}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(); +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; +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:""; +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; +}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); +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]); +}},this);this.fireEvent("request");this.xhr.send(g);if(!this.options.async){this.onStateChange();}return this;},cancel:function(){if(!this.running){return this; +}this.running=false;this.xhr.abort();this.xhr.onreadystatechange=$empty;this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});(function(){var a={}; +["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(b){a[b]=function(){var c=Array.link(arguments,{url:String.type,data:$defined}); +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(); +}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); +}this.store("send",new Request(this.retrieve("send:options")));}return this.retrieve("send");}};Element.implement({send:function(a){var b=this.get("send"); +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(/]*>([\s\S]*?)<\/body>/i); +c=(b)?b[1]:c;var a=new Element("div");return $try(function(){var d=""+c+"",g;if(Browser.Engine.trident){g=new ActiveXObject("Microsoft.XMLDOM"); +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; +f$1').replace(/(^|\s)@(\w+)/g,'$1@$2').replace(/(^|\s)#(\w+)/g,'$1#$2'); + } +}); \ No newline at end of file diff --git a/source/javascripts/twitter_gitter.js b/source/javascripts/twitter_gitter.js new file mode 100644 index 0000000..788883f --- /dev/null +++ b/source/javascripts/twitter_gitter.js @@ -0,0 +1,57 @@ +/* + Plugin: TwitterGitter + Author: David Walsh + Website: http://davidwalsh.name + Date: 2/21/2009 +*/ + +var TwitterGitter = new Class({ + + //implements + Implements: [Options,Events], + + //options + options: { + count: 2, + sinceID: 1, + link: true, + onRequest: $empty, + onComplete: $empty + }, + + //initialization + initialize: function(username,options) { + //set options + this.setOptions(options); + this.info = {}; + this.username = username; + }, + + //get it! + retrieve: function() { + new JsonP('http://twitter.com/statuses/user_timeline/' + this.username + '.json',{ + data: { + count: this.options.count, + since_id: this.options.sinceID + }, + onRequest: this.fireEvent('request'), + onComplete: function(data) { + //linkify? + if(this.options.link) { + data.each(function(tweet) { tweet.text = this.linkify(tweet.text); },this); + } + //complete! + this.fireEvent('complete',[data,data[0].user]); + }.bind(this) + }).request(); + return this; + }, + + //format + linkify: function(text) { + //courtesy of Jeremy Parrish (rrish.org) + return text.replace(/(https?:\/\/\S+)/gi,'$1').replace(/(^|\s)@(\w+)/g,'$1@$2').replace(/(^|\s)#(\w+)/g,'$1#$2'); + } +}); + + diff --git a/source/stylesheets/_library.sass b/source/stylesheets/_library.sass index 85425cd..a9158ef 100644 --- a/source/stylesheets/_library.sass +++ b/source/stylesheets/_library.sass @@ -1,7 +1,7 @@ @import library/reset.sass @import library/clearfix.sass @import library/border_radius.sass -@import library/box_shadow.sass +@import library/easy_box_shadow.sass @import library/list_borders.sass @import library/typography.sass @import library/link_colors.sass diff --git a/source/stylesheets/library/_box_shadow.sass b/source/stylesheets/library/_box_shadow.sass deleted file mode 100644 index 728a894..0000000 --- a/source/stylesheets/library/_box_shadow.sass +++ /dev/null @@ -1,10 +0,0 @@ -!default_box_shadow_color = #333 -!default_box_shadow_x_offset = 1px -!default_box_shadow_y_offset = 1px -!default_box_shadow_blur_radius = 8px - -=box-shadow(!color = !default_box_shadow_color, !x_offset = !default_box_shadow_x_offset, !y_offset = !default_box_shadow_y_offset, !blur_radius = !default_box_shadow_blur_radius) - box-shadow= !x_offset !y_offset !blur_radius !color - -webkit-box-shadow= !x_offset !y_offset !blur_radius !color - -moz-box-shadow= !x_offset !y_offset !blur_radius !color - \ No newline at end of file diff --git a/source/stylesheets/library/_easy_box_shadow.sass b/source/stylesheets/library/_easy_box_shadow.sass new file mode 100644 index 0000000..437f187 --- /dev/null +++ b/source/stylesheets/library/_easy_box_shadow.sass @@ -0,0 +1,8 @@ +!default_box_shadow_color = #333 +!default_box_shadow_x_offset = 1px +!default_box_shadow_y_offset = 1px +!default_box_shadow_blur_radius = 8px + +=easy-box-shadow(!color = !default_box_shadow_color, !x_offset = !default_box_shadow_x_offset, !y_offset = !default_box_shadow_y_offset, !blur_radius = !default_box_shadow_blur_radius) + +box-shadow(!x_offset, !y_offset, !blur_radius, !color) + \ No newline at end of file diff --git a/source/stylesheets/partials/_main.sass b/source/stylesheets/partials/_main.sass index 4494b8a..374268c 100644 --- a/source/stylesheets/partials/_main.sass +++ b/source/stylesheets/partials/_main.sass @@ -1,4 +1,4 @@ @import main/theme.sass @import main/layout.sass @import main/form.sass -@import main/flash_messages.sass \ No newline at end of file +@import main/twitter.sass \ No newline at end of file diff --git a/source/stylesheets/partials/main/_layout.sass b/source/stylesheets/partials/main/_layout.sass index 31548d6..0275a51 100644 --- a/source/stylesheets/partials/main/_layout.sass +++ b/source/stylesheets/partials/main/_layout.sass @@ -1,5 +1,6 @@ -!page_width = 560px -!sidebar_width = 0 +!page_width = 900px +!sidebar_width = 250px +!sidebar_margin = 30px !pad = 15px !default_border_radius = 4px @@ -52,8 +53,7 @@ html body border-right: 0 &.subscribe position: absolute - right: 0 - //left= !page_width - 25px + left= !page_width - !sidebar_width - !sidebar_margin/2 border: none a display: inline-block @@ -75,16 +75,27 @@ html body right: 30px #page + +clearfix background-color= !page_bg .page_width + +clearfix padding: top: 25px bottom: 25px background-color= !blog_bg - +box-shadow(#ccc) + +easy-box-shadow(#ccc) border: left= "1px solid" !page_border_sides right= "1px solid" !page_border_sides +#main + width= !page_width - !sidebar_width - !sidebar_margin +#sidebar + width= !sidebar_width + margin-left= !sidebar_margin + +#main, #sidebar + float: left + .blog .article padding= !base_font_size * 1.5 0 !base_font_size * 1.5 diff --git a/source/stylesheets/partials/main/_twitter.sass b/source/stylesheets/partials/main/_twitter.sass new file mode 100644 index 0000000..baeef5b --- /dev/null +++ b/source/stylesheets/partials/main/_twitter.sass @@ -0,0 +1,2 @@ +#twitter + font-size: 85% \ No newline at end of file From dafeb04f734622e12ae542e31e350c1b3965b7cc Mon Sep 17 00:00:00 2001 From: B Mathis Date: Sat, 31 Oct 2009 12:52:56 -0500 Subject: [PATCH 016/715] updated rakefile to use FSSM in `rake watch`, generate a sitemap, and moved typography to a debug folder --- Rakefile | 69 +++++++++++++++++++++++++----- source/{ => debug}/typography.haml | 0 2 files changed, 59 insertions(+), 10 deletions(-) rename source/{ => debug}/typography.haml (100%) diff --git a/Rakefile b/Rakefile index 04881b3..3107637 100644 --- a/Rakefile +++ b/Rakefile @@ -1,15 +1,13 @@ require 'active_support' -# preview project on this port - http://localhost:4000 -port = "4000" - -# compiled site directory -site = "site" - -# for rsync deployment -ssh_user = "user@host.com" -document_root = "~/document_root/" +port = "4000" # preview project port eg. http://localhost:4000 +site = "site" # compiled site directory +source = "source" # source file directory +# MUST CHANGE FOR YOUR PROJECT +site_url = "http://yoursite.com" # deployed site url +ssh_user = "user@host.com" # for rsync deployment +document_root = "~/document_root/" # for rsync deployment def ok_failed(condition) if (condition) @@ -34,12 +32,29 @@ end desc "generate website in output directory" task :generate => :clean do puts "Generating website..." - system "compass" system "jekyll" Dir["#{site}/stylesheets/*.sass"].each { |f| rm_rf(f) } + system "compass" system "mv #{site}/atom.html #{site}/atom.xml" end +def rebuild_site(relative) + puts ">>> Change Detected to: #{relative} <<<" + IO.popen('rake generate'){|io| print(io.readpartial(512)) until io.eof?} + puts '>>> Update Complete <<<' +end + +desc "Watch the site and regenerate when it changes" +task :watch do + require 'fssm' + puts ">>> Watching for Changes <<<" + FSSM.monitor("#{File.dirname(__FILE__)}/#{source}", '**/*') do + update {|base, relative| rebuild_site(relative)} + delete {|base, relative| rebuild_site(relative)} + create {|base, relative| rebuild_site(relative)} + end +end + desc "generate and deploy website" task :deploy => :generate do print "Deploying website..." @@ -68,4 +83,38 @@ end desc "preview the site in a web browser" multitask :preview => [:generate, :start_serve] do system "open http://localhost:#{port}" +end + + +desc "Build an XML sitemap of all html files." +task :sitemap => :generate do + html_files = FileList.new("#{site}/**/*.html").map{|f| f[("#{site}".size)..-1]}.map do |f| + if f.ends_with?("index.html") + f[0..(-("index.html".size + 1))] + else + f + end + end.sort_by{|f| f.size} + open("#{site}/sitemap.xml", 'w') do |sitemap| + sitemap.puts %Q{} + sitemap.puts %Q{} + html_files.each do |f| + priority = case f + when %r{^/$} + 1.0 + when %r{^/blog} + 0.9 + else + 0.8 + end + sitemap.puts %Q{ } + sitemap.puts %Q{ #{site_url}#{f}} + sitemap.puts %Q{ #{Time.to_s('%Y-%m-%d')}} + sitemap.puts %Q{ weekly} + sitemap.puts %Q{ #{priority}} + sitemap.puts %Q{ } + end + sitemap.puts %Q{} + puts "Created #{site}/sitemap.xml" + end end \ No newline at end of file diff --git a/source/typography.haml b/source/debug/typography.haml similarity index 100% rename from source/typography.haml rename to source/debug/typography.haml From 58d342b5afafda3e6b114c9b81754ac6e3a3dd18 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Sat, 31 Oct 2009 13:02:47 -0500 Subject: [PATCH 017/715] added README file with some basic description and credits --- README.markdown | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 README.markdown diff --git a/README.markdown b/README.markdown new file mode 100644 index 0000000..83ed09e --- /dev/null +++ b/README.markdown @@ -0,0 +1,13 @@ += What is Octopress? + +Octopress gives developers a well designed starting point for their blog. It's easy to configure and easy to deploy. Sweet huh? + +== Octopress uses +- [Jekyll](http://github.com/henrik/jekyll) a blog aware static site generator (Henrik's fork adds [HAML](http://haml-lang.com) support) +- [Compass](http://compass-style.org) an awesome [SASS](http://sass-lang.com) framework. +- [FSSM](http://github.com/ttilley/fssm/tree/master) + a rake task, automatically regenerates the blog as you work. +- [Serve](http://github.com/jlong/serve) for live previews of the site while in development +- [Rsync](http://samba.anu.edu.au/rsync/) for easy deployment. + += Setup +- add gem install instructions \ No newline at end of file From cc8985df55983b7701acb04e62a24fc4d3c559d7 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Sat, 31 Oct 2009 23:17:29 -0500 Subject: [PATCH 018/715] fixed a few issues with the rakefile, and updated the readme --- README.markdown | 38 +++++++++++++++++++++++++++++++++----- Rakefile | 18 ++++++++++++------ 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/README.markdown b/README.markdown index 83ed09e..a671be8 100644 --- a/README.markdown +++ b/README.markdown @@ -1,13 +1,41 @@ -= What is Octopress? +# What is Octopress? +Octopress gives developers a well designed starting point for a Jekyll blog. It's easy to configure and easy to deploy. Sweet huh? -Octopress gives developers a well designed starting point for their blog. It's easy to configure and easy to deploy. Sweet huh? +## Why? +1. Building a Jekyll blog from scratch is a lot of work. +2. Jekyll doesn't have default layouts or themes. +3. Most developers don't want to do design. -== Octopress uses +## Octopress is made of - [Jekyll](http://github.com/henrik/jekyll) a blog aware static site generator (Henrik's fork adds [HAML](http://haml-lang.com) support) - [Compass](http://compass-style.org) an awesome [SASS](http://sass-lang.com) framework. - [FSSM](http://github.com/ttilley/fssm/tree/master) + a rake task, automatically regenerates the blog as you work. - [Serve](http://github.com/jlong/serve) for live previews of the site while in development - [Rsync](http://samba.anu.edu.au/rsync/) for easy deployment. -= Setup -- add gem install instructions \ No newline at end of file +## Setup +#### First, clone Octopress locally. + git clone git://github.com/imathis/octopress.git +#### Second, install required gems + sudo gem install henrik-jekyll + sudo gem install compass-edge + sudo gem install fssm + sudo gem install serve + +#### Third +1. Edit the top of the Rakefile settings to match your web hosting info. +2. Edit the top of the atom.haml and _layout/default.haml + +## Usage +You should really read over the [Jekyll wiki](http://wiki.github.com/mojombo/jekyll) because most of your work will be using Jekyll. Beyond that Octopress is mostly some rake tasks, HAML, and SASS/Compass that has been meticulously crafted for ease of use and modification. + +### Rake tasks +rake preview: Generates the site, starts the local web server, and opens your browser to show the generated site. + +rake watch: Watches the source for changes and regenerates the site every time you save a file. You'll forget your working with a static site. + +rake deploy: Generates the site and then uses rsync (based on your configurations in the Rakefile) to synchronize with your web host. In order to use rsync you'll need shell access to your host, and you'll probably want to use your public key for authentication. + +rake stop_serve: Kills the local web server process. + +*There are more but these are the ones you'll use the most. Read the Rakefile if you want to learn more* \ No newline at end of file diff --git a/Rakefile b/Rakefile index 3107637..08b2918 100644 --- a/Rakefile +++ b/Rakefile @@ -1,14 +1,15 @@ require 'active_support' +## -- CHANGE FOR YOUR PROJECT -- ## +site_url = "http://yoursite.com" # deployed site url +ssh_user = "user@host.com" # for rsync deployment +document_root = "~/document_root/" # for rsync deployment +## ---- ## + port = "4000" # preview project port eg. http://localhost:4000 site = "site" # compiled site directory source = "source" # source file directory -# MUST CHANGE FOR YOUR PROJECT -site_url = "http://yoursite.com" # deployed site url -ssh_user = "user@host.com" # for rsync deployment -document_root = "~/document_root/" # for rsync deployment - def ok_failed(condition) if (condition) puts "OK" @@ -29,6 +30,11 @@ task :clean do Dir["#{site}/*"].each { |f| rm_rf(f) } end +task :clean_debug do + puts "Removing debug pages..." + Dir["#{site}/debug"].each { |f| rm_rf(f) } +end + desc "generate website in output directory" task :generate => :clean do puts "Generating website..." @@ -56,7 +62,7 @@ task :watch do end desc "generate and deploy website" -task :deploy => :generate do +multitask :deploy => [:generate, :clean_debug] do print "Deploying website..." ok_failed system("rsync -avz --delete #{site}/ #{ssh_user}:#{document_root}") end From 1b484123ac1f742b0ab4be0c310abb9d3088eedf Mon Sep 17 00:00:00 2001 From: B Mathis Date: Sun, 1 Nov 2009 00:17:17 -0500 Subject: [PATCH 019/715] updated readme to explain configuration, usage, and customization --- README.markdown | 50 ++++++++++++++++++++------ source/{debug => test}/typography.haml | 0 2 files changed, 40 insertions(+), 10 deletions(-) rename source/{debug => test}/typography.haml (100%) diff --git a/README.markdown b/README.markdown index a671be8..a67c0c8 100644 --- a/README.markdown +++ b/README.markdown @@ -1,6 +1,11 @@ # What is Octopress? Octopress gives developers a well designed starting point for a Jekyll blog. It's easy to configure and easy to deploy. Sweet huh? +#### Octopress comes with +1. A nice easy to configure theme that focuses on readability. +2. Built in support for Twitter, Delicious, and Disqus Comments. +3. Rake tasks that make development fast, and deployment easy. + ## Why? 1. Building a Jekyll blog from scratch is a lot of work. 2. Jekyll doesn't have default layouts or themes. @@ -8,10 +13,10 @@ Octopress gives developers a well designed starting point for a Jekyll blog. It' ## Octopress is made of - [Jekyll](http://github.com/henrik/jekyll) a blog aware static site generator (Henrik's fork adds [HAML](http://haml-lang.com) support) -- [Compass](http://compass-style.org) an awesome [SASS](http://sass-lang.com) framework. -- [FSSM](http://github.com/ttilley/fssm/tree/master) + a rake task, automatically regenerates the blog as you work. +- [Compass](http://compass-style.org) an awesome [SASS](http://sass-lang.com) framework +- [FSSM](http://github.com/ttilley/fssm/tree/master) + a rake task, automatically regenerates the blog as you work - [Serve](http://github.com/jlong/serve) for live previews of the site while in development -- [Rsync](http://samba.anu.edu.au/rsync/) for easy deployment. +- [Rsync](http://samba.anu.edu.au/rsync/) for easy deployment ## Setup #### First, clone Octopress locally. @@ -24,18 +29,43 @@ Octopress gives developers a well designed starting point for a Jekyll blog. It' #### Third 1. Edit the top of the Rakefile settings to match your web hosting info. -2. Edit the top of the atom.haml and _layout/default.haml +2. Edit the top of the atom.haml and _layout/default.haml. ## Usage You should really read over the [Jekyll wiki](http://wiki.github.com/mojombo/jekyll) because most of your work will be using Jekyll. Beyond that Octopress is mostly some rake tasks, HAML, and SASS/Compass that has been meticulously crafted for ease of use and modification. -### Rake tasks -rake preview: Generates the site, starts the local web server, and opens your browser to show the generated site. +### Common Rake tasks +**rake preview**: Generates the site, starts the local web server, and opens your browser to show the generated site. + +**rake watch**: Watches the source for changes and regenerates the site every time you save a file. You'll forget your working with a static site. + +**rake deploy**: Generates the site and then uses rsync (based on your configurations in the Rakefile) to synchronize with your web host. In order to use rsync you'll need shell access to your host, and you'll probably want to use your public key for authentication. + +**rake stop_serve**: Kills the local web server process. + +*There are more but these are the ones you'll use the most. Read the Rakefile if you want to learn more* + +## Style Configuration +### What you need to know +Octopress's stylesheets are written in [SASS](http://sass-lang.com). If you haven't learned SASS, you should. It's the future. Octopress also uses [Compass](http://compass-style.org) which is a framework for SASS and contains a great library of SASS mixins which make it trivial to write complicated CSS. This is also the future. + +### Customizing the default theme +The default theme is comprised of Layout, Typography, Theme, and Partials. Octopress also has a library of mixins that act like SASS helpers for styling tasks. + +#### Layout +Edit the variables at the top of /stylesheets/_layout.sass to configure the primary structural dimensions, including the header, footer, main content, and sidebar. + +#### Typography +Octopress puts a strong focus on readability and borrows some concepts from the [better web readability project](http://code.google.com/p/better-web-readability-project/). As a result the base font size is 16px. Don't worry though, if you don't like that, you can simply change the variable !base\_font\_size at the top of /stylesheets/_typography.sass and all of the other typographic math (heading sizes, line-heights, margins, etc) will be resized to suit automatically. + +If you want to add or modify site-wide typography, this is the file to do it in. If your changes are specific to a small section or feature of your site, you should probably add that under *Partials*. -rake watch: Watches the source for changes and regenerates the site every time you save a file. You'll forget your working with a static site. +Octopress ships with a typography test page /test/typography.html that lets you preview the default typographic styles, and see how your changes affect them. -rake deploy: Generates the site and then uses rsync (based on your configurations in the Rakefile) to synchronize with your web host. In order to use rsync you'll need shell access to your host, and you'll probably want to use your public key for authentication. +#### Theme +Every color used in Octopress is assigned to a variable in _theme.sass, so you can change them to suit your tastes without having to dig through a bunch of files to find the color your looking for. Also the colors variables are grouped by their location in the site layout to make them easier to find. -rake stop_serve: Kills the local web server process. +#### Partials +These are the styles for subsections of the site. They're located in /stylesheets/partials and each subsection has it's own file. Here you'll find styles for the sidebar, blog posts, syntax highlighting, and specific page elements that don't belong in the base layout files. -*There are more but these are the ones you'll use the most. Read the Rakefile if you want to learn more* \ No newline at end of file +Octopress ships with a syntax highlighting test page /test/syntax.html that lets you preview the default syntax highlighting styles, and see how your changes affect them. \ No newline at end of file diff --git a/source/debug/typography.haml b/source/test/typography.haml similarity index 100% rename from source/debug/typography.haml rename to source/test/typography.haml From e3a6bb7ca2db89149daeb6776ca8a08db322eec7 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Sun, 1 Nov 2009 00:21:05 -0500 Subject: [PATCH 020/715] fixed readme formatting issues --- README.markdown | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/README.markdown b/README.markdown index a67c0c8..a86d340 100644 --- a/README.markdown +++ b/README.markdown @@ -2,7 +2,7 @@ Octopress gives developers a well designed starting point for a Jekyll blog. It's easy to configure and easy to deploy. Sweet huh? #### Octopress comes with -1. A nice easy to configure theme that focuses on readability. +1. A nice, easy to configure theme that focuses on readability. 2. Built in support for Twitter, Delicious, and Disqus Comments. 3. Rake tasks that make development fast, and deployment easy. @@ -35,13 +35,17 @@ Octopress gives developers a well designed starting point for a Jekyll blog. It' You should really read over the [Jekyll wiki](http://wiki.github.com/mojombo/jekyll) because most of your work will be using Jekyll. Beyond that Octopress is mostly some rake tasks, HAML, and SASS/Compass that has been meticulously crafted for ease of use and modification. ### Common Rake tasks -**rake preview**: Generates the site, starts the local web server, and opens your browser to show the generated site. +**rake preview**: +Generates the site, starts the local web server, and opens your browser to show the generated site. -**rake watch**: Watches the source for changes and regenerates the site every time you save a file. You'll forget your working with a static site. +**rake watch**: +Watches the source for changes and regenerates the site every time you save a file. You'll forget your working with a static site. -**rake deploy**: Generates the site and then uses rsync (based on your configurations in the Rakefile) to synchronize with your web host. In order to use rsync you'll need shell access to your host, and you'll probably want to use your public key for authentication. +**rake deploy**: +Generates the site and then uses rsync (based on your configurations in the Rakefile) to synchronize with your web host. In order to use rsync you'll need shell access to your host, and you'll probably want to use your public key for authentication. -**rake stop_serve**: Kills the local web server process. +**rake stop_serve**: +Kills the local web server process. *There are more but these are the ones you'll use the most. Read the Rakefile if you want to learn more* @@ -52,20 +56,20 @@ Octopress's stylesheets are written in [SASS](http://sass-lang.com). If you have ### Customizing the default theme The default theme is comprised of Layout, Typography, Theme, and Partials. Octopress also has a library of mixins that act like SASS helpers for styling tasks. -#### Layout +**Layout** Edit the variables at the top of /stylesheets/_layout.sass to configure the primary structural dimensions, including the header, footer, main content, and sidebar. -#### Typography +**Typography** Octopress puts a strong focus on readability and borrows some concepts from the [better web readability project](http://code.google.com/p/better-web-readability-project/). As a result the base font size is 16px. Don't worry though, if you don't like that, you can simply change the variable !base\_font\_size at the top of /stylesheets/_typography.sass and all of the other typographic math (heading sizes, line-heights, margins, etc) will be resized to suit automatically. If you want to add or modify site-wide typography, this is the file to do it in. If your changes are specific to a small section or feature of your site, you should probably add that under *Partials*. Octopress ships with a typography test page /test/typography.html that lets you preview the default typographic styles, and see how your changes affect them. -#### Theme +**Theme** Every color used in Octopress is assigned to a variable in _theme.sass, so you can change them to suit your tastes without having to dig through a bunch of files to find the color your looking for. Also the colors variables are grouped by their location in the site layout to make them easier to find. -#### Partials +**Partials** These are the styles for subsections of the site. They're located in /stylesheets/partials and each subsection has it's own file. Here you'll find styles for the sidebar, blog posts, syntax highlighting, and specific page elements that don't belong in the base layout files. Octopress ships with a syntax highlighting test page /test/syntax.html that lets you preview the default syntax highlighting styles, and see how your changes affect them. \ No newline at end of file From 9a682bd73f1010206549b053b3ed42b3ef2d5d61 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Sun, 1 Nov 2009 00:23:34 -0500 Subject: [PATCH 021/715] fixed a few minor errors in the readme --- README.markdown | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.markdown b/README.markdown index a86d340..ef08cd6 100644 --- a/README.markdown +++ b/README.markdown @@ -35,16 +35,16 @@ Octopress gives developers a well designed starting point for a Jekyll blog. It' You should really read over the [Jekyll wiki](http://wiki.github.com/mojombo/jekyll) because most of your work will be using Jekyll. Beyond that Octopress is mostly some rake tasks, HAML, and SASS/Compass that has been meticulously crafted for ease of use and modification. ### Common Rake tasks -**rake preview**: +**rake preview** Generates the site, starts the local web server, and opens your browser to show the generated site. -**rake watch**: +**rake watch** Watches the source for changes and regenerates the site every time you save a file. You'll forget your working with a static site. -**rake deploy**: +**rake deploy** Generates the site and then uses rsync (based on your configurations in the Rakefile) to synchronize with your web host. In order to use rsync you'll need shell access to your host, and you'll probably want to use your public key for authentication. -**rake stop_serve**: +**rake stop_serve** Kills the local web server process. *There are more but these are the ones you'll use the most. Read the Rakefile if you want to learn more* @@ -54,7 +54,7 @@ Kills the local web server process. Octopress's stylesheets are written in [SASS](http://sass-lang.com). If you haven't learned SASS, you should. It's the future. Octopress also uses [Compass](http://compass-style.org) which is a framework for SASS and contains a great library of SASS mixins which make it trivial to write complicated CSS. This is also the future. ### Customizing the default theme -The default theme is comprised of Layout, Typography, Theme, and Partials. Octopress also has a library of mixins that act like SASS helpers for styling tasks. +The default theme is comprised of Layout, Typography, Theme, and Partials. Octopress also has a library of SASS mixins. **Layout** Edit the variables at the top of /stylesheets/_layout.sass to configure the primary structural dimensions, including the header, footer, main content, and sidebar. From fc691c1da6b091754b8881af5b2be509479baa21 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Mon, 2 Nov 2009 13:49:19 -0600 Subject: [PATCH 022/715] fixed library to support compass-edge --- source/stylesheets/_library.sass | 1 + 1 file changed, 1 insertion(+) diff --git a/source/stylesheets/_library.sass b/source/stylesheets/_library.sass index a9158ef..e6c0082 100644 --- a/source/stylesheets/_library.sass +++ b/source/stylesheets/_library.sass @@ -1,3 +1,4 @@ +@import compass/css3 @import library/reset.sass @import library/clearfix.sass @import library/border_radius.sass From 145f81046bc5881d7da86b05c8b92862b63f8080 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Thu, 5 Nov 2009 21:30:03 -0600 Subject: [PATCH 023/715] updated rake file, reorganized stylesheets, added google site search, added google analytics --- Rakefile | 50 ++++++++++---- config.rb | 2 +- source/_layouts/default.haml | 24 +++++-- source/images/search_bg.png | Bin 0 -> 1058 bytes source/stylesheets/_base.sass | 3 + .../{partials/main => }/_layout.sass | 2 + source/stylesheets/_partials.sass | 2 + .../{partials/main => }/_theme.sass | 0 .../{partials/base => }/_typography.sass | 0 source/stylesheets/partials/_base.sass | 16 ----- source/stylesheets/partials/_main.sass | 4 -- source/stylesheets/partials/_search.sass | 18 ++++++ .../partials/{main => }/_twitter.sass | 0 .../partials/main/_flash_messages.sass | 36 ----------- source/stylesheets/partials/main/_form.sass | 61 ------------------ source/stylesheets/screen.sass | 12 +++- 16 files changed, 92 insertions(+), 138 deletions(-) create mode 100644 source/images/search_bg.png create mode 100644 source/stylesheets/_base.sass rename source/stylesheets/{partials/main => }/_layout.sass (97%) create mode 100644 source/stylesheets/_partials.sass rename source/stylesheets/{partials/main => }/_theme.sass (100%) rename source/stylesheets/{partials/base => }/_typography.sass (100%) delete mode 100644 source/stylesheets/partials/_base.sass delete mode 100644 source/stylesheets/partials/_main.sass create mode 100644 source/stylesheets/partials/_search.sass rename source/stylesheets/partials/{main => }/_twitter.sass (100%) delete mode 100644 source/stylesheets/partials/main/_flash_messages.sass delete mode 100644 source/stylesheets/partials/main/_form.sass diff --git a/Rakefile b/Rakefile index 08b2918..690c31b 100644 --- a/Rakefile +++ b/Rakefile @@ -18,8 +18,13 @@ def ok_failed(condition) end end +desc "generate website in output directory" +task :default => [:generate_site, :generate_style] do + puts "--Site Generating Complete!--" +end + desc "list tasks" -task :default do +task :list do puts "Tasks: #{(Rake::Task.tasks - [Rake::Task[:default]]).to_sentence}" puts "(type rake -T for more detail)\n\n" end @@ -35,18 +40,29 @@ task :clean_debug do Dir["#{site}/debug"].each { |f| rm_rf(f) } end -desc "generate website in output directory" -task :generate => :clean do +desc "Generate styles only" +task :generate_style do + puts "Generating website..." + system "compass" +end + +desc "Generate site files only" +task :generate_site => :clean do puts "Generating website..." system "jekyll" Dir["#{site}/stylesheets/*.sass"].each { |f| rm_rf(f) } - system "compass" system "mv #{site}/atom.html #{site}/atom.xml" end def rebuild_site(relative) puts ">>> Change Detected to: #{relative} <<<" - IO.popen('rake generate'){|io| print(io.readpartial(512)) until io.eof?} + IO.popen('rake generate_site'){|io| print(io.readpartial(512)) until io.eof?} + puts '>>> Update Complete <<<' +end + +def rebuild_style(relative) + puts ">>> Change Detected to: #{relative} <<<" + IO.popen('rake generate_style'){|io| print(io.readpartial(512)) until io.eof?} puts '>>> Update Complete <<<' end @@ -54,15 +70,25 @@ desc "Watch the site and regenerate when it changes" task :watch do require 'fssm' puts ">>> Watching for Changes <<<" - FSSM.monitor("#{File.dirname(__FILE__)}/#{source}", '**/*') do - update {|base, relative| rebuild_site(relative)} - delete {|base, relative| rebuild_site(relative)} - create {|base, relative| rebuild_site(relative)} + FSSM.monitor do + path "#{File.dirname(__FILE__)}/#{source}" do + update {|base, relative| rebuild_site(relative)} + delete {|base, relative| rebuild_site(relative)} + create {|base, relative| rebuild_site(relative)} + end + path "#{File.dirname(__FILE__)}/#{source}/stylesheets" do + glob '**/*.sass' + update {|base, relative| rebuild_style(relative)} + delete {|base, relative| rebuild_style(relative)} + create {|base, relative| rebuild_style(relative)} + end end + FSSM.monitor("#{File.dirname(__FILE__)}/#{source}/stylesheets", '**/*') do + end desc "generate and deploy website" -multitask :deploy => [:generate, :clean_debug] do +multitask :deploy => [:default, :clean_debug] do print "Deploying website..." ok_failed system("rsync -avz --delete #{site}/ #{ssh_user}:#{document_root}") end @@ -87,13 +113,13 @@ task :stop_serve do end desc "preview the site in a web browser" -multitask :preview => [:generate, :start_serve] do +multitask :preview => [:default, :start_serve] do system "open http://localhost:#{port}" end desc "Build an XML sitemap of all html files." -task :sitemap => :generate do +task :sitemap => :default do html_files = FileList.new("#{site}/**/*.html").map{|f| f[("#{site}".size)..-1]}.map do |f| if f.ends_with?("index.html") f[0..(-("index.html".size + 1))] diff --git a/config.rb b/config.rb index 1d7be82..aaf0042 100644 --- a/config.rb +++ b/config.rb @@ -4,7 +4,7 @@ project_type = :stand_alone # Set this to the root of your project when deployed: http_path = "/" css_dir = "site/stylesheets" -sass_dir = "source/stylesheets" +sass_dir = "/stylesheets" images_dir = "images" # To enable relative paths to assets via compass helper functions. Uncomment: diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml index 481791c..30f4da1 100644 --- a/source/_layouts/default.haml +++ b/source/_layouts/default.haml @@ -1,6 +1,6 @@ --- blog_title: My Octopress Blog -root_url: +google_site_search_id: --- !!! 1.1 Transitional @@ -13,24 +13,29 @@ root_url: %meta(name="keywords" content="#{page.keywords}")/ %link(href="/stylesheets/screen.css" rel="stylesheet" media="screen projection" type="text/css") %link(href="/atom.xml" rel="alternate" title="#{page.blog_title}" type="application/atom+xml") - /%script(src="http://ajax.googleapis.com/ajax/libs/mootools/1.2.3/mootools-yui-compressed.js" type="text/javascript")/ %script(src="/javascripts/mootools-yui-compressed.js" type="text/javascript") %script(src="/javascripts/jsonp.js" type="text/javascript") %script(src="/javascripts/twitter_gitter.js" type="text/javascript") %script(src="/javascripts/twitter.js" type="text/javascript") + %script(src="http://www.google-analytics.com/ga.js" type="text/javascript") %body #header .page_width %a.title(href="/")=page.blog_title + #search + %form(action="http://www.google.com/cse" id="cse-search-box") + %input(type="hidden" name="cx" value="#{page.google_site_search_id}") + %input(type="hidden" name="ie" value="UTF-8") + %input#q(type="text" name="q") #nav .page_width %ul %li.alpha - %a(href="#{page.root_url}/") Blog + %a(href="/") Blog %li.omega - %a(href="#{page.root_url}/about") About + %a(href="/about") About %li.subscribe - %a(href="#{page.root_url}/atom.xml") Subscribe + %a(href="/atom.xml") Subscribe #page .page_width #main @@ -49,4 +54,11 @@ root_url: #footer .page_width = "Copyright © #{Time.now.strftime('%Y')} - #{page.blog_title} | " - %span.credit Powered by Octopress \ No newline at end of file + %span.credit Powered by Octopress + + //Google Analytics code + :javascript + try { + var pageTracker = _gat._getTracker("UA-10876422-1"); + pageTracker._trackPageview(); + } catch(err) {} \ No newline at end of file diff --git a/source/images/search_bg.png b/source/images/search_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..0587723eeab9f48b902c76928cd1283923e2b309 GIT binary patch literal 1058 zcmV+-1l{|IP)5dG9n4|}!4%pCb?Bgw4q``(;3PDI;2>y35GS=DxCpv9IMvNAO0>|T2o-;a;!i4V zRg8_6q-sp;JJ%?Q(d1Q^=H+~FczU^c!y%vNoSXPK5P?i4%MmV)NR$a-27*X^wuD#^ zVjLqJ4j(3a0hdG+lW=hf(LlK+(tr_szYF4cZrdPFAWKKYyfVroktX1K-N|troS&ah zi>fe@_6tR^Q~roF#*HJ$^)`*WK^8Yv6@p;kd}EK6=DILnNEU*Kl|~TeN!$z*nOR;_ zeh4B4L-b6;DvVq%$J4Ma$_+u>ia8Vtd3a_G$GOD3A}cEknwpxxX0t(db~amETwH|F z(NS1hTB4K^QU)D)!zzqIq4*_SG|6P?>FEKB#lj>(K~S2isw#Hv?d^rh$w^8pAys_A zU@(_cDwQwb;$$o#PNx&9tE-`}uP;UnyPhQ`~8$!LaNw#p&he}*;!Fh z!K%vC)D*UGSL=IwdoVOK1Z{0?tW~2bLr7g1Q9H5iT3%j;oA%Gn&R$g;vG*g0RD_qw zWTH2tG&k+f&(DX*;Q{>1{RkrEgb`a2u=T2}tc0<#vA8* z8MbBv0|Vf8yD77T9@=$R&Xdg3}b*wq{z9Z(ht$)i?lL95mK6v_R literal 0 HcmV?d00001 diff --git a/source/stylesheets/_base.sass b/source/stylesheets/_base.sass new file mode 100644 index 0000000..82b34b7 --- /dev/null +++ b/source/stylesheets/_base.sass @@ -0,0 +1,3 @@ +//compass default reset ++global-reset +@import compass/utilities.sass \ No newline at end of file diff --git a/source/stylesheets/partials/main/_layout.sass b/source/stylesheets/_layout.sass similarity index 97% rename from source/stylesheets/partials/main/_layout.sass rename to source/stylesheets/_layout.sass index 0275a51..ab06b65 100644 --- a/source/stylesheets/partials/main/_layout.sass +++ b/source/stylesheets/_layout.sass @@ -18,6 +18,8 @@ html body background-color= !header_bg border-bottom= "1px solid" !header_border padding: 30px 0 + .page_width + position: relative a.title font-size= !h1 +heading-font diff --git a/source/stylesheets/_partials.sass b/source/stylesheets/_partials.sass new file mode 100644 index 0000000..326df48 --- /dev/null +++ b/source/stylesheets/_partials.sass @@ -0,0 +1,2 @@ +@import partials/twitter.sass +@import partials/search.sass \ No newline at end of file diff --git a/source/stylesheets/partials/main/_theme.sass b/source/stylesheets/_theme.sass similarity index 100% rename from source/stylesheets/partials/main/_theme.sass rename to source/stylesheets/_theme.sass diff --git a/source/stylesheets/partials/base/_typography.sass b/source/stylesheets/_typography.sass similarity index 100% rename from source/stylesheets/partials/base/_typography.sass rename to source/stylesheets/_typography.sass diff --git a/source/stylesheets/partials/_base.sass b/source/stylesheets/partials/_base.sass deleted file mode 100644 index c88d3c0..0000000 --- a/source/stylesheets/partials/_base.sass +++ /dev/null @@ -1,16 +0,0 @@ -//compass default reset -+global-reset -//my reset -button - margin: 0 - padding: 0 - background: none - border: none - cursor: pointer - -button::-moz-focus-inner - border: none - padding: 0 - -@import compass/utilities.sass -@import base/typography.sass \ No newline at end of file diff --git a/source/stylesheets/partials/_main.sass b/source/stylesheets/partials/_main.sass deleted file mode 100644 index 374268c..0000000 --- a/source/stylesheets/partials/_main.sass +++ /dev/null @@ -1,4 +0,0 @@ -@import main/theme.sass -@import main/layout.sass -@import main/form.sass -@import main/twitter.sass \ No newline at end of file diff --git a/source/stylesheets/partials/_search.sass b/source/stylesheets/partials/_search.sass new file mode 100644 index 0000000..4de9c02 --- /dev/null +++ b/source/stylesheets/partials/_search.sass @@ -0,0 +1,18 @@ +#search + position: absolute + left= !page_width + !sidebar_margin - !sidebar_width + top= 10% + form + background: url(/images/search_bg.png) no-repeat + padding: 2px 0 0 + height: 28px + width: 218px + #q + background: none + width: 160px + margin-left: 30px + font-size: 15px + border: none + color: #aaa + &:focus + outline: none \ No newline at end of file diff --git a/source/stylesheets/partials/main/_twitter.sass b/source/stylesheets/partials/_twitter.sass similarity index 100% rename from source/stylesheets/partials/main/_twitter.sass rename to source/stylesheets/partials/_twitter.sass diff --git a/source/stylesheets/partials/main/_flash_messages.sass b/source/stylesheets/partials/main/_flash_messages.sass deleted file mode 100644 index bdc9f9c..0000000 --- a/source/stylesheets/partials/main/_flash_messages.sass +++ /dev/null @@ -1,36 +0,0 @@ -!flash_notice ||= #00529B -!flash_success ||= #4F8A10 -!flash_warning ||= #FBF4BD -!flash_error ||= #D8000C -!flash_notice_bg ||= #BDE5F8 -!flash_success_bg ||= #DFF2BF -!flash_warning_bg ||= #FBF4BD -!flash_error_bg ||= #FFD9DA - -=flash-message-style - +flash-message-structure - &.notice - +flash-color(!flash_notice, !flash_notice_bg) - &.success - +flash-color(!flash_success, !flash_success_bg) - &.warning - +flash-color(!flash_warning, !flash_warning_bg) - &.error - +flash-color(!flash_error, !flash_error_bg) - -=flash-message-structure - background-repeat: no-repeat - background-position: 10px center - border: 1px dashed - padding: 10px 15px - margin: 0 0 15px - -=flash-color(!color, !bg = 0) - color= !color - @if !bg == 0 - background-color= desaturate(lighten(adjust_hue(!color, -10), 83), 20) - @else - background-color= !bg - -#flash - +flash-message-style \ No newline at end of file diff --git a/source/stylesheets/partials/main/_form.sass b/source/stylesheets/partials/main/_form.sass deleted file mode 100644 index dc28ff0..0000000 --- a/source/stylesheets/partials/main/_form.sass +++ /dev/null @@ -1,61 +0,0 @@ -#page - form - clear: both - padding-bottom= !pad - fieldset, fieldset input.textbox, fieldset textarea - +border-radius - fieldset - background-color= !fieldset_bg - width: 480px - border= "1px solid" !fieldset_border - padding: 35px 25px 20px - margin-bottom= !pad*2.2 - label - font-size: 90% - display: block - padding-bottom: 4px - select - font-size: 110% - input.textbox, textarea - font-size: 115% - color= !textinput_color - background-color= !textinput_bg - - width: 70% - padding: 6px 8px - outline: 0 - display: inline-block - - border: 1px solid - border-top-color= !textinput_border_top - border-bottom-color= !textinput_border_bottom - border-left-color= !textinput_border_left - border-right-color= !textinput_border_right - - &:focus - background= !textinput_bg_focus - border-color= !textinput_border_focus - - input.checkbox, label.checkbox - display: inline-block - p - +clearfix - padding= 0 8px !pad - input.wrong:focus - outline: 2px solid #d0a5a5 - background: #fef2f2 - button - +border-radius(5px) - +btn-style(!blue_btn) - +btn-structure(18px, 1px) - color= !default_button_text_color - border: - width: 1px - style: solid - &:hover, &:focus - +btn-style-hover(!blue_btn) - outline: none - &:active - +btn-style-active(!blue_btn) - a.cancel - color= !cancel_link \ No newline at end of file diff --git a/source/stylesheets/screen.sass b/source/stylesheets/screen.sass index 51e46f6..e7fcb53 100644 --- a/source/stylesheets/screen.sass +++ b/source/stylesheets/screen.sass @@ -1,3 +1,11 @@ +/* SASS mixins */ @import library.sass -@import partials/base.sass -@import partials/main.sass \ No newline at end of file + +/* primary SASS */ +@import base.sass +@import theme.sass +@import typography.sass +@import layout.sass + +/* specific SASS */ +@import partials.sass \ No newline at end of file From f7700443ece4537c252b10a7463d12fd1725f40a Mon Sep 17 00:00:00 2001 From: B Mathis Date: Thu, 5 Nov 2009 21:34:41 -0600 Subject: [PATCH 024/715] moved stylesheets --- .gitignore | 2 +- Rakefile | 1 - {source/stylesheets => stylesheets}/_base.sass | 0 {source/stylesheets => stylesheets}/_layout.sass | 0 {source/stylesheets => stylesheets}/_library.sass | 0 {source/stylesheets => stylesheets}/_partials.sass | 0 {source/stylesheets => stylesheets}/_theme.sass | 0 {source/stylesheets => stylesheets}/_typography.sass | 0 {source/stylesheets => stylesheets}/ie.sass | 0 {source/stylesheets => stylesheets}/library/_border_radius.sass | 0 {source/stylesheets => stylesheets}/library/_button_style.sass | 0 {source/stylesheets => stylesheets}/library/_clearfix.sass | 0 .../stylesheets => stylesheets}/library/_easy_box_shadow.sass | 0 {source/stylesheets => stylesheets}/library/_float.sass | 0 {source/stylesheets => stylesheets}/library/_gradient.sass | 0 {source/stylesheets => stylesheets}/library/_hacks.sass | 0 {source/stylesheets => stylesheets}/library/_link_colors.sass | 0 {source/stylesheets => stylesheets}/library/_list_borders.sass | 0 {source/stylesheets => stylesheets}/library/_opacity.sass | 0 {source/stylesheets => stylesheets}/library/_reset.sass | 0 {source/stylesheets => stylesheets}/library/_sprite_hover.sass | 0 {source/stylesheets => stylesheets}/library/_sprite_img.sass | 0 {source/stylesheets => stylesheets}/library/_typography.sass | 0 {source/stylesheets => stylesheets}/partials/_search.sass | 0 {source/stylesheets => stylesheets}/partials/_twitter.sass | 0 {source/stylesheets => stylesheets}/print.sass | 0 {source/stylesheets => stylesheets}/screen.sass | 0 27 files changed, 1 insertion(+), 2 deletions(-) rename {source/stylesheets => stylesheets}/_base.sass (100%) rename {source/stylesheets => stylesheets}/_layout.sass (100%) rename {source/stylesheets => stylesheets}/_library.sass (100%) rename {source/stylesheets => stylesheets}/_partials.sass (100%) rename {source/stylesheets => stylesheets}/_theme.sass (100%) rename {source/stylesheets => stylesheets}/_typography.sass (100%) rename {source/stylesheets => stylesheets}/ie.sass (100%) rename {source/stylesheets => stylesheets}/library/_border_radius.sass (100%) rename {source/stylesheets => stylesheets}/library/_button_style.sass (100%) rename {source/stylesheets => stylesheets}/library/_clearfix.sass (100%) rename {source/stylesheets => stylesheets}/library/_easy_box_shadow.sass (100%) rename {source/stylesheets => stylesheets}/library/_float.sass (100%) rename {source/stylesheets => stylesheets}/library/_gradient.sass (100%) rename {source/stylesheets => stylesheets}/library/_hacks.sass (100%) rename {source/stylesheets => stylesheets}/library/_link_colors.sass (100%) rename {source/stylesheets => stylesheets}/library/_list_borders.sass (100%) rename {source/stylesheets => stylesheets}/library/_opacity.sass (100%) rename {source/stylesheets => stylesheets}/library/_reset.sass (100%) rename {source/stylesheets => stylesheets}/library/_sprite_hover.sass (100%) rename {source/stylesheets => stylesheets}/library/_sprite_img.sass (100%) rename {source/stylesheets => stylesheets}/library/_typography.sass (100%) rename {source/stylesheets => stylesheets}/partials/_search.sass (100%) rename {source/stylesheets => stylesheets}/partials/_twitter.sass (100%) rename {source/stylesheets => stylesheets}/print.sass (100%) rename {source/stylesheets => stylesheets}/screen.sass (100%) diff --git a/.gitignore b/.gitignore index 26c08c3..fe9f705 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ site -source/stylesheets/.sass-cache \ No newline at end of file +*/.sass-cache \ No newline at end of file diff --git a/Rakefile b/Rakefile index 690c31b..cc4aa74 100644 --- a/Rakefile +++ b/Rakefile @@ -50,7 +50,6 @@ desc "Generate site files only" task :generate_site => :clean do puts "Generating website..." system "jekyll" - Dir["#{site}/stylesheets/*.sass"].each { |f| rm_rf(f) } system "mv #{site}/atom.html #{site}/atom.xml" end diff --git a/source/stylesheets/_base.sass b/stylesheets/_base.sass similarity index 100% rename from source/stylesheets/_base.sass rename to stylesheets/_base.sass diff --git a/source/stylesheets/_layout.sass b/stylesheets/_layout.sass similarity index 100% rename from source/stylesheets/_layout.sass rename to stylesheets/_layout.sass diff --git a/source/stylesheets/_library.sass b/stylesheets/_library.sass similarity index 100% rename from source/stylesheets/_library.sass rename to stylesheets/_library.sass diff --git a/source/stylesheets/_partials.sass b/stylesheets/_partials.sass similarity index 100% rename from source/stylesheets/_partials.sass rename to stylesheets/_partials.sass diff --git a/source/stylesheets/_theme.sass b/stylesheets/_theme.sass similarity index 100% rename from source/stylesheets/_theme.sass rename to stylesheets/_theme.sass diff --git a/source/stylesheets/_typography.sass b/stylesheets/_typography.sass similarity index 100% rename from source/stylesheets/_typography.sass rename to stylesheets/_typography.sass diff --git a/source/stylesheets/ie.sass b/stylesheets/ie.sass similarity index 100% rename from source/stylesheets/ie.sass rename to stylesheets/ie.sass diff --git a/source/stylesheets/library/_border_radius.sass b/stylesheets/library/_border_radius.sass similarity index 100% rename from source/stylesheets/library/_border_radius.sass rename to stylesheets/library/_border_radius.sass diff --git a/source/stylesheets/library/_button_style.sass b/stylesheets/library/_button_style.sass similarity index 100% rename from source/stylesheets/library/_button_style.sass rename to stylesheets/library/_button_style.sass diff --git a/source/stylesheets/library/_clearfix.sass b/stylesheets/library/_clearfix.sass similarity index 100% rename from source/stylesheets/library/_clearfix.sass rename to stylesheets/library/_clearfix.sass diff --git a/source/stylesheets/library/_easy_box_shadow.sass b/stylesheets/library/_easy_box_shadow.sass similarity index 100% rename from source/stylesheets/library/_easy_box_shadow.sass rename to stylesheets/library/_easy_box_shadow.sass diff --git a/source/stylesheets/library/_float.sass b/stylesheets/library/_float.sass similarity index 100% rename from source/stylesheets/library/_float.sass rename to stylesheets/library/_float.sass diff --git a/source/stylesheets/library/_gradient.sass b/stylesheets/library/_gradient.sass similarity index 100% rename from source/stylesheets/library/_gradient.sass rename to stylesheets/library/_gradient.sass diff --git a/source/stylesheets/library/_hacks.sass b/stylesheets/library/_hacks.sass similarity index 100% rename from source/stylesheets/library/_hacks.sass rename to stylesheets/library/_hacks.sass diff --git a/source/stylesheets/library/_link_colors.sass b/stylesheets/library/_link_colors.sass similarity index 100% rename from source/stylesheets/library/_link_colors.sass rename to stylesheets/library/_link_colors.sass diff --git a/source/stylesheets/library/_list_borders.sass b/stylesheets/library/_list_borders.sass similarity index 100% rename from source/stylesheets/library/_list_borders.sass rename to stylesheets/library/_list_borders.sass diff --git a/source/stylesheets/library/_opacity.sass b/stylesheets/library/_opacity.sass similarity index 100% rename from source/stylesheets/library/_opacity.sass rename to stylesheets/library/_opacity.sass diff --git a/source/stylesheets/library/_reset.sass b/stylesheets/library/_reset.sass similarity index 100% rename from source/stylesheets/library/_reset.sass rename to stylesheets/library/_reset.sass diff --git a/source/stylesheets/library/_sprite_hover.sass b/stylesheets/library/_sprite_hover.sass similarity index 100% rename from source/stylesheets/library/_sprite_hover.sass rename to stylesheets/library/_sprite_hover.sass diff --git a/source/stylesheets/library/_sprite_img.sass b/stylesheets/library/_sprite_img.sass similarity index 100% rename from source/stylesheets/library/_sprite_img.sass rename to stylesheets/library/_sprite_img.sass diff --git a/source/stylesheets/library/_typography.sass b/stylesheets/library/_typography.sass similarity index 100% rename from source/stylesheets/library/_typography.sass rename to stylesheets/library/_typography.sass diff --git a/source/stylesheets/partials/_search.sass b/stylesheets/partials/_search.sass similarity index 100% rename from source/stylesheets/partials/_search.sass rename to stylesheets/partials/_search.sass diff --git a/source/stylesheets/partials/_twitter.sass b/stylesheets/partials/_twitter.sass similarity index 100% rename from source/stylesheets/partials/_twitter.sass rename to stylesheets/partials/_twitter.sass diff --git a/source/stylesheets/print.sass b/stylesheets/print.sass similarity index 100% rename from source/stylesheets/print.sass rename to stylesheets/print.sass diff --git a/source/stylesheets/screen.sass b/stylesheets/screen.sass similarity index 100% rename from source/stylesheets/screen.sass rename to stylesheets/screen.sass From 6c9f1567ce4a4ac29d33f20533618b462285a4f2 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Thu, 5 Nov 2009 21:58:04 -0600 Subject: [PATCH 025/715] updated rakefile, added some basic twitter files --- Rakefile | 18 ++++++++---------- stylesheets/library/_typography.sass | 2 +- stylesheets/partials/_twitter.sass | 8 +++++++- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Rakefile b/Rakefile index cc4aa74..236a5c0 100644 --- a/Rakefile +++ b/Rakefile @@ -20,35 +20,35 @@ end desc "generate website in output directory" task :default => [:generate_site, :generate_style] do - puts "--Site Generating Complete!--" + puts ">>> Site Generating Complete! <<<" end desc "list tasks" task :list do - puts "Tasks: #{(Rake::Task.tasks - [Rake::Task[:default]]).to_sentence}" + puts "Tasks: #{(Rake::Task.tasks - [Rake::Task[:list]]).to_sentence}" puts "(type rake -T for more detail)\n\n" end desc "remove files in output directory" task :clean do - puts "Removing output..." + puts ">>> Removing output <<<" Dir["#{site}/*"].each { |f| rm_rf(f) } end task :clean_debug do - puts "Removing debug pages..." + puts ">>> Removing debug pages <<<" Dir["#{site}/debug"].each { |f| rm_rf(f) } end desc "Generate styles only" task :generate_style do - puts "Generating website..." + puts ">>> Generating styles <<<" system "compass" end desc "Generate site files only" task :generate_site => :clean do - puts "Generating website..." + puts ">>> Generating site files <<<" system "jekyll" system "mv #{site}/atom.html #{site}/atom.xml" end @@ -75,20 +75,18 @@ task :watch do delete {|base, relative| rebuild_site(relative)} create {|base, relative| rebuild_site(relative)} end - path "#{File.dirname(__FILE__)}/#{source}/stylesheets" do + path "#{File.dirname(__FILE__)}/stylesheets" do glob '**/*.sass' update {|base, relative| rebuild_style(relative)} delete {|base, relative| rebuild_style(relative)} create {|base, relative| rebuild_style(relative)} end end - FSSM.monitor("#{File.dirname(__FILE__)}/#{source}/stylesheets", '**/*') do - end desc "generate and deploy website" multitask :deploy => [:default, :clean_debug] do - print "Deploying website..." + print ">>> Deploying website <<<" ok_failed system("rsync -avz --delete #{site}/ #{ssh_user}:#{document_root}") end diff --git a/stylesheets/library/_typography.sass b/stylesheets/library/_typography.sass index a1b5c63..f5026cf 100644 --- a/stylesheets/library/_typography.sass +++ b/stylesheets/library/_typography.sass @@ -58,7 +58,7 @@ =typography-defaults(!font_size = !base_font_size) body - line-height= ceil(!font_size * 1.625) + line-height: 1.625em color= !base_font_color p +p-style(!font_size) diff --git a/stylesheets/partials/_twitter.sass b/stylesheets/partials/_twitter.sass index baeef5b..7cac8b3 100644 --- a/stylesheets/partials/_twitter.sass +++ b/stylesheets/partials/_twitter.sass @@ -1,2 +1,8 @@ #twitter - font-size: 85% \ No newline at end of file + font-size: 85% + p + +border-radius + padding: 10px 15px + margin-bottom: 15px + background: #eee + line-height: 1.625em \ No newline at end of file From 416667ccaaa5244af76ecea91a20edff9ec77586 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Thu, 5 Nov 2009 22:36:37 -0600 Subject: [PATCH 026/715] added disqus comment support --- Rakefile | 2 +- source/_layouts/default.haml | 22 +++++++++++++++++++++- source/index.haml | 5 +++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Rakefile b/Rakefile index 236a5c0..af65af0 100644 --- a/Rakefile +++ b/Rakefile @@ -47,7 +47,7 @@ task :generate_style do end desc "Generate site files only" -task :generate_site => :clean do +task :generate_site => [:clean, :generate_style] do puts ">>> Generating site files <<<" system "jekyll" system "mv #{site}/atom.html #{site}/atom.xml" diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml index 30f4da1..0ab168d 100644 --- a/source/_layouts/default.haml +++ b/source/_layouts/default.haml @@ -1,6 +1,8 @@ --- blog_title: My Octopress Blog +full_url: google_site_search_id: +disqus_site: designenthusiast --- !!! 1.1 Transitional @@ -45,6 +47,13 @@ google_site_search_id: %p.pubdate Published: =page.date.strftime("%d %b, %Y") + #disqus_thread + :javascript + var disqus_developer = true; + var disqus_url = "#{page.full_url}/#{page.url}"; + %noscript + %a(href="http://designenthusiast.disqus.com/?url=ref") View the discussion thread + %script(type="text/javascript" src="http://disqus.com/forums/#{page.disqus_site}/embed.js") - else = content #sidebar @@ -55,7 +64,18 @@ google_site_search_id: .page_width = "Copyright © #{Time.now.strftime('%Y')} - #{page.blog_title} | " %span.credit Powered by Octopress - + //Disqus Commens code + :javascript + (function() { + var links = document.getElementsByTagName('a'); + var query = '?'; + for(var i = 0; i < links.length; i++) { + if(links[i].href.indexOf('#disqus_thread') >= 0) { + query += 'url' + i + '=' + encodeURIComponent(links[i].href) + '&'; + } + } + document.write('" - elsif encode == "hex" - email_address_encoded = '' - email_address_obfuscated.each_byte do |c| - email_address_encoded << sprintf("&#%d;", c) - end - - protocol = 'mailto:' - protocol.each_byte { |c| string << sprintf("&#%d;", c) } - - email_address.each_byte do |c| - char = c.chr - string << (char =~ /\w/ ? sprintf("%%%x", c) : char) - end - content_tag "a", name || email_address_encoded, html_options.merge({ "href" => "#{string}#{extras}" }) - else - content_tag "a", name || email_address_obfuscated, html_options.merge({ "href" => "mailto:#{email_address}#{extras}" }) - end - end - private def cdata_section(content) @@ -156,15 +113,6 @@ module Helpers # My added helpers - def to_html_email(address) - email = string_to_html(address) - "#{email}" - end - - def string_to_html(s) - s.strip.unpack("C*").map{|ch| "&#" + ch.to_s + ";" }.to_s - end - def show_part (file) data = '' f = File.open(Dir.pwd+"/source/"+file) From 8653d3e936ce67e15e1ed4424591a480d68cd87d Mon Sep 17 00:00:00 2001 From: B Mathis Date: Thu, 12 Nov 2009 14:14:08 -0600 Subject: [PATCH 058/715] fixed positioning of search field --- stylesheets/partials/_search.sass | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/stylesheets/partials/_search.sass b/stylesheets/partials/_search.sass index 4de9c02..71f2460 100644 --- a/stylesheets/partials/_search.sass +++ b/stylesheets/partials/_search.sass @@ -4,11 +4,13 @@ top= 10% form background: url(/images/search_bg.png) no-repeat - padding: 2px 0 0 + padding: 0 height: 28px width: 218px #q background: none + position: relative + top: -2px width: 160px margin-left: 30px font-size: 15px From bd96f301ef90953c1d59df9493142fcd5ce37c56 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Thu, 12 Nov 2009 14:42:31 -0600 Subject: [PATCH 059/715] added back html_email obfusticator --- source/_helpers.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/_helpers.rb b/source/_helpers.rb index 2eca937..43377dc 100644 --- a/source/_helpers.rb +++ b/source/_helpers.rb @@ -113,6 +113,15 @@ module Helpers # My added helpers + def to_html_email(address) + email = string_to_html(address) + "#{email}" + end + + def string_to_html(s) + s.strip.unpack("C*").map{|ch| "&#" + ch.to_s + ";" }.to_s + end + def show_part (file) data = '' f = File.open(Dir.pwd+"/source/"+file) From 61d4099edf4999f2b46e749fb2d785f2eff5588e Mon Sep 17 00:00:00 2001 From: B Mathis Date: Thu, 12 Nov 2009 14:42:54 -0600 Subject: [PATCH 060/715] added fix for IE7 adding vertical scroll bars to code blocks --- stylesheets/partials/_syntax.sass | 1 + 1 file changed, 1 insertion(+) diff --git a/stylesheets/partials/_syntax.sass b/stylesheets/partials/_syntax.sass index ee22a1d..633a496 100644 --- a/stylesheets/partials/_syntax.sass +++ b/stylesheets/partials/_syntax.sass @@ -5,6 +5,7 @@ pre line-height: 1.5em border: #aaa 1px solid overflow-x: auto + overflow-y: hidden padding: 25px 20px .lineno color: #888 From 513cb7e028f7e8bc6a43174cc271bf4dc167bdea Mon Sep 17 00:00:00 2001 From: B Mathis Date: Thu, 12 Nov 2009 15:54:28 -0600 Subject: [PATCH 061/715] removed my twitter name from the default layout --- source/_layouts/default.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml index a072fc1..dcc2c5d 100644 --- a/source/_layouts/default.haml +++ b/source/_layouts/default.haml @@ -1,11 +1,11 @@ --- blog_title: My Octopress Blog -twitter_user: imathis +twitter_user: tweet_count: 3 show_replies: false -delicious_user: imathis +delicious_user: delicious_count: 3 full_url: From f63677155392c5229c8f38389d753b616d14bcdf Mon Sep 17 00:00:00 2001 From: B Mathis Date: Thu, 12 Nov 2009 19:42:25 -0600 Subject: [PATCH 062/715] updated blockquote style --- stylesheets/_typography.sass | 8 +++++++- stylesheets/library/_typography.sass | 7 ++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/stylesheets/_typography.sass b/stylesheets/_typography.sass index 3578b32..9383040 100644 --- a/stylesheets/_typography.sass +++ b/stylesheets/_typography.sass @@ -21,7 +21,13 @@ h1,h2,h3,h4,h5,h6 blockquote +quote-font - font-size= !base_font_size * 1.2 + +border-radius(5px) + font-style: italic + color: #555 + background: #f8f8f8 + border: 1px solid #e5e5e5 + &:before + color: #ddd .quote blockquote font-size= !h4 line-height= !h5 * 1.625 diff --git a/stylesheets/library/_typography.sass b/stylesheets/library/_typography.sass index d203ecf..0e70a9e 100644 --- a/stylesheets/library/_typography.sass +++ b/stylesheets/library/_typography.sass @@ -138,14 +138,15 @@ margin-left= !font_size * 1.625 =quote-style(!font_size = !base_font_size) - padding= !font_size !font_size !font_size * 1.625 !font_size * 1.4 + padding= !font_size*1.5 !font_size*1.5 !font_size * 1.5 !font_size * 1.8 + position: relative + margin-bottom= !font_size * 0.8125 &:before content: "\201C" font-size= !font_size * 3 - margin= 0 0 0 -.625em + margin= 5px 0 0 -.525em position: absolute font-family: Times, Georgia, serif - color: #aaa line-height: 0 > p padding: 0 From 2ac92733543b2625fd5fbe24c9aa2b095b3c6ca1 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Thu, 12 Nov 2009 19:51:31 -0600 Subject: [PATCH 063/715] updated quote style again --- stylesheets/_typography.sass | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/stylesheets/_typography.sass b/stylesheets/_typography.sass index 9383040..ec8595d 100644 --- a/stylesheets/_typography.sass +++ b/stylesheets/_typography.sass @@ -21,11 +21,12 @@ h1,h2,h3,h4,h5,h6 blockquote +quote-font - +border-radius(5px) font-style: italic color: #555 background: #f8f8f8 - border: 1px solid #e5e5e5 + border: + top: 1px solid #e5e5e5 + bottom: 1px solid #e5e5e5 &:before color: #ddd .quote blockquote From f23941da8fb657a49a9850725c820890c119bd5d Mon Sep 17 00:00:00 2001 From: B Mathis Date: Thu, 12 Nov 2009 22:28:51 -0600 Subject: [PATCH 064/715] fixed font size boost --- stylesheets/_typography.sass | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stylesheets/_typography.sass b/stylesheets/_typography.sass index ec8595d..f3a81b5 100644 --- a/stylesheets/_typography.sass +++ b/stylesheets/_typography.sass @@ -10,7 +10,7 @@ +serif-font body - font-size= !base_font_size +2 + font-size= !base_font_size +serif-font h1,h2,h3,h4,h5,h6 From b29e546c7206a1667f1c55c075c2bcacb9b35e64 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Thu, 12 Nov 2009 22:29:28 -0600 Subject: [PATCH 065/715] changed footer credit from github link to octopress.org --- source/_layouts/default.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml index dcc2c5d..b8ae522 100644 --- a/source/_layouts/default.haml +++ b/source/_layouts/default.haml @@ -88,7 +88,7 @@ google_analytics: true #footer .page_width Copyright © #{Time.now.strftime('%Y')} - #{page.blog_title} - - %span.credit Powered by Octopress + %span.credit Powered by Octopress - if page.respond_to? :disqus_short_name //Disqus Comments code :javascript From 0d602515cc6809d8c42919906a934be837f28901 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Fri, 13 Nov 2009 02:35:16 -0600 Subject: [PATCH 066/715] changed the way blog titles are constructed --- source/_layouts/default.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml index b8ae522..10e9315 100644 --- a/source/_layouts/default.haml +++ b/source/_layouts/default.haml @@ -19,7 +19,7 @@ google_analytics: true !!! 1.1 Transitional %html(xmlns="http://www.w3.org/1999/xhtml" xml:lang="en") %head - %title= "#{page.title} - #{page.blog_title}" + %title #{page.blog_title} :: #{page.title} - if page.respond_to? :description %meta(name="description" content="#{page.description}")/ - if page.respond_to? :keywords From 3e69c6be8bca045b432ca20211b4aadd7df8dd5d Mon Sep 17 00:00:00 2001 From: B Mathis Date: Fri, 13 Nov 2009 02:35:40 -0600 Subject: [PATCH 067/715] fixed the deploy rake task so it will delete the debug pages --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index 8375eb4..d8d07c9 100644 --- a/Rakefile +++ b/Rakefile @@ -37,7 +37,7 @@ end task :clean_debug do puts ">>> Removing debug pages <<<" - Dir["#{site}/debug"].each { |f| rm_rf(f) } + Dir["#{site}/test"].each { |f| rm_rf(f) } end desc "Generate styles only" From 0f31b5b9e271ac5fe613217a8beb88b17a415c77 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Fri, 13 Nov 2009 10:15:39 -0600 Subject: [PATCH 068/715] fixed search positioning, made layout calculations better --- stylesheets/_layout.sass | 19 ++++++------------- stylesheets/partials/_search.sass | 2 +- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/stylesheets/_layout.sass b/stylesheets/_layout.sass index 348c1a9..4f79272 100644 --- a/stylesheets/_layout.sass +++ b/stylesheets/_layout.sass @@ -1,6 +1,8 @@ !page_width = 900px -!sidebar_width = 250px +!main_width = 620px +!page_pad = 30px !sidebar_margin = 30px +!sidebar_width = !page_width - !main_width - !sidebar_margin !pad = 15px !default_border_radius = 4px @@ -69,21 +71,12 @@ html body width= !page_width margin: 0 auto padding: - left: 30px - right: 30px + left= !page_pad + right= !page_pad #page +clearfix background-color= !page_bg - &.collapsed - .page_width - width= !page_width - !sidebar_width - #main - width: 100% - .pre_expander - display: none - #sidebar - float: none .page_width +clearfix position: relative @@ -96,7 +89,7 @@ html body left= "1px solid" !page_border_sides right= "1px solid" !page_border_sides #main - width= !page_width - !sidebar_width - !sidebar_margin + width= !main_width float: left &.expanded width: 100% diff --git a/stylesheets/partials/_search.sass b/stylesheets/partials/_search.sass index 71f2460..72bebdf 100644 --- a/stylesheets/partials/_search.sass +++ b/stylesheets/partials/_search.sass @@ -10,7 +10,7 @@ #q background: none position: relative - top: -2px + top: 1px width: 160px margin-left: 30px font-size: 15px From 543928a0b3b14859ada1f2ba61080c5d202d530b Mon Sep 17 00:00:00 2001 From: B Mathis Date: Fri, 13 Nov 2009 10:21:56 -0600 Subject: [PATCH 069/715] fixed list styling so they are inside --- stylesheets/library/_typography.sass | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stylesheets/library/_typography.sass b/stylesheets/library/_typography.sass index 0e70a9e..8867057 100644 --- a/stylesheets/library/_typography.sass +++ b/stylesheets/library/_typography.sass @@ -117,15 +117,15 @@ font-size= floor(!font_size * 1.25) =ol-style(!font_size = !base_font_size) - list-style: outside + list-style: inside margin= 0 0 !font_size * 1.625 li - list-style: decimal + list-style-type: decimal ol margin= 0 0 !font_size * 1.625 =ul-style(!font_size = !base_font_size) - list-style: outside + list-style: inside margin= 0 0 !font_size * 1.625 li ul margin= 0 0 !font_size * 1.625 From 22a7564f2e2b3e11dbaa6aef25a4e437b537ed0f Mon Sep 17 00:00:00 2001 From: B Mathis Date: Fri, 13 Nov 2009 10:22:54 -0600 Subject: [PATCH 070/715] ordered lists are now inside --- stylesheets/library/_typography.sass | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/stylesheets/library/_typography.sass b/stylesheets/library/_typography.sass index 8867057..0485d8e 100644 --- a/stylesheets/library/_typography.sass +++ b/stylesheets/library/_typography.sass @@ -117,12 +117,10 @@ font-size= floor(!font_size * 1.25) =ol-style(!font_size = !base_font_size) - list-style: inside + list-style: inside decimal margin= 0 0 !font_size * 1.625 - li - list-style-type: decimal - ol - margin= 0 0 !font_size * 1.625 + li ol + margin= 0 0 !font_size * 1.625 =ul-style(!font_size = !base_font_size) list-style: inside From 833d64e8e00326505b210fa82e21e9a8de5ea08c Mon Sep 17 00:00:00 2001 From: B Mathis Date: Fri, 13 Nov 2009 12:54:32 -0600 Subject: [PATCH 071/715] simplified readme. pointing to the wiki for more detail --- README.markdown | 91 +++++++++++++++++-------------------------------- 1 file changed, 32 insertions(+), 59 deletions(-) diff --git a/README.markdown b/README.markdown index 22789a1..d8011f1 100644 --- a/README.markdown +++ b/README.markdown @@ -19,81 +19,54 @@ Octopress gives developers a well designed starting point for a Jekyll blog. It' - [Rsync](http://samba.anu.edu.au/rsync/) for easy deployment ## Setup -#### First, clone Octopress locally. - git clone git://github.com/imathis/octopress.git -#### Second, install required gems +Setup is really simple. + +1. Download Octopress: git clone git://github.com/imathis/octopress.git +2. Install required gems: sudo gem install henrik-jekyll - sudo gem install compass-edge + sudo gem install compass sudo gem install fssm sudo gem install serve +3. Run rake preview to build the site and preview it in a local webserver. -#### Third -1. Edit the top of the Rakefile settings to match your web hosting info. -2. Customize the top of the atom.haml and _layout/default.haml. +You'll want to change some settings, so check out the [Setup & Configurations wiki page](http://wiki.github.com/imathis/octopress/setup-configuration) ## Usage -You should really read over the [Jekyll wiki](http://wiki.github.com/mojombo/jekyll) because most of your work will be using Jekyll. Beyond that Octopress is mostly some rake tasks, HAML, and SASS/Compass that has been meticulously crafted for ease of use and modification. +Octopress is almost like a front-end for Jekyll. It provides some really handy rake tasks and automation to make blogging as simple as possible. With Octopress you can: -### Common Rake tasks -**rake preview** -Generates the site, starts the local web server, and opens your browser to show the generated site. +- Preview the site locally with the power of Serve. +- Automatically regenerate your blog while you work. +- Generate and deploy with a single command. -**rake watch** -Watches the source for changes and regenerates the site every time you save a file. You'll forget your working with a static site. - -**rake deploy** -Generates the site and then uses rsync (based on your configurations in the Rakefile) to synchronize with your web host. In order to use rsync you'll need shell access to your host, and you'll probably want to use your public key for authentication. - -**rake stop_serve** -Kills the local web server process. - -*There are more but these are the ones you'll use the most. Read the Rakefile if you want to learn more* +See the [usage wiki page](http://wiki.github.com/imathis/octopress/usage) to learn more. ## Third Party Integration -### Twitter -Twitter settings are at the top of _layouts/default.haml -You can also change: - - twitter_user: your_twitter_name - show_replies: false - tweet_count: 3 - -### Disqus Comments -Octopress has built in support for the Disqus commenting system, using the "universal code" installation method. First register your site at [http://disqus.com/comments/register/](http://disqus.com/comments/register/) Then, edit the settings at the top of _layouts/default.haml - - full_url: http://yoursite.com - disqus_short_name: yourdisqusname - -### Google Custom Search -First setup a custom search for your site at [http://google.com/cse/](http://google.com/cse/) then add your google\_custom\_search\_id to the YAML block in the default layout. - -### Google Analytics -The analytics tracking scripts are already integrated into Octopress, all you have to do is register your site at [http://google.com/analytics/](http://google.com/analytics/). - -### Removing Third party integrations -All third party integration is conditionally included. All you have to do is remove the variable from the layout and you're done. If you like, you can also remove the include blocks from the default layout. +With search, comments, and analytics, you have no need for a database. This is what makes a statically generated blog possible. -## Style Configuration -### What you need to know -Octopress's stylesheets are written in [SASS](http://sass-lang.com). If you haven't learned SASS, you should. It's the future. Octopress also uses [Compass](http://compass-style.org) which is a framework for SASS and contains a great library of SASS mixins which make it trivial to write complicated CSS. This is also the future. +- Twitter +- Disqus Comments +- Google Custom Search +- Google Analytics +- Delicious Bookmarks -### Customizing the default theme -The default theme is comprised of Layout, Typography, Theme, and Partials. Octopress also has a library of SASS mixins. +If you already have an account with these services, you can get set up within seconds. [Check out the wiki](http://wiki.github.com/imathis/octopress/third-party-integration) to learn how to setup or remove these services. -**Layout** -Edit the variables at the top of /stylesheets/_layout.sass to configure the primary structural dimensions, including the header, footer, main content, and sidebar. +## Octopress Style +- Stylesheets use [SASS](http://sass-lang.com) and [Compass](http://compass-style.org) +- They're broken up into Layout, Typography, Theme (colors), and Partials +- Checkout [the wiki](http://wiki.github.com/imathis/octopress/style-customization) for help with customization. -**Typography** -Octopress puts a strong focus on readability and borrows some concepts from the [better web readability project](http://code.google.com/p/better-web-readability-project/). As a result the base font size is 16px. Don't worry though, if you don't like that, you can simply change the variable !base\_font\_size at the top of /stylesheets/_typography.sass and all of the other typographic math (heading sizes, line-heights, margins, etc) will be resized to suit automatically. +## License +(The MIT License) -If you want to add or modify site-wide typography, this is the file to do it in. If your changes are specific to a small section or feature of your site, you should probably add that under *Partials*. +Copyright © 2009 Brandon Mathis -Octopress ships with a typography test page /test/typography.html that lets you preview the default typographic styles, and see how your changes affect them. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ‘Software’), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -**Theme** -Every color used in Octopress is assigned to a variable in _theme.sass, so you can change them to suit your tastes without having to dig through a bunch of files to find the color your looking for. Also the colors variables are grouped by their location in the site layout to make them easier to find. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -**Partials** -These are the styles for subsections of the site. They're located in /stylesheets/partials and each subsection has it's own file. Here you'll find styles for the sidebar, blog posts, syntax highlighting, and specific page elements that don't belong in the base layout files. +THE SOFTWARE IS PROVIDED ‘AS IS’, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Octopress ships with a syntax highlighting test page /test/syntax.html that lets you preview the default syntax highlighting styles, and see how your changes affect them. \ No newline at end of file +#### If you want to be awesome. +- Proudly display the 'Powered by Octopress' credit in the footer. +- Add your site to the wiki so we can watch the community grow. \ No newline at end of file From fe3590beae286efa61633294d7fc407d34759551 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Fri, 13 Nov 2009 12:59:20 -0600 Subject: [PATCH 072/715] fixed links and descriptions in the readme --- README.markdown | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.markdown b/README.markdown index d8011f1..404131b 100644 --- a/README.markdown +++ b/README.markdown @@ -3,8 +3,8 @@ Octopress gives developers a well designed starting point for a Jekyll blog. It' #### Octopress comes with 1. A nice, easy to configure theme that focuses on readability. -2. Built in support for Twitter, Delicious, and Disqus Comments. -3. Rake tasks that make development fast, and deployment easy. +2. Built in support for Twitter, Delicious, Disqus Comments, Google Analytics, and Custom Search. +3. Rake tasks that make development fast, and deploying easy. ## Why? 1. Building a Jekyll blog from scratch is a lot of work. @@ -29,7 +29,7 @@ Setup is really simple. sudo gem install serve 3. Run rake preview to build the site and preview it in a local webserver. -You'll want to change some settings, so check out the [Setup & Configurations wiki page](http://wiki.github.com/imathis/octopress/setup-configuration) +You'll want to change some settings, so check out the wiki for [Setup & Configurations](http://wiki.github.com/imathis/octopress/setup-configuration). ## Usage Octopress is almost like a front-end for Jekyll. It provides some really handy rake tasks and automation to make blogging as simple as possible. With Octopress you can: @@ -38,7 +38,7 @@ Octopress is almost like a front-end for Jekyll. It provides some really handy r - Automatically regenerate your blog while you work. - Generate and deploy with a single command. -See the [usage wiki page](http://wiki.github.com/imathis/octopress/usage) to learn more. +See the wiki to learn more about [Usage](http://wiki.github.com/imathis/octopress/usage). ## Third Party Integration With search, comments, and analytics, you have no need for a database. This is what makes a statically generated blog possible. @@ -49,7 +49,7 @@ With search, comments, and analytics, you have no need for a database. This is w - Google Analytics - Delicious Bookmarks -If you already have an account with these services, you can get set up within seconds. [Check out the wiki](http://wiki.github.com/imathis/octopress/third-party-integration) to learn how to setup or remove these services. +If you already have an account with these services, you can get set up within seconds. Check out the wiki for [Third Party Configuration](http://wiki.github.com/imathis/octopress/third-party-integration) details, and to learn how to setup or remove these services. ## Octopress Style - Stylesheets use [SASS](http://sass-lang.com) and [Compass](http://compass-style.org) From bdc66eabdfca4ae623ec359cd7751d60fbffc06e Mon Sep 17 00:00:00 2001 From: B Mathis Date: Sat, 14 Nov 2009 13:08:19 -0600 Subject: [PATCH 073/715] reorganized stylesheets --- source/_layouts/default.haml | 14 ++-- stylesheets/_layout.sass | 105 +------------------------- stylesheets/_partials.sass | 11 ++- stylesheets/partials/_footer.sass | 13 ++++ stylesheets/partials/_header.sass | 12 +++ stylesheets/partials/_navigation.sass | 41 ++++++++++ stylesheets/partials/_page.sass | 19 +++++ stylesheets/partials/_sidebar.sass | 14 ++++ 8 files changed, 117 insertions(+), 112 deletions(-) create mode 100644 stylesheets/partials/_footer.sass create mode 100644 stylesheets/partials/_header.sass create mode 100644 stylesheets/partials/_navigation.sass create mode 100644 stylesheets/partials/_page.sass diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml index 10e9315..4da11a1 100644 --- a/source/_layouts/default.haml +++ b/source/_layouts/default.haml @@ -37,7 +37,7 @@ google_analytics: true %script(src="/javascripts/twitter.js" type="text/javascript") - if page.respond_to? :google_analytics %script(src="http://www.google-analytics.com/ga.js" type="text/javascript") - %body + %body(id="#{(page.respond_to?(:body_id) ? page.body_id : nil)}") #header .page_width %a.title(href="/")=page.blog_title @@ -60,11 +60,13 @@ google_analytics: true .page_width #main - if page.respond_to? :date - %h2= page.title - = preserve rp(content) - %p.pubdate - Published: - =page.date.strftime("%d %b, %Y") + .blog + .article + %h2= page.title + = preserve rp(content) + %p.pubdate + Published: + =page.date.strftime("%d %b, %Y") - if page.respond_to? :disqus_short_name #disqus_thread :javascript diff --git a/stylesheets/_layout.sass b/stylesheets/_layout.sass index 4f79272..e58b073 100644 --- a/stylesheets/_layout.sass +++ b/stylesheets/_layout.sass @@ -12,112 +12,9 @@ html body a color= !link_color -#header - background-color= !header_bg - border-bottom= "1px solid" !header_border - padding: 30px 0 - .page_width - position: relative - a.title - font-size= !h1 - +heading-font - display: inline-block - color= !title_color - text-decoration: none - -#nav - +clearfix - position: relative - z-index: 1 - padding: 6px 0 - background: - color= !nav_bg - image: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#ddd), color-stop(0.3, #f4f4f4)) - image: -moz-linear-gradient(left top, left bottom, from(#fcfcfc), to(#ddd), color-stop(0.3, #f4f4f4)) - border: - top= "1px solid" !nav_border_top - bottom= "1px solid" !nav_border_bottom - ul - position: relative - +horizontal-list - margin: 0 auto - overflow: visible - li - padding: 0 15px - border-left= "1px solid" !nav_border_left - border-right= "1px solid" !nav_border_right - &.alpha - border-left: none - padding-left: 0 - &.omega - border-right: 0 - &.subscribe - position: absolute - left= !page_width - !sidebar_width - !sidebar_margin/2 - border: none - a - display: inline-block - padding-left: 28px - background: url("/images/rss.png") left top no-repeat - a - display: inline-block - color= !nav_color - line-height: 150% - text-decoration: none - &:hover - color= !nav_color_hover - .page_width width= !page_width margin: 0 auto padding: left= !page_pad - right= !page_pad - -#page - +clearfix - background-color= !page_bg - .page_width - +clearfix - position: relative - padding: - top: 25px - bottom: 25px - background-color= !blog_bg - +easy-box-shadow(#ccc) - border: - left= "1px solid" !page_border_sides - right= "1px solid" !page_border_sides -#main - width= !main_width - float: left - &.expanded - width: 100% - -#sidebar - float: left - width= !sidebar_width - margin-left= !sidebar_margin - font-size: 80% - line-height: 1.625em - h4 - margin: 20px 0 0 - &:first-child - margin-top: 10px - .small - +sans-font - font-size: 50% - -#footer - position: relative - z-index: 2 - font-size= !base_font_size_small - clear: both - padding= !base_font_size * 1.5 0 - color= !footer_color - +h-linear-gradient(darken(!body_bg, 25), !body_bg) - border-top= "14px solid" !footer_bg - a - color= #ddd - &:hover - color = #fff \ No newline at end of file + right= !page_pad \ No newline at end of file diff --git a/stylesheets/_partials.sass b/stylesheets/_partials.sass index 815d958..160f93d 100644 --- a/stylesheets/_partials.sass +++ b/stylesheets/_partials.sass @@ -1,6 +1,13 @@ @import partials/shared.sass -@import partials/blog.sass @import partials/syntax.sass @import partials/search.sass @import partials/sidebar.sass -@import partials/twitter.sass \ No newline at end of file +@import partials/twitter.sass + +/* layout partials */ +@import partials/header.sass +@import partials/navigation.sass +@import partials/page.sass +@import partials/sidebar.sass +@import partials/blog.sass +@import partials/footer.sass \ No newline at end of file diff --git a/stylesheets/partials/_footer.sass b/stylesheets/partials/_footer.sass new file mode 100644 index 0000000..16ec40f --- /dev/null +++ b/stylesheets/partials/_footer.sass @@ -0,0 +1,13 @@ +#footer + position: relative + z-index: 2 + font-size= !base_font_size_small + clear: both + padding= !base_font_size * 1.5 0 + color= !footer_color + +h-linear-gradient(darken(!body_bg, 25), !body_bg) + border-top= "14px solid" !footer_bg + a + color= #ddd + &:hover + color = #fff \ No newline at end of file diff --git a/stylesheets/partials/_header.sass b/stylesheets/partials/_header.sass new file mode 100644 index 0000000..8ab6ad1 --- /dev/null +++ b/stylesheets/partials/_header.sass @@ -0,0 +1,12 @@ +#header + background-color= !header_bg + border-bottom= "1px solid" !header_border + padding: 30px 0 + .page_width + position: relative + a.title + font-size= !h1 + +heading-font + display: inline-block + color= !title_color + text-decoration: none \ No newline at end of file diff --git a/stylesheets/partials/_navigation.sass b/stylesheets/partials/_navigation.sass new file mode 100644 index 0000000..bdbf511 --- /dev/null +++ b/stylesheets/partials/_navigation.sass @@ -0,0 +1,41 @@ +#nav + +clearfix + position: relative + z-index: 1 + padding: 6px 0 + background: + color= !nav_bg + image: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#ddd), color-stop(0.3, #f4f4f4)) + image: -moz-linear-gradient(left top, left bottom, from(#fcfcfc), to(#ddd), color-stop(0.3, #f4f4f4)) + border: + top= "1px solid" !nav_border_top + bottom= "1px solid" !nav_border_bottom + ul + position: relative + +horizontal-list + margin: 0 auto + overflow: visible + li + padding: 0 15px + border-left= "1px solid" !nav_border_left + border-right= "1px solid" !nav_border_right + &.alpha + border-left: none + padding-left: 0 + &.omega + border-right: 0 + &.subscribe + position: absolute + left= !page_width - !sidebar_width - !sidebar_margin/2 + border: none + a + display: inline-block + padding-left: 28px + background: url("/images/rss.png") left top no-repeat + a + display: inline-block + color= !nav_color + line-height: 150% + text-decoration: none + &:hover + color= !nav_color_hover \ No newline at end of file diff --git a/stylesheets/partials/_page.sass b/stylesheets/partials/_page.sass new file mode 100644 index 0000000..f161adb --- /dev/null +++ b/stylesheets/partials/_page.sass @@ -0,0 +1,19 @@ +#page + +clearfix + background-color= !page_bg + .page_width + +clearfix + position: relative + padding: + top: 25px + bottom: 25px + background-color= !blog_bg + +easy-box-shadow(#ccc) + border: + left= "1px solid" !page_border_sides + right= "1px solid" !page_border_sides +#main + width= !main_width + float: left + &.expanded + width: 100% \ No newline at end of file diff --git a/stylesheets/partials/_sidebar.sass b/stylesheets/partials/_sidebar.sass index 44331b1..851a9f5 100644 --- a/stylesheets/partials/_sidebar.sass +++ b/stylesheets/partials/_sidebar.sass @@ -1,3 +1,17 @@ +#sidebar + float: left + width= !sidebar_width + margin-left= !sidebar_margin + font-size: 80% + line-height: 1.625em + h4 + margin: 20px 0 0 + &:first-child + margin-top: 10px + .small + +sans-font + font-size: 50% + #twitter, #delicious +border-radius background: #f8f8f8 From a632295e50440b6ea16fc6225ef2c117cde123f6 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Sat, 14 Nov 2009 14:27:50 -0600 Subject: [PATCH 074/715] gitignored DS_Store from --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index fe9f705..324f82d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ site -*/.sass-cache \ No newline at end of file +*/.sass-cache +.DS_Store +.DS_Store \ No newline at end of file From b021a483dc4169f2d7cd8f4351defba7e84edec6 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Sat, 14 Nov 2009 14:47:53 -0600 Subject: [PATCH 075/715] added check for twitter container in twitter.js --- source/javascripts/twitter.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/javascripts/twitter.js b/source/javascripts/twitter.js index 2d8769a..fe7ab61 100644 --- a/source/javascripts/twitter.js +++ b/source/javascripts/twitter.js @@ -67,8 +67,10 @@ function prettyDate(time){ } function getTwitterStatus(twitter_name){ + var container = $(twitter_container); + if(!container) return; var tweet_cookie = 'tweets_by_' + twitter_name + tweet_count; - $(twitter_container).set('html', 'Fetching tweets...'); + container.set('html', 'Fetching tweets...'); if(!Cookie.read(tweet_cookie)) { var myTwitterGitter = new TwitterGitter(twitter_name,{ count: ((show_replies) ? tweet_count : 15 + tweet_count), From ca68e5b6bfc2f45e73fc1f109a4617daa0cddece Mon Sep 17 00:00:00 2001 From: B Mathis Date: Sat, 14 Nov 2009 15:00:21 -0600 Subject: [PATCH 076/715] turned off developer mode for disqus --- source/_layouts/default.haml | 1 - 1 file changed, 1 deletion(-) diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml index 4da11a1..c61d504 100644 --- a/source/_layouts/default.haml +++ b/source/_layouts/default.haml @@ -70,7 +70,6 @@ google_analytics: true - if page.respond_to? :disqus_short_name #disqus_thread :javascript - var disqus_developer = true; var disqus_url = "#{page.full_url}/#{page.url}"; %noscript %a(href="http://designenthusiast.disqus.com/?url=ref") View the discussion thread From 04c07e7e85d53e02135965a3699b38172c39f34d Mon Sep 17 00:00:00 2001 From: B Mathis Date: Sat, 14 Nov 2009 16:51:42 -0600 Subject: [PATCH 077/715] fixed link to about page --- source/_layouts/default.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml index c61d504..66f156f 100644 --- a/source/_layouts/default.haml +++ b/source/_layouts/default.haml @@ -53,7 +53,7 @@ google_analytics: true %li.alpha %a(href="/") Blog %li.omega - %a(href="/about") About + %a(href="/about.html") About %li.subscribe %a(href="/atom.xml") Subscribe #page From a3fcfdea94633003f2b212ea4839572d042d83ff Mon Sep 17 00:00:00 2001 From: B Mathis Date: Sat, 14 Nov 2009 17:01:54 -0600 Subject: [PATCH 078/715] mootools core now loads from goolge ajax libraries --- source/_layouts/default.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml index 66f156f..f03d964 100644 --- a/source/_layouts/default.haml +++ b/source/_layouts/default.haml @@ -32,7 +32,7 @@ google_analytics: true var show_replies = #{page.show_replies}; var tweet_count = #{page.tweet_count}; %script(src="/javascripts/mootools-yui-compressed.js" type="text/javascript") - %script(src="/javascripts/mootools-1.2.4.2-more.js" type="text/javascript") + %script(src="http://ajax.googleapis.com/ajax/libs/mootools/1.2.4/mootools-yui-compressed.js" type="text/javascript") %script(src="/javascripts/octopress.js" type="text/javascript") %script(src="/javascripts/twitter.js" type="text/javascript") - if page.respond_to? :google_analytics From 7e87a4c51879ea819997f994e31b31910e1cbd9c Mon Sep 17 00:00:00 2001 From: B Mathis Date: Sat, 14 Nov 2009 17:03:37 -0600 Subject: [PATCH 079/715] fixed core library link to google --- source/_layouts/default.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml index f03d964..7ac1da8 100644 --- a/source/_layouts/default.haml +++ b/source/_layouts/default.haml @@ -31,8 +31,8 @@ google_analytics: true var twitter_user = "#{page.twitter_user}" var show_replies = #{page.show_replies}; var tweet_count = #{page.tweet_count}; - %script(src="/javascripts/mootools-yui-compressed.js" type="text/javascript") %script(src="http://ajax.googleapis.com/ajax/libs/mootools/1.2.4/mootools-yui-compressed.js" type="text/javascript") + %script(src="/javascripts/mootools-1.2.4.2-more.js" type="text/javascript") %script(src="/javascripts/octopress.js" type="text/javascript") %script(src="/javascripts/twitter.js" type="text/javascript") - if page.respond_to? :google_analytics From 2b2de6104e66908510b72ace065e78453fc2c341 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Sat, 14 Nov 2009 18:11:40 -0600 Subject: [PATCH 080/715] removed lame example posts --- source/_posts/2009-10-18-Groove-Pocket.markdown | 5 ----- source/_posts/2009-10-18-Latin-Rocks.markdown | 7 ------- 2 files changed, 12 deletions(-) delete mode 100644 source/_posts/2009-10-18-Groove-Pocket.markdown delete mode 100644 source/_posts/2009-10-18-Latin-Rocks.markdown diff --git a/source/_posts/2009-10-18-Groove-Pocket.markdown b/source/_posts/2009-10-18-Groove-Pocket.markdown deleted file mode 100644 index 2f14850..0000000 --- a/source/_posts/2009-10-18-Groove-Pocket.markdown +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Groove Pocket ---- - -> You can't hold no groove if you ain't got no pocket! \ No newline at end of file diff --git a/source/_posts/2009-10-18-Latin-Rocks.markdown b/source/_posts/2009-10-18-Latin-Rocks.markdown deleted file mode 100644 index f444681..0000000 --- a/source/_posts/2009-10-18-Latin-Rocks.markdown +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Latin Rocks! ---- - -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 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. - -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 luptatum zzril delenit augue duis dolore te feugait nulla. \ No newline at end of file From 6f10642bdebfef726318120b1f2eab26df022728 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Sat, 14 Nov 2009 21:12:05 -0600 Subject: [PATCH 081/715] added introduction post to show off typography and function as a first post --- source/_posts/2009-10-18-hello-world.markdown | 5 ----- source/_posts/2009-11-13-hello-world.markdown | 13 +++++++++++++ stylesheets/_typography.sass | 16 ++++++++++++---- 3 files changed, 25 insertions(+), 9 deletions(-) delete mode 100644 source/_posts/2009-10-18-hello-world.markdown create mode 100644 source/_posts/2009-11-13-hello-world.markdown diff --git a/source/_posts/2009-10-18-hello-world.markdown b/source/_posts/2009-10-18-hello-world.markdown deleted file mode 100644 index 492d50a..0000000 --- a/source/_posts/2009-10-18-hello-world.markdown +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Hello World! ---- - -How's it going? \ No newline at end of file diff --git a/source/_posts/2009-11-13-hello-world.markdown b/source/_posts/2009-11-13-hello-world.markdown new file mode 100644 index 0000000..35cda1d --- /dev/null +++ b/source/_posts/2009-11-13-hello-world.markdown @@ -0,0 +1,13 @@ +--- +title: Hello World! I'm Octopress! +--- + +**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/). +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: + +> 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. +> **Jack Moffitt** [Blogging with Git Emacs and Jekyll](http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/) + +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. + +### So what's Octopress? \ No newline at end of file diff --git a/stylesheets/_typography.sass b/stylesheets/_typography.sass index f3a81b5..15596bb 100644 --- a/stylesheets/_typography.sass +++ b/stylesheets/_typography.sass @@ -29,7 +29,15 @@ blockquote bottom: 1px solid #e5e5e5 &:before color: #ddd -.quote blockquote - font-size= !h4 - line-height= !h5 * 1.625 - color: #555 \ No newline at end of file + cite + +sans-font + font-size= !base_font_size - 2px + display: block + padding-top= !base_font_size + &:before + content: "\30FC" + padding-right: 2px + a + color: inherit !important + &:hover + color= !link_color !important \ No newline at end of file From d3313c836dc7f2f620c0b207df5ae97f087c56de Mon Sep 17 00:00:00 2001 From: B Mathis Date: Sat, 21 Nov 2009 15:41:38 -0600 Subject: [PATCH 082/715] updated layout, page styles, fixed config paths for assets --- config.rb | 11 +++++------ stylesheets/_theme.sass | 2 +- stylesheets/library/_easy_box_shadow.sass | 10 +++++++--- stylesheets/partials/_page.sass | 2 +- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/config.rb b/config.rb index aaf0042..39ca02f 100644 --- a/config.rb +++ b/config.rb @@ -1,11 +1,10 @@ # Require any additional compass plugins here. -#require 'compass-colors' +require 'compass-colors' project_type = :stand_alone # Set this to the root of your project when deployed: http_path = "/" css_dir = "site/stylesheets" -sass_dir = "/stylesheets" -images_dir = "images" - -# To enable relative paths to assets via compass helper functions. Uncomment: -# relative_assets = true +sass_dir = "stylesheets" +images_dir = "source/images" +images_dir = "source/images/" +http_images_path = "/images" \ No newline at end of file diff --git a/stylesheets/_theme.sass b/stylesheets/_theme.sass index 7e59e01..48a7b94 100644 --- a/stylesheets/_theme.sass +++ b/stylesheets/_theme.sass @@ -1,5 +1,5 @@ // Link Colors -!link_color = #165B94 +!link_color = lighten(#165B94, .30) // Main Section Colors !body_color = #333 diff --git a/stylesheets/library/_easy_box_shadow.sass b/stylesheets/library/_easy_box_shadow.sass index 437f187..b8b9fce 100644 --- a/stylesheets/library/_easy_box_shadow.sass +++ b/stylesheets/library/_easy_box_shadow.sass @@ -3,6 +3,10 @@ !default_box_shadow_y_offset = 1px !default_box_shadow_blur_radius = 8px -=easy-box-shadow(!color = !default_box_shadow_color, !x_offset = !default_box_shadow_x_offset, !y_offset = !default_box_shadow_y_offset, !blur_radius = !default_box_shadow_blur_radius) - +box-shadow(!x_offset, !y_offset, !blur_radius, !color) - \ No newline at end of file +=box-shadow(!color = !default_box_shadow_color, !blur_radius = !default_box_shadow_blur_radius, !x_offset = !default_box_shadow_x_offset, !y_offset = !default_box_shadow_y_offset, !inset = "") + box-shadow= !inset !x_offset !y_offset !blur_radius !color + -webkit-box-shadow= !inset !x_offset !y_offset !blur_radius !color + -moz-box-shadow= !inset !x_offset !y_offset !blur_radius !color + +=inset-box-shadow(!color = !default_box_shadow_color, !blur_radius = !default_box_shadow_blur_radius, !x_offset = !default_box_shadow_x_offset, !y_offset = !default_box_shadow_y_offset) + +box-shadow(!color, !blur_radius, !x_offset, !y_offset, "inset") \ No newline at end of file diff --git a/stylesheets/partials/_page.sass b/stylesheets/partials/_page.sass index f161adb..e17c8ac 100644 --- a/stylesheets/partials/_page.sass +++ b/stylesheets/partials/_page.sass @@ -8,7 +8,7 @@ top: 25px bottom: 25px background-color= !blog_bg - +easy-box-shadow(#ccc) + +box-shadow(#ccc) border: left= "1px solid" !page_border_sides right= "1px solid" !page_border_sides From e021b70d7912a08cfc05245be1a74b05bfcf37ce Mon Sep 17 00:00:00 2001 From: B Mathis Date: Tue, 24 Nov 2009 14:19:47 -0600 Subject: [PATCH 083/715] updated gitignore ; --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 324f82d..a835c79 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ site */.sass-cache -.DS_Store .DS_Store \ No newline at end of file From 54766a0c3b9efe24c61e749e07c2f7c298819c93 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Tue, 24 Nov 2009 16:40:47 -0600 Subject: [PATCH 084/715] updated rakefile to support github pages deployments --- Rakefile | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index d8d07c9..5d1816b 100644 --- a/Rakefile +++ b/Rakefile @@ -10,6 +10,14 @@ port = "4000" # preview project port eg. http://localhost:4000 site = "site" # compiled site directory source = "source" # source file directory +# Github pages deploy config +# For github user pages, use "master" +# For github project pages use "gh-pages" +# If you're not using this, you can remove it +# Read http://pages.github.com for guidance + +github_pages_branch = "gh-pages" + def ok_failed(condition) if (condition) puts "OK" @@ -86,11 +94,27 @@ task :watch do end desc "generate and deploy website" -multitask :deploy => [:default, :clean_debug] do +multitask :deploy_rsync => [:default, :clean_debug] do print ">>> Deploying website <<<" ok_failed system("rsync -avz --delete #{site}/ #{ssh_user}:#{document_root}") end +desc "generate and deploy website to github user pages" +multitask :github_user_deploy => [:default, :clean_debug] do + require 'git' + repo = Git.open('.') + repo.branch("#{github_pages_branch}").checkout + (Dir["*"] - ["#{site}/*"]).each { |f| rm_rf(f) } + Dir["#{site}/*"].each {|f| mv(f, ".")} + rm_rf("#{site}/*") + Dir["**/*"].each {|f| repo.add(f) } + repo.status.deleted.each {|f, s| repo.remove(f)} + message = ENV["MESSAGE"] || "Site updated at #{Time.now.utc}" + repo.commit(message) + repo.push + repo.branch("source").checkout +end + desc "start up an instance of serve on the output files" task :start_serve => :stop_serve do cd "#{site}" do From 399fe77f6708634c96568e25e5849818c56cc1de Mon Sep 17 00:00:00 2001 From: B Mathis Date: Tue, 24 Nov 2009 16:53:24 -0600 Subject: [PATCH 085/715] updated rakefile to support github user pages, and github project pages for deployment --- Rakefile | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/Rakefile b/Rakefile index 5d1816b..647f40a 100644 --- a/Rakefile +++ b/Rakefile @@ -1,22 +1,21 @@ require 'active_support' -## -- CHANGE FOR YOUR PROJECT -- ## -site_url = "http://yoursite.com" # deployed site url +site_url = "http://yoursite.com" # deployed site url for sitemap.xml generator +port = "4000" # preview project port eg. http://localhost:4000 +site = "site" # compiled site directory +source = "source" # source file directory + +## -- Rsync Deploy config -- ## ssh_user = "user@host.com" # for rsync deployment document_root = "~/document_root/" # for rsync deployment ## ---- ## -port = "4000" # preview project port eg. http://localhost:4000 -site = "site" # compiled site directory -source = "source" # source file directory - -# Github pages deploy config -# For github user pages, use "master" -# For github project pages use "gh-pages" -# If you're not using this, you can remove it +## -- Github Pages deploy config -- ## # Read http://pages.github.com for guidance - -github_pages_branch = "gh-pages" +# If you're not using this, you can remove it +source_branch = "source" # this compiles to your deploy branch +deploy_branch = "gh-pages" # For user pages, use "master" for project pages use "gh-pages" +## ---- ## def ok_failed(condition) if (condition) @@ -93,7 +92,7 @@ task :watch do end end -desc "generate and deploy website" +desc "generate and deploy website via rsync" multitask :deploy_rsync => [:default, :clean_debug] do print ">>> Deploying website <<<" ok_failed system("rsync -avz --delete #{site}/ #{ssh_user}:#{document_root}") @@ -112,7 +111,7 @@ multitask :github_user_deploy => [:default, :clean_debug] do message = ENV["MESSAGE"] || "Site updated at #{Time.now.utc}" repo.commit(message) repo.push - repo.branch("source").checkout + repo.branch("#{source_branch}").checkout end desc "start up an instance of serve on the output files" From 34e25551eaf1efcd60095b936ee851e980788d75 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Tue, 24 Nov 2009 16:58:43 -0600 Subject: [PATCH 086/715] renamed rake task for github deploy --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index 647f40a..abed03c 100644 --- a/Rakefile +++ b/Rakefile @@ -99,7 +99,7 @@ multitask :deploy_rsync => [:default, :clean_debug] do end desc "generate and deploy website to github user pages" -multitask :github_user_deploy => [:default, :clean_debug] do +multitask :deploy_github => [:default, :clean_debug] do require 'git' repo = Git.open('.') repo.branch("#{github_pages_branch}").checkout From 3a6974267b88b6d7653c96c9bd403d3785a8ca30 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Tue, 24 Nov 2009 17:01:32 -0600 Subject: [PATCH 087/715] fixed source_branch variable name in github deploy script --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index abed03c..c1ff3fd 100644 --- a/Rakefile +++ b/Rakefile @@ -102,7 +102,7 @@ desc "generate and deploy website to github user pages" multitask :deploy_github => [:default, :clean_debug] do require 'git' repo = Git.open('.') - repo.branch("#{github_pages_branch}").checkout + repo.branch("#{deploy_branch}").checkout (Dir["*"] - ["#{site}/*"]).each { |f| rm_rf(f) } Dir["#{site}/*"].each {|f| mv(f, ".")} rm_rf("#{site}/*") From b4540bb461bc72acf11fe3640c3f8a753ced4192 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Tue, 24 Nov 2009 17:04:11 -0600 Subject: [PATCH 088/715] tweaked rakefile github deploy --- Rakefile | 1 - 1 file changed, 1 deletion(-) diff --git a/Rakefile b/Rakefile index c1ff3fd..763d58b 100644 --- a/Rakefile +++ b/Rakefile @@ -110,7 +110,6 @@ multitask :deploy_github => [:default, :clean_debug] do repo.status.deleted.each {|f, s| repo.remove(f)} message = ENV["MESSAGE"] || "Site updated at #{Time.now.utc}" repo.commit(message) - repo.push repo.branch("#{source_branch}").checkout end From 24246ea8088eb612818c67ca47ddc20484d0bb93 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Tue, 24 Nov 2009 17:15:37 -0600 Subject: [PATCH 089/715] fixed variables for github in rakefile --- Rakefile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Rakefile b/Rakefile index 763d58b..b81e4ed 100644 --- a/Rakefile +++ b/Rakefile @@ -103,13 +103,14 @@ multitask :deploy_github => [:default, :clean_debug] do require 'git' repo = Git.open('.') repo.branch("#{deploy_branch}").checkout - (Dir["*"] - ["#{site}/*"]).each { |f| rm_rf(f) } + (Dir["*"] - [site]).each { |f| rm_rf(f) } Dir["#{site}/*"].each {|f| mv(f, ".")} - rm_rf("#{site}/*") + rm_rf(site) Dir["**/*"].each {|f| repo.add(f) } repo.status.deleted.each {|f, s| repo.remove(f)} message = ENV["MESSAGE"] || "Site updated at #{Time.now.utc}" repo.commit(message) + repo.push("#{deploy_branch} origin") repo.branch("#{source_branch}").checkout end From 1e796da9dbdf8b4f001928bc15a09d1d8dead8fe Mon Sep 17 00:00:00 2001 From: B Mathis Date: Tue, 24 Nov 2009 17:17:06 -0600 Subject: [PATCH 090/715] fixed branch name in rakefile --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index b81e4ed..21fc3d2 100644 --- a/Rakefile +++ b/Rakefile @@ -110,7 +110,7 @@ multitask :deploy_github => [:default, :clean_debug] do repo.status.deleted.each {|f, s| repo.remove(f)} message = ENV["MESSAGE"] || "Site updated at #{Time.now.utc}" repo.commit(message) - repo.push("#{deploy_branch} origin") + repo.push("#{deploy_branch}") repo.branch("#{source_branch}").checkout end From 65ab7abbfa79ffe14145c995dfb81dc6b2b11856 Mon Sep 17 00:00:00 2001 From: B Mathis Date: Tue, 24 Nov 2009 17:19:00 -0600 Subject: [PATCH 091/715] fixed deploy var in rake task --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index 21fc3d2..b05b5d9 100644 --- a/Rakefile +++ b/Rakefile @@ -110,7 +110,7 @@ multitask :deploy_github => [:default, :clean_debug] do repo.status.deleted.each {|f, s| repo.remove(f)} message = ENV["MESSAGE"] || "Site updated at #{Time.now.utc}" repo.commit(message) - repo.push("#{deploy_branch}") + repo.push("origin #{deploy_branch}") repo.branch("#{source_branch}").checkout end From eff018e91e5ab1adba9dc01c1ca3c186a1bb486e Mon Sep 17 00:00:00 2001 From: B Mathis Date: Tue, 24 Nov 2009 17:21:04 -0600 Subject: [PATCH 092/715] trying one more thing with the rake task auto push --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index b05b5d9..c4e18bf 100644 --- a/Rakefile +++ b/Rakefile @@ -110,7 +110,7 @@ multitask :deploy_github => [:default, :clean_debug] do repo.status.deleted.each {|f, s| repo.remove(f)} message = ENV["MESSAGE"] || "Site updated at #{Time.now.utc}" repo.commit(message) - repo.push("origin #{deploy_branch}") + repo.push repo.branch("#{source_branch}").checkout end From 87c7c1a163c1d7415e8089b124565b5ac4608f3e Mon Sep 17 00:00:00 2001 From: B Mathis Date: Wed, 25 Nov 2009 07:38:31 -0600 Subject: [PATCH 093/715] replaced a specific reference with a generic one for disqus --- source/_layouts/default.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml index 7ac1da8..65749d6 100644 --- a/source/_layouts/default.haml +++ b/source/_layouts/default.haml @@ -72,7 +72,7 @@ google_analytics: true :javascript var disqus_url = "#{page.full_url}/#{page.url}"; %noscript - %a(href="http://designenthusiast.disqus.com/?url=ref") View the discussion thread + %a(href="http://#{page.disqus_short_name}.disqus.com/?url=ref") View the discussion thread %script(type="text/javascript" src="http://disqus.com/forums/#{page.disqus_short_name}/embed.js") - else = preserve rp(content) From 50c0368400b26cc0e863d29ecaca72681ca6e2de Mon Sep 17 00:00:00 2001 From: B Mathis Date: Wed, 25 Nov 2009 07:43:45 -0600 Subject: [PATCH 094/715] fixed discussion url id --- source/_layouts/default.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml index 65749d6..6e0ad5b 100644 --- a/source/_layouts/default.haml +++ b/source/_layouts/default.haml @@ -70,7 +70,7 @@ google_analytics: true - if page.respond_to? :disqus_short_name #disqus_thread :javascript - var disqus_url = "#{page.full_url}/#{page.url}"; + var disqus_url = "#{page.full_url}#{page.url}"; %noscript %a(href="http://#{page.disqus_short_name}.disqus.com/?url=ref") View the discussion thread %script(type="text/javascript" src="http://disqus.com/forums/#{page.disqus_short_name}/embed.js") From f6e169a8dc3f827a55d6bf1b79675d7958c4216d Mon Sep 17 00:00:00 2001 From: B Mathis Date: Wed, 25 Nov 2009 08:02:28 -0600 Subject: [PATCH 095/715] added variable for google tracking id --- source/_layouts/default.haml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml index 6e0ad5b..fc489d1 100644 --- a/source/_layouts/default.haml +++ b/source/_layouts/default.haml @@ -11,8 +11,8 @@ delicious_count: 3 full_url: disqus_short_name: -google_custom_search_id: -google_analytics: true +google_custom_search_id: +google_analytics_tracking_id: --- @@ -103,10 +103,10 @@ google_analytics: true } document.write('" + string += "" + return string + end + + def get_gist_url_for(gist, file) + "https://gist.github.com/raw/#{gist}/#{file}" + end + + def cache_gist(gist, file, data) + file = get_cache_file_for gist, file + File.open(file, "w+") do |f| + f.write(data) + end + end + + def get_cached_gist(gist, file) + return nil if @cache == false + file = get_cache_file_for gist, file + return nil unless File.exist?(file) + return File.new(file).readlines.join + end + + def get_cache_file_for(gist, file) + gist.gsub! /[^a-zA-Z0-9\-_\.]/, '' + file.gsub! /[^a-zA-Z0-9\-_\.]/, '' + md5 = Digest::MD5.hexdigest "#{gist}-#{file}" + File.join @cache_folder, "#{gist}-#{file}-#{md5}.cache" + end + + def get_gist_from_web(gist, file) + gist_url = get_gist_url_for(gist, file) + raw_uri = URI.parse(gist_url) + https = Net::HTTP.new(raw_uri.host, raw_uri.port) + https.use_ssl = true + https.verify_mode = OpenSSL::SSL::VERIFY_NONE + request = Net::HTTP::Get.new(raw_uri.request_uri) + data = https.request(request) + data = data.body + cache_gist(gist, file, data) unless @cache == false + data + end + end + + class GistTagNoCache < GistTag + def initialize(tag_name, text, token) + super + @cache = false + end + end +end + +Liquid::Template.register_tag('gist', Jekyll::GistTag) +Liquid::Template.register_tag('gistnocache', Jekyll::GistTagNoCache) + diff --git a/_plugins/haml.rb b/_plugins/haml.rb new file mode 100644 index 0000000..7e548de --- /dev/null +++ b/_plugins/haml.rb @@ -0,0 +1,24 @@ +module Jekyll + require 'haml' + class HamlConverter < Converter + safe true + priority :low + + def matches(ext) + ext =~ /haml/i + end + + def output_ext(ext) + ".html" + end + + def convert(content) + begin + engine = Haml::Engine.new(content) + engine.render + rescue StandardError => e + puts "!!! HAML Error: " + e.message + end + end + end +end diff --git a/_plugins/titlecase.rb b/_plugins/titlecase.rb new file mode 100644 index 0000000..103bf70 --- /dev/null +++ b/_plugins/titlecase.rb @@ -0,0 +1,36 @@ +class String + def titlecase + small_words = %w(a an and as at but by en for if in of on or the to v v. via vs vs.) + + x = split(" ").map do |word| + # note: word could contain non-word characters! + # downcase all small_words, capitalize the rest + small_words.include?(word.gsub(/\W/, "").downcase) ? word.downcase! : word.smart_capitalize! + word + end + # capitalize first and last words + x.first.to_s.smart_capitalize! + x.last.to_s.smart_capitalize! + # small words after colons are capitalized + x.join(" ").gsub(/:\s?(\W*#{small_words.join("|")}\W*)\s/) { ": #{$1.smart_capitalize} " } + end + + def titlecase! + replace(titlecase) + end + + def smart_capitalize + # ignore any leading crazy characters and capitalize the first real character + if self =~ /^['"\(\[']*([a-z])/ + i = index($1) + x = self[i,self.length] + # word with capitals and periods mid-word are left alone + self[i,1] = self[i,1].upcase unless x =~ /[A-Z]/ or x =~ /\.\w+/ + end + self + end + + def smart_capitalize! + replace(smart_capitalize) + end +end diff --git a/config.rb b/config.rb index 39ca02f..23a73c8 100644 --- a/config.rb +++ b/config.rb @@ -1,10 +1,13 @@ # Require any additional compass plugins here. -require 'compass-colors' project_type = :stand_alone # Set this to the root of your project when deployed: http_path = "/" -css_dir = "site/stylesheets" -sass_dir = "stylesheets" +css_dir = "public/stylesheets" +sass_dir = "source/sass" images_dir = "source/images" -images_dir = "source/images/" -http_images_path = "/images" \ No newline at end of file +http_images_dir = "images" +fonts_dir = "source/fonts" +http_fonts_dir = "fonts" + +line_comments = false +output_style = :compressed diff --git a/public/2009/11/13/hello-world/index.html b/public/2009/11/13/hello-world/index.html new file mode 100644 index 0000000..cd0e939 --- /dev/null +++ b/public/2009/11/13/hello-world/index.html @@ -0,0 +1,123 @@ + + + + Hello World! I'm Octopress! - My Octopress Blog + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+

+ + + + +

+

Hello World! I'm Octopress!

+
+ +

Octopress is a blogging framework designed for hackers, based on Jekyll the blog aware static site generator powering Github pages. +If you don’t know what Jekyll is, Jack Moffitt wrote a good summary:

+ +

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.

+ +

Jack Moffitt Blogging with Git Emacs and Jekyll

+ +

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.

+ +

Read the wiki to learn more

+
+ + +

updated

+ + +
+
+ +
+
+

+ Copyright © 2011 - Your Name - + Powered by Octopress +

+ + + + +
+ + diff --git a/public/2011/03/14/test-post/index.html b/public/2011/03/14/test-post/index.html new file mode 100644 index 0000000..9759873 --- /dev/null +++ b/public/2011/03/14/test-post/index.html @@ -0,0 +1,114 @@ + + + + Test Post - My Octopress Blog + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+

+ + + + +

+

Test Post

+
+ +

This is a test!

+
+ + + + + +
+
+ +
+
+

+ Copyright © 2011 - Your Name - + Powered by Octopress +

+ + + + +
+ + diff --git a/public/2011/04/07/test-of-typography/index.html b/public/2011/04/07/test-of-typography/index.html new file mode 100644 index 0000000..1e73a43 --- /dev/null +++ b/public/2011/04/07/test-of-typography/index.html @@ -0,0 +1,164 @@ + + + + Test of Typography - My Octopress Blog + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+

+ + + + +

+

Test of Typography

+
+ +

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.

+ +

Why Have Business Cards?

+ +

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 +people I work for I’ve never met in-person.

+ +

When someone gives me their business card, I read it, pocket it, and eventually throw it out — 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?

+ + + + +

Inspiration Demands Action

+ +

In one of our campfire chats Nathaniel Talbott showed off his business cards which he printed through Moo. 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.

+ +

cards in a box Moo’s MiniCard’s 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.

+ +

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.

+ +

The Freedom to Fail

+ +

card concepts 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.

+ +

handout cards 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.

+ +

A Second Iteration

+ +

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.

+ +

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:

+ +

Every interaction is both precious and an opportunity to delight.

+ +

MiniCard Holder I pictured sliding a card out of my MiniCard Holder 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.

+ +

The Final Design

+ +

all card designs

+ +

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.

+ +

Update: I thought I’d share some other great uses of Moo’s MiniCards. There’s a fantastic Flikr pool, but here are some of my favorites. Enjoy:

+ + + +
+ + + + + +
+
+ +
+
+

+ Copyright © 2011 - Your Name - + Powered by Octopress +

+ + + + +
+ + diff --git a/public/about/index.html b/public/about/index.html new file mode 100644 index 0000000..ac52e9e --- /dev/null +++ b/public/about/index.html @@ -0,0 +1,103 @@ + + + + About Me - My Octopress Blog + + + + + + + + + + + + + + + + + + +
+ +
+
+
+

About Me

+ +

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.

+ +

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.

+ +

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.

+
+ +
+
+

+ Copyright © 2011 - Your Name - + Powered by Octopress +

+ + + + +
+ + diff --git a/public/atom.xml b/public/atom.xml new file mode 100644 index 0000000..a4c87f3 --- /dev/null +++ b/public/atom.xml @@ -0,0 +1,103 @@ + + + + + + + 2011-04-11T16:23:20-05:00 + http://yoursite.com/ + + Your Name + + you@domain.com + + + + + + Test of Typography + + 2011-04-07T19:17:00-05:00 + http://yoursite.com/2011/04/07/test-of-typography + <p>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 <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> + +<h2>Why Have Business Cards?</h2> + +<p>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 +people I work for I've never met in-person.</p> + +<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> + +<!-- more --> + + +<h3>Inspiration Demands Action</h3> + +<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't stop thinking about designing a set of mini-cards for myself.</p> + +<p><img src="http://yoursite.com/content/blog/2010/cards/box.jpg" alt="cards in a box" width="300px" class="right"/> Moo's <a href="http://moo.com/products/minicards.php">MiniCard'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's Flickr import feature.</p> + +<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> + +<h3>The Freedom to Fail</h3> + +<p><img src="http://yoursite.com/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.</p> + +<p><img src="http://yoursite.com/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> + +<h3>A Second Iteration</h3> + +<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'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't make sense and generally looks bad.</p> + +<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> + +<blockquote><p>Every interaction is both precious and an opportunity to delight.</p></blockquote> + +<p><img src="http://yoursite.com/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'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.</p> + +<h3>The Final Design</h3> + +<p><img src="http://yoursite.com/content/blog/2010/cards/all.jpg" alt="all card designs" width="640px"/></p> + +<p>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.</p> + +<p><strong>Update:</strong> I thought I'd share some other great uses of Moo's MiniCards. There's a fantastic <a href="http://www.flickr.com/groups/moo/pool/">Flikr pool</a>, but here are some of my favorites. Enjoy:</p> + +<ul> +<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> +<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> +<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> +<li><a href="http://www.flickr.com/photos/bcome/4177034036/in/pool-moo">An advent calendar</a></li> +</ul> + + + + + + Test Post + + 2011-03-14T00:00:00-05:00 + http://yoursite.com/2011/03/14/test-post + <p>This is a test!</p> + + + + + Hello World! I'm Octopress! + + 2009-11-13T00:00:00-06:00 + http://yoursite.com/2009/11/13/hello-world + <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>. +If you don'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> + +<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> + +<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> + +<p>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.</p> + +<p><a href="http://wiki.github.com/imathis/octopress/">Read the wiki to learn more</a></p> + + + + diff --git a/public/fonts/adellebasic_bold-webfont.eot b/public/fonts/adellebasic_bold-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..5bace32feb1193922a356a5a2c67031776ff5534 GIT binary patch literal 13694 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 literal 0 HcmV?d00001 diff --git a/public/fonts/adellebasic_bold-webfont.svg b/public/fonts/adellebasic_bold-webfont.svg new file mode 100644 index 0000000..c259c24 --- /dev/null +++ b/public/fonts/adellebasic_bold-webfont.svg @@ -0,0 +1,139 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2009 by TypeTogether All rights reserved +Designer : Veronika Burian Jos Scaglione +Foundry : TypeTogether +Foundry URL : wwwtypetogethercom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/fonts/adellebasic_bold-webfont.ttf b/public/fonts/adellebasic_bold-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7e70d0dee6f9a1319e75d25eea1251fed0b527fb GIT binary patch literal 24072 zcmdVC3v?9MnJ&6_Rdw~d)$dlT_2^bhYJ`v)sU?Jh#mg9DEE6IVjUWUA1`OC32*!j% zh=(vf7%*|1#E!?~;b;h9I9x7M)shKO{E&kkObEl+3^;@#n8RSK*d~tSVGLFm=lgfH zK-lrjnse5=Yh7t|SM93ms=fdHKfeF5i*d%77heivlPAx(>ubroKVXczaJ2aLNw-aA zd*}=whIahRcc&YMJu>lqw5Omw_uggmRt)?5U*jC#jnDV*efXhxoF|@OOuhx@7cW|I z-?D<9^xvbslQC)Gee+hWU^25Zrqcag_dT$7(bzw|c>(Q0#=iXS;)U}TTsiXoe`l-% zr`f2*I8d-beGu)@Xjd#=_Ru#6=0*3TJsZ#a_<`m3&b#mMx9S+{oR0GY%jSJ^1%H-* zhq0M$XvZI%w`^hMKTkM~_5-;7A6G12_0VI!o*j&R4gKT2E55OCMd=I9?=m*~6SNEP z8=?j~WN2q;d-(fb`K$bPvpC~H3q8f3gf?g2!Uxnr3m^Ho^a8Um#qz8rgBz8ZTlo#P zNStOiSzM|7C1abgcPBpLZ^jI4;w=6)QyqpwVpgYgInLO|yZSIGHI^gdEcJ_iPoH8u zmHr+_i}s4qhZWcsGB1wU*tc01`+wt(crYG~m&B{$>G(ZwvuoFIMO>U=ac{gZUVP)s zwe#10ac%$G3*Nrx?b&b7db|DYsc*;P>+(;*&p!Xh)jX+iikri``6Bd7RxGO3W_LJU zZcl;N=MMx!;YeY$C{|ojS{6@~Co3weQp2i;*NmvGOOLE?$TT*MY98J4r7^d(jvY6C z!o*v_eYa1!W9pr4cTM~9^sltvJ>#n#f6+N}*4Ji#ea<~|=iU6g|C`n~=Zjx|W7WfJ z9$NihxsfqV%uuW4i0WWF*co<#UE)pbAZ^(I_wyvLz+^G$p-lM0`CxfOJsm!`pwY4FhiXvhDV0idJF$;o+3=MEhS{WLHFgV?f($ToFBa*I`qPw%`X)`v5} z5#4M&A3t#-zw>~X-OI!`UHnz_Jiev9GdUlXFz7K@(Zj-e46j)E@usx=v3f-aGuD`e=jW!En9qtHJVW@n>V*2Y;)k7{Rbr6wyY ztcGijv}Ql4Ne#L+)K4ExY0#a#hUv2E^J}bSWIa#FzJ$;3jeGfa!>Hs_T}BswQaZ-( zH=Y_eWc2azcuu?g1L>k=7oKTlO-$oyP092~c4kv*G_@hW$2D78<0o}i(62GCZs9e$ zQqZs4@i=;nFCjjQjQ4qvZ=i47G?4p13edPD)(S~|TIpmlRtD+HS}>L@<4Puz(bRNS zl4ID@?biNmVR2bQLj#7Ejg*wqK{pP1eL)<|x*d+1?(uGqy(U}W58w#b;%Pm>YqU{C zz2l}_Uco{&4$V@h71U`KudalzXa!!~6TWieB(Ku~bsG2TEOJE)cy&KE+}ka2f1pNF zyxp==fE|msTeWxsHQjdc?GWE?`lf5V;u`$QCw|4e-9Z+>#S!scD86I#O?NJ)Yr0DY z?_Wy4?JlEld3+&sH)(0RV^Bj!3WavA`+`4hd=aRfNH!;}_%vt4Cu7Yt<6}+ICxuh; zxHrqS$`h4GYhOtot$8JWBCg?ctopU&vFbxTNv-mePd+(z@r_gXd*kAwX)&hGu2BJS1q8pSEXIA!(OAM(mlm?=2F0d>9kgOQm^**Yt@1& zv{-|#c>1-H22e`(gG<0L`bcw%-fuftOjG31!d@-dr`Hr-(Q5n9=njR0AXkmIdqhob zpeBoN5~-x>@%dY_IEf8=9`=iDmH6W~wLllHR~Lfm9WAfYbe=NmGWgGr92YOG&D8V$xV%;nwt`^nZ7iy zN>wGxBf(NxzPRTp&RhQ&|%^aAXJ(z>el>uwLRe_dLWPwEkOzZNm6ZFBW&Hm~NS zt6i8CS6X*sWAp08n2Qm(&`qa2I5xtor*JIc>etie{4~eTK1B1QXl}3O>eD>9QJkU1eIAOjuj_TBj|!q85*+R7C{3vF0TSX zGjU%~4M11$hEYw8plK*LZWl zQ8#1nhYn&8(~Ld>lr4uY!KN^+du&id9^&`HfE`@k1mky7AL;Awc8;{#YV?@5Ums=C z?AXy07lhj3bsnv*Pp>YxqLuV%bHdR-m=DZlxEIT<6JV0U|q7W3&!hFH8jg9FwUy$}jNYj^sI#XUaF z2jW-rl$yi@cq_#uG~D26H57~lMl~lwRu8wT)=0RFS8^PL3|KZ8yH@V{_u~dnwVl=$ zA07QKg-SG5H)iaLcS`(x?i_!CRFdA{53S8TVSM!DocWtJKKJ%7d1~F7HP7uIoitvy zZI0S(t(lIE#veN$-yTpL!AI}?K}7QZEpKdnrhOUN1x~hyFA}yVL6+ybu~7z%jnE&k zHiK41SQxS`=I=X-$}RSE_D(i87J`68eD z?#6WwpLz5pewIu80)KPMLF3!+UNZg;eVK@RZT!r=oY(KgQ=|M%jZ&&P?8hyuFRuUA z!;kd;;1y&0rkD8oOBeb5M>oA-gs(B9g!pZS?2*?2mHJo-t7ch;h3s`H*=yYefh&XH zx$HjwPi32rV0kfQghrSe$E~U6GM;M6grLwP)=F!dH{)o;nu_p_eVy48nquwC-h} z$j6l$=45Rwt4d&eIjuP|x?+cdXaJ@lhL<@pyo<=MSsHW(U2biFn9w-}<)7t@cDZb? z(cOZ`l}TTsDdEfb5}}0j%4OpZ+;^G#jZ2^K)CauGI7jX*TXfCEvpk7smoSZ`3C93l zhzD6t>UL1syqP7{JPIQ&<)NUJM;{-p`exK_`+m*G)u;W|k~7lSxy|I7a#qdXkY-3H zfLY3kZ*l zRzvnV3?cCo2fCt<6_dsl2$_ZEig}aeQii{_PvbgI2`Gj8My^eg*J9pfHi>0r%({ka zs8i?(p_E%*e($tU7ZTJ3@3ZJ~(G~a?ebAj8qTWr2fD9bzTRg-eSZ&`Vz}XF5)bIT2oKzZbyICEdYg^ zfu~eAU7&*X^njSLYTnd5mN)qt!3zmr5L!u&!l^tK2=% z8udsX&>mjD{4wYfV~6t34+A?=M|z6v%n3AWPwNFlp<H_V>;{m$Eseu*FB`)19V|1PgBQA$p|#NF%Xu5H=awzQD1Gk!KpUo_`T;SS<^ z=~{<;4m3)#2MFisE?YmQL=S*{VE0OiI2CElb5fTb{aToyLc-Ud4JU|7Vc0^w5`2^Z zEYrE*BNurZutI)cR(5#Ed-aUr*d@8m9HJ+J1mJ$p8D+i`jM zx?DBCqsDmrL(v!YS_jyqo|Ph$24_YuKu3Vw6p$O*DhlKg6+#g$C7~!wYyOkE)zPoV z(FH5PR#rk{THrt@T;L*Kx78gfB&enMfe}E_ggh!kbYsalh?>but~C_^dr0!W+_~bV z&mK5#T)t%N)plxj56GsmjpSE*(e z6cv#-?`x8yUuS2s&5 zdDiLO>*c53J(T+?Js;KqH1>eTLD0CKEj2x2JxabVQF%C#wjr(A0PbOd1!k`W>jLEu zgN`b0&;uSAJTOcK3=?sqE6x^uSS=8@B^31%p9D;L50Co%&r7y|GgM{baFe!#1DmUw zfyjy2g!oJjf~%9}b-a00b7KlhCs-=U&2JgM|JSpBTr~R`e&x{NbGeT;otQJ%6)bZl z)9%ivmhzo#UoM?AMmn(WSFap-e&6yRw=LH9|8n17>&Dgfi+6QQj@1Us-N7Pj&D+br zzLifMQ#m$MPBcK=;aaEC3SAULjARibH6%kkZ18uWjf#N6i3o|b<~*qvLmL%)broX| zHRxV2S2@OAOh%0KkfuWYcnI+#_5tYur-8jR-lCO}Fl$9V-3yi*SsxLS(yXS)8>xUd z;!TuS@j96t5y;T8jT`@Z(|zjNT^i8gc}dOvZryv*or<@*{gypbXD#u+u>ASIo5s%{ zIsHLyS+0J%bZFX&Rbx)AL~xtNBQS+h4@}`?h;a--5?LqER*y{}41sx+lbXGOKn0{m zU<;rhfh}|k`gt8)_=jMOeK&xH>@Z$I6vcd|iyy@^ov^wiSk_0+@#LQaQ|pDP1#*E= z)!hgIcgw1sn^1Eo(4xn9Geh9k;}JKP_YRzsW0P}xq*;4;l$Y}4#lwfqIeCFQdB6w{ufYk&H+mw)x5A@3s`f$gG+eno|SKJu$U33RAVCm%0(Q=7K zA#rmQp<4z=A$c{q4^bc!-~rfio#8v*dpl3n@@6i7G;nURG%L4vk{si&85hqTK77$Q zWAc*{MEozx%Gd&yEhZpSW}?&};(xl6hJes$=}A2n>hET;Qn;oZk^&3Eu!(u8k9rvB z4>2-f*?OGbU~w67fbN7M&N5$=EOpSQ`GrmKja7tOZY6a#DifCx88Nv->NJi_{^}!B znmfKc?UslfxcdHa{vkhqD)bMU#-HS?RcFQM1(Q1FL~V(Ue!g~=G3(IfBIA^aizT+& z*r3i(wz4!E&3?wR0gOc}$mpX15aSIZ90*p@>(I==JYq8}-D6kTXz~$S1Z1pn_9H-~ zhcS{-*d65+P{ifz*S}<DB7{^y1PhTC9(C$BIYR6ZGQO_XOgq90m7_ z$@T(Yln)aWsgt2OpfiN#)JFT^I%^r<^R94dWsNG7rzN5$;|xGKLElocJf&JmllU_Y z5gFRDxq;AHl{m{1qvQbW8DVMVVExVkW3REAAK>%(M85G8GcskaW zX{+>JH3p0e#z`LM_TBAclFhR>?R;YQ6uySf|9f5hD2N})_)$R|Kl1ij;F5GJK^f6c)+4KKZ&-k0KHf=j zP>O;E!x3@F{K8BD1Vu0}A@C=81*wEJ5=sC(Hp4T5U%=(0th#b*cTY8x+jrz%omK7N zukfY(Wn1-}+_U@LFLe1&obY#bg&ifzrB6LkN0`4V)#i>vBOrTZDFJ=LKxrxD1WivW z0vimW7tTx8O>&mP5wYV``+LetnH$&#CW?bc$(M-$`;;|g)rjz6BzO|e1~Sw!aB2un z81fg0-1++TY8;3qVX^|SR7@{5hozPIbU)#slwT{z4^p^3FvLv>ikDddp1qaAKG*Oj z(@xiL=~8a)hM?OW+#qH7E8knnJ93_F+rDS)ZQt_j7QTX)WzQwl*tErm z&YwECro-=1%J>Om<4W1WJNS~6et7ynol*?#w3}c9Q?8L?T|vv%}bI>^8O=i_SJmF7ZI6;K|4JK!cjF361xQ>+y!Y>n3gXX3I-JZ+<;0kXaB)~pf)V>x`E^Q@w8w( zCB`BCmQn49@Y>Ih=E3vEd<@P@<7tH)^gs@(*k2(oMsiRJIq=ZD6x#cHDk@cvyQZf? zSR*Uvm9QL|;?sSQaR@#6%L-Bx z6~fl&g@~AEo&FeE;e4NllQY2IYn@g@iDTYVswU6PBJCiDSl#M~%1k zOovQ8yoR&R^JTW^oH?(ZJAJCNJ#oHRS`DvRiWyVp^HnFfXD@_nS8I#0-g_Xa#*B-9 zGz{aSM=j&7pAGV?ItlZdVNbDaLEc(;$y&HGWG#w75p7t8%yYIlH5`X}61IXOuxEnU zvoWm&5y}I5!lK)QL<~C^Tyr;MgLY~Kqi7X0Xm%6GmpAC?Kz}wZ7&$#0=NPnTT5xd+ zEqIYlB&bouv$YXJ1l0@(krBAT+Z4YJA=TL^w5Hjju#q|`_f7Cb?wBL8IkzS+%bPbx z98$e2v_X1oOT_L7ZxQ^#HKUzaqHCz?-077H!f^CA3PmbfpY{vJ;m|=$x(a$l*zH5) zAd;5@NU!D*mXwSHG*C7mMjC*yijfAyNS)?LVQfFg-Zw@eUCm8@D(H5Fo|3ff5r;Fp z9ewmf^Xh$QuZW+K>yR%C`JBhHC@redi@?t+@v{Y;vY}IuKg?AK$)XTaq2N|G`sWsr zUAGOg$3#GmA@8R{@LcDn2ZhgmGsP*(kn)xBFeTAONgh}5XVNR6 z_RoH``b_#lND5ZgHrMj$@{S1EC3M^!9+zWaj2;9RMoJSR3p_ln6(D2<)`J$33y82X+<1IPFqi^i(F!PY8EnvN zOjtA0eWI5TilP+*qLd)WCno?=D*AeV^}xRvbjG4lN=NF`tIDrvm3@HsHn=a{l3anH zUnPB0WUsgcWi)xj!kx1TXF(w;pL2VVx;at<9I zgeE&g$3N|l{MziRbt&e31pDW_hXAxn(=7Q$kp3wp4lXN4O+X3QxB_fkE3(gS4|rEt zKerzpEEK#;i95n}k{Xqd*%P{ZpJ|s@B zXpX+#F@N!{YVt!ljwkvM_qw9l``GhTTNO{3bI*TDEh?)TM6Y7{^%4rXTPsOa24mVu z0N135Y2VBds5BC3xR5Vc#;r?p_v{Y3Y{qG$+c@iRgtc7WR!fz9fsL<`f}11u_-3K2 zWJhkY^uoa9A=)b@*kWL=+|@;_@#*=bB5WOSiMjwZE=MJr=@CG-;1N)grGc-q9Hn+(?+}WVVBgdA=^OG4+9BOj5GJf92^@SJ_TK?d2}oE72YhQ&VjUV&%d>)_0 zXXjc_CiD1#-$wa!d=3orK4YG--`KWGQu$TG$PJiyS0Oz}H35jj4hpSSh)Ng|h2#*V z+Y^X#@=GAyB7zT-6NEa9!uATT4~jI4Fv^r>Ar}S7AxcAf0qPOdXL=Hm!aoOy!y#{i z_%&kT8PmV5;quCXGkF!YpWEKa9eWxutJ3IQG-hUJ{nkg;nj#(%l>YEl!(|+xnUH4t z8y{@nG!J8IHl|ySfaXOQ+Y)AurwlQ21OX5P6+>{G)XPEfaxev&Tb1XKUe3-KA5E@b;UDqHfHr624>x>wkt8*xj7NwmV6bkuQt$K_m)0aU z8mAL#P`~t{K zf>(l${%#&jA~42~c1N(B!jYHUzj%^Ja3BT*>U*X?mr?bk4GcWPJ_GJ0s< z$mnHpOcWs%40C&`QhBBS{LmIDeBF+!7|=~i`VbIE3$>6SKfg%Cs9A6XF>Bhd)q}JM zC5pNt3bV_RQduNDDyRqv@TobD8YC%&3n)yZ{z3;Y+6AV+$RxEFL&|Jm@}Nq9o2) zQfCuN$#G|xfC8NCKqSj|8=cw6ryl?{!iwd6HkD$dmF$~&jGKhUCIQmaj9v)PV6nvn zHZ&7dada{+kV_m!DI17WCj*5Lo_HPr7km)_rXnd87rK$@g%rPW!H6{e#iqnA-y%^==>M{ zp^L`sz#N^xm;-FRIY)@*2_uCN9wGaz&FvLK4yJV&C*t&jiT7KFDgj53pi6J-%nx3p z!xoJJ(gXl?qE}Gx#h#a_Ts$xcX;6$Xq9#hfy~a36+!MuFy$A9>f7>$Bn%YAx*?FwRwy|3gxtTjiI2kidj70uVzJ9ge5wHu?1 z_343%D=0f;Xb6bTN5<*ftDb2OO%k*B;j8_5ht3_eK-^>G`YJXO~#w1x?#_6L?N0-b5Sf-w}3cG zU+>Z6sT2{xLm^twEL2HmptoW7Z_b;CQHmMq)61%^Xr*St#e)c~2NBwCH+{oF><)+G zXqM488}CA-7Ap!+w1iaz*Xf5HknoF6U3Z0=n(aIvzO@gM5NQyThlCS^Snj;PGk$Np zw>`IiP14UFHSY5!?hi>Dy10W!wuhwR1tno)1OIVZ=)o>OUt?^h;I6HVe(LerQ4d(G89FO+tzSI@X-^YGxwGn$o ziw3F2pEnPfZDBu(PzM6S2ZEH5xZyJl(&`4Q<@M&=fip*gZey`03CUa3^@;bBzYR)` zj+D#T<_w<_3Y1Tm4o94VGR6E~O&QFMGxp|{DQAm88wIrSp{U(NnJx-PioCbWi=mTL z>N1YWB10})%|aeZD-!2r-v8}WG+s@{Z~^U|!vO7F0@^z%?IOukL2AN#F(jTS7uj;N zlEtEYxN3=DkhT&YmQ-sr@gt8U5|0?C)eoNwE0tGY zPbpzMry4a}8~%eDu7eXkTf;>e5%wR|aLF4`G;)wf^EF(YO~P2nemPNpkaf~n$O)5> z0?&^{I*B@!9;{ZO;hcWp%mw3Z}95&>QDw(P3Sd zY;g0aTuoPpU!j5S7rN4-<{6oPrkxjep0LB!O(;8%2K)m8`DgeKd5g4wzi$Mk_d#c7 zY*W~^#mK}&%*?D6B@G05&2l-gKSxSdVPratZNvneN0s%`Rdot}6Q|$w$aW$S{X~;a z=I48`>d(rXrK_urAMRGpFXA;__`M|RF6JoX5SOo_=n}0%&?~{&=uQoV6|x~@(9I$- z1bLwak^tUG;VDsAJ&G_ww2Tx%6bTYhiva;pX7*K?0`G(b*bz%As{u#E`+!2b9d;+c zB))HeN!CrF0wNyQ9oP!VPf`UKLTi)`3IQZWftrLTQ^IgUZqX`zTC7DY@b9quwj;)g7Y@Ex-`PINc$**i z@Kr}-zA=64tf{LzmP?yCANkCWT;7#4re!(``I!H4-0%=Se_)S8Z5q20-Y3z|4=nx+ zWFrjv=Y3L<%oQO<8|odiZXzIDIZ?Vn)wlrTa8Mj(1v+_~6fmdi8H5!v&SD>mg~($o zA`2TL0>BH^+bY&TY0GIbW{n}j9u^ux2@rhmlkkdeVIpic?Lz)j!iMu^EbPVJ)k|} zy2@*yeS{^j^3mkoI8d+PUAT=|AJHEx7?EZq`j-m^E`<+W>ZSTm&4scdBq{R7hu=kr%d+qguPt>O8Ak(imQM=2is1V7)( zwI3QsFjkt6%a{*8MvM4>$W9^?Y0e1BI(q^IvK?8OfLNzO`D%)?7htT2Nnz1X5Ip8W z&J}TWJy-xO2cOiDcpy*^Zv zY&ebJdh}*^gQy15$`N;iTUF73YE<1zYOjXIK$BDjkpVQR5>8bWz(@D^stVX)wd%TS zHG*6#2bCyRx0rQMq3}=_tC2FrwBVwlR0>%dn;K~Wi(0~i8A|_&g4(iN;i{n9xB1yK zr>3uY;1=UtFx)t$#>*!edp(h>JK?t#O3Q;sR~~sGI%e&xq*a|z7@P8y?*xzLC>bJR zXELid(#k5#Q;IdPu~@a7tpfY?)TnF{%og%F6~v7-iDGI74N*W3isd?m%O#X~XzUEuoM{A@8J@!g1Ay)%pBA zHnk!!8ah{(zXYmtC@gg}1jidHBAFlQ(`}{L*7&n<4sZm_WJP5i5+W&UL?MqJ?me>O zRCd?Yi1LLx=xa<*BmtjMREfY@lq(Sn$i!3d{FPNNwte{O+=-J8^P1UD`xV&Gj}4X? zJ8MjO`t-RUURZt?|DLho-p*M|U+TDjrE#L^6I4Eh$JWT}J#&}uekHKXKO$6Gp_fYW^)jfO zG65#bz{;X(htpE6C`hPKoIas2`+R$;2UC2$^~Q6 zsU^dvau+Qu^D!8kSX5No}BdUq&;;fya-zaO(TBy^ZG!?sxwRxy=XQHZD z^NRps1l@}WXBw*?L3fmGTYWn5FKTSC7=<*v#izN!yMtPt$|FU|_9!t3!Lj>d4;Avg z#&ausYdSk-Pi*01=47gjaA0La%Xs5ZucUS&Gw)YBzAwS@JX(EYiCK0 zwG`XFiPHw2=393JmDsaJq)Y{?nX)AJtV_JPx#xWFk^Q8?i%YEDz=n{l*R2z@gNeJd_3LaBpZ zQwx3S^kFYu4|(T4QEMNe6#u9eZMZL6U5n#lYJ81#9P0$arntjuK`WyDd96^!Nso%M zadFZr8IzpN_3blMN2J~8R0HYC+0*QW3v;iNqJWGo@jAEvPi^XR`*sLz@pNXwEu-r* zMmpw^Tsx$$WV*RzV(vuLrQ~PTl)$C(hW`cy@_g>&s8>R?i0G3oP1Ic$ihUEZ6 ztunGZSbm|Ei>l@*4ih*wX{CM|c3|g|q&J@)GhuYP zB(FLN0fh5Iw`|3@8Se_i{L@lyi}KqQtlrYSqouQ+Dr@%#$f3SdTfF6L4s)TK}%cGgQB9Y$6R zg#&<%<c_V*usv1AB%;NE2gv|jGPKM zh9&!9L98$_DFw)j%RvDLdo(Lkk|_^>GyS#l%db(8?-nJtX2G#p!$Yf6 z%}T*YbArM%lvDBvSVYdm!Q7Kt)a!V5&r7EUdUtF>!IIYzo@d-KcgEuTUYQG$fGLF?V10{&VCa!`p(Y=KgKNmIP@0OFbU2O?8)=Ppr&H+cR^(>T{hCEH4tOxGgwGqVcEP$VPPh3Q~)6& zk*ZV81eW~7>7W#7n$|VG?KZ!2>VlOm#v6}Zj^kjYb>5zPW;fL@Y-+10;mRxLek7gt z+#glEi!19RUPba&-M+3P`wxv_UhQ2SQ-VvIN8vRD#j&QbvzxO$V+2jSpvg4Ld>}d0 zBnoda3jf_tf*ykRVQ)YjyT>WqlB`oGV5e~A&H7LRb_IYMCQk=R0SKN~sb&Z~??J)2 zM*zDUiRBQMFF}!wtgl2-IEui1B`$?t8?i7ZZDy4F;8xdH=qED!Zt5mjX#1 z*jE~e$nHQ0QMh}f0W5UN*ywdM-Ti}hLfP|!d}rZbs;(c|y`O&^ zbz6eFbF=2Q&5;VCPV5itBT*D%gr}ig#u#tTVbRFGFo*T(t^M|)7|$_6Cb0< z26I@o|3^8j8zFT$V?1m0IuacTsb=FFo>Py;_^GMY4taXa=HIo;n>!#)@$TB?azrs# z7zZ#_4Rq_Vo8D$3!Y^N(!TQB(AKW9xVnLu#?bAKOt{_*_J2v*=7CLOv1~XfDbqQs* z4*k($9v{qXc|>Nbwc~@Io5yMFl-a5?Gg~eRMfLf&J>5ud5fmQp&Btv2>}hg>^HJMs zs;K{h{FY^_@nV;22i6-Hwj{`;uG(3!pEqf)XIIDgzNsmPv@h3g(rb?^*C(CMRZ8Ps zdvv9-Q(hAM{RR0gVuLTtZ>9h8M1FZkKEIU~`K@ECPfjILT+eTf6#1?6#uH`c z;e39p{{N%=7QB6OSw|t!l~0mJng?^F!l8I6_w%{W?OA1nX2*)K;Pv;>!uFt)Sn#9W zD}wyBdt9ljyetu%-Q_=e#J{7|G*5|cbuui(Q5s(@hKs?}3Kyuh#T39c}$ zcr*`X5NaMA+YRC25qWE_qbuR>G}hXZGZIqShVw#%4o^ffs`Z31ZI@rFIVg9=Y(WyH z^HK>3lUnjAipB8$8N|x^F%BQCg(TbD<1%fU*!K#LR>)S5Y`&Q$pNc|38hKBHsi=mf zzxe@;>v}3G^Iu3sNpkc`0LkwC=SOeWUB}mkwt}-!G;!aMku*FqE zri!}TCymp54}4S^mHk;s_@!U?8jd|!mK`-tThpM&B+z4{pvOZ@B&jJwO?f$v4T77f zC*+z*4_cW3dK5NjWnQhEf_e&?cnY*Xq0SIcxOfdkIqG@@Wy+8!K%{~Jje;^(!XYsq zg)Y!?B7ZQlK9I`Og92;xR+*G|eFUw$iiGk6QacB!(Q$)9#<88jrm2}rsNkZ16Wkju6xJhK>EFzp=4T5cwPY zO}o;@A5}AWj||>Vg1jQu>WaJ~-YA2GPgqTvf1?by(yDZN9}CK;9?c3 zebD;x#azArA@jl`Ws~h8Gr%b6z$g>MO^`qQ`Q zBlv{$3p>;`aO9qXTmFre+2~?=_vz-rEh4^Y+f-z|IXG4lr^RnnC%v!K)_JY^+IMYJ z=`J_@t*2Mr(4Vvim;WucEo_OV+Ax#r?;ysi>TuLg$nm zn`X_jY3kqN<7eY6HQ0Jtv*p`3_Y#|J*~T*J?X1;ujyY_d%%!GT#!HsLo9UaMCAP3)(v#jF~~ ztCgSN`uA8;d6i9(UuV_w1vXXw7V|2f;@qbUZ&?K$-efW5PuP~T$l})ky z7;Rin_W*BUj5qx?vPFCp|5(~3e?$Jhd_ex4GE7;dd{^10{MO>KbXuNKhpW%1zq8(A z-DkaITVeZ+-EW_2-(i2%!5oX6ai``Q>3YodJ9nGA$1~dVPX)yV-}07wzv&z9>+v)H zgZ_UF{8eyN@Vg;f=)uq@;a!o&$YYTgB9{t>6|N}UQn)8NHM+mZR`l(nw`1+aql>i? zSIMH1cS-;F8I`}RlJH;t1^*MP z=2v~E>ba`@Rd1&}sTrxR)H~w;2KdPlH?N(F4h+Y;!Y4R4yjTYD8d z_E+Fz?sL@G)0>g$I0TA4mfx50evt3w_Z6&}*q-0F0B`r@_f;0hyJOAYzRn(GSJ|y> zIqtR=Ui=bvAF8V!!WF|%TUCv11GM!>yay%D=HrSun}P2Y!0t2foBObR2-h#fFY9n_ z0^ZT{0Jb;ovr4oUvQ^@mhw;4tS5Cn9LUHXvoS(?%;rtRjZzAsb0M4z!+4&gva`f(@ zFT9$5X!-+CM* z9*`j#7WnK|%q_~75xI83DtlM~-q`FzjX?mB><~C50zQahZeu{eC5RK2;mHZidlFc` z5*0%!%wsk3`88OhREr*@L6>^WX$Ef=wN7bSyY=JZLr%95IRA zhVk8w>XJLKZtzaLq3ABG3-~gd&c4Fh+1;4`uOgTC7m)m!sKEXjo6Ww?=CFI%Ts9By zsgqG(U_sd1%5B_^N&_c%aW}%^1>DPhh`@KFBI~EDhds~!AB4*T2!e*Js~=o4a^!@O z`RydyHjEr8+Su0T+YR|`CckaWZ=3SlQTc6iemgq9ZOLyZnA`gNee3HTiDS+%}2rZRmn@D{9UU@N181d>gw{vrX?r>f^gJ^~v;JWX+40DhJ!K^OrMA z@Dk(Mop?`G{5DOlnWS0cw`J9037J_mY-m{FQi_Hh4civ8f%oF(ulM1o<1q=fi<2M5 zFT7~_#$9g~py{o=-t?e}SBec@>_*e$yWVu6>3;Qk(}||balPq}--g$*J#vj*KN7$N a{->@tgJ=eByWR|;8H@}zXKKM3_P+sZpC^?7 literal 0 HcmV?d00001 diff --git a/public/fonts/adellebasic_bold-webfont.woff b/public/fonts/adellebasic_bold-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..07ae59a2acadf65b8833ed6569e76d3096dd7171 GIT binary patch literal 15604 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 ML2daB;pO@M56S|o4gdfE literal 0 HcmV?d00001 diff --git a/public/images/code_bg.png b/public/images/code_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..a57bab56a1b0cd439a7f6cf3f8740a91b256372b GIT binary patch literal 239 zcmV p6S*ttK@UmXdS2jvWQ_4W{|5z_G!U*Lc~SrX002ovPDHLkV1kzGU}^vW literal 0 HcmV?d00001 diff --git a/public/images/rss.png b/public/images/rss.png new file mode 100644 index 0000000000000000000000000000000000000000..723559bc4bf35a481342c96a11c5e5ca258f641b GIT binary patch literal 6905 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 literal 0 HcmV?d00001 diff --git a/public/images/search_bg.png b/public/images/search_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..0587723eeab9f48b902c76928cd1283923e2b309 GIT binary patch literal 1058 zcmV+-1l{|IP)5dG9n4|}!4%pCb?Bgw4q``(;3PDI;2>y35GS=DxCpv9IMvNAO0>|T2o-;a;!i4V zRg8_6q-sp;JJ%?Q(d1Q^=H+~FczU^c!y%vNoSXPK5P?i4%MmV)NR$a-27*X^wuD#^ zVjLqJ4j(3a0hdG+lW=hf(LlK+(tr_szYF4cZrdPFAWKKYyfVroktX1K-N|troS&ah zi>fe@_6tR^Q~roF#*HJ$^)`*WK^8Yv6@p;kd}EK6=DILnNEU*Kl|~TeN!$z*nOR;_ zeh4B4L-b6;DvVq%$J4Ma$_+u>ia8Vtd3a_G$GOD3A}cEknwpxxX0t(db~amETwH|F z(NS1hTB4K^QU)D)!zzqIq4*_SG|6P?>FEKB#lj>(K~S2isw#Hv?d^rh$w^8pAys_A zU@(_cDwQwb;$$o#PNx&9tE-`}uP;UnyPhQ`~8$!LaNw#p&he}*;!Fh z!K%vC)D*UGSL=IwdoVOK1Z{0?tW~2bLr7g1Q9H5iT3%j;oA%Gn&R$g;vG*g0RD_qw zWTH2tG&k+f&(DX*;Q{>1{RkrEgb`a2u=T2}tc0<#vA8* z8MbBv0|Vf8yD77T9@=$R&Xdg3}b*wq{z9Z(ht$)i?lL95mK6v_R literal 0 HcmV?d00001 diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..34efbb0 --- /dev/null +++ b/public/index.html @@ -0,0 +1,177 @@ + + + + Octopress - My Octopress Blog + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+

+ + + + +

+

Test of Typography

+
+ +

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.

+ +

Why Have Business Cards?

+ +

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 +people I work for I’ve never met in-person.

+ +

When someone gives me their business card, I read it, pocket it, and eventually throw it out — 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?

+ +

Continue reading »

+ + + + +
+ + + +
+
+

+ + + + +

+

Test Post

+
+ +

This is a test!

+
+ + + + +
+ + + +
+
+

+ + + + +

+

Hello World! I'm Octopress!

+
+ +

Octopress is a blogging framework designed for hackers, based on Jekyll the blog aware static site generator powering Github pages. +If you don’t know what Jekyll is, Jack Moffitt wrote a good summary:

+ +

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.

+ +

Jack Moffitt Blogging with Git Emacs and Jekyll

+ +

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.

+ +

Read the wiki to learn more

+
+ + +

updated

+ +
+ + +
+ +
+
+

+ Copyright © 2011 - Your Name - + Powered by Octopress +

+ + + + +
+ + diff --git a/public/javascripts/mootools-1.2.4.2-more.js b/public/javascripts/mootools-1.2.4.2-more.js new file mode 100644 index 0000000..2c12092 --- /dev/null +++ b/public/javascripts/mootools-1.2.4.2-more.js @@ -0,0 +1,100 @@ +//MooTools More, . Copyright (c) 2006-2009 Aaron Newton , Valerio Proietti & the MooTools team , MIT Style License. + +MooTools.More={version:"1.2.4.2",build:"bd5a93c0913cce25917c48cbdacde568e15e02ef"};(function(){var a={language:"en-US",languages:{"en-US":{}},cascades:["en-US"]}; +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); +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; +},addLanguage:function(c){a.languages[c]=a.languages[c]||{};return this;},cascade:function(e){var c=(a.languages[e]||{}).cascades||[];c.combine(a.cascades); +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)); +};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]={}; +}$extend(langData[e],c);if(d==this.getCurrentLanguage()){this.load();this.fireEvent("langChange",d);}return this;},list:function(){return Hash.getKeys(a.languages); +}});})();(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"}; +["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; +});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]); +}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]](); +}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); +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); +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]()); +},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}); +},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")); +},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(); +},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"); +},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(); +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"; +},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"; +}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); +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")]; +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); +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); +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")); +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; +});},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"}; +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]; +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"); +}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); +},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; +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; +}},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); +},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); +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); +},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; +},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)); +},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); +}).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?"; +}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})?/}; +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}; +}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]; +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); +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; +}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); +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,"")); +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; +if(q<100){q+=m+(q0.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(); +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(); +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); +};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(); +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; +this.setStyles({display:"block",position:"absolute",visibility:"hidden"});return function(){this.style.cssText=a;}.bind(this);},getDimensions:function(a){a=$merge({computeSize:false},a); +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); +});}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); +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; +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={}; +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; +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); +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]; +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"; +},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"](); +},hide:function(){var b;try{if((b=this.getStyle("display"))=="none"){b=null;}}catch(a){}return this.store("originalDisplay",b||"block").setStyle("display","none"); +},show:function(a){return this.setStyle("display",a||this.retrieve("originalDisplay")||"block");},swapClass:function(a,b){return this.removeClass(a).addClass(b); +}});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; +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}); +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"); +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; +},this);this.element.style.cssText=this.cssText;this.element.setStyle("display","none");if(a){a.setStyle("visibility","visible");}}this.fireEvent("hide",this.element); +this.callChain();}.bind(this));if(a){a.setStyle("visibility","hidden");}this.start(b);}else{this.callChain.delay(10,this);this.fireEvent("complete",this.element); +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(); +this.dissolve();}}}}catch(c){this.hiding=false;this.element.setStyle("display","none");this.callChain.delay(10,this);this.fireEvent("complete",this.element); +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; +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}); +}.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(); +}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; +});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"); +}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; +}if(a){a.setStyle("visibility","visible");}this.callChain();this.fireEvent("show",this.element);}.bind(this));}else{this.callChain();this.fireEvent("complete",this.element); +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(); +this.reveal();}}}}catch(c){this.element.setStyles({display:this.options.display,visiblity:"visible",opacity:1});this.showing=false;this.callChain.delay(10,this); +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(); +}else{this.dissolve();}return this;},cancel:function(){this.parent.apply(this,arguments);this.element.style.cssText=this.cssText;this.hidding=false;this.showing=false; +}});Element.Properties.reveal={set:function(a){var b=this.retrieve("reveal");if(b){b.cancel();}return this.eliminate("reveal").store("reveal:options",a); +},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"))); +}return this.retrieve("reveal");}};Element.Properties.dissolve=Element.Properties.reveal;Element.implement({reveal:function(a){this.get("reveal",a).reveal(); +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}); +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}); +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)]; +},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"}); diff --git a/public/javascripts/mootools-more-1.3.1.1.js b/public/javascripts/mootools-more-1.3.1.1.js new file mode 100644 index 0000000..582e466 --- /dev/null +++ b/public/javascripts/mootools-more-1.3.1.1.js @@ -0,0 +1,1322 @@ +// MooTools: the javascript framework. +// Load this file's selection again by visiting: http://mootools.net/more/0a2b8625655481363709ef8d9ab1d0f4 +// Or build this file again with packager using: packager build More/Date More/Date.Extras More/Hash More/Request.JSONP +/* +--- + +script: More.js + +name: More + +description: MooTools More + +license: MIT-style license + +authors: + - Guillermo Rauch + - Thomas Aylott + - Scott Kyle + - Arian Stolwijk + - Tim Wienk + - Christoph Pojer + - Aaron Newton + +requires: + - Core/MooTools + +provides: [MooTools.More] + +... +*/ + +MooTools.More = { + 'version': '1.3.1.1', + 'build': '0292a3af1eea242b817fecf9daa127417d10d4ce' +}; + + +/* +--- + +script: Object.Extras.js + +name: Object.Extras + +description: Extra Object generics, like getFromPath which allows a path notation to child elements. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Object + - /MooTools.More + +provides: [Object.Extras] + +... +*/ + +(function(){ + +var defined = function(value){ + return value != null; +}; + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +Object.extend({ + + getFromPath: function(source, parts){ + if (typeof parts == 'string') parts = parts.split('.'); + for (var i = 0, l = parts.length; i < l; i++){ + if (hasOwnProperty.call(source, parts[i])) source = source[parts[i]]; + else return null; + } + return source; + }, + + cleanValues: function(object, method){ + method = method || defined; + for (var key in object) if (!method(object[key])){ + delete object[key]; + } + return object; + }, + + erase: function(object, key){ + if (hasOwnProperty.call(object, key)) delete object[key]; + return object; + }, + + run: function(object){ + var args = Array.slice(arguments, 1); + for (var key in object) if (object[key].apply){ + object[key].apply(object, args); + } + return object; + } + +}); + +}).call(this); + + +/* +--- + +script: Locale.js + +name: Locale + +description: Provides methods for localization. + +license: MIT-style license + +authors: + - Aaron Newton + - Arian Stolwijk + +requires: + - Core/Events + - /Object.Extras + - /MooTools.More + +provides: [Locale, Lang] + +... +*/ + +(function(){ + +var current = null, + locales = {}, + inherits = {}; + +var getSet = function(set){ + if (instanceOf(set, Locale.Set)) return set; + else return locales[set]; +}; + +var Locale = this.Locale = { + + define: function(locale, set, key, value){ + var name; + if (instanceOf(locale, Locale.Set)){ + name = locale.name; + if (name) locales[name] = locale; + } else { + name = locale; + if (!locales[name]) locales[name] = new Locale.Set(name); + locale = locales[name]; + } + + if (set) locale.define(set, key, value); + + + + if (!current) current = locale; + + return locale; + }, + + use: function(locale){ + locale = getSet(locale); + + if (locale){ + current = locale; + + this.fireEvent('change', locale); + + + } + + return this; + }, + + getCurrent: function(){ + return current; + }, + + get: function(key, args){ + return (current) ? current.get(key, args) : ''; + }, + + inherit: function(locale, inherits, set){ + locale = getSet(locale); + + if (locale) locale.inherit(inherits, set); + return this; + }, + + list: function(){ + return Object.keys(locales); + } + +}; + +Object.append(Locale, new Events); + +Locale.Set = new Class({ + + sets: {}, + + inherits: { + locales: [], + sets: {} + }, + + initialize: function(name){ + this.name = name || ''; + }, + + define: function(set, key, value){ + var defineData = this.sets[set]; + if (!defineData) defineData = {}; + + if (key){ + if (typeOf(key) == 'object') defineData = Object.merge(defineData, key); + else defineData[key] = value; + } + this.sets[set] = defineData; + + return this; + }, + + get: function(key, args, _base){ + var value = Object.getFromPath(this.sets, key); + if (value != null){ + var type = typeOf(value); + if (type == 'function') value = value.apply(null, Array.from(args)); + else if (type == 'object') value = Object.clone(value); + return value; + } + + // get value of inherited locales + var index = key.indexOf('.'), + set = index < 0 ? key : key.substr(0, index), + names = (this.inherits.sets[set] || []).combine(this.inherits.locales).include('en-US'); + if (!_base) _base = []; + + for (var i = 0, l = names.length; i < l; i++){ + if (_base.contains(names[i])) continue; + _base.include(names[i]); + + var locale = locales[names[i]]; + if (!locale) continue; + + value = locale.get(key, args, _base); + if (value != null) return value; + } + + return ''; + }, + + inherit: function(names, set){ + names = Array.from(names); + + if (set && !this.inherits.sets[set]) this.inherits.sets[set] = []; + + var l = names.length; + while (l--) (set ? this.inherits.sets[set] : this.inherits.locales).unshift(names[l]); + + return this; + } + +}); + + + +}).call(this); + + +/* +--- + +name: Locale.en-US.Date + +description: Date messages for US English. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - /Locale + +provides: [Locale.en-US.Date] + +... +*/ + +Locale.define('en-US', 'Date', { + + months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + months_abbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + days_abbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + + // Culture's date order: MM/DD/YYYY + dateOrder: ['month', 'date', 'year'], + shortDate: '%m/%d/%Y', + shortTime: '%I:%M%p', + AM: 'AM', + PM: 'PM', + firstDayOfWeek: 0, + + // Date.Extras + ordinal: function(dayOfMonth){ + // 1st, 2nd, 3rd, etc. + return (dayOfMonth > 3 && dayOfMonth < 21) ? 'th' : ['th', 'st', 'nd', 'rd', 'th'][Math.min(dayOfMonth % 10, 4)]; + }, + + 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' + +}); + + +/* +--- + +script: Date.js + +name: Date + +description: Extends the Date native object to include methods useful in managing dates. + +license: MIT-style license + +authors: + - Aaron Newton + - Nicholas Barthelemy - https://svn.nbarthelemy.com/date-js/ + - Harald Kirshner - mail [at] digitarald.de; http://digitarald.de + - Scott Kyle - scott [at] appden.com; http://appden.com + +requires: + - Core/Array + - Core/String + - Core/Number + - MooTools.More + - Locale + - Locale.en-US.Date + +provides: [Date] + +... +*/ + +(function(){ + +var Date = this.Date; + +var DateMethods = Date.Methods = { + ms: 'Milliseconds', + year: 'FullYear', + min: 'Minutes', + mo: 'Month', + sec: 'Seconds', + hr: 'Hours' +}; + +['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', 'UTCMilliseconds'].each(function(method){ + Date.Methods[method.toLowerCase()] = method; +}); + +var pad = function(n, digits, string){ + if (digits == 1) return n; + return n < Math.pow(10, digits - 1) ? (string || '0') + pad(n, digits - 1, string) : n; +}; + +Date.implement({ + + set: function(prop, value){ + prop = prop.toLowerCase(); + var method = DateMethods[prop] && 'set' + DateMethods[prop]; + if (method && this[method]) this[method](value); + return this; + }.overloadSetter(), + + get: function(prop){ + prop = prop.toLowerCase(); + var method = DateMethods[prop] && 'get' + DateMethods[prop]; + if (method && this[method]) return this[method](); + return null; + }.overloadGetter(), + + clone: function(){ + return new Date(this.get('time')); + }, + + increment: function(interval, times){ + interval = interval || 'day'; + times = times != null ? times : 1; + + switch (interval){ + case 'year': + return this.increment('month', times * 12); + case 'month': + var d = this.get('date'); + this.set('date', 1).set('mo', this.get('mo') + times); + return this.set('date', d.min(this.get('lastdayofmonth'))); + case 'week': + return this.increment('day', times * 7); + case 'day': + return this.set('date', this.get('date') + times); + } + + if (!Date.units[interval]) throw new Error(interval + ' is not a supported interval'); + + return this.set('time', this.get('time') + times * Date.units[interval]()); + }, + + decrement: function(interval, times){ + return this.increment(interval, -1 * (times != null ? times : 1)); + }, + + isLeapYear: function(){ + return Date.isLeapYear(this.get('year')); + }, + + clearTime: function(){ + return this.set({hr: 0, min: 0, sec: 0, ms: 0}); + }, + + diff: function(date, resolution){ + if (typeOf(date) == 'string') date = Date.parse(date); + + return ((date - this) / Date.units[resolution || 'day'](3, 3)).round(); // non-leap year, 30-day month + }, + + getLastDayOfMonth: function(){ + return Date.daysInMonth(this.get('mo'), this.get('year')); + }, + + getDayOfYear: function(){ + return (Date.UTC(this.get('year'), this.get('mo'), this.get('date') + 1) + - Date.UTC(this.get('year'), 0, 1)) / Date.units.day(); + }, + + setDay: function(day, firstDayOfWeek){ + if (firstDayOfWeek == null){ + firstDayOfWeek = Date.getMsg('firstDayOfWeek'); + if (firstDayOfWeek === '') firstDayOfWeek = 1; + } + + day = (7 + Date.parseDay(day, true) - firstDayOfWeek) % 7; + var currentDay = (7 + this.get('day') - firstDayOfWeek) % 7; + + return this.increment('day', day - currentDay); + }, + + getWeek: function(firstDayOfWeek){ + if (firstDayOfWeek == null){ + firstDayOfWeek = Date.getMsg('firstDayOfWeek'); + if (firstDayOfWeek === '') firstDayOfWeek = 1; + } + + var date = this, + dayOfWeek = (7 + date.get('day') - firstDayOfWeek) % 7, + dividend = 0, + firstDayOfYear; + + if (firstDayOfWeek == 1){ + // ISO-8601, week belongs to year that has the most days of the week (i.e. has the thursday of the week) + var month = date.get('month'), + startOfWeek = date.get('date') - dayOfWeek; + + if (month == 11 && startOfWeek > 28) return 1; // Week 1 of next year + + if (month == 0 && startOfWeek < -2){ + // Use a date from last year to determine the week + date = new Date(date).decrement('day', dayOfWeek); + dayOfWeek = 0; + } + + firstDayOfYear = new Date(date.get('year'), 0, 1).get('day') || 7; + if (firstDayOfYear > 4) dividend = -7; // First week of the year is not week 1 + } else { + // In other cultures the first week of the year is always week 1 and the last week always 53 or 54. + // Days in the same week can have a different weeknumber if the week spreads across two years. + firstDayOfYear = new Date(date.get('year'), 0, 1).get('day'); + } + + dividend += date.get('dayofyear'); + dividend += 6 - dayOfWeek; // Add days so we calculate the current date's week as a full week + dividend += (7 + firstDayOfYear - firstDayOfWeek) % 7; // Make up for first week of the year not being a full week + + return (dividend / 7); + }, + + getOrdinal: function(day){ + return Date.getMsg('ordinal', day || 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'); + }, + + getGMTOffset: function(){ + var off = this.get('timezoneOffset'); + return ((off > 0) ? '-' : '+') + pad((off.abs() / 60).floor(), 2) + pad(off % 60, 2); + }, + + setAMPM: function(ampm){ + ampm = ampm.toUpperCase(); + var hr = this.get('hr'); + if (hr > 11 && ampm == 'AM') return this.decrement('hour', 12); + else if (hr < 12 && ampm == 'PM') return this.increment('hour', 12); + return this; + }, + + getAMPM: function(){ + return (this.get('hr') < 12) ? 'AM' : 'PM'; + }, + + parse: function(str){ + this.set('time', Date.parse(str)); + return this; + }, + + isValid: function(date){ + return !isNaN((date || this).valueOf()); + }, + + format: function(f){ + if (!this.isValid()) return 'invalid date'; + if (!f) f = '%x %X'; + + var formatLower = f.toLowerCase(); + if (formatters[formatLower]) return formatters[formatLower](this); // it's a formatter! + f = formats[formatLower] || f; // replace short-hand with actual format + + var d = this; + return f.replace(/%([a-z%])/gi, + function($0, $1){ + switch ($1){ + case 'a': return Date.getMsg('days_abbr')[d.get('day')]; + case 'A': return Date.getMsg('days')[d.get('day')]; + case 'b': return Date.getMsg('months_abbr')[d.get('month')]; + case 'B': return Date.getMsg('months')[d.get('month')]; + case 'c': return d.format('%a %b %d %H:%M:%S %Y'); + case 'd': return pad(d.get('date'), 2); + case 'e': return pad(d.get('date'), 2, ' '); + case 'H': return pad(d.get('hr'), 2); + case 'I': return pad((d.get('hr') % 12) || 12, 2); + case 'j': return pad(d.get('dayofyear'), 3); + case 'k': return pad(d.get('hr'), 2, ' '); + case 'l': return pad((d.get('hr') % 12) || 12, 2, ' '); + case 'L': return pad(d.get('ms'), 3); + case 'm': return pad((d.get('mo') + 1), 2); + case 'M': return pad(d.get('min'), 2); + case 'o': return d.get('ordinal'); + case 'p': return Date.getMsg(d.get('ampm')); + case 's': return Math.round(d / 1000); + case 'S': return pad(d.get('seconds'), 2); + case 'T': return d.format('%H:%M:%S'); + case 'U': return pad(d.get('week'), 2); + case 'w': return d.get('day'); + case 'x': return d.format(Date.getMsg('shortDate')); + case 'X': return d.format(Date.getMsg('shortTime')); + case 'y': return d.get('year').toString().substr(2); + case 'Y': return d.get('year'); + case 'z': return d.get('GMTOffset'); + case 'Z': return d.get('Timezone'); + } + return $1; + } + ); + }, + + toISOString: function(){ + return this.format('iso8601'); + } + +}).alias({ + toJSON: 'toISOString', + compare: 'diff', + strftime: 'format' +}); + +var formats = { + db: '%Y-%m-%d %H:%M:%S', + compact: '%Y%m%dT%H%M%S', + 'short': '%d %b %H:%M', + 'long': '%B %d, %Y %H:%M' +}; + +// The day and month abbreviations are standardized, so we cannot use simply %a and %b because they will get localized +var rfcDayAbbr = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + rfcMonthAbbr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; + +var formatters = { + rfc822: function(date){ + return rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %Z'); + }, + rfc2822: function(date){ + return rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %z'); + }, + iso8601: function(date){ + return ( + date.getUTCFullYear() + '-' + + pad(date.getUTCMonth() + 1, 2) + '-' + + pad(date.getUTCDate(), 2) + 'T' + + pad(date.getUTCHours(), 2) + ':' + + pad(date.getUTCMinutes(), 2) + ':' + + pad(date.getUTCSeconds(), 2) + '.' + + pad(date.getUTCMilliseconds(), 3) + 'Z' + ); + } +}; + + +var parsePatterns = [], + nativeParse = Date.parse; + +var parseWord = function(type, word, num){ + var ret = -1, + translated = Date.getMsg(type + 's'); + switch (typeOf(word)){ + case 'object': + ret = translated[word.get(type)]; + break; + case 'number': + ret = translated[word]; + if (!ret) throw new Error('Invalid ' + type + ' index: ' + word); + break; + case 'string': + var match = translated.filter(function(name){ + return this.test(name); + }, new RegExp('^' + word, 'i')); + if (!match.length) throw new Error('Invalid ' + type + ' string'); + if (match.length > 1) throw new Error('Ambiguous ' + type); + ret = match[0]; + } + + return (num) ? translated.indexOf(ret) : ret; +}; + +var startCentury = 1900, + startYear = 70; + +Date.extend({ + + getMsg: function(key, args){ + return Locale.get('Date.' + key, args); + }, + + units: { + ms: Function.from(1), + second: Function.from(1000), + minute: Function.from(60000), + hour: Function.from(3600000), + day: Function.from(86400000), + week: Function.from(608400000), + month: function(month, year){ + var d = new Date; + return Date.daysInMonth(month != null ? month : d.get('mo'), year != null ? year : d.get('year')) * 86400000; + }, + year: function(year){ + year = year || new Date().get('year'); + return Date.isLeapYear(year) ? 31622400000 : 31536000000; + } + }, + + daysInMonth: function(month, year){ + return [31, Date.isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; + }, + + isLeapYear: function(year){ + return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0); + }, + + parse: function(from){ + var t = typeOf(from); + if (t == 'number') return new Date(from); + if (t != 'string') return from; + from = from.clean(); + if (!from.length) return null; + + var parsed; + parsePatterns.some(function(pattern){ + var bits = pattern.re.exec(from); + return (bits) ? (parsed = pattern.handler(bits)) : false; + }); + + if (!(parsed && parsed.isValid())){ + parsed = new Date(nativeParse(from)); + if (!(parsed && parsed.isValid())) parsed = new Date(from.toInt()); + } + return parsed; + }, + + parseDay: function(day, num){ + return parseWord('day', day, num); + }, + + parseMonth: function(month, num){ + return parseWord('month', month, num); + }, + + parseUTC: function(value){ + var localDate = new Date(value); + var utcSeconds = Date.UTC( + localDate.get('year'), + localDate.get('mo'), + localDate.get('date'), + localDate.get('hr'), + localDate.get('min'), + localDate.get('sec'), + localDate.get('ms') + ); + return new Date(utcSeconds); + }, + + orderIndex: function(unit){ + return Date.getMsg('dateOrder').indexOf(unit) + 1; + }, + + defineFormat: function(name, format){ + formats[name] = format; + return this; + }, + + defineFormats: function(formats){ + for (var name in formats) Date.defineFormat(name, formats[name]); + return this; + }, + + + + defineParser: function(pattern){ + parsePatterns.push((pattern.re && pattern.handler) ? pattern : build(pattern)); + return this; + }, + + defineParsers: function(){ + Array.flatten(arguments).each(Date.defineParser); + return this; + }, + + define2DigitYearStart: function(year){ + startYear = year % 100; + startCentury = year - startYear; + return this; + } + +}); + +var regexOf = function(type){ + return new RegExp('(?:' + Date.getMsg(type).map(function(name){ + return name.substr(0, 3); + }).join('|') + ')[a-z]*'); +}; + +var replacers = function(key){ + switch (key){ + case 'T': + return '%H:%M:%S'; + case 'x': // iso8601 covers yyyy-mm-dd, so just check if month is first + return ((Date.orderIndex('month') == 1) ? '%m[-./]%d' : '%d[-./]%m') + '([-./]%y)?'; + case 'X': + return '%H([.:]%M)?([.:]%S([.:]%s)?)? ?%p? ?%z?'; + } + return null; +}; + +var keys = { + 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}/, + z: /Z|[+-]\d{2}(?::?\d{2})?/ +}; + +keys.m = keys.I; +keys.S = keys.M; + +var currentLanguage; + +var recompile = function(language){ + currentLanguage = language; + + keys.a = keys.A = regexOf('days'); + keys.b = keys.B = regexOf('months'); + + parsePatterns.each(function(pattern, i){ + if (pattern.format) parsePatterns[i] = build(pattern.format); + }); +}; + +var build = function(format){ + if (!currentLanguage) return {format: format}; + + var parsed = []; + var re = (format.source || format) // allow format to be regex + .replace(/%([a-z])/gi, + function($0, $1){ + return replacers($1) || $0; + } + ).replace(/\((?!\?)/g, '(?:') // make all groups non-capturing + .replace(/ (?!\?|\*)/g, ',? ') // be forgiving with spaces and commas + .replace(/%([a-z%])/gi, + function($0, $1){ + var p = keys[$1]; + if (!p) return $1; + parsed.push($1); + return '(' + p.source + ')'; + } + ).replace(/\[a-z\]/gi, '[a-z\\u00c0-\\uffff;\&]'); // handle unicode words + + return { + format: format, + re: new RegExp('^' + re + '$', 'i'), + handler: function(bits){ + bits = bits.slice(1).associate(parsed); + var date = new Date().clearTime(), + year = bits.y || bits.Y; + + if (year != null) handle.call(date, 'y', year); // need to start in the right year + if ('d' in bits) handle.call(date, 'd', 1); + if ('m' in bits || bits.b || bits.B) handle.call(date, 'm', 1); + + for (var key in bits) handle.call(date, key, bits[key]); + return date; + } + }; +}; + +var handle = function(key, value){ + if (!value) return this; + + switch (key){ + case 'a': case 'A': return this.set('day', Date.parseDay(value, true)); + case 'b': case 'B': return this.set('mo', Date.parseMonth(value, true)); + case 'd': return this.set('date', value); + case 'H': case 'I': return this.set('hr', value); + case 'm': return this.set('mo', value - 1); + case 'M': return this.set('min', value); + case 'p': return this.set('ampm', value.replace(/\./g, '')); + case 'S': return this.set('sec', value); + case 's': return this.set('ms', ('0.' + value) * 1000); + case 'w': return this.set('day', value); + case 'Y': return this.set('year', value); + case 'y': + value = +value; + if (value < 100) value += startCentury + (value < startYear ? 100 : 0); + return this.set('year', value); + case 'z': + if (value == 'Z') value = '+00'; + var offset = value.match(/([+-])(\d{2}):?(\d{2})?/); + offset = (offset[1] + '1') * (offset[2] * 60 + (+offset[3] || 0)) + this.getTimezoneOffset(); + return this.set('time', this - offset * 60000); + } + + return this; +}; + +Date.defineParsers( + '%Y([-./]%m([-./]%d((T| )%X)?)?)?', // "1999-12-31", "1999-12-31 11:59pm", "1999-12-31 23:59:59", ISO8601 + '%Y%m%d(T%H(%M%S?)?)?', // "19991231", "19991231T1159", compact + '%x( %X)?', // "12/31", "12.31.99", "12-31-1999", "12/31/2008 11:59 PM" + '%d%o( %b( %Y)?)?( %X)?', // "31st", "31st December", "31 Dec 1999", "31 Dec 1999 11:59pm" + '%b( %d%o)?( %Y)?( %X)?', // Same as above with month and day switched + '%Y %b( %d%o( %X)?)?', // Same as above with year coming first + '%o %b %d %X %z %Y', // "Thu Oct 22 08:11:23 +0000 2009" + '%T', // %H:%M:%S + '%H:%M( ?%p)?' // "11:05pm", "11:05 am" and "11:05" +); + +Locale.addEvent('change', function(language){ + if (Locale.get('Date')) recompile(language); +}).fireEvent('change', Locale.getCurrent()); + +}).call(this); + + +/* +--- + +script: Date.Extras.js + +name: Date.Extras + +description: Extends the Date native object to include extra methods (on top of those in Date.js). + +license: MIT-style license + +authors: + - Aaron Newton + - Scott Kyle + +requires: + - /Date + +provides: [Date.Extras] + +... +*/ + +Date.implement({ + + timeDiffInWords: function(to){ + return Date.distanceOfTimeInWords(this, to || new Date); + }, + + timeDiff: function(to, separator){ + if (to == null) to = new Date; + var delta = ((to - this) / 1000).floor(); + + var vals = [], + durations = [60, 60, 24, 365, 0], + names = ['s', 'm', 'h', 'd', 'y'], + value, duration; + + for (var item = 0; item < durations.length; item++){ + if (item && !delta) break; + value = delta; + if ((duration = durations[item])){ + value = (delta % duration); + delta = (delta / duration).floor(); + } + vals.unshift(value + (names[item] || '')); + } + + return vals.join(separator || ':'); + } + +}).extend({ + + distanceOfTimeInWords: function(from, to){ + return Date.getTimePhrase(((to - from) / 1000).toInt()); + }, + + getTimePhrase: function(delta){ + var suffix = (delta < 0) ? 'Until' : 'Ago'; + if (delta < 0) delta *= -1; + + var units = { + minute: 60, + hour: 60, + day: 24, + week: 7, + month: 52 / 12, + year: 12, + eon: Infinity + }; + + var msg = 'lessThanMinute'; + + for (var unit in units){ + var interval = units[unit]; + if (delta < 1.5 * interval){ + if (delta > 0.75 * interval) msg = unit; + break; + } + delta /= interval; + msg = unit + 's'; + } + + delta = delta.round(); + return Date.getMsg(msg + suffix, delta).substitute({delta: delta}); + } + +}).defineParsers( + + { + // "today", "tomorrow", "yesterday" + re: /^(?:tod|tom|yes)/i, + handler: function(bits){ + var d = new Date().clearTime(); + switch (bits[0]){ + case 'tom': return d.increment(); + case 'yes': return d.decrement(); + default: return d; + } + } + }, + + { + // "next Wednesday", "last Thursday" + re: /^(next|last) ([a-z]+)$/i, + handler: function(bits){ + var d = new Date().clearTime(); + var day = d.getDay(); + var newDay = Date.parseDay(bits[2], true); + var addDays = newDay - day; + if (newDay <= day) addDays += 7; + if (bits[1] == 'last') addDays -= 7; + return d.set('date', d.getDate() + addDays); + } + } + +).alias('timeAgoInWords', 'timeDiffInWords'); + + +/* +--- + +name: Hash + +description: Contains Hash Prototypes. Provides a means for overcoming the JavaScript practical impossibility of extending native Objects. + +license: MIT-style license. + +requires: + - Core/Object + - /MooTools.More + +provides: [Hash] + +... +*/ + +(function(){ + +if (this.Hash) return; + +var Hash = this.Hash = new Type('Hash', function(object){ + if (typeOf(object) == 'hash') object = Object.clone(object.getClean()); + for (var key in object) this[key] = object[key]; + return this; +}); + +this.$H = function(object){ + return new Hash(object); +}; + +Hash.implement({ + + forEach: function(fn, bind){ + Object.forEach(this, fn, bind); + }, + + getClean: function(){ + var clean = {}; + for (var key in this){ + if (this.hasOwnProperty(key)) clean[key] = this[key]; + } + return clean; + }, + + getLength: function(){ + var length = 0; + for (var key in this){ + if (this.hasOwnProperty(key)) length++; + } + return length; + } + +}); + +Hash.alias('each', 'forEach'); + +Hash.implement({ + + has: Object.prototype.hasOwnProperty, + + keyOf: function(value){ + return Object.keyOf(this, value); + }, + + hasValue: function(value){ + return Object.contains(this, value); + }, + + extend: function(properties){ + Hash.each(properties || {}, function(value, key){ + Hash.set(this, key, value); + }, this); + return this; + }, + + combine: function(properties){ + Hash.each(properties || {}, function(value, key){ + Hash.include(this, key, value); + }, this); + return this; + }, + + erase: function(key){ + if (this.hasOwnProperty(key)) delete this[key]; + return this; + }, + + get: function(key){ + return (this.hasOwnProperty(key)) ? this[key] : null; + }, + + set: function(key, value){ + if (!this[key] || this.hasOwnProperty(key)) this[key] = value; + return this; + }, + + empty: function(){ + Hash.each(this, function(value, key){ + delete this[key]; + }, this); + return this; + }, + + include: function(key, value){ + if (this[key] == undefined) this[key] = value; + return this; + }, + + map: function(fn, bind){ + return new Hash(Object.map(this, fn, bind)); + }, + + filter: function(fn, bind){ + return new Hash(Object.filter(this, fn, bind)); + }, + + every: function(fn, bind){ + return Object.every(this, fn, bind); + }, + + some: function(fn, bind){ + return Object.some(this, fn, bind); + }, + + getKeys: function(){ + return Object.keys(this); + }, + + getValues: function(){ + return Object.values(this); + }, + + toQueryString: function(base){ + return Object.toQueryString(this, base); + } + +}); + +Hash.alias({indexOf: 'keyOf', contains: 'hasValue'}); + + +}).call(this); + + + +/* +--- + +script: Request.JSONP.js + +name: Request.JSONP + +description: Defines Request.JSONP, a class for cross domain javascript via script injection. + +license: MIT-style license + +authors: + - Aaron Newton + - Guillermo Rauch + - Arian Stolwijk + +requires: + - Core/Element + - Core/Request + - MooTools.More + +provides: [Request.JSONP] + +... +*/ + +Request.JSONP = new Class({ + + Implements: [Chain, Events, Options], + + options: { + /* + onRequest: function(src, scriptElement){}, + onComplete: function(data){}, + onSuccess: function(data){}, + onCancel: function(){}, + onTimeout: function(){}, + onError: function(){}, */ + onRequest: function(src){ + if (this.options.log && window.console && console.log){ + console.log('JSONP retrieving script with url:' + src); + } + }, + onError: function(src){ + if (this.options.log && window.console && console.warn){ + console.warn('JSONP '+ src +' will fail in Internet Explorer, which enforces a 2083 bytes length limit on URIs'); + } + }, + url: '', + callbackKey: 'callback', + injectScript: document.head, + data: '', + link: 'ignore', + timeout: 0, + log: false + }, + + initialize: function(options){ + this.setOptions(options); + }, + + send: function(options){ + if (!Request.prototype.check.call(this, options)) return this; + this.running = true; + + var type = typeOf(options); + if (type == 'string' || type == 'element') options = {data: options}; + options = Object.merge(this.options, options || {}); + + var data = options.data; + switch (typeOf(data)){ + case 'element': data = document.id(data).toQueryString(); break; + case 'object': case 'hash': data = Object.toQueryString(data); + } + + var index = this.index = Request.JSONP.counter++; + + var src = options.url + + (options.url.test('\\?') ? '&' :'?') + + (options.callbackKey) + + '=Request.JSONP.request_map.request_'+ index + + (data ? '&' + data : ''); + + if (src.length > 2083) this.fireEvent('error', src); + + Request.JSONP.request_map['request_' + index] = function(){ + this.success(arguments, index); + }.bind(this); + + var script = this.getScript(src).inject(options.injectScript); + this.fireEvent('request', [src, script]); + + if (options.timeout) this.timeout.delay(options.timeout, this); + + return this; + }, + + getScript: function(src){ + if (!this.script) this.script = new Element('script[type=text/javascript]', { + async: true, + src: src + }); + return this.script; + }, + + success: function(args, index){ + if (!this.running) return false; + this.clear() + .fireEvent('complete', args).fireEvent('success', args) + .callChain(); + }, + + cancel: function(){ + if (this.running) this.clear().fireEvent('cancel'); + return this; + }, + + isRunning: function(){ + return !!this.running; + }, + + clear: function(){ + this.running = false; + if (this.script){ + this.script.destroy(); + this.script = null; + } + return this; + }, + + timeout: function(){ + if (this.running){ + this.running = false; + this.fireEvent('timeout', [this.script.get('src'), this.script]).fireEvent('failure').cancel(); + } + return this; + } + +}); + +Request.JSONP.counter = 0; +Request.JSONP.request_map = {}; + + diff --git a/public/javascripts/mootools-yui-compressed.js b/public/javascripts/mootools-yui-compressed.js new file mode 100644 index 0000000..a20f066 --- /dev/null +++ b/public/javascripts/mootools-yui-compressed.js @@ -0,0 +1,5492 @@ +/* +--- +MooTools: the javascript framework + +web build: + - http://mootools.net/core/7c56cfef9dddcf170a5d68e3fb61cfd7 + +packager build: + - 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 + +/* +--- + +name: Core + +description: The heart of MooTools. + +license: MIT-style license. + +copyright: Copyright (c) 2006-2010 [Valerio Proietti](http://mad4milk.net/). + +authors: The MooTools production team (http://mootools.net/developers/) + +inspiration: + - 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) + - Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php) + +provides: [Core, MooTools, Type, typeOf, instanceOf, Native] + +... +*/ + +(function(){ + +this.MooTools = { + version: '1.3.1', + build: 'af48c8d589f43f32212f9bb8ff68a127e6a3ba6c' +}; + +// typeOf, instanceOf + +var typeOf = this.typeOf = function(item){ + if (item == null) return 'null'; + if (item.$family) return item.$family(); + + if (item.nodeName){ + if (item.nodeType == 1) return 'element'; + if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? 'textnode' : 'whitespace'; + } else if (typeof item.length == 'number'){ + if (item.callee) return 'arguments'; + if ('item' in item) return 'collection'; + } + + return typeof item; +}; + +var instanceOf = this.instanceOf = function(item, object){ + if (item == null) return false; + var constructor = item.$constructor || item.constructor; + while (constructor){ + if (constructor === object) return true; + constructor = constructor.parent; + } + return item instanceof object; +}; + +// Function overloading + +var Function = this.Function; + +var enumerables = true; +for (var i in {toString: 1}) enumerables = null; +if (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor']; + +Function.prototype.overloadSetter = function(usePlural){ + var self = this; + return function(a, b){ + if (a == null) return this; + if (usePlural || typeof a != 'string'){ + for (var k in a) self.call(this, k, a[k]); + if (enumerables) for (var i = enumerables.length; i--;){ + k = enumerables[i]; + if (a.hasOwnProperty(k)) self.call(this, k, a[k]); + } + } else { + self.call(this, a, b); + } + return this; + }; +}; + +Function.prototype.overloadGetter = function(usePlural){ + var self = this; + return function(a){ + var args, result; + if (usePlural || typeof a != 'string') args = a; + else if (arguments.length > 1) args = arguments; + if (args){ + result = {}; + for (var i = 0; i < args.length; i++) result[args[i]] = self.call(this, args[i]); + } else { + result = self.call(this, a); + } + return result; + }; +}; + +Function.prototype.extend = function(key, value){ + this[key] = value; +}.overloadSetter(); + +Function.prototype.implement = function(key, value){ + this.prototype[key] = value; +}.overloadSetter(); + +// From + +var slice = Array.prototype.slice; + +Function.from = function(item){ + return (typeOf(item) == 'function') ? item : function(){ + return item; + }; +}; + +Array.from = function(item){ + if (item == null) return []; + return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item]; +}; + +Number.from = function(item){ + var number = parseFloat(item); + return isFinite(number) ? number : null; +}; + +String.from = function(item){ + return item + ''; +}; + +// hide, protect + +Function.implement({ + + hide: function(){ + this.$hidden = true; + return this; + }, + + protect: function(){ + this.$protected = true; + return this; + } + +}); + +// Type + +var Type = this.Type = function(name, object){ + if (name){ + var lower = name.toLowerCase(); + var typeCheck = function(item){ + return (typeOf(item) == lower); + }; + + Type['is' + name] = typeCheck; + if (object != null){ + object.prototype.$family = (function(){ + return lower; + }).hide(); + + } + } + + if (object == null) return null; + + object.extend(this); + object.$constructor = Type; + object.prototype.$constructor = object; + + return object; +}; + +var toString = Object.prototype.toString; + +Type.isEnumerable = function(item){ + return (item != null && typeof item.length == 'number' && toString.call(item) != '[object Function]' ); +}; + +var hooks = {}; + +var hooksOf = function(object){ + var type = typeOf(object.prototype); + return hooks[type] || (hooks[type] = []); +}; + +var implement = function(name, method){ + if (method && method.$hidden) return; + + var hooks = hooksOf(this); + + for (var i = 0; i < hooks.length; i++){ + var hook = hooks[i]; + if (typeOf(hook) == 'type') implement.call(hook, name, method); + else hook.call(this, name, method); + } + + var previous = this.prototype[name]; + if (previous == null || !previous.$protected) this.prototype[name] = method; + + if (this[name] == null && typeOf(method) == 'function') extend.call(this, name, function(item){ + return method.apply(item, slice.call(arguments, 1)); + }); +}; + +var extend = function(name, method){ + if (method && method.$hidden) return; + var previous = this[name]; + if (previous == null || !previous.$protected) this[name] = method; +}; + +Type.implement({ + + implement: implement.overloadSetter(), + + extend: extend.overloadSetter(), + + alias: function(name, existing){ + implement.call(this, name, this.prototype[existing]); + }.overloadSetter(), + + mirror: function(hook){ + hooksOf(this).push(hook); + return this; + } + +}); + +new Type('Type', Type); + +// Default Types + +var force = function(name, object, methods){ + var isType = (object != Object), + prototype = object.prototype; + + if (isType) object = new Type(name, object); + + for (var i = 0, l = methods.length; i < l; i++){ + var key = methods[i], + generic = object[key], + proto = prototype[key]; + + if (generic) generic.protect(); + + if (isType && proto){ + delete prototype[key]; + prototype[key] = proto.protect(); + } + } + + if (isType) object.implement(prototype); + + return force; +}; + +force('String', String, [ + 'charAt', 'charCodeAt', 'concat', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search', + 'slice', 'split', 'substr', 'substring', 'toLowerCase', 'toUpperCase' +])('Array', Array, [ + 'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice', + 'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight' +])('Number', Number, [ + 'toExponential', 'toFixed', 'toLocaleString', 'toPrecision' +])('Function', Function, [ + 'apply', 'call', 'bind' +])('RegExp', RegExp, [ + 'exec', 'test' +])('Object', Object, [ + 'create', 'defineProperty', 'defineProperties', 'keys', + 'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames', + 'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen' +])('Date', Date, ['now']); + +Object.extend = extend.overloadSetter(); + +Date.extend('now', function(){ + return +(new Date); +}); + +new Type('Boolean', Boolean); + +// fixes NaN returning as Number + +Number.prototype.$family = function(){ + return isFinite(this) ? 'number' : 'null'; +}.hide(); + +// Number.random + +Number.extend('random', function(min, max){ + return Math.floor(Math.random() * (max - min + 1) + min); +}); + +// forEach, each + +var hasOwnProperty = Object.prototype.hasOwnProperty; +Object.extend('forEach', function(object, fn, bind){ + for (var key in object){ + if (hasOwnProperty.call(object, key)) fn.call(bind, object[key], key, object); + } +}); + +Object.each = Object.forEach; + +Array.implement({ + + forEach: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++){ + if (i in this) fn.call(bind, this[i], i, this); + } + }, + + each: function(fn, bind){ + Array.forEach(this, fn, bind); + return this; + } + +}); + +// Array & Object cloning, Object merging and appending + +var cloneOf = function(item){ + switch (typeOf(item)){ + case 'array': return item.clone(); + case 'object': return Object.clone(item); + default: return item; + } +}; + +Array.implement('clone', function(){ + var i = this.length, clone = new Array(i); + while (i--) clone[i] = cloneOf(this[i]); + return clone; +}); + +var mergeOne = function(source, key, current){ + switch (typeOf(current)){ + case 'object': + if (typeOf(source[key]) == 'object') Object.merge(source[key], current); + else source[key] = Object.clone(current); + break; + case 'array': source[key] = current.clone(); break; + default: source[key] = current; + } + return source; +}; + +Object.extend({ + + merge: function(source, k, v){ + if (typeOf(k) == 'string') return mergeOne(source, k, v); + for (var i = 1, l = arguments.length; i < l; i++){ + var object = arguments[i]; + for (var key in object) mergeOne(source, key, object[key]); + } + return source; + }, + + clone: function(object){ + var clone = {}; + for (var key in object) clone[key] = cloneOf(object[key]); + return clone; + }, + + append: function(original){ + for (var i = 1, l = arguments.length; i < l; i++){ + var extended = arguments[i] || {}; + for (var key in extended) original[key] = extended[key]; + } + return original; + } + +}); + +// Object-less types + +['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each(function(name){ + new Type(name); +}); + +// Unique ID + +var UID = Date.now(); + +String.extend('uniqueID', function(){ + return (UID++).toString(36); +}); + + + +}).call(this); + + +/* +--- + +name: Array + +description: Contains Array Prototypes like each, contains, and erase. + +license: MIT-style license. + +requires: Type + +provides: Array + +... +*/ + +Array.implement({ + + invoke: function(methodName){ + var args = Array.slice(arguments, 1); + return this.map(function(item){ + return item[methodName].apply(item, args); + }); + }, + + every: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++){ + if ((i in this) && !fn.call(bind, this[i], i, this)) return false; + } + return true; + }, + + filter: function(fn, bind){ + var results = []; + for (var i = 0, l = this.length; i < l; i++){ + if ((i in this) && fn.call(bind, this[i], i, this)) results.push(this[i]); + } + return results; + }, + + clean: function(){ + return this.filter(function(item){ + return item != null; + }); + }, + + indexOf: function(item, from){ + var len = this.length; + for (var i = (from < 0) ? Math.max(0, len + from) : from || 0; i < len; i++){ + if (this[i] === item) return i; + } + return -1; + }, + + map: function(fn, bind){ + var results = []; + for (var i = 0, l = this.length; i < l; i++){ + if (i in this) results[i] = fn.call(bind, this[i], i, this); + } + return results; + }, + + some: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++){ + if ((i in this) && fn.call(bind, this[i], i, this)) return true; + } + return false; + }, + + associate: function(keys){ + var obj = {}, length = Math.min(this.length, keys.length); + for (var i = 0; i < length; i++) obj[keys[i]] = this[i]; + return obj; + }, + + link: function(object){ + var result = {}; + for (var i = 0, l = this.length; i < l; i++){ + for (var key in object){ + if (object[key](this[i])){ + result[key] = this[i]; + delete object[key]; + break; + } + } + } + return result; + }, + + contains: function(item, from){ + return this.indexOf(item, from) != -1; + }, + + append: function(array){ + this.push.apply(this, array); + return this; + }, + + getLast: function(){ + return (this.length) ? this[this.length - 1] : null; + }, + + getRandom: function(){ + return (this.length) ? this[Number.random(0, this.length - 1)] : null; + }, + + include: function(item){ + if (!this.contains(item)) this.push(item); + return this; + }, + + combine: function(array){ + for (var i = 0, l = array.length; i < l; i++) this.include(array[i]); + return this; + }, + + erase: function(item){ + for (var i = this.length; i--;){ + if (this[i] === item) this.splice(i, 1); + } + return this; + }, + + empty: function(){ + this.length = 0; + return this; + }, + + flatten: function(){ + var array = []; + for (var i = 0, l = this.length; i < l; i++){ + var type = typeOf(this[i]); + if (type == 'null') continue; + array = array.concat((type == 'array' || type == 'collection' || type == 'arguments' || instanceOf(this[i], Array)) ? Array.flatten(this[i]) : this[i]); + } + return array; + }, + + pick: function(){ + for (var i = 0, l = this.length; i < l; i++){ + if (this[i] != null) return this[i]; + } + return null; + }, + + hexToRgb: function(array){ + if (this.length != 3) return null; + var rgb = this.map(function(value){ + if (value.length == 1) value += value; + return value.toInt(16); + }); + return (array) ? rgb : 'rgb(' + rgb + ')'; + }, + + rgbToHex: function(array){ + if (this.length < 3) return null; + if (this.length == 4 && this[3] == 0 && !array) return 'transparent'; + var hex = []; + for (var i = 0; i < 3; i++){ + var bit = (this[i] - 0).toString(16); + hex.push((bit.length == 1) ? '0' + bit : bit); + } + return (array) ? hex : '#' + hex.join(''); + } + +}); + + + + +/* +--- + +name: String + +description: Contains String Prototypes like camelCase, capitalize, test, and toInt. + +license: MIT-style license. + +requires: Type + +provides: String + +... +*/ + +String.implement({ + + test: function(regex, params){ + return ((typeOf(regex) == 'regexp') ? regex : new RegExp('' + regex, params)).test(this); + }, + + contains: function(string, separator){ + return (separator) ? (separator + this + separator).indexOf(separator + string + separator) > -1 : this.indexOf(string) > -1; + }, + + trim: function(){ + return this.replace(/^\s+|\s+$/g, ''); + }, + + clean: function(){ + return this.replace(/\s+/g, ' ').trim(); + }, + + camelCase: function(){ + return this.replace(/-\D/g, function(match){ + return match.charAt(1).toUpperCase(); + }); + }, + + hyphenate: function(){ + return this.replace(/[A-Z]/g, function(match){ + return ('-' + match.charAt(0).toLowerCase()); + }); + }, + + capitalize: function(){ + return this.replace(/\b[a-z]/g, function(match){ + return match.toUpperCase(); + }); + }, + + escapeRegExp: function(){ + return this.replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1'); + }, + + toInt: function(base){ + return parseInt(this, base || 10); + }, + + toFloat: function(){ + return parseFloat(this); + }, + + hexToRgb: function(array){ + var hex = this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/); + return (hex) ? hex.slice(1).hexToRgb(array) : null; + }, + + rgbToHex: function(array){ + var rgb = this.match(/\d{1,3}/g); + return (rgb) ? rgb.rgbToHex(array) : null; + }, + + substitute: function(object, regexp){ + return this.replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){ + if (match.charAt(0) == '\\') return match.slice(1); + return (object[name] != null) ? object[name] : ''; + }); + } + +}); + + +/* +--- + +name: Number + +description: Contains Number Prototypes like limit, round, times, and ceil. + +license: MIT-style license. + +requires: Type + +provides: Number + +... +*/ + +Number.implement({ + + limit: function(min, max){ + return Math.min(max, Math.max(min, this)); + }, + + round: function(precision){ + precision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0); + return Math.round(this * precision) / precision; + }, + + times: function(fn, bind){ + for (var i = 0; i < this; i++) fn.call(bind, i, this); + }, + + toFloat: function(){ + return parseFloat(this); + }, + + toInt: function(base){ + return parseInt(this, base || 10); + } + +}); + +Number.alias('each', 'times'); + +(function(math){ + var methods = {}; + math.each(function(name){ + if (!Number[name]) methods[name] = function(){ + return Math[name].apply(null, [this].concat(Array.from(arguments))); + }; + }); + Number.implement(methods); +})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']); + + +/* +--- + +name: Function + +description: Contains Function Prototypes like create, bind, pass, and delay. + +license: MIT-style license. + +requires: Type + +provides: Function + +... +*/ + +Function.extend({ + + attempt: function(){ + for (var i = 0, l = arguments.length; i < l; i++){ + try { + return arguments[i](); + } catch (e){} + } + return null; + } + +}); + +Function.implement({ + + attempt: function(args, bind){ + try { + return this.apply(bind, Array.from(args)); + } catch (e){} + + return null; + }, + + bind: function(bind){ + var self = this, + args = (arguments.length > 1) ? Array.slice(arguments, 1) : null; + + return function(){ + if (!args && !arguments.length) return self.call(bind); + if (args && arguments.length) return self.apply(bind, args.concat(Array.from(arguments))); + return self.apply(bind, args || arguments); + }; + }, + + pass: function(args, bind){ + var self = this; + if (args != null) args = Array.from(args); + return function(){ + return self.apply(bind, args || arguments); + }; + }, + + delay: function(delay, bind, args){ + return setTimeout(this.pass((args == null ? [] : args), bind), delay); + }, + + periodical: function(periodical, bind, args){ + return setInterval(this.pass((args == null ? [] : args), bind), periodical); + } + +}); + + + + +/* +--- + +name: Object + +description: Object generic methods + +license: MIT-style license. + +requires: Type + +provides: [Object, Hash] + +... +*/ + +(function(){ + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +Object.extend({ + + subset: function(object, keys){ + var results = {}; + for (var i = 0, l = keys.length; i < l; i++){ + var k = keys[i]; + results[k] = object[k]; + } + return results; + }, + + map: function(object, fn, bind){ + var results = {}; + for (var key in object){ + if (hasOwnProperty.call(object, key)) results[key] = fn.call(bind, object[key], key, object); + } + return results; + }, + + filter: function(object, fn, bind){ + var results = {}; + Object.each(object, function(value, key){ + if (fn.call(bind, value, key, object)) results[key] = value; + }); + return results; + }, + + every: function(object, fn, bind){ + for (var key in object){ + if (hasOwnProperty.call(object, key) && !fn.call(bind, object[key], key)) return false; + } + return true; + }, + + some: function(object, fn, bind){ + for (var key in object){ + if (hasOwnProperty.call(object, key) && fn.call(bind, object[key], key)) return true; + } + return false; + }, + + keys: function(object){ + var keys = []; + for (var key in object){ + if (hasOwnProperty.call(object, key)) keys.push(key); + } + return keys; + }, + + values: function(object){ + var values = []; + for (var key in object){ + if (hasOwnProperty.call(object, key)) values.push(object[key]); + } + return values; + }, + + getLength: function(object){ + return Object.keys(object).length; + }, + + keyOf: function(object, value){ + for (var key in object){ + if (hasOwnProperty.call(object, key) && object[key] === value) return key; + } + return null; + }, + + contains: function(object, value){ + return Object.keyOf(object, value) != null; + }, + + toQueryString: function(object, base){ + var queryString = []; + + Object.each(object, function(value, key){ + if (base) key = base + '[' + key + ']'; + var result; + switch (typeOf(value)){ + case 'object': result = Object.toQueryString(value, key); break; + case 'array': + var qs = {}; + value.each(function(val, i){ + qs[i] = val; + }); + result = Object.toQueryString(qs, key); + break; + default: result = key + '=' + encodeURIComponent(value); + } + if (value != null) queryString.push(result); + }); + + return queryString.join('&'); + } + +}); + +})(); + + + + +/* +--- + +name: Browser + +description: The Browser Object. Contains Browser initialization, Window and Document, and the Browser Hash. + +license: MIT-style license. + +requires: [Array, Function, Number, String] + +provides: [Browser, Window, Document] + +... +*/ + +(function(){ + +var document = this.document; +var window = document.window = this; + +var UID = 1; + +this.$uid = (window.ActiveXObject) ? function(item){ + return (item.uid || (item.uid = [UID++]))[0]; +} : function(item){ + return item.uid || (item.uid = UID++); +}; + +$uid(window); +$uid(document); + +var ua = navigator.userAgent.toLowerCase(), + platform = navigator.platform.toLowerCase(), + UA = ua.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/) || [null, 'unknown', 0], + mode = UA[1] == 'ie' && document.documentMode; + +var Browser = this.Browser = { + + extend: Function.prototype.extend, + + name: (UA[1] == 'version') ? UA[3] : UA[1], + + version: mode || parseFloat((UA[1] == 'opera' && UA[4]) ? UA[4] : UA[2]), + + Platform: { + name: ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || platform.match(/mac|win|linux/) || ['other'])[0] + }, + + Features: { + xpath: !!(document.evaluate), + air: !!(window.runtime), + query: !!(document.querySelector), + json: !!(window.JSON) + }, + + Plugins: {} + +}; + +Browser[Browser.name] = true; +Browser[Browser.name + parseInt(Browser.version, 10)] = true; +Browser.Platform[Browser.Platform.name] = true; + +// Request + +Browser.Request = (function(){ + + var XMLHTTP = function(){ + return new XMLHttpRequest(); + }; + + var MSXML2 = function(){ + return new ActiveXObject('MSXML2.XMLHTTP'); + }; + + var MSXML = function(){ + return new ActiveXObject('Microsoft.XMLHTTP'); + }; + + return Function.attempt(function(){ + XMLHTTP(); + return XMLHTTP; + }, function(){ + MSXML2(); + return MSXML2; + }, function(){ + MSXML(); + return MSXML; + }); + +})(); + +Browser.Features.xhr = !!(Browser.Request); + +// Flash detection + +var version = (Function.attempt(function(){ + return navigator.plugins['Shockwave Flash'].description; +}, function(){ + return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version'); +}) || '0 r0').match(/\d+/g); + +Browser.Plugins.Flash = { + version: Number(version[0] || '0.' + version[1]) || 0, + build: Number(version[2]) || 0 +}; + +// String scripts + +Browser.exec = function(text){ + if (!text) return text; + if (window.execScript){ + window.execScript(text); + } else { + var script = document.createElement('script'); + script.setAttribute('type', 'text/javascript'); + script.text = text; + document.head.appendChild(script); + document.head.removeChild(script); + } + return text; +}; + +String.implement('stripScripts', function(exec){ + var scripts = ''; + var text = this.replace(/]*>([\s\S]*?)<\/script>/gi, function(all, code){ + scripts += code + '\n'; + return ''; + }); + if (exec === true) Browser.exec(scripts); + else if (typeOf(exec) == 'function') exec(scripts, text); + return text; +}); + +// Window, Document + +Browser.extend({ + Document: this.Document, + Window: this.Window, + Element: this.Element, + Event: this.Event +}); + +this.Window = this.$constructor = new Type('Window', function(){}); + +this.$family = Function.from('window').hide(); + +Window.mirror(function(name, method){ + window[name] = method; +}); + +this.Document = document.$constructor = new Type('Document', function(){}); + +document.$family = Function.from('document').hide(); + +Document.mirror(function(name, method){ + document[name] = method; +}); + +document.html = document.documentElement; +document.head = document.getElementsByTagName('head')[0]; + +if (document.execCommand) try { + document.execCommand("BackgroundImageCache", false, true); +} catch (e){} + +if (this.attachEvent && !this.addEventListener){ + var unloadEvent = function(){ + this.detachEvent('onunload', unloadEvent); + document.head = document.html = document.window = null; + }; + this.attachEvent('onunload', unloadEvent); +} + +// IE fails on collections and ) +var arrayFrom = Array.from; +try { + arrayFrom(document.html.childNodes); +} catch(e){ + Array.from = function(item){ + if (typeof item != 'string' && Type.isEnumerable(item) && typeOf(item) != 'array'){ + var i = item.length, array = new Array(i); + while (i--) array[i] = item[i]; + return array; + } + return arrayFrom(item); + }; + + var prototype = Array.prototype, + slice = prototype.slice; + ['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice'].each(function(name){ + var method = prototype[name]; + Array[name] = function(item){ + return method.apply(Array.from(item), slice.call(arguments, 1)); + }; + }); +} + + + +}).call(this); + + +/* +--- + +name: Event + +description: Contains the Event Class, to make the event object cross-browser. + +license: MIT-style license. + +requires: [Window, Document, Array, Function, String, Object] + +provides: Event + +... +*/ + +var Event = new Type('Event', function(event, win){ + if (!win) win = window; + var doc = win.document; + event = event || win.event; + if (event.$extended) return event; + this.$extended = true; + var type = event.type, + target = event.target || event.srcElement, + page = {}, + client = {}, + related = null, + rightClick, wheel, code, key; + while (target && target.nodeType == 3) target = target.parentNode; + + if (type.indexOf('key') != -1){ + code = event.which || event.keyCode; + key = Object.keyOf(Event.Keys, code); + if (type == 'keydown'){ + var fKey = code - 111; + if (fKey > 0 && fKey < 13) key = 'f' + fKey; + } + if (!key) key = String.fromCharCode(code).toLowerCase(); + } else if ((/click|mouse|menu/i).test(type)){ + doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; + page = { + x: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft, + y: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop + }; + client = { + x: (event.pageX != null) ? event.pageX - win.pageXOffset : event.clientX, + y: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY + }; + if ((/DOMMouseScroll|mousewheel/).test(type)){ + wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3; + } + rightClick = (event.which == 3) || (event.button == 2); + if ((/over|out/).test(type)){ + related = event.relatedTarget || event[(type == 'mouseover' ? 'from' : 'to') + 'Element']; + var testRelated = function(){ + while (related && related.nodeType == 3) related = related.parentNode; + return true; + }; + var hasRelated = (Browser.firefox2) ? testRelated.attempt() : testRelated(); + related = (hasRelated) ? related : null; + } + } else if ((/gesture|touch/i).test(type)){ + this.rotation = event.rotation; + this.scale = event.scale; + this.targetTouches = event.targetTouches; + this.changedTouches = event.changedTouches; + var touches = this.touches = event.touches; + if (touches && touches[0]){ + var touch = touches[0]; + page = {x: touch.pageX, y: touch.pageY}; + client = {x: touch.clientX, y: touch.clientY}; + } + } + + return Object.append(this, { + event: event, + type: type, + + page: page, + client: client, + rightClick: rightClick, + + wheel: wheel, + + relatedTarget: document.id(related), + target: document.id(target), + + code: code, + key: key, + + shift: event.shiftKey, + control: event.ctrlKey, + alt: event.altKey, + meta: event.metaKey + }); +}); + +Event.Keys = { + '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(); + }, + + 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(); + else this.event.returnValue = false; + return this; + } + +}); + + +/* +--- + +name: Class + +description: Contains the Class Function for easily creating, extending, and implementing reusable Classes. + +license: MIT-style license. + +requires: [Array, String, Function, Number] + +provides: Class + +... +*/ + +(function(){ + +var Class = this.Class = new Type('Class', function(params){ + if (instanceOf(params, Function)) params = {initialize: params}; + + var newClass = function(){ + reset(this); + if (newClass.$prototyping) return this; + this.$caller = null; + var value = (this.initialize) ? this.initialize.apply(this, arguments) : this; + this.$caller = this.caller = null; + return value; + }.extend(this).implement(params); + + newClass.$constructor = Class; + newClass.prototype.$constructor = newClass; + newClass.prototype.parent = parent; + + return newClass; +}); + +var parent = function(){ + if (!this.$caller) throw new Error('The method "parent" cannot be called.'); + var name = this.$caller.$name, + parent = this.$caller.$owner.parent, + previous = (parent) ? parent.prototype[name] : null; + if (!previous) throw new Error('The method "' + name + '" has no parent.'); + return previous.apply(this, arguments); +}; + +var reset = function(object){ + for (var key in object){ + var value = object[key]; + switch (typeOf(value)){ + case 'object': + var F = function(){}; + F.prototype = value; + object[key] = reset(new F); + break; + case 'array': object[key] = value.clone(); break; + } + } + return object; +}; + +var wrap = function(self, key, method){ + if (method.$origin) method = method.$origin; + var wrapper = function(){ + if (method.$protected && this.$caller == null) throw new Error('The method "' + key + '" cannot be called.'); + var caller = this.caller, current = this.$caller; + this.caller = current; this.$caller = wrapper; + var result = method.apply(this, arguments); + this.$caller = current; this.caller = caller; + return result; + }.extend({$owner: self, $origin: method, $name: key}); + return wrapper; +}; + +var implement = function(key, value, retain){ + if (Class.Mutators.hasOwnProperty(key)){ + value = Class.Mutators[key].call(this, value); + if (value == null) return this; + } + + if (typeOf(value) == 'function'){ + if (value.$hidden) return this; + this.prototype[key] = (retain) ? value : wrap(this, key, value); + } else { + Object.merge(this.prototype, key, value); + } + + return this; +}; + +var getInstance = function(klass){ + klass.$prototyping = true; + var proto = new klass; + delete klass.$prototyping; + return proto; +}; + +Class.implement('implement', implement.overloadSetter()); + +Class.Mutators = { + + Extends: function(parent){ + this.parent = parent; + this.prototype = getInstance(parent); + }, + + Implements: function(items){ + Array.from(items).each(function(item){ + var instance = new item; + for (var key in instance) implement.call(this, key, instance[key], true); + }, this); + } +}; + +}).call(this); + + +/* +--- + +name: Class.Extras + +description: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks. + +license: MIT-style license. + +requires: Class + +provides: [Class.Extras, Chain, Events, Options] + +... +*/ + +(function(){ + +this.Chain = new Class({ + + $chain: [], + + chain: function(){ + this.$chain.append(Array.flatten(arguments)); + return this; + }, + + callChain: function(){ + return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false; + }, + + clearChain: function(){ + this.$chain.empty(); + return this; + } + +}); + +var removeOn = function(string){ + return string.replace(/^on([A-Z])/, function(full, first){ + return first.toLowerCase(); + }); +}; + +this.Events = new Class({ + + $events: {}, + + addEvent: function(type, fn, internal){ + type = removeOn(type); + + + + this.$events[type] = (this.$events[type] || []).include(fn); + if (internal) fn.internal = true; + return this; + }, + + addEvents: function(events){ + for (var type in events) this.addEvent(type, events[type]); + return this; + }, + + fireEvent: function(type, args, delay){ + type = removeOn(type); + var events = this.$events[type]; + if (!events) return this; + args = Array.from(args); + events.each(function(fn){ + if (delay) fn.delay(delay, this, args); + else fn.apply(this, args); + }, this); + return this; + }, + + removeEvent: function(type, fn){ + type = removeOn(type); + var events = this.$events[type]; + if (events && !fn.internal){ + var index = events.indexOf(fn); + if (index != -1) delete events[index]; + } + return this; + }, + + removeEvents: function(events){ + var type; + if (typeOf(events) == 'object'){ + for (type in events) this.removeEvent(type, events[type]); + return this; + } + if (events) events = removeOn(events); + for (type in this.$events){ + if (events && events != type) continue; + var fns = this.$events[type]; + for (var i = fns.length; i--;) if (i in fns){ + this.removeEvent(type, fns[i]); + } + } + return this; + } + +}); + +this.Options = new Class({ + + setOptions: function(){ + var options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments)); + if (this.addEvent) for (var option in options){ + if (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue; + this.addEvent(option, options[option]); + delete options[option]; + } + return this; + } + +}); + +}).call(this); + + +/* +--- +name: Slick.Parser +description: Standalone CSS3 Selector parser +provides: Slick.Parser +... +*/ + +;(function(){ + +var parsed, + separatorIndex, + combinatorIndex, + reversed, + cache = {}, + reverseCache = {}, + reUnescape = /\\/g; + +var parse = function(expression, isReversed){ + if (expression == null) return null; + if (expression.Slick === true) return expression; + expression = ('' + expression).replace(/^\s+|\s+$/g, ''); + reversed = !!isReversed; + var currentCache = (reversed) ? reverseCache : cache; + if (currentCache[expression]) return currentCache[expression]; + parsed = { + Slick: true, + expressions: [], + raw: expression, + reverse: function(){ + return parse(this.raw, true); + } + }; + separatorIndex = -1; + while (expression != (expression = expression.replace(regexp, parser))); + parsed.length = parsed.expressions.length; + return currentCache[parsed.raw] = (reversed) ? reverse(parsed) : parsed; +}; + +var reverseCombinator = function(combinator){ + if (combinator === '!') return ' '; + else if (combinator === ' ') return '!'; + else if ((/^!/).test(combinator)) return combinator.replace(/^!/, ''); + else return '!' + combinator; +}; + +var reverse = function(expression){ + var expressions = expression.expressions; + for (var i = 0; i < expressions.length; i++){ + var exp = expressions[i]; + var last = {parts: [], tag: '*', combinator: reverseCombinator(exp[0].combinator)}; + + for (var j = 0; j < exp.length; j++){ + var cexp = exp[j]; + if (!cexp.reverseCombinator) cexp.reverseCombinator = ' '; + cexp.combinator = cexp.reverseCombinator; + delete cexp.reverseCombinator; + } + + exp.reverse().push(last); + } + return expression; +}; + +var escapeRegExp = function(string){// Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan MIT License + return string.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, function(match){ + return '\\' + match; + }); +}; + +var regexp = new RegExp( +/* +#!/usr/bin/env ruby +puts "\t\t" + DATA.read.gsub(/\(\?x\)|\s+#.*$|\s+|\\$|\\n/,'') +__END__ + "(?x)^(?:\ + \\s* ( , ) \\s* # Separator \n\ + | \\s* ( + ) \\s* # Combinator \n\ + | ( \\s+ ) # CombinatorChildren \n\ + | ( + | \\* ) # Tag \n\ + | \\# ( + ) # ID \n\ + | \\. ( + ) # ClassName \n\ + | # Attribute \n\ + \\[ \ + \\s* (+) (?: \ + \\s* ([*^$!~|]?=) (?: \ + \\s* (?:\ + ([\"']?)(.*?)\\9 \ + )\ + ) \ + )? \\s* \ + \\](?!\\]) \n\ + | :+ ( + )(?:\ + \\( (?:\ + (?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+)\ + ) \\)\ + )?\ + )" +*/ + "^(?:\\s*(,)\\s*|\\s*(+)\\s*|(\\s+)|(+|\\*)|\\#(+)|\\.(+)|\\[\\s*(+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)" + .replace(//, '[' + escapeRegExp(">+~`!@$%^&={}\\;/g, '(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])') + .replace(//g, '(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])') +); + +function parser( + rawMatch, + + separator, + combinator, + combinatorChildren, + + tagName, + id, + className, + + attributeKey, + attributeOperator, + attributeQuote, + attributeValue, + + pseudoMarker, + pseudoClass, + pseudoQuote, + pseudoClassQuotedValue, + pseudoClassValue +){ + if (separator || separatorIndex === -1){ + parsed.expressions[++separatorIndex] = []; + combinatorIndex = -1; + if (separator) return ''; + } + + if (combinator || combinatorChildren || combinatorIndex === -1){ + combinator = combinator || ' '; + var currentSeparator = parsed.expressions[separatorIndex]; + if (reversed && currentSeparator[combinatorIndex]) + currentSeparator[combinatorIndex].reverseCombinator = reverseCombinator(combinator); + currentSeparator[++combinatorIndex] = {combinator: combinator, tag: '*'}; + } + + var currentParsed = parsed.expressions[separatorIndex][combinatorIndex]; + + if (tagName){ + currentParsed.tag = tagName.replace(reUnescape, ''); + + } else if (id){ + currentParsed.id = id.replace(reUnescape, ''); + + } else if (className){ + className = className.replace(reUnescape, ''); + + if (!currentParsed.classList) currentParsed.classList = []; + if (!currentParsed.classes) currentParsed.classes = []; + currentParsed.classList.push(className); + currentParsed.classes.push({ + value: className, + regexp: new RegExp('(^|\\s)' + escapeRegExp(className) + '(\\s|$)') + }); + + } else if (pseudoClass){ + pseudoClassValue = pseudoClassValue || pseudoClassQuotedValue; + pseudoClassValue = pseudoClassValue ? pseudoClassValue.replace(reUnescape, '') : null; + + if (!currentParsed.pseudos) currentParsed.pseudos = []; + currentParsed.pseudos.push({ + key: pseudoClass.replace(reUnescape, ''), + value: pseudoClassValue, + type: pseudoMarker.length == 1 ? 'class' : 'element' + }); + + } else if (attributeKey){ + attributeKey = attributeKey.replace(reUnescape, ''); + attributeValue = (attributeValue || '').replace(reUnescape, ''); + + var test, regexp; + + switch (attributeOperator){ + case '^=' : regexp = new RegExp( '^'+ escapeRegExp(attributeValue) ); break; + case '$=' : regexp = new RegExp( escapeRegExp(attributeValue) +'$' ); break; + case '~=' : regexp = new RegExp( '(^|\\s)'+ escapeRegExp(attributeValue) +'(\\s|$)' ); break; + case '|=' : regexp = new RegExp( '^'+ escapeRegExp(attributeValue) +'(-|$)' ); break; + case '=' : test = function(value){ + return attributeValue == value; + }; break; + case '*=' : test = function(value){ + return value && value.indexOf(attributeValue) > -1; + }; break; + case '!=' : test = function(value){ + return attributeValue != value; + }; break; + default : test = function(value){ + return !!value; + }; + } + + if (attributeValue == '' && (/^[*$^]=$/).test(attributeOperator)) test = function(){ + return false; + }; + + if (!test) test = function(value){ + return value && regexp.test(value); + }; + + if (!currentParsed.attributes) currentParsed.attributes = []; + currentParsed.attributes.push({ + key: attributeKey, + operator: attributeOperator, + value: attributeValue, + test: test + }); + + } + + return ''; +}; + +// Slick NS + +var Slick = (this.Slick || {}); + +Slick.parse = function(expression){ + return parse(expression); +}; + +Slick.escapeRegExp = escapeRegExp; + +if (!this.Slick) this.Slick = Slick; + +}).apply(/**/(typeof exports != 'undefined') ? exports : /**/this); + + +/* +--- +name: Slick.Finder +description: The new, superfast css selector engine. +provides: Slick.Finder +requires: Slick.Parser +... +*/ + +;(function(){ + +var local = {}, + featuresCache = {}, + toString = Object.prototype.toString; + +// Feature / Bug detection + +local.isNativeCode = function(fn){ + return (/\{\s*\[native code\]\s*\}/).test('' + fn); +}; + +local.isXML = function(document){ + return (!!document.xmlVersion) || (!!document.xml) || (toString.call(document) == '[object XMLDocument]') || + (document.nodeType == 9 && document.documentElement.nodeName != 'HTML'); +}; + +local.setDocument = function(document){ + + // convert elements / window arguments to document. if document cannot be extrapolated, the function returns. + var nodeType = document.nodeType; + if (nodeType == 9); // document + else if (nodeType) document = document.ownerDocument; // node + else if (document.navigator) document = document.document; // window + else return; + + // check if it's the old document + + if (this.document === document) return; + this.document = document; + + // check if we have done feature detection on this document before + + var root = document.documentElement, + rootUid = this.getUIDXML(root), + features = featuresCache[rootUid], + feature; + + if (features){ + for (feature in features){ + this[feature] = features[feature]; + } + return; + } + + features = featuresCache[rootUid] = {}; + + features.root = root; + features.isXMLDocument = this.isXML(document); + + features.brokenStarGEBTN + = features.starSelectsClosedQSA + = features.idGetsName + = features.brokenMixedCaseQSA + = features.brokenGEBCN + = features.brokenCheckedQSA + = features.brokenEmptyAttributeQSA + = features.isHTMLDocument + = features.nativeMatchesSelector + = false; + + var starSelectsClosed, starSelectsComments, + brokenSecondClassNameGEBCN, cachedGetElementsByClassName, + brokenFormAttributeGetter; + + var selected, id = 'slick_uniqueid'; + var testNode = document.createElement('div'); + + var testRoot = document.body || document.getElementsByTagName('body')[0] || root; + testRoot.appendChild(testNode); + + // on non-HTML documents innerHTML and getElementsById doesnt work properly + try { + testNode.innerHTML = ''; + features.isHTMLDocument = !!document.getElementById(id); + } catch(e){}; + + if (features.isHTMLDocument){ + + testNode.style.display = 'none'; + + // IE returns comment nodes for getElementsByTagName('*') for some documents + testNode.appendChild(document.createComment('')); + starSelectsComments = (testNode.getElementsByTagName('*').length > 1); + + // IE returns closed nodes (EG:"") for getElementsByTagName('*') for some documents + try { + testNode.innerHTML = 'foo'; + selected = testNode.getElementsByTagName('*'); + starSelectsClosed = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/'); + } catch(e){}; + + features.brokenStarGEBTN = starSelectsComments || starSelectsClosed; + + // IE returns elements with the name instead of just id for getElementsById for some documents + try { + testNode.innerHTML = ''; + features.idGetsName = document.getElementById(id) === testNode.firstChild; + } catch(e){}; + + if (testNode.getElementsByClassName){ + + // Safari 3.2 getElementsByClassName caches results + try { + testNode.innerHTML = ''; + testNode.getElementsByClassName('b').length; + testNode.firstChild.className = 'b'; + cachedGetElementsByClassName = (testNode.getElementsByClassName('b').length != 2); + } catch(e){}; + + // Opera 9.6 getElementsByClassName doesnt detects the class if its not the first one + try { + testNode.innerHTML = ''; + brokenSecondClassNameGEBCN = (testNode.getElementsByClassName('a').length != 2); + } catch(e){}; + + features.brokenGEBCN = cachedGetElementsByClassName || brokenSecondClassNameGEBCN; + } + + if (testNode.querySelectorAll){ + // IE 8 returns closed nodes (EG:"") for querySelectorAll('*') for some documents + try { + testNode.innerHTML = 'foo'; + selected = testNode.querySelectorAll('*'); + features.starSelectsClosedQSA = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/'); + } catch(e){}; + + // Safari 3.2 querySelectorAll doesnt work with mixedcase on quirksmode + try { + testNode.innerHTML = ''; + features.brokenMixedCaseQSA = !testNode.querySelectorAll('.MiX').length; + } catch(e){}; + + // Webkit and Opera dont return selected options on querySelectorAll + try { + testNode.innerHTML = ''; + features.brokenCheckedQSA = (testNode.querySelectorAll(':checked').length == 0); + } catch(e){}; + + // IE returns incorrect results for attr[*^$]="" selectors on querySelectorAll + try { + testNode.innerHTML = ''; + features.brokenEmptyAttributeQSA = (testNode.querySelectorAll('[class*=""]').length != 0); + } catch(e){}; + + } + + // IE6-7, if a form has an input of id x, form.getAttribute(x) returns a reference to the input + try { + testNode.innerHTML = '
'; + brokenFormAttributeGetter = (testNode.firstChild.getAttribute('action') != 's'); + } catch(e){}; + + // native matchesSelector function + + features.nativeMatchesSelector = root.matchesSelector || /*root.msMatchesSelector ||*/ root.mozMatchesSelector || root.webkitMatchesSelector; + if (features.nativeMatchesSelector) try { + // if matchesSelector trows errors on incorrect sintaxes we can use it + features.nativeMatchesSelector.call(root, ':slick'); + features.nativeMatchesSelector = null; + } catch(e){}; + + } + + try { + root.slick_expando = 1; + delete root.slick_expando; + features.getUID = this.getUIDHTML; + } catch(e) { + features.getUID = this.getUIDXML; + } + + testRoot.removeChild(testNode); + testNode = selected = testRoot = null; + + // getAttribute + + features.getAttribute = (features.isHTMLDocument && brokenFormAttributeGetter) ? function(node, name){ + var method = this.attributeGetters[name]; + if (method) return method.call(node); + var attributeNode = node.getAttributeNode(name); + return (attributeNode) ? attributeNode.nodeValue : null; + } : function(node, name){ + var method = this.attributeGetters[name]; + return (method) ? method.call(node) : node.getAttribute(name); + }; + + // hasAttribute + + features.hasAttribute = (root && this.isNativeCode(root.hasAttribute)) ? function(node, attribute) { + return node.hasAttribute(attribute); + } : function(node, attribute) { + node = node.getAttributeNode(attribute); + return !!(node && (node.specified || node.nodeValue)); + }; + + // contains + // FIXME: Add specs: local.contains should be different for xml and html documents? + features.contains = (root && this.isNativeCode(root.contains)) ? function(context, node){ + return context.contains(node); + } : (root && root.compareDocumentPosition) ? function(context, node){ + return context === node || !!(context.compareDocumentPosition(node) & 16); + } : function(context, node){ + if (node) do { + if (node === context) return true; + } while ((node = node.parentNode)); + return false; + }; + + // document order sorting + // credits to Sizzle (http://sizzlejs.com/) + + features.documentSorter = (root.compareDocumentPosition) ? function(a, b){ + if (!a.compareDocumentPosition || !b.compareDocumentPosition) return 0; + return a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; + } : ('sourceIndex' in root) ? function(a, b){ + if (!a.sourceIndex || !b.sourceIndex) return 0; + return a.sourceIndex - b.sourceIndex; + } : (document.createRange) ? function(a, b){ + if (!a.ownerDocument || !b.ownerDocument) return 0; + var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); + aRange.setStart(a, 0); + aRange.setEnd(a, 0); + bRange.setStart(b, 0); + bRange.setEnd(b, 0); + return aRange.compareBoundaryPoints(Range.START_TO_END, bRange); + } : null ; + + root = null; + + for (feature in features){ + this[feature] = features[feature]; + } +}; + +// Main Method + +var reSimpleSelector = /^([#.]?)((?:[\w-]+|\*))$/, + reEmptyAttribute = /\[.+[*$^]=(?:""|'')?\]/, + qsaFailExpCache = {}; + +local.search = function(context, expression, append, first){ + + var found = this.found = (first) ? null : (append || []); + + if (!context) return found; + else if (context.navigator) context = context.document; // Convert the node from a window to a document + else if (!context.nodeType) return found; + + // setup + + var parsed, i, + uniques = this.uniques = {}, + hasOthers = !!(append && append.length), + contextIsDocument = (context.nodeType == 9); + + if (this.document !== (contextIsDocument ? context : context.ownerDocument)) this.setDocument(context); + + // avoid duplicating items already in the append array + if (hasOthers) for (i = found.length; i--;) uniques[this.getUID(found[i])] = true; + + // expression checks + + if (typeof expression == 'string'){ // expression is a string + + /**/ + var simpleSelector = expression.match(reSimpleSelector); + simpleSelectors: if (simpleSelector) { + + var symbol = simpleSelector[1], + name = simpleSelector[2], + node, nodes; + + if (!symbol){ + + if (name == '*' && this.brokenStarGEBTN) break simpleSelectors; + nodes = context.getElementsByTagName(name); + if (first) return nodes[0] || null; + for (i = 0; node = nodes[i++];){ + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + } + + } else if (symbol == '#'){ + + if (!this.isHTMLDocument || !contextIsDocument) break simpleSelectors; + node = context.getElementById(name); + if (!node) return found; + if (this.idGetsName && node.getAttributeNode('id').nodeValue != name) break simpleSelectors; + if (first) return node || null; + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + + } else if (symbol == '.'){ + + if (!this.isHTMLDocument || ((!context.getElementsByClassName || this.brokenGEBCN) && context.querySelectorAll)) break simpleSelectors; + if (context.getElementsByClassName && !this.brokenGEBCN){ + nodes = context.getElementsByClassName(name); + if (first) return nodes[0] || null; + for (i = 0; node = nodes[i++];){ + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + } + } else { + var matchClass = new RegExp('(^|\\s)'+ Slick.escapeRegExp(name) +'(\\s|$)'); + nodes = context.getElementsByTagName('*'); + for (i = 0; node = nodes[i++];){ + className = node.className; + if (!(className && matchClass.test(className))) continue; + if (first) return node; + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + } + } + + } + + if (hasOthers) this.sort(found); + return (first) ? null : found; + + } + /**/ + + /**/ + querySelector: if (context.querySelectorAll) { + + if (!this.isHTMLDocument || this.brokenMixedCaseQSA || qsaFailExpCache[expression] || + (this.brokenCheckedQSA && expression.indexOf(':checked') > -1) || + (this.brokenEmptyAttributeQSA && reEmptyAttribute.test(expression)) || Slick.disableQSA) break querySelector; + + var _expression = expression; + if (!contextIsDocument){ + // non-document rooted QSA + // credits to Andrew Dupont + var currentId = context.getAttribute('id'), slickid = 'slickid__'; + context.setAttribute('id', slickid); + _expression = '#' + slickid + ' ' + _expression; + } + + try { + if (first) return context.querySelector(_expression) || null; + else nodes = context.querySelectorAll(_expression); + } catch(e) { + qsaFailExpCache[expression] = 1; + break querySelector; + } finally { + if (!contextIsDocument){ + if (currentId) context.setAttribute('id', currentId); + else context.removeAttribute('id'); + } + } + + if (this.starSelectsClosedQSA) for (i = 0; node = nodes[i++];){ + if (node.nodeName > '@' && !(hasOthers && uniques[this.getUID(node)])) found.push(node); + } else for (i = 0; node = nodes[i++];){ + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + } + + if (hasOthers) this.sort(found); + return found; + + } + /**/ + + parsed = this.Slick.parse(expression); + if (!parsed.length) return found; + } else if (expression == null){ // there is no expression + return found; + } else if (expression.Slick){ // expression is a parsed Slick object + parsed = expression; + } else if (this.contains(context.documentElement || context, expression)){ // expression is a node + (found) ? found.push(expression) : found = expression; + return found; + } else { // other junk + return found; + } + + /**//**/ + + // cache elements for the nth selectors + + this.posNTH = {}; + this.posNTHLast = {}; + this.posNTHType = {}; + this.posNTHTypeLast = {}; + + /**//**/ + + // if append is null and there is only a single selector with one expression use pushArray, else use pushUID + this.push = (!hasOthers && (first || (parsed.length == 1 && parsed.expressions[0].length == 1))) ? this.pushArray : this.pushUID; + + if (found == null) found = []; + + // default engine + + var j, m, n; + var combinator, tag, id, classList, classes, attributes, pseudos; + var currentItems, currentExpression, currentBit, lastBit, expressions = parsed.expressions; + + search: for (i = 0; (currentExpression = expressions[i]); i++) for (j = 0; (currentBit = currentExpression[j]); j++){ + + combinator = 'combinator:' + currentBit.combinator; + if (!this[combinator]) continue search; + + tag = (this.isXMLDocument) ? currentBit.tag : currentBit.tag.toUpperCase(); + id = currentBit.id; + classList = currentBit.classList; + classes = currentBit.classes; + attributes = currentBit.attributes; + pseudos = currentBit.pseudos; + lastBit = (j === (currentExpression.length - 1)); + + this.bitUniques = {}; + + if (lastBit){ + this.uniques = uniques; + this.found = found; + } else { + this.uniques = {}; + this.found = []; + } + + if (j === 0){ + this[combinator](context, tag, id, classes, attributes, pseudos, classList); + if (first && lastBit && found.length) break search; + } else { + if (first && lastBit) for (m = 0, n = currentItems.length; m < n; m++){ + this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList); + if (found.length) break search; + } else for (m = 0, n = currentItems.length; m < n; m++) this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList); + } + + currentItems = this.found; + } + + // should sort if there are nodes in append and if you pass multiple expressions. + if (hasOthers || (parsed.expressions.length > 1)) this.sort(found); + + return (first) ? (found[0] || null) : found; +}; + +// Utils + +local.uidx = 1; +local.uidk = 'slick-uniqueid'; + +local.getUIDXML = function(node){ + var uid = node.getAttribute(this.uidk); + if (!uid){ + uid = this.uidx++; + node.setAttribute(this.uidk, uid); + } + return uid; +}; + +local.getUIDHTML = function(node){ + return node.uniqueNumber || (node.uniqueNumber = this.uidx++); +}; + +// sort based on the setDocument documentSorter method. + +local.sort = function(results){ + if (!this.documentSorter) return results; + results.sort(this.documentSorter); + return results; +}; + +/**//**/ + +local.cacheNTH = {}; + +local.matchNTH = /^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/; + +local.parseNTHArgument = function(argument){ + var parsed = argument.match(this.matchNTH); + if (!parsed) return false; + var special = parsed[2] || false; + var a = parsed[1] || 1; + if (a == '-') a = -1; + var b = +parsed[3] || 0; + parsed = + (special == 'n') ? {a: a, b: b} : + (special == 'odd') ? {a: 2, b: 1} : + (special == 'even') ? {a: 2, b: 0} : {a: 0, b: a}; + + return (this.cacheNTH[argument] = parsed); +}; + +local.createNTHPseudo = function(child, sibling, positions, ofType){ + return function(node, argument){ + var uid = this.getUID(node); + if (!this[positions][uid]){ + var parent = node.parentNode; + if (!parent) return false; + var el = parent[child], count = 1; + if (ofType){ + var nodeName = node.nodeName; + do { + if (el.nodeName != nodeName) continue; + this[positions][this.getUID(el)] = count++; + } while ((el = el[sibling])); + } else { + do { + if (el.nodeType != 1) continue; + this[positions][this.getUID(el)] = count++; + } while ((el = el[sibling])); + } + } + argument = argument || 'n'; + var parsed = this.cacheNTH[argument] || this.parseNTHArgument(argument); + if (!parsed) return false; + var a = parsed.a, b = parsed.b, pos = this[positions][uid]; + if (a == 0) return b == pos; + if (a > 0){ + if (pos < b) return false; + } else { + if (b < pos) return false; + } + return ((pos - b) % a) == 0; + }; +}; + +/**//**/ + +local.pushArray = function(node, tag, id, classes, attributes, pseudos){ + if (this.matchSelector(node, tag, id, classes, attributes, pseudos)) this.found.push(node); +}; + +local.pushUID = function(node, tag, id, classes, attributes, pseudos){ + var uid = this.getUID(node); + if (!this.uniques[uid] && this.matchSelector(node, tag, id, classes, attributes, pseudos)){ + this.uniques[uid] = true; + this.found.push(node); + } +}; + +local.matchNode = function(node, selector){ + if (this.isHTMLDocument && this.nativeMatchesSelector){ + try { + return this.nativeMatchesSelector.call(node, selector.replace(/\[([^=]+)=\s*([^'"\]]+?)\s*\]/g, '[$1="$2"]')); + } catch(matchError) {} + } + + var parsed = this.Slick.parse(selector); + if (!parsed) return true; + + // simple (single) selectors + var expressions = parsed.expressions, reversedExpressions, simpleExpCounter = 0, i; + for (i = 0; (currentExpression = expressions[i]); i++){ + if (currentExpression.length == 1){ + var exp = currentExpression[0]; + if (this.matchSelector(node, (this.isXMLDocument) ? exp.tag : exp.tag.toUpperCase(), exp.id, exp.classes, exp.attributes, exp.pseudos)) return true; + simpleExpCounter++; + } + } + + if (simpleExpCounter == parsed.length) return false; + + var nodes = this.search(this.document, parsed), item; + for (i = 0; item = nodes[i++];){ + if (item === node) return true; + } + return false; +}; + +local.matchPseudo = function(node, name, argument){ + var pseudoName = 'pseudo:' + name; + if (this[pseudoName]) return this[pseudoName](node, argument); + var attribute = this.getAttribute(node, name); + return (argument) ? argument == attribute : !!attribute; +}; + +local.matchSelector = function(node, tag, id, classes, attributes, pseudos){ + if (tag){ + var nodeName = (this.isXMLDocument) ? node.nodeName : node.nodeName.toUpperCase(); + if (tag == '*'){ + if (nodeName < '@') return false; // Fix for comment nodes and closed nodes + } else { + if (nodeName != tag) return false; + } + } + + if (id && node.getAttribute('id') != id) return false; + + var i, part, cls; + if (classes) for (i = classes.length; i--;){ + cls = node.getAttribute('class') || node.className; + if (!(cls && classes[i].regexp.test(cls))) return false; + } + if (attributes) for (i = attributes.length; i--;){ + part = attributes[i]; + if (part.operator ? !part.test(this.getAttribute(node, part.key)) : !this.hasAttribute(node, part.key)) return false; + } + if (pseudos) for (i = pseudos.length; i--;){ + part = pseudos[i]; + if (!this.matchPseudo(node, part.key, part.value)) return false; + } + return true; +}; + +var combinators = { + + ' ': function(node, tag, id, classes, attributes, pseudos, classList){ // all child nodes, any level + + var i, item, children; + + if (this.isHTMLDocument){ + getById: if (id){ + item = this.document.getElementById(id); + if ((!item && node.all) || (this.idGetsName && item && item.getAttributeNode('id').nodeValue != id)){ + // all[id] returns all the elements with that name or id inside node + // if theres just one it will return the element, else it will be a collection + children = node.all[id]; + if (!children) return; + if (!children[0]) children = [children]; + for (i = 0; item = children[i++];){ + var idNode = item.getAttributeNode('id'); + if (idNode && idNode.nodeValue == id){ + this.push(item, tag, null, classes, attributes, pseudos); + break; + } + } + return; + } + if (!item){ + // if the context is in the dom we return, else we will try GEBTN, breaking the getById label + if (this.contains(this.root, node)) return; + else break getById; + } else if (this.document !== node && !this.contains(node, item)) return; + this.push(item, tag, null, classes, attributes, pseudos); + return; + } + getByClass: if (classes && node.getElementsByClassName && !this.brokenGEBCN){ + children = node.getElementsByClassName(classList.join(' ')); + if (!(children && children.length)) break getByClass; + for (i = 0; item = children[i++];) this.push(item, tag, id, null, attributes, pseudos); + return; + } + } + getByTag: { + children = node.getElementsByTagName(tag); + if (!(children && children.length)) break getByTag; + if (!this.brokenStarGEBTN) tag = null; + for (i = 0; item = children[i++];) this.push(item, tag, id, classes, attributes, pseudos); + } + }, + + '>': function(node, tag, id, classes, attributes, pseudos){ // direct children + if ((node = node.firstChild)) do { + if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos); + } while ((node = node.nextSibling)); + }, + + '+': function(node, tag, id, classes, attributes, pseudos){ // next sibling + while ((node = node.nextSibling)) if (node.nodeType == 1){ + this.push(node, tag, id, classes, attributes, pseudos); + break; + } + }, + + '^': function(node, tag, id, classes, attributes, pseudos){ // first child + node = node.firstChild; + if (node){ + if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos); + else this['combinator:+'](node, tag, id, classes, attributes, pseudos); + } + }, + + '~': function(node, tag, id, classes, attributes, pseudos){ // next siblings + while ((node = node.nextSibling)){ + if (node.nodeType != 1) continue; + var uid = this.getUID(node); + if (this.bitUniques[uid]) break; + this.bitUniques[uid] = true; + this.push(node, tag, id, classes, attributes, pseudos); + } + }, + + '++': function(node, tag, id, classes, attributes, pseudos){ // next sibling and previous sibling + this['combinator:+'](node, tag, id, classes, attributes, pseudos); + this['combinator:!+'](node, tag, id, classes, attributes, pseudos); + }, + + '~~': function(node, tag, id, classes, attributes, pseudos){ // next siblings and previous siblings + this['combinator:~'](node, tag, id, classes, attributes, pseudos); + this['combinator:!~'](node, tag, id, classes, attributes, pseudos); + }, + + '!': function(node, tag, id, classes, attributes, pseudos){ // all parent nodes up to document + while ((node = node.parentNode)) if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos); + }, + + '!>': function(node, tag, id, classes, attributes, pseudos){ // direct parent (one level) + node = node.parentNode; + if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos); + }, + + '!+': function(node, tag, id, classes, attributes, pseudos){ // previous sibling + while ((node = node.previousSibling)) if (node.nodeType == 1){ + this.push(node, tag, id, classes, attributes, pseudos); + break; + } + }, + + '!^': function(node, tag, id, classes, attributes, pseudos){ // last child + node = node.lastChild; + if (node){ + if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos); + else this['combinator:!+'](node, tag, id, classes, attributes, pseudos); + } + }, + + '!~': function(node, tag, id, classes, attributes, pseudos){ // previous siblings + while ((node = node.previousSibling)){ + if (node.nodeType != 1) continue; + var uid = this.getUID(node); + if (this.bitUniques[uid]) break; + this.bitUniques[uid] = true; + this.push(node, tag, id, classes, attributes, pseudos); + } + } + +}; + +for (var c in combinators) local['combinator:' + c] = combinators[c]; + +var pseudos = { + + /**/ + + 'empty': function(node){ + var child = node.firstChild; + return !(child && child.nodeType == 1) && !(node.innerText || node.textContent || '').length; + }, + + 'not': function(node, expression){ + return !this.matchNode(node, expression); + }, + + 'contains': function(node, text){ + return (node.innerText || node.textContent || '').indexOf(text) > -1; + }, + + 'first-child': function(node){ + while ((node = node.previousSibling)) if (node.nodeType == 1) return false; + return true; + }, + + 'last-child': function(node){ + while ((node = node.nextSibling)) if (node.nodeType == 1) return false; + return true; + }, + + 'only-child': function(node){ + var prev = node; + while ((prev = prev.previousSibling)) if (prev.nodeType == 1) return false; + var next = node; + while ((next = next.nextSibling)) if (next.nodeType == 1) return false; + return true; + }, + + /**/ + + 'nth-child': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTH'), + + 'nth-last-child': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHLast'), + + 'nth-of-type': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTHType', true), + + 'nth-last-of-type': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHTypeLast', true), + + 'index': function(node, index){ + return this['pseudo:nth-child'](node, '' + index + 1); + }, + + 'even': function(node){ + return this['pseudo:nth-child'](node, '2n'); + }, + + 'odd': function(node){ + return this['pseudo:nth-child'](node, '2n+1'); + }, + + /**/ + + /**/ + + 'first-of-type': function(node){ + var nodeName = node.nodeName; + while ((node = node.previousSibling)) if (node.nodeName == nodeName) return false; + return true; + }, + + 'last-of-type': function(node){ + var nodeName = node.nodeName; + while ((node = node.nextSibling)) if (node.nodeName == nodeName) return false; + return true; + }, + + 'only-of-type': function(node){ + var prev = node, nodeName = node.nodeName; + while ((prev = prev.previousSibling)) if (prev.nodeName == nodeName) return false; + var next = node; + while ((next = next.nextSibling)) if (next.nodeName == nodeName) return false; + return true; + }, + + /**/ + + // custom pseudos + + 'enabled': function(node){ + return !node.disabled; + }, + + 'disabled': function(node){ + return node.disabled; + }, + + 'checked': function(node){ + return node.checked || node.selected; + }, + + 'focus': function(node){ + return this.isHTMLDocument && this.document.activeElement === node && (node.href || node.type || this.hasAttribute(node, 'tabindex')); + }, + + 'root': function(node){ + return (node === this.root); + }, + + 'selected': function(node){ + return node.selected; + } + + /**/ +}; + +for (var p in pseudos) local['pseudo:' + p] = pseudos[p]; + +// attributes methods + +local.attributeGetters = { + + 'class': function(){ + return this.getAttribute('class') || this.className; + }, + + 'for': function(){ + return ('htmlFor' in this) ? this.htmlFor : this.getAttribute('for'); + }, + + 'href': function(){ + return ('href' in this) ? this.getAttribute('href', 2) : this.getAttribute('href'); + }, + + 'style': function(){ + return (this.style) ? this.style.cssText : this.getAttribute('style'); + }, + + 'tabindex': function(){ + var attributeNode = this.getAttributeNode('tabindex'); + return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null; + }, + + 'type': function(){ + return this.getAttribute('type'); + } + +}; + +// Slick + +var Slick = local.Slick = (this.Slick || {}); + +Slick.version = '1.1.5'; + +// Slick finder + +Slick.search = function(context, expression, append){ + return local.search(context, expression, append); +}; + +Slick.find = function(context, expression){ + return local.search(context, expression, null, true); +}; + +// Slick containment checker + +Slick.contains = function(container, node){ + local.setDocument(container); + return local.contains(container, node); +}; + +// Slick attribute getter + +Slick.getAttribute = function(node, name){ + return local.getAttribute(node, name); +}; + +// Slick matcher + +Slick.match = function(node, selector){ + if (!(node && selector)) return false; + if (!selector || selector === node) return true; + local.setDocument(node); + return local.matchNode(node, selector); +}; + +// Slick attribute accessor + +Slick.defineAttributeGetter = function(name, fn){ + local.attributeGetters[name] = fn; + return this; +}; + +Slick.lookupAttributeGetter = function(name){ + return local.attributeGetters[name]; +}; + +// Slick pseudo accessor + +Slick.definePseudo = function(name, fn){ + local['pseudo:' + name] = function(node, argument){ + return fn.call(node, argument); + }; + return this; +}; + +Slick.lookupPseudo = function(name){ + var pseudo = local['pseudo:' + name]; + if (pseudo) return function(argument){ + return pseudo.call(this, argument); + }; + return null; +}; + +// Slick overrides accessor + +Slick.override = function(regexp, fn){ + local.override(regexp, fn); + return this; +}; + +Slick.isXML = local.isXML; + +Slick.uidOf = function(node){ + return local.getUIDHTML(node); +}; + +if (!this.Slick) this.Slick = Slick; + +}).apply(/**/(typeof exports != 'undefined') ? exports : /**/this); + + +/* +--- + +name: Element + +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. + +license: MIT-style license. + +requires: [Window, Document, Array, String, Function, Number, Slick.Parser, Slick.Finder] + +provides: [Element, Elements, $, $$, Iframe, Selectors] + +... +*/ + +var Element = function(tag, props){ + var konstructor = Element.Constructors[tag]; + if (konstructor) return konstructor(props); + if (typeof tag != 'string') return document.id(tag).set(props); + + if (!props) props = {}; + + if (!(/^[\w-]+$/).test(tag)){ + var parsed = Slick.parse(tag).expressions[0][0]; + tag = (parsed.tag == '*') ? 'div' : parsed.tag; + if (parsed.id && props.id == null) props.id = parsed.id; + + var attributes = parsed.attributes; + if (attributes) for (var i = 0, l = attributes.length; i < l; i++){ + var attr = attributes[i]; + if (attr.value != null && attr.operator == '=' && props[attr.key] == null) + props[attr.key] = attr.value; + } + + if (parsed.classList && props['class'] == null) props['class'] = parsed.classList.join(' '); + } + + return document.newElement(tag, props); +}; + +if (Browser.Element) Element.prototype = Browser.Element.prototype; + +new Type('Element', Element).mirror(function(name){ + if (Array.prototype[name]) return; + + var obj = {}; + obj[name] = function(){ + var results = [], args = arguments, elements = true; + for (var i = 0, l = this.length; i < l; i++){ + var element = this[i], result = results[i] = element[name].apply(element, args); + elements = (elements && typeOf(result) == 'element'); + } + return (elements) ? new Elements(results) : results; + }; + + Elements.implement(obj); +}); + +if (!Browser.Element){ + Element.parent = Object; + + Element.Prototype = {'$family': Function.from('element').hide()}; + + Element.mirror(function(name, method){ + Element.Prototype[name] = method; + }); +} + +Element.Constructors = {}; + + + +var IFrame = new Type('IFrame', function(){ + var params = Array.link(arguments, { + properties: Type.isObject, + iframe: function(obj){ + return (obj != null); + } + }); + + var props = params.properties || {}, iframe; + if (params.iframe) iframe = document.id(params.iframe); + var onload = props.onload || function(){}; + delete props.onload; + props.id = props.name = [props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + String.uniqueID()].pick(); + iframe = new Element(iframe || 'iframe', props); + + var onLoad = function(){ + onload.call(iframe.contentWindow); + }; + + if (window.frames[props.id]) onLoad(); + else iframe.addListener('load', onLoad); + return iframe; +}); + +var Elements = this.Elements = function(nodes){ + if (nodes && nodes.length){ + var uniques = {}, node; + for (var i = 0; node = nodes[i++];){ + var uid = Slick.uidOf(node); + if (!uniques[uid]){ + uniques[uid] = true; + this.push(node); + } + } + } +}; + +Elements.prototype = {length: 0}; +Elements.parent = Array; + +new Type('Elements', Elements).implement({ + + filter: function(filter, bind){ + if (!filter) return this; + return new Elements(Array.filter(this, (typeOf(filter) == 'string') ? function(item){ + return item.match(filter); + } : filter, bind)); + }.protect(), + + push: function(){ + var length = this.length; + for (var i = 0, l = arguments.length; i < l; i++){ + var item = document.id(arguments[i]); + if (item) this[length++] = item; + } + return (this.length = length); + }.protect(), + + unshift: function(){ + var items = []; + for (var i = 0, l = arguments.length; i < l; i++){ + var item = document.id(arguments[i]); + if (item) items.push(item); + } + return Array.prototype.unshift.apply(this, items); + }.protect(), + + concat: function(){ + var newElements = new Elements(this); + for (var i = 0, l = arguments.length; i < l; i++){ + var item = arguments[i]; + if (Type.isEnumerable(item)) newElements.append(item); + else newElements.push(item); + } + return newElements; + }.protect(), + + append: function(collection){ + for (var i = 0, l = collection.length; i < l; i++) this.push(collection[i]); + return this; + }.protect(), + + empty: function(){ + while (this.length) delete this[--this.length]; + return this; + }.protect() + +}); + + + +(function(){ + +// FF, IE +var splice = Array.prototype.splice, object = {'0': 0, '1': 1, length: 2}; + +splice.call(object, 1, 1); +if (object[1] == 1) Elements.implement('splice', function(){ + var length = this.length; + splice.apply(this, arguments); + while (length >= this.length) delete this[length--]; + return this; +}.protect()); + +Elements.implement(Array.prototype); + +Array.mirror(Elements); + +/**/ +var createElementAcceptsHTML; +try { + var x = document.createElement(''); + createElementAcceptsHTML = (x.name == 'x'); +} catch(e){} + +var escapeQuotes = function(html){ + return ('' + html).replace(/&/g, '&').replace(/"/g, '"'); +}; +/**/ + +Document.implement({ + + newElement: function(tag, props){ + if (props && props.checked != null) props.defaultChecked = props.checked; + /**/// Fix for readonly name and type properties in IE < 8 + if (createElementAcceptsHTML && props){ + tag = '<' + tag; + if (props.name) tag += ' name="' + escapeQuotes(props.name) + '"'; + if (props.type) tag += ' type="' + escapeQuotes(props.type) + '"'; + tag += '>'; + delete props.name; + delete props.type; + } + /**/ + return this.id(this.createElement(tag)).set(props); + } + +}); + +})(); + +Document.implement({ + + newTextNode: function(text){ + return this.createTextNode(text); + }, + + getDocument: function(){ + return this; + }, + + getWindow: function(){ + return this.window; + }, + + id: (function(){ + + var types = { + + string: function(id, nocash, doc){ + id = Slick.find(doc, '#' + id.replace(/(\W)/g, '\\$1')); + return (id) ? types.element(id, nocash) : null; + }, + + element: function(el, nocash){ + $uid(el); + if (!nocash && !el.$family && !(/^(?:object|embed)$/i).test(el.tagName)){ + Object.append(el, Element.Prototype); + } + return el; + }, + + object: function(obj, nocash, doc){ + if (obj.toElement) return types.element(obj.toElement(doc), nocash); + return null; + } + + }; + + types.textnode = types.whitespace = types.window = types.document = function(zero){ + return zero; + }; + + return function(el, nocash, doc){ + if (el && el.$family && el.uid) return el; + var type = typeOf(el); + return (types[type]) ? types[type](el, nocash, doc || document) : null; + }; + + })() + +}); + +if (window.$ == null) Window.implement('$', function(el, nc){ + return document.id(el, nc, this.document); +}); + +Window.implement({ + + getDocument: function(){ + return this.document; + }, + + getWindow: function(){ + return this; + } + +}); + +[Document, Element].invoke('implement', { + + getElements: function(expression){ + return Slick.search(this, expression, new Elements); + }, + + getElement: function(expression){ + return document.id(Slick.find(this, expression)); + } + +}); + + + +if (window.$$ == null) Window.implement('$$', function(selector){ + if (arguments.length == 1){ + if (typeof selector == 'string') return Slick.search(this.document, selector, new Elements); + else if (Type.isEnumerable(selector)) return new Elements(selector); + } + return new Elements(arguments); +}); + +(function(){ + +var collected = {}, storage = {}; +var formProps = {input: 'checked', option: 'selected', textarea: 'value'}; + +var get = function(uid){ + return (storage[uid] || (storage[uid] = {})); +}; + +var clean = function(item){ + var uid = item.uid; + if (item.removeEvents) item.removeEvents(); + if (item.clearAttributes) item.clearAttributes(); + if (uid != null){ + delete collected[uid]; + delete storage[uid]; + } + return item; +}; + +var camels = ['defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', 'frameBorder', 'maxLength', 'readOnly', + 'rowSpan', 'tabIndex', 'useMap' +]; +var bools = ['compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', 'disabled', 'readOnly', 'multiple', 'selected', + 'noresize', 'defer', 'defaultChecked' +]; + var attributes = { + 'html': 'innerHTML', + 'class': 'className', + 'for': 'htmlFor', + 'text': (function(){ + var temp = document.createElement('div'); + return (temp.textContent == null) ? 'innerText' : 'textContent'; + })() +}; +var readOnly = ['type']; +var expandos = ['value', 'defaultValue']; +var uriAttrs = /^(?:href|src|usemap)$/i; + +bools = bools.associate(bools); +camels = camels.associate(camels.map(String.toLowerCase)); +readOnly = readOnly.associate(readOnly); + +Object.append(attributes, expandos.associate(expandos)); + +var inserters = { + + before: function(context, element){ + var parent = element.parentNode; + if (parent) parent.insertBefore(context, element); + }, + + after: function(context, element){ + var parent = element.parentNode; + if (parent) parent.insertBefore(context, element.nextSibling); + }, + + bottom: function(context, element){ + element.appendChild(context); + }, + + top: function(context, element){ + element.insertBefore(context, element.firstChild); + } + +}; + +inserters.inside = inserters.bottom; + + + +var injectCombinator = function(expression, combinator){ + if (!expression) return combinator; + + expression = Object.clone(Slick.parse(expression)); + + var expressions = expression.expressions; + for (var i = expressions.length; i--;) + expressions[i][0].combinator = combinator; + + return expression; +}; + +Element.implement({ + + set: function(prop, value){ + var property = Element.Properties[prop]; + (property && property.set) ? property.set.call(this, value) : this.setProperty(prop, value); + }.overloadSetter(), + + get: function(prop){ + var property = Element.Properties[prop]; + return (property && property.get) ? property.get.apply(this) : this.getProperty(prop); + }.overloadGetter(), + + erase: function(prop){ + var property = Element.Properties[prop]; + (property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop); + return this; + }, + + setProperty: function(attribute, value){ + attribute = camels[attribute] || attribute; + if (value == null) return this.removeProperty(attribute); + var key = attributes[attribute]; + (key) ? this[key] = value : + (bools[attribute]) ? this[attribute] = !!value : this.setAttribute(attribute, '' + value); + return this; + }, + + setProperties: function(attributes){ + for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]); + return this; + }, + + getProperty: function(attribute){ + attribute = camels[attribute] || attribute; + var key = attributes[attribute] || readOnly[attribute]; + return (key) ? this[key] : + (bools[attribute]) ? !!this[attribute] : + (uriAttrs.test(attribute) ? this.getAttribute(attribute, 2) : + (key = this.getAttributeNode(attribute)) ? key.nodeValue : null) || null; + }, + + getProperties: function(){ + var args = Array.from(arguments); + return args.map(this.getProperty, this).associate(args); + }, + + removeProperty: function(attribute){ + attribute = camels[attribute] || attribute; + var key = attributes[attribute]; + (key) ? this[key] = '' : + (bools[attribute]) ? this[attribute] = false : this.removeAttribute(attribute); + return this; + }, + + removeProperties: function(){ + Array.each(arguments, this.removeProperty, this); + return this; + }, + + hasClass: function(className){ + return this.className.clean().contains(className, ' '); + }, + + addClass: function(className){ + if (!this.hasClass(className)) this.className = (this.className + ' ' + className).clean(); + return this; + }, + + removeClass: function(className){ + this.className = this.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1'); + return this; + }, + + toggleClass: function(className, force){ + if (force == null) force = !this.hasClass(className); + return (force) ? this.addClass(className) : this.removeClass(className); + }, + + adopt: function(){ + var parent = this, fragment, elements = Array.flatten(arguments), length = elements.length; + if (length > 1) parent = fragment = document.createDocumentFragment(); + + for (var i = 0; i < length; i++){ + var element = document.id(elements[i], true); + if (element) parent.appendChild(element); + } + + if (fragment) this.appendChild(fragment); + + return this; + }, + + appendText: function(text, where){ + return this.grab(this.getDocument().newTextNode(text), where); + }, + + grab: function(el, where){ + inserters[where || 'bottom'](document.id(el, true), this); + return this; + }, + + inject: function(el, where){ + inserters[where || 'bottom'](this, document.id(el, true)); + return this; + }, + + replaces: function(el){ + el = document.id(el, true); + el.parentNode.replaceChild(this, el); + return this; + }, + + wraps: function(el, where){ + el = document.id(el, true); + return this.replaces(el).grab(el, where); + }, + + getPrevious: function(expression){ + return document.id(Slick.find(this, injectCombinator(expression, '!~'))); + }, + + getAllPrevious: function(expression){ + return Slick.search(this, injectCombinator(expression, '!~'), new Elements); + }, + + getNext: function(expression){ + return document.id(Slick.find(this, injectCombinator(expression, '~'))); + }, + + getAllNext: function(expression){ + return Slick.search(this, injectCombinator(expression, '~'), new Elements); + }, + + getFirst: function(expression){ + return document.id(Slick.search(this, injectCombinator(expression, '>'))[0]); + }, + + getLast: function(expression){ + return document.id(Slick.search(this, injectCombinator(expression, '>')).getLast()); + }, + + getParent: function(expression){ + return document.id(Slick.find(this, injectCombinator(expression, '!'))); + }, + + getParents: function(expression){ + return Slick.search(this, injectCombinator(expression, '!'), new Elements); + }, + + getSiblings: function(expression){ + return Slick.search(this, injectCombinator(expression, '~~'), new Elements); + }, + + getChildren: function(expression){ + return Slick.search(this, injectCombinator(expression, '>'), new Elements); + }, + + getWindow: function(){ + return this.ownerDocument.window; + }, + + getDocument: function(){ + return this.ownerDocument; + }, + + getElementById: function(id){ + return document.id(Slick.find(this, '#' + ('' + id).replace(/(\W)/g, '\\$1'))); + }, + + getSelected: function(){ + this.selectedIndex; // Safari 3.2.1 + return new Elements(Array.from(this.options).filter(function(option){ + return option.selected; + })); + }, + + toQueryString: function(){ + var queryString = []; + this.getElements('input, select, textarea').each(function(el){ + var type = el.type; + if (!el.name || el.disabled || type == 'submit' || type == 'reset' || type == 'file' || type == 'image') return; + + var value = (el.get('tag') == 'select') ? el.getSelected().map(function(opt){ + // IE + return document.id(opt).get('value'); + }) : ((type == 'radio' || type == 'checkbox') && !el.checked) ? null : el.get('value'); + + Array.from(value).each(function(val){ + if (typeof val != 'undefined') queryString.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(val)); + }); + }); + return queryString.join('&'); + }, + + destroy: function(){ + var children = clean(this).getElementsByTagName('*'); + Array.each(children, clean); + Element.dispose(this); + return null; + }, + + empty: function(){ + Array.from(this.childNodes).each(Element.dispose); + return this; + }, + + dispose: function(){ + return (this.parentNode) ? this.parentNode.removeChild(this) : this; + }, + + match: function(expression){ + return !expression || Slick.match(this, expression); + } + +}); + +var cleanClone = function(node, element, keepid){ + if (!keepid) node.setAttributeNode(document.createAttribute('id')); + if (node.clearAttributes){ + node.clearAttributes(); + node.mergeAttributes(element); + node.removeAttribute('uid'); + if (node.options){ + var no = node.options, eo = element.options; + for (var i = no.length; i--;) no[i].selected = eo[i].selected; + } + } + + var prop = formProps[element.tagName.toLowerCase()]; + if (prop && element[prop]) node[prop] = element[prop]; +}; + +Element.implement('clone', function(contents, keepid){ + contents = contents !== false; + var clone = this.cloneNode(contents), i; + + if (contents){ + var ce = clone.getElementsByTagName('*'), te = this.getElementsByTagName('*'); + for (i = ce.length; i--;) cleanClone(ce[i], te[i], keepid); + } + + cleanClone(clone, this, keepid); + + if (Browser.ie){ + var co = clone.getElementsByTagName('object'), to = this.getElementsByTagName('object'); + for (i = co.length; i--;) co[i].outerHTML = to[i].outerHTML; + } + return document.id(clone); +}); + +var contains = {contains: function(element){ + return Slick.contains(this, element); +}}; + +if (!document.contains) Document.implement(contains); +if (!document.createElement('div').contains) Element.implement(contains); + + + +[Element, Window, Document].invoke('implement', { + + addListener: function(type, fn){ + if (type == 'unload'){ + var old = fn, self = this; + fn = function(){ + self.removeListener('unload', fn); + old(); + }; + } else { + collected[$uid(this)] = this; + } + if (this.addEventListener) this.addEventListener(type, fn, !!arguments[2]); + else this.attachEvent('on' + type, fn); + return this; + }, + + removeListener: function(type, fn){ + if (this.removeEventListener) this.removeEventListener(type, fn, !!arguments[2]); + else this.detachEvent('on' + type, fn); + return this; + }, + + retrieve: function(property, dflt){ + var storage = get($uid(this)), prop = storage[property]; + if (dflt != null && prop == null) prop = storage[property] = dflt; + return prop != null ? prop : null; + }, + + store: function(property, value){ + var storage = get($uid(this)); + storage[property] = value; + return this; + }, + + eliminate: function(property){ + var storage = get($uid(this)); + delete storage[property]; + return this; + } + +}); + +// IE purge +if (window.attachEvent && !window.addEventListener) window.addListener('unload', function(){ + Object.each(collected, clean); + if (window.CollectGarbage) CollectGarbage(); +}); + +})(); + +Element.Properties = {}; + + + +Element.Properties.style = { + + set: function(style){ + this.style.cssText = style; + }, + + get: function(){ + return this.style.cssText; + }, + + erase: function(){ + this.style.cssText = ''; + } + +}; + +Element.Properties.tag = { + + get: function(){ + return this.tagName.toLowerCase(); + } + +}; + +(function(maxLength){ + if (maxLength != null) Element.Properties.maxlength = Element.Properties.maxLength = { + get: function(){ + var maxlength = this.getAttribute('maxLength'); + return maxlength == maxLength ? null : maxlength; + } + }; +})(document.createElement('input').getAttribute('maxLength')); + +Element.Properties.html = (function(){ + + var tableTest = Function.attempt(function(){ + var table = document.createElement('table'); + table.innerHTML = ''; + }); + + var wrapper = document.createElement('div'); + + var translations = { + table: [1, '', '
'], + select: [1, ''], + tbody: [2, '', '
'], + tr: [3, '', '
'] + }; + translations.thead = translations.tfoot = translations.tbody; + + var html = { + set: function(){ + var html = Array.flatten(arguments).join(''); + var wrap = (!tableTest && translations[this.get('tag')]); + if (wrap){ + var first = wrapper; + first.innerHTML = wrap[1] + html + wrap[2]; + for (var i = wrap[0]; i--;) first = first.firstChild; + this.empty().adopt(first.childNodes); + } else { + this.innerHTML = html; + } + } + }; + + html.erase = html.set; + + return html; +})(); + + +/* +--- + +name: Element.Style + +description: Contains methods for interacting with the styles of Elements in a fashionable way. + +license: MIT-style license. + +requires: Element + +provides: Element.Style + +... +*/ + +(function(){ + +var html = document.html; + +Element.Properties.styles = {set: function(styles){ + this.setStyles(styles); +}}; + +var hasOpacity = (html.style.opacity != null); +var reAlpha = /alpha\(opacity=([\d.]+)\)/i; + +var setOpacity = function(element, opacity){ + if (!element.currentStyle || !element.currentStyle.hasLayout) element.style.zoom = 1; + if (hasOpacity){ + element.style.opacity = opacity; + } else { + opacity = (opacity == 1) ? '' : 'alpha(opacity=' + opacity * 100 + ')'; + var filter = element.style.filter || element.getComputedStyle('filter') || ''; + element.style.filter = reAlpha.test(filter) ? filter.replace(reAlpha, opacity) : filter + opacity; + } +}; + +Element.Properties.opacity = { + + set: function(opacity){ + var visibility = this.style.visibility; + if (opacity == 0 && visibility != 'hidden') this.style.visibility = 'hidden'; + else if (opacity != 0 && visibility != 'visible') this.style.visibility = 'visible'; + + setOpacity(this, opacity); + }, + + get: (hasOpacity) ? function(){ + var opacity = this.style.opacity || this.getComputedStyle('opacity'); + return (opacity == '') ? 1 : opacity; + } : function(){ + var opacity, filter = (this.style.filter || this.getComputedStyle('filter')); + if (filter) opacity = filter.match(reAlpha); + return (opacity == null || filter == null) ? 1 : (opacity[1] / 100); + } + +}; + +var floatName = (html.style.cssFloat == null) ? 'styleFloat' : 'cssFloat'; + +Element.implement({ + + getComputedStyle: function(property){ + if (this.currentStyle) return this.currentStyle[property.camelCase()]; + var defaultView = Element.getDocument(this).defaultView, + computed = defaultView ? defaultView.getComputedStyle(this, null) : null; + return (computed) ? computed.getPropertyValue((property == floatName) ? 'float' : property.hyphenate()) : null; + }, + + setOpacity: function(value){ + setOpacity(this, value); + return this; + }, + + getOpacity: function(){ + return this.get('opacity'); + }, + + setStyle: function(property, value){ + switch (property){ + case 'opacity': return this.set('opacity', parseFloat(value)); + case 'float': property = floatName; + } + property = property.camelCase(); + if (typeOf(value) != 'string'){ + var map = (Element.Styles[property] || '@').split(' '); + value = Array.from(value).map(function(val, i){ + if (!map[i]) return ''; + return (typeOf(val) == 'number') ? map[i].replace('@', Math.round(val)) : val; + }).join(' '); + } else if (value == String(Number(value))){ + value = Math.round(value); + } + this.style[property] = value; + return this; + }, + + getStyle: function(property){ + switch (property){ + case 'opacity': return this.get('opacity'); + case 'float': property = floatName; + } + property = property.camelCase(); + var result = this.style[property]; + if (!result || property == 'zIndex'){ + result = []; + for (var style in Element.ShortStyles){ + if (property != style) continue; + for (var s in Element.ShortStyles[style]) result.push(this.getStyle(s)); + return result.join(' '); + } + result = this.getComputedStyle(property); + } + if (result){ + result = String(result); + var color = result.match(/rgba?\([\d\s,]+\)/); + if (color) result = result.replace(color[0], color[0].rgbToHex()); + } + if (Browser.opera || (Browser.ie && isNaN(parseFloat(result)))){ + if ((/^(height|width)$/).test(property)){ + var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0; + values.each(function(value){ + size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt(); + }, this); + return this['offset' + property.capitalize()] - size + 'px'; + } + if (Browser.opera && String(result).indexOf('px') != -1) return result; + if ((/^border(.+)Width|margin|padding/).test(property)) return '0px'; + } + return result; + }, + + setStyles: function(styles){ + for (var style in styles) this.setStyle(style, styles[style]); + return this; + }, + + getStyles: function(){ + var result = {}; + Array.flatten(arguments).each(function(key){ + result[key] = this.getStyle(key); + }, this); + return result; + } + +}); + +Element.Styles = { + 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: '@' +}; + + + +Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}}; + +['Top', 'Right', 'Bottom', 'Left'].each(function(direction){ + var Short = Element.ShortStyles; + var All = Element.Styles; + ['margin', 'padding'].each(function(style){ + var sd = style + direction; + Short[style][sd] = All[sd] = '@px'; + }); + var bd = 'border' + direction; + Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)'; + var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color'; + Short[bd] = {}; + Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px'; + Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@'; + Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)'; +}); + +}).call(this); + + +/* +--- + +name: Element.Event + +description: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events. + +license: MIT-style license. + +requires: [Element, Event] + +provides: Element.Event + +... +*/ + +(function(){ + +Element.Properties.events = {set: function(events){ + this.addEvents(events); +}}; + +[Element, Window, Document].invoke('implement', { + + addEvent: function(type, fn){ + var events = this.retrieve('events', {}); + if (!events[type]) events[type] = {keys: [], values: []}; + if (events[type].keys.contains(fn)) return this; + events[type].keys.push(fn); + var realType = type, + custom = Element.Events[type], + condition = fn, + self = this; + if (custom){ + if (custom.onAdd) custom.onAdd.call(this, fn); + if (custom.condition){ + condition = function(event){ + if (custom.condition.call(this, event)) return fn.call(this, event); + return true; + }; + } + realType = custom.base || realType; + } + var defn = function(){ + return fn.call(self); + }; + var nativeEvent = Element.NativeEvents[realType]; + if (nativeEvent){ + if (nativeEvent == 2){ + defn = function(event){ + event = new Event(event, self.getWindow()); + if (condition.call(self, event) === false) event.stop(); + }; + } + this.addListener(realType, defn, arguments[2]); + } + events[type].values.push(defn); + return this; + }, + + removeEvent: function(type, fn){ + var events = this.retrieve('events'); + if (!events || !events[type]) return this; + var list = events[type]; + var index = list.keys.indexOf(fn); + if (index == -1) return this; + var value = list.values[index]; + delete list.keys[index]; + delete list.values[index]; + var custom = Element.Events[type]; + if (custom){ + if (custom.onRemove) custom.onRemove.call(this, fn); + type = custom.base || type; + } + return (Element.NativeEvents[type]) ? this.removeListener(type, value, arguments[2]) : this; + }, + + addEvents: function(events){ + for (var event in events) this.addEvent(event, events[event]); + return this; + }, + + removeEvents: function(events){ + var type; + if (typeOf(events) == 'object'){ + for (type in events) this.removeEvent(type, events[type]); + return this; + } + var attached = this.retrieve('events'); + if (!attached) return this; + if (!events){ + for (type in attached) this.removeEvents(type); + this.eliminate('events'); + } else if (attached[events]){ + attached[events].keys.each(function(fn){ + this.removeEvent(events, fn); + }, this); + delete attached[events]; + } + return this; + }, + + fireEvent: function(type, args, delay){ + var events = this.retrieve('events'); + if (!events || !events[type]) return this; + args = Array.from(args); + + events[type].keys.each(function(fn){ + if (delay) fn.delay(delay, this, args); + else fn.apply(this, args); + }, this); + return this; + }, + + cloneEvents: function(from, type){ + from = document.id(from); + var events = from.retrieve('events'); + if (!events) return this; + if (!type){ + for (var eventType in events) this.cloneEvents(from, eventType); + } else if (events[type]){ + events[type].keys.each(function(fn){ + this.addEvent(type, fn); + }, this); + } + return this; + } + +}); + +Element.NativeEvents = { + click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons + mousewheel: 2, DOMMouseScroll: 2, //mouse wheel + mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement + keydown: 2, keypress: 2, keyup: 2, //keyboard + orientationchange: 2, // mobile + touchstart: 2, touchmove: 2, touchend: 2, touchcancel: 2, // touch + gesturestart: 2, gesturechange: 2, gestureend: 2, // gesture + focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, //form elements + load: 2, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window + error: 1, abort: 1, scroll: 1 //misc +}; + +var check = function(event){ + var related = event.relatedTarget; + if (related == null) return true; + if (!related) return false; + return (related != this && related.prefix != 'xul' && typeOf(this) != 'document' && !this.contains(related)); +}; + +Element.Events = { + + mouseenter: { + base: 'mouseover', + condition: check + }, + + mouseleave: { + base: 'mouseout', + condition: check + }, + + mousewheel: { + base: (Browser.firefox) ? 'DOMMouseScroll' : 'mousewheel' + } + +}; + + + +}).call(this); + + +/* +--- + +name: Element.Dimensions + +description: Contains methods to work with size, scroll, or positioning of Elements and the window object. + +license: MIT-style license. + +credits: + - Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html). + - Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html). + +requires: [Element, Element.Style] + +provides: [Element.Dimensions] + +... +*/ + +(function(){ + +var element = document.createElement('div'), + child = document.createElement('div'); +element.style.height = '0'; +element.appendChild(child); +var brokenOffsetParent = (child.offsetParent === element); +element = child = null; + +var isOffset = function(el){ + return styleString(el, 'position') != 'static' || isBody(el); +}; + +var isOffsetStatic = function(el){ + return isOffset(el) || (/^(?:table|td|th)$/i).test(el.tagName); +}; + +Element.implement({ + + scrollTo: function(x, y){ + if (isBody(this)){ + this.getWindow().scrollTo(x, y); + } else { + this.scrollLeft = x; + this.scrollTop = y; + } + return this; + }, + + getSize: function(){ + if (isBody(this)) return this.getWindow().getSize(); + return {x: this.offsetWidth, y: this.offsetHeight}; + }, + + getScrollSize: function(){ + if (isBody(this)) return this.getWindow().getScrollSize(); + return {x: this.scrollWidth, y: this.scrollHeight}; + }, + + getScroll: function(){ + if (isBody(this)) return this.getWindow().getScroll(); + return {x: this.scrollLeft, y: this.scrollTop}; + }, + + getScrolls: function(){ + var element = this.parentNode, position = {x: 0, y: 0}; + while (element && !isBody(element)){ + position.x += element.scrollLeft; + position.y += element.scrollTop; + element = element.parentNode; + } + return position; + }, + + getOffsetParent: brokenOffsetParent ? function(){ + var element = this; + if (isBody(element) || styleString(element, 'position') == 'fixed') return null; + + var isOffsetCheck = (styleString(element, 'position') == 'static') ? isOffsetStatic : isOffset; + while ((element = element.parentNode)){ + if (isOffsetCheck(element)) return element; + } + return null; + } : function(){ + var element = this; + if (isBody(element) || styleString(element, 'position') == 'fixed') return null; + + try { + return element.offsetParent; + } catch(e) {} + return null; + }, + + getOffsets: function(){ + if (this.getBoundingClientRect && !Browser.Platform.ios){ + var bound = this.getBoundingClientRect(), + html = document.id(this.getDocument().documentElement), + htmlScroll = html.getScroll(), + elemScrolls = this.getScrolls(), + isFixed = (styleString(this, 'position') == 'fixed'); + + return { + x: bound.left.toInt() + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft, + y: bound.top.toInt() + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop + }; + } + + var element = this, position = {x: 0, y: 0}; + if (isBody(this)) return position; + + while (element && !isBody(element)){ + position.x += element.offsetLeft; + position.y += element.offsetTop; + + if (Browser.firefox){ + if (!borderBox(element)){ + position.x += leftBorder(element); + position.y += topBorder(element); + } + var parent = element.parentNode; + if (parent && styleString(parent, 'overflow') != 'visible'){ + position.x += leftBorder(parent); + position.y += topBorder(parent); + } + } else if (element != this && Browser.safari){ + position.x += leftBorder(element); + position.y += topBorder(element); + } + + element = element.offsetParent; + } + if (Browser.firefox && !borderBox(this)){ + position.x -= leftBorder(this); + position.y -= topBorder(this); + } + return position; + }, + + getPosition: function(relative){ + if (isBody(this)) return {x: 0, y: 0}; + var offset = this.getOffsets(), + scroll = this.getScrolls(); + var position = { + x: offset.x - scroll.x, + y: offset.y - scroll.y + }; + + if (relative && (relative = document.id(relative))){ + var relativePosition = relative.getPosition(); + return {x: position.x - relativePosition.x - leftBorder(relative), y: position.y - relativePosition.y - topBorder(relative)}; + } + return position; + }, + + getCoordinates: function(element){ + if (isBody(this)) return this.getWindow().getCoordinates(); + var position = this.getPosition(element), + size = this.getSize(); + var obj = { + left: position.x, + top: position.y, + width: size.x, + height: size.y + }; + obj.right = obj.left + obj.width; + obj.bottom = obj.top + obj.height; + return obj; + }, + + computePosition: function(obj){ + return { + left: obj.x - styleNumber(this, 'margin-left'), + top: obj.y - styleNumber(this, 'margin-top') + }; + }, + + setPosition: function(obj){ + return this.setStyles(this.computePosition(obj)); + } + +}); + + +[Document, Window].invoke('implement', { + + getSize: function(){ + var doc = getCompatElement(this); + return {x: doc.clientWidth, y: doc.clientHeight}; + }, + + getScroll: function(){ + var win = this.getWindow(), doc = getCompatElement(this); + return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop}; + }, + + getScrollSize: function(){ + var doc = getCompatElement(this), + min = this.getSize(), + body = this.getDocument().body; + + return {x: Math.max(doc.scrollWidth, body.scrollWidth, min.x), y: Math.max(doc.scrollHeight, body.scrollHeight, min.y)}; + }, + + getPosition: function(){ + return {x: 0, y: 0}; + }, + + getCoordinates: function(){ + var size = this.getSize(); + return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x}; + } + +}); + +// private methods + +var styleString = Element.getComputedStyle; + +function styleNumber(element, style){ + return styleString(element, style).toInt() || 0; +} + +function borderBox(element){ + return styleString(element, '-moz-box-sizing') == 'border-box'; +} + +function topBorder(element){ + return styleNumber(element, 'border-top-width'); +} + +function leftBorder(element){ + return styleNumber(element, 'border-left-width'); +} + +function isBody(element){ + return (/^(?:body|html)$/i).test(element.tagName); +} + +function getCompatElement(element){ + var doc = element.getDocument(); + return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; +} + +}).call(this); + +//aliases +Element.alias({position: 'setPosition'}); //compatability + +[Window, Document, Element].invoke('implement', { + + getHeight: function(){ + return this.getSize().y; + }, + + getWidth: function(){ + return this.getSize().x; + }, + + getScrollTop: function(){ + return this.getScroll().y; + }, + + getScrollLeft: function(){ + return this.getScroll().x; + }, + + getScrollHeight: function(){ + return this.getScrollSize().y; + }, + + getScrollWidth: function(){ + return this.getScrollSize().x; + }, + + getTop: function(){ + return this.getPosition().y; + }, + + getLeft: function(){ + return this.getPosition().x; + } + +}); + + +/* +--- + +name: Fx + +description: Contains the basic animation logic to be extended by all other Fx Classes. + +license: MIT-style license. + +requires: [Chain, Events, Options] + +provides: Fx + +... +*/ + +(function(){ + +var Fx = this.Fx = new Class({ + + Implements: [Chain, Events, Options], + + options: { + /* + onStart: nil, + onCancel: nil, + onComplete: nil, + */ + fps: 60, + unit: false, + duration: 500, + frames: null, + frameSkip: true, + link: 'ignore' + }, + + initialize: function(options){ + this.subject = this.subject || this; + this.setOptions(options); + }, + + getTransition: function(){ + return function(p){ + return -(Math.cos(Math.PI * p) - 1) / 2; + }; + }, + + step: function(now){ + if (this.options.frameSkip){ + var diff = (this.time != null) ? (now - this.time) : 0, frames = diff / this.frameInterval; + this.time = now; + this.frame += frames; + } else { + this.frame++; + } + + if (this.frame < this.frames){ + var delta = this.transition(this.frame / this.frames); + this.set(this.compute(this.from, this.to, delta)); + } else { + this.frame = this.frames; + this.set(this.compute(this.from, this.to, 1)); + this.stop(); + } + }, + + set: function(now){ + return now; + }, + + compute: function(from, to, delta){ + return Fx.compute(from, to, delta); + }, + + check: function(){ + if (!this.isRunning()) return true; + switch (this.options.link){ + case 'cancel': this.cancel(); return true; + case 'chain': this.chain(this.caller.pass(arguments, this)); return false; + } + return false; + }, + + start: function(from, to){ + if (!this.check(from, to)) return this; + this.from = from; + this.to = to; + this.frame = (this.options.frameSkip) ? 0 : -1; + this.time = null; + this.transition = this.getTransition(); + var frames = this.options.frames, fps = this.options.fps, duration = this.options.duration; + this.duration = Fx.Durations[duration] || duration.toInt(); + this.frameInterval = 1000 / fps; + this.frames = frames || Math.round(this.duration / this.frameInterval); + this.fireEvent('start', this.subject); + pushInstance.call(this, fps); + return this; + }, + + stop: function(){ + if (this.isRunning()){ + this.time = null; + pullInstance.call(this, this.options.fps); + if (this.frames == this.frame){ + this.fireEvent('complete', this.subject); + if (!this.callChain()) this.fireEvent('chainComplete', this.subject); + } else { + this.fireEvent('stop', this.subject); + } + } + return this; + }, + + cancel: function(){ + if (this.isRunning()){ + this.time = null; + pullInstance.call(this, this.options.fps); + this.frame = this.frames; + this.fireEvent('cancel', this.subject).clearChain(); + } + return this; + }, + + pause: function(){ + if (this.isRunning()){ + this.time = null; + pullInstance.call(this, this.options.fps); + } + return this; + }, + + resume: function(){ + if ((this.frame < this.frames) && !this.isRunning()) pushInstance.call(this, this.options.fps); + return this; + }, + + isRunning: function(){ + var list = instances[this.options.fps]; + return list && list.contains(this); + } + +}); + +Fx.compute = function(from, to, delta){ + return (to - from) * delta + from; +}; + +Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000}; + +// global timers + +var instances = {}, timers = {}; + +var loop = function(){ + var now = Date.now(); + for (var i = this.length; i--;){ + var instance = this[i]; + if (instance) instance.step(now); + } +}; + +var pushInstance = function(fps){ + var list = instances[fps] || (instances[fps] = []); + list.push(this); + if (!timers[fps]) timers[fps] = loop.periodical(Math.round(1000 / fps), list); +}; + +var pullInstance = function(fps){ + var list = instances[fps]; + if (list){ + list.erase(this); + if (!list.length && timers[fps]){ + delete instances[fps]; + timers[fps] = clearInterval(timers[fps]); + } + } +}; + +}).call(this); + + +/* +--- + +name: Fx.CSS + +description: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements. + +license: MIT-style license. + +requires: [Fx, Element.Style] + +provides: Fx.CSS + +... +*/ + +Fx.CSS = new Class({ + + Extends: Fx, + + //prepares the base from/to object + + prepare: function(element, property, values){ + values = Array.from(values); + if (values[1] == null){ + values[1] = values[0]; + values[0] = element.getStyle(property); + } + var parsed = values.map(this.parse); + return {from: parsed[0], to: parsed[1]}; + }, + + //parses a value into an array + + parse: function(value){ + value = Function.from(value)(); + value = (typeof value == 'string') ? value.split(' ') : Array.from(value); + return value.map(function(val){ + val = String(val); + var found = false; + Object.each(Fx.CSS.Parsers, function(parser, key){ + if (found) return; + var parsed = parser.parse(val); + if (parsed || parsed === 0) found = {value: parsed, parser: parser}; + }); + found = found || {value: val, parser: Fx.CSS.Parsers.String}; + return found; + }); + }, + + //computes by a from and to prepared objects, using their parsers. + + compute: function(from, to, delta){ + var computed = []; + (Math.min(from.length, to.length)).times(function(i){ + computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser}); + }); + computed.$family = Function.from('fx:css:value'); + return computed; + }, + + //serves the value as settable + + serve: function(value, unit){ + if (typeOf(value) != 'fx:css:value') value = this.parse(value); + var returned = []; + value.each(function(bit){ + returned = returned.concat(bit.parser.serve(bit.value, unit)); + }); + return returned; + }, + + //renders the change to an element + + render: function(element, property, value, unit){ + element.setStyle(property, this.serve(value, unit)); + }, + + //searches inside the page css to find the values for a selector + + search: function(selector){ + if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector]; + var to = {}, selectorTest = new RegExp('^' + selector.escapeRegExp() + '$'); + Array.each(document.styleSheets, function(sheet, j){ + var href = sheet.href; + if (href && href.contains('://') && !href.contains(document.domain)) return; + var rules = sheet.rules || sheet.cssRules; + Array.each(rules, function(rule, i){ + if (!rule.style) return; + var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){ + return m.toLowerCase(); + }) : null; + if (!selectorText || !selectorTest.test(selectorText)) return; + Object.each(Element.Styles, function(value, style){ + if (!rule.style[style] || Element.ShortStyles[style]) return; + value = String(rule.style[style]); + to[style] = ((/^rgb/).test(value)) ? value.rgbToHex() : value; + }); + }); + }); + return Fx.CSS.Cache[selector] = to; + } + +}); + +Fx.CSS.Cache = {}; + +Fx.CSS.Parsers = { + + Color: { + parse: function(value){ + if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true); + return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false; + }, + compute: function(from, to, delta){ + return from.map(function(value, i){ + return Math.round(Fx.compute(from[i], to[i], delta)); + }); + }, + serve: function(value){ + return value.map(Number); + } + }, + + Number: { + parse: parseFloat, + compute: Fx.compute, + serve: function(value, unit){ + return (unit) ? value + unit : value; + } + }, + + String: { + parse: Function.from(false), + compute: function(zero, one){ + return one; + }, + serve: function(zero){ + return zero; + } + } + +}; + + + + +/* +--- + +name: Fx.Tween + +description: Formerly Fx.Style, effect to transition any CSS property for an element. + +license: MIT-style license. + +requires: Fx.CSS + +provides: [Fx.Tween, Element.fade, Element.highlight] + +... +*/ + +Fx.Tween = new Class({ + + Extends: Fx.CSS, + + initialize: function(element, options){ + this.element = this.subject = document.id(element); + this.parent(options); + }, + + set: function(property, now){ + if (arguments.length == 1){ + now = property; + property = this.property || this.options.property; + } + this.render(this.element, property, now, this.options.unit); + return this; + }, + + start: function(property, from, to){ + if (!this.check(property, from, to)) return this; + var args = Array.flatten(arguments); + this.property = this.options.property || args.shift(); + var parsed = this.prepare(this.element, this.property, args); + return this.parent(parsed.from, parsed.to); + } + +}); + +Element.Properties.tween = { + + set: function(options){ + this.get('tween').cancel().setOptions(options); + return this; + }, + + get: function(){ + var tween = this.retrieve('tween'); + if (!tween){ + tween = new Fx.Tween(this, {link: 'cancel'}); + this.store('tween', tween); + } + return tween; + } + +}; + +Element.implement({ + + tween: function(property, from, to){ + this.get('tween').start(arguments); + return this; + }, + + fade: function(how){ + var fade = this.get('tween'), o = 'opacity', toggle; + how = [how, 'toggle'].pick(); + switch (how){ + case 'in': fade.start(o, 1); break; + case 'out': fade.start(o, 0); break; + case 'show': fade.set(o, 1); break; + case 'hide': fade.set(o, 0); break; + case 'toggle': + var flag = this.retrieve('fade:flag', this.get('opacity') == 1); + fade.start(o, (flag) ? 0 : 1); + this.store('fade:flag', !flag); + toggle = true; + break; + default: fade.start(o, arguments); + } + if (!toggle) this.eliminate('fade:flag'); + return this; + }, + + highlight: function(start, end){ + if (!end){ + end = this.retrieve('highlight:original', this.getStyle('background-color')); + end = (end == 'transparent') ? '#fff' : end; + } + var tween = this.get('tween'); + tween.start('background-color', start || '#ffff88', end).chain(function(){ + this.setStyle('background-color', this.retrieve('highlight:original')); + tween.callChain(); + }.bind(this)); + return this; + } + +}); + + +/* +--- + +name: Fx.Morph + +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. + +license: MIT-style license. + +requires: Fx.CSS + +provides: Fx.Morph + +... +*/ + +Fx.Morph = new Class({ + + Extends: Fx.CSS, + + initialize: function(element, options){ + this.element = this.subject = document.id(element); + this.parent(options); + }, + + set: function(now){ + if (typeof now == 'string') now = this.search(now); + for (var p in now) this.render(this.element, p, now[p], this.options.unit); + return this; + }, + + compute: function(from, to, delta){ + var now = {}; + for (var p in from) now[p] = this.parent(from[p], to[p], delta); + return now; + }, + + start: function(properties){ + if (!this.check(properties)) return this; + if (typeof properties == 'string') properties = this.search(properties); + var from = {}, to = {}; + for (var p in properties){ + var parsed = this.prepare(this.element, p, properties[p]); + from[p] = parsed.from; + to[p] = parsed.to; + } + return this.parent(from, to); + } + +}); + +Element.Properties.morph = { + + set: function(options){ + this.get('morph').cancel().setOptions(options); + return this; + }, + + get: function(){ + var morph = this.retrieve('morph'); + if (!morph){ + morph = new Fx.Morph(this, {link: 'cancel'}); + this.store('morph', morph); + } + return morph; + } + +}; + +Element.implement({ + + morph: function(props){ + this.get('morph').start(props); + return this; + } + +}); + + +/* +--- + +name: Fx.Transitions + +description: Contains a set of advanced transitions to be used with any of the Fx Classes. + +license: MIT-style license. + +credits: + - Easing Equations by Robert Penner, , modified and optimized to be used with MooTools. + +requires: Fx + +provides: Fx.Transitions + +... +*/ + +Fx.implement({ + + getTransition: function(){ + var trans = this.options.transition || Fx.Transitions.Sine.easeInOut; + if (typeof trans == 'string'){ + var data = trans.split(':'); + trans = Fx.Transitions; + trans = trans[data[0]] || trans[data[0].capitalize()]; + if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')]; + } + return trans; + } + +}); + +Fx.Transition = function(transition, params){ + params = Array.from(params); + var easeIn = function(pos){ + return transition(pos, params); + }; + return Object.append(easeIn, { + easeIn: easeIn, + easeOut: function(pos){ + return 1 - transition(1 - pos, params); + }, + easeInOut: function(pos){ + return (pos <= 0.5 ? transition(2 * pos, params) : (2 - transition(2 * (1 - pos), params))) / 2; + } + }); +}; + +Fx.Transitions = { + + linear: function(zero){ + return zero; + } + +}; + + + +Fx.Transitions.extend = function(transitions){ + for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]); +}; + +Fx.Transitions.extend({ + + Pow: function(p, x){ + return Math.pow(p, x && x[0] || 6); + }, + + Expo: function(p){ + return Math.pow(2, 8 * (p - 1)); + }, + + Circ: function(p){ + return 1 - Math.sin(Math.acos(p)); + }, + + Sine: function(p){ + return 1 - Math.cos(p * Math.PI / 2); + }, + + Back: function(p, x){ + x = x && x[0] || 1.618; + return Math.pow(p, 2) * ((x + 1) * p - x); + }, + + Bounce: function(p){ + var value; + for (var a = 0, b = 1; 1; a += b, b /= 2){ + if (p >= (7 - 4 * a) / 11){ + value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2); + break; + } + } + return value; + }, + + Elastic: function(p, x){ + return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x && x[0] || 1) / 3); + } + +}); + +['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){ + Fx.Transitions[transition] = new Fx.Transition(function(p){ + return Math.pow(p, i + 2); + }); +}); + + +/* +--- + +name: Request + +description: Powerful all purpose Request Class. Uses XMLHTTPRequest. + +license: MIT-style license. + +requires: [Object, Element, Chain, Events, Options, Browser] + +provides: Request + +... +*/ + +(function(){ + +var empty = function(){}, + progressSupport = ('onprogress' in new Browser.Request); + +var Request = this.Request = new Class({ + + Implements: [Chain, Events, Options], + + options: {/* + onRequest: function(){}, + onLoadstart: function(event, xhr){}, + onProgress: function(event, xhr){}, + onComplete: function(){}, + onCancel: function(){}, + onSuccess: function(responseText, responseXML){}, + onFailure: function(xhr){}, + onException: function(headerName, value){}, + onTimeout: function(){}, + user: '', + password: '',*/ + 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, + timeout: 0, + noCache: false + }, + + initialize: function(options){ + this.xhr = new Browser.Request(); + this.setOptions(options); + this.headers = this.options.headers; + }, + + onStateChange: function(){ + var xhr = this.xhr; + if (xhr.readyState != 4 || !this.running) return; + this.running = false; + this.status = 0; + Function.attempt(function(){ + var status = xhr.status; + this.status = (status == 1223) ? 204 : status; + }.bind(this)); + xhr.onreadystatechange = empty; + if (progressSupport) xhr.onprogress = xhr.onloadstart = empty; + clearTimeout(this.timer); + + this.response = {text: this.xhr.responseText || '', xml: this.xhr.responseXML}; + if (this.options.isSuccess.call(this, this.status)) + this.success(this.response.text, this.response.xml); + else + this.failure(); + }, + + isSuccess: function(){ + var status = this.status; + return (status >= 200 && status < 300); + }, + + isRunning: function(){ + return !!this.running; + }, + + processScripts: function(text){ + if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return Browser.exec(text); + return text.stripScripts(this.options.evalScripts); + }, + + success: function(text, xml){ + this.onSuccess(this.processScripts(text), xml); + }, + + onSuccess: function(){ + this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain(); + }, + + failure: function(){ + this.onFailure(); + }, + + onFailure: function(){ + this.fireEvent('complete').fireEvent('failure', this.xhr); + }, + + loadstart: function(event){ + this.fireEvent('loadstart', [event, this.xhr]); + }, + + progress: function(event){ + this.fireEvent('progress', [event, this.xhr]); + }, + + timeout: function(){ + this.fireEvent('timeout', this.xhr); + }, + + setHeader: function(name, value){ + this.headers[name] = value; + return this; + }, + + getHeader: function(name){ + return Function.attempt(function(){ + return this.xhr.getResponseHeader(name); + }.bind(this)); + }, + + check: function(){ + if (!this.running) return true; + switch (this.options.link){ + case 'cancel': this.cancel(); return true; + case 'chain': this.chain(this.caller.pass(arguments, this)); return false; + } + return false; + }, + + send: function(options){ + if (!this.check(options)) return this; + + this.options.isSuccess = this.options.isSuccess || this.isSuccess; + this.running = true; + + var type = typeOf(options); + if (type == 'string' || type == 'element') options = {data: options}; + + var old = this.options; + options = Object.append({data: old.data, url: old.url, method: old.method}, options); + var data = options.data, url = String(options.url), method = options.method.toLowerCase(); + + switch (typeOf(data)){ + case 'element': data = document.id(data).toQueryString(); break; + case 'object': case 'hash': data = Object.toQueryString(data); + } + + if (this.options.format){ + var format = 'format=' + this.options.format; + data = (data) ? format + '&' + data : format; + } + + if (this.options.emulation && !['get', 'post'].contains(method)){ + var _method = '_method=' + method; + data = (data) ? _method + '&' + data : _method; + method = 'post'; + } + + if (this.options.urlEncoded && ['post', 'put'].contains(method)){ + var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : ''; + this.headers['Content-type'] = 'application/x-www-form-urlencoded' + encoding; + } + + if (!url) url = document.location.pathname; + + var trimPosition = url.lastIndexOf('/'); + if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition); + + if (this.options.noCache) + url += (url.contains('?') ? '&' : '?') + String.uniqueID(); + + if (data && method == 'get'){ + url += (url.contains('?') ? '&' : '?') + data; + data = null; + } + + var xhr = this.xhr; + if (progressSupport){ + xhr.onloadstart = this.loadstart.bind(this); + xhr.onprogress = this.progress.bind(this); + } + + xhr.open(method.toUpperCase(), url, this.options.async, this.options.user, this.options.password); + if (this.options.user && 'withCredentials' in xhr) xhr.withCredentials = true; + + xhr.onreadystatechange = this.onStateChange.bind(this); + + Object.each(this.headers, function(value, key){ + try { + xhr.setRequestHeader(key, value); + } catch (e){ + this.fireEvent('exception', [key, value]); + } + }, this); + + this.fireEvent('request'); + xhr.send(data); + if (!this.options.async) this.onStateChange(); + if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this); + return this; + }, + + cancel: function(){ + if (!this.running) return this; + this.running = false; + var xhr = this.xhr; + xhr.abort(); + clearTimeout(this.timer); + xhr.onreadystatechange = empty; + if (progressSupport) xhr.onprogress = xhr.onloadstart = empty; + this.xhr = new Browser.Request(); + this.fireEvent('cancel'); + return this; + } + +}); + +var methods = {}; +['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){ + methods[method] = function(data){ + var object = { + method: method + }; + if (data != null) object.data = data; + return this.send(object); + }; +}); + +Request.implement(methods); + +Element.Properties.send = { + + set: function(options){ + var send = this.get('send').cancel(); + send.setOptions(options); + return this; + }, + + get: function(){ + var send = this.retrieve('send'); + if (!send){ + send = new Request({ + data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action') + }); + this.store('send', send); + } + return send; + } + +}; + +Element.implement({ + + send: function(url){ + var sender = this.get('send'); + sender.send({data: this, url: url || sender.options.url}); + return this; + } + +}); + +})(); + +/* +--- + +name: Request.HTML + +description: Extends the basic Request Class with additional methods for interacting with HTML responses. + +license: MIT-style license. + +requires: [Element, Request] + +provides: Request.HTML + +... +*/ + +Request.HTML = new Class({ + + Extends: Request, + + options: { + update: false, + append: false, + evalScripts: true, + filter: false, + headers: { + Accept: 'text/html, application/xml, text/xml, */*' + } + }, + + success: function(text){ + var options = this.options, response = this.response; + + response.html = text.stripScripts(function(script){ + response.javascript = script; + }); + + var match = response.html.match(/]*>([\s\S]*?)<\/body>/i); + if (match) response.html = match[1]; + var temp = new Element('div').set('html', response.html); + + response.tree = temp.childNodes; + response.elements = temp.getElements('*'); + + if (options.filter) response.tree = response.elements.filter(options.filter); + if (options.update) document.id(options.update).empty().set('html', response.html); + else if (options.append) document.id(options.append).adopt(temp.getChildren()); + if (options.evalScripts) Browser.exec(response.javascript); + + this.onSuccess(response.tree, response.elements, response.html, response.javascript); + } + +}); + +Element.Properties.load = { + + set: function(options){ + var load = this.get('load').cancel(); + load.setOptions(options); + return this; + }, + + get: function(){ + var load = this.retrieve('load'); + if (!load){ + load = new Request.HTML({data: this, link: 'cancel', update: this, method: 'get'}); + this.store('load', load); + } + return load; + } + +}; + +Element.implement({ + + load: function(){ + this.get('load').send(Array.link(arguments, {data: Type.isObject, url: Type.isString})); + return this; + } + +}); + + +/* +--- + +name: JSON + +description: JSON encoder and decoder. + +license: MIT-style license. + +See Also: + +requires: [Array, String, Number, Function] + +provides: JSON + +... +*/ + +if (typeof JSON == 'undefined') this.JSON = {}; + + + +(function(){ + +var special = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'}; + +var escape = function(chr){ + return special[chr] || '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4); +}; + +JSON.validate = function(string){ + string = string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'). + replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'). + replace(/(?:^|:|,)(?:\s*\[)+/g, ''); + + return (/^[\],:{}\s]*$/).test(string); +}; + +JSON.encode = JSON.stringify ? function(obj){ + return JSON.stringify(obj); +} : function(obj){ + if (obj && obj.toJSON) obj = obj.toJSON(); + + switch (typeOf(obj)){ + case 'string': + return '"' + obj.replace(/[\x00-\x1f\\"]/g, escape) + '"'; + case 'array': + return '[' + obj.map(JSON.encode).clean() + ']'; + case 'object': case 'hash': + var string = []; + Object.each(obj, function(value, key){ + var json = JSON.encode(value); + if (json) string.push(JSON.encode(key) + ':' + json); + }); + return '{' + string + '}'; + case 'number': case 'boolean': return '' + obj; + case 'null': return 'null'; + } + + return null; +}; + +JSON.decode = function(string, secure){ + if (!string || typeOf(string) != 'string') return null; + + if (secure || JSON.secure){ + if (JSON.parse) return JSON.parse(string); + if (!JSON.validate(string)) throw new Error('JSON could not decode the input; security is enabled and the value is not secure.'); + } + + return eval('(' + string + ')'); +}; + +}).call(this); + + +/* +--- + +name: Request.JSON + +description: Extends the basic Request Class with additional methods for sending and receiving JSON data. + +license: MIT-style license. + +requires: [Request, JSON] + +provides: Request.JSON + +... +*/ + +Request.JSON = new Class({ + + Extends: Request, + + options: { + /*onError: function(text, error){},*/ + secure: true + }, + + initialize: function(options){ + this.parent(options); + Object.append(this.headers, { + 'Accept': 'application/json', + 'X-Request': 'JSON' + }); + }, + + success: function(text){ + var json; + try { + json = this.response.json = JSON.decode(text, this.options.secure); + } catch (error){ + this.fireEvent('error', [text, error]); + return; + } + if (json == null) this.onFailure(); + else this.onSuccess(json, text); + } + +}); + + +/* +--- + +name: Cookie + +description: Class for creating, reading, and deleting browser Cookies. + +license: MIT-style license. + +credits: + - Based on the functions by Peter-Paul Koch (http://quirksmode.org). + +requires: [Options, Browser] + +provides: Cookie + +... +*/ + +var Cookie = new Class({ + + Implements: Options, + + options: { + path: '/', + domain: false, + duration: false, + secure: false, + document: document, + encode: true + }, + + initialize: function(key, options){ + this.key = key; + this.setOptions(options); + }, + + write: function(value){ + if (this.options.encode) value = encodeURIComponent(value); + if (this.options.domain) value += '; domain=' + this.options.domain; + if (this.options.path) value += '; path=' + this.options.path; + if (this.options.duration){ + var date = new Date(); + date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000); + value += '; expires=' + date.toGMTString(); + } + if (this.options.secure) value += '; secure'; + this.options.document.cookie = this.key + '=' + value; + return this; + }, + + read: function(){ + var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)'); + return (value) ? decodeURIComponent(value[1]) : null; + }, + + dispose: function(){ + new Cookie(this.key, Object.merge({}, this.options, {duration: -1})).write(''); + return this; + } + +}); + +Cookie.write = function(key, value, options){ + return new Cookie(key, options).write(value); +}; + +Cookie.read = function(key){ + return new Cookie(key).read(); +}; + +Cookie.dispose = function(key, options){ + return new Cookie(key, options).dispose(); +}; + + +/* +--- + +name: DOMReady + +description: Contains the custom event domready. + +license: MIT-style license. + +requires: [Browser, Element, Element.Event] + +provides: [DOMReady, DomReady] + +... +*/ + +(function(window, document){ + +var ready, + loaded, + checks = [], + shouldPoll, + timer, + isFramed = true; + +// Thanks to Rich Dougherty +try { + isFramed = window.frameElement != null; +} catch(e){} + +var domready = function(){ + clearTimeout(timer); + if (ready) return; + Browser.loaded = ready = true; + document.removeListener('DOMContentLoaded', domready).removeListener('readystatechange', check); + + document.fireEvent('domready'); + window.fireEvent('domready'); +}; + +var check = function(){ + for (var i = checks.length; i--;) if (checks[i]()){ + domready(); + return true; + } + + return false; +}; + +var poll = function(){ + clearTimeout(timer); + if (!check()) timer = setTimeout(poll, 10); +}; + +document.addListener('DOMContentLoaded', domready); + +// doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/ +var testElement = document.createElement('div'); +if (testElement.doScroll && !isFramed){ + checks.push(function(){ + try { + testElement.doScroll(); + return true; + } catch (e){} + + return false; + }); + shouldPoll = true; +} + +if (document.readyState) checks.push(function(){ + var state = document.readyState; + return (state == 'loaded' || state == 'complete'); +}); + +if ('onreadystatechange' in document) document.addListener('readystatechange', check); +else shouldPoll = true; + +if (shouldPoll) poll(); + +Element.Events.domready = { + onAdd: function(fn){ + if (ready) fn.call(this); + } +}; + +// Make sure that domready fires before load +Element.Events.load = { + base: 'load', + onAdd: function(fn){ + if (loaded && this == window) fn.call(this); + }, + condition: function(){ + if (this == window){ + domready(); + delete Element.Events.load; + } + + return true; + } +}; + +// This is based on the custom load event +window.addEvent('load', function(){ + loaded = true; +}); + +})(window, document); + + +/* +--- + +name: Swiff + +description: Wrapper for embedding SWF movies. Supports External Interface Communication. + +license: MIT-style license. + +credits: + - Flash detection & Internet Explorer + Flash Player 9 fix inspired by SWFObject. + +requires: [Options, Object, Element] + +provides: Swiff + +... +*/ + +(function(){ + +var Swiff = this.Swiff = new Class({ + + Implements: Options, + + options: { + id: null, + height: 1, + width: 1, + container: null, + properties: {}, + params: { + quality: 'high', + allowScriptAccess: 'always', + wMode: 'window', + swLiveConnect: true + }, + callBacks: {}, + vars: {} + }, + + toElement: function(){ + return this.object; + }, + + initialize: function(path, options){ + this.instance = 'Swiff_' + String.uniqueID(); + + this.setOptions(options); + options = this.options; + var id = this.id = options.id || this.instance; + var container = document.id(options.container); + + Swiff.CallBacks[this.instance] = {}; + + var params = options.params, vars = options.vars, callBacks = options.callBacks; + var properties = Object.append({height: options.height, width: options.width}, options.properties); + + var self = this; + + for (var callBack in callBacks){ + Swiff.CallBacks[this.instance][callBack] = (function(option){ + return function(){ + return option.apply(self.object, arguments); + }; + })(callBacks[callBack]); + vars[callBack] = 'Swiff.CallBacks.' + this.instance + '.' + callBack; + } + + params.flashVars = Object.toQueryString(vars); + if (Browser.ie){ + properties.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; + params.movie = path; + } else { + properties.type = 'application/x-shockwave-flash'; + } + properties.data = path; + + var build = ''; + } + build += ''; + this.object = ((container) ? container.empty() : new Element('div')).set('html', build).firstChild; + }, + + replaces: function(element){ + element = document.id(element, true); + element.parentNode.replaceChild(this.toElement(), element); + return this; + }, + + inject: function(element){ + document.id(element, true).appendChild(this.toElement()); + return this; + }, + + remote: function(){ + return Swiff.remote.apply(Swiff, [this.toElement()].append(arguments)); + } + +}); + +Swiff.CallBacks = {}; + +Swiff.remote = function(obj, fn){ + var rs = obj.CallFunction('' + __flash__argumentsToXML(arguments, 2) + ''); + return eval(rs); +}; + +}).call(this); + + diff --git a/public/javascripts/octopress.js b/public/javascripts/octopress.js new file mode 100644 index 0000000..bf94ebe --- /dev/null +++ b/public/javascripts/octopress.js @@ -0,0 +1,76 @@ +window.addEvent('domready', function() { + codeblocks = $$('div.highlight'); + codeblocks.each(addExpander); +}); + +window.addEvents({ + domready: function(){ + if(twitter_user){ + new Request.Twitter(twitter_user, { + include_replies: false, + data: { count: 3 }, + onSuccess: function(tweets){ + $('tweets').empty(); + for (var i = tweets.length; i--; ){ + new Element('li', { + 'class': 'tweet' + }).adopt( + new Element('p', { 'html': tweets[i].text+' ' }).adopt( + new Element('a', { + 'href': 'http://twitter.com/'+twitter_user+'/status/'+tweets[i].id_str, + 'text': new Date(tweets[i].created_at).timeDiffInWords() + })) + ).inject('tweets', 'top'); + } + } + }).send(); + } + $$('#recent_posts time').each(function(date){ + date.set('text', new Date(date.get('text')).timeDiffInWords()); + }); + }, +}); + + +function addExpander(div){ + new Element('span',{ + html: 'expand »', + 'class': 'pre_expander', + 'events': { + 'click': function(){ + toggleExpander(this); + } + } + }).inject(div, 'top'); +} +function toggleExpander(expander){ + var html = ''; + var expanderPos = expander.getPosition().y; + if($('page').toggleClass('expanded').hasClass('expanded')) + html = '« contract'; + else + html = 'expand »'; + $$('div.highlight span.pre_expander').each(function(span){ + span.set('html',html); + }); + fixScroll(expander, expanderPos); +} +function fixScroll(el, position){ + pos = el.getPosition().y - position; + window.scrollTo(window.getScroll().x ,window.getScroll().y + pos); +} +function enableCompressedLayout(codeblocks){ + if(!codeblocks.length) return; + new Element('span',{ + html: 'Collapse layout', + 'id': 'collapser', + 'events': { + 'click': function(){ + if($('page').toggleClass('collapsed').hasClass('collapsed')) + this.set('html','Expand layout'); + else + this.set('html','Collapse layout'); + } + } + }).inject($('main'), 'top'); +} diff --git a/public/javascripts/pinboard.js b/public/javascripts/pinboard.js new file mode 100644 index 0000000..01d4362 --- /dev/null +++ b/public/javascripts/pinboard.js @@ -0,0 +1,52 @@ +var count = pinboard_count; +var linkroll = 'pinboard_linkroll'; +function pinboardNS_fetch_script(url) { + document.writeln(''); +} + +function pinboardNS_show_bmarks(r) { + var lr = new Pinboard_Linkroll(); + lr.set_items(r); + lr.show_bmarks(); +} + +var json_URL = "http://feeds.pinboard.in/json/v1/u:"+pinboard_user+"/?cb=pinboardNS_show_bmarks\&count=" + count; +pinboardNS_fetch_script(json_URL); + +function Pinboard_Linkroll() { + var items; + + this.set_items = function(i) { + this.items = i; + } + this.show_bmarks = function() { + var lines = []; + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + var str = this.format_item(item); + lines.push(str); + } + $(linkroll).set('html', lines.join("\n")); + } + this.cook = function(v) { + return v.replace('<', '<').replace('>', '>>'); + } + + this.format_item = function(it) { + var str = "
  • "; + if (!it.d) { return; } + str += "

    " + this.cook(it.d) + ""; + if (it.n) { + str += "" + this.cook(it.n) + "\n"; + } + if (it.t.length > 0) { + for (var i = 0; i < it.t.length; i++) { + var tag = it.t[i]; + str += " " + this.cook(tag) + " "; + } + } + str += "

  • \n"; + return str; + } +} +Pinboard_Linkroll.prototype = new Pinboard_Linkroll(); diff --git a/public/javascripts/twitter.js b/public/javascripts/twitter.js new file mode 100644 index 0000000..d633a78 --- /dev/null +++ b/public/javascripts/twitter.js @@ -0,0 +1,52 @@ +Request.Twitter = new Class({ + + Extends: Request.JSONP, + + options: { + linkify: true, + url: 'http://twitter.com/statuses/user_timeline/{term}.json', + include_replies: true, + data: { + count: 5, + trim_user: true + } + }, + + initialize: function(term, options){ + this.parent(options); + if(this.options.include_replies == false){ + this.options.count = this.options.data.count + this.options.data.count += 30; // adds 30 tweets to request for filtering + } + this.options.url = this.options.url.substitute({term: term}); + console.log(this.options.url); + }, + + success: function(args, index){ + if(!this.options.include_replies){ + args[0] = args[0].filter(function(item, index, array){ + return item.in_reply_to_screen_name == null; + }); + if(args[0].length > this.options.count){ args[0].length = this.options.count; } + } + var data = args[0]; + + if (this.options.linkify) data.each(function(tweet){ + tweet.text = this.linkify(tweet.text); + }, this); + + if (data[0]) this.options.data.since_id = data[0].id; // keep subsequent calls newer + + this.parent(args, index); + }, + + linkify: function(text){ + // modified from TwitterGitter by David Walsh (davidwalsh.name) + // courtesy of Jeremy Parrish (rrish.org) + return text.replace(/(https?:\/\/[\w\-:;?&=+.%#\/]+)/gi, '$1') + .replace(/(^|\W)@(\w+)/g, '$1@$2') + .replace(/(^|\W)#(\w+)/g, '$1#$2'); + } + +}); + diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..fdaa93b --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,35 @@ + + + + http://recursive-design.com/about.haml + 2009-11-24 + + + http://recursive-design.com/atom.xml + 2011-03-13 + + + http://recursive-design.com/ + 2011-04-08 + + + http://recursive-design.com/test/syntax.html + 2010-04-10 + + + http://recursive-design.com/test/typography.haml + 2009-11-24 + + + http://recursive-design.com/2011/04/07/test-of-typography + 2011-04-07 + + + http://recursive-design.com/2011/03/14/test-post + 2011-03-14 + + + http://recursive-design.com/2009/11/13/hello-world + 2009-11-13 + + \ No newline at end of file diff --git a/public/stylesheets/screen.css b/public/stylesheets/screen.css new file mode 100644 index 0000000..c21eecf --- /dev/null +++ b/public/stylesheets/screen.css @@ -0,0 +1,3 @@ +@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), + screen and (max-device-width:480px), (max-device-width:480px) and (orientation:landscape), + (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} diff --git a/rubypants.rb b/rubypants.rb deleted file mode 100644 index 6897228..0000000 --- a/rubypants.rb +++ /dev/null @@ -1,483 +0,0 @@ -# -# = RubyPants - SmartyPants ported to Ruby -# -# Ported by Christian Neukirchen -# Copyright (C) 2004 Christian Neukirchen -# -# Incooporates ideas, comments and documentation by Chad Miller -# Copyright (C) 2004 Chad Miller -# -# Original SmartyPants by John Gruber -# Copyright (C) 2003 John Gruber -# - -# -# = RubyPants - SmartyPants ported to Ruby -# -# == Synopsis -# -# RubyPants is a Ruby port of the smart-quotes library SmartyPants. -# -# The original "SmartyPants" is a free web publishing plug-in for -# Movable Type, Blosxom, and BBEdit that easily translates plain ASCII -# punctuation characters into "smart" typographic punctuation HTML -# entities. -# -# -# == Description -# -# RubyPants can perform the following transformations: -# -# * Straight quotes (" and ') into "curly" quote -# HTML entities -# * Backticks-style quotes (``like this'') into "curly" quote -# HTML entities -# * Dashes (-- and ---) into en- and em-dash -# entities -# * Three consecutive dots (... or . . .) into an -# ellipsis entity -# -# This means you can write, edit, and save your posts using plain old -# ASCII straight quotes, plain dashes, and plain dots, but your -# published posts (and final HTML output) will appear with smart -# quotes, em-dashes, and proper ellipses. -# -# RubyPants does not modify characters within
    ,
    -# , ,  or
    -# 
    +

    My Delicious Bookmarks »

    diff --git a/source/_includes/disqus_hook.haml b/source/_includes/disqus_hook.haml deleted file mode 100644 index 60e2d3d..0000000 --- a/source/_includes/disqus_hook.haml +++ /dev/null @@ -1,11 +0,0 @@ -:javascript - (function() { - var links = document.getElementsByTagName('a'); - var query = '?'; - for(var i = 0; i < links.length; i++) { - if(links[i].href.indexOf('#disqus_thread') >= 0) { - query += 'url' + i + '=' + encodeURIComponent(links[i].href) + '&'; - } - } - document.write(' + + diff --git a/source/_includes/footer.haml b/source/_includes/footer.haml deleted file mode 100644 index 99870db..0000000 --- a/source/_includes/footer.haml +++ /dev/null @@ -1,7 +0,0 @@ -#footer - .content - Copyright © #{Time.now.strftime('%Y')} - #{page.blog_title} - - %span.credit Powered by Octopress - -= include "disqus_hook.haml" if page.respond_to?(:disqus_short_name) && page.disqus_short_name -= include "google_analytics.haml" if page.respond_to?(:google_analytics_tracking_id) && page.google_analytics_tracking_id \ No newline at end of file diff --git a/source/_includes/footer.html b/source/_includes/footer.html new file mode 100644 index 0000000..de560ed --- /dev/null +++ b/source/_includes/footer.html @@ -0,0 +1,11 @@ +

    + Copyright © {{ site.time | date: "%Y" }} - {{ site.author }} - + Powered by Octopress +

    +{% if site.pinboard_user %} + + +{% endif %} diff --git a/source/_includes/google_analytics.haml b/source/_includes/google_analytics.html similarity index 77% rename from source/_includes/google_analytics.haml rename to source/_includes/google_analytics.html index a61ec89..b659a63 100644 --- a/source/_includes/google_analytics.haml +++ b/source/_includes/google_analytics.html @@ -1,4 +1,5 @@ -:javascript + + diff --git a/source/_includes/head.haml b/source/_includes/head.haml deleted file mode 100644 index 75b652c..0000000 --- a/source/_includes/head.haml +++ /dev/null @@ -1,22 +0,0 @@ -%head - %title #{page.blog_title} :: #{page.title} - %meta(http-equiv="Content-Type" content="text/html; charset=utf-8") - - if page.respond_to? :description - %meta(name="description" content="#{page.description}")/ - - if page.respond_to? :keywords - %meta(name="keywords" content="#{page.keywords}")/ - %link(href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css") - %script(src="http://ajax.googleapis.com/ajax/libs/mootools/1.2.4/mootools-yui-compressed.js" type="text/javascript") - %script(src="/javascripts/mootools-1.2.4.2-more.js" type="text/javascript") - - if page.respond_to? :twitter_user - :javascript - var twitter_user = "#{page.twitter_user}" - var show_replies = #{page.show_replies}; - var tweet_count = #{page.tweet_count}; - %script(src="/javascripts/octopress.js" type="text/javascript") - %script(src="/javascripts/twitter.js" type="text/javascript") - - if page.respond_to? :google_analytics - %script(src="http://www.google-analytics.com/ga.js" type="text/javascript") - - - # RSS Feed - %link(href="/atom.xml" rel="alternate" title="#{page.blog_title}" type="application/atom+xml") \ No newline at end of file diff --git a/source/_includes/head.html b/source/_includes/head.html new file mode 100644 index 0000000..4a3fb31 --- /dev/null +++ b/source/_includes/head.html @@ -0,0 +1,28 @@ + + {{page.title}} - {{site.title}} + + {% if page.description %} + + {% endif %} + {% if page.keywords %} + + {% endif %} + + + + + + + {% if site.twitter_user %} + + + {% endif %} + {% if site.google_analytics_tracking_id %} + {% include google_analytics.html %} + {% endif %} + + diff --git a/source/_includes/header.haml b/source/_includes/header.haml deleted file mode 100644 index f4b821f..0000000 --- a/source/_includes/header.haml +++ /dev/null @@ -1,9 +0,0 @@ -.content - %h1 - %a.title(href="/")=page.blog_title - - if page.respond_to?(:google_custom_search_id) && page.google_custom_search_id - #search - %form(action="http://www.google.com/cse" id="cse-search-box") - %input(type="hidden" name="cx" value="#{page.google_custom_search_id}") - %input(type="hidden" name="ie" value="UTF-8") - %input#q(type="text" name="q") \ No newline at end of file diff --git a/source/_includes/header.html b/source/_includes/header.html new file mode 100644 index 0000000..4c35d0b --- /dev/null +++ b/source/_includes/header.html @@ -0,0 +1,10 @@ +

    {{ site.title }}

    +{% if site.google_custom_search_id && site.google_custom_search_id %} + +{% endif %} diff --git a/source/_includes/navigation.haml b/source/_includes/navigation.haml deleted file mode 100644 index 8ee0bfe..0000000 --- a/source/_includes/navigation.haml +++ /dev/null @@ -1,8 +0,0 @@ -.content - %ul - %li.alpha - %a(href="/") Blog - %li.omega - %a(href="/about.html") About - %li.subscribe - %a(href="/atom.xml") Subscribe \ No newline at end of file diff --git a/source/_includes/navigation.html b/source/_includes/navigation.html new file mode 100644 index 0000000..97d9593 --- /dev/null +++ b/source/_includes/navigation.html @@ -0,0 +1,5 @@ + diff --git a/source/_includes/pinboard.html b/source/_includes/pinboard.html new file mode 100644 index 0000000..602645c --- /dev/null +++ b/source/_includes/pinboard.html @@ -0,0 +1,3 @@ +

    My Pinboard

    +
      Fetching linkroll...
    +

    My Pinboard Bookmarks »

    diff --git a/source/_includes/post.haml b/source/_includes/post.haml deleted file mode 100644 index b51b99f..0000000 --- a/source/_includes/post.haml +++ /dev/null @@ -1,8 +0,0 @@ -.article - %h2= page.title - .meta - - author = (page.respond_to?(:author) && page.author) ? 'by: ' + page.author + ' |' : '' - #{author} posted: #{page.date.strftime("%B #{page.date.day.ordinalize}, %Y")} - = (page.respond_to?(:updated) && page.updated) ? " | updated: #{page.updated}" : '' - = preserve rp(content) - #disqus_thread= include "disqus_thread.haml" if page.respond_to?(:disqus_short_name) && page.disqus_short_name diff --git a/source/_includes/sidebar.haml b/source/_includes/sidebar.haml deleted file mode 100644 index 463e353..0000000 --- a/source/_includes/sidebar.haml +++ /dev/null @@ -1,2 +0,0 @@ -= include "twitter.haml" if page.respond_to?(:twitter_user) && page.twitter_user -= include "delicious.haml" if page.respond_to?(:delicious_user) && page.delicious_user \ No newline at end of file diff --git a/source/_includes/sidebar.html b/source/_includes/sidebar.html new file mode 100644 index 0000000..86f659b --- /dev/null +++ b/source/_includes/sidebar.html @@ -0,0 +1,24 @@ +

    About Me

    +

    Yo everybody!

    +{% if site.recent_posts %} +
    +

    Recent Posts

    +
      + {% for post in site.posts limit: site.recent_posts %} +
    • + {{ post.title }} + +
    • + {% endfor %} +
    +
    +{% endif %} +{% if site.twitter_user %} +
    {% include twitter.html %}
    +{% endif %} +{% if site.delicious_user %} +
    {% include delicious.html %}
    +{% endif %} +{% if site.pinboard_user %} +
    {% include pinboard.html %}
    +{% endif %} diff --git a/source/_includes/twitter.haml b/source/_includes/twitter.haml deleted file mode 100644 index 852bb06..0000000 --- a/source/_includes/twitter.haml +++ /dev/null @@ -1,4 +0,0 @@ -%h4 Twitter @#{page.twitter_user} -#twitter - %ul#twitter_status - Status updating... \ No newline at end of file diff --git a/source/_includes/twitter.html b/source/_includes/twitter.html new file mode 100644 index 0000000..4d68848 --- /dev/null +++ b/source/_includes/twitter.html @@ -0,0 +1,5 @@ +

    On Twitter

    +
      + Status updating... +
    +

    Follow @{{ site.twitter_user }}

    diff --git a/source/_layouts/blog_post.haml b/source/_layouts/blog_post.haml deleted file mode 100644 index 8201632..0000000 --- a/source/_layouts/blog_post.haml +++ /dev/null @@ -1,32 +0,0 @@ ---- -blog_title: My Octopress Blog -author: - -twitter_user: -tweet_count: 3 -show_replies: false - -delicious_user: -delicious_count: 3 - -full_url: -disqus_short_name: - -google_custom_search_id: -google_analytics_tracking_id: - ---- - -!!! 1.1 Transitional -%html(xmlns="http://www.w3.org/1999/xhtml" xml:lang="en") - - = include "head.haml" - %body(id="#{(page.respond_to?(:body_id) ? page.body_id : nil)}") - #header= include "header.haml" - #nav= include "navigation.haml" - #page - #content - #main - .blog.content= include "post.haml" - #sidebar= include "sidebar.haml" - = include "footer.haml" \ No newline at end of file diff --git a/source/_layouts/default.haml b/source/_layouts/default.haml deleted file mode 100644 index 279682d..0000000 --- a/source/_layouts/default.haml +++ /dev/null @@ -1,32 +0,0 @@ ---- -blog_title: My Octopress Blog -author: - -twitter_user: imathis -tweet_count: 3 -show_replies: false - -delicious_user: -delicious_count: 3 - -full_url: -disqus_short_name: - -google_custom_search_id: -google_analytics_tracking_id: - ---- - -!!! 1.1 Transitional -%html(xmlns="http://www.w3.org/1999/xhtml" xml:lang="en") - - = include "head.haml" - %body(id="#{(page.respond_to?(:body_id) ? page.body_id : nil)}") - #header= include "header.haml" - #nav= include "navigation.haml" - #page - #content - #main - .content= preserve rp(content) - #sidebar= include "sidebar.haml" - = include "footer.haml" \ No newline at end of file diff --git a/source/_layouts/default.html b/source/_layouts/default.html new file mode 100644 index 0000000..553c1be --- /dev/null +++ b/source/_layouts/default.html @@ -0,0 +1,15 @@ + + +{% include head.html %} + +
    {% include header.html %}
    + +
    +
    +
    {{ content }}
    + +
    +
    +
    {% include footer.html %}
    + + diff --git a/source/_layouts/post.html b/source/_layouts/post.html new file mode 100644 index 0000000..3b56834 --- /dev/null +++ b/source/_layouts/post.html @@ -0,0 +1,10 @@ +--- +layout: default +--- + +
    + {% include article.html %} + {% if site.disqus_short_name %} +
    {% include disqus_thread.html %}
    + {% endif %} +
    diff --git a/source/_posts/2009-11-13-hello-world.markdown b/source/_posts/2009-11-13-hello-world.markdown index 2339968..011368d 100644 --- a/source/_posts/2009-11-13-hello-world.markdown +++ b/source/_posts/2009-11-13-hello-world.markdown @@ -1,14 +1,16 @@ --- title: Hello World! I'm Octopress! +layout: post updated: March 10th, 2010 --- **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/). 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: -> 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. -> **Jack Moffitt** [Blogging with Git Emacs and Jekyll](http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/) +> 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. -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. +**Jack Moffitt** [Blogging with Git Emacs and Jekyll](http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/) -[Read the wiki to learn more](http://wiki.github.com/imathis/octopress/) \ No newline at end of file +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. + +[Read the wiki to learn more](http://wiki.github.com/imathis/octopress/) diff --git a/source/_posts/2011-03-14-test-post.markdown b/source/_posts/2011-03-14-test-post.markdown new file mode 100644 index 0000000..5fd45b8 --- /dev/null +++ b/source/_posts/2011-03-14-test-post.markdown @@ -0,0 +1,6 @@ +--- +title: Test Post +layout: post +--- + +This is a test! diff --git a/source/_posts/2011-04-07-test-of-typography.markdown b/source/_posts/2011-04-07-test-of-typography.markdown new file mode 100644 index 0000000..5ae332c --- /dev/null +++ b/source/_posts/2011-04-07-test-of-typography.markdown @@ -0,0 +1,50 @@ +--- +title: "Test of Typography" +date: 2011-04-07 19:17 +layout: post +--- + +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. + +## Why Have Business Cards? +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 +people I work for I've never met in-person. + +When someone gives me their business card, I read it, pocket it, and eventually throw it out — 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? + + + +### Inspiration Demands Action +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. + +cards in a box 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. + +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. + +### The Freedom to Fail +card concepts 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. + +handout cards 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. + +### A Second Iteration +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. + +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): + +> Every interaction is both precious and an opportunity to delight. + +MiniCard Holder 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. + +### The Final Design + +all card designs + +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. + +**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: + +- [Product](http://www.flickr.com/photos/lushlampwork/4131018201/in/pool-moo) [tags](http://www.flickr.com/photos/lushlampwork/4297224179/in/pool-moo) +- [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) +- [Gift](http://www.flickr.com/photos/polkadotcreations/4167249758/in/pool-moo) [tags](http://www.flickr.com/photos/22338102@N04/4278114745/in/pool-moo) +- [An advent calendar](http://www.flickr.com/photos/bcome/4177034036/in/pool-moo) + diff --git a/source/archives.haml b/source/archives.haml deleted file mode 100644 index 4daba19..0000000 --- a/source/archives.haml +++ /dev/null @@ -1,14 +0,0 @@ ---- -layout: default -title: Blog Archives ---- -%h2 Blog Archives - -- posts = site.posts.reverse.group_by { |p| p.date.strftime("%Y") } -- posts.keys.each do |year| - %h3= year - %ul - - posts[year].each do |post| - %li(class="#{(post.data['link'] ? "link" : nil )}") - = link_to(post.title, post.url) - %span.pubdate= post.date.strftime("%d %b, %Y") \ No newline at end of file diff --git a/source/atom.haml b/source/atom.haml deleted file mode 100644 index 07ec21f..0000000 --- a/source/atom.haml +++ /dev/null @@ -1,25 +0,0 @@ ---- -layout: nil -author: Your Name -email: author@domain.com -blog_title: My Octopress Blog -full_url: http://yoursite.com ---- -!!! XML -%feed(xmlns="http://www.w3.org/2005/Atom") - %title= page.blog_title - %link(href="#{page.full_url}/atom.xml" rel="self") - %link(href="#{page.full_url}") - %updated= Time.now.xmlschema - %id=page.full_url - %author - %name= page.author - %email= page.email - - site.posts.reverse[0..14].each do |post| - %entry - %title= rp(post.title) - %link(href="#{page.full_url}#{post.url}") - %updated=post.date.xmlschema - %id= "#{page.full_url}#{post.id}" - %content(type="html") - = h(absolute_url(rp(post.content), page.full_url)) \ No newline at end of file diff --git a/source/atom.xml b/source/atom.xml new file mode 100644 index 0000000..3b4e661 --- /dev/null +++ b/source/atom.xml @@ -0,0 +1,28 @@ +--- +layout: nil +--- + + + + {{ site.blog_title }} + + + {{ site.time | date_to_xmlschema }} + {{ site.url }}/ + + {{ site.author }} + {% if site.email %} + {{ site.email }} + {% endif %} + + + {% for post in site.posts %} + + {{ post.title }} + + {{ post.date | date_to_xmlschema }} + {{ site.url }}{{ post.id }} + {{ post.content | full_urls: site.url | xml_escape }} + + {% endfor %} + diff --git a/source/fonts/adellebasic_bold-webfont.eot b/source/fonts/adellebasic_bold-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..5bace32feb1193922a356a5a2c67031776ff5534 GIT binary patch literal 13694 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 literal 0 HcmV?d00001 diff --git a/source/fonts/adellebasic_bold-webfont.svg b/source/fonts/adellebasic_bold-webfont.svg new file mode 100755 index 0000000..c259c24 --- /dev/null +++ b/source/fonts/adellebasic_bold-webfont.svg @@ -0,0 +1,139 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2009 by TypeTogether All rights reserved +Designer : Veronika Burian Jos Scaglione +Foundry : TypeTogether +Foundry URL : wwwtypetogethercom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/fonts/adellebasic_bold-webfont.ttf b/source/fonts/adellebasic_bold-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..7e70d0dee6f9a1319e75d25eea1251fed0b527fb GIT binary patch literal 24072 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 a{->@tgJ=eByWR|;8H@}zXKKM3_P+sZpC^?7 literal 0 HcmV?d00001 diff --git a/source/fonts/adellebasic_bold-webfont.woff b/source/fonts/adellebasic_bold-webfont.woff new file mode 100755 index 0000000000000000000000000000000000000000..07ae59a2acadf65b8833ed6569e76d3096dd7171 GIT binary patch literal 15604 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 ML2daB;pO@M56S|o4gdfE literal 0 HcmV?d00001 diff --git a/source/index.haml b/source/index.haml deleted file mode 100644 index 6647ccd..0000000 --- a/source/index.haml +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: default -title: Blog -author: -disqus: ---- -.blog - - site.posts.sort_by(&:date).reverse[0..9].each_with_index do |post,index| - .article - %h2= link_to(post.title, post.url, {:class=>"title"}) - .meta - - author = (page.respond_to?(:author) && page.author) ? 'by: ' + page.author + ' |' : '' - #{author} posted: #{post.date.strftime("%B #{post.date.day.ordinalize}, %Y")} - = (page.respond_to?(:updated) && page.updated) ? " | updated: #{page.updated}" : '' - = preserve rp(post.content) - - if page.respond_to?(:disqus) && page.disqus - - if post.data["comments_off"] - %em.comments_off Comments disabled - - else - %a(href="#{post.url}/#disqus_thread")Comments - .footer - %a(href="/archives.html" title="archives") « Blog Archives diff --git a/source/index.html b/source/index.html new file mode 100644 index 0000000..03b6b9c --- /dev/null +++ b/source/index.html @@ -0,0 +1,12 @@ +--- +layout: default +title: Octopress +--- +{% for page in site.posts limit:3 %} +{% assign content = page.content %} +{% assign index = true %} +
    + {% include article.html %} +
    +{% endfor %} + diff --git a/source/javascripts/mootools-more-1.3.1.1.js b/source/javascripts/mootools-more-1.3.1.1.js new file mode 100644 index 0000000..582e466 --- /dev/null +++ b/source/javascripts/mootools-more-1.3.1.1.js @@ -0,0 +1,1322 @@ +// MooTools: the javascript framework. +// Load this file's selection again by visiting: http://mootools.net/more/0a2b8625655481363709ef8d9ab1d0f4 +// Or build this file again with packager using: packager build More/Date More/Date.Extras More/Hash More/Request.JSONP +/* +--- + +script: More.js + +name: More + +description: MooTools More + +license: MIT-style license + +authors: + - Guillermo Rauch + - Thomas Aylott + - Scott Kyle + - Arian Stolwijk + - Tim Wienk + - Christoph Pojer + - Aaron Newton + +requires: + - Core/MooTools + +provides: [MooTools.More] + +... +*/ + +MooTools.More = { + 'version': '1.3.1.1', + 'build': '0292a3af1eea242b817fecf9daa127417d10d4ce' +}; + + +/* +--- + +script: Object.Extras.js + +name: Object.Extras + +description: Extra Object generics, like getFromPath which allows a path notation to child elements. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - Core/Object + - /MooTools.More + +provides: [Object.Extras] + +... +*/ + +(function(){ + +var defined = function(value){ + return value != null; +}; + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +Object.extend({ + + getFromPath: function(source, parts){ + if (typeof parts == 'string') parts = parts.split('.'); + for (var i = 0, l = parts.length; i < l; i++){ + if (hasOwnProperty.call(source, parts[i])) source = source[parts[i]]; + else return null; + } + return source; + }, + + cleanValues: function(object, method){ + method = method || defined; + for (var key in object) if (!method(object[key])){ + delete object[key]; + } + return object; + }, + + erase: function(object, key){ + if (hasOwnProperty.call(object, key)) delete object[key]; + return object; + }, + + run: function(object){ + var args = Array.slice(arguments, 1); + for (var key in object) if (object[key].apply){ + object[key].apply(object, args); + } + return object; + } + +}); + +}).call(this); + + +/* +--- + +script: Locale.js + +name: Locale + +description: Provides methods for localization. + +license: MIT-style license + +authors: + - Aaron Newton + - Arian Stolwijk + +requires: + - Core/Events + - /Object.Extras + - /MooTools.More + +provides: [Locale, Lang] + +... +*/ + +(function(){ + +var current = null, + locales = {}, + inherits = {}; + +var getSet = function(set){ + if (instanceOf(set, Locale.Set)) return set; + else return locales[set]; +}; + +var Locale = this.Locale = { + + define: function(locale, set, key, value){ + var name; + if (instanceOf(locale, Locale.Set)){ + name = locale.name; + if (name) locales[name] = locale; + } else { + name = locale; + if (!locales[name]) locales[name] = new Locale.Set(name); + locale = locales[name]; + } + + if (set) locale.define(set, key, value); + + + + if (!current) current = locale; + + return locale; + }, + + use: function(locale){ + locale = getSet(locale); + + if (locale){ + current = locale; + + this.fireEvent('change', locale); + + + } + + return this; + }, + + getCurrent: function(){ + return current; + }, + + get: function(key, args){ + return (current) ? current.get(key, args) : ''; + }, + + inherit: function(locale, inherits, set){ + locale = getSet(locale); + + if (locale) locale.inherit(inherits, set); + return this; + }, + + list: function(){ + return Object.keys(locales); + } + +}; + +Object.append(Locale, new Events); + +Locale.Set = new Class({ + + sets: {}, + + inherits: { + locales: [], + sets: {} + }, + + initialize: function(name){ + this.name = name || ''; + }, + + define: function(set, key, value){ + var defineData = this.sets[set]; + if (!defineData) defineData = {}; + + if (key){ + if (typeOf(key) == 'object') defineData = Object.merge(defineData, key); + else defineData[key] = value; + } + this.sets[set] = defineData; + + return this; + }, + + get: function(key, args, _base){ + var value = Object.getFromPath(this.sets, key); + if (value != null){ + var type = typeOf(value); + if (type == 'function') value = value.apply(null, Array.from(args)); + else if (type == 'object') value = Object.clone(value); + return value; + } + + // get value of inherited locales + var index = key.indexOf('.'), + set = index < 0 ? key : key.substr(0, index), + names = (this.inherits.sets[set] || []).combine(this.inherits.locales).include('en-US'); + if (!_base) _base = []; + + for (var i = 0, l = names.length; i < l; i++){ + if (_base.contains(names[i])) continue; + _base.include(names[i]); + + var locale = locales[names[i]]; + if (!locale) continue; + + value = locale.get(key, args, _base); + if (value != null) return value; + } + + return ''; + }, + + inherit: function(names, set){ + names = Array.from(names); + + if (set && !this.inherits.sets[set]) this.inherits.sets[set] = []; + + var l = names.length; + while (l--) (set ? this.inherits.sets[set] : this.inherits.locales).unshift(names[l]); + + return this; + } + +}); + + + +}).call(this); + + +/* +--- + +name: Locale.en-US.Date + +description: Date messages for US English. + +license: MIT-style license + +authors: + - Aaron Newton + +requires: + - /Locale + +provides: [Locale.en-US.Date] + +... +*/ + +Locale.define('en-US', 'Date', { + + months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + months_abbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + days_abbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + + // Culture's date order: MM/DD/YYYY + dateOrder: ['month', 'date', 'year'], + shortDate: '%m/%d/%Y', + shortTime: '%I:%M%p', + AM: 'AM', + PM: 'PM', + firstDayOfWeek: 0, + + // Date.Extras + ordinal: function(dayOfMonth){ + // 1st, 2nd, 3rd, etc. + return (dayOfMonth > 3 && dayOfMonth < 21) ? 'th' : ['th', 'st', 'nd', 'rd', 'th'][Math.min(dayOfMonth % 10, 4)]; + }, + + 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' + +}); + + +/* +--- + +script: Date.js + +name: Date + +description: Extends the Date native object to include methods useful in managing dates. + +license: MIT-style license + +authors: + - Aaron Newton + - Nicholas Barthelemy - https://svn.nbarthelemy.com/date-js/ + - Harald Kirshner - mail [at] digitarald.de; http://digitarald.de + - Scott Kyle - scott [at] appden.com; http://appden.com + +requires: + - Core/Array + - Core/String + - Core/Number + - MooTools.More + - Locale + - Locale.en-US.Date + +provides: [Date] + +... +*/ + +(function(){ + +var Date = this.Date; + +var DateMethods = Date.Methods = { + ms: 'Milliseconds', + year: 'FullYear', + min: 'Minutes', + mo: 'Month', + sec: 'Seconds', + hr: 'Hours' +}; + +['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', 'UTCMilliseconds'].each(function(method){ + Date.Methods[method.toLowerCase()] = method; +}); + +var pad = function(n, digits, string){ + if (digits == 1) return n; + return n < Math.pow(10, digits - 1) ? (string || '0') + pad(n, digits - 1, string) : n; +}; + +Date.implement({ + + set: function(prop, value){ + prop = prop.toLowerCase(); + var method = DateMethods[prop] && 'set' + DateMethods[prop]; + if (method && this[method]) this[method](value); + return this; + }.overloadSetter(), + + get: function(prop){ + prop = prop.toLowerCase(); + var method = DateMethods[prop] && 'get' + DateMethods[prop]; + if (method && this[method]) return this[method](); + return null; + }.overloadGetter(), + + clone: function(){ + return new Date(this.get('time')); + }, + + increment: function(interval, times){ + interval = interval || 'day'; + times = times != null ? times : 1; + + switch (interval){ + case 'year': + return this.increment('month', times * 12); + case 'month': + var d = this.get('date'); + this.set('date', 1).set('mo', this.get('mo') + times); + return this.set('date', d.min(this.get('lastdayofmonth'))); + case 'week': + return this.increment('day', times * 7); + case 'day': + return this.set('date', this.get('date') + times); + } + + if (!Date.units[interval]) throw new Error(interval + ' is not a supported interval'); + + return this.set('time', this.get('time') + times * Date.units[interval]()); + }, + + decrement: function(interval, times){ + return this.increment(interval, -1 * (times != null ? times : 1)); + }, + + isLeapYear: function(){ + return Date.isLeapYear(this.get('year')); + }, + + clearTime: function(){ + return this.set({hr: 0, min: 0, sec: 0, ms: 0}); + }, + + diff: function(date, resolution){ + if (typeOf(date) == 'string') date = Date.parse(date); + + return ((date - this) / Date.units[resolution || 'day'](3, 3)).round(); // non-leap year, 30-day month + }, + + getLastDayOfMonth: function(){ + return Date.daysInMonth(this.get('mo'), this.get('year')); + }, + + getDayOfYear: function(){ + return (Date.UTC(this.get('year'), this.get('mo'), this.get('date') + 1) + - Date.UTC(this.get('year'), 0, 1)) / Date.units.day(); + }, + + setDay: function(day, firstDayOfWeek){ + if (firstDayOfWeek == null){ + firstDayOfWeek = Date.getMsg('firstDayOfWeek'); + if (firstDayOfWeek === '') firstDayOfWeek = 1; + } + + day = (7 + Date.parseDay(day, true) - firstDayOfWeek) % 7; + var currentDay = (7 + this.get('day') - firstDayOfWeek) % 7; + + return this.increment('day', day - currentDay); + }, + + getWeek: function(firstDayOfWeek){ + if (firstDayOfWeek == null){ + firstDayOfWeek = Date.getMsg('firstDayOfWeek'); + if (firstDayOfWeek === '') firstDayOfWeek = 1; + } + + var date = this, + dayOfWeek = (7 + date.get('day') - firstDayOfWeek) % 7, + dividend = 0, + firstDayOfYear; + + if (firstDayOfWeek == 1){ + // ISO-8601, week belongs to year that has the most days of the week (i.e. has the thursday of the week) + var month = date.get('month'), + startOfWeek = date.get('date') - dayOfWeek; + + if (month == 11 && startOfWeek > 28) return 1; // Week 1 of next year + + if (month == 0 && startOfWeek < -2){ + // Use a date from last year to determine the week + date = new Date(date).decrement('day', dayOfWeek); + dayOfWeek = 0; + } + + firstDayOfYear = new Date(date.get('year'), 0, 1).get('day') || 7; + if (firstDayOfYear > 4) dividend = -7; // First week of the year is not week 1 + } else { + // In other cultures the first week of the year is always week 1 and the last week always 53 or 54. + // Days in the same week can have a different weeknumber if the week spreads across two years. + firstDayOfYear = new Date(date.get('year'), 0, 1).get('day'); + } + + dividend += date.get('dayofyear'); + dividend += 6 - dayOfWeek; // Add days so we calculate the current date's week as a full week + dividend += (7 + firstDayOfYear - firstDayOfWeek) % 7; // Make up for first week of the year not being a full week + + return (dividend / 7); + }, + + getOrdinal: function(day){ + return Date.getMsg('ordinal', day || 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'); + }, + + getGMTOffset: function(){ + var off = this.get('timezoneOffset'); + return ((off > 0) ? '-' : '+') + pad((off.abs() / 60).floor(), 2) + pad(off % 60, 2); + }, + + setAMPM: function(ampm){ + ampm = ampm.toUpperCase(); + var hr = this.get('hr'); + if (hr > 11 && ampm == 'AM') return this.decrement('hour', 12); + else if (hr < 12 && ampm == 'PM') return this.increment('hour', 12); + return this; + }, + + getAMPM: function(){ + return (this.get('hr') < 12) ? 'AM' : 'PM'; + }, + + parse: function(str){ + this.set('time', Date.parse(str)); + return this; + }, + + isValid: function(date){ + return !isNaN((date || this).valueOf()); + }, + + format: function(f){ + if (!this.isValid()) return 'invalid date'; + if (!f) f = '%x %X'; + + var formatLower = f.toLowerCase(); + if (formatters[formatLower]) return formatters[formatLower](this); // it's a formatter! + f = formats[formatLower] || f; // replace short-hand with actual format + + var d = this; + return f.replace(/%([a-z%])/gi, + function($0, $1){ + switch ($1){ + case 'a': return Date.getMsg('days_abbr')[d.get('day')]; + case 'A': return Date.getMsg('days')[d.get('day')]; + case 'b': return Date.getMsg('months_abbr')[d.get('month')]; + case 'B': return Date.getMsg('months')[d.get('month')]; + case 'c': return d.format('%a %b %d %H:%M:%S %Y'); + case 'd': return pad(d.get('date'), 2); + case 'e': return pad(d.get('date'), 2, ' '); + case 'H': return pad(d.get('hr'), 2); + case 'I': return pad((d.get('hr') % 12) || 12, 2); + case 'j': return pad(d.get('dayofyear'), 3); + case 'k': return pad(d.get('hr'), 2, ' '); + case 'l': return pad((d.get('hr') % 12) || 12, 2, ' '); + case 'L': return pad(d.get('ms'), 3); + case 'm': return pad((d.get('mo') + 1), 2); + case 'M': return pad(d.get('min'), 2); + case 'o': return d.get('ordinal'); + case 'p': return Date.getMsg(d.get('ampm')); + case 's': return Math.round(d / 1000); + case 'S': return pad(d.get('seconds'), 2); + case 'T': return d.format('%H:%M:%S'); + case 'U': return pad(d.get('week'), 2); + case 'w': return d.get('day'); + case 'x': return d.format(Date.getMsg('shortDate')); + case 'X': return d.format(Date.getMsg('shortTime')); + case 'y': return d.get('year').toString().substr(2); + case 'Y': return d.get('year'); + case 'z': return d.get('GMTOffset'); + case 'Z': return d.get('Timezone'); + } + return $1; + } + ); + }, + + toISOString: function(){ + return this.format('iso8601'); + } + +}).alias({ + toJSON: 'toISOString', + compare: 'diff', + strftime: 'format' +}); + +var formats = { + db: '%Y-%m-%d %H:%M:%S', + compact: '%Y%m%dT%H%M%S', + 'short': '%d %b %H:%M', + 'long': '%B %d, %Y %H:%M' +}; + +// The day and month abbreviations are standardized, so we cannot use simply %a and %b because they will get localized +var rfcDayAbbr = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + rfcMonthAbbr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; + +var formatters = { + rfc822: function(date){ + return rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %Z'); + }, + rfc2822: function(date){ + return rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %z'); + }, + iso8601: function(date){ + return ( + date.getUTCFullYear() + '-' + + pad(date.getUTCMonth() + 1, 2) + '-' + + pad(date.getUTCDate(), 2) + 'T' + + pad(date.getUTCHours(), 2) + ':' + + pad(date.getUTCMinutes(), 2) + ':' + + pad(date.getUTCSeconds(), 2) + '.' + + pad(date.getUTCMilliseconds(), 3) + 'Z' + ); + } +}; + + +var parsePatterns = [], + nativeParse = Date.parse; + +var parseWord = function(type, word, num){ + var ret = -1, + translated = Date.getMsg(type + 's'); + switch (typeOf(word)){ + case 'object': + ret = translated[word.get(type)]; + break; + case 'number': + ret = translated[word]; + if (!ret) throw new Error('Invalid ' + type + ' index: ' + word); + break; + case 'string': + var match = translated.filter(function(name){ + return this.test(name); + }, new RegExp('^' + word, 'i')); + if (!match.length) throw new Error('Invalid ' + type + ' string'); + if (match.length > 1) throw new Error('Ambiguous ' + type); + ret = match[0]; + } + + return (num) ? translated.indexOf(ret) : ret; +}; + +var startCentury = 1900, + startYear = 70; + +Date.extend({ + + getMsg: function(key, args){ + return Locale.get('Date.' + key, args); + }, + + units: { + ms: Function.from(1), + second: Function.from(1000), + minute: Function.from(60000), + hour: Function.from(3600000), + day: Function.from(86400000), + week: Function.from(608400000), + month: function(month, year){ + var d = new Date; + return Date.daysInMonth(month != null ? month : d.get('mo'), year != null ? year : d.get('year')) * 86400000; + }, + year: function(year){ + year = year || new Date().get('year'); + return Date.isLeapYear(year) ? 31622400000 : 31536000000; + } + }, + + daysInMonth: function(month, year){ + return [31, Date.isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; + }, + + isLeapYear: function(year){ + return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0); + }, + + parse: function(from){ + var t = typeOf(from); + if (t == 'number') return new Date(from); + if (t != 'string') return from; + from = from.clean(); + if (!from.length) return null; + + var parsed; + parsePatterns.some(function(pattern){ + var bits = pattern.re.exec(from); + return (bits) ? (parsed = pattern.handler(bits)) : false; + }); + + if (!(parsed && parsed.isValid())){ + parsed = new Date(nativeParse(from)); + if (!(parsed && parsed.isValid())) parsed = new Date(from.toInt()); + } + return parsed; + }, + + parseDay: function(day, num){ + return parseWord('day', day, num); + }, + + parseMonth: function(month, num){ + return parseWord('month', month, num); + }, + + parseUTC: function(value){ + var localDate = new Date(value); + var utcSeconds = Date.UTC( + localDate.get('year'), + localDate.get('mo'), + localDate.get('date'), + localDate.get('hr'), + localDate.get('min'), + localDate.get('sec'), + localDate.get('ms') + ); + return new Date(utcSeconds); + }, + + orderIndex: function(unit){ + return Date.getMsg('dateOrder').indexOf(unit) + 1; + }, + + defineFormat: function(name, format){ + formats[name] = format; + return this; + }, + + defineFormats: function(formats){ + for (var name in formats) Date.defineFormat(name, formats[name]); + return this; + }, + + + + defineParser: function(pattern){ + parsePatterns.push((pattern.re && pattern.handler) ? pattern : build(pattern)); + return this; + }, + + defineParsers: function(){ + Array.flatten(arguments).each(Date.defineParser); + return this; + }, + + define2DigitYearStart: function(year){ + startYear = year % 100; + startCentury = year - startYear; + return this; + } + +}); + +var regexOf = function(type){ + return new RegExp('(?:' + Date.getMsg(type).map(function(name){ + return name.substr(0, 3); + }).join('|') + ')[a-z]*'); +}; + +var replacers = function(key){ + switch (key){ + case 'T': + return '%H:%M:%S'; + case 'x': // iso8601 covers yyyy-mm-dd, so just check if month is first + return ((Date.orderIndex('month') == 1) ? '%m[-./]%d' : '%d[-./]%m') + '([-./]%y)?'; + case 'X': + return '%H([.:]%M)?([.:]%S([.:]%s)?)? ?%p? ?%z?'; + } + return null; +}; + +var keys = { + 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}/, + z: /Z|[+-]\d{2}(?::?\d{2})?/ +}; + +keys.m = keys.I; +keys.S = keys.M; + +var currentLanguage; + +var recompile = function(language){ + currentLanguage = language; + + keys.a = keys.A = regexOf('days'); + keys.b = keys.B = regexOf('months'); + + parsePatterns.each(function(pattern, i){ + if (pattern.format) parsePatterns[i] = build(pattern.format); + }); +}; + +var build = function(format){ + if (!currentLanguage) return {format: format}; + + var parsed = []; + var re = (format.source || format) // allow format to be regex + .replace(/%([a-z])/gi, + function($0, $1){ + return replacers($1) || $0; + } + ).replace(/\((?!\?)/g, '(?:') // make all groups non-capturing + .replace(/ (?!\?|\*)/g, ',? ') // be forgiving with spaces and commas + .replace(/%([a-z%])/gi, + function($0, $1){ + var p = keys[$1]; + if (!p) return $1; + parsed.push($1); + return '(' + p.source + ')'; + } + ).replace(/\[a-z\]/gi, '[a-z\\u00c0-\\uffff;\&]'); // handle unicode words + + return { + format: format, + re: new RegExp('^' + re + '$', 'i'), + handler: function(bits){ + bits = bits.slice(1).associate(parsed); + var date = new Date().clearTime(), + year = bits.y || bits.Y; + + if (year != null) handle.call(date, 'y', year); // need to start in the right year + if ('d' in bits) handle.call(date, 'd', 1); + if ('m' in bits || bits.b || bits.B) handle.call(date, 'm', 1); + + for (var key in bits) handle.call(date, key, bits[key]); + return date; + } + }; +}; + +var handle = function(key, value){ + if (!value) return this; + + switch (key){ + case 'a': case 'A': return this.set('day', Date.parseDay(value, true)); + case 'b': case 'B': return this.set('mo', Date.parseMonth(value, true)); + case 'd': return this.set('date', value); + case 'H': case 'I': return this.set('hr', value); + case 'm': return this.set('mo', value - 1); + case 'M': return this.set('min', value); + case 'p': return this.set('ampm', value.replace(/\./g, '')); + case 'S': return this.set('sec', value); + case 's': return this.set('ms', ('0.' + value) * 1000); + case 'w': return this.set('day', value); + case 'Y': return this.set('year', value); + case 'y': + value = +value; + if (value < 100) value += startCentury + (value < startYear ? 100 : 0); + return this.set('year', value); + case 'z': + if (value == 'Z') value = '+00'; + var offset = value.match(/([+-])(\d{2}):?(\d{2})?/); + offset = (offset[1] + '1') * (offset[2] * 60 + (+offset[3] || 0)) + this.getTimezoneOffset(); + return this.set('time', this - offset * 60000); + } + + return this; +}; + +Date.defineParsers( + '%Y([-./]%m([-./]%d((T| )%X)?)?)?', // "1999-12-31", "1999-12-31 11:59pm", "1999-12-31 23:59:59", ISO8601 + '%Y%m%d(T%H(%M%S?)?)?', // "19991231", "19991231T1159", compact + '%x( %X)?', // "12/31", "12.31.99", "12-31-1999", "12/31/2008 11:59 PM" + '%d%o( %b( %Y)?)?( %X)?', // "31st", "31st December", "31 Dec 1999", "31 Dec 1999 11:59pm" + '%b( %d%o)?( %Y)?( %X)?', // Same as above with month and day switched + '%Y %b( %d%o( %X)?)?', // Same as above with year coming first + '%o %b %d %X %z %Y', // "Thu Oct 22 08:11:23 +0000 2009" + '%T', // %H:%M:%S + '%H:%M( ?%p)?' // "11:05pm", "11:05 am" and "11:05" +); + +Locale.addEvent('change', function(language){ + if (Locale.get('Date')) recompile(language); +}).fireEvent('change', Locale.getCurrent()); + +}).call(this); + + +/* +--- + +script: Date.Extras.js + +name: Date.Extras + +description: Extends the Date native object to include extra methods (on top of those in Date.js). + +license: MIT-style license + +authors: + - Aaron Newton + - Scott Kyle + +requires: + - /Date + +provides: [Date.Extras] + +... +*/ + +Date.implement({ + + timeDiffInWords: function(to){ + return Date.distanceOfTimeInWords(this, to || new Date); + }, + + timeDiff: function(to, separator){ + if (to == null) to = new Date; + var delta = ((to - this) / 1000).floor(); + + var vals = [], + durations = [60, 60, 24, 365, 0], + names = ['s', 'm', 'h', 'd', 'y'], + value, duration; + + for (var item = 0; item < durations.length; item++){ + if (item && !delta) break; + value = delta; + if ((duration = durations[item])){ + value = (delta % duration); + delta = (delta / duration).floor(); + } + vals.unshift(value + (names[item] || '')); + } + + return vals.join(separator || ':'); + } + +}).extend({ + + distanceOfTimeInWords: function(from, to){ + return Date.getTimePhrase(((to - from) / 1000).toInt()); + }, + + getTimePhrase: function(delta){ + var suffix = (delta < 0) ? 'Until' : 'Ago'; + if (delta < 0) delta *= -1; + + var units = { + minute: 60, + hour: 60, + day: 24, + week: 7, + month: 52 / 12, + year: 12, + eon: Infinity + }; + + var msg = 'lessThanMinute'; + + for (var unit in units){ + var interval = units[unit]; + if (delta < 1.5 * interval){ + if (delta > 0.75 * interval) msg = unit; + break; + } + delta /= interval; + msg = unit + 's'; + } + + delta = delta.round(); + return Date.getMsg(msg + suffix, delta).substitute({delta: delta}); + } + +}).defineParsers( + + { + // "today", "tomorrow", "yesterday" + re: /^(?:tod|tom|yes)/i, + handler: function(bits){ + var d = new Date().clearTime(); + switch (bits[0]){ + case 'tom': return d.increment(); + case 'yes': return d.decrement(); + default: return d; + } + } + }, + + { + // "next Wednesday", "last Thursday" + re: /^(next|last) ([a-z]+)$/i, + handler: function(bits){ + var d = new Date().clearTime(); + var day = d.getDay(); + var newDay = Date.parseDay(bits[2], true); + var addDays = newDay - day; + if (newDay <= day) addDays += 7; + if (bits[1] == 'last') addDays -= 7; + return d.set('date', d.getDate() + addDays); + } + } + +).alias('timeAgoInWords', 'timeDiffInWords'); + + +/* +--- + +name: Hash + +description: Contains Hash Prototypes. Provides a means for overcoming the JavaScript practical impossibility of extending native Objects. + +license: MIT-style license. + +requires: + - Core/Object + - /MooTools.More + +provides: [Hash] + +... +*/ + +(function(){ + +if (this.Hash) return; + +var Hash = this.Hash = new Type('Hash', function(object){ + if (typeOf(object) == 'hash') object = Object.clone(object.getClean()); + for (var key in object) this[key] = object[key]; + return this; +}); + +this.$H = function(object){ + return new Hash(object); +}; + +Hash.implement({ + + forEach: function(fn, bind){ + Object.forEach(this, fn, bind); + }, + + getClean: function(){ + var clean = {}; + for (var key in this){ + if (this.hasOwnProperty(key)) clean[key] = this[key]; + } + return clean; + }, + + getLength: function(){ + var length = 0; + for (var key in this){ + if (this.hasOwnProperty(key)) length++; + } + return length; + } + +}); + +Hash.alias('each', 'forEach'); + +Hash.implement({ + + has: Object.prototype.hasOwnProperty, + + keyOf: function(value){ + return Object.keyOf(this, value); + }, + + hasValue: function(value){ + return Object.contains(this, value); + }, + + extend: function(properties){ + Hash.each(properties || {}, function(value, key){ + Hash.set(this, key, value); + }, this); + return this; + }, + + combine: function(properties){ + Hash.each(properties || {}, function(value, key){ + Hash.include(this, key, value); + }, this); + return this; + }, + + erase: function(key){ + if (this.hasOwnProperty(key)) delete this[key]; + return this; + }, + + get: function(key){ + return (this.hasOwnProperty(key)) ? this[key] : null; + }, + + set: function(key, value){ + if (!this[key] || this.hasOwnProperty(key)) this[key] = value; + return this; + }, + + empty: function(){ + Hash.each(this, function(value, key){ + delete this[key]; + }, this); + return this; + }, + + include: function(key, value){ + if (this[key] == undefined) this[key] = value; + return this; + }, + + map: function(fn, bind){ + return new Hash(Object.map(this, fn, bind)); + }, + + filter: function(fn, bind){ + return new Hash(Object.filter(this, fn, bind)); + }, + + every: function(fn, bind){ + return Object.every(this, fn, bind); + }, + + some: function(fn, bind){ + return Object.some(this, fn, bind); + }, + + getKeys: function(){ + return Object.keys(this); + }, + + getValues: function(){ + return Object.values(this); + }, + + toQueryString: function(base){ + return Object.toQueryString(this, base); + } + +}); + +Hash.alias({indexOf: 'keyOf', contains: 'hasValue'}); + + +}).call(this); + + + +/* +--- + +script: Request.JSONP.js + +name: Request.JSONP + +description: Defines Request.JSONP, a class for cross domain javascript via script injection. + +license: MIT-style license + +authors: + - Aaron Newton + - Guillermo Rauch + - Arian Stolwijk + +requires: + - Core/Element + - Core/Request + - MooTools.More + +provides: [Request.JSONP] + +... +*/ + +Request.JSONP = new Class({ + + Implements: [Chain, Events, Options], + + options: { + /* + onRequest: function(src, scriptElement){}, + onComplete: function(data){}, + onSuccess: function(data){}, + onCancel: function(){}, + onTimeout: function(){}, + onError: function(){}, */ + onRequest: function(src){ + if (this.options.log && window.console && console.log){ + console.log('JSONP retrieving script with url:' + src); + } + }, + onError: function(src){ + if (this.options.log && window.console && console.warn){ + console.warn('JSONP '+ src +' will fail in Internet Explorer, which enforces a 2083 bytes length limit on URIs'); + } + }, + url: '', + callbackKey: 'callback', + injectScript: document.head, + data: '', + link: 'ignore', + timeout: 0, + log: false + }, + + initialize: function(options){ + this.setOptions(options); + }, + + send: function(options){ + if (!Request.prototype.check.call(this, options)) return this; + this.running = true; + + var type = typeOf(options); + if (type == 'string' || type == 'element') options = {data: options}; + options = Object.merge(this.options, options || {}); + + var data = options.data; + switch (typeOf(data)){ + case 'element': data = document.id(data).toQueryString(); break; + case 'object': case 'hash': data = Object.toQueryString(data); + } + + var index = this.index = Request.JSONP.counter++; + + var src = options.url + + (options.url.test('\\?') ? '&' :'?') + + (options.callbackKey) + + '=Request.JSONP.request_map.request_'+ index + + (data ? '&' + data : ''); + + if (src.length > 2083) this.fireEvent('error', src); + + Request.JSONP.request_map['request_' + index] = function(){ + this.success(arguments, index); + }.bind(this); + + var script = this.getScript(src).inject(options.injectScript); + this.fireEvent('request', [src, script]); + + if (options.timeout) this.timeout.delay(options.timeout, this); + + return this; + }, + + getScript: function(src){ + if (!this.script) this.script = new Element('script[type=text/javascript]', { + async: true, + src: src + }); + return this.script; + }, + + success: function(args, index){ + if (!this.running) return false; + this.clear() + .fireEvent('complete', args).fireEvent('success', args) + .callChain(); + }, + + cancel: function(){ + if (this.running) this.clear().fireEvent('cancel'); + return this; + }, + + isRunning: function(){ + return !!this.running; + }, + + clear: function(){ + this.running = false; + if (this.script){ + this.script.destroy(); + this.script = null; + } + return this; + }, + + timeout: function(){ + if (this.running){ + this.running = false; + this.fireEvent('timeout', [this.script.get('src'), this.script]).fireEvent('failure').cancel(); + } + return this; + } + +}); + +Request.JSONP.counter = 0; +Request.JSONP.request_map = {}; + + diff --git a/source/javascripts/mootools-yui-compressed.js b/source/javascripts/mootools-yui-compressed.js index e4e214b..a20f066 100644 --- a/source/javascripts/mootools-yui-compressed.js +++ b/source/javascripts/mootools-yui-compressed.js @@ -1,356 +1,5492 @@ -//MooTools, , My Object Oriented (JavaScript) Tools. Copyright (c) 2006-2009 Valerio Proietti, , MIT Style License. - -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; -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"}; -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; -}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); -}}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); -}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); -return b.prototype[c].apply(d.shift(),d);};}};Native.implement=function(d,c){for(var b=0,a=d.length;b-1:this.indexOf(a)>-1;},trim:function(){return this.replace(/^\s+|\s+$/g,"");},clean:function(){return this.replace(/\s+/g," ").trim(); -},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()); -});},capitalize:function(){return this.replace(/\b[a-z]/g,function(a){return a.toUpperCase();});},escapeRegExp:function(){return this.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1"); -},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})$/); -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=""; -var c=this.replace(/]*>([\s\S]*?)<\/script>/gi,function(){a+=arguments[1]+"\n";return"";});if(b===true){$exec(a);}else{if($type(b)=="function"){b(a,c); -}}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]:""; -});}});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; -},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); -},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; -},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); -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)); -},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; -}}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=[]; -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=[]; -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; -});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"}); -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; -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; -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; -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}; -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; -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; -}}}}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}); -}});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(); -},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(); -}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; -}this._current=$empty;var c=(this.initialize)?this.initialize.apply(this,arguments):this;delete this._current;delete this.caller;return c;}.extend(this); -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); -}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]); -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; -},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.'); -}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}); -}});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); -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]; -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; -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.'); -}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); -},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; -},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]||[]; -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); -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); -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]); -}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]); -}}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)); -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]); -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); -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; -if(Array[a]){return;}Elements.implement(a,function(){var c=[],g=true;for(var e=0,d=this.length;e";}return document.id(this.createElement(a)).set(b);},newTextNode:function(a){return this.createTextNode(a); -},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; -},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); -}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; -};})()});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); -}var f=[];var c=Array.flatten(arguments);for(var d=0,b=c.length;d1);a.each(function(e){var f=this.getElementsByTagName(e.trim());(b)?c.extend(f):c=f; -},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"}; -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); -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; -}}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); -}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); -}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"}; -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"]; -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); -}},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); -},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)); -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]); -}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); -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); -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); -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); -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]; -(l)?this[l]=(l&&b[m])?false:"":this.removeAttribute(m);return this;},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this; -},hasClass:function(l){return this.className.contains(l," ");},addClass:function(l){if(!this.hasClass(l)){this.className=(this.className+" "+l).clean(); -}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); -},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); -},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); -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); -},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); -},getFirst:function(l,m){return j(this,"nextSibling","firstChild",l,false,m);},getLast:function(l,m){return j(this,"previousSibling","lastChild",l,false,m); -},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); -},getChildren:function(l,m){return j(this,"nextSibling","firstChild",l,true,m);},getWindow:function(){return this.ownerDocument.window;},getDocument:function(){return this.ownerDocument; -},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; -}}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()]; -}var l=this.getDocument().defaultView.getComputedStyle(this,null);return(l)?l.getPropertyValue([m.hyphenate()]):null;},toQueryString:function(){var l=[]; -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; -}):((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)); -}});});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(); -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()]; -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); -},destroy:function(){Element.empty(this);Element.dispose(this);g(this,true);return null;},empty:function(){$A(this.childNodes).each(function(l){Element.destroy(l); -});return this;},dispose:function(){return(this.parentNode)?this.parentNode.removeChild(this):this;},hasChild:function(l){l=document.id(l,true);if(!l){return false; -}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); -},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; -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); -}return this;},removeListener:function(m,l){if(this.removeEventListener){this.removeEventListener(m,l,false);}else{this.detachEvent("on"+m,l);}return this; -},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; -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; -},get:function(){return this.style.cssText;},erase:function(){this.style.cssText="";}};Element.Properties.tag={get:function(){return this.tagName.toLowerCase(); -}};Element.Properties.html=(function(){var c=document.createElement("div");var a={table:[1,"","
    "],select:[1,""],tbody:[2,"","
    "],tr:[3,"","
    "]}; -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]; -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; -}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); -}};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; -}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); -}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()); -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; -}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); -}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; -},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; -}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; -},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})(); -},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); -}}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}; -(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)); -};Element.Events=new Hash({mouseenter:{base:"mouseover",condition:a},mouseleave:{base:"mouseout",condition:a},mousewheel:{base:(Browser.Engine.gecko)?"DOMMouseScroll":"mousewheel"}}); -})();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"; -}}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+")"; -}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); -},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"; -}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; -}).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"); -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; -}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,]+\)/); -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; -b.each(function(h){d+=this.getStyle("border-"+h+"-width").toInt()+this.getStyle("padding-"+h).toInt();},this);return this["offset"+g.capitalize()]-d+"px"; -}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]); -}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:"@"}); -Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};["Top","Right","Bottom","Left"].each(function(g){var f=Element.ShortStyles; -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"; -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); -}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}; -},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(); -}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; -}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; -}}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"); -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; -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); -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}; -}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}; -},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}; -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")}; -},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(); -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); -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)}; -},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}; -}});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"); -}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; -}})();Element.alias("setPosition","position");Native.implement([Window,Document,Element],{getHeight:function(){return this.getSize().y;},getWidth:function(){return this.getSize().x; -},getScrollTop:function(){return this.getScroll().y;},getScrollLeft:function(){return this.getScroll().x;},getScrollHeight:function(){return this.getScrollSize().y; -},getScrollWidth:function(){return this.getScrollSize().x;},getTop:function(){return this.getPosition().y;},getLeft:function(){return this.getPosition().x; -}});Native.implement([Document,Element],{getElements:function(h,g){h=h.split(",");var c,e={};for(var d=0,b=h.length;d1),cash:!g});}});Element.implement({match:function(b){if(!b||(b==this)){return true; -}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); -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)}; -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]; -}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; -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"}; -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"}; -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]; -}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); -}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}); -}}}}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; -}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]; -},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; -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]; -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); -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); -return":)"+i;}).split(":)");var p,e,A;for(var z=0,v=c.length;z":function(h,g,j,a,f){var c=Selectors.Utils.getByTagAndID(g,j,a);for(var e=0,d=c.length;ea){return false;}}return(c==a);},even:function(b,a){return Selectors.Pseudo["nth-child"].call(this,"2n+1",a); -},odd:function(b,a){return Selectors.Pseudo["nth-child"].call(this,"2n",a);},selected:function(){return this.selected;},enabled:function(){return(this.disabled===false); -}});Element.Events.domready={onAdd:function(a){if(Browser.loaded){a.call(this);}}};(function(){var b=function(){if(Browser.loaded){return;}Browser.loaded=true; -window.fireEvent("domready");document.fireEvent("domready");};if(Browser.Engine.trident){var a=document.createElement("div");(function(){($try(function(){a.doScroll(); -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); -})();}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); -},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())+"]"; -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); -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; -}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; -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; -}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"; -}this.options.document.cookie=this.key+"="+b;return this;},read:function(){var a=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)"); -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); -};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; -},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); -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); -};})(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"; -e.movie=l;}else{h.type="application/x-shockwave-flash";h.data=l;}var j=''; -}}j+="";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); -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)); -}});Swiff.CallBacks={};Swiff.remote=function(obj,fn){var rs=obj.CallFunction(''+__flash__argumentsToXML(arguments,2)+""); -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; -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"; -}},getTransition:function(){return function(a){return -(Math.cos(Math.PI*a)-1)/2;};},step:function(){var a=$time();if(a=(7-4*d)/11){e=c*c-Math.pow((11-6*d-11*f)/4,2); -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]); -});});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(); -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; -}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}; -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)); -},processScripts:function(a){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return $exec(a);}return a.stripScripts(this.options.evalScripts); -},success:function(b,a){this.onSuccess(this.processScripts(b),a);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain(); -},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},setHeader:function(a,b){this.headers.set(a,b); -return this;},getHeader:function(a){return $try(function(){return this.xhr.getResponseHeader(a);}.bind(this));},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(k){if(!this.check(k)){return this; -}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(); -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; -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:""; -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; -}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); -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]); -}},this);this.fireEvent("request");this.xhr.send(g);if(!this.options.async){this.onStateChange();}return this;},cancel:function(){if(!this.running){return this; -}this.running=false;this.xhr.abort();this.xhr.onreadystatechange=$empty;this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});(function(){var a={}; -["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(b){a[b]=function(){var c=Array.link(arguments,{url:String.type,data:$defined}); -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(); -}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); -}this.store("send",new Request(this.retrieve("send:options")));}return this.retrieve("send");}};Element.implement({send:function(a){var b=this.get("send"); -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(/]*>([\s\S]*?)<\/body>/i); -c=(b)?b[1]:c;var a=new Element("div");return $try(function(){var d=""+c+"",g;if(Browser.Engine.trident){g=new ActiveXObject("Microsoft.XMLDOM"); -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; -f 1) args = arguments; + if (args){ + result = {}; + for (var i = 0; i < args.length; i++) result[args[i]] = self.call(this, args[i]); + } else { + result = self.call(this, a); + } + return result; + }; +}; + +Function.prototype.extend = function(key, value){ + this[key] = value; +}.overloadSetter(); + +Function.prototype.implement = function(key, value){ + this.prototype[key] = value; +}.overloadSetter(); + +// From + +var slice = Array.prototype.slice; + +Function.from = function(item){ + return (typeOf(item) == 'function') ? item : function(){ + return item; + }; +}; + +Array.from = function(item){ + if (item == null) return []; + return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item]; +}; + +Number.from = function(item){ + var number = parseFloat(item); + return isFinite(number) ? number : null; +}; + +String.from = function(item){ + return item + ''; +}; + +// hide, protect + +Function.implement({ + + hide: function(){ + this.$hidden = true; + return this; + }, + + protect: function(){ + this.$protected = true; + return this; + } + +}); + +// Type + +var Type = this.Type = function(name, object){ + if (name){ + var lower = name.toLowerCase(); + var typeCheck = function(item){ + return (typeOf(item) == lower); + }; + + Type['is' + name] = typeCheck; + if (object != null){ + object.prototype.$family = (function(){ + return lower; + }).hide(); + + } + } + + if (object == null) return null; + + object.extend(this); + object.$constructor = Type; + object.prototype.$constructor = object; + + return object; +}; + +var toString = Object.prototype.toString; + +Type.isEnumerable = function(item){ + return (item != null && typeof item.length == 'number' && toString.call(item) != '[object Function]' ); +}; + +var hooks = {}; + +var hooksOf = function(object){ + var type = typeOf(object.prototype); + return hooks[type] || (hooks[type] = []); +}; + +var implement = function(name, method){ + if (method && method.$hidden) return; + + var hooks = hooksOf(this); + + for (var i = 0; i < hooks.length; i++){ + var hook = hooks[i]; + if (typeOf(hook) == 'type') implement.call(hook, name, method); + else hook.call(this, name, method); + } + + var previous = this.prototype[name]; + if (previous == null || !previous.$protected) this.prototype[name] = method; + + if (this[name] == null && typeOf(method) == 'function') extend.call(this, name, function(item){ + return method.apply(item, slice.call(arguments, 1)); + }); +}; + +var extend = function(name, method){ + if (method && method.$hidden) return; + var previous = this[name]; + if (previous == null || !previous.$protected) this[name] = method; +}; + +Type.implement({ + + implement: implement.overloadSetter(), + + extend: extend.overloadSetter(), + + alias: function(name, existing){ + implement.call(this, name, this.prototype[existing]); + }.overloadSetter(), + + mirror: function(hook){ + hooksOf(this).push(hook); + return this; + } + +}); + +new Type('Type', Type); + +// Default Types + +var force = function(name, object, methods){ + var isType = (object != Object), + prototype = object.prototype; + + if (isType) object = new Type(name, object); + + for (var i = 0, l = methods.length; i < l; i++){ + var key = methods[i], + generic = object[key], + proto = prototype[key]; + + if (generic) generic.protect(); + + if (isType && proto){ + delete prototype[key]; + prototype[key] = proto.protect(); + } + } + + if (isType) object.implement(prototype); + + return force; +}; + +force('String', String, [ + 'charAt', 'charCodeAt', 'concat', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search', + 'slice', 'split', 'substr', 'substring', 'toLowerCase', 'toUpperCase' +])('Array', Array, [ + 'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice', + 'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight' +])('Number', Number, [ + 'toExponential', 'toFixed', 'toLocaleString', 'toPrecision' +])('Function', Function, [ + 'apply', 'call', 'bind' +])('RegExp', RegExp, [ + 'exec', 'test' +])('Object', Object, [ + 'create', 'defineProperty', 'defineProperties', 'keys', + 'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames', + 'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen' +])('Date', Date, ['now']); + +Object.extend = extend.overloadSetter(); + +Date.extend('now', function(){ + return +(new Date); +}); + +new Type('Boolean', Boolean); + +// fixes NaN returning as Number + +Number.prototype.$family = function(){ + return isFinite(this) ? 'number' : 'null'; +}.hide(); + +// Number.random + +Number.extend('random', function(min, max){ + return Math.floor(Math.random() * (max - min + 1) + min); +}); + +// forEach, each + +var hasOwnProperty = Object.prototype.hasOwnProperty; +Object.extend('forEach', function(object, fn, bind){ + for (var key in object){ + if (hasOwnProperty.call(object, key)) fn.call(bind, object[key], key, object); + } +}); + +Object.each = Object.forEach; + +Array.implement({ + + forEach: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++){ + if (i in this) fn.call(bind, this[i], i, this); + } + }, + + each: function(fn, bind){ + Array.forEach(this, fn, bind); + return this; + } + +}); + +// Array & Object cloning, Object merging and appending + +var cloneOf = function(item){ + switch (typeOf(item)){ + case 'array': return item.clone(); + case 'object': return Object.clone(item); + default: return item; + } +}; + +Array.implement('clone', function(){ + var i = this.length, clone = new Array(i); + while (i--) clone[i] = cloneOf(this[i]); + return clone; +}); + +var mergeOne = function(source, key, current){ + switch (typeOf(current)){ + case 'object': + if (typeOf(source[key]) == 'object') Object.merge(source[key], current); + else source[key] = Object.clone(current); + break; + case 'array': source[key] = current.clone(); break; + default: source[key] = current; + } + return source; +}; + +Object.extend({ + + merge: function(source, k, v){ + if (typeOf(k) == 'string') return mergeOne(source, k, v); + for (var i = 1, l = arguments.length; i < l; i++){ + var object = arguments[i]; + for (var key in object) mergeOne(source, key, object[key]); + } + return source; + }, + + clone: function(object){ + var clone = {}; + for (var key in object) clone[key] = cloneOf(object[key]); + return clone; + }, + + append: function(original){ + for (var i = 1, l = arguments.length; i < l; i++){ + var extended = arguments[i] || {}; + for (var key in extended) original[key] = extended[key]; + } + return original; + } + +}); + +// Object-less types + +['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each(function(name){ + new Type(name); +}); + +// Unique ID + +var UID = Date.now(); + +String.extend('uniqueID', function(){ + return (UID++).toString(36); +}); + + + +}).call(this); + + +/* +--- + +name: Array + +description: Contains Array Prototypes like each, contains, and erase. + +license: MIT-style license. + +requires: Type + +provides: Array + +... +*/ + +Array.implement({ + + invoke: function(methodName){ + var args = Array.slice(arguments, 1); + return this.map(function(item){ + return item[methodName].apply(item, args); + }); + }, + + every: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++){ + if ((i in this) && !fn.call(bind, this[i], i, this)) return false; + } + return true; + }, + + filter: function(fn, bind){ + var results = []; + for (var i = 0, l = this.length; i < l; i++){ + if ((i in this) && fn.call(bind, this[i], i, this)) results.push(this[i]); + } + return results; + }, + + clean: function(){ + return this.filter(function(item){ + return item != null; + }); + }, + + indexOf: function(item, from){ + var len = this.length; + for (var i = (from < 0) ? Math.max(0, len + from) : from || 0; i < len; i++){ + if (this[i] === item) return i; + } + return -1; + }, + + map: function(fn, bind){ + var results = []; + for (var i = 0, l = this.length; i < l; i++){ + if (i in this) results[i] = fn.call(bind, this[i], i, this); + } + return results; + }, + + some: function(fn, bind){ + for (var i = 0, l = this.length; i < l; i++){ + if ((i in this) && fn.call(bind, this[i], i, this)) return true; + } + return false; + }, + + associate: function(keys){ + var obj = {}, length = Math.min(this.length, keys.length); + for (var i = 0; i < length; i++) obj[keys[i]] = this[i]; + return obj; + }, + + link: function(object){ + var result = {}; + for (var i = 0, l = this.length; i < l; i++){ + for (var key in object){ + if (object[key](this[i])){ + result[key] = this[i]; + delete object[key]; + break; + } + } + } + return result; + }, + + contains: function(item, from){ + return this.indexOf(item, from) != -1; + }, + + append: function(array){ + this.push.apply(this, array); + return this; + }, + + getLast: function(){ + return (this.length) ? this[this.length - 1] : null; + }, + + getRandom: function(){ + return (this.length) ? this[Number.random(0, this.length - 1)] : null; + }, + + include: function(item){ + if (!this.contains(item)) this.push(item); + return this; + }, + + combine: function(array){ + for (var i = 0, l = array.length; i < l; i++) this.include(array[i]); + return this; + }, + + erase: function(item){ + for (var i = this.length; i--;){ + if (this[i] === item) this.splice(i, 1); + } + return this; + }, + + empty: function(){ + this.length = 0; + return this; + }, + + flatten: function(){ + var array = []; + for (var i = 0, l = this.length; i < l; i++){ + var type = typeOf(this[i]); + if (type == 'null') continue; + array = array.concat((type == 'array' || type == 'collection' || type == 'arguments' || instanceOf(this[i], Array)) ? Array.flatten(this[i]) : this[i]); + } + return array; + }, + + pick: function(){ + for (var i = 0, l = this.length; i < l; i++){ + if (this[i] != null) return this[i]; + } + return null; + }, + + hexToRgb: function(array){ + if (this.length != 3) return null; + var rgb = this.map(function(value){ + if (value.length == 1) value += value; + return value.toInt(16); + }); + return (array) ? rgb : 'rgb(' + rgb + ')'; + }, + + rgbToHex: function(array){ + if (this.length < 3) return null; + if (this.length == 4 && this[3] == 0 && !array) return 'transparent'; + var hex = []; + for (var i = 0; i < 3; i++){ + var bit = (this[i] - 0).toString(16); + hex.push((bit.length == 1) ? '0' + bit : bit); + } + return (array) ? hex : '#' + hex.join(''); + } + +}); + + + + +/* +--- + +name: String + +description: Contains String Prototypes like camelCase, capitalize, test, and toInt. + +license: MIT-style license. + +requires: Type + +provides: String + +... +*/ + +String.implement({ + + test: function(regex, params){ + return ((typeOf(regex) == 'regexp') ? regex : new RegExp('' + regex, params)).test(this); + }, + + contains: function(string, separator){ + return (separator) ? (separator + this + separator).indexOf(separator + string + separator) > -1 : this.indexOf(string) > -1; + }, + + trim: function(){ + return this.replace(/^\s+|\s+$/g, ''); + }, + + clean: function(){ + return this.replace(/\s+/g, ' ').trim(); + }, + + camelCase: function(){ + return this.replace(/-\D/g, function(match){ + return match.charAt(1).toUpperCase(); + }); + }, + + hyphenate: function(){ + return this.replace(/[A-Z]/g, function(match){ + return ('-' + match.charAt(0).toLowerCase()); + }); + }, + + capitalize: function(){ + return this.replace(/\b[a-z]/g, function(match){ + return match.toUpperCase(); + }); + }, + + escapeRegExp: function(){ + return this.replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1'); + }, + + toInt: function(base){ + return parseInt(this, base || 10); + }, + + toFloat: function(){ + return parseFloat(this); + }, + + hexToRgb: function(array){ + var hex = this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/); + return (hex) ? hex.slice(1).hexToRgb(array) : null; + }, + + rgbToHex: function(array){ + var rgb = this.match(/\d{1,3}/g); + return (rgb) ? rgb.rgbToHex(array) : null; + }, + + substitute: function(object, regexp){ + return this.replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){ + if (match.charAt(0) == '\\') return match.slice(1); + return (object[name] != null) ? object[name] : ''; + }); + } + +}); + + +/* +--- + +name: Number + +description: Contains Number Prototypes like limit, round, times, and ceil. + +license: MIT-style license. + +requires: Type + +provides: Number + +... +*/ + +Number.implement({ + + limit: function(min, max){ + return Math.min(max, Math.max(min, this)); + }, + + round: function(precision){ + precision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0); + return Math.round(this * precision) / precision; + }, + + times: function(fn, bind){ + for (var i = 0; i < this; i++) fn.call(bind, i, this); + }, + + toFloat: function(){ + return parseFloat(this); + }, + + toInt: function(base){ + return parseInt(this, base || 10); + } + +}); + +Number.alias('each', 'times'); + +(function(math){ + var methods = {}; + math.each(function(name){ + if (!Number[name]) methods[name] = function(){ + return Math[name].apply(null, [this].concat(Array.from(arguments))); + }; + }); + Number.implement(methods); +})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']); + + +/* +--- + +name: Function + +description: Contains Function Prototypes like create, bind, pass, and delay. + +license: MIT-style license. + +requires: Type + +provides: Function + +... +*/ + +Function.extend({ + + attempt: function(){ + for (var i = 0, l = arguments.length; i < l; i++){ + try { + return arguments[i](); + } catch (e){} + } + return null; + } + +}); + +Function.implement({ + + attempt: function(args, bind){ + try { + return this.apply(bind, Array.from(args)); + } catch (e){} + + return null; + }, + + bind: function(bind){ + var self = this, + args = (arguments.length > 1) ? Array.slice(arguments, 1) : null; + + return function(){ + if (!args && !arguments.length) return self.call(bind); + if (args && arguments.length) return self.apply(bind, args.concat(Array.from(arguments))); + return self.apply(bind, args || arguments); + }; + }, + + pass: function(args, bind){ + var self = this; + if (args != null) args = Array.from(args); + return function(){ + return self.apply(bind, args || arguments); + }; + }, + + delay: function(delay, bind, args){ + return setTimeout(this.pass((args == null ? [] : args), bind), delay); + }, + + periodical: function(periodical, bind, args){ + return setInterval(this.pass((args == null ? [] : args), bind), periodical); + } + +}); + + + + +/* +--- + +name: Object + +description: Object generic methods + +license: MIT-style license. + +requires: Type + +provides: [Object, Hash] + +... +*/ + +(function(){ + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +Object.extend({ + + subset: function(object, keys){ + var results = {}; + for (var i = 0, l = keys.length; i < l; i++){ + var k = keys[i]; + results[k] = object[k]; + } + return results; + }, + + map: function(object, fn, bind){ + var results = {}; + for (var key in object){ + if (hasOwnProperty.call(object, key)) results[key] = fn.call(bind, object[key], key, object); + } + return results; + }, + + filter: function(object, fn, bind){ + var results = {}; + Object.each(object, function(value, key){ + if (fn.call(bind, value, key, object)) results[key] = value; + }); + return results; + }, + + every: function(object, fn, bind){ + for (var key in object){ + if (hasOwnProperty.call(object, key) && !fn.call(bind, object[key], key)) return false; + } + return true; + }, + + some: function(object, fn, bind){ + for (var key in object){ + if (hasOwnProperty.call(object, key) && fn.call(bind, object[key], key)) return true; + } + return false; + }, + + keys: function(object){ + var keys = []; + for (var key in object){ + if (hasOwnProperty.call(object, key)) keys.push(key); + } + return keys; + }, + + values: function(object){ + var values = []; + for (var key in object){ + if (hasOwnProperty.call(object, key)) values.push(object[key]); + } + return values; + }, + + getLength: function(object){ + return Object.keys(object).length; + }, + + keyOf: function(object, value){ + for (var key in object){ + if (hasOwnProperty.call(object, key) && object[key] === value) return key; + } + return null; + }, + + contains: function(object, value){ + return Object.keyOf(object, value) != null; + }, + + toQueryString: function(object, base){ + var queryString = []; + + Object.each(object, function(value, key){ + if (base) key = base + '[' + key + ']'; + var result; + switch (typeOf(value)){ + case 'object': result = Object.toQueryString(value, key); break; + case 'array': + var qs = {}; + value.each(function(val, i){ + qs[i] = val; + }); + result = Object.toQueryString(qs, key); + break; + default: result = key + '=' + encodeURIComponent(value); + } + if (value != null) queryString.push(result); + }); + + return queryString.join('&'); + } + +}); + +})(); + + + + +/* +--- + +name: Browser + +description: The Browser Object. Contains Browser initialization, Window and Document, and the Browser Hash. + +license: MIT-style license. + +requires: [Array, Function, Number, String] + +provides: [Browser, Window, Document] + +... +*/ + +(function(){ + +var document = this.document; +var window = document.window = this; + +var UID = 1; + +this.$uid = (window.ActiveXObject) ? function(item){ + return (item.uid || (item.uid = [UID++]))[0]; +} : function(item){ + return item.uid || (item.uid = UID++); +}; + +$uid(window); +$uid(document); + +var ua = navigator.userAgent.toLowerCase(), + platform = navigator.platform.toLowerCase(), + UA = ua.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/) || [null, 'unknown', 0], + mode = UA[1] == 'ie' && document.documentMode; + +var Browser = this.Browser = { + + extend: Function.prototype.extend, + + name: (UA[1] == 'version') ? UA[3] : UA[1], + + version: mode || parseFloat((UA[1] == 'opera' && UA[4]) ? UA[4] : UA[2]), + + Platform: { + name: ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || platform.match(/mac|win|linux/) || ['other'])[0] + }, + + Features: { + xpath: !!(document.evaluate), + air: !!(window.runtime), + query: !!(document.querySelector), + json: !!(window.JSON) + }, + + Plugins: {} + +}; + +Browser[Browser.name] = true; +Browser[Browser.name + parseInt(Browser.version, 10)] = true; +Browser.Platform[Browser.Platform.name] = true; + +// Request + +Browser.Request = (function(){ + + var XMLHTTP = function(){ + return new XMLHttpRequest(); + }; + + var MSXML2 = function(){ + return new ActiveXObject('MSXML2.XMLHTTP'); + }; + + var MSXML = function(){ + return new ActiveXObject('Microsoft.XMLHTTP'); + }; + + return Function.attempt(function(){ + XMLHTTP(); + return XMLHTTP; + }, function(){ + MSXML2(); + return MSXML2; + }, function(){ + MSXML(); + return MSXML; + }); + +})(); + +Browser.Features.xhr = !!(Browser.Request); + +// Flash detection + +var version = (Function.attempt(function(){ + return navigator.plugins['Shockwave Flash'].description; +}, function(){ + return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version'); +}) || '0 r0').match(/\d+/g); + +Browser.Plugins.Flash = { + version: Number(version[0] || '0.' + version[1]) || 0, + build: Number(version[2]) || 0 +}; + +// String scripts + +Browser.exec = function(text){ + if (!text) return text; + if (window.execScript){ + window.execScript(text); + } else { + var script = document.createElement('script'); + script.setAttribute('type', 'text/javascript'); + script.text = text; + document.head.appendChild(script); + document.head.removeChild(script); + } + return text; +}; + +String.implement('stripScripts', function(exec){ + var scripts = ''; + var text = this.replace(/]*>([\s\S]*?)<\/script>/gi, function(all, code){ + scripts += code + '\n'; + return ''; + }); + if (exec === true) Browser.exec(scripts); + else if (typeOf(exec) == 'function') exec(scripts, text); + return text; +}); + +// Window, Document + +Browser.extend({ + Document: this.Document, + Window: this.Window, + Element: this.Element, + Event: this.Event +}); + +this.Window = this.$constructor = new Type('Window', function(){}); + +this.$family = Function.from('window').hide(); + +Window.mirror(function(name, method){ + window[name] = method; +}); + +this.Document = document.$constructor = new Type('Document', function(){}); + +document.$family = Function.from('document').hide(); + +Document.mirror(function(name, method){ + document[name] = method; +}); + +document.html = document.documentElement; +document.head = document.getElementsByTagName('head')[0]; + +if (document.execCommand) try { + document.execCommand("BackgroundImageCache", false, true); +} catch (e){} + +if (this.attachEvent && !this.addEventListener){ + var unloadEvent = function(){ + this.detachEvent('onunload', unloadEvent); + document.head = document.html = document.window = null; + }; + this.attachEvent('onunload', unloadEvent); +} + +// IE fails on collections and ) +var arrayFrom = Array.from; +try { + arrayFrom(document.html.childNodes); +} catch(e){ + Array.from = function(item){ + if (typeof item != 'string' && Type.isEnumerable(item) && typeOf(item) != 'array'){ + var i = item.length, array = new Array(i); + while (i--) array[i] = item[i]; + return array; + } + return arrayFrom(item); + }; + + var prototype = Array.prototype, + slice = prototype.slice; + ['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice'].each(function(name){ + var method = prototype[name]; + Array[name] = function(item){ + return method.apply(Array.from(item), slice.call(arguments, 1)); + }; + }); +} + + + +}).call(this); + + +/* +--- + +name: Event + +description: Contains the Event Class, to make the event object cross-browser. + +license: MIT-style license. + +requires: [Window, Document, Array, Function, String, Object] + +provides: Event + +... +*/ + +var Event = new Type('Event', function(event, win){ + if (!win) win = window; + var doc = win.document; + event = event || win.event; + if (event.$extended) return event; + this.$extended = true; + var type = event.type, + target = event.target || event.srcElement, + page = {}, + client = {}, + related = null, + rightClick, wheel, code, key; + while (target && target.nodeType == 3) target = target.parentNode; + + if (type.indexOf('key') != -1){ + code = event.which || event.keyCode; + key = Object.keyOf(Event.Keys, code); + if (type == 'keydown'){ + var fKey = code - 111; + if (fKey > 0 && fKey < 13) key = 'f' + fKey; + } + if (!key) key = String.fromCharCode(code).toLowerCase(); + } else if ((/click|mouse|menu/i).test(type)){ + doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; + page = { + x: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft, + y: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop + }; + client = { + x: (event.pageX != null) ? event.pageX - win.pageXOffset : event.clientX, + y: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY + }; + if ((/DOMMouseScroll|mousewheel/).test(type)){ + wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3; + } + rightClick = (event.which == 3) || (event.button == 2); + if ((/over|out/).test(type)){ + related = event.relatedTarget || event[(type == 'mouseover' ? 'from' : 'to') + 'Element']; + var testRelated = function(){ + while (related && related.nodeType == 3) related = related.parentNode; + return true; + }; + var hasRelated = (Browser.firefox2) ? testRelated.attempt() : testRelated(); + related = (hasRelated) ? related : null; + } + } else if ((/gesture|touch/i).test(type)){ + this.rotation = event.rotation; + this.scale = event.scale; + this.targetTouches = event.targetTouches; + this.changedTouches = event.changedTouches; + var touches = this.touches = event.touches; + if (touches && touches[0]){ + var touch = touches[0]; + page = {x: touch.pageX, y: touch.pageY}; + client = {x: touch.clientX, y: touch.clientY}; + } + } + + return Object.append(this, { + event: event, + type: type, + + page: page, + client: client, + rightClick: rightClick, + + wheel: wheel, + + relatedTarget: document.id(related), + target: document.id(target), + + code: code, + key: key, + + shift: event.shiftKey, + control: event.ctrlKey, + alt: event.altKey, + meta: event.metaKey + }); +}); + +Event.Keys = { + '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(); + }, + + 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(); + else this.event.returnValue = false; + return this; + } + +}); + + +/* +--- + +name: Class + +description: Contains the Class Function for easily creating, extending, and implementing reusable Classes. + +license: MIT-style license. + +requires: [Array, String, Function, Number] + +provides: Class + +... +*/ + +(function(){ + +var Class = this.Class = new Type('Class', function(params){ + if (instanceOf(params, Function)) params = {initialize: params}; + + var newClass = function(){ + reset(this); + if (newClass.$prototyping) return this; + this.$caller = null; + var value = (this.initialize) ? this.initialize.apply(this, arguments) : this; + this.$caller = this.caller = null; + return value; + }.extend(this).implement(params); + + newClass.$constructor = Class; + newClass.prototype.$constructor = newClass; + newClass.prototype.parent = parent; + + return newClass; +}); + +var parent = function(){ + if (!this.$caller) throw new Error('The method "parent" cannot be called.'); + var name = this.$caller.$name, + parent = this.$caller.$owner.parent, + previous = (parent) ? parent.prototype[name] : null; + if (!previous) throw new Error('The method "' + name + '" has no parent.'); + return previous.apply(this, arguments); +}; + +var reset = function(object){ + for (var key in object){ + var value = object[key]; + switch (typeOf(value)){ + case 'object': + var F = function(){}; + F.prototype = value; + object[key] = reset(new F); + break; + case 'array': object[key] = value.clone(); break; + } + } + return object; +}; + +var wrap = function(self, key, method){ + if (method.$origin) method = method.$origin; + var wrapper = function(){ + if (method.$protected && this.$caller == null) throw new Error('The method "' + key + '" cannot be called.'); + var caller = this.caller, current = this.$caller; + this.caller = current; this.$caller = wrapper; + var result = method.apply(this, arguments); + this.$caller = current; this.caller = caller; + return result; + }.extend({$owner: self, $origin: method, $name: key}); + return wrapper; +}; + +var implement = function(key, value, retain){ + if (Class.Mutators.hasOwnProperty(key)){ + value = Class.Mutators[key].call(this, value); + if (value == null) return this; + } + + if (typeOf(value) == 'function'){ + if (value.$hidden) return this; + this.prototype[key] = (retain) ? value : wrap(this, key, value); + } else { + Object.merge(this.prototype, key, value); + } + + return this; +}; + +var getInstance = function(klass){ + klass.$prototyping = true; + var proto = new klass; + delete klass.$prototyping; + return proto; +}; + +Class.implement('implement', implement.overloadSetter()); + +Class.Mutators = { + + Extends: function(parent){ + this.parent = parent; + this.prototype = getInstance(parent); + }, + + Implements: function(items){ + Array.from(items).each(function(item){ + var instance = new item; + for (var key in instance) implement.call(this, key, instance[key], true); + }, this); + } +}; + +}).call(this); + + +/* +--- + +name: Class.Extras + +description: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks. + +license: MIT-style license. + +requires: Class + +provides: [Class.Extras, Chain, Events, Options] + +... +*/ + +(function(){ + +this.Chain = new Class({ + + $chain: [], + + chain: function(){ + this.$chain.append(Array.flatten(arguments)); + return this; + }, + + callChain: function(){ + return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false; + }, + + clearChain: function(){ + this.$chain.empty(); + return this; + } + +}); + +var removeOn = function(string){ + return string.replace(/^on([A-Z])/, function(full, first){ + return first.toLowerCase(); + }); +}; + +this.Events = new Class({ + + $events: {}, + + addEvent: function(type, fn, internal){ + type = removeOn(type); + + + + this.$events[type] = (this.$events[type] || []).include(fn); + if (internal) fn.internal = true; + return this; + }, + + addEvents: function(events){ + for (var type in events) this.addEvent(type, events[type]); + return this; + }, + + fireEvent: function(type, args, delay){ + type = removeOn(type); + var events = this.$events[type]; + if (!events) return this; + args = Array.from(args); + events.each(function(fn){ + if (delay) fn.delay(delay, this, args); + else fn.apply(this, args); + }, this); + return this; + }, + + removeEvent: function(type, fn){ + type = removeOn(type); + var events = this.$events[type]; + if (events && !fn.internal){ + var index = events.indexOf(fn); + if (index != -1) delete events[index]; + } + return this; + }, + + removeEvents: function(events){ + var type; + if (typeOf(events) == 'object'){ + for (type in events) this.removeEvent(type, events[type]); + return this; + } + if (events) events = removeOn(events); + for (type in this.$events){ + if (events && events != type) continue; + var fns = this.$events[type]; + for (var i = fns.length; i--;) if (i in fns){ + this.removeEvent(type, fns[i]); + } + } + return this; + } + +}); + +this.Options = new Class({ + + setOptions: function(){ + var options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments)); + if (this.addEvent) for (var option in options){ + if (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue; + this.addEvent(option, options[option]); + delete options[option]; + } + return this; + } + +}); + +}).call(this); + + +/* +--- +name: Slick.Parser +description: Standalone CSS3 Selector parser +provides: Slick.Parser +... +*/ + +;(function(){ + +var parsed, + separatorIndex, + combinatorIndex, + reversed, + cache = {}, + reverseCache = {}, + reUnescape = /\\/g; + +var parse = function(expression, isReversed){ + if (expression == null) return null; + if (expression.Slick === true) return expression; + expression = ('' + expression).replace(/^\s+|\s+$/g, ''); + reversed = !!isReversed; + var currentCache = (reversed) ? reverseCache : cache; + if (currentCache[expression]) return currentCache[expression]; + parsed = { + Slick: true, + expressions: [], + raw: expression, + reverse: function(){ + return parse(this.raw, true); + } + }; + separatorIndex = -1; + while (expression != (expression = expression.replace(regexp, parser))); + parsed.length = parsed.expressions.length; + return currentCache[parsed.raw] = (reversed) ? reverse(parsed) : parsed; +}; + +var reverseCombinator = function(combinator){ + if (combinator === '!') return ' '; + else if (combinator === ' ') return '!'; + else if ((/^!/).test(combinator)) return combinator.replace(/^!/, ''); + else return '!' + combinator; +}; + +var reverse = function(expression){ + var expressions = expression.expressions; + for (var i = 0; i < expressions.length; i++){ + var exp = expressions[i]; + var last = {parts: [], tag: '*', combinator: reverseCombinator(exp[0].combinator)}; + + for (var j = 0; j < exp.length; j++){ + var cexp = exp[j]; + if (!cexp.reverseCombinator) cexp.reverseCombinator = ' '; + cexp.combinator = cexp.reverseCombinator; + delete cexp.reverseCombinator; + } + + exp.reverse().push(last); + } + return expression; +}; + +var escapeRegExp = function(string){// Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan MIT License + return string.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, function(match){ + return '\\' + match; + }); +}; + +var regexp = new RegExp( +/* +#!/usr/bin/env ruby +puts "\t\t" + DATA.read.gsub(/\(\?x\)|\s+#.*$|\s+|\\$|\\n/,'') +__END__ + "(?x)^(?:\ + \\s* ( , ) \\s* # Separator \n\ + | \\s* ( + ) \\s* # Combinator \n\ + | ( \\s+ ) # CombinatorChildren \n\ + | ( + | \\* ) # Tag \n\ + | \\# ( + ) # ID \n\ + | \\. ( + ) # ClassName \n\ + | # Attribute \n\ + \\[ \ + \\s* (+) (?: \ + \\s* ([*^$!~|]?=) (?: \ + \\s* (?:\ + ([\"']?)(.*?)\\9 \ + )\ + ) \ + )? \\s* \ + \\](?!\\]) \n\ + | :+ ( + )(?:\ + \\( (?:\ + (?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+)\ + ) \\)\ + )?\ + )" +*/ + "^(?:\\s*(,)\\s*|\\s*(+)\\s*|(\\s+)|(+|\\*)|\\#(+)|\\.(+)|\\[\\s*(+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)" + .replace(//, '[' + escapeRegExp(">+~`!@$%^&={}\\;/g, '(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])') + .replace(//g, '(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])') +); + +function parser( + rawMatch, + + separator, + combinator, + combinatorChildren, + + tagName, + id, + className, + + attributeKey, + attributeOperator, + attributeQuote, + attributeValue, + + pseudoMarker, + pseudoClass, + pseudoQuote, + pseudoClassQuotedValue, + pseudoClassValue +){ + if (separator || separatorIndex === -1){ + parsed.expressions[++separatorIndex] = []; + combinatorIndex = -1; + if (separator) return ''; + } + + if (combinator || combinatorChildren || combinatorIndex === -1){ + combinator = combinator || ' '; + var currentSeparator = parsed.expressions[separatorIndex]; + if (reversed && currentSeparator[combinatorIndex]) + currentSeparator[combinatorIndex].reverseCombinator = reverseCombinator(combinator); + currentSeparator[++combinatorIndex] = {combinator: combinator, tag: '*'}; + } + + var currentParsed = parsed.expressions[separatorIndex][combinatorIndex]; + + if (tagName){ + currentParsed.tag = tagName.replace(reUnescape, ''); + + } else if (id){ + currentParsed.id = id.replace(reUnescape, ''); + + } else if (className){ + className = className.replace(reUnescape, ''); + + if (!currentParsed.classList) currentParsed.classList = []; + if (!currentParsed.classes) currentParsed.classes = []; + currentParsed.classList.push(className); + currentParsed.classes.push({ + value: className, + regexp: new RegExp('(^|\\s)' + escapeRegExp(className) + '(\\s|$)') + }); + + } else if (pseudoClass){ + pseudoClassValue = pseudoClassValue || pseudoClassQuotedValue; + pseudoClassValue = pseudoClassValue ? pseudoClassValue.replace(reUnescape, '') : null; + + if (!currentParsed.pseudos) currentParsed.pseudos = []; + currentParsed.pseudos.push({ + key: pseudoClass.replace(reUnescape, ''), + value: pseudoClassValue, + type: pseudoMarker.length == 1 ? 'class' : 'element' + }); + + } else if (attributeKey){ + attributeKey = attributeKey.replace(reUnescape, ''); + attributeValue = (attributeValue || '').replace(reUnescape, ''); + + var test, regexp; + + switch (attributeOperator){ + case '^=' : regexp = new RegExp( '^'+ escapeRegExp(attributeValue) ); break; + case '$=' : regexp = new RegExp( escapeRegExp(attributeValue) +'$' ); break; + case '~=' : regexp = new RegExp( '(^|\\s)'+ escapeRegExp(attributeValue) +'(\\s|$)' ); break; + case '|=' : regexp = new RegExp( '^'+ escapeRegExp(attributeValue) +'(-|$)' ); break; + case '=' : test = function(value){ + return attributeValue == value; + }; break; + case '*=' : test = function(value){ + return value && value.indexOf(attributeValue) > -1; + }; break; + case '!=' : test = function(value){ + return attributeValue != value; + }; break; + default : test = function(value){ + return !!value; + }; + } + + if (attributeValue == '' && (/^[*$^]=$/).test(attributeOperator)) test = function(){ + return false; + }; + + if (!test) test = function(value){ + return value && regexp.test(value); + }; + + if (!currentParsed.attributes) currentParsed.attributes = []; + currentParsed.attributes.push({ + key: attributeKey, + operator: attributeOperator, + value: attributeValue, + test: test + }); + + } + + return ''; +}; + +// Slick NS + +var Slick = (this.Slick || {}); + +Slick.parse = function(expression){ + return parse(expression); +}; + +Slick.escapeRegExp = escapeRegExp; + +if (!this.Slick) this.Slick = Slick; + +}).apply(/**/(typeof exports != 'undefined') ? exports : /**/this); + + +/* +--- +name: Slick.Finder +description: The new, superfast css selector engine. +provides: Slick.Finder +requires: Slick.Parser +... +*/ + +;(function(){ + +var local = {}, + featuresCache = {}, + toString = Object.prototype.toString; + +// Feature / Bug detection + +local.isNativeCode = function(fn){ + return (/\{\s*\[native code\]\s*\}/).test('' + fn); +}; + +local.isXML = function(document){ + return (!!document.xmlVersion) || (!!document.xml) || (toString.call(document) == '[object XMLDocument]') || + (document.nodeType == 9 && document.documentElement.nodeName != 'HTML'); +}; + +local.setDocument = function(document){ + + // convert elements / window arguments to document. if document cannot be extrapolated, the function returns. + var nodeType = document.nodeType; + if (nodeType == 9); // document + else if (nodeType) document = document.ownerDocument; // node + else if (document.navigator) document = document.document; // window + else return; + + // check if it's the old document + + if (this.document === document) return; + this.document = document; + + // check if we have done feature detection on this document before + + var root = document.documentElement, + rootUid = this.getUIDXML(root), + features = featuresCache[rootUid], + feature; + + if (features){ + for (feature in features){ + this[feature] = features[feature]; + } + return; + } + + features = featuresCache[rootUid] = {}; + + features.root = root; + features.isXMLDocument = this.isXML(document); + + features.brokenStarGEBTN + = features.starSelectsClosedQSA + = features.idGetsName + = features.brokenMixedCaseQSA + = features.brokenGEBCN + = features.brokenCheckedQSA + = features.brokenEmptyAttributeQSA + = features.isHTMLDocument + = features.nativeMatchesSelector + = false; + + var starSelectsClosed, starSelectsComments, + brokenSecondClassNameGEBCN, cachedGetElementsByClassName, + brokenFormAttributeGetter; + + var selected, id = 'slick_uniqueid'; + var testNode = document.createElement('div'); + + var testRoot = document.body || document.getElementsByTagName('body')[0] || root; + testRoot.appendChild(testNode); + + // on non-HTML documents innerHTML and getElementsById doesnt work properly + try { + testNode.innerHTML = ''; + features.isHTMLDocument = !!document.getElementById(id); + } catch(e){}; + + if (features.isHTMLDocument){ + + testNode.style.display = 'none'; + + // IE returns comment nodes for getElementsByTagName('*') for some documents + testNode.appendChild(document.createComment('')); + starSelectsComments = (testNode.getElementsByTagName('*').length > 1); + + // IE returns closed nodes (EG:"") for getElementsByTagName('*') for some documents + try { + testNode.innerHTML = 'foo'; + selected = testNode.getElementsByTagName('*'); + starSelectsClosed = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/'); + } catch(e){}; + + features.brokenStarGEBTN = starSelectsComments || starSelectsClosed; + + // IE returns elements with the name instead of just id for getElementsById for some documents + try { + testNode.innerHTML = ''; + features.idGetsName = document.getElementById(id) === testNode.firstChild; + } catch(e){}; + + if (testNode.getElementsByClassName){ + + // Safari 3.2 getElementsByClassName caches results + try { + testNode.innerHTML = ''; + testNode.getElementsByClassName('b').length; + testNode.firstChild.className = 'b'; + cachedGetElementsByClassName = (testNode.getElementsByClassName('b').length != 2); + } catch(e){}; + + // Opera 9.6 getElementsByClassName doesnt detects the class if its not the first one + try { + testNode.innerHTML = ''; + brokenSecondClassNameGEBCN = (testNode.getElementsByClassName('a').length != 2); + } catch(e){}; + + features.brokenGEBCN = cachedGetElementsByClassName || brokenSecondClassNameGEBCN; + } + + if (testNode.querySelectorAll){ + // IE 8 returns closed nodes (EG:"") for querySelectorAll('*') for some documents + try { + testNode.innerHTML = 'foo'; + selected = testNode.querySelectorAll('*'); + features.starSelectsClosedQSA = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/'); + } catch(e){}; + + // Safari 3.2 querySelectorAll doesnt work with mixedcase on quirksmode + try { + testNode.innerHTML = ''; + features.brokenMixedCaseQSA = !testNode.querySelectorAll('.MiX').length; + } catch(e){}; + + // Webkit and Opera dont return selected options on querySelectorAll + try { + testNode.innerHTML = ''; + features.brokenCheckedQSA = (testNode.querySelectorAll(':checked').length == 0); + } catch(e){}; + + // IE returns incorrect results for attr[*^$]="" selectors on querySelectorAll + try { + testNode.innerHTML = ''; + features.brokenEmptyAttributeQSA = (testNode.querySelectorAll('[class*=""]').length != 0); + } catch(e){}; + + } + + // IE6-7, if a form has an input of id x, form.getAttribute(x) returns a reference to the input + try { + testNode.innerHTML = '
    '; + brokenFormAttributeGetter = (testNode.firstChild.getAttribute('action') != 's'); + } catch(e){}; + + // native matchesSelector function + + features.nativeMatchesSelector = root.matchesSelector || /*root.msMatchesSelector ||*/ root.mozMatchesSelector || root.webkitMatchesSelector; + if (features.nativeMatchesSelector) try { + // if matchesSelector trows errors on incorrect sintaxes we can use it + features.nativeMatchesSelector.call(root, ':slick'); + features.nativeMatchesSelector = null; + } catch(e){}; + + } + + try { + root.slick_expando = 1; + delete root.slick_expando; + features.getUID = this.getUIDHTML; + } catch(e) { + features.getUID = this.getUIDXML; + } + + testRoot.removeChild(testNode); + testNode = selected = testRoot = null; + + // getAttribute + + features.getAttribute = (features.isHTMLDocument && brokenFormAttributeGetter) ? function(node, name){ + var method = this.attributeGetters[name]; + if (method) return method.call(node); + var attributeNode = node.getAttributeNode(name); + return (attributeNode) ? attributeNode.nodeValue : null; + } : function(node, name){ + var method = this.attributeGetters[name]; + return (method) ? method.call(node) : node.getAttribute(name); + }; + + // hasAttribute + + features.hasAttribute = (root && this.isNativeCode(root.hasAttribute)) ? function(node, attribute) { + return node.hasAttribute(attribute); + } : function(node, attribute) { + node = node.getAttributeNode(attribute); + return !!(node && (node.specified || node.nodeValue)); + }; + + // contains + // FIXME: Add specs: local.contains should be different for xml and html documents? + features.contains = (root && this.isNativeCode(root.contains)) ? function(context, node){ + return context.contains(node); + } : (root && root.compareDocumentPosition) ? function(context, node){ + return context === node || !!(context.compareDocumentPosition(node) & 16); + } : function(context, node){ + if (node) do { + if (node === context) return true; + } while ((node = node.parentNode)); + return false; + }; + + // document order sorting + // credits to Sizzle (http://sizzlejs.com/) + + features.documentSorter = (root.compareDocumentPosition) ? function(a, b){ + if (!a.compareDocumentPosition || !b.compareDocumentPosition) return 0; + return a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; + } : ('sourceIndex' in root) ? function(a, b){ + if (!a.sourceIndex || !b.sourceIndex) return 0; + return a.sourceIndex - b.sourceIndex; + } : (document.createRange) ? function(a, b){ + if (!a.ownerDocument || !b.ownerDocument) return 0; + var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); + aRange.setStart(a, 0); + aRange.setEnd(a, 0); + bRange.setStart(b, 0); + bRange.setEnd(b, 0); + return aRange.compareBoundaryPoints(Range.START_TO_END, bRange); + } : null ; + + root = null; + + for (feature in features){ + this[feature] = features[feature]; + } +}; + +// Main Method + +var reSimpleSelector = /^([#.]?)((?:[\w-]+|\*))$/, + reEmptyAttribute = /\[.+[*$^]=(?:""|'')?\]/, + qsaFailExpCache = {}; + +local.search = function(context, expression, append, first){ + + var found = this.found = (first) ? null : (append || []); + + if (!context) return found; + else if (context.navigator) context = context.document; // Convert the node from a window to a document + else if (!context.nodeType) return found; + + // setup + + var parsed, i, + uniques = this.uniques = {}, + hasOthers = !!(append && append.length), + contextIsDocument = (context.nodeType == 9); + + if (this.document !== (contextIsDocument ? context : context.ownerDocument)) this.setDocument(context); + + // avoid duplicating items already in the append array + if (hasOthers) for (i = found.length; i--;) uniques[this.getUID(found[i])] = true; + + // expression checks + + if (typeof expression == 'string'){ // expression is a string + + /**/ + var simpleSelector = expression.match(reSimpleSelector); + simpleSelectors: if (simpleSelector) { + + var symbol = simpleSelector[1], + name = simpleSelector[2], + node, nodes; + + if (!symbol){ + + if (name == '*' && this.brokenStarGEBTN) break simpleSelectors; + nodes = context.getElementsByTagName(name); + if (first) return nodes[0] || null; + for (i = 0; node = nodes[i++];){ + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + } + + } else if (symbol == '#'){ + + if (!this.isHTMLDocument || !contextIsDocument) break simpleSelectors; + node = context.getElementById(name); + if (!node) return found; + if (this.idGetsName && node.getAttributeNode('id').nodeValue != name) break simpleSelectors; + if (first) return node || null; + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + + } else if (symbol == '.'){ + + if (!this.isHTMLDocument || ((!context.getElementsByClassName || this.brokenGEBCN) && context.querySelectorAll)) break simpleSelectors; + if (context.getElementsByClassName && !this.brokenGEBCN){ + nodes = context.getElementsByClassName(name); + if (first) return nodes[0] || null; + for (i = 0; node = nodes[i++];){ + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + } + } else { + var matchClass = new RegExp('(^|\\s)'+ Slick.escapeRegExp(name) +'(\\s|$)'); + nodes = context.getElementsByTagName('*'); + for (i = 0; node = nodes[i++];){ + className = node.className; + if (!(className && matchClass.test(className))) continue; + if (first) return node; + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + } + } + + } + + if (hasOthers) this.sort(found); + return (first) ? null : found; + + } + /**/ + + /**/ + querySelector: if (context.querySelectorAll) { + + if (!this.isHTMLDocument || this.brokenMixedCaseQSA || qsaFailExpCache[expression] || + (this.brokenCheckedQSA && expression.indexOf(':checked') > -1) || + (this.brokenEmptyAttributeQSA && reEmptyAttribute.test(expression)) || Slick.disableQSA) break querySelector; + + var _expression = expression; + if (!contextIsDocument){ + // non-document rooted QSA + // credits to Andrew Dupont + var currentId = context.getAttribute('id'), slickid = 'slickid__'; + context.setAttribute('id', slickid); + _expression = '#' + slickid + ' ' + _expression; + } + + try { + if (first) return context.querySelector(_expression) || null; + else nodes = context.querySelectorAll(_expression); + } catch(e) { + qsaFailExpCache[expression] = 1; + break querySelector; + } finally { + if (!contextIsDocument){ + if (currentId) context.setAttribute('id', currentId); + else context.removeAttribute('id'); + } + } + + if (this.starSelectsClosedQSA) for (i = 0; node = nodes[i++];){ + if (node.nodeName > '@' && !(hasOthers && uniques[this.getUID(node)])) found.push(node); + } else for (i = 0; node = nodes[i++];){ + if (!(hasOthers && uniques[this.getUID(node)])) found.push(node); + } + + if (hasOthers) this.sort(found); + return found; + + } + /**/ + + parsed = this.Slick.parse(expression); + if (!parsed.length) return found; + } else if (expression == null){ // there is no expression + return found; + } else if (expression.Slick){ // expression is a parsed Slick object + parsed = expression; + } else if (this.contains(context.documentElement || context, expression)){ // expression is a node + (found) ? found.push(expression) : found = expression; + return found; + } else { // other junk + return found; + } + + /**//**/ + + // cache elements for the nth selectors + + this.posNTH = {}; + this.posNTHLast = {}; + this.posNTHType = {}; + this.posNTHTypeLast = {}; + + /**//**/ + + // if append is null and there is only a single selector with one expression use pushArray, else use pushUID + this.push = (!hasOthers && (first || (parsed.length == 1 && parsed.expressions[0].length == 1))) ? this.pushArray : this.pushUID; + + if (found == null) found = []; + + // default engine + + var j, m, n; + var combinator, tag, id, classList, classes, attributes, pseudos; + var currentItems, currentExpression, currentBit, lastBit, expressions = parsed.expressions; + + search: for (i = 0; (currentExpression = expressions[i]); i++) for (j = 0; (currentBit = currentExpression[j]); j++){ + + combinator = 'combinator:' + currentBit.combinator; + if (!this[combinator]) continue search; + + tag = (this.isXMLDocument) ? currentBit.tag : currentBit.tag.toUpperCase(); + id = currentBit.id; + classList = currentBit.classList; + classes = currentBit.classes; + attributes = currentBit.attributes; + pseudos = currentBit.pseudos; + lastBit = (j === (currentExpression.length - 1)); + + this.bitUniques = {}; + + if (lastBit){ + this.uniques = uniques; + this.found = found; + } else { + this.uniques = {}; + this.found = []; + } + + if (j === 0){ + this[combinator](context, tag, id, classes, attributes, pseudos, classList); + if (first && lastBit && found.length) break search; + } else { + if (first && lastBit) for (m = 0, n = currentItems.length; m < n; m++){ + this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList); + if (found.length) break search; + } else for (m = 0, n = currentItems.length; m < n; m++) this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList); + } + + currentItems = this.found; + } + + // should sort if there are nodes in append and if you pass multiple expressions. + if (hasOthers || (parsed.expressions.length > 1)) this.sort(found); + + return (first) ? (found[0] || null) : found; +}; + +// Utils + +local.uidx = 1; +local.uidk = 'slick-uniqueid'; + +local.getUIDXML = function(node){ + var uid = node.getAttribute(this.uidk); + if (!uid){ + uid = this.uidx++; + node.setAttribute(this.uidk, uid); + } + return uid; +}; + +local.getUIDHTML = function(node){ + return node.uniqueNumber || (node.uniqueNumber = this.uidx++); +}; + +// sort based on the setDocument documentSorter method. + +local.sort = function(results){ + if (!this.documentSorter) return results; + results.sort(this.documentSorter); + return results; +}; + +/**//**/ + +local.cacheNTH = {}; + +local.matchNTH = /^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/; + +local.parseNTHArgument = function(argument){ + var parsed = argument.match(this.matchNTH); + if (!parsed) return false; + var special = parsed[2] || false; + var a = parsed[1] || 1; + if (a == '-') a = -1; + var b = +parsed[3] || 0; + parsed = + (special == 'n') ? {a: a, b: b} : + (special == 'odd') ? {a: 2, b: 1} : + (special == 'even') ? {a: 2, b: 0} : {a: 0, b: a}; + + return (this.cacheNTH[argument] = parsed); +}; + +local.createNTHPseudo = function(child, sibling, positions, ofType){ + return function(node, argument){ + var uid = this.getUID(node); + if (!this[positions][uid]){ + var parent = node.parentNode; + if (!parent) return false; + var el = parent[child], count = 1; + if (ofType){ + var nodeName = node.nodeName; + do { + if (el.nodeName != nodeName) continue; + this[positions][this.getUID(el)] = count++; + } while ((el = el[sibling])); + } else { + do { + if (el.nodeType != 1) continue; + this[positions][this.getUID(el)] = count++; + } while ((el = el[sibling])); + } + } + argument = argument || 'n'; + var parsed = this.cacheNTH[argument] || this.parseNTHArgument(argument); + if (!parsed) return false; + var a = parsed.a, b = parsed.b, pos = this[positions][uid]; + if (a == 0) return b == pos; + if (a > 0){ + if (pos < b) return false; + } else { + if (b < pos) return false; + } + return ((pos - b) % a) == 0; + }; +}; + +/**//**/ + +local.pushArray = function(node, tag, id, classes, attributes, pseudos){ + if (this.matchSelector(node, tag, id, classes, attributes, pseudos)) this.found.push(node); +}; + +local.pushUID = function(node, tag, id, classes, attributes, pseudos){ + var uid = this.getUID(node); + if (!this.uniques[uid] && this.matchSelector(node, tag, id, classes, attributes, pseudos)){ + this.uniques[uid] = true; + this.found.push(node); + } +}; + +local.matchNode = function(node, selector){ + if (this.isHTMLDocument && this.nativeMatchesSelector){ + try { + return this.nativeMatchesSelector.call(node, selector.replace(/\[([^=]+)=\s*([^'"\]]+?)\s*\]/g, '[$1="$2"]')); + } catch(matchError) {} + } + + var parsed = this.Slick.parse(selector); + if (!parsed) return true; + + // simple (single) selectors + var expressions = parsed.expressions, reversedExpressions, simpleExpCounter = 0, i; + for (i = 0; (currentExpression = expressions[i]); i++){ + if (currentExpression.length == 1){ + var exp = currentExpression[0]; + if (this.matchSelector(node, (this.isXMLDocument) ? exp.tag : exp.tag.toUpperCase(), exp.id, exp.classes, exp.attributes, exp.pseudos)) return true; + simpleExpCounter++; + } + } + + if (simpleExpCounter == parsed.length) return false; + + var nodes = this.search(this.document, parsed), item; + for (i = 0; item = nodes[i++];){ + if (item === node) return true; + } + return false; +}; + +local.matchPseudo = function(node, name, argument){ + var pseudoName = 'pseudo:' + name; + if (this[pseudoName]) return this[pseudoName](node, argument); + var attribute = this.getAttribute(node, name); + return (argument) ? argument == attribute : !!attribute; +}; + +local.matchSelector = function(node, tag, id, classes, attributes, pseudos){ + if (tag){ + var nodeName = (this.isXMLDocument) ? node.nodeName : node.nodeName.toUpperCase(); + if (tag == '*'){ + if (nodeName < '@') return false; // Fix for comment nodes and closed nodes + } else { + if (nodeName != tag) return false; + } + } + + if (id && node.getAttribute('id') != id) return false; + + var i, part, cls; + if (classes) for (i = classes.length; i--;){ + cls = node.getAttribute('class') || node.className; + if (!(cls && classes[i].regexp.test(cls))) return false; + } + if (attributes) for (i = attributes.length; i--;){ + part = attributes[i]; + if (part.operator ? !part.test(this.getAttribute(node, part.key)) : !this.hasAttribute(node, part.key)) return false; + } + if (pseudos) for (i = pseudos.length; i--;){ + part = pseudos[i]; + if (!this.matchPseudo(node, part.key, part.value)) return false; + } + return true; +}; + +var combinators = { + + ' ': function(node, tag, id, classes, attributes, pseudos, classList){ // all child nodes, any level + + var i, item, children; + + if (this.isHTMLDocument){ + getById: if (id){ + item = this.document.getElementById(id); + if ((!item && node.all) || (this.idGetsName && item && item.getAttributeNode('id').nodeValue != id)){ + // all[id] returns all the elements with that name or id inside node + // if theres just one it will return the element, else it will be a collection + children = node.all[id]; + if (!children) return; + if (!children[0]) children = [children]; + for (i = 0; item = children[i++];){ + var idNode = item.getAttributeNode('id'); + if (idNode && idNode.nodeValue == id){ + this.push(item, tag, null, classes, attributes, pseudos); + break; + } + } + return; + } + if (!item){ + // if the context is in the dom we return, else we will try GEBTN, breaking the getById label + if (this.contains(this.root, node)) return; + else break getById; + } else if (this.document !== node && !this.contains(node, item)) return; + this.push(item, tag, null, classes, attributes, pseudos); + return; + } + getByClass: if (classes && node.getElementsByClassName && !this.brokenGEBCN){ + children = node.getElementsByClassName(classList.join(' ')); + if (!(children && children.length)) break getByClass; + for (i = 0; item = children[i++];) this.push(item, tag, id, null, attributes, pseudos); + return; + } + } + getByTag: { + children = node.getElementsByTagName(tag); + if (!(children && children.length)) break getByTag; + if (!this.brokenStarGEBTN) tag = null; + for (i = 0; item = children[i++];) this.push(item, tag, id, classes, attributes, pseudos); + } + }, + + '>': function(node, tag, id, classes, attributes, pseudos){ // direct children + if ((node = node.firstChild)) do { + if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos); + } while ((node = node.nextSibling)); + }, + + '+': function(node, tag, id, classes, attributes, pseudos){ // next sibling + while ((node = node.nextSibling)) if (node.nodeType == 1){ + this.push(node, tag, id, classes, attributes, pseudos); + break; + } + }, + + '^': function(node, tag, id, classes, attributes, pseudos){ // first child + node = node.firstChild; + if (node){ + if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos); + else this['combinator:+'](node, tag, id, classes, attributes, pseudos); + } + }, + + '~': function(node, tag, id, classes, attributes, pseudos){ // next siblings + while ((node = node.nextSibling)){ + if (node.nodeType != 1) continue; + var uid = this.getUID(node); + if (this.bitUniques[uid]) break; + this.bitUniques[uid] = true; + this.push(node, tag, id, classes, attributes, pseudos); + } + }, + + '++': function(node, tag, id, classes, attributes, pseudos){ // next sibling and previous sibling + this['combinator:+'](node, tag, id, classes, attributes, pseudos); + this['combinator:!+'](node, tag, id, classes, attributes, pseudos); + }, + + '~~': function(node, tag, id, classes, attributes, pseudos){ // next siblings and previous siblings + this['combinator:~'](node, tag, id, classes, attributes, pseudos); + this['combinator:!~'](node, tag, id, classes, attributes, pseudos); + }, + + '!': function(node, tag, id, classes, attributes, pseudos){ // all parent nodes up to document + while ((node = node.parentNode)) if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos); + }, + + '!>': function(node, tag, id, classes, attributes, pseudos){ // direct parent (one level) + node = node.parentNode; + if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos); + }, + + '!+': function(node, tag, id, classes, attributes, pseudos){ // previous sibling + while ((node = node.previousSibling)) if (node.nodeType == 1){ + this.push(node, tag, id, classes, attributes, pseudos); + break; + } + }, + + '!^': function(node, tag, id, classes, attributes, pseudos){ // last child + node = node.lastChild; + if (node){ + if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos); + else this['combinator:!+'](node, tag, id, classes, attributes, pseudos); + } + }, + + '!~': function(node, tag, id, classes, attributes, pseudos){ // previous siblings + while ((node = node.previousSibling)){ + if (node.nodeType != 1) continue; + var uid = this.getUID(node); + if (this.bitUniques[uid]) break; + this.bitUniques[uid] = true; + this.push(node, tag, id, classes, attributes, pseudos); + } + } + +}; + +for (var c in combinators) local['combinator:' + c] = combinators[c]; + +var pseudos = { + + /**/ + + 'empty': function(node){ + var child = node.firstChild; + return !(child && child.nodeType == 1) && !(node.innerText || node.textContent || '').length; + }, + + 'not': function(node, expression){ + return !this.matchNode(node, expression); + }, + + 'contains': function(node, text){ + return (node.innerText || node.textContent || '').indexOf(text) > -1; + }, + + 'first-child': function(node){ + while ((node = node.previousSibling)) if (node.nodeType == 1) return false; + return true; + }, + + 'last-child': function(node){ + while ((node = node.nextSibling)) if (node.nodeType == 1) return false; + return true; + }, + + 'only-child': function(node){ + var prev = node; + while ((prev = prev.previousSibling)) if (prev.nodeType == 1) return false; + var next = node; + while ((next = next.nextSibling)) if (next.nodeType == 1) return false; + return true; + }, + + /**/ + + 'nth-child': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTH'), + + 'nth-last-child': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHLast'), + + 'nth-of-type': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTHType', true), + + 'nth-last-of-type': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHTypeLast', true), + + 'index': function(node, index){ + return this['pseudo:nth-child'](node, '' + index + 1); + }, + + 'even': function(node){ + return this['pseudo:nth-child'](node, '2n'); + }, + + 'odd': function(node){ + return this['pseudo:nth-child'](node, '2n+1'); + }, + + /**/ + + /**/ + + 'first-of-type': function(node){ + var nodeName = node.nodeName; + while ((node = node.previousSibling)) if (node.nodeName == nodeName) return false; + return true; + }, + + 'last-of-type': function(node){ + var nodeName = node.nodeName; + while ((node = node.nextSibling)) if (node.nodeName == nodeName) return false; + return true; + }, + + 'only-of-type': function(node){ + var prev = node, nodeName = node.nodeName; + while ((prev = prev.previousSibling)) if (prev.nodeName == nodeName) return false; + var next = node; + while ((next = next.nextSibling)) if (next.nodeName == nodeName) return false; + return true; + }, + + /**/ + + // custom pseudos + + 'enabled': function(node){ + return !node.disabled; + }, + + 'disabled': function(node){ + return node.disabled; + }, + + 'checked': function(node){ + return node.checked || node.selected; + }, + + 'focus': function(node){ + return this.isHTMLDocument && this.document.activeElement === node && (node.href || node.type || this.hasAttribute(node, 'tabindex')); + }, + + 'root': function(node){ + return (node === this.root); + }, + + 'selected': function(node){ + return node.selected; + } + + /**/ +}; + +for (var p in pseudos) local['pseudo:' + p] = pseudos[p]; + +// attributes methods + +local.attributeGetters = { + + 'class': function(){ + return this.getAttribute('class') || this.className; + }, + + 'for': function(){ + return ('htmlFor' in this) ? this.htmlFor : this.getAttribute('for'); + }, + + 'href': function(){ + return ('href' in this) ? this.getAttribute('href', 2) : this.getAttribute('href'); + }, + + 'style': function(){ + return (this.style) ? this.style.cssText : this.getAttribute('style'); + }, + + 'tabindex': function(){ + var attributeNode = this.getAttributeNode('tabindex'); + return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null; + }, + + 'type': function(){ + return this.getAttribute('type'); + } + +}; + +// Slick + +var Slick = local.Slick = (this.Slick || {}); + +Slick.version = '1.1.5'; + +// Slick finder + +Slick.search = function(context, expression, append){ + return local.search(context, expression, append); +}; + +Slick.find = function(context, expression){ + return local.search(context, expression, null, true); +}; + +// Slick containment checker + +Slick.contains = function(container, node){ + local.setDocument(container); + return local.contains(container, node); +}; + +// Slick attribute getter + +Slick.getAttribute = function(node, name){ + return local.getAttribute(node, name); +}; + +// Slick matcher + +Slick.match = function(node, selector){ + if (!(node && selector)) return false; + if (!selector || selector === node) return true; + local.setDocument(node); + return local.matchNode(node, selector); +}; + +// Slick attribute accessor + +Slick.defineAttributeGetter = function(name, fn){ + local.attributeGetters[name] = fn; + return this; +}; + +Slick.lookupAttributeGetter = function(name){ + return local.attributeGetters[name]; +}; + +// Slick pseudo accessor + +Slick.definePseudo = function(name, fn){ + local['pseudo:' + name] = function(node, argument){ + return fn.call(node, argument); + }; + return this; +}; + +Slick.lookupPseudo = function(name){ + var pseudo = local['pseudo:' + name]; + if (pseudo) return function(argument){ + return pseudo.call(this, argument); + }; + return null; +}; + +// Slick overrides accessor + +Slick.override = function(regexp, fn){ + local.override(regexp, fn); + return this; +}; + +Slick.isXML = local.isXML; + +Slick.uidOf = function(node){ + return local.getUIDHTML(node); +}; + +if (!this.Slick) this.Slick = Slick; + +}).apply(/**/(typeof exports != 'undefined') ? exports : /**/this); + + +/* +--- + +name: Element + +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. + +license: MIT-style license. + +requires: [Window, Document, Array, String, Function, Number, Slick.Parser, Slick.Finder] + +provides: [Element, Elements, $, $$, Iframe, Selectors] + +... +*/ + +var Element = function(tag, props){ + var konstructor = Element.Constructors[tag]; + if (konstructor) return konstructor(props); + if (typeof tag != 'string') return document.id(tag).set(props); + + if (!props) props = {}; + + if (!(/^[\w-]+$/).test(tag)){ + var parsed = Slick.parse(tag).expressions[0][0]; + tag = (parsed.tag == '*') ? 'div' : parsed.tag; + if (parsed.id && props.id == null) props.id = parsed.id; + + var attributes = parsed.attributes; + if (attributes) for (var i = 0, l = attributes.length; i < l; i++){ + var attr = attributes[i]; + if (attr.value != null && attr.operator == '=' && props[attr.key] == null) + props[attr.key] = attr.value; + } + + if (parsed.classList && props['class'] == null) props['class'] = parsed.classList.join(' '); + } + + return document.newElement(tag, props); +}; + +if (Browser.Element) Element.prototype = Browser.Element.prototype; + +new Type('Element', Element).mirror(function(name){ + if (Array.prototype[name]) return; + + var obj = {}; + obj[name] = function(){ + var results = [], args = arguments, elements = true; + for (var i = 0, l = this.length; i < l; i++){ + var element = this[i], result = results[i] = element[name].apply(element, args); + elements = (elements && typeOf(result) == 'element'); + } + return (elements) ? new Elements(results) : results; + }; + + Elements.implement(obj); +}); + +if (!Browser.Element){ + Element.parent = Object; + + Element.Prototype = {'$family': Function.from('element').hide()}; + + Element.mirror(function(name, method){ + Element.Prototype[name] = method; + }); +} + +Element.Constructors = {}; + + + +var IFrame = new Type('IFrame', function(){ + var params = Array.link(arguments, { + properties: Type.isObject, + iframe: function(obj){ + return (obj != null); + } + }); + + var props = params.properties || {}, iframe; + if (params.iframe) iframe = document.id(params.iframe); + var onload = props.onload || function(){}; + delete props.onload; + props.id = props.name = [props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + String.uniqueID()].pick(); + iframe = new Element(iframe || 'iframe', props); + + var onLoad = function(){ + onload.call(iframe.contentWindow); + }; + + if (window.frames[props.id]) onLoad(); + else iframe.addListener('load', onLoad); + return iframe; +}); + +var Elements = this.Elements = function(nodes){ + if (nodes && nodes.length){ + var uniques = {}, node; + for (var i = 0; node = nodes[i++];){ + var uid = Slick.uidOf(node); + if (!uniques[uid]){ + uniques[uid] = true; + this.push(node); + } + } + } +}; + +Elements.prototype = {length: 0}; +Elements.parent = Array; + +new Type('Elements', Elements).implement({ + + filter: function(filter, bind){ + if (!filter) return this; + return new Elements(Array.filter(this, (typeOf(filter) == 'string') ? function(item){ + return item.match(filter); + } : filter, bind)); + }.protect(), + + push: function(){ + var length = this.length; + for (var i = 0, l = arguments.length; i < l; i++){ + var item = document.id(arguments[i]); + if (item) this[length++] = item; + } + return (this.length = length); + }.protect(), + + unshift: function(){ + var items = []; + for (var i = 0, l = arguments.length; i < l; i++){ + var item = document.id(arguments[i]); + if (item) items.push(item); + } + return Array.prototype.unshift.apply(this, items); + }.protect(), + + concat: function(){ + var newElements = new Elements(this); + for (var i = 0, l = arguments.length; i < l; i++){ + var item = arguments[i]; + if (Type.isEnumerable(item)) newElements.append(item); + else newElements.push(item); + } + return newElements; + }.protect(), + + append: function(collection){ + for (var i = 0, l = collection.length; i < l; i++) this.push(collection[i]); + return this; + }.protect(), + + empty: function(){ + while (this.length) delete this[--this.length]; + return this; + }.protect() + +}); + + + +(function(){ + +// FF, IE +var splice = Array.prototype.splice, object = {'0': 0, '1': 1, length: 2}; + +splice.call(object, 1, 1); +if (object[1] == 1) Elements.implement('splice', function(){ + var length = this.length; + splice.apply(this, arguments); + while (length >= this.length) delete this[length--]; + return this; +}.protect()); + +Elements.implement(Array.prototype); + +Array.mirror(Elements); + +/**/ +var createElementAcceptsHTML; +try { + var x = document.createElement(''); + createElementAcceptsHTML = (x.name == 'x'); +} catch(e){} + +var escapeQuotes = function(html){ + return ('' + html).replace(/&/g, '&').replace(/"/g, '"'); +}; +/**/ + +Document.implement({ + + newElement: function(tag, props){ + if (props && props.checked != null) props.defaultChecked = props.checked; + /**/// Fix for readonly name and type properties in IE < 8 + if (createElementAcceptsHTML && props){ + tag = '<' + tag; + if (props.name) tag += ' name="' + escapeQuotes(props.name) + '"'; + if (props.type) tag += ' type="' + escapeQuotes(props.type) + '"'; + tag += '>'; + delete props.name; + delete props.type; + } + /**/ + return this.id(this.createElement(tag)).set(props); + } + +}); + +})(); + +Document.implement({ + + newTextNode: function(text){ + return this.createTextNode(text); + }, + + getDocument: function(){ + return this; + }, + + getWindow: function(){ + return this.window; + }, + + id: (function(){ + + var types = { + + string: function(id, nocash, doc){ + id = Slick.find(doc, '#' + id.replace(/(\W)/g, '\\$1')); + return (id) ? types.element(id, nocash) : null; + }, + + element: function(el, nocash){ + $uid(el); + if (!nocash && !el.$family && !(/^(?:object|embed)$/i).test(el.tagName)){ + Object.append(el, Element.Prototype); + } + return el; + }, + + object: function(obj, nocash, doc){ + if (obj.toElement) return types.element(obj.toElement(doc), nocash); + return null; + } + + }; + + types.textnode = types.whitespace = types.window = types.document = function(zero){ + return zero; + }; + + return function(el, nocash, doc){ + if (el && el.$family && el.uid) return el; + var type = typeOf(el); + return (types[type]) ? types[type](el, nocash, doc || document) : null; + }; + + })() + +}); + +if (window.$ == null) Window.implement('$', function(el, nc){ + return document.id(el, nc, this.document); +}); + +Window.implement({ + + getDocument: function(){ + return this.document; + }, + + getWindow: function(){ + return this; + } + +}); + +[Document, Element].invoke('implement', { + + getElements: function(expression){ + return Slick.search(this, expression, new Elements); + }, + + getElement: function(expression){ + return document.id(Slick.find(this, expression)); + } + +}); + + + +if (window.$$ == null) Window.implement('$$', function(selector){ + if (arguments.length == 1){ + if (typeof selector == 'string') return Slick.search(this.document, selector, new Elements); + else if (Type.isEnumerable(selector)) return new Elements(selector); + } + return new Elements(arguments); +}); + +(function(){ + +var collected = {}, storage = {}; +var formProps = {input: 'checked', option: 'selected', textarea: 'value'}; + +var get = function(uid){ + return (storage[uid] || (storage[uid] = {})); +}; + +var clean = function(item){ + var uid = item.uid; + if (item.removeEvents) item.removeEvents(); + if (item.clearAttributes) item.clearAttributes(); + if (uid != null){ + delete collected[uid]; + delete storage[uid]; + } + return item; +}; + +var camels = ['defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', 'frameBorder', 'maxLength', 'readOnly', + 'rowSpan', 'tabIndex', 'useMap' +]; +var bools = ['compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', 'disabled', 'readOnly', 'multiple', 'selected', + 'noresize', 'defer', 'defaultChecked' +]; + var attributes = { + 'html': 'innerHTML', + 'class': 'className', + 'for': 'htmlFor', + 'text': (function(){ + var temp = document.createElement('div'); + return (temp.textContent == null) ? 'innerText' : 'textContent'; + })() +}; +var readOnly = ['type']; +var expandos = ['value', 'defaultValue']; +var uriAttrs = /^(?:href|src|usemap)$/i; + +bools = bools.associate(bools); +camels = camels.associate(camels.map(String.toLowerCase)); +readOnly = readOnly.associate(readOnly); + +Object.append(attributes, expandos.associate(expandos)); + +var inserters = { + + before: function(context, element){ + var parent = element.parentNode; + if (parent) parent.insertBefore(context, element); + }, + + after: function(context, element){ + var parent = element.parentNode; + if (parent) parent.insertBefore(context, element.nextSibling); + }, + + bottom: function(context, element){ + element.appendChild(context); + }, + + top: function(context, element){ + element.insertBefore(context, element.firstChild); + } + +}; + +inserters.inside = inserters.bottom; + + + +var injectCombinator = function(expression, combinator){ + if (!expression) return combinator; + + expression = Object.clone(Slick.parse(expression)); + + var expressions = expression.expressions; + for (var i = expressions.length; i--;) + expressions[i][0].combinator = combinator; + + return expression; +}; + +Element.implement({ + + set: function(prop, value){ + var property = Element.Properties[prop]; + (property && property.set) ? property.set.call(this, value) : this.setProperty(prop, value); + }.overloadSetter(), + + get: function(prop){ + var property = Element.Properties[prop]; + return (property && property.get) ? property.get.apply(this) : this.getProperty(prop); + }.overloadGetter(), + + erase: function(prop){ + var property = Element.Properties[prop]; + (property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop); + return this; + }, + + setProperty: function(attribute, value){ + attribute = camels[attribute] || attribute; + if (value == null) return this.removeProperty(attribute); + var key = attributes[attribute]; + (key) ? this[key] = value : + (bools[attribute]) ? this[attribute] = !!value : this.setAttribute(attribute, '' + value); + return this; + }, + + setProperties: function(attributes){ + for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]); + return this; + }, + + getProperty: function(attribute){ + attribute = camels[attribute] || attribute; + var key = attributes[attribute] || readOnly[attribute]; + return (key) ? this[key] : + (bools[attribute]) ? !!this[attribute] : + (uriAttrs.test(attribute) ? this.getAttribute(attribute, 2) : + (key = this.getAttributeNode(attribute)) ? key.nodeValue : null) || null; + }, + + getProperties: function(){ + var args = Array.from(arguments); + return args.map(this.getProperty, this).associate(args); + }, + + removeProperty: function(attribute){ + attribute = camels[attribute] || attribute; + var key = attributes[attribute]; + (key) ? this[key] = '' : + (bools[attribute]) ? this[attribute] = false : this.removeAttribute(attribute); + return this; + }, + + removeProperties: function(){ + Array.each(arguments, this.removeProperty, this); + return this; + }, + + hasClass: function(className){ + return this.className.clean().contains(className, ' '); + }, + + addClass: function(className){ + if (!this.hasClass(className)) this.className = (this.className + ' ' + className).clean(); + return this; + }, + + removeClass: function(className){ + this.className = this.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1'); + return this; + }, + + toggleClass: function(className, force){ + if (force == null) force = !this.hasClass(className); + return (force) ? this.addClass(className) : this.removeClass(className); + }, + + adopt: function(){ + var parent = this, fragment, elements = Array.flatten(arguments), length = elements.length; + if (length > 1) parent = fragment = document.createDocumentFragment(); + + for (var i = 0; i < length; i++){ + var element = document.id(elements[i], true); + if (element) parent.appendChild(element); + } + + if (fragment) this.appendChild(fragment); + + return this; + }, + + appendText: function(text, where){ + return this.grab(this.getDocument().newTextNode(text), where); + }, + + grab: function(el, where){ + inserters[where || 'bottom'](document.id(el, true), this); + return this; + }, + + inject: function(el, where){ + inserters[where || 'bottom'](this, document.id(el, true)); + return this; + }, + + replaces: function(el){ + el = document.id(el, true); + el.parentNode.replaceChild(this, el); + return this; + }, + + wraps: function(el, where){ + el = document.id(el, true); + return this.replaces(el).grab(el, where); + }, + + getPrevious: function(expression){ + return document.id(Slick.find(this, injectCombinator(expression, '!~'))); + }, + + getAllPrevious: function(expression){ + return Slick.search(this, injectCombinator(expression, '!~'), new Elements); + }, + + getNext: function(expression){ + return document.id(Slick.find(this, injectCombinator(expression, '~'))); + }, + + getAllNext: function(expression){ + return Slick.search(this, injectCombinator(expression, '~'), new Elements); + }, + + getFirst: function(expression){ + return document.id(Slick.search(this, injectCombinator(expression, '>'))[0]); + }, + + getLast: function(expression){ + return document.id(Slick.search(this, injectCombinator(expression, '>')).getLast()); + }, + + getParent: function(expression){ + return document.id(Slick.find(this, injectCombinator(expression, '!'))); + }, + + getParents: function(expression){ + return Slick.search(this, injectCombinator(expression, '!'), new Elements); + }, + + getSiblings: function(expression){ + return Slick.search(this, injectCombinator(expression, '~~'), new Elements); + }, + + getChildren: function(expression){ + return Slick.search(this, injectCombinator(expression, '>'), new Elements); + }, + + getWindow: function(){ + return this.ownerDocument.window; + }, + + getDocument: function(){ + return this.ownerDocument; + }, + + getElementById: function(id){ + return document.id(Slick.find(this, '#' + ('' + id).replace(/(\W)/g, '\\$1'))); + }, + + getSelected: function(){ + this.selectedIndex; // Safari 3.2.1 + return new Elements(Array.from(this.options).filter(function(option){ + return option.selected; + })); + }, + + toQueryString: function(){ + var queryString = []; + this.getElements('input, select, textarea').each(function(el){ + var type = el.type; + if (!el.name || el.disabled || type == 'submit' || type == 'reset' || type == 'file' || type == 'image') return; + + var value = (el.get('tag') == 'select') ? el.getSelected().map(function(opt){ + // IE + return document.id(opt).get('value'); + }) : ((type == 'radio' || type == 'checkbox') && !el.checked) ? null : el.get('value'); + + Array.from(value).each(function(val){ + if (typeof val != 'undefined') queryString.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(val)); + }); + }); + return queryString.join('&'); + }, + + destroy: function(){ + var children = clean(this).getElementsByTagName('*'); + Array.each(children, clean); + Element.dispose(this); + return null; + }, + + empty: function(){ + Array.from(this.childNodes).each(Element.dispose); + return this; + }, + + dispose: function(){ + return (this.parentNode) ? this.parentNode.removeChild(this) : this; + }, + + match: function(expression){ + return !expression || Slick.match(this, expression); + } + +}); + +var cleanClone = function(node, element, keepid){ + if (!keepid) node.setAttributeNode(document.createAttribute('id')); + if (node.clearAttributes){ + node.clearAttributes(); + node.mergeAttributes(element); + node.removeAttribute('uid'); + if (node.options){ + var no = node.options, eo = element.options; + for (var i = no.length; i--;) no[i].selected = eo[i].selected; + } + } + + var prop = formProps[element.tagName.toLowerCase()]; + if (prop && element[prop]) node[prop] = element[prop]; +}; + +Element.implement('clone', function(contents, keepid){ + contents = contents !== false; + var clone = this.cloneNode(contents), i; + + if (contents){ + var ce = clone.getElementsByTagName('*'), te = this.getElementsByTagName('*'); + for (i = ce.length; i--;) cleanClone(ce[i], te[i], keepid); + } + + cleanClone(clone, this, keepid); + + if (Browser.ie){ + var co = clone.getElementsByTagName('object'), to = this.getElementsByTagName('object'); + for (i = co.length; i--;) co[i].outerHTML = to[i].outerHTML; + } + return document.id(clone); +}); + +var contains = {contains: function(element){ + return Slick.contains(this, element); +}}; + +if (!document.contains) Document.implement(contains); +if (!document.createElement('div').contains) Element.implement(contains); + + + +[Element, Window, Document].invoke('implement', { + + addListener: function(type, fn){ + if (type == 'unload'){ + var old = fn, self = this; + fn = function(){ + self.removeListener('unload', fn); + old(); + }; + } else { + collected[$uid(this)] = this; + } + if (this.addEventListener) this.addEventListener(type, fn, !!arguments[2]); + else this.attachEvent('on' + type, fn); + return this; + }, + + removeListener: function(type, fn){ + if (this.removeEventListener) this.removeEventListener(type, fn, !!arguments[2]); + else this.detachEvent('on' + type, fn); + return this; + }, + + retrieve: function(property, dflt){ + var storage = get($uid(this)), prop = storage[property]; + if (dflt != null && prop == null) prop = storage[property] = dflt; + return prop != null ? prop : null; + }, + + store: function(property, value){ + var storage = get($uid(this)); + storage[property] = value; + return this; + }, + + eliminate: function(property){ + var storage = get($uid(this)); + delete storage[property]; + return this; + } + +}); + +// IE purge +if (window.attachEvent && !window.addEventListener) window.addListener('unload', function(){ + Object.each(collected, clean); + if (window.CollectGarbage) CollectGarbage(); +}); + +})(); + +Element.Properties = {}; + + + +Element.Properties.style = { + + set: function(style){ + this.style.cssText = style; + }, + + get: function(){ + return this.style.cssText; + }, + + erase: function(){ + this.style.cssText = ''; + } + +}; + +Element.Properties.tag = { + + get: function(){ + return this.tagName.toLowerCase(); + } + +}; + +(function(maxLength){ + if (maxLength != null) Element.Properties.maxlength = Element.Properties.maxLength = { + get: function(){ + var maxlength = this.getAttribute('maxLength'); + return maxlength == maxLength ? null : maxlength; + } + }; +})(document.createElement('input').getAttribute('maxLength')); + +Element.Properties.html = (function(){ + + var tableTest = Function.attempt(function(){ + var table = document.createElement('table'); + table.innerHTML = ''; + }); + + var wrapper = document.createElement('div'); + + var translations = { + table: [1, '', '
    '], + select: [1, ''], + tbody: [2, '', '
    '], + tr: [3, '', '
    '] + }; + translations.thead = translations.tfoot = translations.tbody; + + var html = { + set: function(){ + var html = Array.flatten(arguments).join(''); + var wrap = (!tableTest && translations[this.get('tag')]); + if (wrap){ + var first = wrapper; + first.innerHTML = wrap[1] + html + wrap[2]; + for (var i = wrap[0]; i--;) first = first.firstChild; + this.empty().adopt(first.childNodes); + } else { + this.innerHTML = html; + } + } + }; + + html.erase = html.set; + + return html; +})(); + + +/* +--- + +name: Element.Style + +description: Contains methods for interacting with the styles of Elements in a fashionable way. + +license: MIT-style license. + +requires: Element + +provides: Element.Style + +... +*/ + +(function(){ + +var html = document.html; + +Element.Properties.styles = {set: function(styles){ + this.setStyles(styles); +}}; + +var hasOpacity = (html.style.opacity != null); +var reAlpha = /alpha\(opacity=([\d.]+)\)/i; + +var setOpacity = function(element, opacity){ + if (!element.currentStyle || !element.currentStyle.hasLayout) element.style.zoom = 1; + if (hasOpacity){ + element.style.opacity = opacity; + } else { + opacity = (opacity == 1) ? '' : 'alpha(opacity=' + opacity * 100 + ')'; + var filter = element.style.filter || element.getComputedStyle('filter') || ''; + element.style.filter = reAlpha.test(filter) ? filter.replace(reAlpha, opacity) : filter + opacity; + } +}; + +Element.Properties.opacity = { + + set: function(opacity){ + var visibility = this.style.visibility; + if (opacity == 0 && visibility != 'hidden') this.style.visibility = 'hidden'; + else if (opacity != 0 && visibility != 'visible') this.style.visibility = 'visible'; + + setOpacity(this, opacity); + }, + + get: (hasOpacity) ? function(){ + var opacity = this.style.opacity || this.getComputedStyle('opacity'); + return (opacity == '') ? 1 : opacity; + } : function(){ + var opacity, filter = (this.style.filter || this.getComputedStyle('filter')); + if (filter) opacity = filter.match(reAlpha); + return (opacity == null || filter == null) ? 1 : (opacity[1] / 100); + } + +}; + +var floatName = (html.style.cssFloat == null) ? 'styleFloat' : 'cssFloat'; + +Element.implement({ + + getComputedStyle: function(property){ + if (this.currentStyle) return this.currentStyle[property.camelCase()]; + var defaultView = Element.getDocument(this).defaultView, + computed = defaultView ? defaultView.getComputedStyle(this, null) : null; + return (computed) ? computed.getPropertyValue((property == floatName) ? 'float' : property.hyphenate()) : null; + }, + + setOpacity: function(value){ + setOpacity(this, value); + return this; + }, + + getOpacity: function(){ + return this.get('opacity'); + }, + + setStyle: function(property, value){ + switch (property){ + case 'opacity': return this.set('opacity', parseFloat(value)); + case 'float': property = floatName; + } + property = property.camelCase(); + if (typeOf(value) != 'string'){ + var map = (Element.Styles[property] || '@').split(' '); + value = Array.from(value).map(function(val, i){ + if (!map[i]) return ''; + return (typeOf(val) == 'number') ? map[i].replace('@', Math.round(val)) : val; + }).join(' '); + } else if (value == String(Number(value))){ + value = Math.round(value); + } + this.style[property] = value; + return this; + }, + + getStyle: function(property){ + switch (property){ + case 'opacity': return this.get('opacity'); + case 'float': property = floatName; + } + property = property.camelCase(); + var result = this.style[property]; + if (!result || property == 'zIndex'){ + result = []; + for (var style in Element.ShortStyles){ + if (property != style) continue; + for (var s in Element.ShortStyles[style]) result.push(this.getStyle(s)); + return result.join(' '); + } + result = this.getComputedStyle(property); + } + if (result){ + result = String(result); + var color = result.match(/rgba?\([\d\s,]+\)/); + if (color) result = result.replace(color[0], color[0].rgbToHex()); + } + if (Browser.opera || (Browser.ie && isNaN(parseFloat(result)))){ + if ((/^(height|width)$/).test(property)){ + var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0; + values.each(function(value){ + size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt(); + }, this); + return this['offset' + property.capitalize()] - size + 'px'; + } + if (Browser.opera && String(result).indexOf('px') != -1) return result; + if ((/^border(.+)Width|margin|padding/).test(property)) return '0px'; + } + return result; + }, + + setStyles: function(styles){ + for (var style in styles) this.setStyle(style, styles[style]); + return this; + }, + + getStyles: function(){ + var result = {}; + Array.flatten(arguments).each(function(key){ + result[key] = this.getStyle(key); + }, this); + return result; + } + +}); + +Element.Styles = { + 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: '@' +}; + + + +Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}}; + +['Top', 'Right', 'Bottom', 'Left'].each(function(direction){ + var Short = Element.ShortStyles; + var All = Element.Styles; + ['margin', 'padding'].each(function(style){ + var sd = style + direction; + Short[style][sd] = All[sd] = '@px'; + }); + var bd = 'border' + direction; + Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)'; + var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color'; + Short[bd] = {}; + Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px'; + Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@'; + Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)'; +}); + +}).call(this); + + +/* +--- + +name: Element.Event + +description: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events. + +license: MIT-style license. + +requires: [Element, Event] + +provides: Element.Event + +... +*/ + +(function(){ + +Element.Properties.events = {set: function(events){ + this.addEvents(events); +}}; + +[Element, Window, Document].invoke('implement', { + + addEvent: function(type, fn){ + var events = this.retrieve('events', {}); + if (!events[type]) events[type] = {keys: [], values: []}; + if (events[type].keys.contains(fn)) return this; + events[type].keys.push(fn); + var realType = type, + custom = Element.Events[type], + condition = fn, + self = this; + if (custom){ + if (custom.onAdd) custom.onAdd.call(this, fn); + if (custom.condition){ + condition = function(event){ + if (custom.condition.call(this, event)) return fn.call(this, event); + return true; + }; + } + realType = custom.base || realType; + } + var defn = function(){ + return fn.call(self); + }; + var nativeEvent = Element.NativeEvents[realType]; + if (nativeEvent){ + if (nativeEvent == 2){ + defn = function(event){ + event = new Event(event, self.getWindow()); + if (condition.call(self, event) === false) event.stop(); + }; + } + this.addListener(realType, defn, arguments[2]); + } + events[type].values.push(defn); + return this; + }, + + removeEvent: function(type, fn){ + var events = this.retrieve('events'); + if (!events || !events[type]) return this; + var list = events[type]; + var index = list.keys.indexOf(fn); + if (index == -1) return this; + var value = list.values[index]; + delete list.keys[index]; + delete list.values[index]; + var custom = Element.Events[type]; + if (custom){ + if (custom.onRemove) custom.onRemove.call(this, fn); + type = custom.base || type; + } + return (Element.NativeEvents[type]) ? this.removeListener(type, value, arguments[2]) : this; + }, + + addEvents: function(events){ + for (var event in events) this.addEvent(event, events[event]); + return this; + }, + + removeEvents: function(events){ + var type; + if (typeOf(events) == 'object'){ + for (type in events) this.removeEvent(type, events[type]); + return this; + } + var attached = this.retrieve('events'); + if (!attached) return this; + if (!events){ + for (type in attached) this.removeEvents(type); + this.eliminate('events'); + } else if (attached[events]){ + attached[events].keys.each(function(fn){ + this.removeEvent(events, fn); + }, this); + delete attached[events]; + } + return this; + }, + + fireEvent: function(type, args, delay){ + var events = this.retrieve('events'); + if (!events || !events[type]) return this; + args = Array.from(args); + + events[type].keys.each(function(fn){ + if (delay) fn.delay(delay, this, args); + else fn.apply(this, args); + }, this); + return this; + }, + + cloneEvents: function(from, type){ + from = document.id(from); + var events = from.retrieve('events'); + if (!events) return this; + if (!type){ + for (var eventType in events) this.cloneEvents(from, eventType); + } else if (events[type]){ + events[type].keys.each(function(fn){ + this.addEvent(type, fn); + }, this); + } + return this; + } + +}); + +Element.NativeEvents = { + click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons + mousewheel: 2, DOMMouseScroll: 2, //mouse wheel + mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement + keydown: 2, keypress: 2, keyup: 2, //keyboard + orientationchange: 2, // mobile + touchstart: 2, touchmove: 2, touchend: 2, touchcancel: 2, // touch + gesturestart: 2, gesturechange: 2, gestureend: 2, // gesture + focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, //form elements + load: 2, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window + error: 1, abort: 1, scroll: 1 //misc +}; + +var check = function(event){ + var related = event.relatedTarget; + if (related == null) return true; + if (!related) return false; + return (related != this && related.prefix != 'xul' && typeOf(this) != 'document' && !this.contains(related)); +}; + +Element.Events = { + + mouseenter: { + base: 'mouseover', + condition: check + }, + + mouseleave: { + base: 'mouseout', + condition: check + }, + + mousewheel: { + base: (Browser.firefox) ? 'DOMMouseScroll' : 'mousewheel' + } + +}; + + + +}).call(this); + + +/* +--- + +name: Element.Dimensions + +description: Contains methods to work with size, scroll, or positioning of Elements and the window object. + +license: MIT-style license. + +credits: + - Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html). + - Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html). + +requires: [Element, Element.Style] + +provides: [Element.Dimensions] + +... +*/ + +(function(){ + +var element = document.createElement('div'), + child = document.createElement('div'); +element.style.height = '0'; +element.appendChild(child); +var brokenOffsetParent = (child.offsetParent === element); +element = child = null; + +var isOffset = function(el){ + return styleString(el, 'position') != 'static' || isBody(el); +}; + +var isOffsetStatic = function(el){ + return isOffset(el) || (/^(?:table|td|th)$/i).test(el.tagName); +}; + +Element.implement({ + + scrollTo: function(x, y){ + if (isBody(this)){ + this.getWindow().scrollTo(x, y); + } else { + this.scrollLeft = x; + this.scrollTop = y; + } + return this; + }, + + getSize: function(){ + if (isBody(this)) return this.getWindow().getSize(); + return {x: this.offsetWidth, y: this.offsetHeight}; + }, + + getScrollSize: function(){ + if (isBody(this)) return this.getWindow().getScrollSize(); + return {x: this.scrollWidth, y: this.scrollHeight}; + }, + + getScroll: function(){ + if (isBody(this)) return this.getWindow().getScroll(); + return {x: this.scrollLeft, y: this.scrollTop}; + }, + + getScrolls: function(){ + var element = this.parentNode, position = {x: 0, y: 0}; + while (element && !isBody(element)){ + position.x += element.scrollLeft; + position.y += element.scrollTop; + element = element.parentNode; + } + return position; + }, + + getOffsetParent: brokenOffsetParent ? function(){ + var element = this; + if (isBody(element) || styleString(element, 'position') == 'fixed') return null; + + var isOffsetCheck = (styleString(element, 'position') == 'static') ? isOffsetStatic : isOffset; + while ((element = element.parentNode)){ + if (isOffsetCheck(element)) return element; + } + return null; + } : function(){ + var element = this; + if (isBody(element) || styleString(element, 'position') == 'fixed') return null; + + try { + return element.offsetParent; + } catch(e) {} + return null; + }, + + getOffsets: function(){ + if (this.getBoundingClientRect && !Browser.Platform.ios){ + var bound = this.getBoundingClientRect(), + html = document.id(this.getDocument().documentElement), + htmlScroll = html.getScroll(), + elemScrolls = this.getScrolls(), + isFixed = (styleString(this, 'position') == 'fixed'); + + return { + x: bound.left.toInt() + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft, + y: bound.top.toInt() + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop + }; + } + + var element = this, position = {x: 0, y: 0}; + if (isBody(this)) return position; + + while (element && !isBody(element)){ + position.x += element.offsetLeft; + position.y += element.offsetTop; + + if (Browser.firefox){ + if (!borderBox(element)){ + position.x += leftBorder(element); + position.y += topBorder(element); + } + var parent = element.parentNode; + if (parent && styleString(parent, 'overflow') != 'visible'){ + position.x += leftBorder(parent); + position.y += topBorder(parent); + } + } else if (element != this && Browser.safari){ + position.x += leftBorder(element); + position.y += topBorder(element); + } + + element = element.offsetParent; + } + if (Browser.firefox && !borderBox(this)){ + position.x -= leftBorder(this); + position.y -= topBorder(this); + } + return position; + }, + + getPosition: function(relative){ + if (isBody(this)) return {x: 0, y: 0}; + var offset = this.getOffsets(), + scroll = this.getScrolls(); + var position = { + x: offset.x - scroll.x, + y: offset.y - scroll.y + }; + + if (relative && (relative = document.id(relative))){ + var relativePosition = relative.getPosition(); + return {x: position.x - relativePosition.x - leftBorder(relative), y: position.y - relativePosition.y - topBorder(relative)}; + } + return position; + }, + + getCoordinates: function(element){ + if (isBody(this)) return this.getWindow().getCoordinates(); + var position = this.getPosition(element), + size = this.getSize(); + var obj = { + left: position.x, + top: position.y, + width: size.x, + height: size.y + }; + obj.right = obj.left + obj.width; + obj.bottom = obj.top + obj.height; + return obj; + }, + + computePosition: function(obj){ + return { + left: obj.x - styleNumber(this, 'margin-left'), + top: obj.y - styleNumber(this, 'margin-top') + }; + }, + + setPosition: function(obj){ + return this.setStyles(this.computePosition(obj)); + } + +}); + + +[Document, Window].invoke('implement', { + + getSize: function(){ + var doc = getCompatElement(this); + return {x: doc.clientWidth, y: doc.clientHeight}; + }, + + getScroll: function(){ + var win = this.getWindow(), doc = getCompatElement(this); + return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop}; + }, + + getScrollSize: function(){ + var doc = getCompatElement(this), + min = this.getSize(), + body = this.getDocument().body; + + return {x: Math.max(doc.scrollWidth, body.scrollWidth, min.x), y: Math.max(doc.scrollHeight, body.scrollHeight, min.y)}; + }, + + getPosition: function(){ + return {x: 0, y: 0}; + }, + + getCoordinates: function(){ + var size = this.getSize(); + return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x}; + } + +}); + +// private methods + +var styleString = Element.getComputedStyle; + +function styleNumber(element, style){ + return styleString(element, style).toInt() || 0; +} + +function borderBox(element){ + return styleString(element, '-moz-box-sizing') == 'border-box'; +} + +function topBorder(element){ + return styleNumber(element, 'border-top-width'); +} + +function leftBorder(element){ + return styleNumber(element, 'border-left-width'); +} + +function isBody(element){ + return (/^(?:body|html)$/i).test(element.tagName); +} + +function getCompatElement(element){ + var doc = element.getDocument(); + return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body; +} + +}).call(this); + +//aliases +Element.alias({position: 'setPosition'}); //compatability + +[Window, Document, Element].invoke('implement', { + + getHeight: function(){ + return this.getSize().y; + }, + + getWidth: function(){ + return this.getSize().x; + }, + + getScrollTop: function(){ + return this.getScroll().y; + }, + + getScrollLeft: function(){ + return this.getScroll().x; + }, + + getScrollHeight: function(){ + return this.getScrollSize().y; + }, + + getScrollWidth: function(){ + return this.getScrollSize().x; + }, + + getTop: function(){ + return this.getPosition().y; + }, + + getLeft: function(){ + return this.getPosition().x; + } + +}); + + +/* +--- + +name: Fx + +description: Contains the basic animation logic to be extended by all other Fx Classes. + +license: MIT-style license. + +requires: [Chain, Events, Options] + +provides: Fx + +... +*/ + +(function(){ + +var Fx = this.Fx = new Class({ + + Implements: [Chain, Events, Options], + + options: { + /* + onStart: nil, + onCancel: nil, + onComplete: nil, + */ + fps: 60, + unit: false, + duration: 500, + frames: null, + frameSkip: true, + link: 'ignore' + }, + + initialize: function(options){ + this.subject = this.subject || this; + this.setOptions(options); + }, + + getTransition: function(){ + return function(p){ + return -(Math.cos(Math.PI * p) - 1) / 2; + }; + }, + + step: function(now){ + if (this.options.frameSkip){ + var diff = (this.time != null) ? (now - this.time) : 0, frames = diff / this.frameInterval; + this.time = now; + this.frame += frames; + } else { + this.frame++; + } + + if (this.frame < this.frames){ + var delta = this.transition(this.frame / this.frames); + this.set(this.compute(this.from, this.to, delta)); + } else { + this.frame = this.frames; + this.set(this.compute(this.from, this.to, 1)); + this.stop(); + } + }, + + set: function(now){ + return now; + }, + + compute: function(from, to, delta){ + return Fx.compute(from, to, delta); + }, + + check: function(){ + if (!this.isRunning()) return true; + switch (this.options.link){ + case 'cancel': this.cancel(); return true; + case 'chain': this.chain(this.caller.pass(arguments, this)); return false; + } + return false; + }, + + start: function(from, to){ + if (!this.check(from, to)) return this; + this.from = from; + this.to = to; + this.frame = (this.options.frameSkip) ? 0 : -1; + this.time = null; + this.transition = this.getTransition(); + var frames = this.options.frames, fps = this.options.fps, duration = this.options.duration; + this.duration = Fx.Durations[duration] || duration.toInt(); + this.frameInterval = 1000 / fps; + this.frames = frames || Math.round(this.duration / this.frameInterval); + this.fireEvent('start', this.subject); + pushInstance.call(this, fps); + return this; + }, + + stop: function(){ + if (this.isRunning()){ + this.time = null; + pullInstance.call(this, this.options.fps); + if (this.frames == this.frame){ + this.fireEvent('complete', this.subject); + if (!this.callChain()) this.fireEvent('chainComplete', this.subject); + } else { + this.fireEvent('stop', this.subject); + } + } + return this; + }, + + cancel: function(){ + if (this.isRunning()){ + this.time = null; + pullInstance.call(this, this.options.fps); + this.frame = this.frames; + this.fireEvent('cancel', this.subject).clearChain(); + } + return this; + }, + + pause: function(){ + if (this.isRunning()){ + this.time = null; + pullInstance.call(this, this.options.fps); + } + return this; + }, + + resume: function(){ + if ((this.frame < this.frames) && !this.isRunning()) pushInstance.call(this, this.options.fps); + return this; + }, + + isRunning: function(){ + var list = instances[this.options.fps]; + return list && list.contains(this); + } + +}); + +Fx.compute = function(from, to, delta){ + return (to - from) * delta + from; +}; + +Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000}; + +// global timers + +var instances = {}, timers = {}; + +var loop = function(){ + var now = Date.now(); + for (var i = this.length; i--;){ + var instance = this[i]; + if (instance) instance.step(now); + } +}; + +var pushInstance = function(fps){ + var list = instances[fps] || (instances[fps] = []); + list.push(this); + if (!timers[fps]) timers[fps] = loop.periodical(Math.round(1000 / fps), list); +}; + +var pullInstance = function(fps){ + var list = instances[fps]; + if (list){ + list.erase(this); + if (!list.length && timers[fps]){ + delete instances[fps]; + timers[fps] = clearInterval(timers[fps]); + } + } +}; + +}).call(this); + + +/* +--- + +name: Fx.CSS + +description: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements. + +license: MIT-style license. + +requires: [Fx, Element.Style] + +provides: Fx.CSS + +... +*/ + +Fx.CSS = new Class({ + + Extends: Fx, + + //prepares the base from/to object + + prepare: function(element, property, values){ + values = Array.from(values); + if (values[1] == null){ + values[1] = values[0]; + values[0] = element.getStyle(property); + } + var parsed = values.map(this.parse); + return {from: parsed[0], to: parsed[1]}; + }, + + //parses a value into an array + + parse: function(value){ + value = Function.from(value)(); + value = (typeof value == 'string') ? value.split(' ') : Array.from(value); + return value.map(function(val){ + val = String(val); + var found = false; + Object.each(Fx.CSS.Parsers, function(parser, key){ + if (found) return; + var parsed = parser.parse(val); + if (parsed || parsed === 0) found = {value: parsed, parser: parser}; + }); + found = found || {value: val, parser: Fx.CSS.Parsers.String}; + return found; + }); + }, + + //computes by a from and to prepared objects, using their parsers. + + compute: function(from, to, delta){ + var computed = []; + (Math.min(from.length, to.length)).times(function(i){ + computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser}); + }); + computed.$family = Function.from('fx:css:value'); + return computed; + }, + + //serves the value as settable + + serve: function(value, unit){ + if (typeOf(value) != 'fx:css:value') value = this.parse(value); + var returned = []; + value.each(function(bit){ + returned = returned.concat(bit.parser.serve(bit.value, unit)); + }); + return returned; + }, + + //renders the change to an element + + render: function(element, property, value, unit){ + element.setStyle(property, this.serve(value, unit)); + }, + + //searches inside the page css to find the values for a selector + + search: function(selector){ + if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector]; + var to = {}, selectorTest = new RegExp('^' + selector.escapeRegExp() + '$'); + Array.each(document.styleSheets, function(sheet, j){ + var href = sheet.href; + if (href && href.contains('://') && !href.contains(document.domain)) return; + var rules = sheet.rules || sheet.cssRules; + Array.each(rules, function(rule, i){ + if (!rule.style) return; + var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){ + return m.toLowerCase(); + }) : null; + if (!selectorText || !selectorTest.test(selectorText)) return; + Object.each(Element.Styles, function(value, style){ + if (!rule.style[style] || Element.ShortStyles[style]) return; + value = String(rule.style[style]); + to[style] = ((/^rgb/).test(value)) ? value.rgbToHex() : value; + }); + }); + }); + return Fx.CSS.Cache[selector] = to; + } + +}); + +Fx.CSS.Cache = {}; + +Fx.CSS.Parsers = { + + Color: { + parse: function(value){ + if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true); + return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false; + }, + compute: function(from, to, delta){ + return from.map(function(value, i){ + return Math.round(Fx.compute(from[i], to[i], delta)); + }); + }, + serve: function(value){ + return value.map(Number); + } + }, + + Number: { + parse: parseFloat, + compute: Fx.compute, + serve: function(value, unit){ + return (unit) ? value + unit : value; + } + }, + + String: { + parse: Function.from(false), + compute: function(zero, one){ + return one; + }, + serve: function(zero){ + return zero; + } + } + +}; + + + + +/* +--- + +name: Fx.Tween + +description: Formerly Fx.Style, effect to transition any CSS property for an element. + +license: MIT-style license. + +requires: Fx.CSS + +provides: [Fx.Tween, Element.fade, Element.highlight] + +... +*/ + +Fx.Tween = new Class({ + + Extends: Fx.CSS, + + initialize: function(element, options){ + this.element = this.subject = document.id(element); + this.parent(options); + }, + + set: function(property, now){ + if (arguments.length == 1){ + now = property; + property = this.property || this.options.property; + } + this.render(this.element, property, now, this.options.unit); + return this; + }, + + start: function(property, from, to){ + if (!this.check(property, from, to)) return this; + var args = Array.flatten(arguments); + this.property = this.options.property || args.shift(); + var parsed = this.prepare(this.element, this.property, args); + return this.parent(parsed.from, parsed.to); + } + +}); + +Element.Properties.tween = { + + set: function(options){ + this.get('tween').cancel().setOptions(options); + return this; + }, + + get: function(){ + var tween = this.retrieve('tween'); + if (!tween){ + tween = new Fx.Tween(this, {link: 'cancel'}); + this.store('tween', tween); + } + return tween; + } + +}; + +Element.implement({ + + tween: function(property, from, to){ + this.get('tween').start(arguments); + return this; + }, + + fade: function(how){ + var fade = this.get('tween'), o = 'opacity', toggle; + how = [how, 'toggle'].pick(); + switch (how){ + case 'in': fade.start(o, 1); break; + case 'out': fade.start(o, 0); break; + case 'show': fade.set(o, 1); break; + case 'hide': fade.set(o, 0); break; + case 'toggle': + var flag = this.retrieve('fade:flag', this.get('opacity') == 1); + fade.start(o, (flag) ? 0 : 1); + this.store('fade:flag', !flag); + toggle = true; + break; + default: fade.start(o, arguments); + } + if (!toggle) this.eliminate('fade:flag'); + return this; + }, + + highlight: function(start, end){ + if (!end){ + end = this.retrieve('highlight:original', this.getStyle('background-color')); + end = (end == 'transparent') ? '#fff' : end; + } + var tween = this.get('tween'); + tween.start('background-color', start || '#ffff88', end).chain(function(){ + this.setStyle('background-color', this.retrieve('highlight:original')); + tween.callChain(); + }.bind(this)); + return this; + } + +}); + + +/* +--- + +name: Fx.Morph + +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. + +license: MIT-style license. + +requires: Fx.CSS + +provides: Fx.Morph + +... +*/ + +Fx.Morph = new Class({ + + Extends: Fx.CSS, + + initialize: function(element, options){ + this.element = this.subject = document.id(element); + this.parent(options); + }, + + set: function(now){ + if (typeof now == 'string') now = this.search(now); + for (var p in now) this.render(this.element, p, now[p], this.options.unit); + return this; + }, + + compute: function(from, to, delta){ + var now = {}; + for (var p in from) now[p] = this.parent(from[p], to[p], delta); + return now; + }, + + start: function(properties){ + if (!this.check(properties)) return this; + if (typeof properties == 'string') properties = this.search(properties); + var from = {}, to = {}; + for (var p in properties){ + var parsed = this.prepare(this.element, p, properties[p]); + from[p] = parsed.from; + to[p] = parsed.to; + } + return this.parent(from, to); + } + +}); + +Element.Properties.morph = { + + set: function(options){ + this.get('morph').cancel().setOptions(options); + return this; + }, + + get: function(){ + var morph = this.retrieve('morph'); + if (!morph){ + morph = new Fx.Morph(this, {link: 'cancel'}); + this.store('morph', morph); + } + return morph; + } + +}; + +Element.implement({ + + morph: function(props){ + this.get('morph').start(props); + return this; + } + +}); + + +/* +--- + +name: Fx.Transitions + +description: Contains a set of advanced transitions to be used with any of the Fx Classes. + +license: MIT-style license. + +credits: + - Easing Equations by Robert Penner, , modified and optimized to be used with MooTools. + +requires: Fx + +provides: Fx.Transitions + +... +*/ + +Fx.implement({ + + getTransition: function(){ + var trans = this.options.transition || Fx.Transitions.Sine.easeInOut; + if (typeof trans == 'string'){ + var data = trans.split(':'); + trans = Fx.Transitions; + trans = trans[data[0]] || trans[data[0].capitalize()]; + if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')]; + } + return trans; + } + +}); + +Fx.Transition = function(transition, params){ + params = Array.from(params); + var easeIn = function(pos){ + return transition(pos, params); + }; + return Object.append(easeIn, { + easeIn: easeIn, + easeOut: function(pos){ + return 1 - transition(1 - pos, params); + }, + easeInOut: function(pos){ + return (pos <= 0.5 ? transition(2 * pos, params) : (2 - transition(2 * (1 - pos), params))) / 2; + } + }); +}; + +Fx.Transitions = { + + linear: function(zero){ + return zero; + } + +}; + + + +Fx.Transitions.extend = function(transitions){ + for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]); +}; + +Fx.Transitions.extend({ + + Pow: function(p, x){ + return Math.pow(p, x && x[0] || 6); + }, + + Expo: function(p){ + return Math.pow(2, 8 * (p - 1)); + }, + + Circ: function(p){ + return 1 - Math.sin(Math.acos(p)); + }, + + Sine: function(p){ + return 1 - Math.cos(p * Math.PI / 2); + }, + + Back: function(p, x){ + x = x && x[0] || 1.618; + return Math.pow(p, 2) * ((x + 1) * p - x); + }, + + Bounce: function(p){ + var value; + for (var a = 0, b = 1; 1; a += b, b /= 2){ + if (p >= (7 - 4 * a) / 11){ + value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2); + break; + } + } + return value; + }, + + Elastic: function(p, x){ + return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x && x[0] || 1) / 3); + } + +}); + +['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){ + Fx.Transitions[transition] = new Fx.Transition(function(p){ + return Math.pow(p, i + 2); + }); +}); + + +/* +--- + +name: Request + +description: Powerful all purpose Request Class. Uses XMLHTTPRequest. + +license: MIT-style license. + +requires: [Object, Element, Chain, Events, Options, Browser] + +provides: Request + +... +*/ + +(function(){ + +var empty = function(){}, + progressSupport = ('onprogress' in new Browser.Request); + +var Request = this.Request = new Class({ + + Implements: [Chain, Events, Options], + + options: {/* + onRequest: function(){}, + onLoadstart: function(event, xhr){}, + onProgress: function(event, xhr){}, + onComplete: function(){}, + onCancel: function(){}, + onSuccess: function(responseText, responseXML){}, + onFailure: function(xhr){}, + onException: function(headerName, value){}, + onTimeout: function(){}, + user: '', + password: '',*/ + 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, + timeout: 0, + noCache: false + }, + + initialize: function(options){ + this.xhr = new Browser.Request(); + this.setOptions(options); + this.headers = this.options.headers; + }, + + onStateChange: function(){ + var xhr = this.xhr; + if (xhr.readyState != 4 || !this.running) return; + this.running = false; + this.status = 0; + Function.attempt(function(){ + var status = xhr.status; + this.status = (status == 1223) ? 204 : status; + }.bind(this)); + xhr.onreadystatechange = empty; + if (progressSupport) xhr.onprogress = xhr.onloadstart = empty; + clearTimeout(this.timer); + + this.response = {text: this.xhr.responseText || '', xml: this.xhr.responseXML}; + if (this.options.isSuccess.call(this, this.status)) + this.success(this.response.text, this.response.xml); + else + this.failure(); + }, + + isSuccess: function(){ + var status = this.status; + return (status >= 200 && status < 300); + }, + + isRunning: function(){ + return !!this.running; + }, + + processScripts: function(text){ + if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return Browser.exec(text); + return text.stripScripts(this.options.evalScripts); + }, + + success: function(text, xml){ + this.onSuccess(this.processScripts(text), xml); + }, + + onSuccess: function(){ + this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain(); + }, + + failure: function(){ + this.onFailure(); + }, + + onFailure: function(){ + this.fireEvent('complete').fireEvent('failure', this.xhr); + }, + + loadstart: function(event){ + this.fireEvent('loadstart', [event, this.xhr]); + }, + + progress: function(event){ + this.fireEvent('progress', [event, this.xhr]); + }, + + timeout: function(){ + this.fireEvent('timeout', this.xhr); + }, + + setHeader: function(name, value){ + this.headers[name] = value; + return this; + }, + + getHeader: function(name){ + return Function.attempt(function(){ + return this.xhr.getResponseHeader(name); + }.bind(this)); + }, + + check: function(){ + if (!this.running) return true; + switch (this.options.link){ + case 'cancel': this.cancel(); return true; + case 'chain': this.chain(this.caller.pass(arguments, this)); return false; + } + return false; + }, + + send: function(options){ + if (!this.check(options)) return this; + + this.options.isSuccess = this.options.isSuccess || this.isSuccess; + this.running = true; + + var type = typeOf(options); + if (type == 'string' || type == 'element') options = {data: options}; + + var old = this.options; + options = Object.append({data: old.data, url: old.url, method: old.method}, options); + var data = options.data, url = String(options.url), method = options.method.toLowerCase(); + + switch (typeOf(data)){ + case 'element': data = document.id(data).toQueryString(); break; + case 'object': case 'hash': data = Object.toQueryString(data); + } + + if (this.options.format){ + var format = 'format=' + this.options.format; + data = (data) ? format + '&' + data : format; + } + + if (this.options.emulation && !['get', 'post'].contains(method)){ + var _method = '_method=' + method; + data = (data) ? _method + '&' + data : _method; + method = 'post'; + } + + if (this.options.urlEncoded && ['post', 'put'].contains(method)){ + var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : ''; + this.headers['Content-type'] = 'application/x-www-form-urlencoded' + encoding; + } + + if (!url) url = document.location.pathname; + + var trimPosition = url.lastIndexOf('/'); + if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition); + + if (this.options.noCache) + url += (url.contains('?') ? '&' : '?') + String.uniqueID(); + + if (data && method == 'get'){ + url += (url.contains('?') ? '&' : '?') + data; + data = null; + } + + var xhr = this.xhr; + if (progressSupport){ + xhr.onloadstart = this.loadstart.bind(this); + xhr.onprogress = this.progress.bind(this); + } + + xhr.open(method.toUpperCase(), url, this.options.async, this.options.user, this.options.password); + if (this.options.user && 'withCredentials' in xhr) xhr.withCredentials = true; + + xhr.onreadystatechange = this.onStateChange.bind(this); + + Object.each(this.headers, function(value, key){ + try { + xhr.setRequestHeader(key, value); + } catch (e){ + this.fireEvent('exception', [key, value]); + } + }, this); + + this.fireEvent('request'); + xhr.send(data); + if (!this.options.async) this.onStateChange(); + if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this); + return this; + }, + + cancel: function(){ + if (!this.running) return this; + this.running = false; + var xhr = this.xhr; + xhr.abort(); + clearTimeout(this.timer); + xhr.onreadystatechange = empty; + if (progressSupport) xhr.onprogress = xhr.onloadstart = empty; + this.xhr = new Browser.Request(); + this.fireEvent('cancel'); + return this; + } + +}); + +var methods = {}; +['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){ + methods[method] = function(data){ + var object = { + method: method + }; + if (data != null) object.data = data; + return this.send(object); + }; +}); + +Request.implement(methods); + +Element.Properties.send = { + + set: function(options){ + var send = this.get('send').cancel(); + send.setOptions(options); + return this; + }, + + get: function(){ + var send = this.retrieve('send'); + if (!send){ + send = new Request({ + data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action') + }); + this.store('send', send); + } + return send; + } + +}; + +Element.implement({ + + send: function(url){ + var sender = this.get('send'); + sender.send({data: this, url: url || sender.options.url}); + return this; + } + +}); + +})(); + +/* +--- + +name: Request.HTML + +description: Extends the basic Request Class with additional methods for interacting with HTML responses. + +license: MIT-style license. + +requires: [Element, Request] + +provides: Request.HTML + +... +*/ + +Request.HTML = new Class({ + + Extends: Request, + + options: { + update: false, + append: false, + evalScripts: true, + filter: false, + headers: { + Accept: 'text/html, application/xml, text/xml, */*' + } + }, + + success: function(text){ + var options = this.options, response = this.response; + + response.html = text.stripScripts(function(script){ + response.javascript = script; + }); + + var match = response.html.match(/]*>([\s\S]*?)<\/body>/i); + if (match) response.html = match[1]; + var temp = new Element('div').set('html', response.html); + + response.tree = temp.childNodes; + response.elements = temp.getElements('*'); + + if (options.filter) response.tree = response.elements.filter(options.filter); + if (options.update) document.id(options.update).empty().set('html', response.html); + else if (options.append) document.id(options.append).adopt(temp.getChildren()); + if (options.evalScripts) Browser.exec(response.javascript); + + this.onSuccess(response.tree, response.elements, response.html, response.javascript); + } + +}); + +Element.Properties.load = { + + set: function(options){ + var load = this.get('load').cancel(); + load.setOptions(options); + return this; + }, + + get: function(){ + var load = this.retrieve('load'); + if (!load){ + load = new Request.HTML({data: this, link: 'cancel', update: this, method: 'get'}); + this.store('load', load); + } + return load; + } + +}; + +Element.implement({ + + load: function(){ + this.get('load').send(Array.link(arguments, {data: Type.isObject, url: Type.isString})); + return this; + } + +}); + + +/* +--- + +name: JSON + +description: JSON encoder and decoder. + +license: MIT-style license. + +See Also: + +requires: [Array, String, Number, Function] + +provides: JSON + +... +*/ + +if (typeof JSON == 'undefined') this.JSON = {}; + + + +(function(){ + +var special = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'}; + +var escape = function(chr){ + return special[chr] || '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4); +}; + +JSON.validate = function(string){ + string = string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'). + replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'). + replace(/(?:^|:|,)(?:\s*\[)+/g, ''); + + return (/^[\],:{}\s]*$/).test(string); +}; + +JSON.encode = JSON.stringify ? function(obj){ + return JSON.stringify(obj); +} : function(obj){ + if (obj && obj.toJSON) obj = obj.toJSON(); + + switch (typeOf(obj)){ + case 'string': + return '"' + obj.replace(/[\x00-\x1f\\"]/g, escape) + '"'; + case 'array': + return '[' + obj.map(JSON.encode).clean() + ']'; + case 'object': case 'hash': + var string = []; + Object.each(obj, function(value, key){ + var json = JSON.encode(value); + if (json) string.push(JSON.encode(key) + ':' + json); + }); + return '{' + string + '}'; + case 'number': case 'boolean': return '' + obj; + case 'null': return 'null'; + } + + return null; +}; + +JSON.decode = function(string, secure){ + if (!string || typeOf(string) != 'string') return null; + + if (secure || JSON.secure){ + if (JSON.parse) return JSON.parse(string); + if (!JSON.validate(string)) throw new Error('JSON could not decode the input; security is enabled and the value is not secure.'); + } + + return eval('(' + string + ')'); +}; + +}).call(this); + + +/* +--- + +name: Request.JSON + +description: Extends the basic Request Class with additional methods for sending and receiving JSON data. + +license: MIT-style license. + +requires: [Request, JSON] + +provides: Request.JSON + +... +*/ + +Request.JSON = new Class({ + + Extends: Request, + + options: { + /*onError: function(text, error){},*/ + secure: true + }, + + initialize: function(options){ + this.parent(options); + Object.append(this.headers, { + 'Accept': 'application/json', + 'X-Request': 'JSON' + }); + }, + + success: function(text){ + var json; + try { + json = this.response.json = JSON.decode(text, this.options.secure); + } catch (error){ + this.fireEvent('error', [text, error]); + return; + } + if (json == null) this.onFailure(); + else this.onSuccess(json, text); + } + +}); + + +/* +--- + +name: Cookie + +description: Class for creating, reading, and deleting browser Cookies. + +license: MIT-style license. + +credits: + - Based on the functions by Peter-Paul Koch (http://quirksmode.org). + +requires: [Options, Browser] + +provides: Cookie + +... +*/ + +var Cookie = new Class({ + + Implements: Options, + + options: { + path: '/', + domain: false, + duration: false, + secure: false, + document: document, + encode: true + }, + + initialize: function(key, options){ + this.key = key; + this.setOptions(options); + }, + + write: function(value){ + if (this.options.encode) value = encodeURIComponent(value); + if (this.options.domain) value += '; domain=' + this.options.domain; + if (this.options.path) value += '; path=' + this.options.path; + if (this.options.duration){ + var date = new Date(); + date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000); + value += '; expires=' + date.toGMTString(); + } + if (this.options.secure) value += '; secure'; + this.options.document.cookie = this.key + '=' + value; + return this; + }, + + read: function(){ + var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)'); + return (value) ? decodeURIComponent(value[1]) : null; + }, + + dispose: function(){ + new Cookie(this.key, Object.merge({}, this.options, {duration: -1})).write(''); + return this; + } + +}); + +Cookie.write = function(key, value, options){ + return new Cookie(key, options).write(value); +}; + +Cookie.read = function(key){ + return new Cookie(key).read(); +}; + +Cookie.dispose = function(key, options){ + return new Cookie(key, options).dispose(); +}; + + +/* +--- + +name: DOMReady + +description: Contains the custom event domready. + +license: MIT-style license. + +requires: [Browser, Element, Element.Event] + +provides: [DOMReady, DomReady] + +... +*/ + +(function(window, document){ + +var ready, + loaded, + checks = [], + shouldPoll, + timer, + isFramed = true; + +// Thanks to Rich Dougherty +try { + isFramed = window.frameElement != null; +} catch(e){} + +var domready = function(){ + clearTimeout(timer); + if (ready) return; + Browser.loaded = ready = true; + document.removeListener('DOMContentLoaded', domready).removeListener('readystatechange', check); + + document.fireEvent('domready'); + window.fireEvent('domready'); +}; + +var check = function(){ + for (var i = checks.length; i--;) if (checks[i]()){ + domready(); + return true; + } + + return false; +}; + +var poll = function(){ + clearTimeout(timer); + if (!check()) timer = setTimeout(poll, 10); +}; + +document.addListener('DOMContentLoaded', domready); + +// doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/ +var testElement = document.createElement('div'); +if (testElement.doScroll && !isFramed){ + checks.push(function(){ + try { + testElement.doScroll(); + return true; + } catch (e){} + + return false; + }); + shouldPoll = true; +} + +if (document.readyState) checks.push(function(){ + var state = document.readyState; + return (state == 'loaded' || state == 'complete'); +}); + +if ('onreadystatechange' in document) document.addListener('readystatechange', check); +else shouldPoll = true; + +if (shouldPoll) poll(); + +Element.Events.domready = { + onAdd: function(fn){ + if (ready) fn.call(this); + } +}; + +// Make sure that domready fires before load +Element.Events.load = { + base: 'load', + onAdd: function(fn){ + if (loaded && this == window) fn.call(this); + }, + condition: function(){ + if (this == window){ + domready(); + delete Element.Events.load; + } + + return true; + } +}; + +// This is based on the custom load event +window.addEvent('load', function(){ + loaded = true; +}); + +})(window, document); + + +/* +--- + +name: Swiff + +description: Wrapper for embedding SWF movies. Supports External Interface Communication. + +license: MIT-style license. + +credits: + - Flash detection & Internet Explorer + Flash Player 9 fix inspired by SWFObject. + +requires: [Options, Object, Element] + +provides: Swiff + +... +*/ + +(function(){ + +var Swiff = this.Swiff = new Class({ + + Implements: Options, + + options: { + id: null, + height: 1, + width: 1, + container: null, + properties: {}, + params: { + quality: 'high', + allowScriptAccess: 'always', + wMode: 'window', + swLiveConnect: true + }, + callBacks: {}, + vars: {} + }, + + toElement: function(){ + return this.object; + }, + + initialize: function(path, options){ + this.instance = 'Swiff_' + String.uniqueID(); + + this.setOptions(options); + options = this.options; + var id = this.id = options.id || this.instance; + var container = document.id(options.container); + + Swiff.CallBacks[this.instance] = {}; + + var params = options.params, vars = options.vars, callBacks = options.callBacks; + var properties = Object.append({height: options.height, width: options.width}, options.properties); + + var self = this; + + for (var callBack in callBacks){ + Swiff.CallBacks[this.instance][callBack] = (function(option){ + return function(){ + return option.apply(self.object, arguments); + }; + })(callBacks[callBack]); + vars[callBack] = 'Swiff.CallBacks.' + this.instance + '.' + callBack; + } + + params.flashVars = Object.toQueryString(vars); + if (Browser.ie){ + properties.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; + params.movie = path; + } else { + properties.type = 'application/x-shockwave-flash'; + } + properties.data = path; + + var build = ''; + } + build += ''; + this.object = ((container) ? container.empty() : new Element('div')).set('html', build).firstChild; + }, + + replaces: function(element){ + element = document.id(element, true); + element.parentNode.replaceChild(this.toElement(), element); + return this; + }, + + inject: function(element){ + document.id(element, true).appendChild(this.toElement()); + return this; + }, + + remote: function(){ + return Swiff.remote.apply(Swiff, [this.toElement()].append(arguments)); + } + +}); + +Swiff.CallBacks = {}; + +Swiff.remote = function(obj, fn){ + var rs = obj.CallFunction('' + __flash__argumentsToXML(arguments, 2) + ''); + return eval(rs); +}; + +}).call(this); + + diff --git a/source/javascripts/octopress.js b/source/javascripts/octopress.js index d5173a4..bf94ebe 100644 --- a/source/javascripts/octopress.js +++ b/source/javascripts/octopress.js @@ -3,6 +3,35 @@ window.addEvent('domready', function() { codeblocks.each(addExpander); }); +window.addEvents({ + domready: function(){ + if(twitter_user){ + new Request.Twitter(twitter_user, { + include_replies: false, + data: { count: 3 }, + onSuccess: function(tweets){ + $('tweets').empty(); + for (var i = tweets.length; i--; ){ + new Element('li', { + 'class': 'tweet' + }).adopt( + new Element('p', { 'html': tweets[i].text+' ' }).adopt( + new Element('a', { + 'href': 'http://twitter.com/'+twitter_user+'/status/'+tweets[i].id_str, + 'text': new Date(tweets[i].created_at).timeDiffInWords() + })) + ).inject('tweets', 'top'); + } + } + }).send(); + } + $$('#recent_posts time').each(function(date){ + date.set('text', new Date(date.get('text')).timeDiffInWords()); + }); + }, +}); + + function addExpander(div){ new Element('span',{ html: 'expand »', @@ -44,4 +73,4 @@ function enableCompressedLayout(codeblocks){ } } }).inject($('main'), 'top'); -} \ No newline at end of file +} diff --git a/source/javascripts/pinboard.js b/source/javascripts/pinboard.js new file mode 100644 index 0000000..01d4362 --- /dev/null +++ b/source/javascripts/pinboard.js @@ -0,0 +1,52 @@ +var count = pinboard_count; +var linkroll = 'pinboard_linkroll'; +function pinboardNS_fetch_script(url) { + document.writeln(''); +} + +function pinboardNS_show_bmarks(r) { + var lr = new Pinboard_Linkroll(); + lr.set_items(r); + lr.show_bmarks(); +} + +var json_URL = "http://feeds.pinboard.in/json/v1/u:"+pinboard_user+"/?cb=pinboardNS_show_bmarks\&count=" + count; +pinboardNS_fetch_script(json_URL); + +function Pinboard_Linkroll() { + var items; + + this.set_items = function(i) { + this.items = i; + } + this.show_bmarks = function() { + var lines = []; + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + var str = this.format_item(item); + lines.push(str); + } + $(linkroll).set('html', lines.join("\n")); + } + this.cook = function(v) { + return v.replace('<', '<').replace('>', '>>'); + } + + this.format_item = function(it) { + var str = "
  • "; + if (!it.d) { return; } + str += "

    " + this.cook(it.d) + ""; + if (it.n) { + str += "" + this.cook(it.n) + "\n"; + } + if (it.t.length > 0) { + for (var i = 0; i < it.t.length; i++) { + var tag = it.t[i]; + str += " " + this.cook(tag) + " "; + } + } + str += "

  • \n"; + return str; + } +} +Pinboard_Linkroll.prototype = new Pinboard_Linkroll(); diff --git a/source/javascripts/twitter.js b/source/javascripts/twitter.js index faa02fa..d633a78 100644 --- a/source/javascripts/twitter.js +++ b/source/javascripts/twitter.js @@ -1,151 +1,52 @@ -// -// The Octopress Twitter Feed is based on the following work: -// Valerio's javascript framework Mootools: Mootools.net -// David Walsh's Twitter Gitter plugin: http://davidwalsh.name/mootools-twitter-plugin -// Aaron Newton’s JSONP plugin: http://clientcide.com/js -// PrettyDate by John Resig at http://ejohn.org/files/pretty.js -// - -/* - Plugin: Octopress Twitter Feed - Author: Brandon Mathis - Website: http://brandonmathis.com - Date: 11/07/2009 -*/ - -var tweet_container = 'li'; -var twitter_container = 'twitter_status'; -var key = '-!-!-'; -var show_source = false; - -window.addEvent('domready',function() { - getTwitterStatus(twitter_user); -}); - -function showTweets(the_tweets, from_cookie){ - if(from_cookie){ - the_tweets = the_tweets.split('^!^!^'); +Request.Twitter = new Class({ + + Extends: Request.JSONP, + + options: { + linkify: true, + url: 'http://twitter.com/statuses/user_timeline/{term}.json', + include_replies: true, + data: { + count: 5, + trim_user: true + } + }, + + initialize: function(term, options){ + this.parent(options); + if(this.options.include_replies == false){ + this.options.count = this.options.data.count + this.options.data.count += 30; // adds 30 tweets to request for filtering + } + this.options.url = this.options.url.substitute({term: term}); + console.log(this.options.url); + }, + + success: function(args, index){ + if(!this.options.include_replies){ + args[0] = args[0].filter(function(item, index, array){ + return item.in_reply_to_screen_name == null; + }); + if(args[0].length > this.options.count){ args[0].length = this.options.count; } + } + var data = args[0]; + + if (this.options.linkify) data.each(function(tweet){ + tweet.text = this.linkify(tweet.text); + }, this); + + if (data[0]) this.options.data.since_id = data[0].id; // keep subsequent calls newer + + this.parent(args, index); + }, + + linkify: function(text){ + // modified from TwitterGitter by David Walsh (davidwalsh.name) + // courtesy of Jeremy Parrish (rrish.org) + return text.replace(/(https?:\/\/[\w\-:;?&=+.%#\/]+)/gi, '$1') + .replace(/(^|\W)@(\w+)/g, '$1@$2') + .replace(/(^|\W)#(\w+)/g, '$1#$2'); } - $(twitter_container).set('html', ''); - the_tweets.each(function(tweet){ - tweet = parseTweetMeta(tweet) - tweet = '

    ' + tweet.replace(/\n\n/gi,'

    ') + '

    '; - new Element(tweet_container,{ - html: tweet - }).inject(twitter_container); - }); -} - -function parseTweetMeta(tweet_data){ - var tweet_data = tweet_data.split(key); - var tweet = tweet_data[0]; - var date = tweet_data[1]; - var tweet_id = tweet_data[2]; - var source = tweet_data[3]; - - date = prettyDate(new Date().parse(date)); - return tweet + '' + date + '' + (show_source ? ' from '+source : '') + ''; -} -function prettyDate(time){ - var date = time; - var diff = (((new Date()).getTime() - date.getTime()) / 1000) - var day_diff = Math.floor(diff / 86400); - - if ( isNaN(day_diff) || day_diff < 0) - return; - - return day_diff == 0 && ( - diff < 60 && "just now" || - diff < 120 && "1 minute ago" || - diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" || - diff < 7200 && "1 hour ago" || - diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") || - day_diff == 1 && "1 day ago" || - day_diff < 7 && day_diff + " days ago" || - day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago" || - true && Math.ceil( day_diff / 30 ) + " months ago"; -} - -function getTwitterStatus(twitter_name){ - var container = $(twitter_container); - if(!container) return; - var tweet_cookie = 'tweets_by_' + twitter_name + tweet_count; - container.set('html', 'Fetching tweets...'); - if(!Cookie.read(tweet_cookie)) { - var myTwitterGitter = new TwitterGitter(twitter_name,{ - count: ((show_replies) ? tweet_count : 15 + tweet_count), - onComplete: function(tweets,user) { - the_tweets = Array(); - tweets.each(function(tweet,i) { - if((tweet.in_reply_to_status_id && show_replies) || !tweet.in_reply_to_status_id){ - if(the_tweets.length == tweet_count) return; - the_tweets.push(tweet.text + key + tweet.created_at + key + tweet.id + key + tweet.source); - } - }); - Cookie.write(tweet_cookie,the_tweets.join('^!^!^'), { duration: 0.02 }); - showTweets(the_tweets); - } - }).retrieve(); - } else { - showTweets(Cookie.read(tweet_cookie),true); - } -} - -/* - Plugin: TwitterGitter - Author: David Walsh - Website: http://davidwalsh.name - Date: 2/21/2009 -*/ - -var TwitterGitter = new Class({ - - //implements - Implements: [Options,Events], - - //options - options: { - count: 2, - sinceID: 1, - link: true, - onRequest: $empty, - onComplete: $empty - }, - - //initialization - initialize: function(username,options) { - //set options - this.setOptions(options); - this.info = {}; - this.username = username; - }, - - //get it! - retrieve: function() { - new JsonP('http://twitter.com/statuses/user_timeline/' + this.username + '.json',{ - data: { - count: this.options.count, - since_id: this.options.sinceID - }, - onRequest: this.fireEvent('request'), - onComplete: function(data) { - //linkify? - if(this.options.link) { - data.each(function(tweet) { tweet.text = this.linkify(tweet.text); },this); - } - //complete! - this.fireEvent('complete',[data,data[0].user]); - }.bind(this) - }).request(); - return this; - }, - - //format - linkify: function(text) { - //courtesy of Jeremy Parrish (rrish.org) - return text.replace(/(https?:\/\/[\w\-:;?&=+.%#\/]+)/gi,'$1').replace(/(^|\s)@(\w+)/g,'$1@$2').replace(/(^|\s)#(\w+)/g,'$1#$2'); - } }); -//Compact Jsonp from http://clientcide.com/js -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})}}); + diff --git a/source/sass/screen.scss b/source/sass/screen.scss new file mode 100644 index 0000000..4edf742 --- /dev/null +++ b/source/sass/screen.scss @@ -0,0 +1,17 @@ +@import "compass"; +@import "compass/layout"; + +@include global-reset; + +@include reset-html5; + +/* SASS mixins */ +//@import "library/typography"; + +/* primary SASS */ +//@import "theme"; +//@import "typography"; +@import "themes/classic/style"; + +/* specific SASS */ +//@import "partials"; diff --git a/source/sass/themes/classic/_partials.scss b/source/sass/themes/classic/_partials.scss new file mode 100644 index 0000000..c88faaa --- /dev/null +++ b/source/sass/themes/classic/_partials.scss @@ -0,0 +1,13 @@ +@import "partials/shared"; +@import "partials/syntax"; +@import "partials/search"; +@import "partials/sidebar"; +@import "partials/twitter"; + +/* layout partials */ +@import "partials/header"; +@import "partials/navigation"; +@import "partials/page"; +@import "partials/sidebar"; +@import "partials/blog"; +@import "partials/footer"; diff --git a/source/sass/themes/classic/_style.scss b/source/sass/themes/classic/_style.scss new file mode 100644 index 0000000..f36aaa1 --- /dev/null +++ b/source/sass/themes/classic/_style.scss @@ -0,0 +1,4 @@ +@import "core/layout"; +@import "core/theme"; +@import "core/typography"; +//@import "partials"; diff --git a/source/sass/themes/classic/core/_layout.scss b/source/sass/themes/classic/core/_layout.scss new file mode 100644 index 0000000..265af3a --- /dev/null +++ b/source/sass/themes/classic/core/_layout.scss @@ -0,0 +1,91 @@ +$page-pad: 40px; +$min-width: 320px; +$max-width: 1440px; +$sidebar-width: 320px; +$sidebar-pad: 30px; +$default-border-radius: 4px; + +//html { background-color: $body_bg; } + +//body { color: $body_color; } + +//a { + //color: $link_color; + //&:hover, &:focus { + //color: saturate(darken($link_color, 15), 20); } + //&:visited { + //color: darken(adjust_hue($link_color, 70), 10); } } + +.group { @include pie-clearfix; } + +.inner-wrap { + position: relative; + margin: 0 auto; + padding: 0 $page_pad; + max-width: $max-width; + @extend .group; +} + +.core-layout { > div { @extend .inner-wrap; } } + +body { > header, > nav, > footer { + @extend .core-layout; + min-width: $min-width; + } +} + +#page { + @extend .group; + padding: 0; + max-width: $max-width + $page-pad*2; + margin: 0 auto; + > div { + @extend .group; + //min-width: 480px; + margin-right: $sidebar-width; + > aside { + float: left; + width: $sidebar-width - $sidebar-pad*2; + margin: 0 -100% 0 0; + padding: $sidebar-pad; + } + } +} + +#main { + float: left; + width: 100%; + padding-top: 25px; + padding-bottom: 25px; + > * { + padding-right: $page-pad; + padding-left: $page-pad; + } +} + +@media (min-device-width:1024px) and (max-width:800px), + screen and (max-device-width:480px), (max-device-width:480px) and (orientation:landscape), + (min-device-width:481px) and (max-device-width:1024px) and (orientation:portrait) { + #page > div { margin-right: 0; + #main { float: none; } + > aside { margin: 0; float: none; } + } + page > div > aside { float: none; } + body { > header, > nav, > 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, > nav, > footer { > div { padding: 0 10px; }}} + #main > * { padding-left: 10px; padding-right: 10px; } + #page > div { margin: none; > aside { float: none; }} +} + +//*{ + //transition: width .5s; + //-moz-transition: width .5s; + //-webkit-transition: margin .5s; +//} + + +//#search { left: $page-width + $sidebar-margin - $sidebar-width; } diff --git a/source/sass/themes/classic/core/_theme.scss b/source/sass/themes/classic/core/_theme.scss new file mode 100644 index 0000000..a69b11d --- /dev/null +++ b/source/sass/themes/classic/core/_theme.scss @@ -0,0 +1,45 @@ +// Link Colors +$link_color: lighten(#165b94, 0.3); + +// Main Section Colors +$body_color: #333333; +$light_text: #999999; +$body_bg: #323232; + +$header_bg: #323232; +$header_border: #181818; +$title_color: #dddddd; + +$nav_color: #555555; +$nav_color_hover: black; +$nav_bg: #e8e8e8; +$nav_border_top: white; +$nav_border_bottom: #aaaaaa; +$nav_border_left: #cccccc; +$nav_border_right: white; + +$sidebar_bg: #f2f2f2; +$sidebar_border: #d5d5d5; + +// Blog +$article_border: #eeeeee; +$main_bg: #fff; + +$footer_color: #999999; +$footer_bg: #444444; + +// Form Colors +$fieldset_bg: #ececec; +$fieldset_border: #c3c3c3; + +$textinput_color: #333333; +$textinput_bg: #f4f4f4; +$textinput_bg_focus: #fefeee; + +$textinput_border_top: #aaaaaa; +$textinput_border_bottom: #c6c6c6; +$textinput_border_left: #c3c3c3; +$textinput_border_right: #c3c3c3; +$textinput_border_focus: #989898; + +$twitter_topic: #888888; diff --git a/source/sass/themes/classic/core/_typography.scss b/source/sass/themes/classic/core/_typography.scss new file mode 100644 index 0000000..473f074 --- /dev/null +++ b/source/sass/themes/classic/core/_typography.scss @@ -0,0 +1,159 @@ +$type-border: #ddd; +$type-color-light: #555; +$type-color: #000; +$blockquote: $type-border !default; //darken($type-border, 20) !default; + + +// Fonts +@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" ); +.heading-font { font-family: Adelle, "Helvetica Neue", Helvetica, Arial, sans; } + +body > header h1 { + font-size: 3em; + @extend .heading-font; + line-height: 1.2em; + margin-bottom: 0.6667em; +} + + +body { + font-size: 1em; + line-height: 1.5em; + color: $type-color; + font-family: Georgia, Times, serif; +} + +article { + margin-bottom: 1.5em; + padding-bottom: 1.5em; + padding-top: 1em; + + article { border-top: 3px solid $type-color-light; } + &:last-child { border-bottom: none; } + h2 { + padding-top: 0.8em; + border-top: 3px double $type-border; + } + .author, time { text-transform: uppercase; } + .updated { font-size: .8em; color: $type-color-light; } + time span { + font-size: .7em; + line-height: 0; + position: relative; + top: -.4em; + } + header { + p { + padding: 0 0 1.5em; + font-size: .8em; + color: $type-color-light; + font-family: Palatino, Times, "Times New Roman"; + //margin-top: -1.2em; + //border: { + top-width: 1px; + //bottom-width: 1px; + //style: dashed; + //color: $type-border; + //} + } + } +} + +#{headings()}{ + @extend .heading-font; 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 { 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: -.5em; } +sub { bottom: -.5em; } + +q { font-style: italic; + &:before { content: "\201C"; } + &: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; } + +pre, code, tt { @extend .mono-font; } + +sub, sup { line-height: 0; } + +hr { margin-bottom: 0.2em; } + +small { font-size: .8em; } + +big { font-size: 1.2em; } + +blockquote { + $bq-margin: 2em; + font-style: italic; + position: relative; + margin-left: $bq-margin; + > p { + &:first-child:before { + content: "\201C"; + position: absolute; + top: 0.1em; + left: -.7em; + font-size: 3em; + color: $blockquote; + } + &:last-child:after { + content: "\201D"; + position: relative; + top: 0.3em; + line-height: 0; + font-size: 2em; + color: $blockquote; + } + } + + p > cite { + margin-left: $bq-margin; + text-align: right; + &:before { content: '– '; color: $type-color-light; } + a { font-style: italic; } + } +} diff --git a/source/sass/themes/classic/partials/_blog.scss b/source/sass/themes/classic/partials/_blog.scss new file mode 100644 index 0000000..47b4887 --- /dev/null +++ b/source/sass/themes/classic/partials/_blog.scss @@ -0,0 +1,23 @@ +article { + h2 { + padding-top: 0; + margin-bottom: 0.1em; } + .title { + text-decoration: none; + &:hover { + text-decoration: underline; } } + .entry { + border-bottom: 1px solid $article-border; + &:first-child { + padding-top: 0; } } + #disqus_thread { } + .meta { + border-bottom: 1px dashed #dddddd; + text-transform: uppercase; + color: #777777; + padding: 8px 0 5px; + margin-bottom: 1.5em; + font-size: 75%; + letter-spacing: 1px; } + .footer { + padding-top: 15px; } } diff --git a/source/sass/themes/classic/partials/_footer.scss b/source/sass/themes/classic/partials/_footer.scss new file mode 100644 index 0000000..08e6138 --- /dev/null +++ b/source/sass/themes/classic/partials/_footer.scss @@ -0,0 +1,11 @@ +footer { + @include background(linear-gradient(darken($body-bg, 5), $body-bg)); + //color: $footer-color; + //border-top: 10px solid $footer-bg; + padding: 15px 0; + position: relative; + z-index: 2; + a { + color: #dddddd; + &:hover { + color: white; } } } diff --git a/source/sass/themes/classic/partials/_header.scss b/source/sass/themes/classic/partials/_header.scss new file mode 100644 index 0000000..a4964af --- /dev/null +++ b/source/sass/themes/classic/partials/_header.scss @@ -0,0 +1,11 @@ +body > header { + background-color: $header_bg; + border-bottom: 1px solid $header_border; + padding: 25px 0; + h1 { + display: inline-block; + margin: 0; + a, a:visited { + font-weight: normal; + color: $title_color; + text-decoration: none; } } } diff --git a/source/sass/themes/classic/partials/_navigation.scss b/source/sass/themes/classic/partials/_navigation.scss new file mode 100644 index 0000000..8d8a09d --- /dev/null +++ b/source/sass/themes/classic/partials/_navigation.scss @@ -0,0 +1,30 @@ +#nav { + @extend .group; + position: relative; + z-index: 1; + background-color: $nav-bg; + @include background-image(linear-gradient(#fcfcfc, #f4f4f4 0.3, #dddddd)); + border: { + top: 1px solid $nav-border-top; + bottom: 1px solid $nav-border-bottom; }; + ul { + position: relative; + @include horizontal-list; + margin: 0 auto; + padding: 6px 0; + li { + padding: 0 15px; + border-left: 1px solid $nav-border-left; + border-right: 1px solid $nav-border-right; + &:first-child { + border-left: none; + padding-left: 0; } + &:last-child { + border-right: 0; } + a { + display: inline-block; + color: $nav-color; + line-height: 150%; + text-decoration: none; + &:hover { + color: $nav-color-hover; } } } } } diff --git a/source/sass/themes/classic/partials/_page.scss b/source/sass/themes/classic/partials/_page.scss new file mode 100644 index 0000000..2a1503b --- /dev/null +++ b/source/sass/themes/classic/partials/_page.scss @@ -0,0 +1,8 @@ +body { + background-color: $sidebar_bg; +} + +#page > div { + background-color: $main_bg; border-right: 1px solid $sidebar_border; + @include box-shadow(rgba(#000, .1) 0 0 18px); +} diff --git a/source/sass/themes/classic/partials/_search.scss b/source/sass/themes/classic/partials/_search.scss new file mode 100644 index 0000000..d44c380 --- /dev/null +++ b/source/sass/themes/classic/partials/_search.scss @@ -0,0 +1,19 @@ +#search { + position: absolute; + top: 30%; + form { + background: image-url("search_bg.png") no-repeat; + padding: 0; + height: 28px; + width: 218px; } + #q { + background: none; + position: relative; + top: 1px; + width: 160px; + margin-left: 30px; + font-size: 15px; + border: none; + color: #aaaaaa; + &:focus { + outline: none; } } } diff --git a/source/sass/themes/classic/partials/_shared.scss b/source/sass/themes/classic/partials/_shared.scss new file mode 100644 index 0000000..a97b605 --- /dev/null +++ b/source/sass/themes/classic/partials/_shared.scss @@ -0,0 +1,12 @@ +#collapser { + display: block; + cursor: pointer; + background: #f8f8f8; + color: #888888; + padding: 5px 10px; + font-size: 10px; + line-height: 150%; + cursor: pointer; + position: absolute; + top: 0; + right: 0; } diff --git a/source/sass/themes/classic/partials/_sidebar.scss b/source/sass/themes/classic/partials/_sidebar.scss new file mode 100644 index 0000000..ebeec9b --- /dev/null +++ b/source/sass/themes/classic/partials/_sidebar.scss @@ -0,0 +1,38 @@ +.subscribe a { + display: inline-block; + padding-left: 28px; + background: image-url("rss.png") left top no-repeat; } +#sidebar { + line-height: 1.45em; + font-size: 90%; + h3 { + margin: 20px -15px 10px; + padding: 12px 15px; + background: white; + border-bottom: 1px solid #e5e5e5; + border-top: 1px solid #e5e5e5; + &:first-child { + margin-top: 0; } } } + +#twitter, #delicious { + @include border-radius; + background: #f8f8f8; + border: 1px solid #eeeeee; + padding: 5px 0; + ul { + list-style-type: none; + margin: 0; } + li { + margin: 0 15px; + padding: 10px 0 0; + border-bottom: #dddddd 1px dashed; + &:last-child { + border-bottom: 0; } } } + +#delicious { + p { + font-style: italic; } + li { + color: #666666; + font-style: normal; + padding-bottom: 8px; } } diff --git a/source/sass/themes/classic/partials/_syntax.scss b/source/sass/themes/classic/partials/_syntax.scss new file mode 100644 index 0000000..b06a5a1 --- /dev/null +++ b/source/sass/themes/classic/partials/_syntax.scss @@ -0,0 +1,279 @@ +.code_window { + @include border-top-radius(5px); + @include border-bottom-radius(2px); + background: #aaaaaa image-url("code_bg.png") top repeat-x; + position: relative; + margin: 0.3em 0 1.3em; + padding: 0 3px 3px; + font-size: 14px; + border: 1px solid #898989; + border-top-color: #cbcbcb; + border-left-color: #a5a5a5; + border-right-color: #a5a5a5; + em { + text-align: center; + text-shadow: #cccccc 1px 1px 1px; + display: block; + padding: 1px 0; + color: #333333; + font-style: normal; } + .highlight { + margin: 0; } } + +pre { + color: #cccccc; + font-size: 13px; + background: #222222; + line-height: 1.5em; + border: #aaaaaa 1px solid; + overflow-x: auto; + overflow-y: hidden; + padding: 25px 20px; + .lineno { + color: #888888; + background: #e3e3e3; + display: inline-block; + padding: 0 0 0 10px; + &:first-child { + padding-top: 15px; + display: inline-block; } } } + +.highlight { + position: relative; + .pre_expander { + font-size: 10px; + text-align: right; + padding: 4px 8px; + line-height: 150%; + position: absolute; + cursor: pointer; + top: 2px; + right: 2px; + @include border-bottom-left-radius; + display: block; + color: #777777; + background: #333333; + &:hover { + background: #444444; + color: #cccccc; } } } + +// based on: http://github.com/mojombo/tpw/raw/master/css/syntax.css +.editor { + background: rgb(0, 22, 41); + line-height: 1.25; } + +pre.console { + background-color: black; + color: lighten(green, 25); + letter-spacing: 1px; + padding: 0.5em; + .prompt { + color: lighten(navy, 50); + &:before { + color: white; + content: "["; } + &:after { + color: white; + content: "]"; } } + .stdin { + font-weight: bold; + color: lighten(green, 75); } } + +.highlight { + padding: 0 0 0.1em; + color: white; + // Comment + .c { + color: #999988; + font-style: italic; } + // Error + .err { + color: #a61717; + background-color: #e3d2d2; } + // Name + .n { + color: white; } + // Keyword + .k { + color: rgb(255, 157, 0); } + // Paren + .p { + color: darken(#ff9d00, 33); } + // Operator + .o { + color: rgb(255, 157, 0); } + // Comment.Multiline + .cm { + color: #999988; + font-style: italic; } + // Comment.Preproc + .cp { + color: #999999; } + // Comment.Single + .c1 { + color: #999988; + font-style: italic; } + // Comment.Special + .cs { + color: #999999; + font-style: italic; } + // Generic.Deleted + .gd { + color: black; + background-color: #ffdddd; } + // Generic.Deleted.Specific + .gd .x { + color: black; + background-color: #ffaaaa; } + // Generic.Emph + .ge { + font-style: italic; } + // Generic.Error + .gr { + color: #aa0000; } + // Generic.Heading + .gh { + color: #999999; } + // Generic.Inserted + .gi { + color: black; + background-color: #ddffdd; } + // Generic.Inserted.Specific + .gi .x { + color: black; + background-color: #aaffaa; } + // Generic.Output + .go { + color: #888888; } + // Generic.Prompt + .gp { + color: #555555; } + // Generic.Strong + .gs { + color: white; } + // Generic.Subheading + .gu { + color: #aaaaaa; } + // Generic.Traceback + .gt { + color: #aa0000; } + // Keyword.Constant + .kc { + color: white; } + // Keyword.Declaration + .kd { + color: white; } + // Keyword.Pseudo + .kp { + color: white; } + // Keyword.Reserved + .kr { + color: white; } + // Keyword.Type + .kt { + color: #445588; } + // Literal.Number + .m { + color: rgb(255, 98, 140); } + // Literal.String + .s { + color: #dd1144; } + // Name.Attribute + .na { + color: teal; } + // Name.Builtin + .nb { + color: darken(rgb(128, 255, 187), 20); } + // Name.Class + .nc { + color: darken(rgb(128, 255, 187), 20); } + // Name.Constant + .no { + color: rgb(128, 255, 187); } + // Name.Entity + .ni { + color: purple; } + // Name.Exception + .ne { + color: rgb(255, 221, 0); } + // Name.Function + .nf { + color: rgb(255, 221, 0); } + // Name.Namespace + .nn { + color: #555555; } + // Name.Tag + .nt { + color: white; } + // Name.Variable + .nv { + color: teal; } + // Operator.Word + .ow { + color: white; } + // Text.Whitespace + .w { + color: #bbbbbb; } + // Literal.Number + .nl { + color: rgb(255, 98, 140); } + // Literal.Number.Float + .mf { + color: rgb(255, 98, 140); } + // Literal.Number.Hex + .mh { + color: rgb(255, 98, 140); } + // Literal.Number.Integer + .mi { + color: rgb(255, 98, 140); } + // Literal.Number.Oct + .mo { + color: rgb(255, 98, 140); } + // Literal.String.Backtick + .sb { + color: rgb(58, 217, 0); } + // Literal.String.Char + .sc { + color: rgb(58, 217, 0); } + // Literal.String.Doc + .sd { + color: rgb(58, 217, 0); } + // Literal.String.Double + .s2 { + color: rgb(58, 217, 0); } + // Literal.String.Escape + .se { + color: rgb(58, 217, 0); } + // Literal.String.Heredoc + .sh { + color: rgb(58, 217, 0); } + // Literal.String.Interpol + .si { + color: rgb(158, 255, 128); } + // Literal.String.Other + .sx { + color: rgb(58, 217, 0); } + // Literal.String.Regex + .sr { + color: #009926; } + // Literal.String.Single + .s1 { + color: rgb(58, 217, 0); } + // Literal.String.Symbol + .ss { + color: rgb(255, 98, 140); } + // Name.Builtin.Pseudo + .bp { + color: #999999; } + // Name.Variable.Class + .vc { + color: teal; } + // Name.Variable.Global + .vg { + color: teal; } + // Name.Variable.Instance + .vi { + color: teal; } + // Literal.Number.Integer.Long + .il { + color: rgb(255, 98, 140); } } diff --git a/source/sass/themes/classic/partials/_twitter.scss b/source/sass/themes/classic/partials/_twitter.scss new file mode 100644 index 0000000..5d8b7d9 --- /dev/null +++ b/source/sass/themes/classic/partials/_twitter.scss @@ -0,0 +1,15 @@ +#twitter { + p { + padding-bottom: 10px; + a.topic { + color: $twitter_topic; } } + .meta { + color: $light_text; + font-size: 80%; + display: block; + padding: 8px 0 0; + a { + color: inherit; + text-decoration: none; + &:hover { + text-decoration: underline; } } } } diff --git a/stylesheets/_base.sass b/stylesheets/_base.sass deleted file mode 100644 index 0676523..0000000 --- a/stylesheets/_base.sass +++ /dev/null @@ -1,3 +0,0 @@ -//compass default reset -+global-reset -@import compass \ No newline at end of file diff --git a/stylesheets/_layout.sass b/stylesheets/_layout.sass deleted file mode 100644 index 07bb6e5..0000000 --- a/stylesheets/_layout.sass +++ /dev/null @@ -1,51 +0,0 @@ -$page_pad: 30px -$page_width: 980px -$sidebar_margin: 20px -$sidebar_width: 280px -$default_border_radius: 4px - -html body - background-color: $body_bg - color: $body_color - a - color: $link_color - &:hover, &:focus - color: saturate(darken($link_color, 15), 20) - &:visited - color: darken(adjust_hue($link_color, 70), 10) - -#header, #footer, #nav - .content - position: relative - margin: 0 auto - width: $page_width - $page_pad - padding: 0 $page_pad/2 - -#page, #header, #footer, #nav - min-width: $page_width -#page, #content, .content - +pie-clearfix -#content - margin: 0 auto - width: $page_width - $sidebar_width - $page_pad/2 - padding: 0 $sidebar_width 0 $page_pad/2 -#main - float: left - width: 100% - .content - padding-right: $sidebar_margin - -#sidebar - float: left - width: $sidebar_width - $sidebar_margin - margin: 0 -100% 0 0 - padding: $page_pad 0 $page_pad $sidebar_margin - -#page.expanded - #content - width: $page_width - $page_pad/2 - padding: 0 0 0 $page_pad/2 - #sidebar - float: none - margin: 0 - padding: 0 0 $page_pad \ No newline at end of file diff --git a/stylesheets/_library.sass b/stylesheets/_library.sass deleted file mode 100644 index c76784e..0000000 --- a/stylesheets/_library.sass +++ /dev/null @@ -1,7 +0,0 @@ -@import compass/utilities -@import compass/css3 - -@import library/reset -@import library/list_borders -@import library/typography -@import library/link_colors \ No newline at end of file diff --git a/stylesheets/_partials.sass b/stylesheets/_partials.sass deleted file mode 100644 index 18d40d9..0000000 --- a/stylesheets/_partials.sass +++ /dev/null @@ -1,13 +0,0 @@ -@import partials/shared -@import partials/syntax -@import partials/search -@import partials/sidebar -@import partials/twitter - -/* layout partials */ -@import partials/header -@import partials/navigation -@import partials/page -@import partials/sidebar -@import partials/blog -@import partials/footer \ No newline at end of file diff --git a/stylesheets/_theme.sass b/stylesheets/_theme.sass deleted file mode 100644 index 15ed412..0000000 --- a/stylesheets/_theme.sass +++ /dev/null @@ -1,47 +0,0 @@ -// Link Colors -$link_color: lighten(#165B94, .30) - -// Main Section Colors -$body_color: #333 -$light_text: #999 -$body_bg: #323232 - -$header_bg: #323232 -$header_border: #181818 -$title_color: #ddd - -$nav_color: #555 -$nav_color_hover: #000 -$nav_bg: #e8e8e8 -$nav_border_top: #fff -$nav_border_bottom: #aaa -$nav_border_left: #ccc -$nav_border_right: #fff - -$page_border_sides: #ccc -$page_bg: #f0f0f0 -$sidebar_bg: #fcfcfc -$sidebar_border: #eee - -// Blog -$article_border: #eee -$main_bg: #fff - -$footer_color: #999 -$footer_bg: #444 - -// Form Colors -$fieldset_bg: #ececec -$fieldset_border: #c3c3c3 - -$textinput_color: #333 -$textinput_bg: #f4f4f4 -$textinput_bg_focus: #fefeee - -$textinput_border_top: #aaa -$textinput_border_bottom: #c6c6c6 -$textinput_border_left: #c3c3c3 -$textinput_border_right: #c3c3c3 -$textinput_border_focus: #989898 - -$twitter_topic: #888 \ No newline at end of file diff --git a/stylesheets/_typography.sass b/stylesheets/_typography.sass deleted file mode 100644 index db67b36..0000000 --- a/stylesheets/_typography.sass +++ /dev/null @@ -1,45 +0,0 @@ -$base_font_size: 16px -$base_font_size_small: 13px -$base_font_color: #333 -$default_border_radius: 6px - -+general-typography -=heading-font - +serif-font -=quote-font - +serif-font - -body - font-size: $base_font_size - +serif-font - -h1,h2,h3,h4,h5,h6 - color: #333 - font-weight: bold - +heading-font - -h1,h2,h3,h4 - letter-spacing: -1px - -blockquote - +quote-font - font-style: italic - color: #555 - background: #f8f8f8 - border: - top: 1px solid #e5e5e5 - bottom: 1px solid #e5e5e5 - &:before - color: #ddd - cite - +sans-font - font-size: $base_font_size - 2px - display: block - padding-top: $base_font_size - &:before - content: "\30FC" - padding-right: 2px - a - color: inherit !important - &:hover - color: $link_color !important \ No newline at end of file diff --git a/stylesheets/ie.sass b/stylesheets/ie.sass deleted file mode 100644 index e69de29..0000000 diff --git a/stylesheets/library/_float.sass b/stylesheets/library/_float.sass deleted file mode 100644 index 1bb6ea3..0000000 --- a/stylesheets/library/_float.sass +++ /dev/null @@ -1,16 +0,0 @@ -// based on compass float - -@import modules/_clearfix.sass - -// Available as alternate syntax with just +float -=float($side: "left") - display: inline - float: !side - -// Implementation of float:left with fix for double-margin bug -=float-left - +float("left") - -// Implementation of float:right with fix for double-margin bug -=float-right - +float("right") \ No newline at end of file diff --git a/stylesheets/library/_link_colors.sass b/stylesheets/library/_link_colors.sass deleted file mode 100644 index d822c81..0000000 --- a/stylesheets/library/_link_colors.sass +++ /dev/null @@ -1,24 +0,0 @@ -$default_link_color: #165B94 !default -$default_link_color_hover: #fff !default -$default_link_color_alt: #91D5F1 !default -$default_link_color_hover_alt: #000 !default - -=link-color($hover: true) - +link-color-style($default_link_color, $default_link_color_hover, $default_link_color, $hover) - -=link-color-alt($hover: true) - +link-color-style($default_link_color_alt, $default_link_color_hover_alt, $default_link_color_alt, $hover) - -=link-color-heading($link_color: "inherit", $hover_bg_color: #ccc) - +link-color-style($link_color) - -=link-color-style($color: $default_link_color, $color_hover: $default_link_color_hover, $link_hover_bg: $color, $hover: true) - color: $color - padding: 2px - margin: 0 -2px - +border-radius(3px) - @if $hover - &:hover - background-color: $link_hover_bg - color: $color_hover - text-decoration: none \ No newline at end of file diff --git a/stylesheets/library/_list_borders.sass b/stylesheets/library/_list_borders.sass deleted file mode 100644 index aaa5ed2..0000000 --- a/stylesheets/library/_list_borders.sass +++ /dev/null @@ -1,7 +0,0 @@ -=list-borders($color1, $color2) - border-left: 1px solid $color1 - border-right: 1px solid $color2 - &.alpha - border-left: none - &.omega - border-right: 0 \ No newline at end of file diff --git a/stylesheets/library/_reset.sass b/stylesheets/library/_reset.sass deleted file mode 100644 index cc0de60..0000000 --- a/stylesheets/library/_reset.sass +++ /dev/null @@ -1,58 +0,0 @@ -// Borrowed from the blueprint reset - -// Global reset rules. -// For more specific resets, use the reset mixins provided below -=global-reset - html, body - +reset - +nested-reset - -// Reset all elements within some selector scope.To reset the selector itself, -// mixin the appropriate reset mixin for that element type as well. This could be -// useful if you want to style a part of your page in a dramatically different way. -=nested-reset - div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, - pre, a, abbr, acronym, address, code, del, dfn, em, img, - dl, dt, dd, ol, ul, li, fieldset, form, label, legend, caption, tbody, tfoot, thead, tr - +reset - blockquote, q - +reset-quotation - th, td, caption - +reset-table-cell - table - +reset-table - a img - border: none - -=reset-box-model - margin: 0 - padding: 0 - border: 0 - -=reset - +reset-box-model - font: - weight: inherit - style: inherit - size: 100% - family: inherit - vertical-align: baseline - -=reset-quotation - +reset - quotes: "" "" - &:before, - &:after - content: "" - -=reset-table-cell - +reset - text-align: left - font-weight: normal - vertical-align: middle - -=reset-table - +reset - border-collapse: separate - border-spacing: 0 - vertical-align: middle diff --git a/stylesheets/library/_typography.sass b/stylesheets/library/_typography.sass deleted file mode 100644 index d433601..0000000 --- a/stylesheets/library/_typography.sass +++ /dev/null @@ -1,171 +0,0 @@ -$base-font-size: 16px !default -$small: floor($base-font-size * 0.85) !default -$big: floor($base-font-size * 1.25) !default -$base-font-color: #333333 !default -$h6: ceil($base-font-size * 1) -$h5: ceil($base-font-size * 1) -$h4: ceil($base-font-size * 1.2) -$h3: ceil($base-font-size * 1.8) -$h2: ceil($base-font-size * 2.8) -$h1: ceil($base-font-size * 3.2) - -=heading-font - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif - -=sans-font - font-family: "Lucida Grande", "Lucida Sans Unicode", "Trebuchet MS", Helvetica, Arial, Verdana, sans-serif - -=serif-font - font-family: Georgia, Times, "Times New Roman", serif - -=fixed-font - font-family: "Menlo", "Bitstream Vera Sans", Monaco, "Andale Mono", "Lucida Console", monospace - -=mono-font - +fixed-font - -=general-typography($font-size: $base-font-size) - +set-heading-sizes($font-size) - +typography-defaults($font-size) - -=set-heading-sizes($font-size: $base-font-size) - $h6: ceil($font-size * 1) - $h5: ceil($font-size * 1) - $h4: ceil($font-size * 1.2) - $h3: ceil($font-size * 1.8) - $h2: ceil($font-size * 2.8) - $h1: ceil($font-size * 3.2) - h1, h2, h3, h4 - &:first-child - margin-top: 0 - h1,h2,h3,h4,h5,h6 - line-height: 1.1em - margin-bottom: 0.7em - margin-top: 0.3em - h1 - font-size: $h1 - h2 - font-size: $h2 - h3 - font-size: $h3 - h4 - font-size: $h4 - h5 - font-size: $h5 - h6 - font-size: $h6 - -=typography-defaults($font-size: $base-font-size) - body - line-height: 1.45em - color: $base-font-color - p - +p-style($font-size) - table - +table-style($font-size) - ol - +ol-style($font-size) - ul - +ul-style($font-size) - dl - +dl-style($font-size) - blockquote - +quote-style - q - font-style: italic - &:before - content: "\201C" - &:after - content: "\201D" - em, dfn - font-style: italic - strong, dfn - font-weight: bold - del - text-decoration: line-through - span.highlight, em.highlight, strong.highlight - background-color: #ffff66 - padding: 2px - margin: 0 -2px - abbr, acronym - border-bottom: 1px dotted - cursor: help - address - margin-top: $font-size * 1.625 - font-style: italic - pre, code, tt - +fixed-font - line-height: $font-size * 1.5 - tt - display: block - margin: $font-size * 1.625 0 - sub, sup - line-height: 0 - hr - margin-bottom: 0.2em - small, .small - font-size: floor($font-size * 0.85) - big, .big - font-size: floor($font-size * 1.25) - -=ol-style($font-size: $base-font-size) - list-style: inside decimal - margin: 0 0 $font-size * 1.625 - li ol - margin: 0 0 $font-size * 1.625 - -=ul-style($font-size: $base-font-size) - list-style: inside - margin: 0 0 $font-size * 1.625 - li ul - margin: 0 0 $font-size * 1.625 - -=dl-style($font-size: $base-font-size) - margin: 0 0 $font-size * 1.625 - dt - font-weight: bold - dd - margin-left: $font-size * 1.625 - -=quote-style($font-size: $base-font-size) - padding: $font-size * 1.5 $font-size * 1.5 $font-size * 1.5 $font-size * 1.8 - position: relative - margin-bottom: $font-size * 0.813 - &:before - content: "\201C" - font-size: $font-size * 3 - margin: 5px 0 0 -0.525em - position: absolute - font-family: Times, Georgia, serif - line-height: 0 - > p - padding: 0 - margin: 0 - -=p-style($font-size: $base-font-size) - padding-bottom: 1.3em - img - float: left - margin: - top: $font-size * 0.5 - right: $font-size * 0.813 - bottom: $font-size * 0.813 - left: 0 - padding: 0 - &.right - margin: - right: 0 - left: $font-size * 0.813 - -=table-style($font-size: $base-font-size) - margin: 0 0 $font-size * 1.625 - border-collapse: collapse - th - font-weight: bold - tr, th, td - margin: 0 - padding: 0 $font-size * 1.625 0 $font-size - tfoot - font-style: italic - caption - text-align: center diff --git a/stylesheets/partials/_blog.sass b/stylesheets/partials/_blog.sass deleted file mode 100644 index f2dc104..0000000 --- a/stylesheets/partials/_blog.sass +++ /dev/null @@ -1,26 +0,0 @@ -.blog - h2 - padding-top: 0 - margin-bottom: 0.1em - .title - text-decoration: none - &:hover - text-decoration: underline - .article - padding: $base-font-size * 1.5 0 $base-font-size * 1.5 - border-bottom: 1px solid $article-border - &:first-child - padding-top: 0 - #disqus_thread - padding-top: $base-font-size - .meta - +sans-font - border-bottom: 1px dashed #dddddd - text-transform: uppercase - color: #777777 - padding: 8px 0 5px - margin-bottom: 1.5em - font-size: 75% - letter-spacing: 1px - .footer - padding-top: 15px diff --git a/stylesheets/partials/_footer.sass b/stylesheets/partials/_footer.sass deleted file mode 100644 index 40ae8e3..0000000 --- a/stylesheets/partials/_footer.sass +++ /dev/null @@ -1,12 +0,0 @@ -#footer - +linear-gradient(color-stops(darken($body-bg, 5), $body-bg)) - font-size: $base-font-size-small - color: $footer-color - border-top: 10px solid $footer-bg - padding: 15px 0 - position: relative - z-index: 2 - a - color: #dddddd - &:hover - color: white diff --git a/stylesheets/partials/_header.sass b/stylesheets/partials/_header.sass deleted file mode 100644 index e912d55..0000000 --- a/stylesheets/partials/_header.sass +++ /dev/null @@ -1,11 +0,0 @@ -#header - background-color: $header_bg - border-bottom: 1px solid $header_border - padding: 25px 0 - h1 - display: inline-block - margin: 0 - a.title - font-weight: normal - color: $title_color - text-decoration: none \ No newline at end of file diff --git a/stylesheets/partials/_navigation.sass b/stylesheets/partials/_navigation.sass deleted file mode 100644 index 439da5f..0000000 --- a/stylesheets/partials/_navigation.sass +++ /dev/null @@ -1,38 +0,0 @@ -#nav - +clearfix - position: relative - z-index: 1 - background-color: $nav-bg - +linear-gradient(color-stops(#fcfcfc, #f4f4f4 0.3, #dddddd)) - border: - top: 1px solid $nav-border-top - bottom: 1px solid $nav-border-bottom - ul - position: relative - +horizontal-list - margin: 0 auto - padding: 6px 0 - li - padding: 0 15px - border-left: 1px solid $nav-border-left - border-right: 1px solid $nav-border-right - &.alpha - border-left: none - padding-left: 0 - &.omega - border-right: 0 - &.subscribe - position: absolute - left: $page-width - $sidebar-width - $sidebar-margin / 2 - border: none - a - display: inline-block - padding-left: 28px - background: image-url("rss.png") left top no-repeat - a - display: inline-block - color: $nav-color - line-height: 150% - text-decoration: none - &:hover - color: $nav-color-hover diff --git a/stylesheets/partials/_page.sass b/stylesheets/partials/_page.sass deleted file mode 100644 index 8bea659..0000000 --- a/stylesheets/partials/_page.sass +++ /dev/null @@ -1,8 +0,0 @@ -#page - background-color: $main_bg -#main - background-color: $main_bg - border-right: 1px solid $sidebar_border - padding: - top: 25px - bottom: 25px \ No newline at end of file diff --git a/stylesheets/partials/_search.sass b/stylesheets/partials/_search.sass deleted file mode 100644 index 44b2a55..0000000 --- a/stylesheets/partials/_search.sass +++ /dev/null @@ -1,20 +0,0 @@ -#search - position: absolute - left: $page-width + $sidebar-margin - $sidebar-width - top: 30% - form - background: image-url("search_bg.png") no-repeat - padding: 0 - height: 28px - width: 218px - #q - background: none - position: relative - top: 1px - width: 160px - margin-left: 30px - font-size: 15px - border: none - color: #aaaaaa - &:focus - outline: none diff --git a/stylesheets/partials/_shared.sass b/stylesheets/partials/_shared.sass deleted file mode 100644 index 3c5a62d..0000000 --- a/stylesheets/partials/_shared.sass +++ /dev/null @@ -1,13 +0,0 @@ -#collapser - +sans-font - display: block - cursor: pointer - background: #f8f8f8 - color: #888 - padding: 5px 10px - font-size: 10px - line-height: 150% - cursor: pointer - position: absolute - top: 0 - right: 0 \ No newline at end of file diff --git a/stylesheets/partials/_sidebar.sass b/stylesheets/partials/_sidebar.sass deleted file mode 100644 index 2a84202..0000000 --- a/stylesheets/partials/_sidebar.sass +++ /dev/null @@ -1,37 +0,0 @@ -#sidebar - line-height: 1.45em - font-size: 90% - h3 - font-size: $h4 + 2 - margin: 20px -15px 10px - padding: 12px 15px - background: white - border-bottom: 1px solid #e5e5e5 - border-top: 1px solid #e5e5e5 - &:first-child - margin-top: 0 - h4 - font-size: $h5 - -#twitter, #delicious - +border-radius - background: #f8f8f8 - border: 1px solid #eeeeee - padding: 5px 0 - ul - list-style-type: none - margin: 0 - li - margin: 0 15px - padding: 10px 0 0 - border-bottom: #dddddd 1px dashed - &:last-child - border-bottom: 0 - -#delicious - p - font-style: italic - li - color: #666666 - font-style: normal - padding-bottom: 8px diff --git a/stylesheets/partials/_syntax.sass b/stylesheets/partials/_syntax.sass deleted file mode 100644 index 0519615..0000000 --- a/stylesheets/partials/_syntax.sass +++ /dev/null @@ -1,281 +0,0 @@ -.code_window - +border-top-radius(5px) - +border-bottom-radius(2px) - background: #aaaaaa image-url("code_bg.png") top repeat-x - position: relative - margin: 0.3em 0 1.3em - padding: 0 3px 3px - font-size: 14px - border: 1px solid #898989 - border-top-color: #cbcbcb - border-left-color: #a5a5a5 - border-right-color: #a5a5a5 - em - text-align: center - +text-shadow(#cccccc, 1px, 1px, 1px) - display: block - padding: 1px 0 - color: #333333 - font-style: normal - +sans-font - .highlight - margin: 0 - -pre - color: #cccccc - font-size: 13px - background: #222222 - line-height: 1.5em - border: #aaaaaa 1px solid - overflow-x: auto - overflow-y: hidden - padding: 25px 20px - .lineno - color: #888888 - background: #e3e3e3 - display: inline-block - padding: 0 0 0 10px - &:first-child - padding-top: 15px - display: inline-block - -.highlight - position: relative - .pre_expander - +mono-font - font-size: 10px - text-align: right - padding: 4px 8px - line-height: 150% - position: absolute - cursor: pointer - top: 2px - right: 2px - +border-bottom-left-radius - display: block - color: #777777 - background: #333333 - &:hover - background: #444444 - color: #cccccc - -// based on: http://github.com/mojombo/tpw/raw/master/css/syntax.css -.editor - background: rgb(0, 22, 41) - line-height: 1.25 - -pre.console - background-color: black - color: lighten(green, 25) - letter-spacing: 1px - padding: 0.5em - .prompt - color: lighten(navy, 50) - &:before - color: white - content: "[" - &:after - color: white - content: "]" - .stdin - font-weight: bold - color: lighten(green, 75) - -.highlight - padding: 0 0 0.1em - color: white - // Comment - .c - color: #999988 - font-style: italic - // Error - .err - color: #a61717 - background-color: #e3d2d2 - // Name - .n - color: white - // Keyword - .k - color: rgb(255, 157, 0) - // Paren - .p - color: darken(#ff9d00, 33) - // Operator - .o - color: rgb(255, 157, 0) - // Comment.Multiline - .cm - color: #999988 - font-style: italic - // Comment.Preproc - .cp - color: #999999 - // Comment.Single - .c1 - color: #999988 - font-style: italic - // Comment.Special - .cs - color: #999999 - font-style: italic - // Generic.Deleted - .gd - color: black - background-color: #ffdddd - // Generic.Deleted.Specific - .gd .x - color: black - background-color: #ffaaaa - // Generic.Emph - .ge - font-style: italic - // Generic.Error - .gr - color: #aa0000 - // Generic.Heading - .gh - color: #999999 - // Generic.Inserted - .gi - color: black - background-color: #ddffdd - // Generic.Inserted.Specific - .gi .x - color: black - background-color: #aaffaa - // Generic.Output - .go - color: #888888 - // Generic.Prompt - .gp - color: #555555 - // Generic.Strong - .gs - color: white - // Generic.Subheading - .gu - color: #aaaaaa - // Generic.Traceback - .gt - color: #aa0000 - // Keyword.Constant - .kc - color: white - // Keyword.Declaration - .kd - color: white - // Keyword.Pseudo - .kp - color: white - // Keyword.Reserved - .kr - color: white - // Keyword.Type - .kt - color: #445588 - // Literal.Number - .m - color: rgb(255, 98, 140) - // Literal.String - .s - color: #dd1144 - // Name.Attribute - .na - color: teal - // Name.Builtin - .nb - color: darken(rgb(128, 255, 187), 20) - // Name.Class - .nc - color: darken(rgb(128, 255, 187), 20) - // Name.Constant - .no - color: rgb(128, 255, 187) - // Name.Entity - .ni - color: purple - // Name.Exception - .ne - color: rgb(255, 221, 0) - // Name.Function - .nf - color: rgb(255, 221, 0) - // Name.Namespace - .nn - color: #555555 - // Name.Tag - .nt - color: white - // Name.Variable - .nv - color: teal - // Operator.Word - .ow - color: white - // Text.Whitespace - .w - color: #bbbbbb - // Literal.Number - .nl - color: rgb(255, 98, 140) - // Literal.Number.Float - .mf - color: rgb(255, 98, 140) - // Literal.Number.Hex - .mh - color: rgb(255, 98, 140) - // Literal.Number.Integer - .mi - color: rgb(255, 98, 140) - // Literal.Number.Oct - .mo - color: rgb(255, 98, 140) - // Literal.String.Backtick - .sb - color: rgb(58, 217, 0) - // Literal.String.Char - .sc - color: rgb(58, 217, 0) - // Literal.String.Doc - .sd - color: rgb(58, 217, 0) - // Literal.String.Double - .s2 - color: rgb(58, 217, 0) - // Literal.String.Escape - .se - color: rgb(58, 217, 0) - // Literal.String.Heredoc - .sh - color: rgb(58, 217, 0) - // Literal.String.Interpol - .si - color: rgb(158, 255, 128) - // Literal.String.Other - .sx - color: rgb(58, 217, 0) - // Literal.String.Regex - .sr - color: #009926 - // Literal.String.Single - .s1 - color: rgb(58, 217, 0) - // Literal.String.Symbol - .ss - color: rgb(255, 98, 140) - // Name.Builtin.Pseudo - .bp - color: #999999 - // Name.Variable.Class - .vc - color: teal - // Name.Variable.Global - .vg - color: teal - // Name.Variable.Instance - .vi - color: teal - // Literal.Number.Integer.Long - .il - color: rgb(255, 98, 140) diff --git a/stylesheets/partials/_twitter.sass b/stylesheets/partials/_twitter.sass deleted file mode 100644 index 181e047..0000000 --- a/stylesheets/partials/_twitter.sass +++ /dev/null @@ -1,15 +0,0 @@ -#twitter - p - padding-bottom: 10px - a.topic - color: $twitter_topic - .meta - color: $light_text - font-size: 80% - display: block - padding: 8px 0 0 - a - color: inherit - text-decoration: none - &:hover - text-decoration: underline \ No newline at end of file diff --git a/stylesheets/print.sass b/stylesheets/print.sass deleted file mode 100644 index e69de29..0000000 diff --git a/stylesheets/screen.sass b/stylesheets/screen.sass deleted file mode 100644 index 07b92ec..0000000 --- a/stylesheets/screen.sass +++ /dev/null @@ -1,11 +0,0 @@ -/* SASS mixins */ -@import library - -/* primary SASS */ -@import base -@import theme -@import typography -@import layout - -/* specific SASS */ -@import partials \ No newline at end of file diff --git a/upgrading.markdown b/upgrading.markdown new file mode 100644 index 0000000..3d2fcce --- /dev/null +++ b/upgrading.markdown @@ -0,0 +1,51 @@ +# Major changes + +## New Jekyll + +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 +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 +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. + +### Jekyll is Pluggable + +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. +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. + + +## More Than a Starting Point + +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. + +I've already been combing through plugins that other people are writing and I've found some gems. Octopress now has: + +- **Sitemap generator** - suitable xml for submitting to search engines +- **Haml converter** - currently pages and posts can be converted, but not layouts +- **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 + +Octopress also has custom filters which work through Liquid's filtering system. I've added these for now: + +- **Smart quotes** for posts and pages +- **Title case** an adaptation of John Gruber's intelligent title capitalization script +- **Absolute urls** using '/' as a url opener for relative paths gets converted to an absolute url for RSS readers +- **Ordinal dates** dates are output like "October 5th" or "July 3rd" + +Of course Octopress still supports simple setup for Twitter, Disqus Comments, Google Custom Search, Google Analytics, Delicious Bookmarks, and now Pinboard Bookmarks. + +## Upgrading + +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? + +#### Update configs +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. + +#### Post dates +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. +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. + +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. + + + +Here are some steps you can take to get your blog running again on this update: + +1. From c7d5365f81552cae16bbb91696ca3e67b4a0a2e9 Mon Sep 17 00:00:00 2001 From: Brandon Mathis Date: Sun, 15 May 2011 18:33:00 -0400 Subject: [PATCH 136/715] major refactoring, improved file watching, changed site to public to support rack via pow (http://pow.cx) also implemented the basics of a 320 and up design refresh on the classic theme. This should make it great for mobile reading --- .ackrc | 1 + .gitignore | 2 + Gemfile | 6 +- Gemfile.lock | 45 +- Guardfile | 9 +- Rakefile | 2 +- _config.yml | 9 +- _plugins/custom_filters.rb | 11 +- _plugins/generate_sitemap.rb | 11 +- _plugins/generate_styles.rb | 1 + config.rb | 2 +- public/2009/11/13/hello-world/index.html | 107 +- public/2011/03/14/test-post/index.html | 105 +- .../2011/04/07/test-of-typography/index.html | 105 +- public/about/index.html | 113 +- public/atom.xml | 8 +- public/images/rss.png | Bin 6905 -> 504 bytes public/images/search.png | Bin 0 -> 333 bytes public/images/search_bg.png | Bin 1058 -> 0 bytes public/index.html | 120 +- .../libs/DOMAssistantCompressed-2.8.js | 4 + .../libs/ios-viewport-scaling-bug-fix.js | 20 + public/javascripts/libs/modernizr-1.7.min.js | 2 + public/javascripts/libs/respond.js | 8 + public/javascripts/libs/selectivizr-min.js | 5 + public/javascripts/mootools-1.2.4.2-more.js | 100 - public/javascripts/mootools-more-1.3.1.1.js | 1322 ---- public/javascripts/mootools-yui-compressed.js | 5492 ----------------- public/javascripts/octopress.js | 76 - public/javascripts/pinboard.js | 2 +- public/javascripts/twitter.js | 108 +- public/sitemap.xml | 24 +- public/stylesheets/screen.css | 4 +- {source/sass => sass}/screen.scss | 2 +- .../themes/classic/_partials.scss | 10 +- .../sass => sass}/themes/classic/_style.scss | 4 +- sass/themes/classic/core/_layout.scss | 94 + .../themes/classic/core/_theme.scss | 0 .../themes/classic/core/_typography.scss | 21 +- sass/themes/classic/media/_480.scss | 16 + sass/themes/classic/media/_768.scss | 16 + sass/themes/classic/media/_992.scss | 3 + .../themes/classic/partials/_blog.scss | 3 - .../themes/classic/partials/_footer.scss | 0 .../themes/classic/partials/_header.scss | 6 +- sass/themes/classic/partials/_navigation.scss | 67 + .../themes/classic/partials/_page.scss | 4 +- sass/themes/classic/partials/_search.scss | 0 .../themes/classic/partials/_shared.scss | 0 sass/themes/classic/partials/_sidebar.scss | 20 + .../themes/classic/partials/_syntax.scss | 0 .../themes/classic/partials/_twitter.scss | 0 source/_includes/article.html | 15 +- source/_includes/delicious.html | 2 +- source/_includes/head.html | 27 +- source/_includes/header.html | 9 - source/_includes/navigation.html | 8 +- source/_includes/pinboard.html | 2 +- source/_includes/sidebar.html | 8 +- source/_includes/twitter.html | 12 +- source/_layouts/default.html | 23 +- source/_layouts/page.html | 10 + source/about.haml | 6 +- source/images/rss.png | Bin 6905 -> 504 bytes source/images/search.png | Bin 0 -> 333 bytes source/images/search_bg.png | Bin 1058 -> 0 bytes .../libs/DOMAssistantCompressed-2.8.js | 4 + .../libs/ios-viewport-scaling-bug-fix.js | 20 + source/javascripts/libs/modernizr-1.7.min.js | 2 + source/javascripts/libs/respond.js | 8 + source/javascripts/libs/selectivizr-min.js | 5 + source/javascripts/mootools-1.2.4.2-more.js | 100 - source/javascripts/mootools-more-1.3.1.1.js | 1322 ---- source/javascripts/mootools-yui-compressed.js | 5492 ----------------- source/javascripts/octopress.js | 76 - source/javascripts/pinboard.js | 2 +- source/javascripts/twitter.js | 108 +- source/sass/themes/classic/core/_layout.scss | 91 - .../themes/classic/partials/_navigation.scss | 30 - .../sass/themes/classic/partials/_search.scss | 19 - .../themes/classic/partials/_sidebar.scss | 38 - source/test/typography.haml | 11 +- 82 files changed, 963 insertions(+), 14577 deletions(-) create mode 100644 .ackrc create mode 100644 _plugins/generate_styles.rb create mode 100644 public/images/search.png delete mode 100644 public/images/search_bg.png create mode 100644 public/javascripts/libs/DOMAssistantCompressed-2.8.js create mode 100644 public/javascripts/libs/ios-viewport-scaling-bug-fix.js create mode 100644 public/javascripts/libs/modernizr-1.7.min.js create mode 100644 public/javascripts/libs/respond.js create mode 100644 public/javascripts/libs/selectivizr-min.js delete mode 100644 public/javascripts/mootools-1.2.4.2-more.js delete mode 100644 public/javascripts/mootools-more-1.3.1.1.js delete mode 100644 public/javascripts/mootools-yui-compressed.js rename {source/sass => sass}/screen.scss (90%) rename {source/sass => sass}/themes/classic/_partials.scss (55%) rename {source/sass => sass}/themes/classic/_style.scss (76%) create mode 100644 sass/themes/classic/core/_layout.scss rename {source/sass => sass}/themes/classic/core/_theme.scss (100%) rename {source/sass => sass}/themes/classic/core/_typography.scss (88%) create mode 100644 sass/themes/classic/media/_480.scss create mode 100644 sass/themes/classic/media/_768.scss create mode 100644 sass/themes/classic/media/_992.scss rename {source/sass => sass}/themes/classic/partials/_blog.scss (89%) rename {source/sass => sass}/themes/classic/partials/_footer.scss (100%) rename {source/sass => sass}/themes/classic/partials/_header.scss (79%) create mode 100644 sass/themes/classic/partials/_navigation.scss rename {source/sass => sass}/themes/classic/partials/_page.scss (62%) create mode 100644 sass/themes/classic/partials/_search.scss rename {source/sass => sass}/themes/classic/partials/_shared.scss (100%) create mode 100644 sass/themes/classic/partials/_sidebar.scss rename {source/sass => sass}/themes/classic/partials/_syntax.scss (100%) rename {source/sass => sass}/themes/classic/partials/_twitter.scss (100%) create mode 100644 source/_layouts/page.html create mode 100644 source/images/search.png delete mode 100644 source/images/search_bg.png create mode 100644 source/javascripts/libs/DOMAssistantCompressed-2.8.js create mode 100644 source/javascripts/libs/ios-viewport-scaling-bug-fix.js create mode 100644 source/javascripts/libs/modernizr-1.7.min.js create mode 100644 source/javascripts/libs/respond.js create mode 100755 source/javascripts/libs/selectivizr-min.js delete mode 100644 source/javascripts/mootools-1.2.4.2-more.js delete mode 100644 source/javascripts/mootools-more-1.3.1.1.js delete mode 100644 source/javascripts/mootools-yui-compressed.js delete mode 100644 source/sass/themes/classic/core/_layout.scss delete mode 100644 source/sass/themes/classic/partials/_navigation.scss delete mode 100644 source/sass/themes/classic/partials/_search.scss delete mode 100644 source/sass/themes/classic/partials/_sidebar.scss diff --git a/.ackrc b/.ackrc new file mode 100644 index 0000000..c9fdae0 --- /dev/null +++ b/.ackrc @@ -0,0 +1 @@ +--ignore-dir=public diff --git a/.gitignore b/.gitignore index 0e7bf6c..8642c40 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,7 @@ site .sass-cache test source/_stash +source/stylesheets +vendor/ruby vendor/ruby vendor/ruby diff --git a/Gemfile b/Gemfile index 29ed4ae..f904d26 100644 --- a/Gemfile +++ b/Gemfile @@ -1,13 +1,13 @@ source :rubygems +gem 'rake' gem 'jekyll' gem 'rdiscount' gem 'RedCloth' -gem "haml", "3.1.0.alpha.147" -gem 'compass', '0.11.beta.5' +gem 'haml', '>= 3.1' +gem 'compass', '>= 0.11' gem 'rubypants' gem 'rb-fsevent' gem 'guard-shell' gem 'guard-livereload' gem 'serve' -gem 'rake' diff --git a/Gemfile.lock b/Gemfile.lock index 80c455d..e88c863 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,53 +1,48 @@ GEM remote: http://rubygems.org/ specs: - RedCloth (4.2.3) - activesupport (3.0.5) - addressable (2.2.4) - chunky_png (1.1.0) + RedCloth (4.2.7) + activesupport (3.0.7) + addressable (2.2.5) + chunky_png (1.2.0) classifier (1.3.3) fast-stemmer (>= 1.0.0) - compass (0.11.beta.5) - chunky_png (~> 1.1.0) - sass (>= 3.1.0.alpha.249) - configuration (1.2.0) - directory_watcher (1.3.2) + compass (0.11.1) + chunky_png (~> 1.1) + fssm (>= 0.2.7) + sass (~> 3.1) + directory_watcher (1.4.0) em-websocket (0.2.1) addressable (>= 2.1.1) eventmachine (>= 0.12.9) eventmachine (0.12.10) fast-stemmer (1.0.0) - guard (0.3.0) - open_gem (~> 1.4.2) + fssm (0.2.7) + guard (0.3.4) thor (~> 0.14.6) - guard-livereload (0.1.9) + guard-livereload (0.1.11) em-websocket (~> 0.2.0) guard (>= 0.2.2) - json (~> 1.4.6) + json (~> 1.5.1) guard-shell (0.1.1) guard (>= 0.2.0) - haml (3.1.0.alpha.147) + haml (3.1.1) i18n (0.4.2) jekyll (0.10.0) classifier (>= 1.3.1) directory_watcher (>= 1.1.1) liquid (>= 1.9.0) maruku (>= 0.5.9) - json (1.4.6) - launchy (0.3.7) - configuration (>= 0.0.5) - rake (>= 0.8.1) + json (1.5.1) liquid (2.2.2) maruku (0.6.0) syntax (>= 1.0.0) - open_gem (1.4.2) - launchy (~> 0.3.5) - rack (1.2.1) + rack (1.2.2) rake (0.8.7) rb-fsevent (0.4.0) rdiscount (1.6.8) rubypants (0.2.0) - sass (3.1.0.alpha.252) + sass (3.1.1) serve (1.0.0) activesupport (~> 3.0.1) i18n (~> 0.4.1) @@ -55,17 +50,17 @@ GEM tzinfo (~> 0.3.23) syntax (1.0.0) thor (0.14.6) - tzinfo (0.3.24) + tzinfo (0.3.27) PLATFORMS ruby DEPENDENCIES RedCloth - compass (= 0.11.beta.5) + compass (>= 0.11) guard-livereload guard-shell - haml (= 3.1.0.alpha.147) + haml (>= 3.1) jekyll rake rb-fsevent diff --git a/Guardfile b/Guardfile index 97f4a2b..9fe2858 100644 --- a/Guardfile +++ b/Guardfile @@ -1,9 +1,4 @@ -guard 'shell' do - watch(/source\/sass\/(.*)\.s[ac]ss/) {|m| `compass compile` } - watch(%r{public/.+\.(js|html)}) {|m| `compass compile` } -end - guard 'livereload', :api_version => '1.6' do - watch(%r{public/.+\.(css)}) - watch(%r{public/.+\.(js|html)}) + watch(/public\/stylesheets\/(.*)\.css/); + watch(/public\/(.*)\.(js|html|png|jpg|gif|jpeg|ttf|otf|woff|svg)/i); end diff --git a/Rakefile b/Rakefile index 634f6d4..6834e4a 100644 --- a/Rakefile +++ b/Rakefile @@ -104,7 +104,7 @@ end desc "Watch the site and regenerate when it changes" task :watch do - system "trap 'kill $jekyllPid $guardPid' Exit; guard & guardPid=$!; jekyll --auto & jekyllPid=$!; wait" + system "trap 'kill $jekyllPid $guardPid $compassPid' Exit; jekyll --auto & jekyllPid=$!; sleep 0.5; compass watch & compassPid=$!; guard & guardPid=$!; wait" end desc "generate and deploy website via rsync" diff --git a/_config.yml b/_config.yml index 34e99b8..0ee0141 100644 --- a/_config.yml +++ b/_config.yml @@ -1,14 +1,14 @@ source: source destination: public -exclude: sass, *.scss markdown: rdiscount -pygments: true +pygments: false permalink: pretty url: http://yoursite.com title: My Octopress Blog author: Your Name email: you@domain.com #Add your email (optional) for the atom feed +simple_search: http://google.com/search recent_posts: 10 @@ -19,10 +19,9 @@ show_replies: false delicious_user: delicious_count: 3 -pinboard_user: imathis +pinboard_user: designenthusiast pinboard_count: 3 -disqus_short_name: +disqus_short_name: imathis -google_custom_search_id: google_analytics_tracking_id: diff --git a/_plugins/custom_filters.rb b/_plugins/custom_filters.rb index 2c58e67..84f1caa 100644 --- a/_plugins/custom_filters.rb +++ b/_plugins/custom_filters.rb @@ -15,6 +15,11 @@ module OctopressFilters $1+url+$3 end end + def search_url(input) + input.gsub /(http:\/\/)(\S+)/ do + $2 + end + end def smart_quotes(input) require 'rubypants' RubyPants.new(input).to_html @@ -23,10 +28,14 @@ module OctopressFilters require 'titlecase' input.titlecase end - def ordinalize(date) + def datetime(date) if date.class == String date = Time.parse(date) end + date + end + def ordinalize(date) + date = datetime(date) "#{date.strftime('%B')} #{ordinal(date.strftime('%e').to_i)}, #{date.strftime('%Y')}" end def ordinal(number) diff --git a/_plugins/generate_sitemap.rb b/_plugins/generate_sitemap.rb index 488a992..4d580c4 100644 --- a/_plugins/generate_sitemap.rb +++ b/_plugins/generate_sitemap.rb @@ -44,7 +44,6 @@ module Jekyll priority :low # Domain that you are generating the sitemap for - update this to match your site. - BASE_URL = 'http://recursive-design.com' # Generates the sitemap.xml file. # @@ -82,6 +81,8 @@ module Jekyll def generate_content(site) result = '' + base_url = site.config['url'] + # First, try to find any stand-alone pages. site.pages.each{ |page| path = page.subfolder + '/' + page.name @@ -93,14 +94,14 @@ module Jekyll end unless path =~/error/ - result += entry(path, mod_date) + result += entry(base_url, path, mod_date) end } # Next, find all the posts. posts = site.site_payload['site']['posts'] for post in posts do - result += entry(post.id, post.date) + result += entry(base_url, post.id, post.date) end result @@ -115,12 +116,12 @@ module Jekyll # # +path+ is the URL path to the page. # +date+ is the date the file was modified (in the case of regular pages), or published (for blog posts). - def entry(path, date) + def entry(base_url, path, date) # Force extensions to .html from markdown, textile. path = path.gsub(/\.(markdown|textile)$/i, '.html') " - #{BASE_URL}#{path} + #{base_url}#{path} #{date.strftime("%Y-%m-%d")} " end diff --git a/_plugins/generate_styles.rb b/_plugins/generate_styles.rb new file mode 100644 index 0000000..e1819f8 --- /dev/null +++ b/_plugins/generate_styles.rb @@ -0,0 +1 @@ +system "sleep 0.5; compass compile --css-dir source/stylesheets" diff --git a/config.rb b/config.rb index 23a73c8..164a834 100644 --- a/config.rb +++ b/config.rb @@ -3,7 +3,7 @@ project_type = :stand_alone # Set this to the root of your project when deployed: http_path = "/" css_dir = "public/stylesheets" -sass_dir = "source/sass" +sass_dir = "sass" images_dir = "source/images" http_images_dir = "images" fonts_dir = "source/fonts" diff --git a/public/2009/11/13/hello-world/index.html b/public/2009/11/13/hello-world/index.html index cd0e939..b67552e 100644 --- a/public/2009/11/13/hello-world/index.html +++ b/public/2009/11/13/hello-world/index.html @@ -1,49 +1,62 @@ - + + + + + + + Hello World! I'm Octopress! - My Octopress Blog - + + + + + + + + - - - - - - - - - + + + - +
    -