stepy-rails 1.1.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +17 -0
  3. data/.stepy-rails.gemspec.un~ +0 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +29 -0
  7. data/Rakefile +1 -0
  8. data/lib/stepy-rails +1 -0
  9. data/lib/stepy/rails.rb +8 -0
  10. data/lib/stepy/rails/engine.rb +6 -0
  11. data/lib/stepy/rails/version.rb +5 -0
  12. data/stepy-rails.gemspec +22 -0
  13. data/stepy-test/.gitignore +15 -0
  14. data/stepy-test/Gemfile +38 -0
  15. data/stepy-test/README.rdoc +261 -0
  16. data/stepy-test/Rakefile +7 -0
  17. data/stepy-test/app/assets/images/rails.png +0 -0
  18. data/stepy-test/app/assets/javascripts/application.js +15 -0
  19. data/stepy-test/app/assets/stylesheets/application.css +13 -0
  20. data/stepy-test/app/controllers/application_controller.rb +3 -0
  21. data/stepy-test/app/helpers/application_helper.rb +2 -0
  22. data/stepy-test/app/mailers/.gitkeep +0 -0
  23. data/stepy-test/app/models/.gitkeep +0 -0
  24. data/stepy-test/app/views/layouts/application.html.erb +14 -0
  25. data/stepy-test/config.ru +4 -0
  26. data/stepy-test/config/application.rb +62 -0
  27. data/stepy-test/config/boot.rb +6 -0
  28. data/stepy-test/config/database.yml +25 -0
  29. data/stepy-test/config/environment.rb +5 -0
  30. data/stepy-test/config/environments/development.rb +37 -0
  31. data/stepy-test/config/environments/production.rb +67 -0
  32. data/stepy-test/config/environments/test.rb +37 -0
  33. data/stepy-test/config/initializers/backtrace_silencers.rb +7 -0
  34. data/stepy-test/config/initializers/inflections.rb +15 -0
  35. data/stepy-test/config/initializers/mime_types.rb +5 -0
  36. data/stepy-test/config/initializers/secret_token.rb +7 -0
  37. data/stepy-test/config/initializers/session_store.rb +8 -0
  38. data/stepy-test/config/initializers/wrap_parameters.rb +14 -0
  39. data/stepy-test/config/locales/en.yml +5 -0
  40. data/stepy-test/config/routes.rb +58 -0
  41. data/stepy-test/db/seeds.rb +7 -0
  42. data/stepy-test/lib/assets/.gitkeep +0 -0
  43. data/stepy-test/lib/tasks/.gitkeep +0 -0
  44. data/stepy-test/log/.gitkeep +0 -0
  45. data/stepy-test/public/404.html +26 -0
  46. data/stepy-test/public/422.html +26 -0
  47. data/stepy-test/public/500.html +25 -0
  48. data/stepy-test/public/favicon.ico +0 -0
  49. data/stepy-test/public/index.html +241 -0
  50. data/stepy-test/public/robots.txt +5 -0
  51. data/stepy-test/script/rails +6 -0
  52. data/stepy-test/test/fixtures/.gitkeep +0 -0
  53. data/stepy-test/test/functional/.gitkeep +0 -0
  54. data/stepy-test/test/integration/.gitkeep +0 -0
  55. data/stepy-test/test/performance/browsing_test.rb +12 -0
  56. data/stepy-test/test/test_helper.rb +13 -0
  57. data/stepy-test/test/unit/.gitkeep +0 -0
  58. data/stepy-test/vendor/assets/javascripts/.gitkeep +0 -0
  59. data/stepy-test/vendor/assets/stylesheets/.gitkeep +0 -0
  60. data/stepy-test/vendor/plugins/.gitkeep +0 -0
  61. data/vendor/assets/javascripts/jquery.stepy.js +408 -0
  62. data/vendor/assets/stylesheets/jquery.stepy.css +39 -0
  63. metadata +153 -0
