├── .gitignore ├── CHANGELOG.md ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── README.md ├── Rakefile ├── jquery-rails.gemspec ├── lib ├── generators │ └── jquery │ │ └── install │ │ └── install_generator.rb ├── jquery-rails.rb └── jquery │ ├── assert_select.rb │ ├── rails.rb │ └── rails │ ├── engine.rb │ └── version.rb └── vendor └── assets └── javascripts ├── jquery-ui.js ├── jquery-ui.min.js ├── jquery.js ├── jquery.min.js └── jquery_ujs.js /.gitignore: -------------------------------------------------------------------------------- 1 | pkg/* 2 | tmp 3 | spec/support/*/Gemfile.lock 4 | spec/support/*/public/javascripts 5 | .rvmrc 6 | .bundle 7 | imports/* 8 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 2.0.2 (03 April 2012) 2 | 3 | - Updated to jQuery 1.7.2 4 | - Updated to jQuery UI 1.8.18 5 | - Updated to latest jquery-ujs 6 | - Override provided for obtaining `href` 7 | - Edit `crossDomain` and `dataType` from `ajax:before` event 8 | 9 | ## 2.0.1 (28 February 2012) 10 | 11 | - Fixed Rails 3.2 dependency issue 12 | 13 | ## 2.0 (20 December 2011) 14 | 15 | - Minimum dependency set to Rails 3.2 16 | 17 | ## 1.0.19 (26 November 2011) 18 | 19 | - Updated to jQuery 1.7.1 20 | - Updated to latest jquery-ujs 21 | - Fixed disabled links to re-enable when `ajax:before` or 22 | `ajax:beforeSend` are canceled 23 | - Switched from deprecated `live` to `delegate` 24 | 25 | ## 1.0.18 (18 November 2011) 26 | 27 | - Updated to latest jquery-ujs 28 | - Fixed event parameter for form submit event handlers in IE for 29 | jQuery 1.6.x 30 | - Fixed form submit event handlers for jQuery 1.7 31 | 32 | ## 1.0.17 (9 November 2011) 33 | 34 | - Updated to jQuery 1.7 35 | - Updated to latest jquery-ujs 36 | - Moved file comment above function so it won't be included in 37 | compressed version 38 | 39 | ## 1.0.16 (12 October 2011) 40 | 41 | - Updated to jQuery 1.6.4 42 | - Updated to jQuery UI 1.8.16 43 | 44 | ## 1.0.15 (12 October 2011) 45 | 46 | - Updated to latest jquery-ujs 47 | - Fixed formInputClickSelector `button[type]` for IE7 48 | - Copy target attribute to generated form for `a[data-method]` links 49 | - Return true (abort ajax) for ctrl- and meta-clicks on remote links 50 | - Use jQuery `.prop()` for disabling/enabling elements 51 | 52 | ## 1.0.14 (08 September 2011) 53 | 54 | - Updated to latest jquery-ujs 55 | - Added `disable-with` support for links 56 | - minor bug fixes 57 | - Added `data-remote` support for change events of all input types 58 | - Added install generator for Rails 3.1 with instructional message 59 | 60 | ## 1.0.13 (11 August 2011) 61 | 62 | - Updated to latest jquery-ujs with `novalidate` support 63 | - No more support for jquery older than v1.6 64 | 65 | ## 1.0.12 (23 June 2011) 66 | 67 | - Updated to latest jquery-ujs with 'blank form action' and 68 | data-remote support for select elements 69 | 70 | ## 1.0.11 (15 June 2011) 71 | 72 | - Updated to latest jqueyr-ujs with cross-domain support 73 | 74 | [See jquery-ujs issue 167](https://github.com/rails/jquery-ujs/pull/167) for relevant discussion 75 | 76 | ## 1.0.10 (13 June 2011) 77 | 78 | - Updated to latest jqueyr-ujs with bug fixes 79 | 80 | ## 1.0.9 (25 May 2011) 81 | 82 | - Merged with new rails repo (3.1 fix) 83 | 84 | ## 1.0.8 (25 May 2011) 85 | 86 | - Updated to latest jquery-ujs with `[disabled][required]` fix 87 | 88 | ## 1.0.7 (21 May 2011) 89 | 90 | - Fix assert_select_jquery's bad call to unescape_rjs 91 | 92 | ## 1.0.6 (21 May 2011) 93 | 94 | - Updated to latest jquery-ujs with `data-params` support 95 | 96 | ## 1.0.5 (17 May 2011) 97 | 98 | - Updated to latest jquery-ujs 99 | - Remove old rails.js in Rails 3.0 generator 100 | 101 | ## 1.0.4 (17 May 2011) 102 | 103 | - Fix exception in Rails 3.0 generator 104 | 105 | ## 1.0.3 (17 May 2011) 106 | 107 | - Update to jQuery 1.6.1 108 | - Remove useless --version generator option 109 | 110 | ## 1.0.2 (12 May 2011) 111 | 112 | - Fix Rails 3.0 now that rails.js is named jquery_ujs.js 113 | 114 | ## 1.0.1 (10 May 2011) 115 | 116 | - Stop downloading rails.js from GitHub 117 | - Vendor jQuery UI for those who want it 118 | - Fix assert_select_jquery now that Rails 3.1 has no RJS at all 119 | - Fix rails dependency to just be railties 120 | 121 | ## 1.0.rc (3 May 2011) 122 | 123 | - Rails 3.1 asset pipeline edition 124 | - Removes generators and railties 125 | - Just provides jquery.js and jquery_ujs.js 126 | - Still compatible with Rails 3.0 via the old generator code 127 | 128 | ## 0.2.7 (5 February 2011) 129 | 130 | - Updated to use jQuery 1.5 by default 131 | 132 | ## 0.2.6 (1 December 2010) 133 | 134 | Feature: 135 | 136 | - Updated to use jQuery 1.4.4 by default 137 | 138 | ## 0.2.5 (4 November 2010) 139 | 140 | Bugfix: 141 | 142 | - Download JQuery Rails UJS via HTTPS since Github is now HTTPS only 143 | 144 | ## 0.2.4 (16 October 2010) 145 | 146 | Features: 147 | 148 | - Updated to use the new jQuery 1.4.3 by default, with the IE .live() bug fixed 149 | - Always download the newest 1.x release of jQuery UI 150 | - Try to install unknown versions of jQuery, with fallback to the default 151 | - Print informative messages in the correct Generator style 152 | 153 | ## 0.2.3 (13 October 2010) 154 | 155 | Features: 156 | 157 | - Support Edge Rails 3.1 by depending on Rails ~>3.0 158 | - Add Sam Ruby's assert_select_jquery test helper method 159 | - Use jquery.min only in production (and not in the test env) 160 | 161 | ## 0.2.2 (8 October 2010) 162 | 163 | Feature: 164 | 165 | - Depend on Rails >=3.0 && <4.0 for edge Rails compatibility 166 | 167 | ## 0.2.1 (2 October 2010) 168 | 169 | Bugfix: 170 | 171 | - Default to jQuery 1.4.1 as recommended by jQuery-ujs 172 | due to a bug in 1.4.2 (http://jsbin.com/uboxu3/7/) 173 | 174 | ## 0.2 (2 October 2010) 175 | 176 | Features: 177 | 178 | - Allow specifying which version of jQuery to install 179 | - Add generator tests (thanks, Louis T.) 180 | - Automatically use non-minified JS in development mode 181 | 182 | ## 0.1.3 (16 September 2010) 183 | 184 | Bugfix: 185 | 186 | - allow javascript :defaults tag to be overridden 187 | 188 | ## 0.1.2 (18 August 2010) 189 | 190 | Bugfix: 191 | 192 | - check for jQueryUI in the right place 193 | 194 | ## 0.1.1 (16 August 2010) 195 | 196 | Bugfix: 197 | 198 | - fix generator by resolving namespace conflict between Jquery::Rails and ::Rails 199 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source :gemcutter 2 | 3 | # Specify your gem's dependencies in jquery-rails.gemspec 4 | gemspec 5 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | PATH 2 | remote: . 3 | specs: 4 | jquery-rails (2.0.0) 5 | railties (>= 3.2.0, < 5.0) 6 | thor (~> 0.14) 7 | 8 | GEM 9 | remote: http://rubygems.org/ 10 | specs: 11 | actionpack (3.2.1) 12 | activemodel (= 3.2.1) 13 | activesupport (= 3.2.1) 14 | builder (~> 3.0.0) 15 | erubis (~> 2.7.0) 16 | journey (~> 1.0.1) 17 | rack (~> 1.4.0) 18 | rack-cache (~> 1.1) 19 | rack-test (~> 0.6.1) 20 | sprockets (~> 2.1.2) 21 | activemodel (3.2.1) 22 | activesupport (= 3.2.1) 23 | builder (~> 3.0.0) 24 | activesupport (3.2.1) 25 | i18n (~> 0.6) 26 | multi_json (~> 1.0) 27 | builder (3.0.0) 28 | erubis (2.7.0) 29 | hike (1.2.1) 30 | i18n (0.6.0) 31 | journey (1.0.3) 32 | json (1.6.5) 33 | multi_json (1.1.0) 34 | rack (1.4.1) 35 | rack-cache (1.1) 36 | rack (>= 0.4) 37 | rack-ssl (1.3.2) 38 | rack 39 | rack-test (0.6.1) 40 | rack (>= 1.0) 41 | railties (3.2.1) 42 | actionpack (= 3.2.1) 43 | activesupport (= 3.2.1) 44 | rack-ssl (~> 1.3.2) 45 | rake (>= 0.8.7) 46 | rdoc (~> 3.4) 47 | thor (~> 0.14.6) 48 | rake (0.9.2.2) 49 | rdoc (3.12) 50 | json (~> 1.4) 51 | sprockets (2.1.2) 52 | hike (~> 1.2) 53 | rack (~> 1.0) 54 | tilt (~> 1.1, != 1.3.0) 55 | thor (0.14.6) 56 | tilt (1.3.3) 57 | 58 | PLATFORMS 59 | ruby 60 | 61 | DEPENDENCIES 62 | jquery-rails! 63 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2010 Andre Arko 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # jquery-rails 2 | 3 | jQuery! For Rails! So great. 4 | 5 | This gem provides: 6 | 7 | * jQuery 1.7.2 8 | * jQuery UI 1.8.18 (javascript only) 9 | * the jQuery UJS adapter 10 | * assert_select_jquery to test jQuery responses in Ruby tests 11 | 12 | ## Installation 13 | 14 | Apps generated with Rails 3.1 or later include jquery-rails in the Gemfile by default. So just make a new app: 15 | 16 | ```sh 17 | rails new myapp 18 | ``` 19 | 20 | If upgrading from an older version of rails, or for rails 3.0 apps, 21 | add the jquery-rails gem to your Gemfile. 22 | 23 | ```ruby 24 | gem "jquery-rails" 25 | ``` 26 | 27 | And run `bundle install`. The rest of the installation depends on 28 | whether the asset pipeline is being used. 29 | 30 | ### Rails 3.1 or greater (with asset pipeline *enabled*) 31 | 32 | The jquery and jquery-ujs files will be added to the asset pipeline and available for you to use. If they're not already in `app/assets/javascripts/application.js` by default, add these lines: 33 | 34 | ```js 35 | //= require jquery 36 | //= require jquery_ujs 37 | ``` 38 | 39 | For jQuery UI, we recommend the [jquery-ui-rails](https://github.com/joliss/jquery-ui-rails) gem, as it includes the jquery-ui css and allows easier customization. This gem still packages the jQuery UI javascript for compatibility. To use it, add the following line to your `application.js`: 40 | 41 | ```js 42 | //= require jquery-ui 43 | ``` 44 | 45 | In order to use the themed parts of jQuery UI, you will also need to supply [your own theme CSS](http://jqueryui.com) (or use the jquery-ui-rails gem mentioned above). 46 | 47 | ### Rails 3.0 (or greater with asset pipeline *disabled*) 48 | 49 | This gem adds a single generator: `jquery:install`. Running the generator will remove any Prototype JS files you may happen to have, and copy jQuery and the jQuery-ujs driver for Rails (and optionally, jQuery UI) to the `public/javascripts` directory. 50 | 51 | This gem will also hook into the Rails configuration process, removing Prototype and adding jQuery to the javascript files included by the `javascript_include_tag(:defaults)` call. While this gem contains the minified and un-minified versions of jQuery and jQuery UI, only the minified versions are included in `:defaults`. 52 | 53 | To invoke the generator, run: 54 | 55 | ```sh 56 | rails generate jquery:install #--ui to enable jQuery UI 57 | ``` 58 | 59 | You're done! 60 | 61 | ## Contributing 62 | 63 | Feel free to open an issue ticket if you find something that could be improved. A couple notes: 64 | 65 | * If it's an issue pertaining to the jquery-ujs javascript, please report it to the [jquery-ujs project](https://github.com/rails/jquery-ujs). 66 | 67 | * If the jquery or jquery-ui scripts are outdated (i.e. maybe a new version of jquery was released yesterday), feel free to open an issue and prod us to get that thing updated. However, for security reasons, we won't be accepting pull requests with updated jquery or jquery-ui scripts. 68 | 69 | ## Acknowledgements 70 | 71 | Many thanks are due to all of [the jquery-rails contributors](https://github.com/rails/jquery-rails/graphs/contributors). Special thanks to [JangoSteve](http://github.com/JangoSteve) for tirelessly answering questions and accepting patches, and the [Rails Core Team](https://github.com/organizations/rails/teams/617) for making jquery-rails an official part of Rails 3.1. 72 | 73 | Copyright [André Arko](http://arko.net), released under the MIT License. 74 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require 'bundler' 2 | Bundler::GemHelper.install_tasks 3 | -------------------------------------------------------------------------------- /jquery-rails.gemspec: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | require File.expand_path('../lib/jquery/rails/version', __FILE__) 3 | 4 | Gem::Specification.new do |s| 5 | s.name = "jquery-rails" 6 | s.version = Jquery::Rails::VERSION 7 | s.platform = Gem::Platform::RUBY 8 | s.authors = ["André Arko"] 9 | s.email = ["andre@arko.net"] 10 | s.homepage = "http://rubygems.org/gems/jquery-rails" 11 | s.summary = "Use jQuery with Rails 3" 12 | s.description = "This gem provides jQuery and the jQuery-ujs driver for your Rails 3 application." 13 | 14 | s.required_rubygems_version = ">= 1.3.6" 15 | s.rubyforge_project = "jquery-rails" 16 | 17 | s.add_dependency "railties", ">= 3.2.0", "< 5.0" 18 | s.add_dependency "thor", "~> 0.14" 19 | 20 | s.files = `git ls-files`.split("\n") 21 | s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) } 22 | s.require_path = 'lib' 23 | end 24 | -------------------------------------------------------------------------------- /lib/generators/jquery/install/install_generator.rb: -------------------------------------------------------------------------------- 1 | require 'rails' 2 | 3 | # Supply generator for Rails 3.0.x or if asset pipeline is not enabled 4 | if ::Rails.version < "3.1" || !::Rails.application.config.assets.enabled 5 | module Jquery 6 | module Generators 7 | class InstallGenerator < ::Rails::Generators::Base 8 | 9 | desc "This generator installs jQuery #{Jquery::Rails::JQUERY_VERSION}, jQuery-ujs, and (optionally) jQuery UI #{Jquery::Rails::JQUERY_UI_VERSION}" 10 | class_option :ui, :type => :boolean, :default => false, :desc => "Include jQueryUI" 11 | source_root File.expand_path('../../../../../vendor/assets/javascripts', __FILE__) 12 | 13 | def remove_prototype 14 | Rails::PROTOTYPE_JS.each do |name| 15 | remove_file "public/javascripts/#{name}.js" 16 | end 17 | end 18 | 19 | def copy_jquery 20 | say_status("copying", "jQuery (#{Jquery::Rails::JQUERY_VERSION})", :green) 21 | copy_file "jquery.js", "public/javascripts/jquery.js" 22 | copy_file "jquery.min.js", "public/javascripts/jquery.min.js" 23 | end 24 | 25 | def copy_jquery_ui 26 | if options.ui? 27 | say_status("copying", "jQuery UI (#{Jquery::Rails::JQUERY_UI_VERSION})", :green) 28 | copy_file "jquery-ui.js", "public/javascripts/jquery-ui.js" 29 | copy_file "jquery-ui.min.js", "public/javascripts/jquery-ui.min.js" 30 | end 31 | end 32 | 33 | def copy_ujs_driver 34 | say_status("copying", "jQuery UJS adapter (#{Jquery::Rails::JQUERY_UJS_VERSION[0..5]})", :green) 35 | remove_file "public/javascripts/rails.js" 36 | copy_file "jquery_ujs.js", "public/javascripts/jquery_ujs.js" 37 | end 38 | 39 | end 40 | end 41 | end 42 | else 43 | module Jquery 44 | module Generators 45 | class InstallGenerator < ::Rails::Generators::Base 46 | desc "Just show instructions so people will know what to do when mistakenly using generator for Rails 3.1 apps" 47 | 48 | def do_nothing 49 | say_status("deprecated", "You are using Rails 3.1 with the asset pipeline enabled, so this generator is not needed.") 50 | say_status("", "The necessary files are already in your asset pipeline.") 51 | say_status("", "Just add `//= require jquery` and `//= require jquery_ujs` to your app/assets/javascripts/application.js") 52 | say_status("", "If you upgraded your app from Rails 3.0 and still have jquery.js, rails.js, or jquery_ujs.js in your javascripts, be sure to remove them.") 53 | say_status("", "If you do not want the asset pipeline enabled, you may turn it off in application.rb and re-run this generator.") 54 | # ok, nothing 55 | end 56 | end 57 | end 58 | end 59 | end 60 | -------------------------------------------------------------------------------- /lib/jquery-rails.rb: -------------------------------------------------------------------------------- 1 | require 'jquery/rails' -------------------------------------------------------------------------------- /lib/jquery/assert_select.rb: -------------------------------------------------------------------------------- 1 | module ActionDispatch 2 | module Assertions 3 | module SelectorAssertions 4 | # Selects content from a JQuery response. Patterned loosely on 5 | # assert_select_rjs. 6 | # 7 | # === Narrowing down 8 | # 9 | # With no arguments, asserts that one or more method calls are made. 10 | # 11 | # Use the +method+ argument to narrow down the assertion to only 12 | # statements that call that specific method. 13 | # 14 | # Use the +opt+ argument to narrow down the assertion to only statements 15 | # that pass +opt+ as the first argument. 16 | # 17 | # Use the +id+ argument to narrow down the assertion to only statements 18 | # that invoke methods on the result of using that identifier as a 19 | # selector. 20 | # 21 | # === Using blocks 22 | # 23 | # Without a block, +assert_select_jquery_ merely asserts that the 24 | # response contains one or more statements that match the conditions 25 | # specified above 26 | # 27 | # With a block +assert_select_jquery_ also asserts that the method call 28 | # passes a javascript escaped string containing HTML. All such HTML 29 | # fragments are selected and passed to the block. Nested assertions are 30 | # supported. 31 | # 32 | # === Examples 33 | # 34 | # # asserts that the #notice element is hidden 35 | # assert_select :hide, '#notice' 36 | # 37 | # # asserts that the #cart element is shown with a blind parameter 38 | # assert_select :show, :blind, '#cart' 39 | # 40 | # # asserts that #cart content contains a #current_item 41 | # assert_select :html, '#cart' do 42 | # assert_select '#current_item' 43 | # end 44 | 45 | PATTERN_HTML = "\"((\\\\\"|[^\"])*)\"" 46 | PATTERN_UNICODE_ESCAPED_CHAR = /\\u([0-9a-zA-Z]{4})/ 47 | 48 | def assert_select_jquery(*args, &block) 49 | jquery_method = args.first.is_a?(Symbol) ? args.shift : nil 50 | jquery_opt = args.first.is_a?(Symbol) ? args.shift : nil 51 | id = args.first.is_a?(String) ? args.shift : nil 52 | 53 | pattern = "\\.#{jquery_method || '\\w+'}\\(" 54 | pattern = "#{pattern}['\"]#{jquery_opt}['\"],?\\s*" if jquery_opt 55 | pattern = "#{pattern}#{PATTERN_HTML}" 56 | pattern = "(?:jQuery|\\$)\\(['\"]#{id}['\"]\\)#{pattern}" if id 57 | 58 | fragments = [] 59 | response.body.scan(Regexp.new(pattern)).each do |match| 60 | doc = HTML::Document.new(unescape_js(match.first)) 61 | doc.root.children.each do |child| 62 | fragments.push child if child.tag? 63 | end 64 | end 65 | 66 | if fragments.empty? 67 | opts = [jquery_method, jquery_opt, id].compact 68 | flunk "No JQuery call matches #{opts.inspect}" 69 | end 70 | 71 | if block 72 | begin 73 | in_scope, @selected = @selected, fragments 74 | yield 75 | ensure 76 | @selected = in_scope 77 | end 78 | end 79 | end 80 | 81 | private 82 | 83 | # Unescapes a JS string. 84 | def unescape_js(js_string) 85 | # js encodes double quotes and line breaks. 86 | unescaped= js_string.gsub('\"', '"') 87 | unescaped.gsub!('\\\'', "'") 88 | unescaped.gsub!(/\\\//, '/') 89 | unescaped.gsub!('\n', "\n") 90 | unescaped.gsub!('\076', '>') 91 | unescaped.gsub!('\074', '<') 92 | # js encodes non-ascii characters. 93 | unescaped.gsub!(PATTERN_UNICODE_ESCAPED_CHAR) {|u| [$1.hex].pack('U*')} 94 | unescaped 95 | end 96 | 97 | end 98 | end 99 | end 100 | -------------------------------------------------------------------------------- /lib/jquery/rails.rb: -------------------------------------------------------------------------------- 1 | require 'jquery/rails/engine' 2 | require 'jquery/rails/version' 3 | 4 | module Jquery 5 | module Rails 6 | PROTOTYPE_JS = %w{prototype effects dragdrop controls} 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /lib/jquery/rails/engine.rb: -------------------------------------------------------------------------------- 1 | require "jquery/assert_select" if ::Rails.env.test? 2 | 3 | module Jquery 4 | module Rails 5 | class Engine < ::Rails::Engine 6 | end 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /lib/jquery/rails/version.rb: -------------------------------------------------------------------------------- 1 | module Jquery 2 | module Rails 3 | VERSION = "2.0.2" 4 | JQUERY_VERSION = "1.7.2" 5 | JQUERY_UI_VERSION = "1.8.18" 6 | JQUERY_UJS_VERSION = "caabad7f7ba6c35de1588ea263295ed5bc166a43" 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /vendor/assets/javascripts/jquery.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v1.7.2 jquery.com | jquery.org/license */ 2 | (function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+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(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( 3 | a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f 4 | .clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); -------------------------------------------------------------------------------- /vendor/assets/javascripts/jquery_ujs.js: -------------------------------------------------------------------------------- 1 | (function($, undefined) { 2 | 3 | /** 4 | * Unobtrusive scripting adapter for jQuery 5 | * 6 | * Requires jQuery 1.6.0 or later. 7 | * https://github.com/rails/jquery-ujs 8 | 9 | * Uploading file using rails.js 10 | * ============================= 11 | * 12 | * By default, browsers do not allow files to be uploaded via AJAX. As a result, if there are any non-blank file fields 13 | * in the remote form, this adapter aborts the AJAX submission and allows the form to submit through standard means. 14 | * 15 | * The `ajax:aborted:file` event allows you to bind your own handler to process the form submission however you wish. 16 | * 17 | * Ex: 18 | * $('form').live('ajax:aborted:file', function(event, elements){ 19 | * // Implement own remote file-transfer handler here for non-blank file inputs passed in `elements`. 20 | * // Returning false in this handler tells rails.js to disallow standard form submission 21 | * return false; 22 | * }); 23 | * 24 | * The `ajax:aborted:file` event is fired when a file-type input is detected with a non-blank value. 25 | * 26 | * Third-party tools can use this hook to detect when an AJAX file upload is attempted, and then use 27 | * techniques like the iframe method to upload the file instead. 28 | * 29 | * Required fields in rails.js 30 | * =========================== 31 | * 32 | * If any blank required inputs (required="required") are detected in the remote form, the whole form submission 33 | * is canceled. Note that this is unlike file inputs, which still allow standard (non-AJAX) form submission. 34 | * 35 | * The `ajax:aborted:required` event allows you to bind your own handler to inform the user of blank required inputs. 36 | * 37 | * !! Note that Opera does not fire the form's submit event if there are blank required inputs, so this event may never 38 | * get fired in Opera. This event is what causes other browsers to exhibit the same submit-aborting behavior. 39 | * 40 | * Ex: 41 | * $('form').live('ajax:aborted:required', function(event, elements){ 42 | * // Returning false in this handler tells rails.js to submit the form anyway. 43 | * // The blank required inputs are passed to this function in `elements`. 44 | * return ! confirm("Would you like to submit the form with missing info?"); 45 | * }); 46 | */ 47 | 48 | // Shorthand to make it a little easier to call public rails functions from within rails.js 49 | var rails; 50 | 51 | $.rails = rails = { 52 | // Link elements bound by jquery-ujs 53 | linkClickSelector: 'a[data-confirm], a[data-method], a[data-remote], a[data-disable-with]', 54 | 55 | // Select elements bound by jquery-ujs 56 | inputChangeSelector: 'select[data-remote], input[data-remote], textarea[data-remote]', 57 | 58 | // Form elements bound by jquery-ujs 59 | formSubmitSelector: 'form', 60 | 61 | // Form input elements bound by jquery-ujs 62 | formInputClickSelector: 'form input[type=submit], form input[type=image], form button[type=submit], form button:not(button[type])', 63 | 64 | // Form input elements disabled during form submission 65 | disableSelector: 'input[data-disable-with], button[data-disable-with], textarea[data-disable-with]', 66 | 67 | // Form input elements re-enabled after form submission 68 | enableSelector: 'input[data-disable-with]:disabled, button[data-disable-with]:disabled, textarea[data-disable-with]:disabled', 69 | 70 | // Form required input elements 71 | requiredInputSelector: 'input[name][required]:not([disabled]),textarea[name][required]:not([disabled])', 72 | 73 | // Form file input elements 74 | fileInputSelector: 'input:file', 75 | 76 | // Link onClick disable selector with possible reenable after remote submission 77 | linkDisableSelector: 'a[data-disable-with]', 78 | 79 | // Make sure that every Ajax request sends the CSRF token 80 | CSRFProtection: function(xhr) { 81 | var token = $('meta[name="csrf-token"]').attr('content'); 82 | if (token) xhr.setRequestHeader('X-CSRF-Token', token); 83 | }, 84 | 85 | // Triggers an event on an element and returns false if the event result is false 86 | fire: function(obj, name, data) { 87 | var event = $.Event(name); 88 | obj.trigger(event, data); 89 | return event.result !== false; 90 | }, 91 | 92 | // Default confirm dialog, may be overridden with custom confirm dialog in $.rails.confirm 93 | confirm: function(message) { 94 | return confirm(message); 95 | }, 96 | 97 | // Default ajax function, may be overridden with custom function in $.rails.ajax 98 | ajax: function(options) { 99 | return $.ajax(options); 100 | }, 101 | 102 | // Default way to get an element's href. May be overridden at $.rails.href. 103 | href: function(element) { 104 | return element.attr('href'); 105 | }, 106 | 107 | // Submits "remote" forms and links with ajax 108 | handleRemote: function(element) { 109 | var method, url, data, crossDomain, dataType, options; 110 | 111 | if (rails.fire(element, 'ajax:before')) { 112 | crossDomain = element.data('cross-domain') || null; 113 | dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType); 114 | 115 | if (element.is('form')) { 116 | method = element.attr('method'); 117 | url = element.attr('action'); 118 | data = element.serializeArray(); 119 | // memoized value from clicked submit button 120 | var button = element.data('ujs:submit-button'); 121 | if (button) { 122 | data.push(button); 123 | element.data('ujs:submit-button', null); 124 | } 125 | } else if (element.is(rails.inputChangeSelector)) { 126 | method = element.data('method'); 127 | url = element.data('url'); 128 | data = element.serialize(); 129 | if (element.data('params')) data = data + "&" + element.data('params'); 130 | } else { 131 | method = element.data('method'); 132 | url = rails.href(element); 133 | data = element.data('params') || null; 134 | } 135 | 136 | options = { 137 | type: method || 'GET', data: data, dataType: dataType, crossDomain: crossDomain, 138 | // stopping the "ajax:beforeSend" event will cancel the ajax request 139 | beforeSend: function(xhr, settings) { 140 | if (settings.dataType === undefined) { 141 | xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script); 142 | } 143 | return rails.fire(element, 'ajax:beforeSend', [xhr, settings]); 144 | }, 145 | success: function(data, status, xhr) { 146 | element.trigger('ajax:success', [data, status, xhr]); 147 | }, 148 | complete: function(xhr, status) { 149 | element.trigger('ajax:complete', [xhr, status]); 150 | }, 151 | error: function(xhr, status, error) { 152 | element.trigger('ajax:error', [xhr, status, error]); 153 | } 154 | }; 155 | // Only pass url to `ajax` options if not blank 156 | if (url) { options.url = url; } 157 | 158 | return rails.ajax(options); 159 | } else { 160 | return false; 161 | } 162 | }, 163 | 164 | // Handles "data-method" on links such as: 165 | // Delete 166 | handleMethod: function(link) { 167 | var href = rails.href(link), 168 | method = link.data('method'), 169 | target = link.attr('target'), 170 | csrf_token = $('meta[name=csrf-token]').attr('content'), 171 | csrf_param = $('meta[name=csrf-param]').attr('content'), 172 | form = $('
'), 173 | metadata_input = ''; 174 | 175 | if (csrf_param !== undefined && csrf_token !== undefined) { 176 | metadata_input += ''; 177 | } 178 | 179 | if (target) { form.attr('target', target); } 180 | 181 | form.hide().append(metadata_input).appendTo('body'); 182 | form.submit(); 183 | }, 184 | 185 | /* Disables form elements: 186 | - Caches element value in 'ujs:enable-with' data store 187 | - Replaces element text with value of 'data-disable-with' attribute 188 | - Sets disabled property to true 189 | */ 190 | disableFormElements: function(form) { 191 | form.find(rails.disableSelector).each(function() { 192 | var element = $(this), method = element.is('button') ? 'html' : 'val'; 193 | element.data('ujs:enable-with', element[method]()); 194 | element[method](element.data('disable-with')); 195 | element.prop('disabled', true); 196 | }); 197 | }, 198 | 199 | /* Re-enables disabled form elements: 200 | - Replaces element text with cached value from 'ujs:enable-with' data store (created in `disableFormElements`) 201 | - Sets disabled property to false 202 | */ 203 | enableFormElements: function(form) { 204 | form.find(rails.enableSelector).each(function() { 205 | var element = $(this), method = element.is('button') ? 'html' : 'val'; 206 | if (element.data('ujs:enable-with')) element[method](element.data('ujs:enable-with')); 207 | element.prop('disabled', false); 208 | }); 209 | }, 210 | 211 | /* For 'data-confirm' attribute: 212 | - Fires `confirm` event 213 | - Shows the confirmation dialog 214 | - Fires the `confirm:complete` event 215 | 216 | Returns `true` if no function stops the chain and user chose yes; `false` otherwise. 217 | Attaching a handler to the element's `confirm` event that returns a `falsy` value cancels the confirmation dialog. 218 | Attaching a handler to the element's `confirm:complete` event that returns a `falsy` value makes this function 219 | return false. The `confirm:complete` event is fired whether or not the user answered true or false to the dialog. 220 | */ 221 | allowAction: function(element) { 222 | var message = element.data('confirm'), 223 | answer = false, callback; 224 | if (!message) { return true; } 225 | 226 | if (rails.fire(element, 'confirm')) { 227 | answer = rails.confirm(message); 228 | callback = rails.fire(element, 'confirm:complete', [answer]); 229 | } 230 | return answer && callback; 231 | }, 232 | 233 | // Helper function which checks for blank inputs in a form that match the specified CSS selector 234 | blankInputs: function(form, specifiedSelector, nonBlank) { 235 | var inputs = $(), input, 236 | selector = specifiedSelector || 'input,textarea'; 237 | form.find(selector).each(function() { 238 | input = $(this); 239 | // Collect non-blank inputs if nonBlank option is true, otherwise, collect blank inputs 240 | if (nonBlank ? input.val() : !input.val()) { 241 | inputs = inputs.add(input); 242 | } 243 | }); 244 | return inputs.length ? inputs : false; 245 | }, 246 | 247 | // Helper function which checks for non-blank inputs in a form that match the specified CSS selector 248 | nonBlankInputs: function(form, specifiedSelector) { 249 | return rails.blankInputs(form, specifiedSelector, true); // true specifies nonBlank 250 | }, 251 | 252 | // Helper function, needed to provide consistent behavior in IE 253 | stopEverything: function(e) { 254 | $(e.target).trigger('ujs:everythingStopped'); 255 | e.stopImmediatePropagation(); 256 | return false; 257 | }, 258 | 259 | // find all the submit events directly bound to the form and 260 | // manually invoke them. If anyone returns false then stop the loop 261 | callFormSubmitBindings: function(form, event) { 262 | var events = form.data('events'), continuePropagation = true; 263 | if (events !== undefined && events['submit'] !== undefined) { 264 | $.each(events['submit'], function(i, obj){ 265 | if (typeof obj.handler === 'function') return continuePropagation = obj.handler(event); 266 | }); 267 | } 268 | return continuePropagation; 269 | }, 270 | 271 | // replace element's html with the 'data-disable-with' after storing original html 272 | // and prevent clicking on it 273 | disableElement: function(element) { 274 | element.data('ujs:enable-with', element.html()); // store enabled state 275 | element.html(element.data('disable-with')); // set to disabled state 276 | element.bind('click.railsDisable', function(e) { // prevent further clicking 277 | return rails.stopEverything(e) 278 | }); 279 | }, 280 | 281 | // restore element to its original state which was disabled by 'disableElement' above 282 | enableElement: function(element) { 283 | if (element.data('ujs:enable-with') !== undefined) { 284 | element.html(element.data('ujs:enable-with')); // set to old enabled state 285 | // this should be element.removeData('ujs:enable-with') 286 | // but, there is currently a bug in jquery which makes hyphenated data attributes not get removed 287 | element.data('ujs:enable-with', false); // clean up cache 288 | } 289 | element.unbind('click.railsDisable'); // enable element 290 | } 291 | 292 | }; 293 | 294 | $.ajaxPrefilter(function(options, originalOptions, xhr){ if ( !options.crossDomain ) { rails.CSRFProtection(xhr); }}); 295 | 296 | $(document).delegate(rails.linkDisableSelector, 'ajax:complete', function() { 297 | rails.enableElement($(this)); 298 | }); 299 | 300 | $(document).delegate(rails.linkClickSelector, 'click.rails', function(e) { 301 | var link = $(this), method = link.data('method'), data = link.data('params'); 302 | if (!rails.allowAction(link)) return rails.stopEverything(e); 303 | 304 | if (link.is(rails.linkDisableSelector)) rails.disableElement(link); 305 | 306 | if (link.data('remote') !== undefined) { 307 | if ( (e.metaKey || e.ctrlKey) && (!method || method === 'GET') && !data ) { return true; } 308 | 309 | if (rails.handleRemote(link) === false) { rails.enableElement(link); } 310 | return false; 311 | 312 | } else if (link.data('method')) { 313 | rails.handleMethod(link); 314 | return false; 315 | } 316 | }); 317 | 318 | $(document).delegate(rails.inputChangeSelector, 'change.rails', function(e) { 319 | var link = $(this); 320 | if (!rails.allowAction(link)) return rails.stopEverything(e); 321 | 322 | rails.handleRemote(link); 323 | return false; 324 | }); 325 | 326 | $(document).delegate(rails.formSubmitSelector, 'submit.rails', function(e) { 327 | var form = $(this), 328 | remote = form.data('remote') !== undefined, 329 | blankRequiredInputs = rails.blankInputs(form, rails.requiredInputSelector), 330 | nonBlankFileInputs = rails.nonBlankInputs(form, rails.fileInputSelector); 331 | 332 | if (!rails.allowAction(form)) return rails.stopEverything(e); 333 | 334 | // skip other logic when required values are missing or file upload is present 335 | if (blankRequiredInputs && form.attr("novalidate") == undefined && rails.fire(form, 'ajax:aborted:required', [blankRequiredInputs])) { 336 | return rails.stopEverything(e); 337 | } 338 | 339 | if (remote) { 340 | if (nonBlankFileInputs) { 341 | return rails.fire(form, 'ajax:aborted:file', [nonBlankFileInputs]); 342 | } 343 | 344 | // If browser does not support submit bubbling, then this live-binding will be called before direct 345 | // bindings. Therefore, we should directly call any direct bindings before remotely submitting form. 346 | if (!$.support.submitBubbles && $().jquery < '1.7' && rails.callFormSubmitBindings(form, e) === false) return rails.stopEverything(e); 347 | 348 | rails.handleRemote(form); 349 | return false; 350 | 351 | } else { 352 | // slight timeout so that the submit button gets properly serialized 353 | setTimeout(function(){ rails.disableFormElements(form); }, 13); 354 | } 355 | }); 356 | 357 | $(document).delegate(rails.formInputClickSelector, 'click.rails', function(event) { 358 | var button = $(this); 359 | 360 | if (!rails.allowAction(button)) return rails.stopEverything(event); 361 | 362 | // register the pressed submit button 363 | var name = button.attr('name'), 364 | data = name ? {name:name, value:button.val()} : null; 365 | 366 | button.closest('form').data('ujs:submit-button', data); 367 | }); 368 | 369 | $(document).delegate(rails.formSubmitSelector, 'ajax:beforeSend.rails', function(event) { 370 | if (this == event.target) rails.disableFormElements($(this)); 371 | }); 372 | 373 | $(document).delegate(rails.formSubmitSelector, 'ajax:complete.rails', function(event) { 374 | if (this == event.target) rails.enableFormElements($(this)); 375 | }); 376 | 377 | })( jQuery ); 378 | --------------------------------------------------------------------------------