zurb-foundation 4.0.4 → 4.0.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.
Files changed (53) hide show
  1. data/CHANGELOG.md +26 -2
  2. data/CONTRIBUTING.md +0 -8
  3. data/Gemfile.lock +2 -2
  4. data/docs/_sidebar-components.html.erb +1 -0
  5. data/docs/_sidebar.html.erb +1 -0
  6. data/docs/changelog.html.erb +29 -1
  7. data/docs/components/block-grid.html.erb +11 -2
  8. data/docs/components/clearing.html.erb +1 -1
  9. data/docs/components/custom-forms.html.erb +14 -13
  10. data/docs/components/dropdown.html.erb +1 -1
  11. data/docs/components/flex-video.html.erb +1 -1
  12. data/docs/components/grid.html.erb +2 -2
  13. data/docs/components/joyride.html.erb +1 -1
  14. data/docs/components/magellan.html.erb +1 -1
  15. data/docs/components/orbit.html.erb +5 -1
  16. data/docs/components/pricing-tables.html.erb +3 -3
  17. data/docs/components/progress-bars.html.erb +1 -0
  18. data/docs/components/reveal.html.erb +5 -1
  19. data/docs/components/section.html.erb +66 -4
  20. data/docs/components/split-buttons.html.erb +11 -11
  21. data/docs/components/tooltips.html.erb +1 -1
  22. data/docs/components/top-bar.html.erb +4 -2
  23. data/docs/components/type.html.erb +7 -1
  24. data/docs/components/visibility.html.erb +17 -11
  25. data/docs/javascript.html.erb +1 -1
  26. data/docs/layout.html.erb +3 -3
  27. data/docs/media-queries.html.erb +96 -0
  28. data/docs/sass.html.erb +82 -2
  29. data/foundation.gemspec +1 -1
  30. data/js/foundation/foundation.forms.js +6 -14
  31. data/js/foundation/foundation.joyride.js +12 -10
  32. data/js/foundation/foundation.orbit.js +2 -0
  33. data/js/foundation/foundation.section.js +61 -4
  34. data/js/foundation/foundation.topbar.js +9 -2
  35. data/js/vendor/zepto.js +415 -313
  36. data/lib/foundation/version.rb +1 -1
  37. data/scss/foundation/_foundation-global.scss +4 -0
  38. data/scss/foundation/components/_block-grid.scss +4 -4
  39. data/scss/foundation/components/_button-groups.scss +4 -4
  40. data/scss/foundation/components/_buttons.scss +2 -1
  41. data/scss/foundation/components/_custom-forms.scss +1 -1
  42. data/scss/foundation/components/_forms.scss +3 -4
  43. data/scss/foundation/components/_global.scss +11 -8
  44. data/scss/foundation/components/_magellan.scss +7 -2
  45. data/scss/foundation/components/_orbit.scss +6 -3
  46. data/scss/foundation/components/_progress-bars.scss +6 -4
  47. data/scss/foundation/components/_section.scss +48 -1
  48. data/scss/foundation/components/_top-bar.scss +15 -14
  49. data/scss/foundation/components/_type.scss +3 -3
  50. data/scss/foundation/components/_visibility.scss +259 -55
  51. data/templates/project/scss/_settings.scss +7 -0
  52. metadata +6 -6
  53. data/docs/_zurb-jobs.html.erb +0 -5
@@ -334,6 +334,7 @@
334
334
 
335
335
  set_next_tip : function () {
336
336
  this.settings.$next_tip = $(".joyride-tip-guide[data-index='" + this.settings.$li.index() + "']");
337
+ this.settings.$next_tip.data('closed', '');
337
338
  },
338
339
 
339
340
  set_target : function () {
@@ -485,9 +486,7 @@
485
486
  }
486
487
 
487
488
  } else if (this.settings.$li.length) {
488
-
489
489
  this.pos_modal($nub);
490
-
491
490
  }
492
491
 
493
492
  if (toggle) {
@@ -499,15 +498,16 @@
499
498
  pos_modal : function ($nub) {
500
499
  this.center();
501
500
  $nub.hide();
501
+ if (!this.settings.$next_tip.data('closed')) {
502
+ if ($('.joyride-modal-bg').length < 1) {
503
+ $('body').append('<div class="joyride-modal-bg">').show();
504
+ }
502
505
 
503
- if ($('.joyride-modal-bg').length < 1) {
504
- $('body').append('<div class="joyride-modal-bg">').show();
505
- }
506
-
507
- if (/pop/i.test(this.settings.tipAnimation)) {
508
- $('.joyride-modal-bg').show();
509
- } else {
510
- $('.joyride-modal-bg').fadeIn(this.settings.tipAnimationFadeSpeed);
506
+ if (/pop/i.test(this.settings.tipAnimation)) {
507
+ $('.joyride-modal-bg').show();
508
+ } else {
509
+ $('.joyride-modal-bg').fadeIn(this.settings.tipAnimationFadeSpeed);
510
+ }
511
511
  }
512
512
  },
513
513
 
@@ -590,6 +590,8 @@
590
590
  clearTimeout(this.settings.automate);
591
591
  }
592
592
 
593
+ this.settings.$next_tip.data('closed', true);
594
+
593
595
  $('.joyride-modal-bg').hide();
594
596
  this.settings.$current_tip.hide();
595
597
  this.settings.postStepCallback(this.settings.$li.index(), this.settings.$current_tip);
@@ -177,6 +177,7 @@
177
177
  }
178
178
  })
179
179
  .on('touchstart.fndtn.orbit', function(e) {
180
+ if (!e.touches) { e = e.originalEvent; }
180
181
  var data = {
181
182
  start_page_x: e.touches[0].pageX,
182
183
  start_page_y: e.touches[0].pageY,
@@ -188,6 +189,7 @@
188
189
  e.stopPropagation();
189
190
  })
190
191
  .on('touchmove.fndtn.orbit', function(e) {
192
+ if (!e.touches) { e = e.originalEvent; }
191
193
  // Ignore pinch/zoom events
192
194
  if(e.touches.length > 1 || e.scale && e.scale !== 1) return;
193
195
 
@@ -6,7 +6,7 @@
6
6
  Foundation.libs.section = {
7
7
  name: 'section',
8
8
 
9
- version : '4.0.3',
9
+ version : '4.0.5',
10
10
 
11
11
  settings : {
12
12
  deep_linking: false,
@@ -43,6 +43,19 @@
43
43
  self.resize.call(this);
44
44
  }, 30)).trigger('resize');
45
45
 
46
+ $('[data-section] .content').on('click.fndtn.section', function (e) {
47
+ e.stopPropagation();
48
+ });
49
+
50
+ $('*, html, body').on('click.fndtn.section', function (e) {
51
+ if ($(e.target).closest('.title').length < 1) {
52
+ $('[data-section].vertical-nav, [data-section].horizontal-nav')
53
+ .find('section, .section')
54
+ .removeClass('active')
55
+ .attr('style', '');
56
+ }
57
+ });
58
+
46
59
  this.settings.init = true;
47
60
  },
48
61
 
@@ -60,6 +73,7 @@
60
73
  if (section.hasClass('active')) {
61
74
  if (self.small(parent)
62
75
  || self.is_vertical(parent)
76
+ || self.is_horizontal(parent)
63
77
  || self.is_accordion(parent)) {
64
78
  section
65
79
  .removeClass('active')
@@ -73,9 +87,14 @@
73
87
  .removeClass('active')
74
88
  .attr('style', '');
75
89
 
76
- section.css('padding-top', self.outerHeight(section.find('.title')) - 1);
90
+ section.css('padding-top', self.outerHeight(section.find('.title')));
77
91
  }
78
92
 
93
+ $('[data-section].vertical-nav, [data-section].horizontal-nav')
94
+ .find('section, .section')
95
+ .removeClass('active')
96
+ .attr('style', '');
97
+
79
98
  if (self.small(parent)) {
80
99
  section.attr('style', '');
81
100
  }
@@ -100,6 +119,7 @@
100
119
  .attr('style', '');
101
120
  } else if (active_section.length < 1
102
121
  && !self.is_vertical($this)
122
+ && !self.is_horizontal($this)
103
123
  && !self.is_accordion($this)) {
104
124
  var first = $this.find('section, .section').first();
105
125
  first.addClass('active');
@@ -107,16 +127,22 @@
107
127
  if (self.small($this)) {
108
128
  first.attr('style', '');
109
129
  } else {
110
- first.css('padding-top', self.outerHeight(first.find('.title')) - 1);
130
+ first.css('padding-top', self.outerHeight(first.find('.title')));
111
131
  }
112
132
  }
113
133
 
114
134
  if (self.small($this)) {
115
135
  active_section.attr('style', '');
116
136
  } else {
117
- active_section.css('padding-top', self.outerHeight(active_section.find('.title')) - 1);
137
+ active_section.css('padding-top', self.outerHeight(active_section.find('.title')));
118
138
  }
119
139
  self.position_titles($this);
140
+
141
+ if (self.is_horizontal($this) && !self.small($this)) {
142
+ self.position_content($this);
143
+ } else {
144
+ self.position_content($this, false);
145
+ }
120
146
  });
