mizugumo 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/Gemfile.lock +15 -0
- data/README.rdoc +47 -8
- data/Rakefile +12 -3
- data/lib/generators/mizugumo/install/install_generator.rb +55 -18
- data/lib/generators/mizugumo/install/templates/disabled-javascripts/ns.min.js +109 -0
- data/lib/generators/mizugumo/install/templates/disabled-javascripts/rails.js +332 -0
- data/lib/generators/mizugumo/install/templates/javascripts/jquery-1.6.4.min.js +4 -0
- data/lib/generators/mizugumo/install/templates/javascripts/mizugumo.js +9 -0
- data/lib/generators/mizugumo/install/templates/javascripts/ninja_go.js +3 -0
- data/lib/generators/mizugumo/install/templates/javascripts/ninjascript.js +4566 -0
- data/lib/generators/rails/mizugumo/js_assets_generator.rb +26 -0
- data/lib/generators/rails/mizugumo/scaffold_controller_generator.rb +3 -0
- data/lib/generators/rails/mizugumo/view_generator.rb +15 -11
- data/lib/mizugumo.rb +5 -2
- data/lib/mizugumo_link_helper.rb +1 -1
- metadata +81 -91
- data/lib/generators/mizugumo/install/templates/javascripts/jquery-1.4.2.js +0 -6240
- data/lib/generators/mizugumo/install/templates/javascripts/jquery.ninja_script.js +0 -1172
- data/lib/generators/mizugumo/install/templates/javascripts/rails.js +0 -132
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
+
archive-tar-minitar (0.5.2)
|
5
|
+
columnize (0.3.4)
|
4
6
|
diff-lcs (1.1.2)
|
5
7
|
git (1.2.5)
|
6
8
|
haml (3.0.25)
|
@@ -8,6 +10,8 @@ GEM
|
|
8
10
|
bundler (~> 1.0.0)
|
9
11
|
git (>= 1.2.5)
|
10
12
|
rake
|
13
|
+
linecache19 (0.5.12)
|
14
|
+
ruby_core_source (>= 0.1.4)
|
11
15
|
rake (0.8.7)
|
12
16
|
rcov (0.9.9)
|
13
17
|
rspec (2.4.0)
|
@@ -18,6 +22,16 @@ GEM
|
|
18
22
|
rspec-expectations (2.4.0)
|
19
23
|
diff-lcs (~> 1.1.2)
|
20
24
|
rspec-mocks (2.4.0)
|
25
|
+
ruby-debug-base19 (0.11.25)
|
26
|
+
columnize (>= 0.3.1)
|
27
|
+
linecache19 (>= 0.5.11)
|
28
|
+
ruby_core_source (>= 0.1.4)
|
29
|
+
ruby-debug19 (0.11.6)
|
30
|
+
columnize (>= 0.3.1)
|
31
|
+
linecache19 (>= 0.5.11)
|
32
|
+
ruby-debug-base19 (>= 0.11.19)
|
33
|
+
ruby_core_source (0.1.5)
|
34
|
+
archive-tar-minitar (>= 0.5.2)
|
21
35
|
|
22
36
|
PLATFORMS
|
23
37
|
ruby
|
@@ -28,3 +42,4 @@ DEPENDENCIES
|
|
28
42
|
jeweler (~> 1.5.2)
|
29
43
|
rcov
|
30
44
|
rspec (>= 1.5)
|
45
|
+
ruby-debug19
|
data/README.rdoc
CHANGED
@@ -21,9 +21,6 @@ working. The installer will copy a jQuery-compatible version of rails.js that y
|
|
21
21
|
use instead if you depend on Rails' default (semi-obtrusive) approaches to AJAX,
|
22
22
|
link_to with :confirm =>'Are you sure?' and similar things working.
|
23
23
|
|
24
|
-
In addition, NinjaScript currently requires jQuery 1.4.2. It is NOT compatible with the current version of jQuery, 1.5.
|
25
|
-
We are eagerly working on a fix.
|
26
|
-
|
27
24
|
== Features
|
28
25
|
|
29
26
|
Mizugumo's main features are:
|
@@ -45,24 +42,37 @@ Second, install Mizugumo files:
|
|
45
42
|
|
46
43
|
rails generate mizugumo:install
|
47
44
|
|
48
|
-
|
45
|
+
The next step depends on whether you are running Rails 3.0.x or 3.1.x.
|
46
|
+
|
47
|
+
=== Rails 3.0.x
|
48
|
+
|
49
|
+
For 3.0.x, mizugumo will assume you are putting most of your application javascript code in public/javascripts/application.js. The installer will have created a Ninja.orders() block in which to place Ninjascript behavior. The last line of this block will be Ninja.go(), and that must remain the last line.
|
50
|
+
|
51
|
+
You will need to link to jQuery and NinjaScript in your application layout, and you may include the optional mizugumo.css. (a SASS version is installed to public/stylesheets/sass/mizugumo.sass).
|
49
52
|
|
50
|
-
|
53
|
+
Add these lines to your layout (in ERB):
|
54
|
+
|
55
|
+
<%= javascript_include_tag 'jquery-1.6.4.js' %>
|
51
56
|
<%= javascript_include_tag 'jquery.ninja_script.js' %>
|
52
57
|
<%= javascript_include_tag 'application.js' %>
|
53
|
-
<%= stylesheet_link_tag '
|
58
|
+
<%= stylesheet_link_tag 'mizugumo' %>
|
54
59
|
|
55
60
|
If using Haml, add these instead:
|
56
61
|
|
57
|
-
= javascript_include_tag 'jquery-1.4.
|
62
|
+
= javascript_include_tag 'jquery-1.6.4.js'
|
58
63
|
= javascript_include_tag 'jquery.ninja_script.js'
|
59
64
|
= javascript_include_tag 'application.js'
|
60
|
-
= stylesheet_link_tag '
|
65
|
+
= stylesheet_link_tag 'mizugumo'
|
61
66
|
|
62
67
|
NOTE: If you still have javascript_include_tag :defaults, you probably want to remove it.
|
63
68
|
Ninjascript is meant to work with jQuery, and we don't know what happens if you try to run it
|
64
69
|
side-by-side with Prototype.
|
65
70
|
|
71
|
+
=== Rails 3.1.x
|
72
|
+
|
73
|
+
For 3.1.x, mizugumo uses the rails asset packager, so there is less for you to do. ninjascript.js, mizugumo.js, and a file called ninja_go.js are added to your app/assets/javascripts directory, and lines are added to you manifest (app/assets/javascripts/application.js) to ensure that they are loaded in the right order.
|
74
|
+
|
75
|
+
|
66
76
|
== Graceful degradation of :method => 'delete' (or PUT, or POST) links
|
67
77
|
|
68
78
|
Rails' concept of REST runs headlong into the desire to make a site degrade
|
@@ -121,6 +131,7 @@ For ERB views:
|
|
121
131
|
config.generators do |g|
|
122
132
|
g.scaffold_controller 'mizugumo:scaffold_controller'
|
123
133
|
g.template_engine 'mizugumo:erb'
|
134
|
+
g.assets 'mizugumo:js_assets' # Only needed for Rails 3.1, omit for Rails 3.0
|
124
135
|
end
|
125
136
|
|
126
137
|
For Haml views:
|
@@ -128,8 +139,34 @@ For Haml views:
|
|
128
139
|
config.generators do |g|
|
129
140
|
g.scaffold_controller 'mizugumo:scaffold_controller'
|
130
141
|
g.template_engine 'mizugumo:haml'
|
142
|
+
g.assets 'mizugumo:js_assets' # Only needed for Rails 3.1, omit for Rails 3.0
|
131
143
|
end
|
132
144
|
|
145
|
+
Run the scaffold generator as you would with any other Rails app. Mizugumo will
|
146
|
+
generate both HTML views (in ERB or HAML), and JavaScript views (action.js.rb) for
|
147
|
+
the actions in each controller, and will generate the NinjaScript code to allow your
|
148
|
+
scaffold to function as an AJAX scaffold when Javascript is available.
|
149
|
+
|
150
|
+
In Rails 3.0, the NinjaScript code is injected into public/javascripts/application.js,
|
151
|
+
inside the Ninja.orders() block created by the installer. In Rails 3.1, a new file
|
152
|
+
with the code is created in app/assets/javascripts/<controller_name>.js.
|
153
|
+
|
154
|
+
== FAQ
|
155
|
+
|
156
|
+
=== What is Ninja.orders()?
|
157
|
+
|
158
|
+
NinjaScript's development is modularized using the RequireJS library. One unfortunate
|
159
|
+
side effect of RequireJS is that modules get loaded asynchronously, and so even if
|
160
|
+
a file is required first, its code is not guaranteed to be available when you load
|
161
|
+
a subsjquent file. So, if you required NinjaScript.js, and then began defining Ninja
|
162
|
+
behaviors like so:
|
163
|
+
|
164
|
+
Ninja.behavior({ 'selector': Ninja.someCoolBehavior } )
|
165
|
+
|
166
|
+
It is possible that Ninja's behaviors are not fully loaded, because RequireJS hasn't
|
167
|
+
finished loading them. Boo! So, Ninja.orders() is defined so to queue up all commands
|
168
|
+
(behaviors and the "go") command, so that they will get executed as soon as
|
169
|
+
NinjaScript has finished loading.
|
133
170
|
|
134
171
|
== Contributing to Mizugumo
|
135
172
|
|
@@ -151,5 +188,7 @@ Use the GitHub issue tracker.
|
|
151
188
|
Copyright (c) 2011 Evan Dorn and Logical Reality Design. See LICENSE.txt for
|
152
189
|
further details.
|
153
190
|
|
191
|
+
NinjaScript is copyright (c) 2011 Judson Lester and Logical Reality Design.
|
192
|
+
|
154
193
|
Web Development by Logical Reality Design: http://LRDesign.com
|
155
194
|
|
data/Rakefile
CHANGED
@@ -17,9 +17,18 @@ namespace :update do
|
|
17
17
|
|
18
18
|
desc "get the most up-to-date version of NinjaScript"
|
19
19
|
task :ninja_script do
|
20
|
-
sh 'cd ../NinjaScript; git checkout master; git pull'
|
21
|
-
cp File.join(File.dirname(__FILE__), '..', 'NinjaScript', 'javascript', 'jquery.ninja_script.js'),
|
22
|
-
File.join(File.dirname(__FILE__), 'lib', 'generators', 'mizugumo', 'install', 'templates', 'javascripts')
|
20
|
+
#sh 'cd ../NinjaScript; git checkout master; git pull'
|
21
|
+
#cp File.join(File.dirname(__FILE__), '..', 'NinjaScript', 'javascript', 'jquery.ninja_script.js'),
|
22
|
+
#File.join(File.dirname(__FILE__), 'lib', 'generators', 'mizugumo', 'install', 'templates', 'javascripts')
|
23
|
+
mkdir_p 'temp'
|
24
|
+
sh 'rm -f temp/ninjascript.zip'
|
25
|
+
sh 'cd temp; wget --no-check-certificate https://github.com/downloads/LRDesign/NinjaScript/ninjascript.zip'
|
26
|
+
sh 'cd temp; unzip ninjascript.zip'
|
27
|
+
cwd = File.dirname(__FILE__)
|
28
|
+
cp File.join(cwd, 'temp', 'generated', 'javascript', 'ninjascript.js'),
|
29
|
+
File.join(cwd, 'lib', 'generators', 'mizugumo', 'install', 'templates', 'javascripts')
|
30
|
+
cp File.join(cwd, 'temp', 'generated', 'javascript', 'ns.min.js'),
|
31
|
+
File.join(cwd, 'lib', 'generators', 'mizugumo', 'install', 'templates', 'javascripts')
|
23
32
|
end
|
24
33
|
|
25
34
|
task :ns => :ninja_script
|
@@ -12,39 +12,75 @@ DESC
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def copy_files
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
if Mizugumo::RAILS_31
|
16
|
+
directory 'images', 'public/images'
|
17
|
+
copy_file 'javascripts/ninjascript.js', 'app/assets/javascripts/ninjascript.js'
|
18
|
+
copy_file 'javascripts/mizugumo.js', 'app/assets/javascripts/mizugumo.js'
|
19
|
+
copy_file 'javascripts/ninja_go.js', 'app/assets/javascripts/ninja_go.js'
|
20
|
+
directory 'stylesheets', 'app/assets/stylesheets'
|
21
|
+
@manifest = 'app/assets/javascripts/application.js'
|
22
|
+
insert_into_file(@manifest, :after => '//= require jquery_ujs') do
|
23
|
+
"\n//= require ninjascript" +
|
24
|
+
"\n//= require mizugumo"
|
25
|
+
end
|
26
|
+
append_to_file(@manifest){ '//= require ninja_go' }
|
27
|
+
else
|
28
|
+
directory 'images', 'public/images'
|
29
|
+
copy_file 'javascripts/jquery-1.6.4.min.js', 'public/javascripts/jquery-1.6.4.min.js'
|
30
|
+
copy_file 'javascripts/ninjascript.js', 'public/javascripts/ninjascript.js'
|
31
|
+
directory 'stylesheets', 'public/stylesheets'
|
32
|
+
end
|
18
33
|
end
|
19
34
|
|
20
|
-
def
|
35
|
+
def add_javascript_rails_3_0
|
36
|
+
return if Mizugumo::RAILS_31
|
37
|
+
|
21
38
|
file = File.join("public", "javascripts", "application.js")
|
39
|
+
|
40
|
+
mg_file = File.open(File.join(InstallGenerator.source_root, "javascripts", "mizugumo.js"))
|
22
41
|
append_to_file(file) do
|
23
|
-
|
24
|
-
|
25
|
-
// Generated by mizugumo install script
|
26
|
-
Ninja.behavior({
|
27
|
-
// This line enables the NH behavior of graceful degradation of method links
|
28
|
-
// to forms and back again
|
29
|
-
'.mizugumo_graceful_form': Ninja.becomesLink
|
30
|
-
})
|
31
|
-
ADDITIONAL_JS
|
42
|
+
mg_file.read
|
32
43
|
end
|
44
|
+
mg_file.close
|
45
|
+
insert_into_file(file, :after => '});') do
|
46
|
+
"\n Ninja.go(); // This must be the last line of your NinjaScript definitions!"
|
47
|
+
end
|
33
48
|
end
|
34
49
|
|
35
50
|
def reminder
|
36
|
-
|
51
|
+
if Mizugumo::RAILS_31
|
52
|
+
say (<<NOTICE )
|
53
|
+
|
54
|
+
Mizugumo is installed!
|
55
|
+
|
56
|
+
Javascript files have been added to your app/assets/javascripts directory. You may need to check them for compatibility with your
|
57
|
+
other JS files.
|
58
|
+
|
59
|
+
A few default style rules have been added as well as app/assets/stylesheets/mizugumo.sass.
|
60
|
+
|
61
|
+
If you want to use the Mizugumo AJAX scaffold generators, add this to your application.rb:
|
62
|
+
|
63
|
+
config.generators do |g|
|
64
|
+
g.scaffold_controller 'mizugumo:scaffold_controller'
|
65
|
+
g.template_engine 'mizugumo:erb'
|
66
|
+
# g.template_engine 'mizugumo:haml' # If you prefer Haml over ERB
|
67
|
+
g.assets 'mizugumo:js_assets'
|
68
|
+
end
|
69
|
+
|
70
|
+
NOTICE
|
71
|
+
else
|
72
|
+
say (<<NOTICE
|
37
73
|
|
38
74
|
Mizugumo is installed!
|
39
|
-
Remember to remove the default JS and link to the jQuery/NinjaScript script and CSS files by adding these to your application layout:
|
75
|
+
Remember to remove the default JS and link to the jQuery/NinjaScript script and CSS files by adding these to your application layout. Note: it is important that ninjascript load after jquery, but before your application.js or any mizugumo-related code you write!
|
40
76
|
|
41
77
|
<%= stylesheet_link_tag 'mizugumo.css' %>
|
42
|
-
<%= javascript_include_tag 'jquery-1.4.
|
43
|
-
<%= javascript_include_tag '
|
78
|
+
<%= javascript_include_tag 'jquery-1.6.4.min.js' %>
|
79
|
+
<%= javascript_include_tag 'ninjascript.js' %>
|
44
80
|
<%= javascript_include_tag 'rails.js' %>
|
45
81
|
<%= javascript_include_tag 'application.js' %>
|
46
82
|
|
47
|
-
The included rails.js is a jQuery
|
83
|
+
The included rails.js is a jQuery compatible implementation of rails.js, and should replace the default rails.js.
|
48
84
|
If you want to use the Mizugumo AJAX scaffold generators, add this to your application.rb:
|
49
85
|
|
50
86
|
config.generators do |g|
|
@@ -55,6 +91,7 @@ If you want to use the Mizugumo AJAX scaffold generators, add this to your appli
|
|
55
91
|
|
56
92
|
NOTICE
|
57
93
|
)
|
94
|
+
end
|
58
95
|
end
|
59
96
|
end
|
60
97
|
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
/*
|
2
|
+
* NinjaScript - 0.9
|
3
|
+
* written by and copyright 2010-2011 Judson Lester and Logical Reality Design
|
4
|
+
* Licensed under the MIT license
|
5
|
+
*
|
6
|
+
* 06-29-2011
|
7
|
+
*/
|
8
|
+
/*
|
9
|
+
RequireJS 0.24.0 Copyright (c) 2010-2011, The Dojo Foundation All Rights Reserved.
|
10
|
+
Available via the MIT or new BSD license.
|
11
|
+
see: http://github.com/jrburke/requirejs for details
|
12
|
+
*/
|
13
|
+
var require,define;
|
14
|
+
(function(){function i(b){return s.call(b)==="[object Function]"}function l(b){return s.call(b)==="[object Array]"}function c(b,a,k){for(var h in a)if(!(h in d)&&(!(h in b)||k))b[h]=a[h];return j}function e(b,d,a){var h,k,c;for(h=0;c=d[h];h++){c=typeof c==="string"?{name:c}:c;k=c.location;if(a&&(!k||k.indexOf("/")!==0&&k.indexOf(":")===-1))k=a+"/"+(k||c.name);b[c.name]={name:c.name,location:k||c.name,lib:c.lib||"lib",main:(c.main||"lib/main").replace(q,"").replace(m,"")}}}function a(a){function k(b){var d,a;
|
15
|
+
for(d=0;a=b[d];d++)if(a===".")b.splice(d,1),d-=1;else if(a==="..")if(d===1&&(b[2]===".."||b[0]===".."))break;else d>0&&(b.splice(d-1,2),d-=2)}function g(b,d){var a,h;b.charAt(0)==="."&&d&&(w.pkgs[d]?d=[d]:(d=d.split("/"),d=d.slice(0,d.length-1)),b=d.concat(b.split("/")),k(b),h=w.pkgs[a=b[0]],b=b.join("/"),h&&b===a+"/"+h.main&&(b=a));return b}function y(b,d){var a=b?b.indexOf("!"):-1,k=null,h=d?d.name:null,c=b,o,f;a!==-1&&(k=b.substring(0,a),b=b.substring(a+1,b.length));k&&(k=g(k,h));b&&(o=k?(a=u[k])?
|
16
|
+
a.normalize?a.normalize(b,function(b){return g(b,h)}):g(b,h):"__$p"+h+"@"+b:g(b,h),f=N[o],f||(f=j.toModuleUrl?j.toModuleUrl(n,b,d):n.nameToUrl(b,null,d),N[o]=f));return{prefix:k,name:o,parentMap:d,url:f,originalName:c,fullName:k?k+"!"+o:o}}function f(){var b=!0,d=w.priorityWait,a,k;if(d){for(k=0;a=d[k];k++)if(!B[a]){b=!1;break}b&&delete w.priorityWait}return b}function m(b){return function(d){b.exports=d}}function s(b,d,a){return function(){var k=[].concat(x.call(arguments,0)),h;if(a&&i(h=k[k.length-
|
17
|
+
1]))h.__requireJsBuild=!0;k.push(d);return b.apply(null,k)}}function p(b,d){var a=s(n.require,b,d);c(a,{nameToUrl:s(n.nameToUrl,b),toUrl:s(n.toUrl,b),isDefined:s(n.isDefined,b),ready:j.ready,isBrowser:j.isBrowser});if(j.paths)a.paths=j.paths;return a}function q(b){var d=b.prefix,a=b.fullName;H[a]||a in u||(d&&!O[d]&&(O[d]=void 0,(S[d]||(S[d]=[])).push(b),(C[d]||(C[d]=[])).push({onDep:function(b){if(b===d){var a,k,h,K,c,o,g=S[d];if(g)for(h=0;a=g[h];h++)if(b=a.fullName,a=y(a.originalName,a.parentMap),
|
18
|
+
a=a.fullName,k=C[b]||[],K=C[a],a!==b){b in H&&(delete H[b],H[a]=!0);C[a]=K?K.concat(k):k;delete C[b];for(K=0;K<k.length;K++){o=k[K].depArray;for(c=0;c<o.length;c++)o[c]===b&&(o[c]=a)}}delete S[d]}}}),q(y(d))),n.paused.push(b))}function r(b){var d,a,k;d=b.callback;var h=b.fullName;k=[];var c=b.depArray;if(d&&i(d)){if(c)for(d=0;d<c.length;d++)k.push(b.deps[c[d]]);a=j.execCb(h,b.callback,k);if(h)if(b.usingExports&&a===void 0&&(!b.cjsModule||!("exports"in b.cjsModule)))a=u[h];else if(b.cjsModule&&"exports"in
|
19
|
+
b.cjsModule)a=u[h]=b.cjsModule.exports;else{if(h in u&&!b.usingExports)return j.onError(Error(h+" has already been defined"));u[h]=a}}else h&&(a=u[h]=d);if(h&&(k=C[h])){for(d=0;d<k.length;d++)k[d].onDep(h,a);delete C[h]}if(L[b.waitId])delete L[b.waitId],b.isDone=!0,n.waitCount-=1,n.waitCount===0&&(G=[])}function P(d,a,k,h){var d=y(d,h),c=d.name,o=d.fullName,g={},j={waitId:c||b+U++,depCount:0,depMax:0,prefix:d.prefix,name:c,fullName:o,deps:{},depArray:a,callback:k,onDep:function(b,d){b in j.deps||
|
20
|
+
(j.deps[b]=d,j.depCount+=1,j.depCount===j.depMax&&r(j))}},f,e;if(o){if(o in u||B[o]===!0)return;H[o]=!0;B[o]=!0;n.jQueryDef=o==="jquery"}for(k=0;k<a.length;k++)if(f=a[k])f=y(f,c?d:h),e=f.fullName,a[k]=e,e==="require"?j.deps[e]=p(d):e==="exports"?(j.deps[e]=u[o]={},j.usingExports=!0):e==="module"?(j.cjsModule=f=j.deps[e]={id:c,uri:c?n.nameToUrl(c,null,h):void 0},f.setExports=m(f)):e in u&&!(e in L)?j.deps[e]=u[e]:g[e]||(j.depMax+=1,q(f),(C[e]||(C[e]=[])).push(j),g[e]=!0);j.depCount===j.depMax?r(j):
|
21
|
+
(L[j.waitId]=j,G.push(j),n.waitCount+=1)}function l(b){P.apply(null,b);B[b[0]]=!0}function A(b){if(!n.jQuery&&(b=b||(typeof jQuery!=="undefined"?jQuery:null))&&"readyWait"in b)if(n.jQuery=b,l(["jquery",[],function(){return jQuery}]),n.scriptCount)b.readyWait+=1,n.jQueryIncremented=!0}function E(b,d){if(!b.isDone){var a=b.fullName,k=b.depArray,h,c;if(a){if(d[a])return u[a];d[a]=!0}for(c=0;c<k.length;c++)if((h=k[c])&&!b.deps[h]&&L[h])b.onDep(h,E(L[h],d));return a?u[a]:void 0}}function F(){var b=w.waitSeconds*
|
22
|
+
1E3,a=b&&n.startTime+b<(new Date).getTime(),b="",k=!1,h=!1,c;if(!(n.pausedCount>0)){if(w.priorityWait)if(f())z();else return;for(c in B)if(!(c in d)&&(k=!0,!B[c]))if(a)b+=c+" ";else{h=!0;break}if(k||n.waitCount){if(a&&b)return c=Error("require.js load timeout for modules: "+b),c.requireType="timeout",c.requireModules=b,j.onError(c);if(h||n.scriptCount)(t||T)&&setTimeout(F,50);else if(n.waitCount){for(M=0;b=G[M];M++)E(b,{});F()}else j.checkReadyState()}}}function J(b,d){var a=d.name,k=d.fullName,h;
|
23
|
+
if(!(k in u||k in B))O[b]||(O[b]=u[b]),B[k]||(B[k]=!1),h=function(h){if(require.onPluginLoad)require.onPluginLoad(n,b,a,h);r({prefix:d.prefix,name:d.name,fullName:d.fullName,callback:function(){return h}});B[k]=!0},h.fromText=function(b,d){var a=o;n.loaded[b]=!1;n.scriptCount+=1;a&&(o=!1);eval(d);a&&(o=!0);n.completeLoad(b)},O[b].load(a,p(d.parentMap,!0),h,w)}function Q(b){b.prefix&&b.name.indexOf("__$p")===0&&u[b.prefix]&&(b=y(b.originalName,b.parentMap));var d=b.prefix,a=b.fullName;!H[a]&&!B[a]&&
|
24
|
+
(H[a]=!0,d?u[d]?J(d,b):(R[d]||(R[d]=[],(C[d]||(C[d]=[])).push({onDep:function(b){if(b===d){for(var a,k=R[d],b=0;b<k.length;b++)a=k[b],J(d,y(a.originalName,a.parentMap));delete R[d]}}})),R[d].push(b)):j.load(n,a,b.url))}var n,z,w={waitSeconds:7,baseUrl:v.baseUrl||"./",paths:{},pkgs:{}},D=[],H={require:!0,exports:!0,module:!0},N={},u={},B={},L={},G=[],U=0,C={},O={},R={},V=0,S={};z=function(){var b,d,a;V+=1;if(n.scriptCount<=0)n.scriptCount=0;for(;D.length;)if(b=D.shift(),b[0]===null)return j.onError(Error("Mismatched anonymous require.def modules"));
|
25
|
+
else l(b);if(!w.priorityWait||f())for(;n.paused.length;){a=n.paused;n.pausedCount+=a.length;n.paused=[];for(d=0;b=a[d];d++)Q(b);n.startTime=(new Date).getTime();n.pausedCount-=a.length}V===1&&F();V-=1};n={contextName:a,config:w,defQueue:D,waiting:L,waitCount:0,specified:H,loaded:B,urlMap:N,scriptCount:0,urlFetched:{},defined:u,paused:[],pausedCount:0,plugins:O,managerCallbacks:C,makeModuleMap:y,normalize:g,configure:function(b){var a,k,h;b.baseUrl&&b.baseUrl.charAt(b.baseUrl.length-1)!=="/"&&(b.baseUrl+=
|
26
|
+
"/");a=w.paths;h=w.pkgs;c(w,b,!0);if(b.paths){for(k in b.paths)k in d||(a[k]=b.paths[k]);w.paths=a}if((a=b.packagePaths)||b.packages){if(a)for(k in a)k in d||e(h,a[k],k);b.packages&&e(h,b.packages);w.pkgs=h}if(b.priority)k=n.requireWait,n.requireWait=!1,n.takeGlobalQueue(),z(),n.require(b.priority),z(),n.requireWait=k,w.priorityWait=b.priority;if(b.deps||b.callback)n.require(b.deps||[],b.callback);b.ready&&j.ready(b.ready)},isDefined:function(b,d){return y(b,d).fullName in u},require:function(b,d,
|
27
|
+
k){if(typeof b==="string"){if(j.get)return j.get(n,b,d);d=y(b,d);b=u[d.fullName];return b===void 0?j.onError(Error("require: module name '"+d.fullName+"' has not been loaded yet for context: "+a)):b}P(null,b,d,k);if(!n.requireWait)for(;!n.scriptCount&&n.paused.length;)z()},takeGlobalQueue:function(){h.length&&(I.apply(n.defQueue,[n.defQueue.length-1,0].concat(h)),h=[])},completeLoad:function(b){var d;for(n.takeGlobalQueue();D.length;)if(d=D.shift(),d[0]===null){d[0]=b;break}else if(d[0]===b)break;
|
28
|
+
else l(d),d=null;d?l(d):l([b,[],b==="jquery"&&typeof jQuery!=="undefined"?function(){return jQuery}:null]);B[b]=!0;A();j.isAsync&&(n.scriptCount-=1);z();j.isAsync||(n.scriptCount-=1)},toUrl:function(b,d){var a=b.lastIndexOf("."),k=null;a!==-1&&(k=b.substring(a,b.length),b=b.substring(0,a));return n.nameToUrl(b,k,d)},nameToUrl:function(b,d,a){var h,c,o,f,e=n.config;if(b.indexOf("./")===0||b.indexOf("../")===0)a=a&&a.url?a.url.split("/"):[],a.length&&a.pop(),a=a.concat(b.split("/")),k(a),d=a.join("/")+
|
29
|
+
(d?d:j.jsExtRegExp.test(b)?"":".js");else if(b=g(b,a),j.jsExtRegExp.test(b))d=b+(d?d:"");else{h=e.paths;c=e.pkgs;a=b.split("/");for(f=a.length;f>0;f--)if(o=a.slice(0,f).join("/"),h[o]){a.splice(0,f,h[o]);break}else if(o=c[o]){b=b===o.name?o.location+"/"+o.main:o.location+"/"+o.lib;a.splice(0,f,b);break}d=a.join("/")+(d||".js");d=(d.charAt(0)==="/"||d.match(/^\w+:/)?"":e.baseUrl)+d}return e.urlArgs?d+((d.indexOf("?")===-1?"?":"&")+e.urlArgs):d}};n.jQueryCheck=A;n.resume=z;return n}function f(){var b,
|
30
|
+
d,a;if(y&&y.readyState==="interactive")return y;b=document.getElementsByTagName("script");for(d=b.length-1;d>-1&&(a=b[d]);d--)if(a.readyState==="interactive")return y=a;return null}var p=/(\/\*([\s\S]*?)\*\/|\/\/(.*)$)/mg,r=/require\(["']([^'"\s]+)["']\)/g,q=/^\.\//,m=/\.js$/,s=Object.prototype.toString,g=Array.prototype,x=g.slice,I=g.splice,t=!!(typeof window!=="undefined"&&navigator&&document),T=!t&&typeof importScripts!=="undefined",F=t&&navigator.platform==="PLAYSTATION 3"?/^complete$/:/^(complete|loaded)$/,
|
31
|
+
G=typeof opera!=="undefined"&&opera.toString()==="[object Opera]",b="_r@@",d={},k={},h=[],y=null,o=!1,j,g={},P,v,z,Q,E,J,A,M,N,U,D;if(typeof require!=="undefined")if(i(require))return;else g=require;j=require=function(b,d,h){var c="_",o;!l(b)&&typeof b!=="string"&&(o=b,l(d)?(b=d,d=h):b=[]);if(o&&o.context)c=o.context;h=k[c]||(k[c]=a(c));o&&h.configure(o);return h.require(b,d)};j.version="0.24.0";j.isArray=l;j.isFunction=i;j.mixin=c;j.jsExtRegExp=/^\/|:|\?|\.js$/;v=j.s={contexts:k,skipAsync:{},isPageLoaded:!t,
|
32
|
+
readyCalls:[]};if(j.isAsync=j.isBrowser=t)if(z=v.head=document.getElementsByTagName("head")[0],Q=document.getElementsByTagName("base")[0])z=v.head=Q.parentNode;j.onError=function(b){throw b;};j.load=function(b,d,a){var k=b.contextName,h=b.urlFetched,c=b.loaded;c[d]||(c[d]=!1);if(!h[a]&&(b.scriptCount+=1,j.attach(a,k,d),h[a]=!0,b.jQuery&&!b.jQueryIncremented))b.jQuery.readyWait+=1,b.jQueryIncremented=!0};define=j.def=function(b,d,a){var c;typeof b!=="string"&&(a=d,d=b,b=null);j.isArray(d)||(a=d,d=
|
33
|
+
[]);!b&&!d.length&&j.isFunction(a)&&a.length&&(a.toString().replace(p,"").replace(r,function(b,a){d.push(a)}),d=["require","exports","module"].concat(d));if(o){c=P||f();if(!c)return j.onError(Error("ERROR: No matching script interactive for "+a));b||(b=c.getAttribute("data-requiremodule"));c=k[c.getAttribute("data-requirecontext")]}(c?c.defQueue:h).push([b,d,a])};define.amd={multiversion:!0,plugins:!0};j.execCb=function(b,d,a){return d.apply(null,a)};j.onScriptLoad=function(b){var d=b.currentTarget||
|
34
|
+
b.srcElement,a;if(b.type==="load"||F.test(d.readyState))y=null,b=d.getAttribute("data-requirecontext"),a=d.getAttribute("data-requiremodule"),k[b].completeLoad(a),d.detachEvent&&!G?d.detachEvent("onreadystatechange",j.onScriptLoad):d.removeEventListener("load",j.onScriptLoad,!1)};j.attach=function(b,d,a,h,c){var f;if(t)return h=h||j.onScriptLoad,f=document.createElement("script"),f.type=c||"text/javascript",f.charset="utf-8",f.async=!v.skipAsync[b],f.setAttribute("data-requirecontext",d),f.setAttribute("data-requiremodule",
|
35
|
+
a),f.attachEvent&&!G?(o=!0,f.attachEvent("onreadystatechange",h)):f.addEventListener("load",h,!1),f.src=b,P=f,Q?z.insertBefore(f,Q):z.appendChild(f),P=null,f;else if(T)h=k[d],d=h.loaded,d[a]=!1,importScripts(b),h.completeLoad(a);return null};if(t){E=document.getElementsByTagName("script");for(M=E.length-1;M>-1&&(J=E[M]);M--){if(!z)z=J.parentNode;if(A=J.getAttribute("data-main")){if(!g.baseUrl)E=A.split("/"),J=E.pop(),E=E.length?E.join("/")+"/":"./",g.baseUrl=E,A=J.replace(m,"");g.deps=g.deps?g.deps.concat(A):
|
36
|
+
[A];break}}}v.baseUrl=g.baseUrl;j.pageLoaded=function(){if(!v.isPageLoaded){v.isPageLoaded=!0;N&&clearInterval(N);if(U)document.readyState="complete";j.callReady()}};j.checkReadyState=function(){var b=v.contexts,a;for(a in b)if(!(a in d)&&b[a].waitCount)return;v.isDone=!0;j.callReady()};j.callReady=function(){var b=v.readyCalls,a,k,h;if(v.isPageLoaded&&v.isDone){if(b.length){v.readyCalls=[];for(a=0;k=b[a];a++)k()}b=v.contexts;for(h in b)if(!(h in d)&&(a=b[h],a.jQueryIncremented))a.jQuery.ready(!0),
|
37
|
+
a.jQueryIncremented=!1}};j.ready=function(b){v.isPageLoaded&&v.isDone?b():v.readyCalls.push(b);return j};if(t){if(document.addEventListener){if(document.addEventListener("DOMContentLoaded",j.pageLoaded,!1),window.addEventListener("load",j.pageLoaded,!1),!document.readyState)U=!0,document.readyState="loading"}else window.attachEvent&&(window.attachEvent("onload",j.pageLoaded),self===self.top&&(N=setInterval(function(){try{document.body&&(document.documentElement.doScroll("left"),j.pageLoaded())}catch(b){}},
|
38
|
+
30)));document.readyState==="complete"&&j.pageLoaded()}j(g);if(j.isAsync&&typeof setTimeout!=="undefined")D=v.contexts[g.context||"_"],D.requireWait=!0,setTimeout(function(){D.requireWait=!1;D.takeGlobalQueue();D.jQueryCheck();D.scriptCount||D.resume();j.checkReadyState()},0)})();
|
39
|
+
define("utils",["require","exports","module"],function(){return{log:function(){},isArray:function(i){return i.constructor==Array},forEach:function(i,l,c){if(typeof i.forEach=="function")return i.forEach(l,c);else if(typeof Array.prototype.forEach=="function")return Array.prototype.forEach.call(i,l,c);else for(var e=Number(i.length),a=0;a<e;a+=1)typeof i[a]!="undefined"&&l.call(c,i[a],a,i)}}});define("ninja/exceptions",["require","exports","module"],function(){return{CouldntChoose:function(){},TransformFailed:function(){}}});
|
40
|
+
define("ninja/behaviors",["ninja/exceptions"],function(i){var l=i.CouldntChoose,i={meta:function(c,e){c(this);this.chooser=e}};i.meta.prototype={choose:function(c){var e=this.chooser(c);if(e!==void 0)return e.choose(c);else throw new l;}};i.select=function(c){this.menu=c};i.select.prototype={choose:function(c){for(var e in this.menu)if(jQuery(c).is(e))return this.menu[e].choose(c);return null}};i.base=function(c){this.helpers={};this.eventHandlers=[];this.priority=this.lexicalOrder=0;if(typeof c.transform==
|
41
|
+
"function")this.transform=c.transform,delete c.transform;if(typeof c.helpers!="undefined")this.helpers=c.helpers,delete c.helpers;if(typeof c.priority!="undefined")this.priority=c.priority;delete c.priority;this.eventHandlers=typeof c.events!="undefined"?c.events:c;return this};i.base.prototype={apply:function(c){var e=this.inContext({}),c=this.applyTransform(e,c);jQuery(c).data("ninja-visited",e);this.applyEventHandlers(e,c);return c},priority:function(c){this.priority=c;return this},choose:function(){return this},
|
42
|
+
inContext:function(c){function e(){}e.prototype=c;return Ninja.tools.enrich(new e,this.helpers)},applyTransform:function(c,e){var a=this.transform.call(c,e);return a===void 0?e:a},applyEventHandlers:function(c,e){for(var a in this.eventHandlers){var f=this.eventHandlers[a];jQuery(e).bind(a,this.makeHandler.call(c,f))}return e},recordEventHandlers:function(c,e){for(var a in this.eventHandlers)c.recordHandler(this,a,function(c){return this.makeHandler.call(e,this.eventHandlers[a],c)})},buildHandler:function(c,
|
43
|
+
e,a){var f,p=!0,r=!0,q=!1,m=!1,e=this.eventHandlers[e];if(typeof e=="function")f=e;else{f=e[0];for(var e=e.slice(1,e.length),s=e.length,g=0;g<s;g++){if(e[g]=="andDoDefault"||e[g]=="allowDefault")p=!1;if(e[g]=="allowPropagate"||e[g]=="dontStopPropagation")r=!1;e[g]=="andDoOthers"&&(q=!1);e[g]=="changesDOM"&&(m=!0)}}e=function(g){f.call(c,g,this,a);return!p};p&&(e=this.prependAction(e,function(a){a.preventDefault()}));r&&(e=this.prependAction(e,function(a){a.stopPropagation()}));q&&(e=this.prependAction(e,
|
44
|
+
function(a){a.stopImmediatePropagation()}));m&&(e=this.appendAction(e,function(){Ninja.tools.fireMutationEvent()}));return e},prependAction:function(c,e){return function(a){e.call(this,a);return c.call(this,a)}},appendAction:function(c,e){return function(a){var f=c.call(this,a);e.call(this,a);return f}},transform:function(c){return c}};return i});
|
45
|
+
define("sizzle-1.0",["require","exports","module"],function(){function i(b){for(var d="",a,h=0;b[h];h++)a=b[h],a.nodeType===3||a.nodeType===4?d+=a.nodeValue:a.nodeType!==8&&(d+=i(a.childNodes));return d}function l(b,d,a,h,c,o){for(var c=0,f=h.length;c<f;c++){var g=h[c];if(g){for(var g=g[b],e=!1;g;){if(g.sizcache===a){e=h[g.sizset];break}if(g.nodeType===1&&!o)g.sizcache=a,g.sizset=c;if(g.nodeName.toLowerCase()===d){e=g;break}g=g[b]}h[c]=e}}}function c(b,d,a,h,c,o){for(var c=0,f=h.length;c<f;c++){var g=
|
46
|
+
h[c];if(g){for(var g=g[b],e=!1;g;){if(g.sizcache===a){e=h[g.sizset];break}if(g.nodeType===1){if(!o)g.sizcache=a,g.sizset=c;if(typeof d!=="string"){if(g===d){e=!0;break}}else if(q.filter(d,[g]).length>0){e=g;break}}g=g[b]}h[c]=e}}}var e=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,a=0,f=Object.prototype.toString,p=!1,r=!0;[0,0].sort(function(){r=!1;return 0});var q=function(b,d,a,h){var a=a||[],c=d=d||document;if(d.nodeType!==
|
47
|
+
1&&d.nodeType!==9)return[];if(!b||typeof b!=="string")return a;for(var g=[],j,p,r,i,l=!0,t=F(d),I=b;(e.exec(""),j=e.exec(I))!==null;)if(I=j[3],g.push(j[1]),j[2]){i=j[3];break}if(g.length>1&&s.exec(b))if(g.length===2&&m.relative[g[0]])p=G(g[0]+g[1],d);else for(p=m.relative[g[0]]?[d]:q(g.shift(),d);g.length;)b=g.shift(),m.relative[b]&&(b+=g.shift()),p=G(b,p);else if(!h&&g.length>1&&d.nodeType===9&&!t&&m.match.ID.test(g[0])&&!m.match.ID.test(g[g.length-1])&&(j=q.find(g.shift(),d,t),d=j.expr?q.filter(j.expr,
|
48
|
+
j.set)[0]:j.set[0]),d){j=h?{expr:g.pop(),set:x(h)}:q.find(g.pop(),g.length===1&&(g[0]==="~"||g[0]==="+")&&d.parentNode?d.parentNode:d,t);p=j.expr?q.filter(j.expr,j.set):j.set;for(g.length>0?r=x(p):l=!1;g.length;){var A=g.pop();j=A;m.relative[A]?j=g.pop():A="";j==null&&(j=d);m.relative[A](r,j,t)}}else r=[];r||(r=p);r||q.error(A||b);if(f.call(r)==="[object Array]")if(l)if(d&&d.nodeType===1)for(b=0;r[b]!=null;b++)r[b]&&(r[b]===!0||r[b].nodeType===1&&T(d,r[b]))&&a.push(p[b]);else for(b=0;r[b]!=null;b++)r[b]&&
|
49
|
+
r[b].nodeType===1&&a.push(p[b]);else a.push.apply(a,r);else x(r,a);i&&(q(i,c,a,h),q.uniqueSort(a));return a};q.uniqueSort=function(b){if(t&&(p=r,b.sort(t),p))for(var d=1;d<b.length;d++)b[d]===b[d-1]&&b.splice(d--,1);return b};q.matches=function(b,d){return q(b,null,null,d)};q.find=function(b,d,a){var h,c;if(!b)return[];for(var g=0,f=m.order.length;g<f;g++){var e=m.order[g];if(c=m.leftMatch[e].exec(b)){var s=c[1];c.splice(1,1);if(s.substr(s.length-1)!=="\\"&&(c[1]=(c[1]||"").replace(/\\/g,""),h=m.find[e](c,
|
50
|
+
d,a),h!=null)){b=b.replace(m.match[e],"");break}}}h||(h=d.getElementsByTagName("*"));return{set:h,expr:b}};q.filter=function(b,d,a,h){for(var c=b,g=[],f=d,e,s,r=d&&d[0]&&F(d[0]);b&&d.length;){for(var p in m.filter)if((e=m.leftMatch[p].exec(b))!=null&&e[2]){var i=m.filter[p],l,x;x=e[1];s=!1;e.splice(1,1);if(x.substr(x.length-1)!=="\\"){f===g&&(g=[]);if(m.preFilter[p])if(e=m.preFilter[p](e,f,a,g,h,r)){if(e===!0)continue}else s=l=!0;if(e)for(var t=0;(x=f[t])!=null;t++)if(x){l=i(x,e,t,f);var I=h^!!l;
|
51
|
+
a&&l!=null?I?s=!0:f[t]=!1:I&&(g.push(x),s=!0)}if(l!==void 0){a||(f=g);b=b.replace(m.match[p],"");if(!s)return[];break}}}if(b===c)if(s==null)q.error(b);else break;c=b}return f};q.error=function(b){throw"Syntax error, unrecognized expression: "+b;};var m=q.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
|
52
|
+
TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(b){return b.getAttribute("href")}},relative:{"+":function(b,d){var a=typeof d==="string",h=a&&!/\W/.test(d),a=a&&!h;h&&(d=d.toLowerCase());for(var h=0,c=b.length,
|
53
|
+
g;h<c;h++)if(g=b[h]){for(;(g=g.previousSibling)&&g.nodeType!==1;);b[h]=a||g&&g.nodeName.toLowerCase()===d?g||!1:g===d}a&&q.filter(d,b,!0)},">":function(b,d){var a=typeof d==="string";if(a&&!/\W/.test(d))for(var d=d.toLowerCase(),h=0,c=b.length;h<c;h++){var g=b[h];if(g)a=g.parentNode,b[h]=a.nodeName.toLowerCase()===d?a:!1}else{h=0;for(c=b.length;h<c;h++)(g=b[h])&&(b[h]=a?g.parentNode:g.parentNode===d);a&&q.filter(d,b,!0)}},"":function(b,d,g){var h=a++,f=c;if(typeof d==="string"&&!/\W/.test(d))var e=
|
54
|
+
d=d.toLowerCase(),f=l;f("parentNode",d,h,b,e,g)},"~":function(b,d,g){var h=a++,f=c;if(typeof d==="string"&&!/\W/.test(d))var e=d=d.toLowerCase(),f=l;f("previousSibling",d,h,b,e,g)}},find:{ID:function(b,d,a){if(typeof d.getElementById!=="undefined"&&!a)return(b=d.getElementById(b[1]))?[b]:[]},NAME:function(b,d){if(typeof d.getElementsByName!=="undefined"){for(var a=[],h=d.getElementsByName(b[1]),c=0,g=h.length;c<g;c++)h[c].getAttribute("name")===b[1]&&a.push(h[c]);return a.length===0?null:a}},TAG:function(b,
|
55
|
+
d){return d.getElementsByTagName(b[1])}},preFilter:{CLASS:function(b,d,a,h,c,g){b=" "+b[1].replace(/\\/g,"")+" ";if(g)return b;for(var g=0,f;(f=d[g])!=null;g++)f&&(c^(f.className&&(" "+f.className+" ").replace(/[\t\n]/g," ").indexOf(b)>=0)?a||h.push(f):a&&(d[g]=!1));return!1},ID:function(b){return b[1].replace(/\\/g,"")},TAG:function(b){return b[1].toLowerCase()},CHILD:function(b){if(b[1]==="nth"){var d=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(b[2]==="even"&&"2n"||b[2]==="odd"&&"2n+1"||!/\D/.test(b[2])&&"0n+"+
|
56
|
+
b[2]||b[2]);b[2]=d[1]+(d[2]||1)-0;b[3]=d[3]-0}b[0]=a++;return b},ATTR:function(b,d,a,h,c,g){d=b[1].replace(/\\/g,"");!g&&m.attrMap[d]&&(b[1]=m.attrMap[d]);b[2]==="~="&&(b[4]=" "+b[4]+" ");return b},PSEUDO:function(b,d,a,h,c){if(b[1]==="not")if((e.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=q(b[3],null,null,d);else return b=q.filter(b[3],d,a,1^c),a||h.push.apply(h,b),!1;else if(m.match.POS.test(b[0])||m.match.CHILD.test(b[0]))return!0;return b},POS:function(b){b.unshift(!0);return b}},filters:{enabled:function(b){return b.disabled===
|
57
|
+
!1&&b.type!=="hidden"},disabled:function(b){return b.disabled===!0},checked:function(b){return b.checked===!0},selected:function(b){return b.selected===!0},parent:function(b){return!!b.firstChild},empty:function(b){return!b.firstChild},has:function(b,d,a){return!!q(a[3],b).length},header:function(b){return/h\d/i.test(b.nodeName)},text:function(b){return"text"===b.type},radio:function(b){return"radio"===b.type},checkbox:function(b){return"checkbox"===b.type},file:function(b){return"file"===b.type},
|
58
|
+
password:function(b){return"password"===b.type},submit:function(b){return"submit"===b.type},image:function(b){return"image"===b.type},reset:function(b){return"reset"===b.type},button:function(b){return"button"===b.type||b.nodeName.toLowerCase()==="button"},input:function(b){return/input|select|textarea|button/i.test(b.nodeName)}},setFilters:{first:function(b,d){return d===0},last:function(b,d,a,h){return d===h.length-1},even:function(b,d){return d%2===0},odd:function(b,d){return d%2===1},lt:function(b,
|
59
|
+
d,a){return d<a[3]-0},gt:function(b,a,c){return a>c[3]-0},nth:function(b,a,c){return c[3]-0===a},eq:function(b,a,c){return c[3]-0===a}},filter:{PSEUDO:function(b,a,c,h){var g=a[1],f=m.filters[g];if(f)return f(b,c,a,h);else if(g==="contains")return(b.textContent||b.innerText||i([b])||"").indexOf(a[3])>=0;else if(g==="not"){a=a[3];c=0;for(h=a.length;c<h;c++)if(a[c]===b)return!1;return!0}else q.error("Syntax error, unrecognized expression: "+g)},CHILD:function(b,a){var c=a[1],h=b;switch(c){case "only":case "first":for(;h=
|
60
|
+
h.previousSibling;)if(h.nodeType===1)return!1;if(c==="first")return!0;h=b;case "last":for(;h=h.nextSibling;)if(h.nodeType===1)return!1;return!0;case "nth":var c=a[2],g=a[3];if(c===1&&g===0)return!0;var f=a[0],e=b.parentNode;if(e&&(e.sizcache!==f||!b.nodeIndex)){for(var s=0,h=e.firstChild;h;h=h.nextSibling)if(h.nodeType===1)h.nodeIndex=++s;e.sizcache=f}h=b.nodeIndex-g;return c===0?h===0:h%c===0&&h/c>=0}},ID:function(b,a){return b.nodeType===1&&b.getAttribute("id")===a},TAG:function(b,a){return a===
|
61
|
+
"*"&&b.nodeType===1||b.nodeName.toLowerCase()===a},CLASS:function(b,a){return(" "+(b.className||b.getAttribute("class"))+" ").indexOf(a)>-1},ATTR:function(b,a){var c=a[1],c=m.attrHandle[c]?m.attrHandle[c](b):b[c]!=null?b[c]:b.getAttribute(c),g=c+"",f=a[2],e=a[4];return c==null?f==="!=":f==="="?g===e:f==="*="?g.indexOf(e)>=0:f==="~="?(" "+g+" ").indexOf(e)>=0:!e?g&&c!==!1:f==="!="?g!==e:f==="^="?g.indexOf(e)===0:f==="$="?g.substr(g.length-e.length)===e:f==="|="?g===e||g.substr(0,e.length+1)===e+"-":
|
62
|
+
!1},POS:function(b,a,c,g){var f=m.setFilters[a[2]];if(f)return f(b,c,a,g)}}},s=m.match.POS,g;for(g in m.match)m.match[g]=RegExp(m.match[g].source+/(?![^\[]*\])(?![^\(]*\))/.source),m.leftMatch[g]=RegExp(/(^(?:.|\r|\n)*?)/.source+m.match[g].source.replace(/\\(\d+)/g,function(b,a){return"\\"+(a-0+1)}));var x=function(b,a){b=Array.prototype.slice.call(b,0);return a?(a.push.apply(a,b),a):b};try{Array.prototype.slice.call(document.documentElement.childNodes,0)}catch(I){x=function(b,a){var c=a||[];if(f.call(b)===
|
63
|
+
"[object Array]")Array.prototype.push.apply(c,b);else if(typeof b.length==="number")for(var g=0,e=b.length;g<e;g++)c.push(b[g]);else for(g=0;b[g];g++)c.push(b[g]);return c}}var t;document.documentElement.compareDocumentPosition?t=function(b,a){if(!b.compareDocumentPosition||!a.compareDocumentPosition)return b==a&&(p=!0),b.compareDocumentPosition?-1:1;var c=b.compareDocumentPosition(a)&4?-1:b===a?0:1;c===0&&(p=!0);return c}:"sourceIndex"in document.documentElement?t=function(b,a){if(!b.sourceIndex||
|
64
|
+
!a.sourceIndex)return b==a&&(p=!0),b.sourceIndex?-1:1;var c=b.sourceIndex-a.sourceIndex;c===0&&(p=!0);return c}:document.createRange&&(t=function(b,a){if(!b.ownerDocument||!a.ownerDocument)return b==a&&(p=!0),b.ownerDocument?-1:1;var c=b.ownerDocument.createRange(),g=a.ownerDocument.createRange();c.setStart(b,0);c.setEnd(b,0);g.setStart(a,0);g.setEnd(a,0);c=c.compareBoundaryPoints(Range.START_TO_END,g);c===0&&(p=!0);return c});(function(){var b=document.createElement("div"),a="script"+(new Date).getTime();
|
65
|
+
b.innerHTML="<a name='"+a+"'/>";var c=document.documentElement;c.insertBefore(b,c.firstChild);if(document.getElementById(a))m.find.ID=function(b,a,d){if(typeof a.getElementById!=="undefined"&&!d)return(a=a.getElementById(b[1]))?a.id===b[1]||typeof a.getAttributeNode!=="undefined"&&a.getAttributeNode("id").nodeValue===b[1]?[a]:void 0:[]},m.filter.ID=function(b,a){var d=typeof b.getAttributeNode!=="undefined"&&b.getAttributeNode("id");return b.nodeType===1&&d&&d.nodeValue===a};c.removeChild(b);c=b=
|
66
|
+
null})();(function(){var b=document.createElement("div");b.appendChild(document.createComment(""));if(b.getElementsByTagName("*").length>0)m.find.TAG=function(b,a){var c=a.getElementsByTagName(b[1]);if(b[1]==="*"){for(var g=[],f=0;c[f];f++)c[f].nodeType===1&&g.push(c[f]);c=g}return c};b.innerHTML="<a href='#'></a>";if(b.firstChild&&typeof b.firstChild.getAttribute!=="undefined"&&b.firstChild.getAttribute("href")!=="#")m.attrHandle.href=function(b){return b.getAttribute("href",2)};b=null})();document.querySelectorAll&&
|
67
|
+
function(){var b=q,a=document.createElement("div");a.innerHTML="<p class='TEST'></p>";if(!(a.querySelectorAll&&a.querySelectorAll(".TEST").length===0)){q=function(a,d,c,g){d=d||document;if(!g&&d.nodeType===9&&!F(d))try{return x(d.querySelectorAll(a),c)}catch(f){}return b(a,d,c,g)};for(var c in b)q[c]=b[c];a=null}}();(function(){var b=document.createElement("div");b.innerHTML="<div class='test e'></div><div class='test'></div>";if(b.getElementsByClassName&&b.getElementsByClassName("e").length!==0&&
|
68
|
+
(b.lastChild.className="e",b.getElementsByClassName("e").length!==1))m.order.splice(1,0,"CLASS"),m.find.CLASS=function(b,a,c){if(typeof a.getElementsByClassName!=="undefined"&&!c)return a.getElementsByClassName(b[1])},b=null})();var T=document.compareDocumentPosition?function(b,a){return!!(b.compareDocumentPosition(a)&16)}:function(b,a){return b!==a&&(b.contains?b.contains(a):!0)},F=function(b){return(b=(b?b.ownerDocument||b:0).documentElement)?b.nodeName!=="HTML":!1},G=function(b,a){for(var c=[],
|
69
|
+
g="",f,e=a.nodeType?[a]:a;f=m.match.PSEUDO.exec(b);)g+=f[0],b=b.replace(m.match.PSEUDO,"");b=m.relative[b]?b+"*":b;f=0;for(var s=e.length;f<s;f++)q(b,e[f],c);return q.filter(g,c)};return q});
|
70
|
+
define("ninja/event-scribe",["require","exports","module"],function(){function i(){this.handlers={};this.currentElement=null}i.prototype={makeHandlersRemove:function(i){for(var c in this.handlers){var e=this.handlers[c];this.handlers[c]=function(a){e.call(this,a);jQuery(i).remove()}}},recordEventHandlers:function(i,c){if(this.currentElement!==i.element){if(this.currentElement!==null)this.makeHandlersRemove(this.currentElement),this.applyEventHandlers(this.currentElement),this.handlers={};this.currentElement=
|
71
|
+
i.element}for(var e in c.eventHandlers){var a=this.handlers[e];typeof a=="undefined"&&(a=function(){return!0});this.handlers[e]=c.buildHandler(i,e,a)}},applyEventHandlers:function(i){for(var c in this.handlers)jQuery(i).bind(c,this.handlers[c])}};return i});
|
72
|
+
define("ninja/behavior-collection",["sizzle-1.0","ninja/behaviors","utils","ninja/event-scribe","ninja/exceptions"],function(i,l,c,e,a){function f(a){this.lexicalCount=0;this.eventQueue=[];this.behaviors={};this.selectors=[];this.mutationTargets=[];this.tools=a;return this}var p=c.forEach,r=c.log,q=a.TransformFailed,m=a.CouldntChoose;f.prototype={addBehavior:function(a,g){c.isArray(g)?p(g,function(c){this.addBehavior(a,c)},this):g instanceof l.base?this.insertBehavior(a,g):g instanceof l.select?this.insertBehavior(a,
|
73
|
+
g):g instanceof l.meta?this.insertBehavior(a,g):typeof g=="function"?this.addBehavior(a,g()):(g=new l.base(g),this.addBehavior(a,g))},insertBehavior:function(a,c){c.lexicalOrder=this.lexicalCount;this.lexicalCount+=1;this.behaviors[a]===void 0?(this.selectors.push(a),this.behaviors[a]=[c]):this.behaviors[a].push(c)},addMutationTargets:function(a){this.mutationTargets=this.mutationTargets.concat(a)},fireMutationEvent:function(){var a=this.mutationTargets;if(a.length>0)for(var c=a[0];a.length>0;c=a.shift())jQuery(c).trigger("thisChangedDOM");
|
74
|
+
else this.tools.getRootOfDocument().trigger("thisChangedDOM")},mutationEventTriggered:function(a){this.eventQueue.length==0?(r("mutation event - first"),this.enqueueEvent(a),this.handleQueue()):(r("mutation event - queueing"),this.enqueueEvent(a))},enqueueEvent:function(a){var c=!1,f=[];p(this.eventQueue,function(e){c=c||jQuery.contains(e.target,a.target);jQuery.contains(a.target,e.target)||f.push(e)});if(!c)f.unshift(a),this.eventQueue=f},handleQueue:function(){for(;this.eventQueue.length!=0;)this.applyAll(this.eventQueue[0].target),
|
75
|
+
this.eventQueue.shift()},applyBehaviorsTo:function(a,c){return this.applyBehaviorsInContext(new this.tools.behaviorContext,a,c)},applyBehaviorsInContext:function(a,c,f){var m,i=new e;this.tools.enrich(i.handlers,a.eventHandlerSet);f=f.sort(function(a,c){return a.priority!=c.priority?a.priority===void 0?-1:c.priority===void 0?1:a.priority-c.priority:a.lexicalOrder-c.lexicalOrder});p(f,function(f){try{m=f.inContext(a),c=f.applyTransform(m,c),a=m,a.element=c,i.recordEventHandlers(a,f)}catch(e){if(e instanceof
|
76
|
+
q)r("!!! Transform failed");else throw r(e),e;}});jQuery(c).data("ninja-visited",a);i.applyEventHandlers(c);this.tools.enrich(a.eventHandlerSet,i.handlers);this.fireMutationEvent();return c},collectBehaviors:function(a,c,f){p(f,function(f){try{c.push(f.choose(a))}catch(e){if(e instanceof m)r("!!! couldn't choose");else throw r(e),e;}})},apply:function(a,c,f){var e=[],m=this.selectors.length;this.collectBehaviors(a,e,c);if(c=jQuery(a).data("ninja-visited"))c.unbindHandlers(),this.applyBehaviorsInContext(c,
|
77
|
+
a,e);else{for(typeof f=="undefined"&&(f=0);f<m;f++)jQuery(a).is(this.selectors[f])&&this.collectBehaviors(a,e,this.behaviors[this.selectors[f]]);this.applyBehaviorsTo(a,e)}},applyAll:function(a){for(var c=this.selectors.length,f=0;f<c;f++){var e=this;p(i(this.selectors[f],a),function(a){jQuery(a).data("ninja-visited")||e.apply(a,[],f)})}}};return f});
|
78
|
+
define("ninja/root-context",["utils"],function(i){var l=i.forEach;return function(c){function e(){this.stashedElements=[];this.eventHandlerSet={}}e.prototype=c.enrich(c,{stash:function(a){this.stashedElements.unshift(a)},unstash:function(){return this.stashedElements.shift()},clearStash:function(){this.stashedElements=[]},cascadeEvent:function(a){var c=Ninja.tools.hiddenDiv();l(this.stashedElements,function(e){e=jQuery(e);e.data("ninja-visited",this);jQuery(c).append(e);e.trigger(a)})},unbindHandlers:function(){var a=
|
79
|
+
jQuery(this.element);for(eventName in this.eventHandlerSet)a.unbind(eventName,this.eventHandlerSet[eventName])}});return e}});
|
80
|
+
define("ninja/tools",["ninja/behaviors","ninja/behavior-collection","ninja/exceptions","utils","ninja/root-context"],function(i,l,c,e,a){function f(c){this.ninja=c;this.behaviorContext=a(this)}var p=e.log;f.prototype={forEach:e.forEach,enrich:function(a,c){return jQuery.extend(a,c)},ensureDefaults:function(a,c){a instanceof Object||(a={});for(var f in c)typeof a[f]=="undefined"&&(typeof this.ninja.config[f]!="undefined"?a[f]=this.ninja.config[f]:typeof c[f]!="undefined"&&(a[f]=c[f]));return a},getRootOfDocument:function(){return jQuery("html")},
|
81
|
+
clearRootCollection:function(){this.ninja.behavior=this.ninja.goodBehavior;this.getRootOfDocument().data("ninja-behavior",null)},getRootCollection:function(){var a=this.getRootOfDocument();if(a.data("ninja-behavior")instanceof l)return a.data("ninja-behavior");var c=new l(this);a.data("ninja-behavior",c);return c},addMutationTargets:function(a){this.getRootCollection().addMutationTargets(a)},fireMutationEvent:function(){this.getRootCollection().fireMutationEvent()},detachSyntheticMutationEvents:function(){this.getRootCollection().fireMutationEvent=
|
82
|
+
function(){};this.getRootCollection().addMutationTargets=function(){}},copyAttributes:function(a,c,f){var e=RegExp("^"+f.join("$|^")+"$"),c=jQuery(c);this.forEach(a.attributes,function(a){e.test(a.nodeName)&&c.attr(a.nodeName,a.nodeValue)})},deriveElementsFrom:function(a,c){switch(typeof c){case "undefined":return a;case "string":return jQuery(c);case "function":return c(a)}},extractMethod:function(a,c){if(a.dataset!==void 0&&a.dataset.method!==void 0&&a.dataset.method.length>0)return p("Override via dataset: "+
|
83
|
+
a.dataset.method),a.dataset.method;if(a.dataset===void 0&&jQuery(a).attr("data-method")!==void 0)return p("Override via data-method: "+jQuery(a).attr("data-method")),jQuery(a).attr("data-method");if(typeof c!=="undefined")for(var f=0,e=c.length;f<e;f++)if(c[f].name=="Method")return p("Override via Method: "+c[f].value),c[f].value;return typeof a.method!=="undefined"?a.method:"GET"},cantTransform:function(){throw new TransformFailedException;},applyBehaviors:function(a,c){this.getRootCollection().apply(a,
|
84
|
+
c)},message:function(a,c){var f=this.ninja.config.messageWrapping(a,c);jQuery(this.ninja.config.messageList).append(f)},hiddenDiv:function(){var a=jQuery("div#ninja-hide");if(a.length>0)return a[0];a=jQuery("<div id='ninja-hide'></div>").css("display","none");jQuery("body").append(a);this.getRootCollection().applyBehaviorsTo(a,[this.ninja.suppressChangeEvents()]);return a}};return f});
|
85
|
+
define("ninja/configuration",["require","exports","module"],function(){return{messageWrapping:function(i,l){return"<div class='flash "+l+"'><p>"+i+"</p></div>"},messageList:"#messages",busyLaziness:200}});
|
86
|
+
define("ninja",["utils","ninja/tools","ninja/behaviors","ninja/configuration"],function(i,l,c,e){function a(){this.config=e;this.behavior=this.goodBehavior;this.tools=new l(this)}var f=i.log;a.prototype={packageBehaviors:function(a){result=a({does:c.base,chooses:c.meta,selects:c.select});this.tools.enrich(this,result)},packageTools:function(a){this.tools.enrich(l.prototype,a)},configure:function(a){this.tools.enrich(this.config,a)},goodBehavior:function(a){var c=this.tools.getRootCollection(),e;for(e in a)typeof a[e]==
|
87
|
+
"undefined"?f("Selector "+e+" not properly defined - ignoring"):c.addBehavior(e,a[e]);jQuery(window).load(function(){Ninja.go()})},badBehavior:function(){throw Error("Called Ninja.behavior() after Ninja.go() - don't do that. 'Go' means 'I'm done, please proceed'");},go:function(){function a(f){c.tools.getRootCollection().mutationEventTriggered(f)}var c=this;if(this.behavior!=this.misbehavior){var f=this.tools.getRootOfDocument();f.bind("DOMSubtreeModified DOMNodeInserted thisChangedDOM",a);f.one("DOMSubtreeModified DOMNodeInserted",
|
88
|
+
function(){c.tools.detachSyntheticMutationEvents()});this.behavior=this.badBehavior;this.tools.fireMutationEvent()}}};return new a});define("ninja/behaviors/utility",["ninja"],function(i){i.packageBehaviors(function(i){return{suppressChangeEvents:function(){return new i.does({events:{DOMSubtreeModified:function(){},DOMNodeInserted:function(){}}})}}})});
|
89
|
+
define("ninja/behaviors/standard",["ninja","utils"],function(i,l){var c=l.log;i.packageBehaviors(function(e){return{submitsAsAjax:function(a){return new e.chooses(function(c){c.asLink=i.submitsAsAjaxLink(a);c.asForm=i.submitsAsAjaxForm(a)},function(a){switch(a.tagName.toLowerCase()){case "a":return this.asLink;case "form":return this.asForm}})},submitsAsAjaxLink:function(a){a=i.tools.ensureDefaults(a,{busyElement:function(a){return $(a).parents("address,blockquote,body,dd,div,p,dl,dt,table,form,ol,ul,tr")[0]}});
|
90
|
+
return new e.does({priority:10,helpers:{findOverlay:function(c){return this.deriveElementsFrom(c,a.busyElement)}},events:{click:function(c){this.overlayAndSubmit(c.target,c.target.href,a.actions)}}})},submitsAsAjaxForm:function(a){a=i.tools.ensureDefaults(a,{busyElement:void 0});return new e.does({priority:20,helpers:{findOverlay:function(c){return this.deriveElementsFrom(c,a.busyElement)}},events:{submit:function(c){this.overlayAndSubmit(c.target,c.target.action,a.actions)}}})},becomesAjaxLink:function(a){a=
|
91
|
+
i.tools.ensureDefaults(a,{busyElement:void 0,retainedFormAttributes:["id","class","lang","dir","title","data-.*"]});return[i.submitsAsAjax(a),i.becomesLink(a)]},becomesLink:function(a){a=i.tools.ensureDefaults(a,{retainedFormAttributes:["id","class","lang","dir","title","rel","data-.*"]});return new e.does({priority:30,transform:function(f){var e;(images=jQuery("input[type=image]",f)).size()>0?(image=images[0],e="<img src='"+image.src+"' alt='"+image.alt+"'"):(submits=jQuery("input[type=submit]",
|
92
|
+
f)).size()>0?(submit=submits[0],submits.size()>1&&c("Multiple submits. Using: "+submit),e=submit.value):(c("Couldn't find a submit input in form"),this.cantTransform());e=jQuery("<a rel='nofollow' href='#'>"+e+"</a>");this.copyAttributes(f,e,a.retainedFormAttributes);this.stash(jQuery(f).replaceWith(e));return e},events:{click:function(){this.cascadeEvent("submit")}}})},decays:function(a){a=i.tools.ensureDefaults(a,{lifetime:1E4,diesFor:600});return new e.does({priority:100,transform:function(c){jQuery(c).delay(a.lifetime).slideUp(a.diesFor,
|
93
|
+
function(){jQuery(c).remove();i.tools.fireMutationEvent()})},events:{click:[function(){jQuery(this.element).remove()},"changesDOM"]}})}}})});
|
94
|
+
define("ninja/behaviors/placeholder",["ninja"],function(i){i.packageBehaviors(function(l){function c(a){return new l.does({priority:1E3,submit:[function(c,g,f){a.prepareForSubmit();f(c)},"andDoDefault"]})}function e(a){a=i.tools.ensureDefaults(a,{textElementSelector:function(a){return"*[data-for="+a.id+"]"},findTextElement:function(c){c=$(a.textElementSelector(c));return c.length==0?null:c[0]}});return new l.does({priority:-10,transform:function(c){var g=$(a.findTextElement(c));g===null&&this.cantTransform();
|
95
|
+
this.placeholderText=g.text();$(c).attr("placeholder",g.text());this.stash(g.detach())}})}var a=!!("placeholder"in document.createElement("input")),f=!!("placeholder"in document.createElement("textarea"));if(!a)var p=function(a,f){return new l.does({helpers:{prepareForSubmit:function(){$(this.element).val("")}},transform:function(){this.applyBehaviors(f,[c(this)])},events:{focus:function(){var c=$(this.element),f=c.attr("id");c.attr("id","");c.replaceWith(a);a.attr("id",f);a.focus()}}})},r=function(a){a=
|
96
|
+
i.tools.ensureDefaults(a,{findParentForm:function(a){return a.parents("form")[0]},retainedInputAttributes:["name","class","style","title","lang","dir","size","maxlength","alt","tabindex","accesskey","data-.*"]});return new l.does({priority:1E3,helpers:{swapInAlternate:function(){var a=$(this.element),c=a.attr("id");a.val()==""&&(a.attr("id",""),a.replaceWith(this.placeholderTextInput),this.placeholderTextInput.attr("id",c))}},transform:function(c){var f,e=$(c);f=$('<input type="text">');this.copyAttributes(c,
|
97
|
+
f,a.retainedInputAttributes);f.addClass("ninja_placeholder");f.val(this.placeholderText);e=p(e,a.findParentForm(e));this.applyBehaviors(f,[e]);this.placeholderTextInput=f;this.swapInAlternate();return c},events:{blur:function(){this.swapInAlternate()}}})};if(!a||!f)var q=function(a){a=i.tools.ensureDefaults(a,{findParentForm:function(a){return a.parents("form")[0]}});return new l.does({priority:1E3,helpers:{prepareForSubmit:function(){$(this.element).hasClass("ninja_placeholder")&&$(this.element).val("")}},
|
98
|
+
transform:function(f){var e=$(f);e.addClass("ninja_placeholder");e.val(this.placeholderText);this.applyBehaviors(a.findParentForm(e),[c(this)]);return f},events:{focus:function(){$(this.element).hasClass("ninja_placeholder")&&$(this.element).removeClass("ninja_placeholder").val("")},blur:function(){$(this.element).val()==""&&$(this.element).addClass("ninja_placeholder").val(this.placeholderText)}}})};return{hasPlaceholder:function(c){var i=[e(c)];(!a||!f)&&i.push(new l.chooses(function(e){a?(e.asTextInput=
|
99
|
+
null,e.asPassword=null):(e.asTextInput=q(c),e.asPassword=r(c));e.asTextArea=f?null:q(c)},function(a){a=$(a);if(a.is("input[type=text]"))return this.asTextInput;else if(a.is("textarea"))return this.asTextArea;else if(a.is("input[type=password]"))return this.asPassword}));return i}}})});
|
100
|
+
define("ninja/behaviors/trigger-on",["ninja"],function(i){i.packageBehaviors(function(l){return{triggersOnSelect:function(c){var e=c=i.tools.ensureDefaults(c,{busyElement:void 0,placeholderText:"Select to go",placeholderValue:"instructions"});if(typeof c.actions==="object")e=c.actions;return new l.does({priority:20,helpers:{findOverlay:function(a){return this.deriveElementsFrom(a,c.busyElement)}},transform:function(a){var f=$(a).find("select").first();typeof f=="undefined"&&this.cantTransform();f.prepend("<option value='"+
|
101
|
+
c.placeholderValue+"'> "+c.placeholderText+"</option>");f.val(c.placeholderValue);$(a).find("input[type='submit']").remove();return a},events:{change:[function(a,c){this.overlayAndSubmit(c,c.action,e)},"andDoDefault"]}})}}})});define("ninja/behaviors/all",["./utility","./standard","./placeholder","./trigger-on"],function(){});
|
102
|
+
define("ninja/tools/overlay",["utils","ninja"],function(i,l){function c(a){a=this.convertToElementArray(a);this.laziness=0;var c=this;this.set=jQuery(jQuery.map(a,function(a){return c.buildOverlayFor(a)}))}var e=i.forEach;c.prototype={convertToElementArray:function(a){var c=this;switch(typeof a){case "undefined":return[];case "boolean":return[];case "string":return c.convertToElementArray(jQuery(a));case "function":return c.convertToElementArray(a());case "object":if("focus"in a&&"blur"in a&&!("jquery"in
|
103
|
+
a))return[a];else if("length"in a&&"0"in a){var i=[];e(a,function(a){i=i.concat(c.convertToElementArray(a))});return i}else return[]}},buildOverlayFor:function(a){var c=jQuery(document.createElement("div")),a=jQuery(a),e=a.offset();c.css("position","absolute");c.css("top",e.top);c.css("left",e.left);c.width(a.outerWidth());c.height(a.outerHeight());c.css("zIndex","2");c.css("display","none");return c[0]},affix:function(){this.set.appendTo(jQuery("body"));overlaySet=this.set;window.setTimeout(function(){overlaySet.css("display",
|
104
|
+
"block")},this.laziness)},remove:function(){this.set.remove()}};l.packageTools({overlay:function(){return new c(jQuery.makeArray(arguments))},busyOverlay:function(a){a=this.overlay(a);a.set.addClass("ninja_busy");a.laziness=this.ninja.config.busyLaziness;return a},buildOverlayFor:function(a){var c=jQuery(document.createElement("div")),a=jQuery(a),e=a.offset();c.css("position","absolute");c.css("top",e.top);c.css("left",e.left);c.width(a.outerWidth());c.height(a.outerHeight());c.css("zIndex","2");
|
105
|
+
return c}});return c});define("ninja/tools/json-handler",["ninja"],function(i){function l(c){this.desc=c}l.prototype={receive:function(c){this.compose([],c,this.desc);return null},compose:function(c,e,a){for(var f in e)e.hasOwnProperty(f)&&f in a&&(typeof a[f]=="function"?a[f].call(this,e[f]):this.compose(c+[f],e[f],a[f]));return null}};i.packageTools({jsonHandler:function(c){return new l(c)}});return l});
|
106
|
+
define("ninja/tools/ajax-submitter",["ninja","utils","./json-handler","./overlay"],function(i,l){function c(){this.formData=[];this.action="/";this.method="GET";this.dataType="script";return this}var e=l.log;c.prototype={submit:function(){e("Computed method: "+this.method);jQuery.ajax(this.ajaxData())},sourceForm:function(a){this.formData=jQuery(a).serializeArray()},ajaxData:function(){return{data:this.formData,dataType:this.dataType,url:this.action,type:this.method,complete:this.responseHandler(),
|
107
|
+
success:this.successHandler(),error:this.onError}},successHandler:function(){var a=this;return function(c,e,i){a.onSuccess(i,e,c)}},responseHandler:function(){var a=this;return function(c,e){a.onResponse(c,e);i.tools.fireMutationEvent()}},onResponse:function(){},onSuccess:function(){},onError:function(a){e(a.responseText);i.tools.message("Server error: "+a.statusText,"error")}};i.packageTools({ajaxSubmitter:function(){return new c},ajaxToJson:function(a){var c=this.jsonHandler(a),a=this.ajaxSubmitter();
|
108
|
+
a.dataType="json";a.onSuccess=function(a,e,i){c.receive(i)};return a},overlayAndSubmit:function(a,c,e){var i=this.busyOverlay(this.findOverlay(a)),e=typeof e=="undefined"?this.ajaxSubmitter():this.ajaxToJson(e);e.sourceForm(a);e.action=c;e.method=this.extractMethod(a,e.formData);e.onResponse=function(){i.remove()};i.affix();e.submit()}});return c});define("ninja/tools/all",["./overlay","./ajax-submitter","./json-handler"],function(){});
|
109
|
+
define("ninja/jquery",["ninja"],function(i){jQuery.extend({ninja:i,behavior:i.behavior})});require(["ninja","ninja/behaviors/all","ninja/tools/all","ninja/jquery"],function(i){window.Ninja=i;i.behavior=i.behavior});define("main",function(){});
|
@@ -0,0 +1,332 @@
|
|
1
|
+
/**
|
2
|
+
* Unobtrusive scripting adapter for jQuery
|
3
|
+
*
|
4
|
+
* Requires jQuery 1.6.0 or later.
|
5
|
+
* https://github.com/rails/jquery-ujs
|
6
|
+
|
7
|
+
* Uploading file using rails.js
|
8
|
+
* =============================
|
9
|
+
*
|
10
|
+
* By default, browsers do not allow files to be uploaded via AJAX. As a result, if there are any non-blank file fields
|
11
|
+
* in the remote form, this adapter aborts the AJAX submission and allows the form to submit through standard means.
|
12
|
+
*
|
13
|
+
* The `ajax:aborted:file` event allows you to bind your own handler to process the form submission however you wish.
|
14
|
+
*
|
15
|
+
* Ex:
|
16
|
+
* $('form').live('ajax:aborted:file', function(event, elements){
|
17
|
+
* // Implement own remote file-transfer handler here for non-blank file inputs passed in `elements`.
|
18
|
+
* // Returning false in this handler tells rails.js to disallow standard form submission
|
19
|
+
* return false;
|
20
|
+
* });
|
21
|
+
*
|
22
|
+
* The `ajax:aborted:file` event is fired when a file-type input is detected with a non-blank value.
|
23
|
+
*
|
24
|
+
* Third-party tools can use this hook to detect when an AJAX file upload is attempted, and then use
|
25
|
+
* techniques like the iframe method to upload the file instead.
|
26
|
+
*
|
27
|
+
* Required fields in rails.js
|
28
|
+
* ===========================
|
29
|
+
*
|
30
|
+
* If any blank required inputs (required="required") are detected in the remote form, the whole form submission
|
31
|
+
* is canceled. Note that this is unlike file inputs, which still allow standard (non-AJAX) form submission.
|
32
|
+
*
|
33
|
+
* The `ajax:aborted:required` event allows you to bind your own handler to inform the user of blank required inputs.
|
34
|
+
*
|
35
|
+
* !! Note that Opera does not fire the form's submit event if there are blank required inputs, so this event may never
|
36
|
+
* get fired in Opera. This event is what causes other browsers to exhibit the same submit-aborting behavior.
|
37
|
+
*
|
38
|
+
* Ex:
|
39
|
+
* $('form').live('ajax:aborted:required', function(event, elements){
|
40
|
+
* // Returning false in this handler tells rails.js to submit the form anyway.
|
41
|
+
* // The blank required inputs are passed to this function in `elements`.
|
42
|
+
* return ! confirm("Would you like to submit the form with missing info?");
|
43
|
+
* });
|
44
|
+
*/
|
45
|
+
|
46
|
+
(function($, undefined) {
|
47
|
+
// Shorthand to make it a little easier to call public rails functions from within rails.js
|
48
|
+
var rails;
|
49
|
+
|
50
|
+
$.rails = rails = {
|
51
|
+
// Link elements bound by jquery-ujs
|
52
|
+
linkClickSelector: 'a[data-confirm], a[data-method], a[data-remote]',
|
53
|
+
|
54
|
+
// Select elements bound by jquery-ujs
|
55
|
+
selectChangeSelector: 'select[data-remote]',
|
56
|
+
|
57
|
+
// Form elements bound by jquery-ujs
|
58
|
+
formSubmitSelector: 'form',
|
59
|
+
|
60
|
+
// Form input elements bound by jquery-ujs
|
61
|
+
formInputClickSelector: 'form input[type=submit], form input[type=image], form button[type=submit], form button:not([type])',
|
62
|
+
|
63
|
+
// Form input elements disabled during form submission
|
64
|
+
disableSelector: 'input[data-disable-with], button[data-disable-with], textarea[data-disable-with]',
|
65
|
+
|
66
|
+
// Form input elements re-enabled after form submission
|
67
|
+
enableSelector: 'input[data-disable-with]:disabled, button[data-disable-with]:disabled, textarea[data-disable-with]:disabled',
|
68
|
+
|
69
|
+
// Form required input elements
|
70
|
+
requiredInputSelector: 'input[name][required]:not([disabled]),textarea[name][required]:not([disabled])',
|
71
|
+
|
72
|
+
// Form file input elements
|
73
|
+
fileInputSelector: 'input:file',
|
74
|
+
|
75
|
+
// Make sure that every Ajax request sends the CSRF token
|
76
|
+
CSRFProtection: function(xhr) {
|
77
|
+
var token = $('meta[name="csrf-token"]').attr('content');
|
78
|
+
if (token) xhr.setRequestHeader('X-CSRF-Token', token);
|
79
|
+
},
|
80
|
+
|
81
|
+
// Triggers an event on an element and returns false if the event result is false
|
82
|
+
fire: function(obj, name, data) {
|
83
|
+
var event = $.Event(name);
|
84
|
+
obj.trigger(event, data);
|
85
|
+
return event.result !== false;
|
86
|
+
},
|
87
|
+
|
88
|
+
// Default confirm dialog, may be overridden with custom confirm dialog in $.rails.confirm
|
89
|
+
confirm: function(message) {
|
90
|
+
return confirm(message);
|
91
|
+
},
|
92
|
+
|
93
|
+
// Default ajax function, may be overridden with custom function in $.rails.ajax
|
94
|
+
ajax: function(options) {
|
95
|
+
return $.ajax(options);
|
96
|
+
},
|
97
|
+
|
98
|
+
// Submits "remote" forms and links with ajax
|
99
|
+
handleRemote: function(element) {
|
100
|
+
var method, url, data,
|
101
|
+
crossDomain = element.data('cross-domain') || null,
|
102
|
+
dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType),
|
103
|
+
options;
|
104
|
+
|
105
|
+
if (rails.fire(element, 'ajax:before')) {
|
106
|
+
|
107
|
+
if (element.is('form')) {
|
108
|
+
method = element.attr('method');
|
109
|
+
url = element.attr('action');
|
110
|
+
data = element.serializeArray();
|
111
|
+
// memoized value from clicked submit button
|
112
|
+
var button = element.data('ujs:submit-button');
|
113
|
+
if (button) {
|
114
|
+
data.push(button);
|
115
|
+
element.data('ujs:submit-button', null);
|
116
|
+
}
|
117
|
+
} else if (element.is('select')) {
|
118
|
+
method = element.data('method');
|
119
|
+
url = element.data('url');
|
120
|
+
data = element.serialize();
|
121
|
+
if (element.data('params')) data = data + "&" + element.data('params');
|
122
|
+
} else {
|
123
|
+
method = element.data('method');
|
124
|
+
url = element.attr('href');
|
125
|
+
data = element.data('params') || null;
|
126
|
+
}
|
127
|
+
|
128
|
+
options = {
|
129
|
+
type: method || 'GET', data: data, dataType: dataType, crossDomain: crossDomain,
|
130
|
+
// stopping the "ajax:beforeSend" event will cancel the ajax request
|
131
|
+
beforeSend: function(xhr, settings) {
|
132
|
+
if (settings.dataType === undefined) {
|
133
|
+
xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script);
|
134
|
+
}
|
135
|
+
return rails.fire(element, 'ajax:beforeSend', [xhr, settings]);
|
136
|
+
},
|
137
|
+
success: function(data, status, xhr) {
|
138
|
+
element.trigger('ajax:success', [data, status, xhr]);
|
139
|
+
},
|
140
|
+
complete: function(xhr, status) {
|
141
|
+
element.trigger('ajax:complete', [xhr, status]);
|
142
|
+
},
|
143
|
+
error: function(xhr, status, error) {
|
144
|
+
element.trigger('ajax:error', [xhr, status, error]);
|
145
|
+
}
|
146
|
+
};
|
147
|
+
// Only pass url to `ajax` options if not blank
|
148
|
+
if (url) { options.url = url; }
|
149
|
+
|
150
|
+
rails.ajax(options);
|
151
|
+
}
|
152
|
+
},
|
153
|
+
|
154
|
+
// Handles "data-method" on links such as:
|
155
|
+
// <a href="/users/5" data-method="delete" rel="nofollow" data-confirm="Are you sure?">Delete</a>
|
156
|
+
handleMethod: function(link) {
|
157
|
+
var href = link.attr('href'),
|
158
|
+
method = link.data('method'),
|
159
|
+
csrf_token = $('meta[name=csrf-token]').attr('content'),
|
160
|
+
csrf_param = $('meta[name=csrf-param]').attr('content'),
|
161
|
+
form = $('<form method="post" action="' + href + '"></form>'),
|
162
|
+
metadata_input = '<input name="_method" value="' + method + '" type="hidden" />';
|
163
|
+
|
164
|
+
if (csrf_param !== undefined && csrf_token !== undefined) {
|
165
|
+
metadata_input += '<input name="' + csrf_param + '" value="' + csrf_token + '" type="hidden" />';
|
166
|
+
}
|
167
|
+
|
168
|
+
form.hide().append(metadata_input).appendTo('body');
|
169
|
+
form.submit();
|
170
|
+
},
|
171
|
+
|
172
|
+
/* Disables form elements:
|
173
|
+
- Caches element value in 'ujs:enable-with' data store
|
174
|
+
- Replaces element text with value of 'data-disable-with' attribute
|
175
|
+
- Adds disabled=disabled attribute
|
176
|
+
*/
|
177
|
+
disableFormElements: function(form) {
|
178
|
+
form.find(rails.disableSelector).each(function() {
|
179
|
+
var element = $(this), method = element.is('button') ? 'html' : 'val';
|
180
|
+
element.data('ujs:enable-with', element[method]());
|
181
|
+
element[method](element.data('disable-with'));
|
182
|
+
element.attr('disabled', 'disabled');
|
183
|
+
});
|
184
|
+
},
|
185
|
+
|
186
|
+
/* Re-enables disabled form elements:
|
187
|
+
- Replaces element text with cached value from 'ujs:enable-with' data store (created in `disableFormElements`)
|
188
|
+
- Removes disabled attribute
|
189
|
+
*/
|
190
|
+
enableFormElements: function(form) {
|
191
|
+
form.find(rails.enableSelector).each(function() {
|
192
|
+
var element = $(this), method = element.is('button') ? 'html' : 'val';
|
193
|
+
if (element.data('ujs:enable-with')) element[method](element.data('ujs:enable-with'));
|
194
|
+
element.removeAttr('disabled');
|
195
|
+
});
|
196
|
+
},
|
197
|
+
|
198
|
+
/* For 'data-confirm' attribute:
|
199
|
+
- Fires `confirm` event
|
200
|
+
- Shows the confirmation dialog
|
201
|
+
- Fires the `confirm:complete` event
|
202
|
+
|
203
|
+
Returns `true` if no function stops the chain and user chose yes; `false` otherwise.
|
204
|
+
Attaching a handler to the element's `confirm` event that returns a `falsy` value cancels the confirmation dialog.
|
205
|
+
Attaching a handler to the element's `confirm:complete` event that returns a `falsy` value makes this function
|
206
|
+
return false. The `confirm:complete` event is fired whether or not the user answered true or false to the dialog.
|
207
|
+
*/
|
208
|
+
allowAction: function(element) {
|
209
|
+
var message = element.data('confirm'),
|
210
|
+
answer = false, callback;
|
211
|
+
if (!message) { return true; }
|
212
|
+
|
213
|
+
if (rails.fire(element, 'confirm')) {
|
214
|
+
answer = rails.confirm(message);
|
215
|
+
callback = rails.fire(element, 'confirm:complete', [answer]);
|
216
|
+
}
|
217
|
+
return answer && callback;
|
218
|
+
},
|
219
|
+
|
220
|
+
// Helper function which checks for blank inputs in a form that match the specified CSS selector
|
221
|
+
blankInputs: function(form, specifiedSelector, nonBlank) {
|
222
|
+
var inputs = $(), input,
|
223
|
+
selector = specifiedSelector || 'input,textarea';
|
224
|
+
form.find(selector).each(function() {
|
225
|
+
input = $(this);
|
226
|
+
// Collect non-blank inputs if nonBlank option is true, otherwise, collect blank inputs
|
227
|
+
if (nonBlank ? input.val() : !input.val()) {
|
228
|
+
inputs = inputs.add(input);
|
229
|
+
}
|
230
|
+
});
|
231
|
+
return inputs.length ? inputs : false;
|
232
|
+
},
|
233
|
+
|
234
|
+
// Helper function which checks for non-blank inputs in a form that match the specified CSS selector
|
235
|
+
nonBlankInputs: function(form, specifiedSelector) {
|
236
|
+
return rails.blankInputs(form, specifiedSelector, true); // true specifies nonBlank
|
237
|
+
},
|
238
|
+
|
239
|
+
// Helper function, needed to provide consistent behavior in IE
|
240
|
+
stopEverything: function(e) {
|
241
|
+
$(e.target).trigger('ujs:everythingStopped');
|
242
|
+
e.stopImmediatePropagation();
|
243
|
+
return false;
|
244
|
+
},
|
245
|
+
|
246
|
+
// find all the submit events directly bound to the form and
|
247
|
+
// manually invoke them. If anyone returns false then stop the loop
|
248
|
+
callFormSubmitBindings: function(form) {
|
249
|
+
var events = form.data('events'), continuePropagation = true;
|
250
|
+
if (events !== undefined && events['submit'] !== undefined) {
|
251
|
+
$.each(events['submit'], function(i, obj){
|
252
|
+
if (typeof obj.handler === 'function') return continuePropagation = obj.handler(obj.data);
|
253
|
+
});
|
254
|
+
}
|
255
|
+
return continuePropagation;
|
256
|
+
}
|
257
|
+
};
|
258
|
+
|
259
|
+
$.ajaxPrefilter(function(options, originalOptions, xhr){ if ( !options.crossDomain ) { rails.CSRFProtection(xhr); }});
|
260
|
+
|
261
|
+
$(rails.linkClickSelector).live('click.rails', function(e) {
|
262
|
+
var link = $(this);
|
263
|
+
if (!rails.allowAction(link)) return rails.stopEverything(e);
|
264
|
+
|
265
|
+
if (link.data('remote') !== undefined) {
|
266
|
+
rails.handleRemote(link);
|
267
|
+
return false;
|
268
|
+
} else if (link.data('method')) {
|
269
|
+
rails.handleMethod(link);
|
270
|
+
return false;
|
271
|
+
}
|
272
|
+
});
|
273
|
+
|
274
|
+
$(rails.selectChangeSelector).live('change.rails', function(e) {
|
275
|
+
var link = $(this);
|
276
|
+
if (!rails.allowAction(link)) return rails.stopEverything(e);
|
277
|
+
|
278
|
+
rails.handleRemote(link);
|
279
|
+
return false;
|
280
|
+
});
|
281
|
+
|
282
|
+
$(rails.formSubmitSelector).live('submit.rails', function(e) {
|
283
|
+
var form = $(this),
|
284
|
+
remote = form.data('remote') !== undefined,
|
285
|
+
blankRequiredInputs = rails.blankInputs(form, rails.requiredInputSelector),
|
286
|
+
nonBlankFileInputs = rails.nonBlankInputs(form, rails.fileInputSelector);
|
287
|
+
|
288
|
+
if (!rails.allowAction(form)) return rails.stopEverything(e);
|
289
|
+
|
290
|
+
// skip other logic when required values are missing or file upload is present
|
291
|
+
if (blankRequiredInputs && form.attr("novalidate") == undefined && rails.fire(form, 'ajax:aborted:required', [blankRequiredInputs])) {
|
292
|
+
return rails.stopEverything(e);
|
293
|
+
}
|
294
|
+
|
295
|
+
if (remote) {
|
296
|
+
if (nonBlankFileInputs) {
|
297
|
+
return rails.fire(form, 'ajax:aborted:file', [nonBlankFileInputs]);
|
298
|
+
}
|
299
|
+
|
300
|
+
// If browser does not support submit bubbling, then this live-binding will be called before direct
|
301
|
+
// bindings. Therefore, we should directly call any direct bindings before remotely submitting form.
|
302
|
+
if (!$.support.submitBubbles && rails.callFormSubmitBindings(form) === false) return rails.stopEverything(e);
|
303
|
+
|
304
|
+
rails.handleRemote(form);
|
305
|
+
return false;
|
306
|
+
} else {
|
307
|
+
// slight timeout so that the submit button gets properly serialized
|
308
|
+
setTimeout(function(){ rails.disableFormElements(form); }, 13);
|
309
|
+
}
|
310
|
+
});
|
311
|
+
|
312
|
+
$(rails.formInputClickSelector).live('click.rails', function(event) {
|
313
|
+
var button = $(this);
|
314
|
+
|
315
|
+
if (!rails.allowAction(button)) return rails.stopEverything(event);
|
316
|
+
|
317
|
+
// register the pressed submit button
|
318
|
+
var name = button.attr('name'),
|
319
|
+
data = name ? {name:name, value:button.val()} : null;
|
320
|
+
|
321
|
+
button.closest('form').data('ujs:submit-button', data);
|
322
|
+
});
|
323
|
+
|
324
|
+
$(rails.formSubmitSelector).live('ajax:beforeSend.rails', function(event) {
|
325
|
+
if (this == event.target) rails.disableFormElements($(this));
|
326
|
+
});
|
327
|
+
|
328
|
+
$(rails.formSubmitSelector).live('ajax:complete.rails', function(event) {
|
329
|
+
if (this == event.target) rails.enableFormElements($(this));
|
330
|
+
});
|
331
|
+
|
332
|
+
})( jQuery );
|