mizugumo 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 );
|