121
147
  },
122
148
 
@@ -124,6 +150,10 @@
124
150
  return el.hasClass('vertical-nav');
125
151
  },
126
152
 
153
+ is_horizontal : function (el) {
154
+ return el.hasClass('horizontal-nav');
155
+ },
156
+
127
157
  is_accordion : function (el) {
128
158
  return el.hasClass('accordion');
129
159
  },
@@ -153,6 +183,7 @@
153
183
 
154
184
  if (typeof off === 'boolean') {
155
185
  titles.attr('style', '');
186
+
156
187
  } else {
157
188
  titles.each(function () {
158
189
  $(this).css('left', previous_width);
@@ -161,6 +192,32 @@
161
192
  }
162
193
  },
163
194
 
195
+ position_content : function (section, off) {
196
+ var titles = section.find('.title'),
197
+ content = section.find('.content'),
198
+ self = this;
199
+
200
+ if (typeof off === 'boolean') {
201
+ content.attr('style', '');
202
+ section.attr('style', '');
203
+ } else {
204
+ section.find('section, .section').each(function () {
205
+ var title = $(this).find('.title'),
206
+ content = $(this).find('.content');
207
+
208
+ content.css({left: title.position().left - 1, top: self.outerHeight(title) - 2});
209
+ });
210
+
211
+ // temporary work around for Zepto outerheight calculation issues.
212
+ if (typeof Zepto === 'function') {
213
+ section.height(this.outerHeight(titles.first()));
214
+ } else {
215
+ section.height(this.outerHeight(titles.first()) - 2);
216
+ }
217
+ }
218
+
219
+ },
220
+
164
221
  small : function (el) {
165
222
  if (el && this.is_accordion(el)) {
166
223
  return true;
@@ -11,7 +11,8 @@
11
11
  settings : {
12
12
  index : 0,
13
13
  stickyClass : 'sticky',
14
- back_text: '&laquo; Back',
14
+ custom_back_text: true,
15
+ back_text: 'Back',
15
16
  init : false
16
17
  },
17
18
 
@@ -150,8 +151,14 @@
150
151
  this.settings.$section.find('.has-dropdown>a').each(function () {
151
152
  var $link = $(this),
152
153
  $dropdown = $link.siblings('.dropdown'),
153
- $titleLi = $('<li class="title back js-generated"><h5><a href="#">' + self.settings.back_text + '</a></h5></li>');
154
+ $titleLi = $('<li class="title back js-generated"><h5><a href="#"></a></h5></li>');
155
+
154
156
  // Copy link to subnav
157
+ if (self.settings.custom_back_text == true) {
158
+ $titleLi.find('h5>a').html('&laquo; ' + self.settings.back_text);
159
+ } else {
160
+ $titleLi.find('h5>a').html('&laquo; ' + $link.html());
161
+ }
155
162
  $dropdown.prepend($titleLi);
156
163
  });
157
164
 
data/js/vendor/zepto.js CHANGED
@@ -1,10 +1,9 @@
1
- // Zepto.js
2
- // (c) 2010-2012 Thomas Fuchs
3
- // Zepto.js may be freely distributed under the MIT license.
1
+ /* Zepto v1.0-1-ga3cab6c - polyfill zepto detect event ajax form fx - zeptojs.com/license */
2
+
4
3
 
5
4
  ;(function(undefined){
6
5
  if (String.prototype.trim === undefined) // fix for iOS 3.2
7
- String.prototype.trim = function(){ return this.replace(/^\s+/, '').replace(/\s+$/, '') }
6
+ String.prototype.trim = function(){ return this.replace(/^\s+|\s+$/g, '') }
8
7
 
9
8
  // For iOS 3.x
10
9
  // from https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/reduce
@@ -33,7 +32,7 @@
33
32
  return accumulator
34
33
  }
35
34
 
36
- })();
35
+ })()
37
36
 
