commit 7870e243e68fc7a4deec31d84a141b711c3e1f9c Author: John Bintz Date: Tue Jun 14 17:25:46 2011 -0400 initial commit diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..2ad44e0 Binary files /dev/null and b/.DS_Store differ diff --git a/Guardfile b/Guardfile new file mode 100644 index 0000000..7c01f15 --- /dev/null +++ b/Guardfile @@ -0,0 +1,6 @@ +# A sample Guardfile +# More info at https://github.com/guard/guard#readme + +guard 'livereload' do + watch(%r{.+\.(md|png|jpg|png|json|css)}) +end diff --git a/one/.DS_Store b/one/.DS_Store new file mode 100644 index 0000000..124a643 Binary files /dev/null and b/one/.DS_Store differ diff --git a/one/01_slide.md b/one/01_slide.md new file mode 100644 index 0000000..0d7f9f2 --- /dev/null +++ b/one/01_slide.md @@ -0,0 +1,422 @@ +!SLIDE +# Guard and the Modern Rails App # + +!SLIDE +## in 5 minutes ## + +!SLIDE +### by John Bintz ### + +!SLIDE +# Guard? # + +!SLIDE center +![Shell Commands](images/shell-commands.png) + +!SLIDE center +![Reload Button](images/reload-button.png) + +!SLIDE center +![Pocket Watch by Cyberslayer](images/pocket-watch-cyberslayer.jpg) +[Pocket Watch by Cyberslayer](http://www.flickr.com/photos/cyberslayer/870683349/) + +!SLIDE center +![Wrist Brace by lesleyhyphenanne](images/wrist-brace-lesleyhyphenanne.jpg) +[Wrist Brace by lesleyhyphenanne](http://www.flickr.com/photos/lesleyhyphenanne/2878429259/) + +!SLIDE +# Get it? # + +!SLIDE smaller + @@@ sh + gem install guard + +!SLIDE smaller + @@@ sh + gem install guard-annotate guard-bundler guard-chef \ + guard-coffeedripper guard-coffeescript guard-compass \ + guard-cucumber guard-delayed guard-ego guard-gimli \ + guard-haml guard-jammit guard-jasmine-headless-webkit \ + guard-jstd guard-koans guard-krl guard-less guard-livereload \ + guard-markdown guard-middleman guard-migrate guard-minitest \ + guard-mozrepl guard-nanoc guard-passenger guard-pow \ + guard-prove guard-pusher guard-rails guard-rspec guard-sass \ + guard-shell guard-soca guard-spork guard-sprockets \ + guard-stendhal guard-test guard-uglify guard-webrick + +!SLIDE bullets incremental +# Guards for... # + +* Restarting servers +* Compiling files +* Testing things +* Whatever else you feel like automating + +!SLIDE +# Guard and the Modern Rails App # + +!SLIDE +# A Modern Rails App # + +!SLIDE +# Rails 3.0.x # + +!SLIDE +## I will touch on Rails 3.1, but since it's not out yet, and the asset pipeline makes some "easy" things much more difficult, I'm saving it for the end. ## + +!SLIDE bullets incremental +# This app uses: # + +* CoffeeScript >> JS +* SCSS + Compass >> CSS +* Jasmine Headless WebKit >> JS testing +* A web browser +* RSpec >> Ruby testing + +!SLIDE +# OMG RSPEC FLAME WARS ON # + +!SLIDE center +![lol flame war](images/flamewar.gif) + +!SLIDE bullets incremental +# DON'T PANIC # + +* `guard-test` +* `guard-minitest` +* `guard-write-your-own` + +!SLIDE bullets incremental +# We want Guard to do this when we save files: # + +* Run our tests +* Regenerate our CSS & JS +* Reload the page in our browser +* Restart the dev Rails server + +!SLIDE +# Only the files a particular Guard action cares about # + +!SLIDE +# `.rb && _spec.rb` # + +!SLIDE +# `.scss && .sass` # + +!SLIDE +# `.js && .coffee` # + +!SLIDE +# `config/.*` + +!SLIDE +# How? # + +!SLIDE smaller + @@@ sh + cd ~/my-cool-project + +!SLIDE smaller + @@@ sh + cd ~/my-cool-project + guard init + +!SLIDE smaller + @@@ sh + cd ~/my-cool-project + guard init + guard init rspec + guard init rails + guard init coffeescript + guard init compass + guard init jasmine-headless-webkit + guard init livereload + +!SLIDE evensmaller + @@@ ruby + + # A sample Guardfile + # More info at https://github.com/guard/guard#readme + + guard 'rspec', :version => 2 do + watch(%r{^spec/.+_spec\.rb$}) + watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" } + watch('spec/spec_helper.rb') { "spec" } + + # Rails example + watch(%r{^spec/.+_spec\.rb$}) + watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" } + watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" } + watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| + [ "spec/routing/#{m[1]}_routing_spec.rb", + "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", + "spec/acceptance/#{m[1]}_spec.rb" ] + } + watch(%r{^spec/support/(.+)\.rb$}) { "spec" } + watch('spec/spec_helper.rb') { "spec" } + watch('config/routes.rb') { "spec/routing" } + watch('app/controllers/application_controller.rb') { "spec/controllers" } + # Capybara request specs + watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" } + end + + guard 'rails' do + watch('Gemfile.lock') + watch(%r{^(config|lib)/.*}) + end + + guard 'coffeescript', :input => 'app/assets/javascripts' + + guard 'compass' do + watch('^src/(.*)\.s[ac]ss') + end + +!SLIDE evensmaller + @@@ ruby + # Run JS and CoffeeScript files in a typical Rails 3.1 fashion, + # placing Underscore templates in app/views/*.jst + # Your spec files end with _spec.{js,coffee}. + + spec_location = "spec/javascripts/%s_spec" + + # uncomment if you use NerdCapsSpec.js + # spec_location = "spec/javascripts/%sSpec" + + guard 'jasmine-headless-webkit' do + watch(%r{^app/views/.*\.jst}) + watch(%r{^public/javascripts/(.*)\.js}) { |m| newest_js_file(spec_location % m[1]) } + watch(%r{^app/assets/javascripts/(.*)\.(js|coffee)}) { |m| newest_js_file(spec_location % m[1]) } + watch(%r{^spec/javascripts/(.*)_spec\..*}) { |m| newest_js_file(spec_location % m[1]) } + end + + guard 'livereload' do + watch(%r{app/.+\.(erb|haml)}) + watch(%r{app/helpers/.+\.rb}) + watch(%r{public/.+\.(css|js|html)}) + watch(%r{config/locales/.+\.yml}) + end + +!SLIDE +## [johnbintz-guard-5-min.heroku.com](http://johnbintz-guard-5-min.heroku.com/) ## + +!SLIDE + @@@ sh + + guard + # and away you go! + +!SLIDE +# Yay we're done everyone go home now bye bye # + +!SLIDE +# ...let's make this better... # + +!SLIDE + @@@ ruby + guard 'rspec', :version => 2 do + watch(%r{something}) + end + + guard 'livereload' do + watch(%r{something else}) + end + +!SLIDE + @@@ ruby + # gem 'guard', '>= 0.4.0' + + group :test do + guard 'rspec', :version => 2 do + watch(%r{something}) + end + end + + group :development do + guard 'livereload' do + watch(%r{something else}) + end + end + + +!SLIDE + @@@ sh + + # testing code here + guard -g test + + # stuff for a browser here + guard -g development + +!SLIDE +# But I want Guard to wash my dishes and fold my laundry and take the dog for a walk and -- # + +!SLIDE +# Yes! # +## It can! ## + +!SLIDE + @@@ sh + + gem install guard-shell + guard init shell + +!SLIDE small + @@@ ruby + + guard 'shell' do + watch(%r{sink/.*\.dish}) { `wash all` } + watch(%r{dryer/.*\.pants}) { `fold all` } + watch(%r{dog/(.*)\.dog}) { |m| `walk #{m[1]}` } + end + +!SLIDE +# BACKTICKS ARE FOR THE WEAK # + +!SLIDE small + @@@ ruby + + module Guard + class NotAWeakling < Guard + def start + UI.info "Let's do this..." + end + + def run_all + lift_heavy_things + run(5.miles) + chin_ups.go! + end + end + end + + guard 'not-a-weakling' do + watch(%r{.*}) + end + +!SLIDE +# Rails 3.1.x and the Asset Pipeline OF DOOM # + +!SLIDE +# CSS _should_ be OK... # + +!SLIDE + @@@ ruby + guard 'livereload' do + watch(%r{app/.+\.(erb|haml)}) + watch(%r{app/helpers/.+\.rb}) + watch(%r{public/.+\.(css|js|html)}) + watch(%r{config/locales/.+\.yml}) + end + +!SLIDE bullets incremental +# But JavaScript testing? # + +* CoffeeScript compilation +* Gems that provide JS +* `file.coffee.erb` + +!SLIDE + +# `file.coffee.erb` + +!SLIDE +# Uhhh... # + +!SLIDE +# Anyway... # + +!SLIDE +# Rack-based test solutions that talk Sprockets... # + +!SLIDE +# ...may be OK # + +!SLIDE bullets incremental +# The Internets are still figuring out the best way... # + +* `jasmine-gem` +* `evergreen` +* ...others... + +!SLIDE +# PhantomJS against a running Rack server that can serve asset path files # + +!SLIDE small + @@@ ruby + guard 'phantomjs', :runner => 'run-jasmine.js' do + # Rails example + watch(%r{public/.+\.js}) + watch(%r{^spec/javascripts/.+\.js}) + end + +!SLIDE bullets incremental +# Non-Rack-based solutions? # + +* Node.js +* Rhino + EnvJS +* `jasmine-headless-webkit` + +!SLIDE +## (shameless self-promotion warning!) + +!SLIDE +# Compile all that yummy Rails-bound JS before running tests # + +!SLIDE small + @@@ ruby + + # with a newer version of... + + gem 'jasmine-headless-webkit' + + # and the matching guard, this gets run + # before each test run: + + Rake::Task['assets:precompile:for_testing'].invoke + +!SLIDE small + @@@ ruby + + # Guardfile + guard 'jasmine-headless-webkit', :rails_assets => true do + watch(%r{app/assets/javascripts/.*\.(js|coffee)$}) + end + +!SLIDE + # spec/javascripts/support/jasmine.yml + + src_files: + - public/assets/*-test.js + +!SLIDE center +![fffffffuuuuuuuuuuuu](images/RageFace.jpg) + +!SLIDE +# Anyway... # + +!SLIDE +# In conclusion... # + +!SLIDE +# Install Guard # + +!SLIDE +# Use Guard # + +!SLIDE +# Type Less # + +!SLIDE +# More Time For Beer From A Vending Machine # + +!SLIDE center +![Beer Vending Machine by Joel Abroad](images/beer-vending-machine-joel-abroad.jpg) +[Beer Vending Machine by Joel Abroad](http://www.flickr.com/photos/40295335@N00/4849603734/) + +!SLIDE bullets +# Thanks! # + +* [johnbintz-guard-5-min.heroku.com](http://johnbintz-guard-5-min.heroku.com/) +* [@johnbintz](http://twitter.com/johnbintz) +* [github.com/johnbintz](http://github.com/johnbintz) + diff --git a/one/images/.DS_Store b/one/images/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/one/images/.DS_Store differ diff --git a/one/images/RageFace.jpg b/one/images/RageFace.jpg new file mode 100644 index 0000000..85e4d92 Binary files /dev/null and b/one/images/RageFace.jpg differ diff --git a/one/images/beer-vending-machine-joel-abroad.jpg b/one/images/beer-vending-machine-joel-abroad.jpg new file mode 100644 index 0000000..fd9e4b5 Binary files /dev/null and b/one/images/beer-vending-machine-joel-abroad.jpg differ diff --git a/one/images/flamewar.gif b/one/images/flamewar.gif new file mode 100644 index 0000000..fa65351 Binary files /dev/null and b/one/images/flamewar.gif differ diff --git a/one/images/pocket-watch-cyberslayer.jpg b/one/images/pocket-watch-cyberslayer.jpg new file mode 100644 index 0000000..8482780 Binary files /dev/null and b/one/images/pocket-watch-cyberslayer.jpg differ diff --git a/one/images/reload-button.png b/one/images/reload-button.png new file mode 100644 index 0000000..f819663 Binary files /dev/null and b/one/images/reload-button.png differ diff --git a/one/images/responsibility5.png b/one/images/responsibility5.png new file mode 100644 index 0000000..e519b48 Binary files /dev/null and b/one/images/responsibility5.png differ diff --git a/one/images/shell-commands.png b/one/images/shell-commands.png new file mode 100644 index 0000000..421181e Binary files /dev/null and b/one/images/shell-commands.png differ diff --git a/one/images/wrist-brace-lesleyhyphenanne.jpg b/one/images/wrist-brace-lesleyhyphenanne.jpg new file mode 100644 index 0000000..758a73c Binary files /dev/null and b/one/images/wrist-brace-lesleyhyphenanne.jpg differ diff --git a/showoff.json b/showoff.json new file mode 100644 index 0000000..0817684 --- /dev/null +++ b/showoff.json @@ -0,0 +1,2 @@ +{ "name": "Guard & the Modern Rails App in 5 Minutes", "sections": [ {"section":"one"} ]} + diff --git a/static/css/fg.menu.css b/static/css/fg.menu.css new file mode 100644 index 0000000..820db38 --- /dev/null +++ b/static/css/fg.menu.css @@ -0,0 +1,114 @@ +/* Styles for jQuery menu widget +Author: Maggie Wachs, maggie@filamentgroup.com +Date: September 2008 +*/ + + +/* REQUIRED STYLES - the menus will only render correctly with these rules */ + +.fg-menu-container { position: absolute; top:0; left:-999px; padding: .4em; overflow: hidden; } +.fg-menu-container.fg-menu-flyout { overflow: visible; } + +.fg-menu, .fg-menu ul { list-style-type:none; padding: 0; margin:0; } + +.fg-menu { position:relative; } +.fg-menu-flyout .fg-menu { position:static; } + +.fg-menu ul { position:absolute; top:0; } +.fg-menu ul ul { top:-1px; } + +.fg-menu-container.fg-menu-ipod .fg-menu-content, +.fg-menu-container.fg-menu-ipod .fg-menu-content ul { background: none !important; } + +.fg-menu.fg-menu-scroll, +.fg-menu ul.fg-menu-scroll { overflow: scroll; overflow-x: hidden; } + +.fg-menu li { clear:both; float:left; width:100%; margin: 0; padding:0; border: 0; } +.fg-menu li li { font-size:1em; } /* inner li font size must be reset so that they don't blow up */ + +.fg-menu-flyout ul ul { padding: .4em; } +.fg-menu-flyout li { position:relative; } + +.fg-menu-scroll { overflow: scroll; overflow-x: hidden; } + +.fg-menu-breadcrumb { margin: 0; padding: 0; } + +.fg-menu-footer { margin-top: .4em; padding: .4em; } +.fg-menu-header { margin-bottom: .4em; padding: .4em; } + +.fg-menu-breadcrumb li { float: left; list-style: none; margin: 0; padding: 0 .2em; font-size: .9em; opacity: .7; } +.fg-menu-breadcrumb li.fg-menu-prev-list, +.fg-menu-breadcrumb li.fg-menu-current-crumb { clear: left; float: none; opacity: 1; } +.fg-menu-breadcrumb li.fg-menu-current-crumb { padding-top: .2em; } + +.fg-menu-breadcrumb a, +.fg-menu-breadcrumb span { float: left; } + +.fg-menu-footer a:link, +.fg-menu-footer a:visited { float:left; width:100%; text-decoration: none; } +.fg-menu-footer a:hover, +.fg-menu-footer a:active { } + +.fg-menu-footer a span { float:left; cursor: pointer; } + +.fg-menu-breadcrumb .fg-menu-prev-list a:link, +.fg-menu-breadcrumb .fg-menu-prev-list a:visited, +.fg-menu-breadcrumb .fg-menu-prev-list a:hover, +.fg-menu-breadcrumb .fg-menu-prev-list a:active { background-image: none; text-decoration:none; } + +.fg-menu-breadcrumb .fg-menu-prev-list a { float: left; padding-right: .4em; } +.fg-menu-breadcrumb .fg-menu-prev-list a .ui-icon { float: left; } + +.fg-menu-breadcrumb .fg-menu-current-crumb a:link, +.fg-menu-breadcrumb .fg-menu-current-crumb a:visited, +.fg-menu-breadcrumb .fg-menu-current-crumb a:hover, +.fg-menu-breadcrumb .fg-menu-current-crumb a:active { display:block; background-image:none; font-size:1.3em; text-decoration:none; } + + + +/* REQUIRED LINK STYLES: links are "display:block" by default; if the menu options are split into + selectable node links and 'next' links, the script floats the node links left and floats the 'next' links to the right */ + +.fg-menu a:link, +.fg-menu a:visited, +.fg-menu a:hover, +.fg-menu a:active { float:left; width:92%; padding:.3em 3%; text-decoration:none; outline: 0 !important; } + +.fg-menu a { border: 1px dashed transparent; } + +.fg-menu a.ui-state-default:link, +.fg-menu a.ui-state-default:visited, +.fg-menu a.ui-state-default:hover, +.fg-menu a.ui-state-default:active, +.fg-menu a.ui-state-hover:link, +.fg-menu a.ui-state-hover:visited, +.fg-menu a.ui-state-hover:hover, +.fg-menu a.ui-state-hover:active, + .fg-menu a.ui-state-active:link, + .fg-menu a.ui-state-active:visited, + .fg-menu a.ui-state-active:hover, +.fg-menu a.ui-state-active:active { border-style: solid; font-weight: normal; } + +.fg-menu a span { display:block; cursor:pointer; } + + + /* SUGGESTED STYLES - for use with jQuery UI Themeroller CSS */ + +.fg-menu-indicator span { float:left; } +.fg-menu-indicator span.ui-icon { float:right; } + +.fg-menu-content.ui-widget-content, +.fg-menu-content ul.ui-widget-content { border:0; } + + +/* ICONS AND DIVIDERS */ + +.fg-menu.fg-menu-has-icons a:link, +.fg-menu.fg-menu-has-icons a:visited, +.fg-menu.fg-menu-has-icons a:hover, +.fg-menu.fg-menu-has-icons a:active { padding-left:20px; } + +.fg-menu .horizontal-divider hr, .fg-menu .horizontal-divider span { padding:0; margin:5px .6em; } +.fg-menu .horizontal-divider hr { border:0; height:1px; } +.fg-menu .horizontal-divider span { font-size:.9em; text-transform: uppercase; padding-left:.2em; } + diff --git a/static/css/onepage.css b/static/css/onepage.css new file mode 100644 index 0000000..1f047e7 --- /dev/null +++ b/static/css/onepage.css @@ -0,0 +1,60 @@ +/* Screen */ +@media screen { + .slide { + margin: 10px; + padding: 0; + width: 1020px; + height: 740px; + max-height: 740px !important; + margin-left:auto; + margin-right:auto; + overflow:hidden; + border: 1px solid #333; + page-break-after: always + } +} + +/* Print */ +@media print { + .slide, .preso { + margin: 10px; + padding: 0; + width: 800px; + height: 600px; + overflow:hidden; + border: none; + page-break-after: always + } +} + +/* iPhone */ +/* Portrait */ +@media screen and (max-width: 320px) +{ + .preso { + margin: 10px; + padding: 0; + width: 320px; + min-height: 480px; + margin-left:auto; + margin-right:auto; +/* overflow:hidden;*/ + border: 1px solid #333; + page-break-after: always + } +} +/* Landscape */ +@media screen and (min-width: 321px) +{ + .preso { + margin: 10px; + padding: 0; + width: 480px; + min-height: 320px; + margin-left:auto; + margin-right:auto; +/* overflow:hidden;*/ + border: 1px solid #333; + page-break-after: always + } +} diff --git a/static/css/pdf.css b/static/css/pdf.css new file mode 100644 index 0000000..ea1989b --- /dev/null +++ b/static/css/pdf.css @@ -0,0 +1,12 @@ +.slide { + margin: 0; + padding: 0; + width: 100%; + height: 740px; + margin-left:auto; + margin-right:auto; + overflow:hidden; + page-break-after: always +} + +@page { size: A4 landscape } diff --git a/static/css/reset.css b/static/css/reset.css new file mode 100644 index 0000000..1c85489 --- /dev/null +++ b/static/css/reset.css @@ -0,0 +1,53 @@ +/* http://meyerweb.com/eric/tools/css/reset/ */ +/* v1.0 | 20080212 */ + +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, font, 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 { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + background: transparent; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +/* remember to define focus styles! */ +:focus { + outline: 0; +} + +/* remember to highlight inserts somehow! */ +ins { + text-decoration: none; +} +del { + text-decoration: line-through; +} + +/* tables still need 'cellspacing="0"' in the markup */ +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/static/css/sh_style.css b/static/css/sh_style.css new file mode 100644 index 0000000..12be84b --- /dev/null +++ b/static/css/sh_style.css @@ -0,0 +1,66 @@ +pre.sh_sourceCode { + background-color: white; + color: black; + font-style: normal; + font-weight: normal; +} + +pre.sh_sourceCode .sh_keyword { color: blue; font-weight: bold; } /* language keywords */ +pre.sh_sourceCode .sh_type { color: darkgreen; } /* basic types */ +pre.sh_sourceCode .sh_usertype { color: teal; } /* user defined types */ +pre.sh_sourceCode .sh_string { color: red; font-family: monospace; } /* strings and chars */ +pre.sh_sourceCode .sh_regexp { color: orange; font-family: monospace; } /* regular expressions */ +pre.sh_sourceCode .sh_specialchar { color: pink; font-family: monospace; } /* e.g., \n, \t, \\ */ +pre.sh_sourceCode .sh_comment { color: brown; font-style: italic; } /* comments */ +pre.sh_sourceCode .sh_number { color: purple; } /* literal numbers */ +pre.sh_sourceCode .sh_preproc { color: darkblue; font-weight: bold; } /* e.g., #include, import */ +pre.sh_sourceCode .sh_symbol { color: darkred; } /* */ +pre.sh_sourceCode .sh_function { color: black; font-weight: bold; } /* function calls and declarations */ +pre.sh_sourceCode .sh_cbracket { color: red; } /* block brackets (e.g., {, }) */ +pre.sh_sourceCode .sh_todo { font-weight: bold; background-color: cyan; } /* TODO and FIXME */ + +/* Predefined variables and functions (for instance glsl) */ +pre.sh_sourceCode .sh_predef_var { color: darkblue; } +pre.sh_sourceCode .sh_predef_func { color: darkblue; font-weight: bold; } + +/* for OOP */ +pre.sh_sourceCode .sh_classname { color: teal; } + +/* line numbers (not yet implemented) */ +pre.sh_sourceCode .sh_linenum { color: black; font-family: monospace; } + +/* Internet related */ +pre.sh_sourceCode .sh_url { color: blue; text-decoration: underline; font-family: monospace; } + +/* for ChangeLog and Log files */ +pre.sh_sourceCode .sh_date { color: blue; font-weight: bold; } +pre.sh_sourceCode .sh_time, pre.sh_sourceCode .sh_file { color: darkblue; font-weight: bold; } +pre.sh_sourceCode .sh_ip, pre.sh_sourceCode .sh_name { color: darkgreen; } + +/* for Prolog, Perl... */ +pre.sh_sourceCode .sh_variable { color: darkgreen; } + +/* for LaTeX */ +pre.sh_sourceCode .sh_italics { color: darkgreen; font-style: italic; } +pre.sh_sourceCode .sh_bold { color: darkgreen; font-weight: bold; } +pre.sh_sourceCode .sh_underline { color: darkgreen; text-decoration: underline; } +pre.sh_sourceCode .sh_fixed { color: green; font-family: monospace; } +pre.sh_sourceCode .sh_argument { color: darkgreen; } +pre.sh_sourceCode .sh_optionalargument { color: purple; } +pre.sh_sourceCode .sh_math { color: orange; } +pre.sh_sourceCode .sh_bibtex { color: blue; } + +/* for diffs */ +pre.sh_sourceCode .sh_oldfile { color: orange; } +pre.sh_sourceCode .sh_newfile { color: darkgreen; } +pre.sh_sourceCode .sh_difflines { color: blue; } + +/* for css */ +pre.sh_sourceCode .sh_selector { color: purple; } +pre.sh_sourceCode .sh_property { color: blue; } +pre.sh_sourceCode .sh_value { color: darkgreen; font-style: italic; } + +/* other */ +pre.sh_sourceCode .sh_section { color: black; font-weight: bold; } +pre.sh_sourceCode .sh_paren { color: red; } +pre.sh_sourceCode .sh_attribute { color: darkgreen; } diff --git a/static/css/showoff.css b/static/css/showoff.css new file mode 100644 index 0000000..1918f4c --- /dev/null +++ b/static/css/showoff.css @@ -0,0 +1,346 @@ +@media screen { + body { + font-family: "Gill Sans", Helvetica, Arial, sans-serif; + background:#333; + overflow:hidden; + margin:0; + padding:0; + } + + #preso, .slide { + background: #fff; + width: 1024px; + height: 768px; + margin-left:auto; + margin-right:auto; + overflow:hidden; + -webkit-box-shadow:0 0 25px rgba(0,0,0,0.35); + -moz-box-shadow:0 0 25px rgba(0,0,0,0.35); + box-shadow:0 0 25px rgba(0,0,0,0.35); + } + + #footer { + background: rgba(221,221,221,0.75); + color:#333; + padding: 2px 5px; + width: 1005px; + height: 20px; + line-height:20px; + font-size:14px; + position:relative; + top:-24px; + margin:0 auto; + -webkit-border-top-left-radius: 3px; + -webkit-border-top-right-radius: 3px; + -moz-border-radius-topleft: 3px; + -moz-border-radius-topright: 3px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + z-index: 2147483647; /* max, see http://www.puidokas.com/max-z-index/ */ + } +} + +/* iPhone */ +/* Portrait */ +@media screen and (max-width: 320px) +{ + #preso { + margin: 0; + padding: 0; + width: 320px; + max-height: 356px; + margin-left:auto; + margin-right:auto; +/* overflow:hidden;*/ + } + #footer { + background: #eee; + margin: 0; + padding: 2px; + width: 320px; + height: 20px; + margin-left:auto; + margin-right:auto; + } +} +/* Landscape */ +@media screen and (max-width: 480px) +{ + #preso { + margin: 0; + padding: 0; +/* min-height: 320px;*/ + width: 480px; + margin-left:auto; + margin-right:auto; + } + #footer { + background: #eee; + margin: 0; + padding: 2px; + width: 480px; + height: 20px; + margin-left:auto; + margin-right:auto; + } +} + +.center img { + display:block; + margin-left:auto; + margin-right:auto; +} + +.slide .center { + height: 740px; + width: 1020px; + display: table-cell; + text-align: center; + vertical-align: middle; +} + +.bullets ul { + font-size: 3em; +} +.bullets ul li { + text-align: center; + padding: 25px; +} + +.smbullets ul { + font-size: 2em; +} +.smbullets ul li { + text-align: center; + padding: 10px; +} + +.commandline pre { + font-size: 2em; +} + +.commandline code.command { + color: #000; +} + +.commandline code.result { + color: #444; +} + +.command h1 { + white-space: pre; + font-family: monospace; + font-size: 3em; +} + +.code { + white-space: pre; + font-family: monospace; +} + +.subsection { + background: #008; + color: #fff; +} + +.small { + font-size: 80%; +} + +.smaller { + font-size: 70%; +} + +h1 { font-size: 5em; font-weight: normal; text-align: center;} +h2 { font-size: 3em; font-weight: normal; text-align: center; } +h3 { font-size: 2em; font-weight: normal; text-align: center; } + +h1, h2, h3 { + margin: 0.5em 0; +} + +pre { margin-left: 40px; font-size: 2.8em; } + +.notes { display: none } +.hidden { position:absolute; top:0; left:-9999px; width:1px; height:1px; overflow:hidden; } +.buttonNav { display: none } +.offscreen { position:absolute; top:0; left:-9999px; overflow:hidden; } +#debugInfo { margin-left: 30px; } +#notesInfo { margin-left: 30px; display: none } +#preshow { display: none; } + +#help { + background: #9f9; + position: absolute; + right: 80px; + display: none; + z-index: 2147483647; /* max, see http://www.puidokas.com/max-z-index/ */ +} +#help table tr td.key { + text-align: right; + border-right: 2px solid #8b8; + padding-right: 4px; + font-weight: bold; +} + +.fg-menu-container { + z-index: 2147483647; /* max, see http://www.puidokas.com/max-z-index/ */ +} + +.fg-button { clear:left; margin:0 4px 40px 20px; padding: .4em 1em; text-decoration:none !important; cursor:pointer; position: relative; text-align: center; zoom: 1; } +.fg-button .ui-icon { position: absolute; top: 50%; margin-top: -8px; left: 50%; margin-left: -8px; } +a.fg-button { float:left; } +.fg-button-icon-right { padding-right: 2.1em; } +.fg-button-icon-right .ui-icon { left: auto; right: .2em; margin-left: 0; } + +.fg-button.ui-state-loading .ui-icon { background: url(spinner_bar.gif) no-repeat 0 0; } + +#navmenu { + position: absolute; + top: 10px; + left: 10px; + width: 50px; + z-index: 2147483647; /* max, see http://www.puidokas.com/max-z-index/ */ +} + +.code .c { color: #999988; font-style: italic } /* Comment */ +.code .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +.code .k { font-weight: bold } /* Keyword */ +.code .o { font-weight: bold } /* Operator */ +.code .cm { color: #999988; font-style: italic } /* Comment.Multiline */ +.code .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ +.code .c1 { color: #999988; font-style: italic } /* Comment.Single */ +.code .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ +.code .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ +.code .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ +.code .ge { font-style: italic } /* Generic.Emph */ +.code .gr { color: #aa0000 } /* Generic.Error */ +.code .gh { color: #999999 } /* Generic.Heading */ +.code .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ +.code .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ +.code .go { color: #888888 } /* Generic.Output */ +.code .gp { color: #555555 } /* Generic.Prompt */ +.code .gs { font-weight: bold } /* Generic.Strong */ +.code .gu { color: #aaaaaa } /* Generic.Subheading */ +.code .gt { color: #aa0000 } /* Generic.Traceback */ +.code .kc { font-weight: bold } /* Keyword.Constant */ +.code .kd { font-weight: bold } /* Keyword.Declaration */ +.code .kp { font-weight: bold } /* Keyword.Pseudo */ +.code .kr { font-weight: bold } /* Keyword.Reserved */ +.code .kt { color: #445588; font-weight: bold } /* Keyword.Type */ +.code .m { color: #009999 } /* Literal.Number */ +.code .s { color: #d14 } /* Literal.String */ +.code .na { color: #008080 } /* Name.Attribute */ +.code .nb { color: #0086B3 } /* Name.Builtin */ +.code .nc { color: #445588; font-weight: bold } /* Name.Class */ +.code .no { color: #008080 } /* Name.Constant */ +.code .ni { color: #800080 } /* Name.Entity */ +.code .ne { color: #990000; font-weight: bold } /* Name.Exception */ +.code .nf { color: #990000; font-weight: bold } /* Name.Function */ +.code .nn { color: #555555 } /* Name.Namespace */ +.code .nt { color: #000080 } /* Name.Tag */ +.code .nv { color: #008080 } /* Name.Variable */ +.code .ow { font-weight: bold } /* Operator.Word */ +.code .w { color: #bbbbbb } /* Text.Whitespace */ +.code .mf { color: #009999 } /* Literal.Number.Float */ +.code .mh { color: #009999 } /* Literal.Number.Hex */ +.code .mi { color: #009999 } /* Literal.Number.Integer */ +.code .mo { color: #009999 } /* Literal.Number.Oct */ +.code .sb { color: #d14 } /* Literal.String.Backtick */ +.code .sc { color: #d14 } /* Literal.String.Char */ +.code .sd { color: #d14 } /* Literal.String.Doc */ +.code .s2 { color: #d14 } /* Literal.String.Double */ +.code .se { color: #d14 } /* Literal.String.Escape */ +.code .sh { color: #d14 } /* Literal.String.Heredoc */ +.code .si { color: #d14 } /* Literal.String.Interpol */ +.code .sx { color: #d14 } /* Literal.String.Other */ +.code .sr { color: #009926 } /* Literal.String.Regex */ +.code .s1 { color: #d14 } /* Literal.String.Single */ +.code .ss { color: #990073 } /* Literal.String.Symbol */ +.code .bp { color: #999999 } /* Name.Builtin.Pseudo */ +.code .vc { color: #008080 } /* Name.Variable.Class */ +.code .vg { color: #008080 } /* Name.Variable.Global */ +.code .vi { color: #008080 } /* Name.Variable.Instance */ +.code .il { color: #009999 } /* Literal.Number.Integer.Long */ + +.results { + background-color:#002200; + color:#00AA00; + font-size:2em; + border:2px solid black; + position: fixed; + top:0px; + width:100%; + padding:15px; + margin:0px; + font-family: monospace; + z-index: 2147483647; /* max, see http://www.puidokas.com/max-z-index/ */ +} + +.executing { + color:#0000FF !important; + background-color: yellow; +} + +#tips, #preshow_timer { + display:inline; + background-color:#000; + color:#fff; + font-size:3em; + border:2px solid black; + position: fixed; + padding:25px; + margin:0px; + z-index: 2147483647; /* max, see http://www.puidokas.com/max-z-index/ */ +} + +#tips { + top: 0px; + right: 0px; + text-align:right; +} + +#preshow_timer { + bottom: 0px; +} + +/** Print **/ +@media print { + body { + font-size: 70%; + } + + #preso, .slide { + border: 1px solid #999; + } + + .slide .center { + width: 600px; + height: 600px; + display: table-cell; + text-align: center; + vertical-align: middle; + } + + #preso, .slide { + background: #fff; + width: 600px; + height: 600px; + margin-left:auto; + margin-right:auto; + overflow:hidden; + } + + #footer { + background: #eee; + padding: 2px; + width: 590px; + height: 20 px; + margin-left:auto; + margin-right:auto; + } + + pre, code { + font-family: Monaco, monospace; + } +} diff --git a/static/css/spinner_bar.gif b/static/css/spinner_bar.gif new file mode 100644 index 0000000..656ae30 Binary files /dev/null and b/static/css/spinner_bar.gif differ diff --git a/static/css/theme/images/ui-bg_diagonals-small_100_f0efea_40x40.png b/static/css/theme/images/ui-bg_diagonals-small_100_f0efea_40x40.png new file mode 100644 index 0000000..5b66315 Binary files /dev/null and b/static/css/theme/images/ui-bg_diagonals-small_100_f0efea_40x40.png differ diff --git a/static/css/theme/images/ui-bg_flat_35_f0f0f0_40x100.png b/static/css/theme/images/ui-bg_flat_35_f0f0f0_40x100.png new file mode 100644 index 0000000..034cd0d Binary files /dev/null and b/static/css/theme/images/ui-bg_flat_35_f0f0f0_40x100.png differ diff --git a/static/css/theme/images/ui-bg_glass_55_fcf0ba_1x400.png b/static/css/theme/images/ui-bg_glass_55_fcf0ba_1x400.png new file mode 100644 index 0000000..a95fa33 Binary files /dev/null and b/static/css/theme/images/ui-bg_glass_55_fcf0ba_1x400.png differ diff --git a/static/css/theme/images/ui-bg_glow-ball_25_2e2e28_600x600.png b/static/css/theme/images/ui-bg_glow-ball_25_2e2e28_600x600.png new file mode 100644 index 0000000..4fca482 Binary files /dev/null and b/static/css/theme/images/ui-bg_glow-ball_25_2e2e28_600x600.png differ diff --git a/static/css/theme/images/ui-bg_highlight-soft_100_f0efea_1x100.png b/static/css/theme/images/ui-bg_highlight-soft_100_f0efea_1x100.png new file mode 100644 index 0000000..d6f3c7c Binary files /dev/null and b/static/css/theme/images/ui-bg_highlight-soft_100_f0efea_1x100.png differ diff --git a/static/css/theme/images/ui-bg_highlight-soft_25_327E04_1x100.png b/static/css/theme/images/ui-bg_highlight-soft_25_327E04_1x100.png new file mode 100644 index 0000000..a0810e3 Binary files /dev/null and b/static/css/theme/images/ui-bg_highlight-soft_25_327E04_1x100.png differ diff --git a/static/css/theme/images/ui-bg_highlight-soft_25_5A9D1A_1x100.png b/static/css/theme/images/ui-bg_highlight-soft_25_5A9D1A_1x100.png new file mode 100644 index 0000000..869db19 Binary files /dev/null and b/static/css/theme/images/ui-bg_highlight-soft_25_5A9D1A_1x100.png differ diff --git a/static/css/theme/images/ui-bg_highlight-soft_95_ffedad_1x100.png b/static/css/theme/images/ui-bg_highlight-soft_95_ffedad_1x100.png new file mode 100644 index 0000000..12686a5 Binary files /dev/null and b/static/css/theme/images/ui-bg_highlight-soft_95_ffedad_1x100.png differ diff --git a/static/css/theme/images/ui-bg_inset-soft_22_3b3b35_1x100.png b/static/css/theme/images/ui-bg_inset-soft_22_3b3b35_1x100.png new file mode 100644 index 0000000..063d394 Binary files /dev/null and b/static/css/theme/images/ui-bg_inset-soft_22_3b3b35_1x100.png differ diff --git a/static/css/theme/images/ui-icons_808080_256x240.png b/static/css/theme/images/ui-icons_808080_256x240.png new file mode 100644 index 0000000..e36d0fa Binary files /dev/null and b/static/css/theme/images/ui-icons_808080_256x240.png differ diff --git a/static/css/theme/images/ui-icons_8DC262_256x240.png b/static/css/theme/images/ui-icons_8DC262_256x240.png new file mode 100644 index 0000000..34cbac8 Binary files /dev/null and b/static/css/theme/images/ui-icons_8DC262_256x240.png differ diff --git a/static/css/theme/images/ui-icons_cd0a0a_256x240.png b/static/css/theme/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 0000000..2db88b7 Binary files /dev/null and b/static/css/theme/images/ui-icons_cd0a0a_256x240.png differ diff --git a/static/css/theme/images/ui-icons_e7e6e4_256x240.png b/static/css/theme/images/ui-icons_e7e6e4_256x240.png new file mode 100644 index 0000000..e7495a6 Binary files /dev/null and b/static/css/theme/images/ui-icons_e7e6e4_256x240.png differ diff --git a/static/css/theme/images/ui-icons_eeeeee_256x240.png b/static/css/theme/images/ui-icons_eeeeee_256x240.png new file mode 100644 index 0000000..4ab0247 Binary files /dev/null and b/static/css/theme/images/ui-icons_eeeeee_256x240.png differ diff --git a/static/css/theme/images/ui-icons_ffffff_256x240.png b/static/css/theme/images/ui-icons_ffffff_256x240.png new file mode 100644 index 0000000..746e6fa Binary files /dev/null and b/static/css/theme/images/ui-icons_ffffff_256x240.png differ diff --git a/static/css/theme/ui.accordion.css b/static/css/theme/ui.accordion.css new file mode 100644 index 0000000..c84ad4e --- /dev/null +++ b/static/css/theme/ui.accordion.css @@ -0,0 +1,9 @@ +/* Accordion +----------------------------------*/ +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion li {display: inline;} +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; } +.ui-accordion .ui-accordion-content-active { display: block; } \ No newline at end of file diff --git a/static/css/theme/ui.all.css b/static/css/theme/ui.all.css new file mode 100644 index 0000000..543e4c3 --- /dev/null +++ b/static/css/theme/ui.all.css @@ -0,0 +1,2 @@ +@import "ui.base.css"; +@import "ui.theme.css"; diff --git a/static/css/theme/ui.base.css b/static/css/theme/ui.base.css new file mode 100644 index 0000000..dadf378 --- /dev/null +++ b/static/css/theme/ui.base.css @@ -0,0 +1,9 @@ +@import url("ui.core.css"); + +@import url("ui.accordion.css"); +@import url("ui.datepicker.css"); +@import url("ui.dialog.css"); +@import url("ui.progressbar.css"); +@import url("ui.resizable.css"); +@import url("ui.slider.css"); +@import url("ui.tabs.css"); diff --git a/static/css/theme/ui.core.css b/static/css/theme/ui.core.css new file mode 100644 index 0000000..d832ad7 --- /dev/null +++ b/static/css/theme/ui.core.css @@ -0,0 +1,37 @@ +/* +* jQuery UI CSS Framework +* Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +*/ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } \ No newline at end of file diff --git a/static/css/theme/ui.datepicker.css b/static/css/theme/ui.datepicker.css new file mode 100644 index 0000000..92986c9 --- /dev/null +++ b/static/css/theme/ui.datepicker.css @@ -0,0 +1,62 @@ +/* Datepicker +----------------------------------*/ +.ui-datepicker { width: 17em; padding: .2em .2em 0; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { float:left; font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker .ui-datepicker-title select.ui-datepicker-year { float: right; } +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:left; width:100%; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +} \ No newline at end of file diff --git a/static/css/theme/ui.dialog.css b/static/css/theme/ui.dialog.css new file mode 100644 index 0000000..f10f409 --- /dev/null +++ b/static/css/theme/ui.dialog.css @@ -0,0 +1,13 @@ +/* Dialog +----------------------------------*/ +.ui-dialog { position: relative; padding: .2em; width: 300px; } +.ui-dialog .ui-dialog-titlebar { padding: .5em .3em .3em 1em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 0 .2em; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; } +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } \ No newline at end of file diff --git a/static/css/theme/ui.progressbar.css b/static/css/theme/ui.progressbar.css new file mode 100644 index 0000000..bc0939e --- /dev/null +++ b/static/css/theme/ui.progressbar.css @@ -0,0 +1,4 @@ +/* Progressbar +----------------------------------*/ +.ui-progressbar { height:2em; text-align: left; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file diff --git a/static/css/theme/ui.resizable.css b/static/css/theme/ui.resizable.css new file mode 100644 index 0000000..44efeb2 --- /dev/null +++ b/static/css/theme/ui.resizable.css @@ -0,0 +1,13 @@ +/* Resizable +----------------------------------*/ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0px; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0px; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0px; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0px; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;} \ No newline at end of file diff --git a/static/css/theme/ui.slider.css b/static/css/theme/ui.slider.css new file mode 100644 index 0000000..0792a48 --- /dev/null +++ b/static/css/theme/ui.slider.css @@ -0,0 +1,17 @@ +/* Slider +----------------------------------*/ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: 1%; display: block; border: 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; } \ No newline at end of file diff --git a/static/css/theme/ui.tabs.css b/static/css/theme/ui.tabs.css new file mode 100644 index 0000000..70ed3ef --- /dev/null +++ b/static/css/theme/ui.tabs.css @@ -0,0 +1,9 @@ +/* Tabs +----------------------------------*/ +.ui-tabs {padding: .2em;} +.ui-tabs .ui-tabs-nav { padding: .2em .2em 0 .2em; position: relative; } +.ui-tabs .ui-tabs-nav li { float: left; border-bottom: 0 !important; margin: 0 .2em -1px 0; padding: 0; list-style: none; } +.ui-tabs .ui-tabs-nav li a { display:block; text-decoration: none; padding: .5em 1em; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { padding-bottom: .1em; border-bottom: 0; } +.ui-tabs .ui-tabs-panel { padding: 1em 1.4em; display: block; border: 0; background: none; } +.ui-tabs .ui-tabs-hide { display: none !important; } \ No newline at end of file diff --git a/static/css/theme/ui.theme.css b/static/css/theme/ui.theme.css new file mode 100644 index 0000000..9dcb2bd --- /dev/null +++ b/static/css/theme/ui.theme.css @@ -0,0 +1,245 @@ + + +/* +* jQuery UI CSS Framework +* Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +* To view and modify this theme, visit http://ui.jquery.com/themeroller/?ffDefault=segoe%20ui,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=3b3b35&bgTextureHeader=05_inset_soft.png&bgImgOpacityHeader=22&borderColorHeader=59584f&fcHeader=ffffff&iconColorHeader=e7e6e4&bgColorContent=f0efea&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=808080&bgColorDefault=327E04&bgTextureDefault=03_highlight_soft.png&bgImgOpacityDefault=25&borderColorDefault=327E04&fcDefault=ffffff&iconColorDefault=eeeeee&bgColorHover=5A9D1A&bgTextureHover=03_highlight_soft.png&bgImgOpacityHover=25&borderColorHover=327E04&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=f0efea&bgTextureActive=07_diagonals_small.png&bgImgOpacityActive=100&borderColorActive=c4c5c3&fcActive=403D38&iconColorActive=8DC262&bgColorHighlight=fcf0ba&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=e8e1b5&fcHighlight=363636&iconColorHighlight=8DC262&bgColorError=ffedad&bgTextureError=03_highlight_soft.png&bgImgOpacityError=95&borderColorError=e3a345&fcError=cd5c0a&iconColorError=cd0a0a&bgColorOverlay=2e2e28&bgTextureOverlay=21_glow_ball.png&bgImgOpacityOverlay=25&opacityOverlay=65&bgColorShadow=f0f0f0&bgTextureShadow=01_flat.png&bgImgOpacityShadow=35&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px +*/ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: segoe ui, Arial, sans-serif; font-size: 1.1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: segoe ui, Arial, sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #aaaaaa; background: #f0efea url(images/ui-bg_highlight-soft_100_f0efea_1x100.png) 50% top repeat-x; color: #222222; } +.ui-widget-content a { color: #222222; } +.ui-widget-header { border: 1px solid #59584f; background: #3b3b35 url(images/ui-bg_inset-soft_22_3b3b35_1x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } +.ui-widget-header a { color: #ffffff; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default { border: 1px solid #327E04; background: #327E04 url(images/ui-bg_highlight-soft_25_327E04_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #ffffff; outline: none; } +.ui-state-default a { color: #ffffff; text-decoration: none; outline: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus { border: 1px solid #327E04; background: #5A9D1A url(images/ui-bg_highlight-soft_25_5A9D1A_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #ffffff; outline: none; } +.ui-state-hover a { color: #ffffff; text-decoration: none; outline: none; } +.ui-state-active, .ui-widget-content .ui-state-active { border: 1px solid #c4c5c3; background: #f0efea url(images/ui-bg_diagonals-small_100_f0efea_40x40.png) 50% 50% repeat; font-weight: bold; color: #403D38; outline: none; } +.ui-state-active a { color: #403D38; outline: none; text-decoration: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight {border: 1px solid #e8e1b5; background: #fcf0ba url(images/ui-bg_glass_55_fcf0ba_1x400.png) 50% 50% repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error {border: 1px solid #e3a345; background: #ffedad url(images/ui-bg_highlight-soft_95_ffedad_1x100.png) 50% top repeat-x; color: #cd5c0a; } +.ui-state-error a, .ui-widget-content .ui-state-error a { color: #cd5c0a; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text { color: #cd5c0a; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_808080_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_808080_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_e7e6e4_256x240.png); } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_eeeeee_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_8DC262_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_8DC262_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; } +.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; } +.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; } +.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; } +.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; } +.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; } +.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; } + +/* Overlays */ +.ui-widget-overlay { background: #2e2e28 url(images/ui-bg_glow-ball_25_2e2e28_600x600.png) 50% 35% repeat-x; opacity: .65;filter:Alpha(Opacity=65); } +.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #f0f0f0 url(images/ui-bg_flat_35_f0f0f0_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; } \ No newline at end of file diff --git a/static/index.html b/static/index.html new file mode 100644 index 0000000..d47e12d --- /dev/null +++ b/static/index.html @@ -0,0 +1,198 @@ + + + + + + Guard & the Modern Rails App in 5 Minutes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +slides + + +
+ + + + + + + + + +
space, →next slide
previous slide
ddebug mode
## <ret>go to slide #
ctable of contents (vi)
ftoggle footer
rreload slides
ztoggle help (this)
+
+ +
+ + +
+ +
loading presentation...
+ + + + + + diff --git a/static/js/core.js b/static/js/core.js new file mode 100644 index 0000000..6374470 --- /dev/null +++ b/static/js/core.js @@ -0,0 +1,79 @@ +// CORE module, abstracts environment-specifics +var CORE = function(){ + + /* + * blatantly ripped off from Douglas Crockford + */ + var modifyLanguage = function(){ + Function.prototype.method = function (name, func) { + if (!this.prototype[name]){ + this.prototype[name] = func; + return this; + } + }; + Function.method('inherits', function(Parent){ + this.prototype = new Parent(); + return this; + }); + Array.method('each', function(f, index){ + for (var i=0; i markup +Version: 3.0, 03.31.2009 + +By: Maggie Costello Wachs (maggie@filamentgroup.com) and Scott Jehl (scott@filamentgroup.com) + http://www.filamentgroup.com + * reference articles: http://www.filamentgroup.com/lab/jquery_ipod_style_drilldown_menu/ + +Copyright (c) 2009 Filament Group +Dual licensed under the MIT (filamentgroup.com/examples/mit-license.txt) and GPL (filamentgroup.com/examples/gpl-license.txt) licenses. +--------------------------------------------------------------------*/ + + +var allUIMenus = []; + +$.fn.menu = function(options){ + var caller = this; + var options = options; + var m = new Menu(caller, options); + allUIMenus.push(m); + + $(this) + .mousedown(function(){ + if (!m.menuOpen) { m.showLoading(); }; + }) + .click(function(){ + if (m.menuOpen == false) { m.showMenu(); } + else { m.kill(); }; + return false; + }); +}; + +function Menu(caller, options){ + var menu = this; + var caller = $(caller); + var container = $('
'+options.content+'
'); + + this.menuOpen = false; + this.menuExists = false; + + var options = jQuery.extend({ + content: null, + width: 180, // width of menu container, must be set or passed in to calculate widths of child menus + maxHeight: 180, // max height of menu (if a drilldown: height does not include breadcrumb) + positionOpts: { + posX: 'left', + posY: 'bottom', + offsetX: 0, + offsetY: 0, + directionH: 'right', + directionV: 'down', + detectH: true, // do horizontal collision detection + detectV: true, // do vertical collision detection + linkToFront: false + }, + showSpeed: 200, // show/hide speed in milliseconds + callerOnState: 'ui-state-active', // class to change the appearance of the link/button when the menu is showing + loadingState: 'ui-state-loading', // class added to the link/button while the menu is created + linkHover: 'ui-state-hover', // class for menu option hover state + linkHoverSecondary: 'li-hover', // alternate class, may be used for multi-level menus + // ----- multi-level menu defaults ----- + crossSpeed: 200, // cross-fade speed for multi-level menus + crumbDefaultText: 'Choose an option:', + backLink: true, // in the ipod-style menu: instead of breadcrumbs, show only a 'back' link + backLinkText: 'Back', + flyOut: false, // multi-level menus are ipod-style by default; this parameter overrides to make a flyout instead + flyOutOnState: 'ui-state-default', + nextMenuLink: 'ui-icon-triangle-1-e', // class to style the link (specifically, a span within the link) used in the multi-level menu to show the next level + topLinkText: 'All', + nextCrumbLink: 'ui-icon-carat-1-e' + }, options); + + var killAllMenus = function(){ + $.each(allUIMenus, function(i){ + if (allUIMenus[i].menuOpen) { allUIMenus[i].kill(); }; + }); + }; + + this.kill = function(){ + caller + .removeClass(options.loadingState) + .removeClass('fg-menu-open') + .removeClass(options.callerOnState); + container.find('li').removeClass(options.linkHoverSecondary).find('a').removeClass(options.linkHover); + if (options.flyOutOnState) { container.find('li a').removeClass(options.flyOutOnState); }; + if (options.callerOnState) { caller.removeClass(options.callerOnState); }; + if (container.is('.fg-menu-ipod')) { menu.resetDrilldownMenu(); }; + if (container.is('.fg-menu-flyout')) { menu.resetFlyoutMenu(); }; + container.parent().hide(); + menu.menuOpen = false; + $(document).unbind('click', killAllMenus); + $(document).unbind('keydown'); + }; + + this.showLoading = function(){ + caller.addClass(options.loadingState); + }; + + this.showMenu = function(){ + killAllMenus(); + if (!menu.menuExists) { menu.create() }; + caller + .addClass('fg-menu-open') + .addClass(options.callerOnState); + container.parent().show().click(function(){ menu.kill(); return false; }); + container.hide().slideDown(options.showSpeed).find('.fg-menu:eq(0)'); + menu.menuOpen = true; + caller.removeClass(options.loadingState); + $(document).click(killAllMenus); + + // assign key events + $(document).keydown(function(event){ + var e; + if (event.which !="") { e = event.which; } + else if (event.charCode != "") { e = event.charCode; } + else if (event.keyCode != "") { e = event.keyCode; } + + var menuType = ($(event.target).parents('div').is('.fg-menu-flyout')) ? 'flyout' : 'ipod' ; + + // vi bindings + switch(e) { + case 72: // left arrow + if (menuType == 'flyout') { + $(event.target).trigger('mouseout'); + if ($('.'+options.flyOutOnState).size() > 0) { $('.'+options.flyOutOnState).trigger('mouseover'); }; + }; + + if (menuType == 'ipod') { + $(event.target).trigger('mouseout'); + if ($('.fg-menu-footer').find('a').size() > 0) { $('.fg-menu-footer').find('a').trigger('click'); }; + if ($('.fg-menu-header').find('a').size() > 0) { $('.fg-menu-current-crumb').prev().find('a').trigger('click'); }; + if ($('.fg-menu-current').prev().is('.fg-menu-indicator')) { + $('.fg-menu-current').prev().trigger('mouseover'); + }; + }; + return false; + break; + + case 75: // up arrow + if ($(event.target).is('.' + options.linkHover)) { + var prevLink = $(event.target).parent().prev().find('a:eq(0)'); + if (prevLink.size() > 0) { + $(event.target).trigger('mouseout'); + prevLink.trigger('mouseover'); + }; + } + else { container.find('a:eq(0)').trigger('mouseover'); } + return false; + break; + + case 76: // right arrow + if ($(event.target).is('.fg-menu-indicator')) { + if (menuType == 'flyout') { + $(event.target).next().find('a:eq(0)').trigger('mouseover'); + } + else if (menuType == 'ipod') { + $(event.target).trigger('click'); + setTimeout(function(){ + $(event.target).next().find('a:eq(0)').trigger('mouseover'); + }, options.crossSpeed); + }; + }; + return false; + break; + + case 74: // down arrow + if ($(event.target).is('.' + options.linkHover)) { + var nextLink = $(event.target).parent().next().find('a:eq(0)'); + if (nextLink.size() > 0) { + $(event.target).trigger('mouseout'); + nextLink.trigger('mouseover'); + }; + } + else { container.find('a:eq(0)').trigger('mouseover'); } + return false; + break; + + case 27: // escape + killAllMenus(); + break; + + case 13: // enter + if ($(event.target).is('.fg-menu-indicator') && menuType == 'ipod') { + $(event.target).trigger('click'); + setTimeout(function(){ + $(event.target).next().find('a:eq(0)').trigger('mouseover'); + }, options.crossSpeed); + }; + break; + }; + }); + }; + + this.create = function(){ + container.css({ width: options.width }).appendTo('body').find('ul:first').not('.fg-menu-breadcrumb').addClass('fg-menu'); + container.find('ul, li a').addClass('ui-corner-all'); + + // aria roles & attributes + container.find('ul').attr('role', 'menu').eq(0).attr('aria-activedescendant','active-menuitem').attr('aria-labelledby', caller.attr('id')); + container.find('li').attr('role', 'menuitem'); + container.find('li:has(ul)').attr('aria-haspopup', 'true').find('ul').attr('aria-expanded', 'false'); + container.find('a').attr('tabindex', '-1'); + + // when there are multiple levels of hierarchy, create flyout or drilldown menu + if (container.find('ul').size() > 1) { + if (options.flyOut) { menu.flyout(container, options); } + else { menu.drilldown(container, options); } + } + else { + container.find('a').click(function(){ + menu.chooseItem(this); + return false; + }); + }; + + if (options.linkHover) { + var allLinks = container.find('.fg-menu li a'); + allLinks.hover( + function(){ + var menuitem = $(this); + $('.'+options.linkHover).removeClass(options.linkHover).blur().parent().removeAttr('id'); + $(this).addClass(options.linkHover).focus().parent().attr('id','active-menuitem'); + }, + function(){ + $(this).removeClass(options.linkHover).blur().parent().removeAttr('id'); + } + ); + }; + + if (options.linkHoverSecondary) { + container.find('.fg-menu li').hover( + function(){ + $(this).siblings('li').removeClass(options.linkHoverSecondary); + if (options.flyOutOnState) { $(this).siblings('li').find('a').removeClass(options.flyOutOnState); } + $(this).addClass(options.linkHoverSecondary); + }, + function(){ $(this).removeClass(options.linkHoverSecondary); } + ); + }; + + menu.setPosition(container, caller, options); + menu.menuExists = true; + }; + + this.chooseItem = function(item){ + menu.kill(); + gotoSlide($(item).attr('rel')); + $('#navmenu').hide(); + }; +}; + +Menu.prototype.flyout = function(container, options) { + var menu = this; + + this.resetFlyoutMenu = function(){ + var allLists = container.find('ul ul'); + allLists.removeClass('ui-widget-content').hide(); + }; + + container.addClass('fg-menu-flyout').find('li:has(ul)').each(function(){ + var linkWidth = container.width(); + var showTimer, hideTimer; + var allSubLists = $(this).find('ul'); + + allSubLists.css({ left: linkWidth, width: linkWidth }).hide(); + + $(this).find('a:eq(0)').addClass('fg-menu-indicator').html('' + $(this).find('a:eq(0)').text() + '').hover( + function(){ + clearTimeout(hideTimer); + var subList = $(this).next(); + if (!fitVertical(subList, $(this).offset().top)) { subList.css({ top: 'auto', bottom: 0 }); }; + if (!fitHorizontal(subList, $(this).offset().left + 100)) { subList.css({ left: 'auto', right: linkWidth, 'z-index': 999 }); }; + showTimer = setTimeout(function(){ + subList.addClass('ui-widget-content').show(options.showSpeed).attr('aria-expanded', 'true'); + }, 300); + }, + function(){ + clearTimeout(showTimer); + var subList = $(this).next(); + hideTimer = setTimeout(function(){ + subList.removeClass('ui-widget-content').hide(options.showSpeed).attr('aria-expanded', 'false'); + }, 400); + } + ); + + $(this).find('ul a').hover( + function(){ + clearTimeout(hideTimer); + if ($(this).parents('ul').prev().is('a.fg-menu-indicator')) { + $(this).parents('ul').prev().addClass(options.flyOutOnState); + } + }, + function(){ + hideTimer = setTimeout(function(){ + allSubLists.hide(options.showSpeed); + container.find(options.flyOutOnState).removeClass(options.flyOutOnState); + }, 500); + } + ); + }); + + container.find('a').click(function(){ + menu.chooseItem(this); + return false; + }); +}; + + +Menu.prototype.drilldown = function(container, options) { + var menu = this; + var topList = container.find('.fg-menu'); + var breadcrumb = $(''); + var crumbDefaultHeader = $('
  • '+options.crumbDefaultText+'
  • '); + var firstCrumbText = (options.backLink) ? options.backLinkText : options.topLinkText; + var firstCrumbClass = (options.backLink) ? 'fg-menu-prev-list' : 'fg-menu-all-lists'; + var firstCrumbLinkClass = (options.backLink) ? 'ui-state-default ui-corner-all' : ''; + var firstCrumbIcon = (options.backLink) ? '' : ''; + var firstCrumb = $('
  • '+firstCrumbIcon+firstCrumbText+'
  • '); + + container.addClass('fg-menu-ipod'); + + if (options.backLink) { breadcrumb.addClass('fg-menu-footer').appendTo(container).hide(); } + else { breadcrumb.addClass('fg-menu-header').prependTo(container); }; + breadcrumb.append(crumbDefaultHeader); + + var checkMenuHeight = function(el){ + if (el.height() > options.maxHeight) { el.addClass('fg-menu-scroll') }; + el.css({ height: options.maxHeight }); + }; + + var resetChildMenu = function(el){ el.removeClass('fg-menu-scroll').removeClass('fg-menu-current').height('auto'); }; + + this.resetDrilldownMenu = function(){ + $('.fg-menu-current').removeClass('fg-menu-current'); + topList.animate({ left: 0 }, options.crossSpeed, function(){ + $(this).find('ul').each(function(){ + $(this).hide(); + resetChildMenu($(this)); + }); + topList.addClass('fg-menu-current'); + }); + $('.fg-menu-all-lists').find('span').remove(); + breadcrumb.empty().append(crumbDefaultHeader); + $('.fg-menu-footer').empty().hide(); + checkMenuHeight(topList); + }; + + topList + .addClass('fg-menu-content fg-menu-current ui-widget-content ui-helper-clearfix') + .css({ width: container.width() }) + .find('ul') + .css({ width: container.width(), left: container.width() }) + .addClass('ui-widget-content') + .hide(); + checkMenuHeight(topList); + + topList.find('a').each(function(){ + // if the link opens a child menu: + if ($(this).next().is('ul')) { + $(this) + .addClass('fg-menu-indicator') + .each(function(){ $(this).html('' + $(this).text() + ''); }) + .click(function(){ // ----- show the next menu + var nextList = $(this).next(); + var parentUl = $(this).parents('ul:eq(0)'); + var parentLeft = (parentUl.is('.fg-menu-content')) ? 0 : parseFloat(topList.css('left')); + var nextLeftVal = Math.round(parentLeft - parseFloat(container.width())); + var footer = $('.fg-menu-footer'); + + // show next menu + resetChildMenu(parentUl); + checkMenuHeight(nextList); + topList.animate({ left: nextLeftVal }, options.crossSpeed); + nextList.show().addClass('fg-menu-current').attr('aria-expanded', 'true'); + + var setPrevMenu = function(backlink){ + var b = backlink; + var c = $('.fg-menu-current'); + var prevList = c.parents('ul:eq(0)'); + c.hide().attr('aria-expanded', 'false'); + resetChildMenu(c); + checkMenuHeight(prevList); + prevList.addClass('fg-menu-current').attr('aria-expanded', 'true'); + if (prevList.hasClass('fg-menu-content')) { b.remove(); footer.hide(); }; + }; + + // initialize "back" link + if (options.backLink) { + if (footer.find('a').size() == 0) { + footer.show(); + $(' Back') + .appendTo(footer) + .click(function(){ // ----- show the previous menu + var b = $(this); + var prevLeftVal = parseFloat(topList.css('left')) + container.width(); + topList.animate({ left: prevLeftVal }, options.crossSpeed, function(){ + setPrevMenu(b); + }); + return false; + }); + } + } + // or initialize top breadcrumb + else { + if (breadcrumb.find('li').size() == 1){ + breadcrumb.empty().append(firstCrumb); + firstCrumb.find('a').click(function(){ + menu.resetDrilldownMenu(); + return false; + }); + } + $('.fg-menu-current-crumb').removeClass('fg-menu-current-crumb'); + var crumbText = $(this).find('span:eq(0)').text(); + var newCrumb = $('
  • '+crumbText+'
  • '); + newCrumb + .appendTo(breadcrumb) + .find('a').click(function(){ + if ($(this).parent().is('.fg-menu-current-crumb')){ + menu.chooseItem(this); + } + else { + var newLeftVal = - ($('.fg-menu-current').parents('ul').size() - 1) * 180; + topList.animate({ left: newLeftVal }, options.crossSpeed, function(){ + setPrevMenu(); + }); + + // make this the current crumb, delete all breadcrumbs after this one, and navigate to the relevant menu + $(this).parent().addClass('fg-menu-current-crumb').find('span').remove(); + $(this).parent().nextAll().remove(); + }; + return false; + }); + newCrumb.prev().append(' '); + }; + return false; + }); + } + // if the link is a leaf node (doesn't open a child menu) + else { + $(this).click(function(){ + menu.chooseItem(this); + return false; + }); + }; + }); +}; + + +/* Menu.prototype.setPosition parameters (defaults noted with *): + referrer = the link (or other element) used to show the overlaid object + settings = can override the defaults: + - posX/Y: where the top left corner of the object should be positioned in relation to its referrer. + X: left*, center, right + Y: top, center, bottom* + - offsetX/Y: the number of pixels to be offset from the x or y position. Can be a positive or negative number. + - directionH/V: where the entire menu should appear in relation to its referrer. + Horizontal: left*, right + Vertical: up, down* + - detectH/V: detect the viewport horizontally / vertically + - linkToFront: copy the menu link and place it on top of the menu (visual effect to make it look like it overlaps the object) */ + +Menu.prototype.setPosition = function(widget, caller, options) { + var el = widget; + var referrer = caller; + var dims = { + refX: referrer.offset().left, + refY: referrer.offset().top, + refW: referrer.getTotalWidth(), + refH: referrer.getTotalHeight() + }; + var options = options; + var xVal, yVal; + + var helper = $('
    '); + helper.css({ position: 'absolute', left: dims.refX, top: dims.refY, width: dims.refW, height: dims.refH }); + el.wrap(helper); + + // get X pos + switch(options.positionOpts.posX) { + case 'left': xVal = 0; + break; + case 'center': xVal = dims.refW / 2; + break; + case 'right': xVal = dims.refW; + break; + }; + + // get Y pos + switch(options.positionOpts.posY) { + case 'top': yVal = 0; + break; + case 'center': yVal = dims.refH / 2; + break; + case 'bottom': yVal = dims.refH; + break; + }; + + // add the offsets (zero by default) + xVal += options.positionOpts.offsetX; + yVal += options.positionOpts.offsetY; + + // position the object vertically + if (options.positionOpts.directionV == 'up') { + el.css({ top: 'auto', bottom: yVal }); + if (options.positionOpts.detectV && !fitVertical(el)) { + el.css({ bottom: 'auto', top: yVal }); + } + } + else { + el.css({ bottom: 'auto', top: yVal }); + if (options.positionOpts.detectV && !fitVertical(el)) { + el.css({ top: 'auto', bottom: yVal }); + } + }; + + // and horizontally + if (options.positionOpts.directionH == 'left') { + el.css({ left: 'auto', right: xVal }); + if (options.positionOpts.detectH && !fitHorizontal(el)) { + el.css({ right: 'auto', left: xVal }); + } + } + else { + el.css({ right: 'auto', left: xVal }); + if (options.positionOpts.detectH && !fitHorizontal(el)) { + el.css({ left: 'auto', right: xVal }); + } + }; + + // if specified, clone the referring element and position it so that it appears on top of the menu + if (options.positionOpts.linkToFront) { + referrer.clone().addClass('linkClone').css({ + position: 'absolute', + top: 0, + right: 'auto', + bottom: 'auto', + left: 0, + width: referrer.width(), + height: referrer.height() + }).insertAfter(el); + }; +}; + + +/* Utilities to sort and find viewport dimensions */ + +function sortBigToSmall(a, b) { return b - a; }; + +jQuery.fn.getTotalWidth = function(){ + return $(this).width() + parseInt($(this).css('paddingRight')) + parseInt($(this).css('paddingLeft')) + parseInt($(this).css('borderRightWidth')) + parseInt($(this).css('borderLeftWidth')); +}; + +jQuery.fn.getTotalHeight = function(){ + return $(this).height() + parseInt($(this).css('paddingTop')) + parseInt($(this).css('paddingBottom')) + parseInt($(this).css('borderTopWidth')) + parseInt($(this).css('borderBottomWidth')); +}; + +function getScrollTop(){ + return self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop; +}; + +function getScrollLeft(){ + return self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft; +}; + +function getWindowHeight(){ + var de = document.documentElement; + return self.innerHeight || (de && de.clientHeight) || document.body.clientHeight; +}; + +function getWindowWidth(){ + var de = document.documentElement; + return self.innerWidth || (de && de.clientWidth) || document.body.clientWidth; +}; + +/* Utilities to test whether an element will fit in the viewport + Parameters: + el = element to position, required + leftOffset / topOffset = optional parameter if the offset cannot be calculated (i.e., if the object is in the DOM but is set to display: 'none') */ + +function fitHorizontal(el, leftOffset){ + var leftVal = parseInt(leftOffset) || $(el).offset().left; + return (leftVal + $(el).width() <= getWindowWidth() + getScrollLeft() && leftVal - getScrollLeft() >= 0); +}; + +function fitVertical(el, topOffset){ + var topVal = parseInt(topOffset) || $(el).offset().top; + return (topVal + $(el).height() <= getWindowHeight() + getScrollTop() && topVal - getScrollTop() >= 0); +}; + +/*-------------------------------------------------------------------- + * javascript method: "pxToEm" + * by: + Scott Jehl (scott@filamentgroup.com) + Maggie Wachs (maggie@filamentgroup.com) + http://www.filamentgroup.com + * + * Copyright (c) 2008 Filament Group + * Dual licensed under the MIT (filamentgroup.com/examples/mit-license.txt) and GPL (filamentgroup.com/examples/gpl-license.txt) licenses. + * + * Description: Extends the native Number and String objects with pxToEm method. pxToEm converts a pixel value to ems depending on inherited font size. + * Article: http://www.filamentgroup.com/lab/retaining_scalable_interfaces_with_pixel_to_em_conversion/ + * Demo: http://www.filamentgroup.com/examples/pxToEm/ + * + * Options: + scope: string or jQuery selector for font-size scoping + reverse: Boolean, true reverses the conversion to em-px + * Dependencies: jQuery library + * Usage Example: myPixelValue.pxToEm(); or myPixelValue.pxToEm({'scope':'#navigation', reverse: true}); + * + * Version: 2.0, 08.01.2008 + * Changelog: + * 08.02.2007 initial Version 1.0 + * 08.01.2008 - fixed font-size calculation for IE +--------------------------------------------------------------------*/ + +Number.prototype.pxToEm = String.prototype.pxToEm = function(settings){ + //set defaults + settings = jQuery.extend({ + scope: 'body', + reverse: false + }, settings); + + var pxVal = (this == '') ? 0 : parseFloat(this); + var scopeVal; + var getWindowWidth = function(){ + var de = document.documentElement; + return self.innerWidth || (de && de.clientWidth) || document.body.clientWidth; + }; + + /* When a percentage-based font-size is set on the body, IE returns that percent of the window width as the font-size. + For example, if the body font-size is 62.5% and the window width is 1000px, IE will return 625px as the font-size. + When this happens, we calculate the correct body font-size (%) and multiply it by 16 (the standard browser font size) + to get an accurate em value. */ + + if (settings.scope == 'body' && $.browser.msie && (parseFloat($('body').css('font-size')) / getWindowWidth()).toFixed(1) > 0.0) { + var calcFontSize = function(){ + return (parseFloat($('body').css('font-size'))/getWindowWidth()).toFixed(3) * 16; + }; + scopeVal = calcFontSize(); + } + else { scopeVal = parseFloat(jQuery(settings.scope).css("font-size")); }; + + var result = (settings.reverse == true) ? (pxVal * scopeVal).toFixed(2) + 'px' : (pxVal / scopeVal).toFixed(2) + 'em'; + return result; +}; \ No newline at end of file diff --git a/static/js/jTypeWriter.js b/static/js/jTypeWriter.js new file mode 100644 index 0000000..ac12b0a --- /dev/null +++ b/static/js/jTypeWriter.js @@ -0,0 +1,26 @@ +// jTypeWriter, JQuery plugin +// v 1.1 +// Licensed under GPL licenses. +// Copyright (C) 2008 Nikos "DuMmWiaM" Kontis, info@dummwiam.com +// http://www.DuMmWiaM.com/jTypeWriter +// ---------------------------------------------------------------------------- +// 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: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// 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. +// ---------------------------------------------------------------------------- + +eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(7($){$.u.v=7(b){5 c,8,w,r,x,A;5 d=$.W({},$.u.v.H,b);5 e=d.I*J;5 f=d.K.X();5 g=d.L;5 h=d.M;5 j=d.9;5 k=d.N;5 l=d.O;5 m=(f=="Y")?" ":".";5 n=P Q();5 o=0;y(i=0;io?n[i].6.p:o;t o+=n[i].6.p;$(q[i]).9("")}B();7 B(){c=e/o;8=0;w=r=0;x=(!g)?C(S,c):C(T,c)};7 S(){8++;y(i=0;i=8){4(f=="s"){a.3.9(a.6.U(0,8))}t{a.3.z(a.6[8-1]);4(8=o){D()}};7 T(){$3=n[w];4(f=="s"){$3.3.9($3.6.U(0,++r))}t{$3.3.z($3.6[r++]);4(r<$3.6.p)$3.3.z(m)}4(r>=$3.6.p){w++;r=0}8++;4(8>=o){D()}};7 D(){E(x);4(f!="s"){}4(k){4(l)A=C(V,l*J);t F()}h()};7 F(){y(i=0;i)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, +Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& +(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, +a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== +"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, +function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
    a"; +var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, +parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= +false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= +s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, +applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; +else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, +a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== +w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, +cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= +c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); +a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, +function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); +k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), +C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type= +e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& +f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; +if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", +e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, +"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, +d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, +e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); +t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| +g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, +CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, +g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, +text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, +setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= +h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== +"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, +h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& +q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=""; +if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="

    ";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); +(function(){var g=s.createElement("div");g.innerHTML="
    ";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: +function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= +{},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== +"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", +d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? +a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== +1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"},F={option:[1,""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
    ","
    "];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, +""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); +return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", +""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= +c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? +c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= +function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= +Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, +"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= +a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= +a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== +"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
    ").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, +serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), +function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, +global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& +e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? +"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== +false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= +false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", +c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| +d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); +g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== +1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== +"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; +if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== +"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| +c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; +this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= +this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, +e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
    "; +a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); +c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, +d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- +f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": +"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in +e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); \ No newline at end of file diff --git a/static/js/jquery-print.js b/static/js/jquery-print.js new file mode 100644 index 0000000..09000c2 --- /dev/null +++ b/static/js/jquery-print.js @@ -0,0 +1,109 @@ +(function($) { + + function print_array(obj, opts) { + var result = []; + for (var i = 0; i < Math.min(opts.max_array, obj.length); i++) + result.push($.print(obj[i], $.extend({}, opts, { max_array: 3, max_string: 40 }))); + + if (obj.length > opts.max_array) + result.push((obj.length - opts.max_array) + ' more...'); + if (result.length == 0) return "[]" + return "[ " + result.join(", ") + " ]"; + } + + function print_element(obj) { + if (obj.nodeType == 1) { + var result = []; + var properties = [ 'className', 'id' ]; + var extra = { + 'input': ['type', 'name', 'value'], + 'a': ['href', 'target'], + 'form': ['method', 'action'], + 'script': ['src'], + 'link': ['href'], + 'img': ['src'] + }; + + $.each(properties.concat(extra[obj.tagName.toLowerCase()] || []), function(){ + if (obj[this]) + result.push(' ' + this.replace('className', 'class') + "=" + $.print(obj[this])) + }); + return "<" + obj.tagName.toLowerCase() + + result.join('') + ">"; + } + } + + function print_object(obj, opts) { + var seen = opts.seen || [ obj ]; + + var result = [], key, value; + for (var k in obj) { + if (obj.hasOwnProperty(k) && $.inArray(obj[k], seen) < 0) { + seen.push(obj[k]); + value = $.print(obj[k], $.extend({}, opts, { max_array: 6, max_string: 40, seen: seen })); + } else + value = "..."; + result.push(k + ": " + value); + } + if (result.length == 0) return "{}"; + return "{ " + result.join(", ") + " }"; + } + + function print_string(value, opts) { + var character_substitutions = { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }; + var r = /["\\\x00-\x1f\x7f-\x9f]/g; + + var str = r.test(value) + ? value.replace(r, function (a) { + var c = character_substitutions[a]; + if (c) return c; + c = a.charCodeAt(); + return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16); + }) + : value ; + if (str.length > opts.max_string) + return str.slice(0, opts.max_string + 1) + '..."'; + else + return str; + } + + $.print = function(obj, options) { + var opts = $.extend({}, { max_array: 10, max_string: 100 }, options); + + if (typeof obj == 'undefined') + return "undefined"; + else if (typeof obj == 'boolean') + return obj.toString(); + else if (typeof obj == 'number') + return obj.toString(); + else if (!obj) + return "null"; + else if (typeof obj == 'string') + return print_string(obj, opts); + else if (obj instanceof RegExp) + return obj.toString(); + else if (obj instanceof Array || obj.callee || obj.item) + return print_array(obj, opts); + else if (typeof obj == 'function' || obj instanceof Function) + return obj.toString().match(/^([^)]*\))/)[1]; + else if (obj.nodeType) + return print_element(obj); + else if (obj instanceof jQuery) + return "$(" + $.print(obj.get()) + ")"; + else if (obj instanceof Error) + return print_object(obj, $.extend({}, options, { max_string: 200 })); + else if (obj instanceof Object) + return print_object(obj, opts); + else + return obj.toString().replace(/\n\s*/g, ''); + } + +})(jQuery); \ No newline at end of file diff --git a/static/js/jquery.batchImageLoad.js b/static/js/jquery.batchImageLoad.js new file mode 100644 index 0000000..2d4f3de --- /dev/null +++ b/static/js/jquery.batchImageLoad.js @@ -0,0 +1,56 @@ +/** + * Plugin which is applied on a list of img objects and calls + * the specified callback function, only when all of them are loaded (or errored). + * @author: H. Yankov (hristo.yankov at gmail dot com) + * @version: 1.0.0 (Feb/22/2010) + * http://yankov.us + */ + +(function($) { +$.fn.batchImageLoad = function(options) { + var images = $(this); + var originalTotalImagesCount = images.size(); + var totalImagesCount = originalTotalImagesCount; + var elementsLoaded = 0; + + // Init + $.fn.batchImageLoad.defaults = { + loadingCompleteCallback: null, + imageLoadedCallback: null + } + var opts = $.extend({}, $.fn.batchImageLoad.defaults, options); + + // Start + images.each(function() { + // The image has already been loaded (cached) + if ($(this)[0].complete) { + totalImagesCount--; + if (opts.imageLoadedCallback) opts.imageLoadedCallback(elementsLoaded, originalTotalImagesCount); + // The image is loading, so attach the listener + } else { + $(this).load(function() { + elementsLoaded++; + + if (opts.imageLoadedCallback) opts.imageLoadedCallback(elementsLoaded, originalTotalImagesCount); + + // An image has been loaded + if (elementsLoaded >= totalImagesCount) + if (opts.loadingCompleteCallback) opts.loadingCompleteCallback(); + }); + $(this).error(function() { + elementsLoaded++; + + if (opts.imageLoadedCallback) opts.imageLoadedCallback(elementsLoaded, originalTotalImagesCount); + + // The image has errored + if (elementsLoaded >= totalImagesCount) + if (opts.loadingCompleteCallback) opts.loadingCompleteCallback(); + }); + } + }); + + // There are no unloaded images + if (totalImagesCount <= 0) + if (opts.loadingCompleteCallback) opts.loadingCompleteCallback(); +}; +})(jQuery); \ No newline at end of file diff --git a/static/js/jquery.cookie.js b/static/js/jquery.cookie.js new file mode 100644 index 0000000..6df1fac --- /dev/null +++ b/static/js/jquery.cookie.js @@ -0,0 +1,96 @@ +/** + * Cookie plugin + * + * Copyright (c) 2006 Klaus Hartl (stilbuero.de) + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + */ + +/** + * Create a cookie with the given name and value and other optional parameters. + * + * @example $.cookie('the_cookie', 'the_value'); + * @desc Set the value of a cookie. + * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true }); + * @desc Create a cookie with all available options. + * @example $.cookie('the_cookie', 'the_value'); + * @desc Create a session cookie. + * @example $.cookie('the_cookie', null); + * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain + * used when the cookie was set. + * + * @param String name The name of the cookie. + * @param String value The value of the cookie. + * @param Object options An object literal containing key/value pairs to provide optional cookie attributes. + * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object. + * If a negative value is specified (e.g. a date in the past), the cookie will be deleted. + * If set to null or omitted, the cookie will be a session cookie and will not be retained + * when the the browser exits. + * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie). + * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie). + * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will + * require a secure protocol (like HTTPS). + * @type undefined + * + * @name $.cookie + * @cat Plugins/Cookie + * @author Klaus Hartl/klaus.hartl@stilbuero.de + */ + +/** + * Get the value of a cookie with the given name. + * + * @example $.cookie('the_cookie'); + * @desc Get the value of a cookie. + * + * @param String name The name of the cookie. + * @return The value of the cookie. + * @type String + * + * @name $.cookie + * @cat Plugins/Cookie + * @author Klaus Hartl/klaus.hartl@stilbuero.de + */ +jQuery.cookie = function(name, value, options) { + if (typeof value != 'undefined') { // name and value given, set cookie + options = options || {}; + if (value === null) { + value = ''; + options.expires = -1; + } + var expires = ''; + if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) { + var date; + if (typeof options.expires == 'number') { + date = new Date(); + date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); + } else { + date = options.expires; + } + expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE + } + // CAUTION: Needed to parenthesize options.path and options.domain + // in the following expressions, otherwise they evaluate to undefined + // in the packed version for some reason... + var path = options.path ? '; path=' + (options.path) : ''; + var domain = options.domain ? '; domain=' + (options.domain) : ''; + var secure = options.secure ? '; secure' : ''; + document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); + } else { // only name given, get cookie + var cookieValue = null; + if (document.cookie && document.cookie != '') { + var cookies = document.cookie.split(';'); + for (var i = 0; i < cookies.length; i++) { + var cookie = jQuery.trim(cookies[i]); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) == (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; + } +}; \ No newline at end of file diff --git a/static/js/jquery.cycle.all.js b/static/js/jquery.cycle.all.js new file mode 100644 index 0000000..1d8441a --- /dev/null +++ b/static/js/jquery.cycle.all.js @@ -0,0 +1,1284 @@ +/*! + * jQuery Cycle Plugin (with Transition Definitions) + * Examples and documentation at: http://jquery.malsup.com/cycle/ + * Copyright (c) 2007-2010 M. Alsup + * Version: 2.80 (05-MAR-2010) + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * Requires: jQuery v1.2.6 or later + */ +;(function($) { + +var ver = '2.80'; + +// if $.support is not defined (pre jQuery 1.3) add what I need +if ($.support == undefined) { + $.support = { + opacity: !($.browser.msie) + }; +} + +function debug(s) { + if ($.fn.cycle.debug) + log(s); +} +function log() { + if (window.console && window.console.log) + window.console.log('[cycle] ' + Array.prototype.join.call(arguments,' ')); +}; + +// the options arg can be... +// a number - indicates an immediate transition should occur to the given slide index +// a string - 'pause', 'resume', 'toggle', 'next', 'prev', 'stop', 'destroy' or the name of a transition effect (ie, 'fade', 'zoom', etc) +// an object - properties to control the slideshow +// +// the arg2 arg can be... +// the name of an fx (only used in conjunction with a numeric value for 'options') +// the value true (only used in first arg == 'resume') and indicates +// that the resume should occur immediately (not wait for next timeout) + +$.fn.cycle = function(options, arg2) { + var o = { s: this.selector, c: this.context }; + + // in 1.3+ we can fix mistakes with the ready state + if (this.length === 0 && options != 'stop') { + if (!$.isReady && o.s) { + log('DOM not ready, queuing slideshow'); + $(function() { + $(o.s,o.c).cycle(options,arg2); + }); + return this; + } + // is your DOM ready? http://docs.jquery.com/Tutorials:Introducing_$(document).ready() + log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)')); + return this; + } + + // iterate the matched nodeset + return this.each(function() { + var opts = handleArguments(this, options, arg2); + if (opts === false) + return; + + opts.updateActivePagerLink = opts.updateActivePagerLink || $.fn.cycle.updateActivePagerLink; + + // stop existing slideshow for this container (if there is one) + if (this.cycleTimeout) + clearTimeout(this.cycleTimeout); + this.cycleTimeout = this.cyclePause = 0; + + var $cont = $(this); + var $slides = opts.slideExpr ? $(opts.slideExpr, this) : $cont.children(); + var els = $slides.get(); + if (els.length < 2) { + log('terminating; too few slides: ' + els.length); + return; + } + + var opts2 = buildOptions($cont, $slides, els, opts, o); + if (opts2 === false) + return; + + var startTime = opts2.continuous ? 10 : getTimeout(opts2.currSlide, opts2.nextSlide, opts2, !opts2.rev); + + // if it's an auto slideshow, kick it off + if (startTime) { + startTime += (opts2.delay || 0); + if (startTime < 10) + startTime = 10; + debug('first timeout: ' + startTime); + this.cycleTimeout = setTimeout(function(){go(els,opts2,0,!opts2.rev)}, startTime); + } + }); +}; + +// process the args that were passed to the plugin fn +function handleArguments(cont, options, arg2) { + if (cont.cycleStop == undefined) + cont.cycleStop = 0; + if (options === undefined || options === null) + options = {}; + if (options.constructor == String) { + switch(options) { + case 'destroy': + case 'stop': + var opts = $(cont).data('cycle.opts'); + if (!opts) + return false; + cont.cycleStop++; // callbacks look for change + if (cont.cycleTimeout) + clearTimeout(cont.cycleTimeout); + cont.cycleTimeout = 0; + $(cont).removeData('cycle.opts'); + if (options == 'destroy') + destroy(opts); + return false; + case 'toggle': + cont.cyclePause = (cont.cyclePause === 1) ? 0 : 1; + return false; + case 'pause': + cont.cyclePause = 1; + return false; + case 'resume': + cont.cyclePause = 0; + if (arg2 === true) { // resume now! + options = $(cont).data('cycle.opts'); + if (!options) { + log('options not found, can not resume'); + return false; + } + if (cont.cycleTimeout) { + clearTimeout(cont.cycleTimeout); + cont.cycleTimeout = 0; + } + go(options.elements, options, 1, 1); + } + return false; + case 'prev': + case 'next': + var opts = $(cont).data('cycle.opts'); + if (!opts) { + log('options not found, "prev/next" ignored'); + return false; + } + $.fn.cycle[options](opts); + return false; + default: + options = { fx: options }; + }; + return options; + } + else if (options.constructor == Number) { + // go to the requested slide + var num = options; + options = $(cont).data('cycle.opts'); + if (!options) { + log('options not found, can not advance slide'); + return false; + } + if (num < 0 || num >= options.elements.length) { + log('invalid slide index: ' + num); + return false; + } + options.nextSlide = num; + if (cont.cycleTimeout) { + clearTimeout(cont.cycleTimeout); + cont.cycleTimeout = 0; + } + if (typeof arg2 == 'string') + options.oneTimeFx = arg2; + go(options.elements, options, 1, num >= options.currSlide); + return false; + } + return options; +}; + +function removeFilter(el, opts) { + if (!$.support.opacity && opts.cleartype && el.style.filter) { + try { el.style.removeAttribute('filter'); } + catch(smother) {} // handle old opera versions + } +}; + +// unbind event handlers +function destroy(opts) { + if (opts.next) + $(opts.next).unbind(opts.prevNextEvent); + if (opts.prev) + $(opts.prev).unbind(opts.prevNextEvent); + + if (opts.pager || opts.pagerAnchorBuilder) + $.each(opts.pagerAnchors || [], function() { + this.unbind().remove(); + }); + opts.pagerAnchors = null; + if (opts.destroy) // callback + opts.destroy(opts); +}; + +// one-time initialization +function buildOptions($cont, $slides, els, options, o) { + // support metadata plugin (v1.0 and v2.0) + var opts = $.extend({}, $.fn.cycle.defaults, options || {}, $.metadata ? $cont.metadata() : $.meta ? $cont.data() : {}); + if (opts.autostop) + opts.countdown = opts.autostopCount || els.length; + + var cont = $cont[0]; + $cont.data('cycle.opts', opts); + opts.$cont = $cont; + opts.stopCount = cont.cycleStop; + opts.elements = els; + opts.before = opts.before ? [opts.before] : []; + opts.after = opts.after ? [opts.after] : []; + opts.after.unshift(function(){ opts.busy=0; }); + + // push some after callbacks + if (!$.support.opacity && opts.cleartype) + opts.after.push(function() { removeFilter(this, opts); }); + if (opts.continuous) + opts.after.push(function() { go(els,opts,0,!opts.rev); }); + + saveOriginalOpts(opts); + + // clearType corrections + if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg) + clearTypeFix($slides); + + // container requires non-static position so that slides can be position within + if ($cont.css('position') == 'static') + $cont.css('position', 'relative'); + if (opts.width) + $cont.width(opts.width); + if (opts.height && opts.height != 'auto') + $cont.height(opts.height); + + if (opts.startingSlide) + opts.startingSlide = parseInt(opts.startingSlide); + + // if random, mix up the slide array + if (opts.random) { + opts.randomMap = []; + for (var i = 0; i < els.length; i++) + opts.randomMap.push(i); + opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;}); + opts.randomIndex = 1; + opts.startingSlide = opts.randomMap[1]; + } + else if (opts.startingSlide >= els.length) + opts.startingSlide = 0; // catch bogus input + opts.currSlide = opts.startingSlide || 0; + var first = opts.startingSlide; + + // set position and zIndex on all the slides + $slides.css({position: 'absolute', top:0, left:0}).hide().each(function(i) { + var z = first ? i >= first ? els.length - (i-first) : first-i : els.length-i; + $(this).css('z-index', z) + }); + + // make sure first slide is visible + $(els[first]).css('opacity',1).show(); // opacity bit needed to handle restart use case + removeFilter(els[first], opts); + + // stretch slides + if (opts.fit && opts.width) + $slides.width(opts.width); + if (opts.fit && opts.height && opts.height != 'auto') + $slides.height(opts.height); + + // stretch container + var reshape = opts.containerResize && !$cont.innerHeight(); + if (reshape) { // do this only if container has no size http://tinyurl.com/da2oa9 + var maxw = 0, maxh = 0; + for(var j=0; j < els.length; j++) { + var $e = $(els[j]), e = $e[0], w = $e.outerWidth(), h = $e.outerHeight(); + if (!w) w = e.offsetWidth || e.width || $e.attr('width') + if (!h) h = e.offsetHeight || e.height || $e.attr('height'); + maxw = w > maxw ? w : maxw; + maxh = h > maxh ? h : maxh; + } + if (maxw > 0 && maxh > 0) + $cont.css({width:maxw+'px',height:maxh+'px'}); + } + + if (opts.pause) + $cont.hover(function(){this.cyclePause++;},function(){this.cyclePause--;}); + + if (supportMultiTransitions(opts) === false) + return false; + + // apparently a lot of people use image slideshows without height/width attributes on the images. + // Cycle 2.50+ requires the sizing info for every slide; this block tries to deal with that. + var requeue = false; + options.requeueAttempts = options.requeueAttempts || 0; + $slides.each(function() { + // try to get height/width of each slide + var $el = $(this); + this.cycleH = (opts.fit && opts.height) ? opts.height : ($el.height() || this.offsetHeight || this.height || $el.attr('height') || 0); + this.cycleW = (opts.fit && opts.width) ? opts.width : ($el.width() || this.offsetWidth || this.width || $el.attr('width') || 0); + + if ( $el.is('img') ) { + // sigh.. sniffing, hacking, shrugging... this crappy hack tries to account for what browsers do when + // an image is being downloaded and the markup did not include sizing info (height/width attributes); + // there seems to be some "default" sizes used in this situation + var loadingIE = ($.browser.msie && this.cycleW == 28 && this.cycleH == 30 && !this.complete); + var loadingFF = ($.browser.mozilla && this.cycleW == 34 && this.cycleH == 19 && !this.complete); + var loadingOp = ($.browser.opera && ((this.cycleW == 42 && this.cycleH == 19) || (this.cycleW == 37 && this.cycleH == 17)) && !this.complete); + var loadingOther = (this.cycleH == 0 && this.cycleW == 0 && !this.complete); + // don't requeue for images that are still loading but have a valid size + if (loadingIE || loadingFF || loadingOp || loadingOther) { + if (o.s && opts.requeueOnImageNotLoaded && ++options.requeueAttempts < 100) { // track retry count so we don't loop forever + log(options.requeueAttempts,' - img slide not loaded, requeuing slideshow: ', this.src, this.cycleW, this.cycleH); + setTimeout(function() {$(o.s,o.c).cycle(options)}, opts.requeueTimeout); + requeue = true; + return false; // break each loop + } + else { + log('could not determine size of image: '+this.src, this.cycleW, this.cycleH); + } + } + } + return true; + }); + + if (requeue) + return false; + + opts.cssBefore = opts.cssBefore || {}; + opts.animIn = opts.animIn || {}; + opts.animOut = opts.animOut || {}; + + $slides.not(':eq('+first+')').css(opts.cssBefore); + if (opts.cssFirst) + $($slides[first]).css(opts.cssFirst); + + if (opts.timeout) { + opts.timeout = parseInt(opts.timeout); + // ensure that timeout and speed settings are sane + if (opts.speed.constructor == String) + opts.speed = $.fx.speeds[opts.speed] || parseInt(opts.speed); + if (!opts.sync) + opts.speed = opts.speed / 2; + while((opts.timeout - opts.speed) < 250) // sanitize timeout + opts.timeout += opts.speed; + } + if (opts.easing) + opts.easeIn = opts.easeOut = opts.easing; + if (!opts.speedIn) + opts.speedIn = opts.speed; + if (!opts.speedOut) + opts.speedOut = opts.speed; + + opts.slideCount = els.length; + opts.currSlide = opts.lastSlide = first; + if (opts.random) { + if (++opts.randomIndex == els.length) + opts.randomIndex = 0; + opts.nextSlide = opts.randomMap[opts.randomIndex]; + } + else + opts.nextSlide = opts.startingSlide >= (els.length-1) ? 0 : opts.startingSlide+1; + + // run transition init fn + if (!opts.multiFx) { + var init = $.fn.cycle.transitions[opts.fx]; + if ($.isFunction(init)) + init($cont, $slides, opts); + else if (opts.fx != 'custom' && !opts.multiFx) { + log('unknown transition: ' + opts.fx,'; slideshow terminating'); + return false; + } + } + + // fire artificial events + var e0 = $slides[first]; + if (opts.before.length) + opts.before[0].apply(e0, [e0, e0, opts, true]); + if (opts.after.length > 1) + opts.after[1].apply(e0, [e0, e0, opts, true]); + + if (opts.next) + $(opts.next).bind(opts.prevNextEvent,function(){return advance(opts,opts.rev?-1:1)}); + if (opts.prev) + $(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,opts.rev?1:-1)}); + if (opts.pager || opts.pagerAnchorBuilder) + buildPager(els,opts); + + exposeAddSlide(opts, els); + + return opts; +}; + +// save off original opts so we can restore after clearing state +function saveOriginalOpts(opts) { + opts.original = { before: [], after: [] }; + opts.original.cssBefore = $.extend({}, opts.cssBefore); + opts.original.cssAfter = $.extend({}, opts.cssAfter); + opts.original.animIn = $.extend({}, opts.animIn); + opts.original.animOut = $.extend({}, opts.animOut); + $.each(opts.before, function() { opts.original.before.push(this); }); + $.each(opts.after, function() { opts.original.after.push(this); }); +}; + +function supportMultiTransitions(opts) { + var i, tx, txs = $.fn.cycle.transitions; + // look for multiple effects + if (opts.fx.indexOf(',') > 0) { + opts.multiFx = true; + opts.fxs = opts.fx.replace(/\s*/g,'').split(','); + // discard any bogus effect names + for (i=0; i < opts.fxs.length; i++) { + var fx = opts.fxs[i]; + tx = txs[fx]; + if (!tx || !txs.hasOwnProperty(fx) || !$.isFunction(tx)) { + log('discarding unknown transition: ',fx); + opts.fxs.splice(i,1); + i--; + } + } + // if we have an empty list then we threw everything away! + if (!opts.fxs.length) { + log('No valid transitions named; slideshow terminating.'); + return false; + } + } + else if (opts.fx == 'all') { // auto-gen the list of transitions + opts.multiFx = true; + opts.fxs = []; + for (p in txs) { + tx = txs[p]; + if (txs.hasOwnProperty(p) && $.isFunction(tx)) + opts.fxs.push(p); + } + } + if (opts.multiFx && opts.randomizeEffects) { + // munge the fxs array to make effect selection random + var r1 = Math.floor(Math.random() * 20) + 30; + for (i = 0; i < r1; i++) { + var r2 = Math.floor(Math.random() * opts.fxs.length); + opts.fxs.push(opts.fxs.splice(r2,1)[0]); + } + debug('randomized fx sequence: ',opts.fxs); + } + return true; +}; + +// provide a mechanism for adding slides after the slideshow has started +function exposeAddSlide(opts, els) { + opts.addSlide = function(newSlide, prepend) { + var $s = $(newSlide), s = $s[0]; + if (!opts.autostopCount) + opts.countdown++; + els[prepend?'unshift':'push'](s); + if (opts.els) + opts.els[prepend?'unshift':'push'](s); // shuffle needs this + opts.slideCount = els.length; + + $s.css('position','absolute'); + $s[prepend?'prependTo':'appendTo'](opts.$cont); + + if (prepend) { + opts.currSlide++; + opts.nextSlide++; + } + + if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg) + clearTypeFix($s); + + if (opts.fit && opts.width) + $s.width(opts.width); + if (opts.fit && opts.height && opts.height != 'auto') + $slides.height(opts.height); + s.cycleH = (opts.fit && opts.height) ? opts.height : $s.height(); + s.cycleW = (opts.fit && opts.width) ? opts.width : $s.width(); + + $s.css(opts.cssBefore); + + if (opts.pager || opts.pagerAnchorBuilder) + $.fn.cycle.createPagerAnchor(els.length-1, s, $(opts.pager), els, opts); + + if ($.isFunction(opts.onAddSlide)) + opts.onAddSlide($s); + else + $s.hide(); // default behavior + }; +} + +// reset internal state; we do this on every pass in order to support multiple effects +$.fn.cycle.resetState = function(opts, fx) { + fx = fx || opts.fx; + opts.before = []; opts.after = []; + opts.cssBefore = $.extend({}, opts.original.cssBefore); + opts.cssAfter = $.extend({}, opts.original.cssAfter); + opts.animIn = $.extend({}, opts.original.animIn); + opts.animOut = $.extend({}, opts.original.animOut); + opts.fxFn = null; + $.each(opts.original.before, function() { opts.before.push(this); }); + $.each(opts.original.after, function() { opts.after.push(this); }); + + // re-init + var init = $.fn.cycle.transitions[fx]; + if ($.isFunction(init)) + init(opts.$cont, $(opts.elements), opts); +}; + +// this is the main engine fn, it handles the timeouts, callbacks and slide index mgmt +function go(els, opts, manual, fwd) { + // opts.busy is true if we're in the middle of an animation + if (manual && opts.busy && opts.manualTrump) { + // let manual transitions requests trump active ones + $(els).stop(true,true); + opts.busy = false; + } + // don't begin another timeout-based transition if there is one active + if (opts.busy) + return; + + var p = opts.$cont[0], curr = els[opts.currSlide], next = els[opts.nextSlide]; + + // stop cycling if we have an outstanding stop request + if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0 && !manual) + return; + + // check to see if we should stop cycling based on autostop options + if (!manual && !p.cyclePause && + ((opts.autostop && (--opts.countdown <= 0)) || + (opts.nowrap && !opts.random && opts.nextSlide < opts.currSlide))) { + if (opts.end) + opts.end(opts); + return; + } + + // if slideshow is paused, only transition on a manual trigger + if ((manual || !p.cyclePause) && (opts.nextSlide != opts.currSlide)) { + var fx = opts.fx; + // keep trying to get the slide size if we don't have it yet + curr.cycleH = curr.cycleH || $(curr).height(); + curr.cycleW = curr.cycleW || $(curr).width(); + next.cycleH = next.cycleH || $(next).height(); + next.cycleW = next.cycleW || $(next).width(); + + // support multiple transition types + if (opts.multiFx) { + if (opts.lastFx == undefined || ++opts.lastFx >= opts.fxs.length) + opts.lastFx = 0; + fx = opts.fxs[opts.lastFx]; + opts.currFx = fx; + } + + // one-time fx overrides apply to: $('div').cycle(3,'zoom'); + if (opts.oneTimeFx) { + fx = opts.oneTimeFx; + opts.oneTimeFx = null; + } + + $.fn.cycle.resetState(opts, fx); + + // run the before callbacks + if (opts.before.length) + $.each(opts.before, function(i,o) { + if (p.cycleStop != opts.stopCount) return; + o.apply(next, [curr, next, opts, fwd]); + }); + + // stage the after callacks + var after = function() { + $.each(opts.after, function(i,o) { + if (p.cycleStop != opts.stopCount) return; + o.apply(next, [curr, next, opts, fwd]); + }); + }; + + // get ready to perform the transition + opts.busy = 1; + if (opts.fxFn) // fx function provided? + opts.fxFn(curr, next, opts, after, fwd); + else if ($.isFunction($.fn.cycle[opts.fx])) // fx plugin ? + $.fn.cycle[opts.fx](curr, next, opts, after); + else + $.fn.cycle.custom(curr, next, opts, after, manual && opts.fastOnEvent); + + // calculate the next slide + opts.lastSlide = opts.currSlide; + if (opts.random) { + opts.currSlide = opts.nextSlide; + if (++opts.randomIndex == els.length) + opts.randomIndex = 0; + opts.nextSlide = opts.randomMap[opts.randomIndex]; + } + else { // sequence + var roll = (opts.nextSlide + 1) == els.length; + opts.nextSlide = roll ? 0 : opts.nextSlide+1; + opts.currSlide = roll ? els.length-1 : opts.nextSlide-1; + } + + if (opts.pager) + opts.updateActivePagerLink(opts.pager, opts.currSlide, opts.activePagerClass); + } + + // stage the next transition + var ms = 0; + if (opts.timeout && !opts.continuous) + ms = getTimeout(curr, next, opts, fwd); + else if (opts.continuous && p.cyclePause) // continuous shows work off an after callback, not this timer logic + ms = 10; + if (ms > 0) + p.cycleTimeout = setTimeout(function(){ go(els, opts, 0, !opts.rev) }, ms); +}; + +// invoked after transition +$.fn.cycle.updateActivePagerLink = function(pager, currSlide, clsName) { + $(pager).each(function() { + $(this).find('a').removeClass(clsName).filter('a:eq('+currSlide+')').addClass(clsName); + }); +}; + +// calculate timeout value for current transition +function getTimeout(curr, next, opts, fwd) { + if (opts.timeoutFn) { + // call user provided calc fn + var t = opts.timeoutFn(curr,next,opts,fwd); + while ((t - opts.speed) < 250) // sanitize timeout + t += opts.speed; + debug('calculated timeout: ' + t + '; speed: ' + opts.speed); + if (t !== false) + return t; + } + return opts.timeout; +}; + +// expose next/prev function, caller must pass in state +$.fn.cycle.next = function(opts) { advance(opts, opts.rev?-1:1); }; +$.fn.cycle.prev = function(opts) { advance(opts, opts.rev?1:-1);}; + +// advance slide forward or back +function advance(opts, val) { + var els = opts.elements; + var p = opts.$cont[0], timeout = p.cycleTimeout; + if (timeout) { + clearTimeout(timeout); + p.cycleTimeout = 0; + } + if (opts.random && val < 0) { + // move back to the previously display slide + opts.randomIndex--; + if (--opts.randomIndex == -2) + opts.randomIndex = els.length-2; + else if (opts.randomIndex == -1) + opts.randomIndex = els.length-1; + opts.nextSlide = opts.randomMap[opts.randomIndex]; + } + else if (opts.random) { + opts.nextSlide = opts.randomMap[opts.randomIndex]; + } + else { + opts.nextSlide = opts.currSlide + val; + if (opts.nextSlide < 0) { + if (opts.nowrap) return false; + opts.nextSlide = els.length - 1; + } + else if (opts.nextSlide >= els.length) { + if (opts.nowrap) return false; + opts.nextSlide = 0; + } + } + + if ($.isFunction(opts.prevNextClick)) + opts.prevNextClick(val > 0, opts.nextSlide, els[opts.nextSlide]); + go(els, opts, 1, val>=0); + return false; +}; + +function buildPager(els, opts) { + var $p = $(opts.pager); + $.each(els, function(i,o) { + $.fn.cycle.createPagerAnchor(i,o,$p,els,opts); + }); + opts.updateActivePagerLink(opts.pager, opts.startingSlide, opts.activePagerClass); +}; + +$.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) { + var a; + if ($.isFunction(opts.pagerAnchorBuilder)) + a = opts.pagerAnchorBuilder(i,el); + else + a = ''+(i+1)+''; + + if (!a) + return; + var $a = $(a); + // don't reparent if anchor is in the dom + if ($a.parents('body').length === 0) { + var arr = []; + if ($p.length > 1) { + $p.each(function() { + var $clone = $a.clone(true); + $(this).append($clone); + arr.push($clone[0]); + }); + $a = $(arr); + } + else { + $a.appendTo($p); + } + } + + opts.pagerAnchors = opts.pagerAnchors || []; + opts.pagerAnchors.push($a); + $a.bind(opts.pagerEvent, function(e) { + e.preventDefault(); + opts.nextSlide = i; + var p = opts.$cont[0], timeout = p.cycleTimeout; + if (timeout) { + clearTimeout(timeout); + p.cycleTimeout = 0; + } + if ($.isFunction(opts.pagerClick)) + opts.pagerClick(opts.nextSlide, els[opts.nextSlide]); + go(els,opts,1,opts.currSlide < i); // trigger the trans +// return false; + }); + + if ( ! /^click/.test(opts.pagerEvent) && !opts.allowPagerClickBubble) + $a.bind('click.cycle', function(){return false;}); // supress click + + if (opts.pauseOnPagerHover) + $a.hover(function() { opts.$cont[0].cyclePause++; }, function() { opts.$cont[0].cyclePause--; } ); +}; + +// helper fn to calculate the number of slides between the current and the next +$.fn.cycle.hopsFromLast = function(opts, fwd) { + var hops, l = opts.lastSlide, c = opts.currSlide; + if (fwd) + hops = c > l ? c - l : opts.slideCount - l; + else + hops = c < l ? l - c : l + opts.slideCount - c; + return hops; +}; + +// fix clearType problems in ie6 by setting an explicit bg color +// (otherwise text slides look horrible during a fade transition) +function clearTypeFix($slides) { + function hex(s) { + s = parseInt(s).toString(16); + return s.length < 2 ? '0'+s : s; + }; + function getBg(e) { + for ( ; e && e.nodeName.toLowerCase() != 'html'; e = e.parentNode) { + var v = $.css(e,'background-color'); + if (v.indexOf('rgb') >= 0 ) { + var rgb = v.match(/\d+/g); + return '#'+ hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]); + } + if (v && v != 'transparent') + return v; + } + return '#ffffff'; + }; + $slides.each(function() { $(this).css('background-color', getBg(this)); }); +}; + +// reset common props before the next transition +$.fn.cycle.commonReset = function(curr,next,opts,w,h,rev) { + $(opts.elements).not(curr).hide(); + opts.cssBefore.opacity = 1; + opts.cssBefore.display = 'block'; + if (w !== false && next.cycleW > 0) + opts.cssBefore.width = next.cycleW; + if (h !== false && next.cycleH > 0) + opts.cssBefore.height = next.cycleH; + opts.cssAfter = opts.cssAfter || {}; + opts.cssAfter.display = 'none'; + $(curr).css('zIndex',opts.slideCount + (rev === true ? 1 : 0)); + $(next).css('zIndex',opts.slideCount + (rev === true ? 0 : 1)); +}; + +// the actual fn for effecting a transition +$.fn.cycle.custom = function(curr, next, opts, cb, speedOverride) { + var $l = $(curr), $n = $(next); + var speedIn = opts.speedIn, speedOut = opts.speedOut, easeIn = opts.easeIn, easeOut = opts.easeOut; + $n.css(opts.cssBefore); + if (speedOverride) { + if (typeof speedOverride == 'number') + speedIn = speedOut = speedOverride; + else + speedIn = speedOut = 1; + easeIn = easeOut = null; + } + var fn = function() {$n.animate(opts.animIn, speedIn, easeIn, cb)}; + $l.animate(opts.animOut, speedOut, easeOut, function() { + if (opts.cssAfter) $l.css(opts.cssAfter); + if (!opts.sync) fn(); + }); + if (opts.sync) fn(); +}; + +// transition definitions - only fade is defined here, transition pack defines the rest +$.fn.cycle.transitions = { + fade: function($cont, $slides, opts) { + $slides.not(':eq('+opts.currSlide+')').css('opacity',0); + opts.before.push(function(curr,next,opts) { + $.fn.cycle.commonReset(curr,next,opts); + opts.cssBefore.opacity = 0; + }); + opts.animIn = { opacity: 1 }; + opts.animOut = { opacity: 0 }; + opts.cssBefore = { top: 0, left: 0 }; + } +}; + +$.fn.cycle.ver = function() { return ver; }; + +// override these globally if you like (they are all optional) +$.fn.cycle.defaults = { + fx: 'fade', // name of transition effect (or comma separated names, ex: fade,scrollUp,shuffle) + timeout: 4000, // milliseconds between slide transitions (0 to disable auto advance) + timeoutFn: null, // callback for determining per-slide timeout value: function(currSlideElement, nextSlideElement, options, forwardFlag) + continuous: 0, // true to start next transition immediately after current one completes + speed: 1000, // speed of the transition (any valid fx speed value) + speedIn: null, // speed of the 'in' transition + speedOut: null, // speed of the 'out' transition + next: null, // selector for element to use as click trigger for next slide + prev: null, // selector for element to use as click trigger for previous slide + prevNextClick: null, // callback fn for prev/next clicks: function(isNext, zeroBasedSlideIndex, slideElement) + prevNextEvent:'click.cycle',// event which drives the manual transition to the previous or next slide + pager: null, // selector for element to use as pager container + pagerClick: null, // callback fn for pager clicks: function(zeroBasedSlideIndex, slideElement) + pagerEvent: 'click.cycle', // name of event which drives the pager navigation + allowPagerClickBubble: false, // allows or prevents click event on pager anchors from bubbling + pagerAnchorBuilder: null, // callback fn for building anchor links: function(index, DOMelement) + before: null, // transition callback (scope set to element to be shown): function(currSlideElement, nextSlideElement, options, forwardFlag) + after: null, // transition callback (scope set to element that was shown): function(currSlideElement, nextSlideElement, options, forwardFlag) + end: null, // callback invoked when the slideshow terminates (use with autostop or nowrap options): function(options) + easing: null, // easing method for both in and out transitions + easeIn: null, // easing for "in" transition + easeOut: null, // easing for "out" transition + shuffle: null, // coords for shuffle animation, ex: { top:15, left: 200 } + animIn: null, // properties that define how the slide animates in + animOut: null, // properties that define how the slide animates out + cssBefore: null, // properties that define the initial state of the slide before transitioning in + cssAfter: null, // properties that defined the state of the slide after transitioning out + fxFn: null, // function used to control the transition: function(currSlideElement, nextSlideElement, options, afterCalback, forwardFlag) + height: 'auto', // container height + startingSlide: 0, // zero-based index of the first slide to be displayed + sync: 1, // true if in/out transitions should occur simultaneously + random: 0, // true for random, false for sequence (not applicable to shuffle fx) + fit: 0, // force slides to fit container + containerResize: 1, // resize container to fit largest slide + pause: 0, // true to enable "pause on hover" + pauseOnPagerHover: 0, // true to pause when hovering over pager link + autostop: 0, // true to end slideshow after X transitions (where X == slide count) + autostopCount: 0, // number of transitions (optionally used with autostop to define X) + delay: 0, // additional delay (in ms) for first transition (hint: can be negative) + slideExpr: null, // expression for selecting slides (if something other than all children is required) + cleartype: !$.support.opacity, // true if clearType corrections should be applied (for IE) + cleartypeNoBg: false, // set to true to disable extra cleartype fixing (leave false to force background color setting on slides) + nowrap: 0, // true to prevent slideshow from wrapping + fastOnEvent: 0, // force fast transitions when triggered manually (via pager or prev/next); value == time in ms + randomizeEffects: 1, // valid when multiple effects are used; true to make the effect sequence random + rev: 0, // causes animations to transition in reverse + manualTrump: true, // causes manual transition to stop an active transition instead of being ignored + requeueOnImageNotLoaded: true, // requeue the slideshow if any image slides are not yet loaded + requeueTimeout: 250, // ms delay for requeue + activePagerClass: 'activeSlide', // class name used for the active pager link + updateActivePagerLink: null // callback fn invoked to update the active pager link (adds/removes activePagerClass style) +}; + +})(jQuery); + + +/*! + * jQuery Cycle Plugin Transition Definitions + * This script is a plugin for the jQuery Cycle Plugin + * Examples and documentation at: http://malsup.com/jquery/cycle/ + * Copyright (c) 2007-2008 M. Alsup + * Version: 2.72 + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ +(function($) { + +// +// These functions define one-time slide initialization for the named +// transitions. To save file size feel free to remove any of these that you +// don't need. +// +$.fn.cycle.transitions.none = function($cont, $slides, opts) { + opts.fxFn = function(curr,next,opts,after){ + opts.cssBefore = { top: 0, left: 0 }; + $.fn.cycle.commonReset(curr,next,opts); + $(next).css(opts.cssBefore); + $(next).show(); + $(curr).hide(); + if (opts.cssAfter) $(curr).css(opts.cssAfter); + after(); + }; +} + +// scrollUp/Down/Left/Right +$.fn.cycle.transitions.scrollUp = function($cont, $slides, opts) { + $cont.css('overflow','hidden'); + opts.before.push($.fn.cycle.commonReset); + var h = $cont.height(); + opts.cssBefore ={ top: h, left: 0 }; + opts.cssFirst = { top: 0 }; + opts.animIn = { top: 0 }; + opts.animOut = { top: -h }; +}; +$.fn.cycle.transitions.scrollDown = function($cont, $slides, opts) { + $cont.css('overflow','hidden'); + opts.before.push($.fn.cycle.commonReset); + var h = $cont.height(); + opts.cssFirst = { top: 0 }; + opts.cssBefore= { top: -h, left: 0 }; + opts.animIn = { top: 0 }; + opts.animOut = { top: h }; +}; +$.fn.cycle.transitions.scrollLeft = function($cont, $slides, opts) { + $cont.css('overflow','hidden'); + opts.before.push($.fn.cycle.commonReset); + var w = $cont.width(); + opts.cssFirst = { left: 0 }; + opts.cssBefore= { left: w, top: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { left: 0-w }; +}; +$.fn.cycle.transitions.scrollRight = function($cont, $slides, opts) { + $cont.css('overflow','hidden'); + opts.before.push($.fn.cycle.commonReset); + var w = $cont.width(); + opts.cssFirst = { left: 0 }; + opts.cssBefore= { left: -w, top: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { left: w }; +}; +$.fn.cycle.transitions.scrollHorz = function($cont, $slides, opts) { + $cont.css('overflow','hidden').width(); + opts.before.push(function(curr, next, opts, fwd) { + $.fn.cycle.commonReset(curr,next,opts); + opts.cssBefore.left = fwd ? (next.cycleW-1) : (1-next.cycleW); + opts.animOut.left = fwd ? -curr.cycleW : curr.cycleW; + }); + opts.cssFirst = { left: 0 }; + opts.cssBefore= { top: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { top: 0 }; +}; +$.fn.cycle.transitions.scrollVert = function($cont, $slides, opts) { + $cont.css('overflow','hidden'); + opts.before.push(function(curr, next, opts, fwd) { + $.fn.cycle.commonReset(curr,next,opts); + opts.cssBefore.top = fwd ? (1-next.cycleH) : (next.cycleH-1); + opts.animOut.top = fwd ? curr.cycleH : -curr.cycleH; + }); + opts.cssFirst = { top: 0 }; + opts.cssBefore= { left: 0 }; + opts.animIn = { top: 0 }; + opts.animOut = { left: 0 }; +}; + +// slideX/slideY +$.fn.cycle.transitions.slideX = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $(opts.elements).not(curr).hide(); + $.fn.cycle.commonReset(curr,next,opts,false,true); + opts.animIn.width = next.cycleW; + }); + opts.cssBefore = { left: 0, top: 0, width: 0 }; + opts.animIn = { width: 'show' }; + opts.animOut = { width: 0 }; +}; +$.fn.cycle.transitions.slideY = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $(opts.elements).not(curr).hide(); + $.fn.cycle.commonReset(curr,next,opts,true,false); + opts.animIn.height = next.cycleH; + }); + opts.cssBefore = { left: 0, top: 0, height: 0 }; + opts.animIn = { height: 'show' }; + opts.animOut = { height: 0 }; +}; + +// shuffle +$.fn.cycle.transitions.shuffle = function($cont, $slides, opts) { + var i, w = $cont.css('overflow', 'visible').width(); + $slides.css({left: 0, top: 0}); + opts.before.push(function(curr,next,opts) { + $.fn.cycle.commonReset(curr,next,opts,true,true,true); + }); + // only adjust speed once! + if (!opts.speedAdjusted) { + opts.speed = opts.speed / 2; // shuffle has 2 transitions + opts.speedAdjusted = true; + } + opts.random = 0; + opts.shuffle = opts.shuffle || {left:-w, top:15}; + opts.els = []; + for (i=0; i < $slides.length; i++) + opts.els.push($slides[i]); + + for (i=0; i < opts.currSlide; i++) + opts.els.push(opts.els.shift()); + + // custom transition fn (hat tip to Benjamin Sterling for this bit of sweetness!) + opts.fxFn = function(curr, next, opts, cb, fwd) { + var $el = fwd ? $(curr) : $(next); + $(next).css(opts.cssBefore); + var count = opts.slideCount; + $el.animate(opts.shuffle, opts.speedIn, opts.easeIn, function() { + var hops = $.fn.cycle.hopsFromLast(opts, fwd); + for (var k=0; k < hops; k++) + fwd ? opts.els.push(opts.els.shift()) : opts.els.unshift(opts.els.pop()); + if (fwd) { + for (var i=0, len=opts.els.length; i < len; i++) + $(opts.els[i]).css('z-index', len-i+count); + } + else { + var z = $(curr).css('z-index'); + $el.css('z-index', parseInt(z)+1+count); + } + $el.animate({left:0, top:0}, opts.speedOut, opts.easeOut, function() { + $(fwd ? this : curr).hide(); + if (cb) cb(); + }); + }); + }; + opts.cssBefore = { display: 'block', opacity: 1, top: 0, left: 0 }; +}; + +// turnUp/Down/Left/Right +$.fn.cycle.transitions.turnUp = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,true,false); + opts.cssBefore.top = next.cycleH; + opts.animIn.height = next.cycleH; + }); + opts.cssFirst = { top: 0 }; + opts.cssBefore = { left: 0, height: 0 }; + opts.animIn = { top: 0 }; + opts.animOut = { height: 0 }; +}; +$.fn.cycle.transitions.turnDown = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,true,false); + opts.animIn.height = next.cycleH; + opts.animOut.top = curr.cycleH; + }); + opts.cssFirst = { top: 0 }; + opts.cssBefore = { left: 0, top: 0, height: 0 }; + opts.animOut = { height: 0 }; +}; +$.fn.cycle.transitions.turnLeft = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,false,true); + opts.cssBefore.left = next.cycleW; + opts.animIn.width = next.cycleW; + }); + opts.cssBefore = { top: 0, width: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { width: 0 }; +}; +$.fn.cycle.transitions.turnRight = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,false,true); + opts.animIn.width = next.cycleW; + opts.animOut.left = curr.cycleW; + }); + opts.cssBefore = { top: 0, left: 0, width: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { width: 0 }; +}; + +// zoom +$.fn.cycle.transitions.zoom = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,false,false,true); + opts.cssBefore.top = next.cycleH/2; + opts.cssBefore.left = next.cycleW/2; + opts.animIn = { top: 0, left: 0, width: next.cycleW, height: next.cycleH }; + opts.animOut = { width: 0, height: 0, top: curr.cycleH/2, left: curr.cycleW/2 }; + }); + opts.cssFirst = { top:0, left: 0 }; + opts.cssBefore = { width: 0, height: 0 }; +}; + +// fadeZoom +$.fn.cycle.transitions.fadeZoom = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,false,false); + opts.cssBefore.left = next.cycleW/2; + opts.cssBefore.top = next.cycleH/2; + opts.animIn = { top: 0, left: 0, width: next.cycleW, height: next.cycleH }; + }); + opts.cssBefore = { width: 0, height: 0 }; + opts.animOut = { opacity: 0 }; +}; + +// blindX +$.fn.cycle.transitions.blindX = function($cont, $slides, opts) { + var w = $cont.css('overflow','hidden').width(); + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts); + opts.animIn.width = next.cycleW; + opts.animOut.left = curr.cycleW; + }); + opts.cssBefore = { left: w, top: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { left: w }; +}; +// blindY +$.fn.cycle.transitions.blindY = function($cont, $slides, opts) { + var h = $cont.css('overflow','hidden').height(); + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts); + opts.animIn.height = next.cycleH; + opts.animOut.top = curr.cycleH; + }); + opts.cssBefore = { top: h, left: 0 }; + opts.animIn = { top: 0 }; + opts.animOut = { top: h }; +}; +// blindZ +$.fn.cycle.transitions.blindZ = function($cont, $slides, opts) { + var h = $cont.css('overflow','hidden').height(); + var w = $cont.width(); + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts); + opts.animIn.height = next.cycleH; + opts.animOut.top = curr.cycleH; + }); + opts.cssBefore = { top: h, left: w }; + opts.animIn = { top: 0, left: 0 }; + opts.animOut = { top: h, left: w }; +}; + +// growX - grow horizontally from centered 0 width +$.fn.cycle.transitions.growX = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,false,true); + opts.cssBefore.left = this.cycleW/2; + opts.animIn = { left: 0, width: this.cycleW }; + opts.animOut = { left: 0 }; + }); + opts.cssBefore = { width: 0, top: 0 }; +}; +// growY - grow vertically from centered 0 height +$.fn.cycle.transitions.growY = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,true,false); + opts.cssBefore.top = this.cycleH/2; + opts.animIn = { top: 0, height: this.cycleH }; + opts.animOut = { top: 0 }; + }); + opts.cssBefore = { height: 0, left: 0 }; +}; + +// curtainX - squeeze in both edges horizontally +$.fn.cycle.transitions.curtainX = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,false,true,true); + opts.cssBefore.left = next.cycleW/2; + opts.animIn = { left: 0, width: this.cycleW }; + opts.animOut = { left: curr.cycleW/2, width: 0 }; + }); + opts.cssBefore = { top: 0, width: 0 }; +}; +// curtainY - squeeze in both edges vertically +$.fn.cycle.transitions.curtainY = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,true,false,true); + opts.cssBefore.top = next.cycleH/2; + opts.animIn = { top: 0, height: next.cycleH }; + opts.animOut = { top: curr.cycleH/2, height: 0 }; + }); + opts.cssBefore = { left: 0, height: 0 }; +}; + +// cover - curr slide covered by next slide +$.fn.cycle.transitions.cover = function($cont, $slides, opts) { + var d = opts.direction || 'left'; + var w = $cont.css('overflow','hidden').width(); + var h = $cont.height(); + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts); + if (d == 'right') + opts.cssBefore.left = -w; + else if (d == 'up') + opts.cssBefore.top = h; + else if (d == 'down') + opts.cssBefore.top = -h; + else + opts.cssBefore.left = w; + }); + opts.animIn = { left: 0, top: 0}; + opts.animOut = { opacity: 1 }; + opts.cssBefore = { top: 0, left: 0 }; +}; + +// uncover - curr slide moves off next slide +$.fn.cycle.transitions.uncover = function($cont, $slides, opts) { + var d = opts.direction || 'left'; + var w = $cont.css('overflow','hidden').width(); + var h = $cont.height(); + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,true,true,true); + if (d == 'right') + opts.animOut.left = w; + else if (d == 'up') + opts.animOut.top = -h; + else if (d == 'down') + opts.animOut.top = h; + else + opts.animOut.left = -w; + }); + opts.animIn = { left: 0, top: 0 }; + opts.animOut = { opacity: 1 }; + opts.cssBefore = { top: 0, left: 0 }; +}; + +// toss - move top slide and fade away +$.fn.cycle.transitions.toss = function($cont, $slides, opts) { + var w = $cont.css('overflow','visible').width(); + var h = $cont.height(); + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,true,true,true); + // provide default toss settings if animOut not provided + if (!opts.animOut.left && !opts.animOut.top) + opts.animOut = { left: w*2, top: -h/2, opacity: 0 }; + else + opts.animOut.opacity = 0; + }); + opts.cssBefore = { left: 0, top: 0 }; + opts.animIn = { left: 0 }; +}; + +// wipe - clip animation +$.fn.cycle.transitions.wipe = function($cont, $slides, opts) { + var w = $cont.css('overflow','hidden').width(); + var h = $cont.height(); + opts.cssBefore = opts.cssBefore || {}; + var clip; + if (opts.clip) { + if (/l2r/.test(opts.clip)) + clip = 'rect(0px 0px '+h+'px 0px)'; + else if (/r2l/.test(opts.clip)) + clip = 'rect(0px '+w+'px '+h+'px '+w+'px)'; + else if (/t2b/.test(opts.clip)) + clip = 'rect(0px '+w+'px 0px 0px)'; + else if (/b2t/.test(opts.clip)) + clip = 'rect('+h+'px '+w+'px '+h+'px 0px)'; + else if (/zoom/.test(opts.clip)) { + var top = parseInt(h/2); + var left = parseInt(w/2); + clip = 'rect('+top+'px '+left+'px '+top+'px '+left+'px)'; + } + } + + opts.cssBefore.clip = opts.cssBefore.clip || clip || 'rect(0px 0px 0px 0px)'; + + var d = opts.cssBefore.clip.match(/(\d+)/g); + var t = parseInt(d[0]), r = parseInt(d[1]), b = parseInt(d[2]), l = parseInt(d[3]); + + opts.before.push(function(curr, next, opts) { + if (curr == next) return; + var $curr = $(curr), $next = $(next); + $.fn.cycle.commonReset(curr,next,opts,true,true,false); + opts.cssAfter.display = 'block'; + + var step = 1, count = parseInt((opts.speedIn / 13)) - 1; + (function f() { + var tt = t ? t - parseInt(step * (t/count)) : 0; + var ll = l ? l - parseInt(step * (l/count)) : 0; + var bb = b < h ? b + parseInt(step * ((h-b)/count || 1)) : h; + var rr = r < w ? r + parseInt(step * ((w-r)/count || 1)) : w; + $next.css({ clip: 'rect('+tt+'px '+rr+'px '+bb+'px '+ll+'px)' }); + (step++ <= count) ? setTimeout(f, 13) : $curr.css('display', 'none'); + })(); + }); + opts.cssBefore = { display: 'block', opacity: 1, top: 0, left: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { left: 0 }; +}; + +})(jQuery); diff --git a/static/js/jquery.doubletap-0.1.js b/static/js/jquery.doubletap-0.1.js new file mode 100644 index 0000000..2a33f55 --- /dev/null +++ b/static/js/jquery.doubletap-0.1.js @@ -0,0 +1,105 @@ +(function($) { + var touchStatus = function(target, touch) { + this.target = $(target); + this.touch = touch; + this.startX = this.currentX = touch.screenX; + this.startY = this.currentY = touch.screenY; + this.eventType = null; + } + touchStatus.latestTap = null; + + touchStatus.prototype.move = function(touch) { + this.currentX = touch.screenX; + this.currentY = touch.screenY; + } + + touchStatus.prototype.process = function() { + var offsetX = this.currentX - this.startX; + var offsetY = this.currentY - this.startY; + if(offsetX == 0 && offsetY == 0) { + this.checkForDoubleTap() + } else if(Math.abs(offsetY) > Math.abs(offsetX)) { + this.eventType = offsetY > 0 ? 'swipedown' : 'swipeup'; + this.target.trigger('swipe', [this]) + } else { + this.eventType = offsetX > 0 ? 'swiperight' : 'swipeleft'; + this.target.trigger('swipe', [this]) + } + this.target.trigger(this.eventType, [this]) + this.target.trigger('touch', [this]) + } + + touchStatus.prototype.checkForDoubleTap = function() { + if(touchStatus.latestTap) { + if((new Date() - touchStatus.latestTap) < 400) + this.eventType = 'doubletap' + } + if(!this.eventType) this.eventType = 'tap' + touchStatus.latestTap = new Date() + } + + var swipeEvents = function(elements) { + elements.bind('touchstart', this.touchStart); + elements.bind('touchmove', this.touchMove); + elements.bind('touchcancel', this.touchCancel); + elements.bind('touchend', this.touchEnd); + } + + swipeEvents.prototype.touchStart = function(evt) { + var target = this; + swipeEvents.eachTouch(evt, function(touch) { + swipeEvents.touches[touch.identifier] = new touchStatus(target, touch); + }) + } + + swipeEvents.prototype.touchMove = function(evt) { + swipeEvents.eachTouch(evt, function(touch) { + var loc = swipeEvents.touches[touch.identifier] + if(loc) loc.move(touch) + }) + } + + swipeEvents.prototype.touchCancel = function(evt) { + swipeEvents.eachTouch(evt, function(touch) { + swipeEvents.purge(touch, true) + }) + } + + swipeEvents.prototype.touchEnd = function(evt) { + swipeEvents.eachTouch(evt, function(touch) { + swipeEvents.purge(touch) + }) + } + + swipeEvents.touches = {} + swipeEvents.purge = function(touch, cancelled) { + if(!cancelled) { + var loc = swipeEvents.touches[touch.identifier] + if(loc) loc.process() + } + delete swipeEvents.touches[touch.identifier] + } + + swipeEvents.eachTouch = function(evt, callback) { + var evt = evt.originalEvent; + var num = evt.changedTouches.length; + for(var i = 0; i < num; i++) { + callback(evt.changedTouches[i]) + } + } + + // adds custom events: + // touch // all events + // swipe // only swipe* events + // swipeleft + // swiperight + // swipeup + // swipedown + // tap + // doubletap + $.fn.addSwipeEvents = function(callback) { + new swipeEvents(this); + if(callback) this.bind('touch', callback) + return this; + } +})(jQuery); \ No newline at end of file diff --git a/static/js/jquery.uuid.js b/static/js/jquery.uuid.js new file mode 100644 index 0000000..f22bf2d --- /dev/null +++ b/static/js/jquery.uuid.js @@ -0,0 +1,24 @@ +/* +Usage 1: define the default prefix by using an object with the property prefix as a parameter which contains a string value; {prefix: 'id'} +Usage 2: call the function jQuery.uuid() with a string parameter p to be used as a prefix to generate a random uuid; +Usage 3: call the function jQuery.uuid() with no parameters to generate a uuid with the default prefix; defaul prefix: '' (empty string) +*/ + +/* +Generate fragment of random numbers +*/ +jQuery._uuid_default_prefix = ''; +jQuery._uuidlet = function () { + return(((1+Math.random())*0x10000)|0).toString(16).substring(1); +}; +/* +Generates random uuid +*/ +jQuery.uuid = function (p) { + if (typeof(p) == 'object' && typeof(p.prefix) == 'string') { + jQuery._uuid_default_prefix = p.prefix; + } else { + p = p || jQuery._uuid_default_prefix || ''; + return(p+jQuery._uuidlet()+jQuery._uuidlet()+"-"+jQuery._uuidlet()+"-"+jQuery._uuidlet()+"-"+jQuery._uuidlet()+"-"+jQuery._uuidlet()+jQuery._uuidlet()+jQuery._uuidlet()); + }; +}; \ No newline at end of file diff --git a/static/js/jquery.ws-0.3pre.js b/static/js/jquery.ws-0.3pre.js new file mode 100644 index 0000000..9942d35 --- /dev/null +++ b/static/js/jquery.ws-0.3pre.js @@ -0,0 +1,201 @@ + +(function($){ + +$.ws = { + +//========================================================== +// jQuery plugin jquery.ws.js +// for Web Sockets +// need Browser Chrome4.0.249.0+ +// Demo http://bloga.jp/ws/jq/ +// serverside sample @see http://blog.livedoor.jp/kotesaki/archives/1355651.html + + name : "ws", + version : "0.3-noenc-pre", + demo : "http://bloga.jp/ws/jq/conn/b1.htm", + author : "Toshiro Takahashi", + lisence : "same as jQuery @see http://docs.jquery.com/Licensing", + update : 'http://jsgt.org/lib/jquery/plugin/ws/update.txt', + ver : '', + + //Default settings + wsSettings: { + url : "ws://"+location.host, + data : null,//The data which transmit a message + onopen : function(e){},//callback on opened. + onmessage : function(msg,wsObject){},//callback on received + onclose : function(){},//callback on cloased + hbStr : "Heartbeat",//if null then no Heartbeat + hbinterval : 60000,//dafault 60sec, min=5000 + onheartbeat: function(){}//callback on heartbeatsended + }, + wsSetup: function( settings ) { + jQuery.extend( jQuery.ws.wsSettings, settings ); + } + + //Note: if you want to stop no-support alert dialog, + //$.ws.wsSetup({nonosupportmsg:true}); +}; + + /* + //========================================================== + // Method + // Basic Method of this pulgin for Web Sockets + + $.conn( settings ) + + */ + $.extend($.ws ,{ + + conn : function( s ){ + + s = $.extend(true, s, $.extend(true, {}, $.ws.wsSettings, s)); + + if ("WebSocket" in window) { + + var url=s.url , + //WS Object + wsoj = new WebSocket( url ) , + data = s.data , + //Heartbeat + _MIN_HBINTERVAL=5000, + _INI_HBINTERVAL=60000, + hbtimer=null, + hbStr = (s.hbStr===null)?null:(typeof s.hbStr==='string')?s.hbStr:'Heartbeat', + hbinterval = (typeof s.hbinterval==='number')? + (s.hbinterval>=_MIN_HBINTERVAL)?s.hbinterval:_INI_HBINTERVAL + :_INI_HBINTERVAL; + + //WS Events bind + $(wsoj) + .bind("open",function(e){ + if(s.onopen){ s.onopen(e); } ; + if(s.hbStr!==null){ + hbtimer = setInterval(function(){ + $(wsoj).wssend(hbStr); + if(wsoj.onheartbeat){wsoj.onheartbeat(wsoj)} + }, hbinterval); + } + }) + .bind("message",function(e){ + if(s.onmessage){ + s.onmessage( + e.originalEvent.data + .replace(//g, ""), + wsoj + ); + } + }) + .bind("close",function(){ + if(s.onclose){ + s.onclose(); + } + if(hbtimer) { + clearInterval(hbtimer); + hbtimer = null; + } + wsoj=null; + }); + + //Add Event to only Instance for on after Hertbeat + if(s.hbStr!==null){ + wsoj.onheartbeat=function(woj){ + s.onheartbeat(woj); + } + } + + //WS send + $(wsoj).wssend(data); + + //WS auto cloase + $(window) + .bind("unload",function(e){ + wsoj.close();wsoj=null; + }); + + return wsoj; + + } else { + //no support, message once. + if(!$.ws.nosupport){ + if(!s.nonosupportmsg) + alert("no support, please use Chrome4 (v 4.0.238.0 +) or \n Safari nightly"); + $.ws.nosupport=true; + } + } + } + + }); + + /* + //========================================================== + // Method + // Sub Methods for Web Sockets + + $(Selectors).wsload( url, data, fn ) + $(Selectors).wssend(data) + $(Selectors).wsclose() + + */ + $.fn.extend({ + + //like $(Selectors).load() Some codes from jQuery1.3.2 + wsload : function( url, data, fn ){ + + var off = url.indexOf(" "); + if ( off >= 0 ) { + var selector = url.slice(off, url.length); + url = url.slice(0, off); + } + + if ( data ) + if ( $.isFunction( data ) ) { + fn = data; + data = null; + } else if( typeof data === "object" ) { + data = $.param( data ); + } + var self = this; + + $.ws.conn({ + url : url, + data : data, + onmessage : function(msg, wsoj){ + if ( wsoj.readyState == wsoj.OPEN ) + self.html( selector ? + $("
    ") + .append(msg) + .find(selector) : + msg ); + + if( fn ) + self.each( fn, [msg, wsoj.readyState, wsoj] ); + } + }); + + return this; + }, + + //Send to WS Server $(webSocketOj).wssend(data) + wssend : function(data){ + var oj=this[0]; + if(typeof oj!=="object" && oj.toString()!=="[object WebSocket]"){return this;} + if(data){ + oj.send(data); + } + return this; + }, + + //Close Web Sockets + wsclose : function(){ + var oj=this[0]; + if(typeof oj!=="object" && oj.toString()!=="[object WebSocket]"){return this;} + oj.close(); + oj=null; + return this; + } + }); + +})(jQuery) \ No newline at end of file diff --git a/static/js/onepage.js b/static/js/onepage.js new file mode 100644 index 0000000..c1f3ad6 --- /dev/null +++ b/static/js/onepage.js @@ -0,0 +1,5 @@ +function setupOnePage() { + sh_highlightDocument('/js/sh_lang/', '.min.js') + + centerSlides($("#slides > .slide")) +} \ No newline at end of file diff --git a/static/js/sh_lang/sh_bison.min.js b/static/js/sh_lang/sh_bison.min.js new file mode 100644 index 0000000..183c884 --- /dev/null +++ b/static/js/sh_lang/sh_bison.min.js @@ -0,0 +1 @@ +if(!this.sh_languages){this.sh_languages={}}sh_languages.bison=[[[/^%\{/g,"sh_preproc",1,1],[/^%[sx]/g,"sh_preproc",16,1],[/^%option/g,"sh_preproc",17,1],[/^%(?:array|pointer|[aceknopr])/g,"sh_preproc",-1],[/[A-Za-z_][A-Za-z0-9_-]*/g,"sh_preproc",19,1],[/^%%/g,"sh_preproc",20,1]],[[/^%\}/g,"sh_preproc",-2],[/(\b(?:class|struct|typename))([ \t]+)([A-Za-z0-9_]+)/g,["sh_keyword","sh_normal","sh_classname"],-1],[/\b(?:class|const_cast|delete|dynamic_cast|explicit|false|friend|inline|mutable|namespace|new|operator|private|protected|public|reinterpret_cast|static_cast|template|this|throw|true|try|typeid|typename|using|virtual)\b/g,"sh_keyword",-1],[/\/\/\//g,"sh_comment",2],[/\/\//g,"sh_comment",8],[/\/\*\*/g,"sh_comment",9],[/\/\*/g,"sh_comment",10],[/(\bstruct)([ \t]+)([A-Za-z0-9_]+)/g,["sh_keyword","sh_normal","sh_classname"],-1],[/^[ \t]*#(?:[ \t]*include)/g,"sh_preproc",11,1],[/^[ \t]*#(?:[ \t]*[A-Za-z0-9_]*)/g,"sh_preproc",-1],[/\b[+-]?(?:(?:0x[A-Fa-f0-9]+)|(?:(?:[\d]*\.)?[\d]+(?:[eE][+-]?[\d]+)?))u?(?:(?:int(?:8|16|32|64))|L)?\b/g,"sh_number",-1],[/"/g,"sh_string",14],[/'/g,"sh_string",15],[/\b(?:__asm|__cdecl|__declspec|__export|__far16|__fastcall|__fortran|__import|__pascal|__rtti|__stdcall|_asm|_cdecl|__except|_export|_far16|_fastcall|__finally|_fortran|_import|_pascal|_stdcall|__thread|__try|asm|auto|break|case|catch|cdecl|const|continue|default|do|else|enum|extern|for|goto|if|pascal|register|return|sizeof|static|struct|switch|typedef|union|volatile|while)\b/g,"sh_keyword",-1],[/\b(?:bool|char|double|float|int|long|short|signed|unsigned|void|wchar_t)\b/g,"sh_type",-1],[/~|!|%|\^|\*|\(|\)|-|\+|=|\[|\]|\\|:|;|,|\.|\/|\?|&|<|>|\|/g,"sh_symbol",-1],[/\{|\}/g,"sh_cbracket",-1],[/(?:[A-Za-z]|_)[A-Za-z0-9_]*(?=[ \t]*\()/g,"sh_function",-1],[/([A-Za-z](?:[^`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\s]|[_])*)((?:<.*>)?)(\s+(?=[*&]*[A-Za-z][^`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\s]*\s*[`~!@#$%&*()_=+{}|;:",<.>\/?'\\[\]\^\-\[\]]+))/g,["sh_usertype","sh_usertype","sh_normal"],-1]],[[/$/g,null,-2],[/(?:?)|(?:?)/g,"sh_url",-1],[/<\?xml/g,"sh_preproc",3,1],[//g,"sh_keyword",-1],[/<(?:\/)?[A-Za-z](?:[A-Za-z0-9_:.-]*)/g,"sh_keyword",7,1],[/&(?:[A-Za-z0-9]+);/g,"sh_preproc",-1],[/<(?:\/)?[A-Za-z][A-Za-z0-9]*(?:\/)?>/g,"sh_keyword",-1],[/<(?:\/)?[A-Za-z][A-Za-z0-9]*/g,"sh_keyword",7,1],[/@[A-Za-z]+/g,"sh_type",-1],[/(?:TODO|FIXME|BUG)(?:[:]?)/g,"sh_todo",-1]],[[/\?>/g,"sh_preproc",-2],[/([^=" \t>]+)([ \t]*)(=?)/g,["sh_type","sh_normal","sh_symbol"],-1],[/"/g,"sh_string",4]],[[/\\(?:\\|")/g,null,-1],[/"/g,"sh_string",-2]],[[/>/g,"sh_preproc",-2],[/([^=" \t>]+)([ \t]*)(=?)/g,["sh_type","sh_normal","sh_symbol"],-1],[/"/g,"sh_string",4]],[[/-->/g,"sh_comment",-2],[//g,"sh_comment",-2],[//g,"sh_comment",-2],[//g,"sh_comment",-2],[//g,"sh_comment",-2],[//g,"sh_comment",-2],[//g,"sh_comment",-2],[//g,"sh_comment",-2],[//g,"sh_comment",-2],[//g,"sh_comment",-2],[//g,"sh_comment",-2],[//g,"sh_comment",-2],[//g,"sh_comment",-2],[//g,"sh_comment",-2],[//g,"sh_comment",-2],[//g,"sh_comment",-2],[//g,"sh_comment",-2],[//g,"sh_comment",-2],[/