themepile-abstractio 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +28 -0
  3. data/.rbenv-version +1 -0
  4. data/CONTRIBUTING.md +53 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE +22 -0
  7. data/README.md +136 -0
  8. data/Rakefile +2 -0
  9. data/abstractio.gemspec +18 -0
  10. data/js/foundation/foundation.alerts.js +50 -0
  11. data/js/foundation/foundation.clearing.js +516 -0
  12. data/js/foundation/foundation.cookie.js +74 -0
  13. data/js/foundation/foundation.dropdown.js +159 -0
  14. data/js/foundation/foundation.forms.js +516 -0
  15. data/js/foundation/foundation.joyride.js +842 -0
  16. data/js/foundation/foundation.js +403 -0
  17. data/js/foundation/foundation.magellan.js +130 -0
  18. data/js/foundation/foundation.orbit.js +373 -0
  19. data/js/foundation/foundation.placeholder.js +159 -0
  20. data/js/foundation/foundation.reveal.js +276 -0
  21. data/js/foundation/foundation.section.js +409 -0
  22. data/js/foundation/foundation.tooltips.js +206 -0
  23. data/js/foundation/foundation.topbar.js +252 -0
  24. data/js/foundation/index.js +16 -0
  25. data/js/vendor/custom.modernizr.js +4 -0
  26. data/js/vendor/jquery.js +9597 -0
  27. data/js/vendor/zepto.js +1884 -0
  28. data/lib/abstractio.rb +17 -0
  29. data/lib/abstractio/engine.rb +20 -0
  30. data/lib/abstractio/generators/USAGE +15 -0
  31. data/lib/abstractio/generators/install_generator.rb +54 -0
  32. data/lib/abstractio/generators/templates/application.html.erb +46 -0
  33. data/lib/abstractio/generators/templates/application.html.haml +31 -0
  34. data/lib/abstractio/generators/templates/application.html.slim +28 -0
  35. data/lib/abstractio/version.rb +3 -0
  36. data/lib/themepile-abstractio.rb +17 -0
  37. data/scss/abstractio.scss +46 -0
  38. data/scss/abstractio/_variables.scss +1224 -0
  39. data/scss/abstractio/components/_alert-boxes.scss +107 -0
  40. data/scss/abstractio/components/_block-grid.scss +68 -0
  41. data/scss/abstractio/components/_breadcrumbs.scss +125 -0
  42. data/scss/abstractio/components/_button-groups.scss +89 -0
  43. data/scss/abstractio/components/_buttons.scss +227 -0
  44. data/scss/abstractio/components/_clearing.scss +224 -0
  45. data/scss/abstractio/components/_custom-forms.scss +263 -0
  46. data/scss/abstractio/components/_dropdown-buttons.scss +115 -0
  47. data/scss/abstractio/components/_dropdown.scss +150 -0
  48. data/scss/abstractio/components/_flex-video.scss +46 -0
  49. data/scss/abstractio/components/_forms.scss +362 -0
  50. data/scss/abstractio/components/_global.scss +280 -0
  51. data/scss/abstractio/components/_grid.scss +186 -0
  52. data/scss/abstractio/components/_inline-lists.scss +53 -0
  53. data/scss/abstractio/components/_joyride.scss +215 -0
  54. data/scss/abstractio/components/_keystrokes.scss +57 -0
  55. data/scss/abstractio/components/_labels.scss +85 -0
  56. data/scss/abstractio/components/_magellan.scss +23 -0
  57. data/scss/abstractio/components/_orbit.scss +213 -0
  58. data/scss/abstractio/components/_pagination.scss +100 -0
  59. data/scss/abstractio/components/_panels.scss +77 -0
  60. data/scss/abstractio/components/_pricing-tables.scss +131 -0
  61. data/scss/abstractio/components/_progress-bars.scss +71 -0
  62. data/scss/abstractio/components/_reveal.scss +132 -0
  63. data/scss/abstractio/components/_section.scss +318 -0
  64. data/scss/abstractio/components/_side-nav.scss +69 -0
  65. data/scss/abstractio/components/_split-buttons.scss +167 -0
  66. data/scss/abstractio/components/_sub-nav.scss +68 -0
  67. data/scss/abstractio/components/_switch.scss +251 -0
  68. data/scss/abstractio/components/_tables.scss +84 -0
  69. data/scss/abstractio/components/_thumbs.scss +48 -0
  70. data/scss/abstractio/components/_tooltips.scss +117 -0
  71. data/scss/abstractio/components/_top-bar.scss +495 -0
  72. data/scss/abstractio/components/_type.scss +426 -0
  73. data/scss/abstractio/components/_visibility.scss +322 -0
  74. data/scss/normalize.scss +402 -0
  75. data/templates/project/.gitignore +44 -0
  76. data/templates/project/MIT-LICENSE.txt +20 -0
  77. data/templates/project/config.rb +26 -0
  78. data/templates/project/humans.txt +8 -0
  79. data/templates/project/index.html +124 -0
  80. data/templates/project/manifest.rb +45 -0
  81. data/templates/project/robots.txt +4 -0
  82. data/templates/project/scss/app.scss +48 -0
  83. data/templates/upgrade/manifest.rb +34 -0
  84. metadata +153 -0