38
37
  var Zepto = (function() {
39
38
  var undefined, key, $, classList, emptyArray = [], slice = emptyArray.slice, filter = emptyArray.filter,
@@ -61,7 +60,8 @@ var Zepto = (function() {
61
60
  classSelectorRE = /^\.([\w-]+)$/,
62
61
  idSelectorRE = /^#([\w-]*)$/,
63
62
  tagSelectorRE = /^[\w-]+$/,
64
- toString = {}.toString,
63
+ class2type = {},
64
+ toString = class2type.toString,
65
65
  zepto = {},
66
66
  camelize, uniq,
67
67
  tempParent = document.createElement('div')
@@ -79,10 +79,17 @@ var Zepto = (function() {
79
79
  return match
80
80
  }
81
81
 
82
- function isFunction(value) { return toString.call(value) == "[object Function]" }
83
- function isObject(value) { return value instanceof Object }
84
- function isPlainObject(value) {
85
- return isObject(value) && value != window && value.__proto__ == Object.prototype
82
+ function type(obj) {
83
+ return obj == null ? String(obj) :
84
+ class2type[toString.call(obj)] || "object"
85
+ }
86
+
87
+ function isFunction(value) { return type(value) == "function" }
88
+ function isWindow(obj) { return obj != null && obj == obj.window }
89
+ function isDocument(obj) { return obj != null && obj.nodeType == obj.DOCUMENT_NODE }
90
+ function isObject(obj) { return type(obj) == "object" }
91
+ function isPlainObject(obj) {
92
+ return isObject(obj) && !isWindow(obj) && obj.__proto__ == Object.prototype
86
93
  }
87
94
  function isArray(value) { return value instanceof Array }
88
95
  function likeArray(obj) { return typeof obj.length == 'number' }
@@ -158,7 +165,7 @@ var Zepto = (function() {
158
165
  // Explorer. This method can be overriden in plugins.
159
166
  zepto.Z = function(dom, selector) {
160
167
  dom = dom || []
161
- dom.__proto__ = arguments.callee.prototype
168
+ dom.__proto__ = $.fn
162
169
  dom.selector = selector || ''
163
170
  return dom
164
171
  }
@@ -210,8 +217,11 @@ var Zepto = (function() {
210
217
 
211
218
  function extend(target, source, deep) {
212
219
  for (key in source)
213
- if (deep && isPlainObject(source[key])) {
214
- if (!isPlainObject(target[key])) target[key] = {}
220
+ if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {
221
+ if (isPlainObject(source[key]) && !isPlainObject(target[key]))
222
+ target[key] = {}
223
+ if (isArray(source[key]) && !isArray(target[key]))
224
+ target[key] = []
215
225
  extend(target[key], source[key], deep)
216
226
  }
217
227
  else if (source[key] !== undefined) target[key] = source[key]
@@ -234,7 +244,7 @@ var Zepto = (function() {
234
244
  // This method can be overriden in plugins.
235
245
  zepto.qsa = function(element, selector){
236
246
  var found
237
- return (element === document && idSelectorRE.test(selector)) ?
247
+ return (isDocument(element) && idSelectorRE.test(selector)) ?
238
248
  ( (found = element.getElementById(RegExp.$1)) ? [found] : [] ) :
239
249
  (element.nodeType !== 1 && element.nodeType !== 9) ? [] :
240
250
  slice.call(
@@ -292,11 +302,18 @@ var Zepto = (function() {
292
302
  }
293
303
  }
294
304
 
305
+ $.type = type
295
306
  $.isFunction = isFunction
296
- $.isObject = isObject
307
+ $.isWindow = isWindow
297
308
  $.isArray = isArray
298
309
  $.isPlainObject = isPlainObject
299
310
 
311
+ $.isEmptyObject = function(obj) {
312
+ var name
313
+ for (name in obj) return false
314
+ return true
315
+ }
316
+
300
317
  $.inArray = function(elem, array, i){
301
318
  return emptyArray.indexOf.call(array, elem, i)
302
319
  }
@@ -343,6 +360,11 @@ var Zepto = (function() {
343
360
 
344
361
  if (window.JSON) $.parseJSON = JSON.parse
345
362
 
363
+ // Populate the class2type map
364
+ $.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
365
+ class2type[ "[object " + name + "]" ] = name.toLowerCase()
366
+ })
367
+
346
368
  // Define methods that will be available on all
347
369
  // Zepto collections
348
370
  $.fn = {
@@ -434,22 +456,30 @@ var Zepto = (function() {
434
456
  return el && !isObject(el) ? el : $(el)
435
457
  },
436
458
  find: function(selector){
437
- var result
438
- if (this.length == 1) result = $(zepto.qsa(this[0], selector))
459
+ var result, $this = this
460
+ if (typeof selector == 'object')
461
+ result = $(selector).filter(function(){
462
+ var node = this
463
+ return emptyArray.some.call($this, function(parent){
464
+ return $.contains(parent, node)
465
+ })
466
+ })
467
+ else if (this.length == 1) result = $(zepto.qsa(this[0], selector))
439
468
  else result = this.map(function(){ return zepto.qsa(this, selector) })
440
469
  return result
441
470
  },
442
471
  closest: function(selector, context){
443
- var node = this[0]
444
- while (node && !zepto.matches(node, selector))
445
- node = node !== context && node !== document && node.parentNode
472
+ var node = this[0], collection = false
473
+ if (typeof selector == 'object') collection = $(selector)
474
+ while (node && !(collection ? collection.indexOf(node) >= 0 : zepto.matches(node, selector)))
475
+ node = node !== context && !isDocument(node) && node.parentNode
446
476
  return $(node)
447
477
  },
448
478
  parents: function(selector){
449
479
  var ancestors = [], nodes = this
450
480
  while (nodes.length > 0)
451
481
  nodes = $.map(nodes, function(node){
452
- if ((node = node.parentNode) && node !== document && ancestors.indexOf(node) < 0) {
482
+ if ((node = node.parentNode) && !isDocument(node) && ancestors.indexOf(node) < 0) {
453
483
  ancestors.push(node)
454
484
  return node
455
485
  }
@@ -606,8 +636,8 @@ var Zepto = (function() {
606
636
  return {
607
637
  left: obj.left + window.pageXOffset,
608
638
  top: obj.top + window.pageYOffset,
609
- width: obj.width,
610
- height: obj.height
639
+ width: Math.round(obj.width),
640
+ height: Math.round(obj.height)
611
641
  }
612
642
  },
613
643
  css: function(property, value){
@@ -615,17 +645,18 @@ var Zepto = (function() {
615
645
  return this[0] && (this[0].style[camelize(property)] || getComputedStyle(this[0], '').getPropertyValue(property))
616
646
 
617
647
  var css = ''
618
- for (key in property)
619
- if (!property[key] && property[key] !== 0)
620
- this.each(function(){ this.style.removeProperty(dasherize(key)) })
621
- else
622
- css += dasherize(key) + ':' + maybeAddPx(key, property[key]) + ';'
623
-
624
- if (typeof property == 'string')
648
+ if (type(property) == 'string') {
625
649
  if (!value && value !== 0)
626
650
  this.each(function(){ this.style.removeProperty(dasherize(property)) })
627
651
  else
628
652
  css = dasherize(property) + ":" + maybeAddPx(property, value)
653
+ } else {
654
+ for (key in property)
655
+ if (!property[key] && property[key] !== 0)
656
+ this.each(function(){ this.style.removeProperty(dasherize(key)) })
657
+ else
658
+ css += dasherize(key) + ':' + maybeAddPx(key, property[key]) + ';'
659
+ }
629
660
 
630
661
  return this.each(function(){ this.style.cssText += ';' + css })
631
662
  },
@@ -712,12 +743,13 @@ var Zepto = (function() {
712
743
  // Generate the `width` and `height` functions
713
744
  ;['width', 'height'].forEach(function(dimension){
714
745
  $.fn[dimension] = function(value){
715
- var offset, Dimension = dimension.replace(/./, function(m){ return m[0].toUpperCase() })
716
- if (value === undefined) return this[0] == window ? window['inner' + Dimension] :
717
- this[0] == document ? document.documentElement['offset' + Dimension] :
746
+ var offset, el = this[0],
747
+ Dimension = dimension.replace(/./, function(m){ return m[0].toUpperCase() })
748
+ if (value === undefined) return isWindow(el) ? el['inner' + Dimension] :
749
+ isDocument(el) ? el.documentElement['offset' + Dimension] :
718
750
  (offset = this.offset()) && offset[dimension]
719
751
  else return this.each(function(idx){
720
- var el = $(this)
752
+ el = $(this)
721
753
  el.css(dimension, funcArg(this, value, idx, el[dimension]()))
722
754
  })
723
755
  }
@@ -735,7 +767,11 @@ var Zepto = (function() {
735
767
 
736
768
  $.fn[operator] = function(){
737
769
  // arguments can be nodes, arrays of nodes, Zepto objects and HTML strings
738
- var nodes = $.map(arguments, function(n){ return isObject(n) ? n : zepto.fragment(n) }),
770
+ var argType, nodes = $.map(arguments, function(arg) {
771
+ argType = type(arg)
772
+ return argType == "object" || argType == "array" || arg == null ?
773
+ arg : zepto.fragment(arg)
774
+ }),
739
775
  parent, copyByClone = this.length > 1
740
776
  if (nodes.length < 1) return this
741
777
 
@@ -781,13 +817,60 @@ var Zepto = (function() {
781
817
  return $
782
818
  })()
783
819
 
784
- // If `$` is not yet defined, point it to `Zepto`
785
820
  window.Zepto = Zepto
786
- '$' in window || (window.$ = Zepto);
821
+ '$' in window || (window.$ = Zepto)
787
822
 
788
- // Zepto.js
789
- // (c) 2010-2012 Thomas Fuchs
790
- // Zepto.js may be freely distributed under the MIT license.
823
+ ;(function($){
824
+ function detect(ua){
825
+ var os = this.os = {}, browser = this.browser = {},
826
+ webkit = ua.match(/WebKit\/([\d.]+)/),
827
+ android = ua.match(/(Android)\s+([\d.]+)/),
828
+ ipad = ua.match(/(iPad).*OS\s([\d_]+)/),
829
+ iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/),
830
+ webos = ua.match(/(webOS|hpwOS)[\s\/]([\d.]+)/),
831
+ touchpad = webos && ua.match(/TouchPad/),
832
+ kindle = ua.match(/Kindle\/([\d.]+)/),
833
+ silk = ua.match(/Silk\/([\d._]+)/),
834
+ blackberry = ua.match(/(BlackBerry).*Version\/([\d.]+)/),
835
+ bb10 = ua.match(/(BB10).*Version\/([\d.]+)/),
836
+ rimtabletos = ua.match(/(RIM\sTablet\sOS)\s([\d.]+)/),
837
+ playbook = ua.match(/PlayBook/),
838
+ chrome = ua.match(/Chrome\/([\d.]+)/) || ua.match(/CriOS\/([\d.]+)/),
839
+ firefox = ua.match(/Firefox\/([\d.]+)/)
840
+
841
+ // Todo: clean this up with a better OS/browser seperation:
842
+ // - discern (more) between multiple browsers on android
843
+ // - decide if kindle fire in silk mode is android or not
844
+ // - Firefox on Android doesn't specify the Android version
845
+ // - possibly devide in os, device and browser hashes
846
+
847
+ if (browser.webkit = !!webkit) browser.version = webkit[1]
848
+
849
+ if (android) os.android = true, os.version = android[2]
850
+ if (iphone) os.ios = os.iphone = true, os.version = iphone[2].replace(/_/g, '.')
851
+ if (ipad) os.ios = os.ipad = true, os.version = ipad[2].replace(/_/g, '.')
852
+ if (webos) os.webos = true, os.version = webos[2]
853
+ if (touchpad) os.touchpad = true
854
+ if (blackberry) os.blackberry = true, os.version = blackberry[2]
855
+ if (bb10) os.bb10 = true, os.version = bb10[2]
856
+ if (rimtabletos) os.rimtabletos = true, os.version = rimtabletos[2]
857
+ if (playbook) browser.playbook = true
858
+ if (kindle) os.kindle = true, os.version = kindle[1]
859
+ if (silk) browser.silk = true, browser.version = silk[1]
860
+ if (!silk && os.android && ua.match(/Kindle Fire/)) browser.silk = true
861
+ if (chrome) browser.chrome = true, browser.version = chrome[1]
862
+ if (firefox) browser.firefox = true, browser.version = firefox[1]
863
+
864
+ os.tablet = !!(ipad || playbook || (android && !ua.match(/Mobile/)) || (firefox && ua.match(/Tablet/)))
865
+ os.phone = !!(!os.tablet && (android || iphone || webos || blackberry || bb10 ||
866
+ (chrome && ua.match(/Android/)) || (chrome && ua.match(/CriOS\/([\d.]+)/)) || (firefox && ua.match(/Mobile/))))
867
+ }
868
+
869
+ detect.call($, navigator.userAgent)
870
+ // make available to unit tests
871
+ $.__detect = detect
872
+
873
+ })(Zepto)
791
874
 
792
875
  ;(function($){
793
876
  var $$ = $.zepto.qsa, handlers = {}, _zid = 1, specialEvents={},
@@ -818,7 +901,7 @@ window.Zepto = Zepto
818
901
  }
819
902
 
820
903
  function eachEvent(events, fn, iterator){
821
- if ($.isObject(events)) $.each(events, iterator)
904
+ if ($.type(events) != "string") $.each(events, iterator)
822
905
  else events.split(/\s/).forEach(function(type){ iterator(type, fn) })
823
906
  }
824
907
 
@@ -1032,163 +1115,10 @@ window.Zepto = Zepto
1032
1115
  return event
1033
1116
  }
1034
1117
 
1035
- })(Zepto);
1036
-
1037
- // Zepto.js
1038
- // (c) 2010-2012 Thomas Fuchs
1039
- // Zepto.js may be freely distributed under the MIT license.
1040
-
1041
- ;(function($){
1042
- function detect(ua){
1043
- var os = this.os = {}, browser = this.browser = {},
1044
- webkit = ua.match(/WebKit\/([\d.]+)/),
1045
- android = ua.match(/(Android)\s+([\d.]+)/),
1046
- ipad = ua.match(/(iPad).*OS\s([\d_]+)/),
1047
- iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/),
1048
- webos = ua.match(/(webOS|hpwOS)[\s\/]([\d.]+)/),
1049
- touchpad = webos && ua.match(/TouchPad/),
1050
- kindle = ua.match(/Kindle\/([\d.]+)/),
1051
- silk = ua.match(/Silk\/([\d._]+)/),
1052
- blackberry = ua.match(/(BlackBerry).*Version\/([\d.]+)/),
1053
- chrome = ua.match(/Chrome\/([\d.]+)/) || ua.match(/CriOS\/([\d.]+)/)
1054
-
1055
- // todo clean this up with a better OS/browser
1056
- // separation. we need to discern between multiple
1057
- // browsers on android, and decide if kindle fire in
1058
- // silk mode is android or not
1059
-
1060
- if (browser.webkit = !!webkit) browser.version = webkit[1]
1061
-
1062
- if (android) os.android = true, os.version = android[2]
1063
- if (iphone) os.ios = os.iphone = true, os.version = iphone[2].replace(/_/g, '.')
1064
- if (ipad) os.ios = os.ipad = true, os.version = ipad[2].replace(/_/g, '.')
1065
- if (webos) os.webos = true, os.version = webos[2]
1066
- if (touchpad) os.touchpad = true
1067
- if (blackberry) os.blackberry = true, os.version = blackberry[2]
1068
- if (kindle) os.kindle = true, os.version = kindle[1]
1069
- if (silk) browser.silk = true, browser.version = silk[1]
1070
- if (!silk && os.android && ua.match(/Kindle Fire/)) browser.silk = true
1071
- if (chrome) browser.chrome = true, browser.version = chrome[1]
1072
- }
1073
-
1074
- detect.call($, navigator.userAgent)
1075
- // make available to unit tests
1076
- $.__detect = detect
1077
-
1078
- })(Zepto);
1079
-
1080
-
1081
- // Zepto.js
1082
- // (c) 2010-2012 Thomas Fuchs
1083
- // Zepto.js may be freely distributed under the MIT license.
1084
-
1085
- ;(function($, undefined){
1086
- var prefix = '', eventPrefix, endEventName, endAnimationName,
1087
- vendors = { Webkit: 'webkit', Moz: '', O: 'o', ms: 'MS' },
1088
- document = window.document, testEl = document.createElement('div'),
1089
- supportedTransforms = /^((translate|rotate|scale)(X|Y|Z|3d)?|matrix(3d)?|perspective|skew(X|Y)?)$/i,
1090
- transform,
1091
- transitionProperty, transitionDuration, transitionTiming,
1092
- animationName, animationDuration, animationTiming,
1093
- cssReset = {}
1094
-
1095
- function dasherize(str) { return downcase(str.replace(/([a-z])([A-Z])/, '$1-$2')) }
1096
- function downcase(str) { return str.toLowerCase() }
1097
- function normalizeEvent(name) { return eventPrefix ? eventPrefix + name : downcase(name) }
1098
-
1099
- $.each(vendors, function(vendor, event){
1100
- if (testEl.style[vendor + 'TransitionProperty'] !== undefined) {
1101
- prefix = '-' + downcase(vendor) + '-'
1102
- eventPrefix = event
1103
- return false
1104
- }
1105
- })
1106
-
1107
- transform = prefix + 'transform'
1108
- cssReset[transitionProperty = prefix + 'transition-property'] =
1109
- cssReset[transitionDuration = prefix + 'transition-duration'] =
1110
- cssReset[transitionTiming = prefix + 'transition-timing-function'] =
1111
- cssReset[animationName = prefix + 'animation-name'] =
1112
- cssReset[animationDuration = prefix + 'animation-duration'] =
1113
- cssReset[animationTiming = prefix + 'animation-timing-function'] = ''
1114
-
1115
- $.fx = {
1116
- off: (eventPrefix === undefined && testEl.style.transitionProperty === undefined),
1117
- speeds: { _default: 400, fast: 200, slow: 600 },
1118
- cssPrefix: prefix,
1119
- transitionEnd: normalizeEvent('TransitionEnd'),
1120
- animationEnd: normalizeEvent('AnimationEnd')
1121
- }
1122
-
1123
- $.fn.animate = function(properties, duration, ease, callback){
1124
- if ($.isObject(duration))
1125
- ease = duration.easing, callback = duration.complete, duration = duration.duration
1126
- if (duration) duration = (typeof duration == 'number' ? duration :
1127
- ($.fx.speeds[duration] || $.fx.speeds._default)) / 1000
1128
- return this.anim(properties, duration, ease, callback)
1129
- }
1130
-
1131
- $.fn.anim = function(properties, duration, ease, callback){
1132
- var key, cssValues = {}, cssProperties, transforms = '',
1133
- that = this, wrappedCallback, endEvent = $.fx.transitionEnd
1134
-
1135
- if (duration === undefined) duration = 0.4
1136
- if ($.fx.off) duration = 0
1137
-
1138
- if (typeof properties == 'string') {
1139
- // keyframe animation
1140
- cssValues[animationName] = properties
1141
- cssValues[animationDuration] = duration + 's'
1142
- cssValues[animationTiming] = (ease || 'linear')
1143
- endEvent = $.fx.animationEnd
1144
- } else {
1145
- cssProperties = []
1146
- // CSS transitions
1147
- for (key in properties)
1148
- if (supportedTransforms.test(key)) transforms += key + '(' + properties[key] + ') '
1149
- else cssValues[key] = properties[key], cssProperties.push(dasherize(key))
1150
-
1151
- if (transforms) cssValues[transform] = transforms, cssProperties.push(transform)
1152
- if (duration > 0 && typeof properties === 'object') {
1153
- cssValues[transitionProperty] = cssProperties.join(', ')
1154
- cssValues[transitionDuration] = duration + 's'
1155
- cssValues[transitionTiming] = (ease || 'linear')
1156
- }
1157
- }
1158
-
1159
- wrappedCallback = function(event){
1160
- if (typeof event !== 'undefined') {
1161
- if (event.target !== event.currentTarget) return // makes sure the event didn't bubble from "below"
1162
- $(event.target).unbind(endEvent, arguments.callee)
1163
- }
1164
- $(this).css(cssReset)
1165
- callback && callback.call(this)
1166
- }
1167
- if (duration > 0) this.bind(endEvent, wrappedCallback)
1168
-
1169
- // trigger page reflow so new elements can animate
1170
- this.size() && this.get(0).clientLeft
1171
-
1172
- this.css(cssValues)
1173
-
1174
- if (duration <= 0) setTimeout(function() {
1175
- that.each(function(){ wrappedCallback.call(this) })
1176
- }, 0)
1177
-
1178
- return this
1179
- }
1180
-
1181
- testEl = null
1182
- })(Zepto);
1183
-
1184
-
1185
- // Zepto.js
1186
- // (c) 2010-2012 Thomas Fuchs
1187
- // Zepto.js may be freely distributed under the MIT license.
1118
+ })(Zepto)
1188
1119
 
1189
1120
  ;(function($){
1190
1121
  var jsonpID = 0,
1191
- isObject = $.isObject,
1192
1122
  document = window.document,
1193
1123
  key,
1194
1124
  name,
@@ -1259,33 +1189,38 @@ window.Zepto = Zepto
1259
1189
 
1260
1190
  var callbackName = 'jsonp' + (++jsonpID),
1261
1191
  script = document.createElement('script'),
1262
- abort = function(){
1192
+ cleanup = function() {
1193
+ clearTimeout(abortTimeout)
1263
1194
  $(script).remove()
1264
- if (callbackName in window) window[callbackName] = empty
1265
- ajaxComplete('abort', xhr, options)
1195
+ delete window[callbackName]
1196
+ },
1197
+ abort = function(type){
1198
+ cleanup()
1199
+ // In case of manual abort or timeout, keep an empty function as callback
1200
+ // so that the SCRIPT tag that eventually loads won't result in an error.
1201
+ if (!type || type == 'timeout') window[callbackName] = empty
1202
+ ajaxError(null, type || 'abort', xhr, options)
1266
1203
  },
1267
1204
  xhr = { abort: abort }, abortTimeout
1268
1205
 
1269
- if (options.error) script.onerror = function() {
1270
- xhr.abort()
1271
- options.error()
1206
+ if (ajaxBeforeSend(xhr, options) === false) {
1207
+ abort('abort')
1208
+ return false
1272
1209
  }
1273
1210
 
1274
1211
  window[callbackName] = function(data){
1275
- clearTimeout(abortTimeout)
1276
- $(script).remove()
1277
- delete window[callbackName]
1212
+ cleanup()
1278
1213
  ajaxSuccess(data, xhr, options)
1279
1214
  }
1280
1215
 
1281
- serializeData(options)
1216
+ script.onerror = function() { abort('error') }
1217
+
1282
1218
  script.src = options.url.replace(/=\?/, '=' + callbackName)
1283
1219
  $('head').append(script)
1284
1220
 
1285
1221
  if (options.timeout > 0) abortTimeout = setTimeout(function(){
1286
- xhr.abort()
1287
- ajaxComplete('timeout', xhr, options)
1288
- }, options.timeout)
1222
+ abort('timeout')
1223
+ }, options.timeout)
1289
1224
 
1290
1225
  return xhr
1291
1226
  }
@@ -1322,10 +1257,13 @@ window.Zepto = Zepto
1322
1257
  // Default timeout
1323
1258
  timeout: 0,
1324
1259
  // Whether data should be serialized to string
1325
- processData: true
1260
+ processData: true,
1261
+ // Whether the browser should be allowed to cache GET responses
1262
+ cache: true,
1326
1263
  }
1327
1264
 
1328
1265
  function mimeToDataType(mime) {
1266
+ if (mime) mime = mime.split(';', 2)[0]
1329
1267
  return mime && ( mime == htmlType ? 'html' :
1330
1268
  mime == jsonType ? 'json' :
1331
1269
  scriptTypeRE.test(mime) ? 'script' :
@@ -1338,7 +1276,7 @@ window.Zepto = Zepto
1338
1276
 
1339
1277
  // serialize payload and append it to the URL for GET requests
1340
1278
  function serializeData(options) {
1341
- if (options.processData && isObject(options.data))
1279
+ if (options.processData && options.data && $.type(options.data) != "string")
1342
1280
  options.data = $.param(options.data, options.traditional)
1343
1281
  if (options.data && (!options.type || options.type.toUpperCase() == 'GET'))
1344
1282
  options.url = appendQuery(options.url, options.data)
@@ -1353,15 +1291,16 @@ window.Zepto = Zepto
1353
1291
  if (!settings.crossDomain) settings.crossDomain = /^([\w-]+:)?\/\/([^\/]+)/.test(settings.url) &&
1354
1292
  RegExp.$2 != window.location.host
1355
1293
 
1294
+ if (!settings.url) settings.url = window.location.toString()
1295
+ serializeData(settings)
1296
+ if (settings.cache === false) settings.url = appendQuery(settings.url, '_=' + Date.now())
1297
+
1356
1298
  var dataType = settings.dataType, hasPlaceholder = /=\?/.test(settings.url)
1357
1299
  if (dataType == 'jsonp' || hasPlaceholder) {
1358
1300
  if (!hasPlaceholder) settings.url = appendQuery(settings.url, 'callback=?')
1359
1301
  return $.ajaxJSONP(settings)
1360
1302
  }
1361
1303
 
1362
- if (!settings.url) settings.url = window.location.toString()
1363
- serializeData(settings)
1364
-
1365
1304
  var mime = settings.accepts[dataType],
1366
1305
  baseHeaders = { },
1367
1306
  protocol = /^([\w-]+:)\/\//.test(settings.url) ? RegExp.$1 : window.location.protocol,
@@ -1387,6 +1326,7 @@ window.Zepto = Zepto
1387
1326
  result = xhr.responseText
1388
1327
 
1389
1328
  try {
1329
+ // http://perfectionkills.com/global-eval-what-are-the-options/
1390
1330
  if (dataType == 'script') (1,eval)(result)
1391
1331
  else if (dataType == 'xml') result = xhr.responseXML
1392
1332
  else if (dataType == 'json') result = blankRE.test(result) ? null : $.parseJSON(result)
@@ -1421,40 +1361,60 @@ window.Zepto = Zepto
1421
1361
  return xhr
1422
1362
  }
1423
1363
 
1424
- $.get = function(url, success){ return $.ajax({ url: url, success: success }) }
1364
+ // handle optional data/success arguments
1365
+ function parseArguments(url, data, success, dataType) {
1366
+ var hasData = !$.isFunction(data)
1367
+ return {
1368
+ url: url,
1369
+ data: hasData ? data : undefined,
1370
+ success: !hasData ? data : $.isFunction(success) ? success : undefined,
1371
+ dataType: hasData ? dataType || success : success
1372
+ }
1373
+ }
1374
+
1375
+ $.get = function(url, data, success, dataType){
1376
+ return $.ajax(parseArguments.apply(null, arguments))
1377
+ }
1425
1378
 
1426
1379
  $.post = function(url, data, success, dataType){
1427
- if ($.isFunction(data)) dataType = dataType || success, success = data, data = null
1428
- return $.ajax({ type: 'POST', url: url, data: data, success: success, dataType: dataType })
1380
+ var options = parseArguments.apply(null, arguments)
1381
+ options.type = 'POST'
1382
+ return $.ajax(options)
1429
1383
  }
1430
1384
 
1431
- $.getJSON = function(url, success){
1432
- return $.ajax({ url: url, success: success, dataType: 'json' })
1385
+ $.getJSON = function(url, data, success){
1386
+ var options = parseArguments.apply(null, arguments)
1387
+ options.dataType = 'json'
1388
+ return $.ajax(options)
1433
1389
  }
1434
1390
 
1435
- $.fn.load = function(url, success){
1391
+ $.fn.load = function(url, data, success){
1436
1392
  if (!this.length) return this
1437
- var self = this, parts = url.split(/\s/), selector
1438
- if (parts.length > 1) url = parts[0], selector = parts[1]
1439
- $.get(url, function(response){
1393
+ var self = this, parts = url.split(/\s/), selector,
1394
+ options = parseArguments(url, data, success),
1395
+ callback = options.success
1396
+ if (parts.length > 1) options.url = parts[0], selector = parts[1]
1397
+ options.success = function(response){
1440
1398
  self.html(selector ?
1441
1399
  $('<div>').html(response.replace(rscript, "")).find(selector)
1442
1400
  : response)
1443
- success && success.apply(self, arguments)
1444
- })
1401
+ callback && callback.apply(self, arguments)
1402
+ }
1403
+ $.ajax(options)
1445
1404
  return this
1446
1405
  }
1447
1406
 
1448
1407
  var escape = encodeURIComponent
1449
1408
 
1450
1409
  function serialize(params, obj, traditional, scope){
1451
- var array = $.isArray(obj)
1410
+ var type, array = $.isArray(obj)
1452
1411
  $.each(obj, function(key, value) {
1412
+ type = $.type(value)
1453
1413
  if (scope) key = traditional ? scope : scope + '[' + (array ? '' : key) + ']'
1454
1414
  // handle data in serializeArray() format
1455
1415
  if (!scope && array) params.add(value.name, value.value)
1456
1416
  // recurse into nested objects
1457
- else if (traditional ? $.isArray(value) : isObject(value))
1417
+ else if (type == "array" || (!traditional && type == "object"))
1458
1418
  serialize(params, value, traditional, key)
1459
1419
  else params.add(key, value)
1460
1420
  })
@@ -1466,12 +1426,7 @@ window.Zepto = Zepto
1466
1426
  serialize(params, obj, traditional)
1467
1427
  return params.join('&').replace(/%20/g, '+')
1468
1428
  }
1469
- })(Zepto);
1470
-
1471
-
1472
- // Zepto.js
1473
- // (c) 2010-2012 Thomas Fuchs
1474
- // Zepto.js may be freely distributed under the MIT license.
1429
+ })(Zepto)
1475
1430
 
1476
1431
  ;(function ($) {
1477
1432
  $.fn.serializeArray = function () {
@@ -1508,8 +1463,178 @@ window.Zepto = Zepto
1508
1463
  return this
1509
1464
  }
1510
1465
 
1511
- })(Zepto);
1466
+ })(Zepto)
1467
+
1468
+ ;(function($, undefined){
1469
+ var prefix = '', eventPrefix, endEventName, endAnimationName,
1470
+ vendors = { Webkit: 'webkit', Moz: '', O: 'o', ms: 'MS' },
1471
+ document = window.document, testEl = document.createElement('div'),
1472
+ supportedTransforms = /^((translate|rotate|scale)(X|Y|Z|3d)?|matrix(3d)?|perspective|skew(X|Y)?)$/i,
1473
+ transform,
1474
+ transitionProperty, transitionDuration, transitionTiming,
1475
+ animationName, animationDuration, animationTiming,
1476
+ cssReset = {}
1512
1477
 
1478
+ function dasherize(str) { return downcase(str.replace(/([a-z])([A-Z])/, '$1-$2')) }
1479
+ function downcase(str) { return str.toLowerCase() }
1480
+ function normalizeEvent(name) { return eventPrefix ? eventPrefix + name : downcase(name) }
1481
+
1482
+ $.each(vendors, function(vendor, event){
1483
+ if (testEl.style[vendor + 'TransitionProperty'] !== undefined) {
1484
+ prefix = '-' + downcase(vendor) + '-'
1485
+ eventPrefix = event
1486
+ return false
1487
+ }
1488
+ })
1489
+
1490
+ transform = prefix + 'transform'
1491
+ cssReset[transitionProperty = prefix + 'transition-property'] =
1492
+ cssReset[transitionDuration = prefix + 'transition-duration'] =
1493
+ cssReset[transitionTiming = prefix + 'transition-timing-function'] =
1494
+ cssReset[animationName = prefix + 'animation-name'] =
1495
+ cssReset[animationDuration = prefix + 'animation-duration'] =
1496
+ cssReset[animationTiming = prefix + 'animation-timing-function'] = ''
1497
+
1498
+ $.fx = {
1499
+ off: (eventPrefix === undefined && testEl.style.transitionProperty === undefined),
1500
+ speeds: { _default: 400, fast: 200, slow: 600 },
1501
+ cssPrefix: prefix,
1502
+ transitionEnd: normalizeEvent('TransitionEnd'),
1503
+ animationEnd: normalizeEvent('AnimationEnd')
1504
+ }
1505
+
1506
+ $.fn.animate = function(properties, duration, ease, callback){
1507
+ if ($.isPlainObject(duration))
1508
+ ease = duration.easing, callback = duration.complete, duration = duration.duration
1509
+ if (duration) duration = (typeof duration == 'number' ? duration :
1510
+ ($.fx.speeds[duration] || $.fx.speeds._default)) / 1000
1511
+ return this.anim(properties, duration, ease, callback)
1512
+ }
1513
+
1514
+ $.fn.anim = function(properties, duration, ease, callback){
1515
+ var key, cssValues = {}, cssProperties, transforms = '',
1516
+ that = this, wrappedCallback, endEvent = $.fx.transitionEnd
1517
+
1518
+ if (duration === undefined) duration = 0.4
1519
+ if ($.fx.off) duration = 0
1520
+
1521
+ if (typeof properties == 'string') {
1522
+ // keyframe animation
1523
+ cssValues[animationName] = properties
1524
+ cssValues[animationDuration] = duration + 's'
1525
+ cssValues[animationTiming] = (ease || 'linear')
1526
+ endEvent = $.fx.animationEnd
1527
+ } else {
1528
+ cssProperties = []
1529
+ // CSS transitions
1530
+ for (key in properties)
1531
+ if (supportedTransforms.test(key)) transforms += key + '(' + properties[key] + ') '
1532
+ else cssValues[key] = properties[key], cssProperties.push(dasherize(key))
1533
+
1534
+ if (transforms) cssValues[transform] = transforms, cssProperties.push(transform)
1535
+ if (duration > 0 && typeof properties === 'object') {
1536
+ cssValues[transitionProperty] = cssProperties.join(', ')
1537
+ cssValues[transitionDuration] = duration + 's'
1538
+ cssValues[transitionTiming] = (ease || 'linear')
1539
+ }
1540
+ }
1541
+
1542
+ wrappedCallback = function(event){
1543
+ if (typeof event !== 'undefined') {
1544
+ if (event.target !== event.currentTarget) return // makes sure the event didn't bubble from "below"
1545
+ $(event.target).unbind(endEvent, wrappedCallback)
1546
+ }
1547
+ $(this).css(cssReset)
1548
+ callback && callback.call(this)
1549
+ }
1550
+ if (duration > 0) this.bind(endEvent, wrappedCallback)
1551
+
1552
+ // trigger page reflow so new elements can animate
1553
+ this.size() && this.get(0).clientLeft
1554
+
1555
+ this.css(cssValues)
1556
+
1557
+ if (duration <= 0) setTimeout(function() {
1558
+ that.each(function(){ wrappedCallback.call(this) })
1559
+ }, 0)
1560
+
1561
+ return this
1562
+ }
1563
+
1564
+ testEl = null
1565
+ })(Zepto)
1566
+
1567
+ // Zepto.js
1568
+ // (c) 2010-2012 Thomas Fuchs
1569
+ // Zepto.js may be freely distributed under the MIT license.
1570
+
1571
+ ;(function($, undefined){
1572
+ var document = window.document, docElem = document.documentElement,
1573
+ origShow = $.fn.show, origHide = $.fn.hide, origToggle = $.fn.toggle
1574
+
1575
+ function anim(el, speed, opacity, scale, callback) {
1576
+ if (typeof speed == 'function' && !callback) callback = speed, speed = undefined
1577
+ var props = { opacity: opacity }
1578
+ if (scale) {
1579
+ props.scale = scale
1580
+ el.css($.fx.cssPrefix + 'transform-origin', '0 0')
1581
+ }
1582
+ return el.animate(props, speed, null, callback)
1583
+ }
1584
+
1585
+ function hide(el, speed, scale, callback) {
1586
+ return anim(el, speed, 0, scale, function(){
1587
+ origHide.call($(this))
1588
+ callback && callback.call(this)
1589
+ })
1590
+ }
1591
+
1592
+ $.fn.show = function(speed, callback) {
1593
+ origShow.call(this)
1594
+ if (speed === undefined) speed = 0
1595
+ else this.css('opacity', 0)
1596
+ return anim(this, speed, 1, '1,1', callback)
1597
+ }
1598
+
1599
+ $.fn.hide = function(speed, callback) {
1600
+ if (speed === undefined) return origHide.call(this)
1601
+ else return hide(this, speed, '0,0', callback)
1602
+ }
1603
+
1604
+ $.fn.toggle = function(speed, callback) {
1605
+ if (speed === undefined || typeof speed == 'boolean')
1606
+ return origToggle.call(this, speed)
1607
+ else return this.each(function(){
1608
+ var el = $(this)
1609
+ el[el.css('display') == 'none' ? 'show' : 'hide'](speed, callback)
1610
+ })
1611
+ }
1612
+
1613
+ $.fn.fadeTo = function(speed, opacity, callback) {
1614
+ return anim(this, speed, opacity, null, callback)
1615
+ }
1616
+
1617
+ $.fn.fadeIn = function(speed, callback) {
1618
+ var target = this.css('opacity')
1619
+ if (target > 0) this.css('opacity', 0)
1620
+ else target = 1
1621
+ return origShow.call(this).fadeTo(speed, target, callback)
1622
+ }
1623
+
1624
+ $.fn.fadeOut = function(speed, callback) {
1625
+ return hide(this, speed, null, callback)
1626
+ }
1627
+
1628
+ $.fn.fadeToggle = function(speed, callback) {
1629
+ return this.each(function(){
1630
+ var el = $(this)
1631
+ el[
1632
+ (el.css('opacity') == 0 || el.css('display') == 'none') ? 'fadeIn' : 'fadeOut'
1633
+ ](speed, callback)
1634
+ })
1635
+ }
1636
+
1637
+ })(Zepto)
1513
1638
 
1514
1639
  // Zepto.js
1515
1640
  // (c) 2010-2012 Thomas Fuchs
@@ -1531,8 +1656,7 @@ window.Zepto = Zepto
1531
1656
  }
1532
1657
  })
1533
1658
  }
1534
- })(Zepto);
1535
-
1659
+ })(Zepto)
1536
1660
 
1537
1661
  // Zepto.js
1538
1662
  // (c) 2010-2012 Thomas Fuchs
@@ -1600,8 +1724,7 @@ window.Zepto = Zepto
1600
1724
  if (store) $.each(names, function(){ delete store[camelize(this)] })
1601
1725
  })
1602
1726
  }
1603
- })(Zepto);
1604
-
1727
+ })(Zepto)
1605
1728
 
1606
1729
  ;(function($){
1607
1730
  var zepto = $.zepto, oldQsa = zepto.qsa, oldMatches = zepto.matches
@@ -1644,7 +1767,7 @@ window.Zepto = Zepto
1644
1767
  sel = sel.replace(/=#\]/g, '="#"]')
1645
1768
  var filter, arg, match = filterRe.exec(sel)
1646
1769
  if (match && match[2] in filters) {
1647
- var filter = filters[match[2]], arg = match[3]
1770
+ filter = filters[match[2]], arg = match[3]
1648
1771
  sel = match[1]
1649
1772
  if (arg) {
1650
1773
  var num = Number(arg)
@@ -1683,8 +1806,7 @@ window.Zepto = Zepto
1683
1806
  (!filter || filter.call(node, null, arg) === node)
1684
1807
  })
1685
1808
  }
1686
- })(Zepto);
1687
-
1809
+ })(Zepto)
1688
1810
 
1689
1811
  // Zepto.js
1690
1812
  // (c) 2010-2012 Thomas Fuchs
@@ -1707,76 +1829,56 @@ window.Zepto = Zepto
1707
1829
  return ret
1708
1830
  }
1709
1831
  })
1710
- })(Zepto);
1711
-
1712
- // Zepto.js
1713
- // (c) 2010-2012 Thomas Fuchs
1714
- // Zepto.js may be freely distributed under the MIT license.
1715
-
1716
- ;(function($, undefined){
1717
- var document = window.document, docElem = document.documentElement,
1718
- origShow = $.fn.show, origHide = $.fn.hide, origToggle = $.fn.toggle
1719
-
1720
- function anim(el, speed, opacity, scale, callback) {
1721
- if (typeof speed == 'function' && !callback) callback = speed, speed = undefined
1722
- var props = { opacity: opacity }
1723
- if (scale) {
1724
- props.scale = scale
1725
- el.css($.fx.cssPrefix + 'transform-origin', '0 0')
1726
- }
1727
- return el.animate(props, speed, null, callback)
1728
- }
1729
-
1730
- function hide(el, speed, scale, callback) {
1731
- return anim(el, speed, 0, scale, function(){
1732
- origHide.call($(this))
1733
- callback && callback.call(this)
1734
- })
1735
- }
1736
-
1737
- $.fn.show = function(speed, callback) {
1738
- origShow.call(this)
1739
- if (speed === undefined) speed = 0
1740
- else this.css('opacity', 0)
1741
- return anim(this, speed, 1, '1,1', callback)
1742
- }
1743
-
1744
- $.fn.hide = function(speed, callback) {
1745
- if (speed === undefined) return origHide.call(this)
1746
- else return hide(this, speed, '0,0', callback)
1747
- }
1748
-
1749
- $.fn.toggle = function(speed, callback) {
1750
- if (speed === undefined || typeof speed == 'boolean')
1751
- return origToggle.call(this, speed)
1752
- else return this.each(function(){
1753
- var el = $(this)
1754
- el[el.css('display') == 'none' ? 'show' : 'hide'](speed, callback)
1755
- })
1756
- }
1757
-
1758
- $.fn.fadeTo = function(speed, opacity, callback) {
1759
- return anim(this, speed, opacity, null, callback)
1760
- }
1761
-
1762
- $.fn.fadeIn = function(speed, callback) {
1763
- var target = this.css('opacity')
1764
- if (target > 0) this.css('opacity', 0)
1765
- else target = 1
1766
- return origShow.call(this).fadeTo(speed, target, callback)
1767
- }
1768
-
1769
- $.fn.fadeOut = function(speed, callback) {
1770
- return hide(this, speed, null, callback)
1771
- }
1772
-
1773
- $.fn.fadeToggle = function(speed, callback) {
1774
- return this.each(function(){
1775
- var el = $(this)
1776
- el[
1777
- (el.css('opacity') == 0 || el.css('display') == 'none') ? 'fadeIn' : 'fadeOut'
1778
- ](speed, callback)
1779
- })
1780
- }
1781
-
1782
- })(Zepto)
1832
+ })(Zepto)
1833
+
1834
+
1835
+ // outer and inner height/width support
1836
+ if (this.Zepto) {
1837
+ (function($) {
1838
+ var ioDim, _base;
1839
+ ioDim = function(elem, Dimension, dimension, includeBorder, includeMargin) {
1840
+ var sides, size;
1841
+ if (elem) {
1842
+ size = elem[dimension]();
1843
+ sides = {
1844
+ width: ["left", "right"],
1845
+ height: ["top", "bottom"]
1846
+ };
1847
+ sides[dimension].forEach(function(side) {
1848
+ size += parseInt(elem.css("padding-" + side), 10);
1849
+ if (includeBorder) {
1850
+ size += parseInt(elem.css("border-" + side + "-width"), 10);
1851
+ }
1852
+ if (includeMargin) {
1853
+ return size += parseInt(elem.css("margin-" + side), 10);
1854
+ }
1855
+ });
1856
+ return size;
1857
+ } else {
1858
+ return null;
1859
+ }
1860
+ };
1861
+ ["width", "height"].forEach(function(dimension) {
1862
+ var Dimension, _base, _base1, _name, _name1;
1863
+ Dimension = dimension.replace(/./, function(m) {
1864
+ return m[0].toUpperCase();
1865
+ });
1866
+ (_base = $.fn)[_name = "inner" + Dimension] || (_base[_name] = function(includeMargin) {
1867
+ return ioDim(this, Dimension, dimension, false, includeMargin);
1868
+ });
1869
+ return (_base1 = $.fn)[_name1 = "outer" + Dimension] || (_base1[_name1] = function(includeMargin) {
1870
+ return ioDim(this, Dimension, dimension, true, includeMargin);
1871
+ });
1872
+ });
1873
+ return (_base = $.fn).detach || (_base.detach = function(selector) {
1874
+ var cloned, set;
1875
+ set = this;
1876
+ if (selector != null) {
1877
+ set = set.filter(selector);
1878
+ }
1879
+ cloned = set.clone(true);
1880
+ set.remove();
1881
+ return cloned;
1882
+ });
1883
+ })(Zepto);
1884
+ }