@@ -0,0 +1,7 @@
1
+ # This file should contain all the record creation needed to seed the database with its default values.
2
+ # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
3
+ #
4
+ # Examples:
5
+ #
6
+ # cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }])
7
+ # Mayor.create(name: 'Emanuel', city: cities.first)
File without changes
File without changes
File without changes
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/404.html -->
21
+ <div class="dialog">
22
+ <h1>The page you were looking for doesn't exist.</h1>
23
+ <p>You may have mistyped the address or the page may have moved.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/422.html -->
21
+ <div class="dialog">
22
+ <h1>The change you wanted was rejected.</h1>
23
+ <p>Maybe you tried to change something you didn't have access to.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,25 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/500.html -->
21
+ <div class="dialog">
22
+ <h1>We're sorry, but something went wrong.</h1>
23
+ </div>
24
+ </body>
25
+ </html>
File without changes
@@ -0,0 +1,241 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Ruby on Rails: Welcome aboard</title>
5
+ <style type="text/css" media="screen">
6
+ body {
7
+ margin: 0;
8
+ margin-bottom: 25px;
9
+ padding: 0;
10
+ background-color: #f0f0f0;
11
+ font-family: "Lucida Grande", "Bitstream Vera Sans", "Verdana";
12
+ font-size: 13px;
13
+ color: #333;
14
+ }
15
+
16
+ h1 {
17
+ font-size: 28px;
18
+ color: #000;
19
+ }
20
+
21
+ a {color: #03c}
22
+ a:hover {
23
+ background-color: #03c;
24
+ color: white;
25
+ text-decoration: none;
26
+ }
27
+
28
+
29
+ #page {
30
+ background-color: #f0f0f0;
31
+ width: 750px;
32
+ margin: 0;
33
+ margin-left: auto;
34
+ margin-right: auto;
35
+ }
36
+
37
+ #content {
38
+ float: left;
39
+ background-color: white;
40
+ border: 3px solid #aaa;
41
+ border-top: none;
42
+ padding: 25px;
43
+ width: 500px;
44
+ }
45
+
46
+ #sidebar {
47
+ float: right;
48
+ width: 175px;
49
+ }
50
+
51
+ #footer {
52
+ clear: both;
53
+ }
54
+
55
+ #header, #about, #getting-started {
56
+ padding-left: 75px;
57
+ padding-right: 30px;
58
+ }
59
+
60
+
61
+ #header {
62
+ background-image: url("assets/rails.png");
63
+ background-repeat: no-repeat;
64
+ background-position: top left;
65
+ height: 64px;
66
+ }
67
+ #header h1, #header h2 {margin: 0}
68
+ #header h2 {
69
+ color: #888;
70
+ font-weight: normal;
71
+ font-size: 16px;
72
+ }
73
+
74
+
75
+ #about h3 {
76
+ margin: 0;
77
+ margin-bottom: 10px;
78
+ font-size: 14px;
79
+ }
80
+
81
+ #about-content {
82
+ background-color: #ffd;
83
+ border: 1px solid #fc0;
84
+ margin-left: -55px;
85
+ margin-right: -10px;
86
+ }
87
+ #about-content table {
88
+ margin-top: 10px;
89
+ margin-bottom: 10px;
90
+ font-size: 11px;
91
+ border-collapse: collapse;
92
+ }
93
+ #about-content td {
94
+ padding: 10px;
95
+ padding-top: 3px;
96
+ padding-bottom: 3px;
97
+ }
98
+ #about-content td.name {color: #555}
99
+ #about-content td.value {color: #000}
100
+
101
+ #about-content ul {
102
+ padding: 0;
103
+ list-style-type: none;
104
+ }
105
+
106
+ #about-content.failure {
107
+ background-color: #fcc;
108
+ border: 1px solid #f00;
109
+ }
110
+ #about-content.failure p {
111
+ margin: 0;
112
+ padding: 10px;
113
+ }
114
+
115
+
116
+ #getting-started {
117
+ border-top: 1px solid #ccc;
118
+ margin-top: 25px;
119
+ padding-top: 15px;
120
+ }
121
+ #getting-started h1 {
122
+ margin: 0;
123
+ font-size: 20px;
124
+ }
125
+ #getting-started h2 {
126
+ margin: 0;
127
+ font-size: 14px;
128
+ font-weight: normal;
129
+ color: #333;
130
+ margin-bottom: 25px;
131
+ }
132
+ #getting-started ol {
133
+ margin-left: 0;
134
+ padding-left: 0;
135
+ }
136
+ #getting-started li {
137
+ font-size: 18px;
138
+ color: #888;
139
+ margin-bottom: 25px;
140
+ }
141
+ #getting-started li h2 {
142
+ margin: 0;
143
+ font-weight: normal;
144
+ font-size: 18px;
145
+ color: #333;
146
+ }
147
+ #getting-started li p {
148
+ color: #555;
149
+ font-size: 13px;
150
+ }
151
+
152
+
153
+ #sidebar ul {
154
+ margin-left: 0;
155
+ padding-left: 0;
156
+ }
157
+ #sidebar ul h3 {
158
+ margin-top: 25px;
159
+ font-size: 16px;
160
+ padding-bottom: 10px;
161
+ border-bottom: 1px solid #ccc;
162
+ }
163
+ #sidebar li {
164
+ list-style-type: none;
165
+ }
166
+ #sidebar ul.links li {
167
+ margin-bottom: 5px;
168
+ }
169
+
170
+ .filename {
171
+ font-style: italic;
172
+ }
173
+ </style>
174
+ <script type="text/javascript">
175
+ function about() {
176
+ info = document.getElementById('about-content');
177
+ if (window.XMLHttpRequest)
178
+ { xhr = new XMLHttpRequest(); }
179
+ else
180
+ { xhr = new ActiveXObject("Microsoft.XMLHTTP"); }
181
+ xhr.open("GET","rails/info/properties",false);
182
+ xhr.send("");
183
+ info.innerHTML = xhr.responseText;
184
+ info.style.display = 'block'
185
+ }
186
+ </script>
187
+ </head>
188
+ <body>
189
+ <div id="page">
190
+ <div id="sidebar">
191
+ <ul id="sidebar-items">
192
+ <li>
193
+ <h3>Browse the documentation</h3>
194
+ <ul class="links">
195
+ <li><a href="http://guides.rubyonrails.org/">Rails Guides</a></li>
196
+ <li><a href="http://api.rubyonrails.org/">Rails API</a></li>
197
+ <li><a href="http://www.ruby-doc.org/core/">Ruby core</a></li>
198
+ <li><a href="http://www.ruby-doc.org/stdlib/">Ruby standard library</a></li>
199
+ </ul>
200
+ </li>
201
+ </ul>
202
+ </div>
203
+
204
+ <div id="content">
205
+ <div id="header">
206
+ <h1>Welcome aboard</h1>
207
+ <h2>You&rsquo;re riding Ruby on Rails!</h2>
208
+ </div>
209
+
210
+ <div id="about">
211
+ <h3><a href="rails/info/properties" onclick="about(); return false">About your application&rsquo;s environment</a></h3>
212
+ <div id="about-content" style="display: none"></div>
213
+ </div>
214
+
215
+ <div id="getting-started">
216
+ <h1>Getting started</h1>
217
+ <h2>Here&rsquo;s how to get rolling:</h2>
218
+
219
+ <ol>
220
+ <li>
221
+ <h2>Use <code>rails generate</code> to create your models and controllers</h2>
222
+ <p>To see all available options, run it without parameters.</p>
223
+ </li>
224
+
225
+ <li>
226
+ <h2>Set up a default route and remove <span class="filename">public/index.html</span></h2>
227
+ <p>Routes are set up in <span class="filename">config/routes.rb</span>.</p>
228
+ </li>
229
+
230
+ <li>
231
+ <h2>Create your database</h2>
232
+ <p>Run <code>rake db:create</code> to create your database. If you're not using SQLite (the default), edit <span class="filename">config/database.yml</span> with your username and password.</p>
233
+ </li>
234
+ </ol>
235
+ </div>
236
+ </div>
237
+
238
+ <div id="footer">&nbsp;</div>
239
+ </div>
240
+ </body>
241
+ </html>
@@ -0,0 +1,5 @@
1
+ # See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
2
+ #
3
+ # To ban all spiders from the entire site uncomment the next two lines:
4
+ # User-Agent: *
5
+ # Disallow: /
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
File without changes
File without changes
File without changes
@@ -0,0 +1,12 @@
1
+ require 'test_helper'
2
+ require 'rails/performance_test_help'
3
+
4
+ class BrowsingTest < ActionDispatch::PerformanceTest
5
+ # Refer to the documentation for all available options
6
+ # self.profile_options = { :runs => 5, :metrics => [:wall_time, :memory]
7
+ # :output => 'tmp/performance', :formats => [:flat] }
8
+
9
+ def test_homepage
10
+ get '/'
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ require File.expand_path('../../config/environment', __FILE__)
3
+ require 'rails/test_help'
4
+
5
+ class ActiveSupport::TestCase
6
+ # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
7
+ #
8
+ # Note: You'll currently still have to declare fixtures explicitly in integration tests
9
+ # -- they do not yet inherit this setting
10
+ fixtures :all
11
+
12
+ # Add more helper methods to be used by all tests here...
13
+ end
File without changes
File without changes
@@ -0,0 +1,408 @@
1
+ /*!
2
+ * jQuery Stepy - A Wizard Plugin
3
+ * --------------------------------------------------------------
4
+ *
5
+ * jQuery Stepy is a plugin that generates a customizable wizard.
6
+ *
7
+ * Licensed under The MIT License
8
+ *
9
+ * @version 1.1.0
10
+ * @since 2010-07-03
11
+ * @author Washington Botelho
12
+ * @documentation wbotelhos.com/stepy
13
+ *
14
+ * --------------------------------------------------------------
15
+ *
16
+ * <form>
17
+ * <fieldset title="Step 1">
18
+ * <legend>description one</legend>
19
+ * <!-- inputs -->
20
+ * </fieldset>
21
+ *
22
+ * <fieldset title="Step 2">
23
+ * <legend>description two</legend>
24
+ * <!-- inputs -->
25
+ * </fieldset>
26
+ *
27
+ * <input type="submit" />
28
+ * </form>
29
+ *
30
+ * $('form').stepy();
31
+ *
32
+ */
33
+
34
+ ;(function($) {
35
+
36
+ var methods = {
37
+ init: function(settings) {
38
+ return this.each(function() {
39
+ methods.destroy.call(this);
40
+
41
+ this.opt = $.extend({}, $.fn.stepy.defaults, settings);
42
+
43
+ var self = this,
44
+ that = $(this),
45
+ id = that.attr('id');
46
+
47
+ if (id === undefined || id === '') {
48
+ var id = methods._hash.call(self);
49
+
50
+ that.attr('id', id);
51
+ }
52
+
53
+ if (self.opt.validate) {
54
+ jQuery.validator.setDefaults({ ignore: self.opt.ignore });
55
+
56
+ that.append('<div class="stepy-errors" />');
57
+ }
58
+
59
+ self.header = methods._header.call(self);
60
+ self.steps = that.children('fieldset');
61
+
62
+ self.steps.each(function(index) {
63
+ methods._createHead.call(self, this, index);
64
+ methods._createButtons.call(self, this, index);
65
+ });
66
+
67
+ self.heads = self.header.children('li');
68
+
69
+ self.heads.first().addClass('stepy-active');
70
+
71
+ if (self.opt.finishButton) {
72
+ methods._bindFinish.call(self);
73
+ }
74
+
75
+ if (self.opt.titleClick) {
76
+ self.heads.click(function() {
77
+ var array = self.heads.filter('.stepy-active').attr('id').split('-'), // TODO: try keep the number in an attribute.
78
+ current = parseInt(array[array.length - 1], 10),
79
+ clicked = $(this).index();
80
+
81
+ if (clicked > current) {
82
+ if (self.opt.next && !methods._execute.call(that, self.opt.next, clicked)) {
83
+ return false;
84
+ }
85
+ } else if (clicked < current) {
86
+ if (self.opt.back && !methods._execute.call(that, self.opt.back, clicked)) {
87
+ return false;
88
+ }
89
+ }
90
+
91
+ if (clicked != current) {
92
+ methods.step.call(self, (clicked) + 1);
93
+ }
94
+ });
95
+ } else {
96
+ self.heads.css('cursor', 'default');
97
+ }
98
+
99
+ if (self.opt.enter) {
100
+ methods._bindEnter.call(self);
101
+ }
102
+
103
+ self.steps.first().find(':input:visible:enabled').first().select().focus();
104
+
105
+ that.data({ 'settings': this.opt, 'stepy': true });
106
+ });
107
+ }, _bindEnter: function() {
108
+ var self = this;
109
+
110
+ self.steps.delegate('input[type="text"], input[type="password"]', 'keypress', function(evt) {
111
+ var key = (evt.keyCode ? evt.keyCode : evt.which);
112
+
113
+ if (key == 13) {
114
+ evt.preventDefault();
115
+
116
+ var buttons = $(this).closest('fieldset').find('.stepy-navigator');
117
+
118
+ if (buttons.length) {
119
+ var next = buttons.children('.button-next');
120
+
121
+ if (next.length) {
122
+ next.click();
123
+ } else if (self.finish) {
124
+ self.finish.click();
125
+ }
126
+ }
127
+ }
128
+ });
129
+ }, _bindFinish: function() {
130
+ var self = this,
131
+ that = $(this),
132
+ finish = that.children('input[type="submit"]');
133
+
134
+ self.finish = (finish.length === 1) ? finish : that.children('.stepy-finish');
135
+
136
+ if (self.finish.length) {
137
+ var isForm = that.is('form'),
138
+ onSubmit = undefined;
139
+
140
+ if (isForm && self.opt.finish) {
141
+ onSubmit = that.attr('onsubmit');
142
+
143
+ that.attr('onsubmit', 'return false;');
144
+ }
145
+
146
+ self.finish.on('click.stepy', function(evt) {
147
+ if (self.opt.finish && !methods._execute.call(that, self.opt.finish, self.steps.length - 1)) {
148
+ evt.preventDefault();
149
+ } else if (isForm) {
150
+ if (onSubmit) {
151
+ that.attr('onsubmit', onSubmit);
152
+ } else {
153
+ that.removeAttr('onsubmit');
154
+ }
155
+
156
+ var isSubmit = self.finish.attr('type') === 'submit';
157
+
158
+ if (!isSubmit && (!self.opt.validate || methods.validate.call(that, self.steps.length - 1))) {
159
+ that.submit();
160
+ }
161
+ }
162
+ });
163
+
164
+ self.steps.last().children('.stepy-navigator').append(self.finish);
165
+ } else {
166
+ $.error('Submit button or element with class "stepy-finish" missing!');
167
+ }
168
+ }, _createBackButton: function(nav, index) {
169
+ var self = this,
170
+ that = $(this),
171
+ attributes = { href: 'javascript:void(0);', 'class': 'button-back', html: self.opt.backLabel };
172
+
173
+ $('<a />', attributes).on('click.stepy', function() {
174
+ if (!self.opt.back || methods._execute.call(self, self.opt.back, index - 1)) {
175
+ methods.step.call(self, (index - 1) + 1);
176
+ }
177
+ }).appendTo(nav);
178
+ }, _createButtons: function(step, index) {
179
+ var nav = methods._navigator.call(this).appendTo(step);
180
+
181
+ if (index === 0) {
182
+ if (this.steps.length > 1) {
183
+ methods._createNextButton.call(this, nav, index);
184
+ }
185
+ } else {
186
+ $(step).hide();
187
+
188
+ methods._createBackButton.call(this, nav, index);
189
+
190
+ if (index < this.steps.length - 1) {
191
+ methods._createNextButton.call(this, nav, index);
192
+ }
193
+ }
194
+ }, _createHead: function(step, index) {
195
+ var step = $(step).attr('id', $(this).attr('id') + '-step-' + index).addClass('stepy-step'),
196
+ head = methods._head.call(this, index);
197
+
198
+ head.append(methods._title.call(this, step));
199
+
200
+ if (this.opt.description) {
201
+ head.append(methods._description.call(this, step));
202
+ }
203
+
204
+ this.header.append(head);
205
+ }, _createNextButton: function(nav, index) {
206
+ var self = this,
207
+ that = $(this),
208
+ attributes = { href: 'javascript:void(0);', 'class': 'button-next', html: self.opt.nextLabel };
209
+
210
+ $('<a/>', attributes).on('click.stepy', function() {
211
+ if (!self.opt.next || methods._execute.call(that, self.opt.next, index + 1)) {
212
+ methods.step.call(self, (index + 1) + 1);
213
+ }
214
+ }).appendTo(nav);
215
+ }, _description: function(step) {
216
+ var legend = step.children('legend');
217
+
218
+ if (!this.opt.legend) {
219
+ legend.hide();
220
+ }
221
+
222
+ if (legend.length) {
223
+ return $('<span />', { html: legend.html() });
224
+ }
225
+
226
+ methods._error.call(this, '<legend /> element missing!');
227
+ }, _error: function(message) {
228
+ $(this).html(message);
229
+
230
+ $.error(message);
231
+ }, _execute: function(callback, index) {
232
+ var isValid = callback.call(this, index + 1);
233
+
234
+ return isValid || isValid === undefined;
235
+ }, _hash: function() {
236
+ this.hash = 'stepy-' + Math.random().toString().substring(2)
237
+
238
+ return this.hash;
239
+ }, _head: function(index) {
240
+ return $('<li />', { id: $(this).attr('id') + '-head-' + index });
241
+ }, _header: function() {
242
+ var header = $('<ul />', { id: $(this).attr('id') + '-header', 'class': 'stepy-header' });
243
+
244
+ if (this.opt.titleTarget) {
245
+ header.appendTo(this.opt.titleTarget);
246
+ } else {
247
+ header.insertBefore(this);
248
+ }
249
+
250
+ return header;
251
+ }, _navigator: function(index) {
252
+ return $('<p class="stepy-navigator" />');
253
+ }, _title: function(step) {
254
+ return $('<div />', { html: step.attr('title') || '--' });
255
+ }, destroy: function() {
256
+ return $(this).each(function() {
257
+ var that = $(this);
258
+
259
+ if (that.data('stepy')) {
260
+ var steps = that.data('stepy', false).children('fieldset').css('display', '');
261
+
262
+ that.children('.stepy-errors').remove();
263
+ this.finish.appendTo(steps.last());
264
+ steps.find('p.stepy-navigator').remove();
265
+ }
266
+ });
267
+ }, step: function(index) {
268
+ var self = this
269
+ that = $(this),
270
+ opt = that[0].opt;
271
+
272
+ index--;
273
+
274
+ var steps = that.children('fieldset');
275
+
276
+ if (index > steps.length - 1) {
277
+ index = steps.length - 1;
278
+ }
279
+
280
+ var max = index;
281
+
282
+ if (opt.validate) {
283
+ var isValid = true;
284
+
285
+ for (var i = 0; i < index; i++) {
286
+ isValid &= methods.validate.call(this, i);
287
+
288
+ if (opt.block && !isValid) {
289
+ max = i;
290
+ break;
291
+ }
292
+ }
293
+ }
294
+
295
+ if (opt.transition == 'fade') {
296
+ var stepsCount = steps.length;
297
+
298
+ steps.fadeOut(opt.duration, function(){
299
+ if (--stepsCount > 0) {
300
+ return;
301
+ }
302
+
303
+ steps.eq(max).fadeIn(opt.duration);
304
+ });
305
+ } else if (opt.transition == 'slide') {
306
+ var stepsCount = steps.length;
307
+
308
+ steps.slideUp(opt.duration, function(){
309
+ if (--stepsCount > 0) {
310
+ return;
311
+ }
312
+
313
+ steps.eq(max).slideDown(opt.duration);
314
+ });
315
+ } else {
316
+ steps.hide(opt.duration).eq(max).show(opt.duration);
317
+ }
318
+
319
+ that[0].heads.removeClass('stepy-active').eq(max).addClass('stepy-active');
320
+
321
+ if (that.is('form')) {
322
+ var $fields = undefined;
323
+
324
+ if (max == index) {
325
+ $fields = steps.eq(max).find(':input:enabled:visible');
326
+ } else {
327
+ $fields = steps.eq(max).find('.error').select().focus();
328
+ }
329
+
330
+ $fields.first().select().focus();
331
+ }
332
+
333
+ if (opt.select) {
334
+ opt.select.call(this, max + 1);
335
+ }
336
+
337
+ return that;
338
+ }, validate: function(index) {
339
+ var that = $(this);
340
+
341
+ if (!that.is('form')) {
342
+ return true;
343
+ }
344
+
345
+ var self = this,
346
+ step = that.children('fieldset').eq(index),
347
+ isValid = true,
348
+ $title = $('#' + that.attr('id') + '-header').children().eq(index),
349
+ $validate = that.validate();
350
+
351
+ $(step.find(':input:enabled').get().reverse()).each(function() {
352
+ var fieldIsValid = $validate.element($(this));
353
+
354
+ if (fieldIsValid === undefined) {
355
+ fieldIsValid = true;
356
+ }
357
+
358
+ isValid &= fieldIsValid;
359
+
360
+ if (isValid) {
361
+ if (self.opt.errorImage) {
362
+ $title.removeClass('stepy-error');
363
+ }
364
+ } else {
365
+ if (self.opt.errorImage) {
366
+ $title.addClass('stepy-error');
367
+ }
368
+
369
+ $validate.focusInvalid();
370
+ }
371
+ });
372
+
373
+ return isValid;
374
+ }
375
+ };
376
+
377
+ $.fn.stepy = function(method) {
378
+ if (methods[method]) {
379
+ return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
380
+ } else if (typeof method === 'object' || !method) {
381
+ return methods.init.apply(this, arguments);
382
+ } else {
383
+ $.error('Method ' + method + ' does not exist!');
384
+ }
385
+ };
386
+
387
+ $.fn.stepy.defaults = {
388
+ back : undefined,
389
+ backLabel : '&lt; Back',
390
+ block : false,
391
+ description : true,
392
+ duration : 0,
393
+ enter : true,
394
+ errorImage : false,
395
+ finish : undefined,
396
+ finishButton : true,
397
+ ignore : '',
398
+ legend : true,
399
+ next : undefined,
400
+ nextLabel : 'Next &gt;',
401
+ select : undefined,
402
+ titleClick : false,
403
+ titleTarget : undefined,
404
+ transition : 'hide',
405
+ validate : false
406
+ };
407
+
408
+ })(jQuery);