@@ -0,0 +1,373 @@
1
+ ;(function ($, window, document, undefined) {
2
+ 'use strict';
3
+
4
+ Foundation.libs = Foundation.libs || {};
5
+
6
+ Foundation.libs.orbit = {
7
+ name: 'orbit',
8
+
9
+ version: '4.1.0',
10
+
11
+ settings: {
12
+ timer_speed: 10000,
13
+ animation_speed: 500,
14
+ bullets: true,
15
+ stack_on_small: true,
16
+ navigation_arrows: true,
17
+ slide_number: true,
18
+ container_class: 'orbit-container',
19
+ stack_on_small_class: 'orbit-stack-on-small',
20
+ next_class: 'orbit-next',
21
+ prev_class: 'orbit-prev',
22
+ timer_container_class: 'orbit-timer',
23
+ timer_paused_class: 'paused',
24
+ timer_progress_class: 'orbit-progress',
25
+ slides_container_class: 'orbit-slides-container',
26
+ bullets_container_class: 'orbit-bullets',
27
+ bullets_active_class: 'active',
28
+ slide_number_class: 'orbit-slide-number',
29
+ caption_class: 'orbit-caption',
30
+ active_slide_class: 'active',
31
+ orbit_transition_class: 'orbit-transitioning'
32
+ },
33
+
34
+ init: function (scope, method, options) {
35
+ var self = this;
36
+ Foundation.inherit(self, 'data_options');
37
+
38
+ if (typeof method === 'object') {
39
+ $.extend(true, self.settings, method);
40
+ }
41
+
42
+ $('[data-orbit]', scope).each(function(idx, el) {
43
+ var scoped_self = $.extend(true, {}, self);
44
+ scoped_self._init(idx, el);
45
+ });
46
+ },
47
+
48
+ _container_html: function() {
49
+ var self = this;
50
+ return '<div class="' + self.settings.container_class + '"></div>';
51
+ },
52
+
53
+ _bullets_container_html: function($slides) {
54
+ var self = this,
55
+ $list = $('<ol class="' + self.settings.bullets_container_class + '"></ol>');
56
+ $slides.each(function(idx, slide) {
57
+ var $item = $('<li data-orbit-slide-number="' + (idx+1) + '" class=""></li>');
58
+ if (idx === 0) {
59
+ $item.addClass(self.settings.bullets_active_class);
60
+ }
61
+ $list.append($item);
62
+ });
63
+ return $list;
64
+ },
65
+
66
+ _slide_number_html: function(slide_number, total_slides) {
67
+ var self = this,
68
+ $container = $('<div class="' + self.settings.slide_number_class + '"></div>');
69
+ $container.append('<span>' + slide_number + '</span> of <span>' + total_slides + '</span>');
70
+ return $container;
71
+ },
72
+
73
+ _timer_html: function() {
74
+ var self = this;
75
+ if (typeof self.settings.timer_speed === 'number' && self.settings.timer_speed > 0) {
76
+ return '<div class="' + self.settings.timer_container_class
77
+ + '"><span></span><div class="' + self.settings.timer_progress_class
78
+ + '"></div></div>';
79
+ } else {
80
+ return '';
81
+ }
82
+ },
83
+
84
+ _next_html: function() {
85
+ var self = this;
86
+ return '<a href="#" class="' + self.settings.next_class + '">Next <span></span></a>';
87
+ },
88
+
89
+ _prev_html: function() {
90
+ var self = this;
91
+ return '<a href="#" class="' + self.settings.prev_class + '">Prev <span></span></a>';
92
+ },
93
+
94
+ _init: function (idx, slider) {
95
+ var self = this,
96
+ $slides_container = $(slider),
97
+ $container = $slides_container.wrap(self._container_html()).parent(),
98
+ $slides = $slides_container.children();
99
+
100
+ $.extend(true, self.settings, self.data_options($slides_container));
101
+
102
+ if (self.settings.navigation_arrows) {
103
+ $container.append(self._prev_html());
104
+ $container.append(self._next_html());
105
+ }
106
+ $slides_container.addClass(self.settings.slides_container_class);
107
+ if (self.settings.stack_on_small) {
108
+ $container.addClass(self.settings.stack_on_small_class);
109
+ }
110
+ if (self.settings.slide_number) {
111
+ $container.append(self._slide_number_html(1, $slides.length));
112
+ }
113
+ $container.append(self._timer_html());
114
+ if (self.settings.bullets) {
115
+ $container.after(self._bullets_container_html($slides));
116
+ }
117
+ // To better support the "sliding" effect it's easier
118
+ // if we just clone the first and last slides
119
+ $slides_container.append($slides.first().clone().attr('data-orbit-slide',''));
120
+ $slides_container.prepend($slides.last().clone().attr('data-orbit-slide',''));
121
+ // Make the first "real" slide active
122
+ $slides_container.css(Foundation.rtl ? 'marginRight' : 'marginLeft', '-100%');
123
+ $slides.first().addClass(self.settings.active_slide_class);
124
+
125
+ self._init_events($slides_container);
126
+ self._init_dimensions($slides_container);
127
+ self._start_timer($slides_container);
128
+ },
129
+
130
+ _init_events: function ($slides_container) {
131
+ var self = this,
132
+ $container = $slides_container.parent();
133
+
134
+ $(window)
135
+ .on('load.fndtn.orbit', function() {
136
+ $slides_container.height('');
137
+ $slides_container.height($slides_container.height($container.height()));
138
+ $slides_container.trigger('orbit:ready');
139
+ })
140
+ .on('resize.fndtn.orbit', function() {
141
+ $slides_container.height('');
142
+ $slides_container.height($slides_container.height($container.height()));
143
+ });
144
+
145
+ $(document).on('click.fndtn.orbit', '[data-orbit-link]', function(e) {
146
+ e.preventDefault();
147
+ var id = $(e.currentTarget).attr('data-orbit-link'),
148
+ $slide = $slides_container.find('[data-orbit-slide=' + id + ']').first();
149
+
150
+ if ($slide.length === 1) {
151
+ self._reset_timer($slides_container, true);
152
+ self._goto($slides_container, $slide.index(), function() {});
153
+ }
154
+ });
155
+
156
+ $container.siblings('.' + self.settings.bullets_container_class)
157
+ .on('click.fndtn.orbit', '[data-orbit-slide-number]', function(e) {
158
+ e.preventDefault();
159
+ self._reset_timer($slides_container, true);
160
+ self._goto($slides_container, $(e.currentTarget).data('orbit-slide-number'),function() {});
161
+ });
162
+
163
+ $container
164
+ .on('orbit:after-slide-change.fndtn.orbit', function(e, orbit) {
165
+ var $slide_number = $container.find('.' + self.settings.slide_number_class);
166
+
167
+ if ($slide_number.length === 1) {
168
+ $slide_number.replaceWith(self._slide_number_html(orbit.slide_number, orbit.total_slides));
169
+ }
170
+ })
171
+ .on('orbit:next-slide.fndtn.orbit click.fndtn.orbit', '.' + self.settings.next_class, function(e) {
172
+ e.preventDefault();
173
+ self._reset_timer($slides_container, true);
174
+ self._goto($slides_container, 'next', function() {});
175
+ })
176
+ .on('orbit:prev-slide.fndtn.orbit click.fndtn.orbit', '.' + self.settings.prev_class, function(e) {
177
+ e.preventDefault();
178
+ self._reset_timer($slides_container, true);
179
+ self._goto($slides_container, 'prev', function() {});
180
+ })
181
+ .on('orbit:toggle-play-pause.fndtn.orbit click.fndtn.orbit touchstart.fndtn.orbit', '.' + self.settings.timer_container_class, function(e) {
182
+ e.preventDefault();
183
+ var $timer = $(e.currentTarget).toggleClass(self.settings.timer_paused_class),
184
+ $slides_container = $timer.closest('.' + self.settings.container_class)
185
+ .find('.' + self.settings.slides_container_class);
186
+
187
+ if ($timer.hasClass(self.settings.timer_paused_class)) {
188
+ self._stop_timer($slides_container);
189
+ } else {
190
+ self._start_timer($slides_container);
191
+ }
192
+ })
193
+ .on('touchstart.fndtn.orbit', function(e) {
194
+ if (!e.touches) { e = e.originalEvent; }
195
+ var data = {
196
+ start_page_x: e.touches[0].pageX,
197
+ start_page_y: e.touches[0].pageY,
198
+ start_time: (new Date()).getTime(),
199
+ delta_x: 0,
200
+ is_scrolling: undefined
201
+ };
202
+ $container.data('swipe-transition', data);
203
+ e.stopPropagation();
204
+ })
205
+ .on('touchmove.fndtn.orbit', function(e) {
206
+ if (!e.touches) { e = e.originalEvent; }
207
+ // Ignore pinch/zoom events
208
+ if(e.touches.length > 1 || e.scale && e.scale !== 1) return;
209
+
210
+ var data = $container.data('swipe-transition');
211
+ if (typeof data === 'undefined') {
212
+ data = {};
213
+ }
214
+
215
+ data.delta_x = e.touches[0].pageX - data.start_page_x;
216
+
217
+ if ( typeof data.is_scrolling === 'undefined') {
218
+ data.is_scrolling = !!( data.is_scrolling || Math.abs(data.delta_x) < Math.abs(e.touches[0].pageY - data.start_page_y) );
219
+ }
220
+
221
+ if (!data.is_scrolling && !data.active) {
222
+ e.preventDefault();
223
+ self._stop_timer($slides_container);
224
+ var direction = (data.delta_x < 0) ? 'next' : 'prev';
225
+ data.active = true;
226
+ self._goto($slides_container, direction, function() {});
227
+ }
228
+ })
229
+ .on('touchend.fndtn.orbit', function(e) {
230
+ $container.data('swipe-transition', {});
231
+ e.stopPropagation();
232
+ });
233
+ },
234
+
235
+ _init_dimensions: function ($slides_container) {
236
+ var $container = $slides_container.parent(),
237
+ $slides = $slides_container.children();
238
+
239
+ $slides_container.css('width', $slides.length * 100 + '%');
240
+ $slides.css('width', 100 / $slides.length + '%');
241
+ $slides_container.height($container.height());
242
+ $slides_container.css('width', $slides.length * 100 + '%');
243
+ },
244
+
245
+ _start_timer: function ($slides_container) {
246
+ var self = this,
247
+ $container = $slides_container.parent();
248
+
249
+ var callback = function() {
250
+ self._reset_timer($slides_container, false);
251
+ self._goto($slides_container, 'next', function() {
252
+ self._start_timer($slides_container);
253
+ });
254
+ };
255
+
256
+ var $timer = $container.find('.' + self.settings.timer_container_class),
257
+ $progress = $timer.find('.' + self.settings.timer_progress_class),
258
+ progress_pct = ($progress.width() / $timer.width()),
259
+ delay = self.settings.timer_speed - (progress_pct * self.settings.timer_speed);
260
+
261
+ $progress.animate({'width': '100%'}, delay, 'linear', callback);
262
+ $slides_container.trigger('orbit:timer-started');
263
+ },
264
+
265
+ _stop_timer: function ($slides_container) {
266
+ var self = this,
267
+ $container = $slides_container.parent(),
268
+ $timer = $container.find('.' + self.settings.timer_container_class),
269
+ $progress = $timer.find('.' + self.settings.timer_progress_class),
270
+ progress_pct = $progress.width() / $timer.width();
271
+ self._rebuild_timer($container, progress_pct * 100 + '%');
272
+ // $progress.stop();
273
+ $slides_container.trigger('orbit:timer-stopped');
274
+ $timer = $container.find('.' + self.settings.timer_container_class);
275
+ $timer.addClass(self.settings.timer_paused_class);
276
+ },
277
+
278
+ _reset_timer: function($slides_container, is_paused) {
279
+ var self = this,
280
+ $container = $slides_container.parent();
281
+ self._rebuild_timer($container, '0%');
282
+ if (typeof is_paused === 'boolean' && is_paused) {
283
+ var $timer = $container.find('.' + self.settings.timer_container_class);
284
+ $timer.addClass(self.settings.timer_paused_class);
285
+ }
286
+ },
287
+
288
+ _rebuild_timer: function ($container, width_pct) {
289
+ // Zepto is unable to stop animations since they
290
+ // are css-based. This is a workaround for that
291
+ // limitation, which rebuilds the dom element
292
+ // thus stopping the animation
293
+ var self = this,
294
+ $timer = $container.find('.' + self.settings.timer_container_class),
295
+ $new_timer = $(self._timer_html()),
296
+ $new_timer_progress = $new_timer.find('.' + self.settings.timer_progress_class);
297
+
298
+ if (typeof Zepto === 'function') {
299
+ $timer.remove();
300
+ $container.append($new_timer);
301
+ $new_timer_progress.css('width', width_pct);
302
+ } else if (typeof jQuery === 'function') {
303
+ var $progress = $timer.find('.' + self.settings.timer_progress_class);
304
+ $progress.css('width', width_pct);
305
+ $progress.stop();
306
+ }
307
+ },
308
+
309
+ _goto: function($slides_container, index_or_direction, callback) {
310
+ var self = this,
311
+ $container = $slides_container.parent(),
312
+ $slides = $slides_container.children(),
313
+ $active_slide = $slides_container.find('.' + self.settings.active_slide_class),
314
+ active_index = $active_slide.index(),
315
+ margin_position = Foundation.rtl ? 'marginRight' : 'marginLeft';
316
+
317
+ if ($container.hasClass(self.settings.orbit_transition_class)) {
318
+ return false;
319
+ }
320
+
321
+ if (index_or_direction === 'prev') {
322
+ if (active_index === 0) {
323
+ active_index = $slides.length - 1;
324
+ }
325
+ else {
326
+ active_index--;
327
+ }
328
+ }
329
+ else if (index_or_direction === 'next') {
330
+ active_index = (active_index+1) % $slides.length;
331
+ }
332
+ else if (typeof index_or_direction === 'number') {
333
+ active_index = (index_or_direction % $slides.length);
334
+ }
335
+ if (active_index === ($slides.length - 1) && index_or_direction === 'next') {
336
+ $slides_container.css(margin_position, '0%');
337
+ active_index = 1;
338
+ }
339
+ else if (active_index === 0 && index_or_direction === 'prev') {
340
+ $slides_container.css(margin_position, '-' + ($slides.length - 1) * 100 + '%');
341
+ active_index = $slides.length - 2;
342
+ }
343
+ // Start transition, make next slide active
344
+ $container.addClass(self.settings.orbit_transition_class);
345
+ $active_slide.removeClass(self.settings.active_slide_class);
346
+ $($slides[active_index]).addClass(self.settings.active_slide_class);
347
+ // Make next bullet active
348
+ var $bullets = $container.siblings('.' + self.settings.bullets_container_class);
349
+ if ($bullets.length === 1) {
350
+ $bullets.children().removeClass(self.settings.bullets_active_class);
351
+ $($bullets.children()[active_index-1]).addClass(self.settings.bullets_active_class);
352
+ }
353
+ var new_margin_left = '-' + (active_index * 100) + '%';
354
+ // Check to see if animation will occur, otherwise perform
355
+ // callbacks manually
356
+ $slides_container.trigger('orbit:before-slide-change');
357
+ if ($slides_container.css(margin_position) === new_margin_left) {
358
+ $container.removeClass(self.settings.orbit_transition_class);
359
+ $slides_container.trigger('orbit:after-slide-change', [{slide_number: active_index, total_slides: $slides_container.children().length - 2}]);
360
+ callback();
361
+ } else {
362
+ var properties = {};
363
+ properties[margin_position] = new_margin_left;
364
+
365
+ $slides_container.animate(properties, self.settings.animation_speed, 'linear', function() {
366
+ $container.removeClass(self.settings.orbit_transition_class);
367
+ $slides_container.trigger('orbit:after-slide-change', [{slide_number: active_index, total_slides: $slides_container.children().length - 2}]);
368
+ callback();
369
+ });
370
+ }
371
+ }
372
+ };
373
+ }(Foundation.zj, this, this.document));
@@ -0,0 +1,159 @@
1
+ /*! http://mths.be/placeholder v2.0.7 by @mathias
2
+ Modified to work with Zepto.js by ZURB
3
+ */
4
+ ;(function(window, document, $) {
5
+
6
+ var isInputSupported = 'placeholder' in document.createElement('input'),
7
+ isTextareaSupported = 'placeholder' in document.createElement('textarea'),
8
+ prototype = $.fn,
9
+ valHooks = $.valHooks,
10
+ hooks,
11
+ placeholder;
12
+
13
+ if (isInputSupported && isTextareaSupported) {
14
+
15
+ placeholder = prototype.placeholder = function() {
16
+ return this;
17
+ };
18
+
19
+ placeholder.input = placeholder.textarea = true;
20
+
21
+ } else {
22
+
23
+ placeholder = prototype.placeholder = function() {
24
+ var $this = this;
25
+ $this
26
+ .filter((isInputSupported ? 'textarea' : ':input') + '[placeholder]')
27
+ .not('.placeholder')
28
+ .bind({
29
+ 'focus.placeholder': clearPlaceholder,
30
+ 'blur.placeholder': setPlaceholder
31
+ })
32
+ .data('placeholder-enabled', true)
33
+ .trigger('blur.placeholder');
34
+ return $this;
35
+ };
36
+
37
+ placeholder.input = isInputSupported;
38
+ placeholder.textarea = isTextareaSupported;
39
+
40
+ hooks = {
41
+ 'get': function(element) {
42
+ var $element = $(element);
43
+ return $element.data('placeholder-enabled') && $element.hasClass('placeholder') ? '' : element.value;
44
+ },
45
+ 'set': function(element, value) {
46
+ var $element = $(element);
47
+ if (!$element.data('placeholder-enabled')) {
48
+ return element.value = value;
49
+ }
50
+ if (value == '') {
51
+ element.value = value;
52
+ // Issue #56: Setting the placeholder causes problems if the element continues to have focus.
53
+ if (element != document.activeElement) {
54
+ // We can't use `triggerHandler` here because of dummy text/password inputs :(
55
+ setPlaceholder.call(element);
56
+ }
57
+ } else if ($element.hasClass('placeholder')) {
58
+ clearPlaceholder.call(element, true, value) || (element.value = value);
59
+ } else {
60
+ element.value = value;
61
+ }
62
+ // `set` can not return `undefined`; see http://jsapi.info/jquery/1.7.1/val#L2363
63
+ return $element;
64
+ }
65
+ };
66
+
67
+ isInputSupported || (valHooks.input = hooks);
68
+ isTextareaSupported || (valHooks.textarea = hooks);
69
+
70
+ $(function() {
71
+ // Look for forms
72
+ $(document).delegate('form', 'submit.placeholder', function() {
73
+ // Clear the placeholder values so they don't get submitted
74
+ var $inputs = $('.placeholder', this).each(clearPlaceholder);
75
+ setTimeout(function() {
76
+ $inputs.each(setPlaceholder);
77
+ }, 10);
78
+ });
79
+ });
80
+
81
+ // Clear placeholder values upon page reload
82
+ $(window).bind('beforeunload.placeholder', function() {
83
+ $('.placeholder').each(function() {
84
+ this.value = '';
85
+ });
86
+ });
87
+
88
+ }
89
+
90
+ function args(elem) {
91
+ // Return an object of element attributes
92
+ var newAttrs = {},
93
+ rinlinejQuery = /^jQuery\d+$/;
94
+ $.each(elem.attributes, function(i, attr) {
95
+ if (attr.specified && !rinlinejQuery.test(attr.name)) {
96
+ newAttrs[attr.name] = attr.value;
97
+ }
98
+ });
99
+ return newAttrs;
100
+ }
101
+
102
+ function clearPlaceholder(event, value) {
103
+ var input = this,
104
+ $input = $(input);
105
+ if (input.value == $input.attr('placeholder') && $input.hasClass('placeholder')) {
106
+ if ($input.data('placeholder-password')) {
107
+ $input = $input.hide().next().show().attr('id', $input.removeAttr('id').data('placeholder-id'));
108
+ // If `clearPlaceholder` was called from `$.valHooks.input.set`
109
+ if (event === true) {
110
+ return $input[0].value = value;
111
+ }
112
+ $input.focus();
113
+ } else {
114
+ input.value = '';
115
+ $input.removeClass('placeholder');
116
+ input == document.activeElement && input.select();
117
+ }
118
+ }
119
+ }
120
+
121
+ function setPlaceholder() {
122
+ var $replacement,
123
+ input = this,
124
+ $input = $(input),
125
+ $origInput = $input,
126
+ id = this.id;
127
+ if (input.value == '') {
128
+ if (input.type == 'password') {
129
+ if (!$input.data('placeholder-textinput')) {
130
+ try {
131
+ $replacement = $input.clone().attr({ 'type': 'text' });
132
+ } catch(e) {
133
+ $replacement = $('<input>').attr($.extend(args(this), { 'type': 'text' }));
134
+ }
135
+ $replacement
136
+ .removeAttr('name')
137
+ .data({
138
+ 'placeholder-password': true,
139
+ 'placeholder-id': id
140
+ })
141
+ .bind('focus.placeholder', clearPlaceholder);
142
+ $input
143
+ .data({
144
+ 'placeholder-textinput': $replacement,
145
+ 'placeholder-id': id
146
+ })
147
+ .before($replacement);
148
+ }
149
+ $input = $input.removeAttr('id').hide().prev().attr('id', id).show();
150
+ // Note: `$input[0] != input` now!
151
+ }
152
+ $input.addClass('placeholder');
153
+ $input[0].value = $input.attr('placeholder');
154
+ } else {
155
+ $input.removeClass('placeholder');
156
+ }
157
+ }
158
+
159
+ }(this, document, Foundation.zj));