root / snf-cyclades-app / synnefo / ui / new_ui / ui / javascripts / zepto.js @ d0fe8c12
History | View | Annotate | Download (64.5 kB)
1 |
/* Zepto v1.0-1-ga3cab6c - polyfill zepto detect event ajax form fx - zeptojs.com/license */
|
---|---|
2 |
|
3 |
|
4 |
;(function(undefined){ |
5 |
if (String.prototype.trim === undefined) // fix for iOS 3.2 |
6 |
String.prototype.trim = function(){ return this.replace(/^\s+|\s+$/g, '') } |
7 |
|
8 |
// For iOS 3.x
|
9 |
// from https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/reduce
|
10 |
if (Array.prototype.reduce === undefined) |
11 |
Array.prototype.reduce = function(fun){ |
12 |
if(this === void 0 || this === null) throw new TypeError() |
13 |
var t = Object(this), len = t.length >>> 0, k = 0, accumulator |
14 |
if(typeof fun != 'function') throw new TypeError() |
15 |
if(len == 0 && arguments.length == 1) throw new TypeError() |
16 |
|
17 |
if(arguments.length >= 2) |
18 |
accumulator = arguments[1] |
19 |
else
|
20 |
do{
|
21 |
if(k in t){ |
22 |
accumulator = t[k++] |
23 |
break
|
24 |
} |
25 |
if(++k >= len) throw new TypeError() |
26 |
} while (true) |
27 |
|
28 |
while (k < len){
|
29 |
if(k in t) accumulator = fun.call(undefined, accumulator, t[k], k, t) |
30 |
k++ |
31 |
} |
32 |
return accumulator
|
33 |
} |
34 |
|
35 |
})() |
36 |
|
37 |
var Zepto = (function() { |
38 |
var undefined, key, $, classList, emptyArray = [], slice = emptyArray.slice, filter = emptyArray.filter, |
39 |
document = window.document, |
40 |
elementDisplay = {}, classCache = {}, |
41 |
getComputedStyle = document.defaultView.getComputedStyle, |
42 |
cssNumber = { 'column-count': 1, 'columns': 1, 'font-weight': 1, 'line-height': 1,'opacity': 1, 'z-index': 1, 'zoom': 1 }, |
43 |
fragmentRE = /^\s*<(\w+|!)[^>]*>/,
|
44 |
tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
|
45 |
rootNodeRE = /^(?:body|html)$/i,
|
46 |
|
47 |
// special attributes that should be get/set via method calls
|
48 |
methodAttributes = ['val', 'css', 'html', 'text', 'data', 'width', 'height', 'offset'], |
49 |
|
50 |
adjacencyOperators = [ 'after', 'prepend', 'before', 'append' ], |
51 |
table = document.createElement('table'),
|
52 |
tableRow = document.createElement('tr'),
|
53 |
containers = { |
54 |
'tr': document.createElement('tbody'), |
55 |
'tbody': table, 'thead': table, 'tfoot': table, |
56 |
'td': tableRow, 'th': tableRow, |
57 |
'*': document.createElement('div') |
58 |
}, |
59 |
readyRE = /complete|loaded|interactive/,
|
60 |
classSelectorRE = /^\.([\w-]+)$/,
|
61 |
idSelectorRE = /^#([\w-]*)$/,
|
62 |
tagSelectorRE = /^[\w-]+$/,
|
63 |
class2type = {}, |
64 |
toString = class2type.toString, |
65 |
zepto = {}, |
66 |
camelize, uniq, |
67 |
tempParent = document.createElement('div')
|
68 |
|
69 |
zepto.matches = function(element, selector) { |
70 |
if (!element || element.nodeType !== 1) return false |
71 |
var matchesSelector = element.webkitMatchesSelector || element.mozMatchesSelector ||
|
72 |
element.oMatchesSelector || element.matchesSelector |
73 |
if (matchesSelector) return matchesSelector.call(element, selector) |
74 |
// fall back to performing a selector:
|
75 |
var match, parent = element.parentNode, temp = !parent
|
76 |
if (temp) (parent = tempParent).appendChild(element)
|
77 |
match = ~zepto.qsa(parent, selector).indexOf(element) |
78 |
temp && tempParent.removeChild(element) |
79 |
return match
|
80 |
} |
81 |
|
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
|
93 |
} |
94 |
function isArray(value) { return value instanceof Array } |
95 |
function likeArray(obj) { return typeof obj.length == 'number' } |
96 |
|
97 |
function compact(array) { return filter.call(array, function(item){ return item != null }) } |
98 |
function flatten(array) { return array.length > 0 ? $.fn.concat.apply([], array) : array } |
99 |
camelize = function(str){ return str.replace(/-+(.)?/g, function(match, chr){ return chr ? chr.toUpperCase() : '' }) } |
100 |
function dasherize(str) { |
101 |
return str.replace(/::/g, '/') |
102 |
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') |
103 |
.replace(/([a-z\d])([A-Z])/g, '$1_$2') |
104 |
.replace(/_/g, '-') |
105 |
.toLowerCase() |
106 |
} |
107 |
uniq = function(array){ return filter.call(array, function(item, idx){ return array.indexOf(item) == idx }) } |
108 |
|
109 |
function classRE(name) { |
110 |
return name in classCache ? |
111 |
classCache[name] : (classCache[name] = new RegExp('(^|\\s)' + name + '(\\s|$)')) |
112 |
} |
113 |
|
114 |
function maybeAddPx(name, value) { |
115 |
return (typeof value == "number" && !cssNumber[dasherize(name)]) ? value + "px" : value |
116 |
} |
117 |
|
118 |
function defaultDisplay(nodeName) { |
119 |
var element, display
|
120 |
if (!elementDisplay[nodeName]) {
|
121 |
element = document.createElement(nodeName) |
122 |
document.body.appendChild(element) |
123 |
display = getComputedStyle(element, '').getPropertyValue("display") |
124 |
element.parentNode.removeChild(element) |
125 |
display == "none" && (display = "block") |
126 |
elementDisplay[nodeName] = display |
127 |
} |
128 |
return elementDisplay[nodeName]
|
129 |
} |
130 |
|
131 |
function children(element) { |
132 |
return 'children' in element ? |
133 |
slice.call(element.children) : |
134 |
$.map(element.childNodes, function(node){ if (node.nodeType == 1) return node }) |
135 |
} |
136 |
|
137 |
// `$.zepto.fragment` takes a html string and an optional tag name
|
138 |
// to generate DOM nodes nodes from the given html string.
|
139 |
// The generated DOM nodes are returned as an array.
|
140 |
// This function can be overriden in plugins for example to make
|
141 |
// it compatible with browsers that don't support the DOM fully.
|
142 |
zepto.fragment = function(html, name, properties) { |
143 |
if (html.replace) html = html.replace(tagExpanderRE, "<$1></$2>") |
144 |
if (name === undefined) name = fragmentRE.test(html) && RegExp.$1 |
145 |
if (!(name in containers)) name = '*' |
146 |
|
147 |
var nodes, dom, container = containers[name]
|
148 |
container.innerHTML = '' + html
|
149 |
dom = $.each(slice.call(container.childNodes), function(){ |
150 |
container.removeChild(this)
|
151 |
}) |
152 |
if (isPlainObject(properties)) {
|
153 |
nodes = $(dom)
|
154 |
$.each(properties, function(key, value) { |
155 |
if (methodAttributes.indexOf(key) > -1) nodes[key](value) |
156 |
else nodes.attr(key, value)
|
157 |
}) |
158 |
} |
159 |
return dom
|
160 |
} |
161 |
|
162 |
// `$.zepto.Z` swaps out the prototype of the given `dom` array
|
163 |
// of nodes with `$.fn` and thus supplying all the Zepto functions
|
164 |
// to the array. Note that `__proto__` is not supported on Internet
|
165 |
// Explorer. This method can be overriden in plugins.
|
166 |
zepto.Z = function(dom, selector) { |
167 |
dom = dom || [] |
168 |
dom.__proto__ = $.fn
|
169 |
dom.selector = selector || ''
|
170 |
return dom
|
171 |
} |
172 |
|
173 |
// `$.zepto.isZ` should return `true` if the given object is a Zepto
|
174 |
// collection. This method can be overriden in plugins.
|
175 |
zepto.isZ = function(object) { |
176 |
return object instanceof zepto.Z |
177 |
} |
178 |
|
179 |
// `$.zepto.init` is Zepto's counterpart to jQuery's `$.fn.init` and
|
180 |
// takes a CSS selector and an optional context (and handles various
|
181 |
// special cases).
|
182 |
// This method can be overriden in plugins.
|
183 |
zepto.init = function(selector, context) { |
184 |
// If nothing given, return an empty Zepto collection
|
185 |
if (!selector) return zepto.Z() |
186 |
// If a function is given, call it when the DOM is ready
|
187 |
else if (isFunction(selector)) return $(document).ready(selector) |
188 |
// If a Zepto collection is given, juts return it
|
189 |
else if (zepto.isZ(selector)) return selector |
190 |
else {
|
191 |
var dom
|
192 |
// normalize array if an array of nodes is given
|
193 |
if (isArray(selector)) dom = compact(selector)
|
194 |
// Wrap DOM nodes. If a plain object is given, duplicate it.
|
195 |
else if (isObject(selector)) |
196 |
dom = [isPlainObject(selector) ? $.extend({}, selector) : selector], selector = null |
197 |
// If it's a html fragment, create nodes from it
|
198 |
else if (fragmentRE.test(selector)) |
199 |
dom = zepto.fragment(selector.trim(), RegExp.$1, context), selector = null |
200 |
// If there's a context, create a collection on that context first, and select
|
201 |
// nodes from there
|
202 |
else if (context !== undefined) return $(context).find(selector) |
203 |
// And last but no least, if it's a CSS selector, use it to select nodes.
|
204 |
else dom = zepto.qsa(document, selector)
|
205 |
// create a new Zepto collection from the nodes found
|
206 |
return zepto.Z(dom, selector)
|
207 |
} |
208 |
} |
209 |
|
210 |
// `$` will be the base `Zepto` object. When calling this
|
211 |
// function just call `$.zepto.init, which makes the implementation
|
212 |
// details of selecting nodes and creating Zepto collections
|
213 |
// patchable in plugins.
|
214 |
$ = function(selector, context){ |
215 |
return zepto.init(selector, context)
|
216 |
} |
217 |
|
218 |
function extend(target, source, deep) { |
219 |
for (key in source) |
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] = [] |
225 |
extend(target[key], source[key], deep) |
226 |
} |
227 |
else if (source[key] !== undefined) target[key] = source[key] |
228 |
} |
229 |
|
230 |
// Copy all but undefined properties from one or more
|
231 |
// objects to the `target` object.
|
232 |
$.extend = function(target){ |
233 |
var deep, args = slice.call(arguments, 1) |
234 |
if (typeof target == 'boolean') { |
235 |
deep = target |
236 |
target = args.shift() |
237 |
} |
238 |
args.forEach(function(arg){ extend(target, arg, deep) })
|
239 |
return target
|
240 |
} |
241 |
|
242 |
// `$.zepto.qsa` is Zepto's CSS selector implementation which
|
243 |
// uses `document.querySelectorAll` and optimizes for some special cases, like `#id`.
|
244 |
// This method can be overriden in plugins.
|
245 |
zepto.qsa = function(element, selector){ |
246 |
var found
|
247 |
return (isDocument(element) && idSelectorRE.test(selector)) ?
|
248 |
( (found = element.getElementById(RegExp.$1)) ? [found] : [] ) :
|
249 |
(element.nodeType !== 1 && element.nodeType !== 9) ? [] : |
250 |
slice.call( |
251 |
classSelectorRE.test(selector) ? element.getElementsByClassName(RegExp.$1) :
|
252 |
tagSelectorRE.test(selector) ? element.getElementsByTagName(selector) : |
253 |
element.querySelectorAll(selector) |
254 |
) |
255 |
} |
256 |
|
257 |
function filtered(nodes, selector) { |
258 |
return selector === undefined ? $(nodes) : $(nodes).filter(selector) |
259 |
} |
260 |
|
261 |
$.contains = function(parent, node) { |
262 |
return parent !== node && parent.contains(node)
|
263 |
} |
264 |
|
265 |
function funcArg(context, arg, idx, payload) { |
266 |
return isFunction(arg) ? arg.call(context, idx, payload) : arg
|
267 |
} |
268 |
|
269 |
function setAttribute(node, name, value) { |
270 |
value == null ? node.removeAttribute(name) : node.setAttribute(name, value)
|
271 |
} |
272 |
|
273 |
// access className property while respecting SVGAnimatedString
|
274 |
function className(node, value){ |
275 |
var klass = node.className,
|
276 |
svg = klass && klass.baseVal !== undefined
|
277 |
|
278 |
if (value === undefined) return svg ? klass.baseVal : klass |
279 |
svg ? (klass.baseVal = value) : (node.className = value) |
280 |
} |
281 |
|
282 |
// "true" => true
|
283 |
// "false" => false
|
284 |
// "null" => null
|
285 |
// "42" => 42
|
286 |
// "42.5" => 42.5
|
287 |
// JSON => parse if valid
|
288 |
// String => self
|
289 |
function deserializeValue(value) { |
290 |
var num
|
291 |
try {
|
292 |
return value ?
|
293 |
value == "true" ||
|
294 |
( value == "false" ? false : |
295 |
value == "null" ? null : |
296 |
!isNaN(num = Number(value)) ? num : |
297 |
/^[\[\{]/.test(value) ? $.parseJSON(value) : |
298 |
value ) |
299 |
: value |
300 |
} catch(e) {
|
301 |
return value
|
302 |
} |
303 |
} |
304 |
|
305 |
$.type = type
|
306 |
$.isFunction = isFunction
|
307 |
$.isWindow = isWindow
|
308 |
$.isArray = isArray
|
309 |
$.isPlainObject = isPlainObject
|
310 |
|
311 |
$.isEmptyObject = function(obj) { |
312 |
var name
|
313 |
for (name in obj) return false |
314 |
return true |
315 |
} |
316 |
|
317 |
$.inArray = function(elem, array, i){ |
318 |
return emptyArray.indexOf.call(array, elem, i)
|
319 |
} |
320 |
|
321 |
$.camelCase = camelize
|
322 |
$.trim = function(str) { return str.trim() } |
323 |
|
324 |
// plugin compatibility
|
325 |
$.uuid = 0 |
326 |
$.support = { }
|
327 |
$.expr = { }
|
328 |
|
329 |
$.map = function(elements, callback){ |
330 |
var value, values = [], i, key
|
331 |
if (likeArray(elements))
|
332 |
for (i = 0; i < elements.length; i++) { |
333 |
value = callback(elements[i], i) |
334 |
if (value != null) values.push(value) |
335 |
} |
336 |
else
|
337 |
for (key in elements) { |
338 |
value = callback(elements[key], key) |
339 |
if (value != null) values.push(value) |
340 |
} |
341 |
return flatten(values)
|
342 |
} |
343 |
|
344 |
$.each = function(elements, callback){ |
345 |
var i, key
|
346 |
if (likeArray(elements)) {
|
347 |
for (i = 0; i < elements.length; i++) |
348 |
if (callback.call(elements[i], i, elements[i]) === false) return elements |
349 |
} else {
|
350 |
for (key in elements) |
351 |
if (callback.call(elements[key], key, elements[key]) === false) return elements |
352 |
} |
353 |
|
354 |
return elements
|
355 |
} |
356 |
|
357 |
$.grep = function(elements, callback){ |
358 |
return filter.call(elements, callback)
|
359 |
} |
360 |
|
361 |
if (window.JSON) $.parseJSON = JSON.parse |
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 |
|
368 |
// Define methods that will be available on all
|
369 |
// Zepto collections
|
370 |
$.fn = {
|
371 |
// Because a collection acts like an array
|
372 |
// copy over these useful array functions.
|
373 |
forEach: emptyArray.forEach,
|
374 |
reduce: emptyArray.reduce,
|
375 |
push: emptyArray.push,
|
376 |
sort: emptyArray.sort,
|
377 |
indexOf: emptyArray.indexOf,
|
378 |
concat: emptyArray.concat,
|
379 |
|
380 |
// `map` and `slice` in the jQuery API work differently
|
381 |
// from their array counterparts
|
382 |
map: function(fn){ |
383 |
return $($.map(this, function(el, i){ return fn.call(el, i, el) })) |
384 |
}, |
385 |
slice: function(){ |
386 |
return $(slice.apply(this, arguments)) |
387 |
}, |
388 |
|
389 |
ready: function(callback){ |
390 |
if (readyRE.test(document.readyState)) callback($) |
391 |
else document.addEventListener('DOMContentLoaded', function(){ callback($) }, false) |
392 |
return this |
393 |
}, |
394 |
get: function(idx){ |
395 |
return idx === undefined ? slice.call(this) : this[idx >= 0 ? idx : idx + this.length] |
396 |
}, |
397 |
toArray: function(){ return this.get() }, |
398 |
size: function(){ |
399 |
return this.length |
400 |
}, |
401 |
remove: function(){ |
402 |
return this.each(function(){ |
403 |
if (this.parentNode != null) |
404 |
this.parentNode.removeChild(this) |
405 |
}) |
406 |
}, |
407 |
each: function(callback){ |
408 |
emptyArray.every.call(this, function(el, idx){ |
409 |
return callback.call(el, idx, el) !== false |
410 |
}) |
411 |
return this |
412 |
}, |
413 |
filter: function(selector){ |
414 |
if (isFunction(selector)) return this.not(this.not(selector)) |
415 |
return $(filter.call(this, function(element){ |
416 |
return zepto.matches(element, selector)
|
417 |
})) |
418 |
}, |
419 |
add: function(selector,context){ |
420 |
return $(uniq(this.concat($(selector,context)))) |
421 |
}, |
422 |
is: function(selector){ |
423 |
return this.length > 0 && zepto.matches(this[0], selector) |
424 |
}, |
425 |
not: function(selector){ |
426 |
var nodes=[]
|
427 |
if (isFunction(selector) && selector.call !== undefined) |
428 |
this.each(function(idx){ |
429 |
if (!selector.call(this,idx)) nodes.push(this) |
430 |
}) |
431 |
else {
|
432 |
var excludes = typeof selector == 'string' ? this.filter(selector) : |
433 |
(likeArray(selector) && isFunction(selector.item)) ? slice.call(selector) : $(selector)
|
434 |
this.forEach(function(el){ |
435 |
if (excludes.indexOf(el) < 0) nodes.push(el) |
436 |
}) |
437 |
} |
438 |
return $(nodes) |
439 |
}, |
440 |
has: function(selector){ |
441 |
return this.filter(function(){ |
442 |
return isObject(selector) ?
|
443 |
$.contains(this, selector) : |
444 |
$(this).find(selector).size() |
445 |
}) |
446 |
}, |
447 |
eq: function(idx){ |
448 |
return idx === -1 ? this.slice(idx) : this.slice(idx, + idx + 1) |
449 |
}, |
450 |
first: function(){ |
451 |
var el = this[0] |
452 |
return el && !isObject(el) ? el : $(el) |
453 |
}, |
454 |
last: function(){ |
455 |
var el = this[this.length - 1] |
456 |
return el && !isObject(el) ? el : $(el) |
457 |
}, |
458 |
find: function(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)) |
468 |
else result = this.map(function(){ return zepto.qsa(this, selector) }) |
469 |
return result
|
470 |
}, |
471 |
closest: function(selector, context){ |
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 |
476 |
return $(node) |
477 |
}, |
478 |
parents: function(selector){ |
479 |
var ancestors = [], nodes = this |
480 |
while (nodes.length > 0) |
481 |
nodes = $.map(nodes, function(node){ |
482 |
if ((node = node.parentNode) && !isDocument(node) && ancestors.indexOf(node) < 0) { |
483 |
ancestors.push(node) |
484 |
return node
|
485 |
} |
486 |
}) |
487 |
return filtered(ancestors, selector)
|
488 |
}, |
489 |
parent: function(selector){ |
490 |
return filtered(uniq(this.pluck('parentNode')), selector) |
491 |
}, |
492 |
children: function(selector){ |
493 |
return filtered(this.map(function(){ return children(this) }), selector) |
494 |
}, |
495 |
contents: function() { |
496 |
return this.map(function() { return slice.call(this.childNodes) }) |
497 |
}, |
498 |
siblings: function(selector){ |
499 |
return filtered(this.map(function(i, el){ |
500 |
return filter.call(children(el.parentNode), function(child){ return child!==el }) |
501 |
}), selector) |
502 |
}, |
503 |
empty: function(){ |
504 |
return this.each(function(){ this.innerHTML = '' }) |
505 |
}, |
506 |
// `pluck` is borrowed from Prototype.js
|
507 |
pluck: function(property){ |
508 |
return $.map(this, function(el){ return el[property] }) |
509 |
}, |
510 |
show: function(){ |
511 |
return this.each(function(){ |
512 |
this.style.display == "none" && (this.style.display = null) |
513 |
if (getComputedStyle(this, '').getPropertyValue("display") == "none") |
514 |
this.style.display = defaultDisplay(this.nodeName) |
515 |
}) |
516 |
}, |
517 |
replaceWith: function(newContent){ |
518 |
return this.before(newContent).remove() |
519 |
}, |
520 |
wrap: function(structure){ |
521 |
var func = isFunction(structure)
|
522 |
if (this[0] && !func) |
523 |
var dom = $(structure).get(0), |
524 |
clone = dom.parentNode || this.length > 1 |
525 |
|
526 |
return this.each(function(index){ |
527 |
$(this).wrapAll( |
528 |
func ? structure.call(this, index) :
|
529 |
clone ? dom.cloneNode(true) : dom
|
530 |
) |
531 |
}) |
532 |
}, |
533 |
wrapAll: function(structure){ |
534 |
if (this[0]) { |
535 |
$(this[0]).before(structure = $(structure)) |
536 |
var children
|
537 |
// drill down to the inmost element
|
538 |
while ((children = structure.children()).length) structure = children.first()
|
539 |
$(structure).append(this) |
540 |
} |
541 |
return this |
542 |
}, |
543 |
wrapInner: function(structure){ |
544 |
var func = isFunction(structure)
|
545 |
return this.each(function(index){ |
546 |
var self = $(this), contents = self.contents(), |
547 |
dom = func ? structure.call(this, index) : structure
|
548 |
contents.length ? contents.wrapAll(dom) : self.append(dom) |
549 |
}) |
550 |
}, |
551 |
unwrap: function(){ |
552 |
this.parent().each(function(){ |
553 |
$(this).replaceWith($(this).children()) |
554 |
}) |
555 |
return this |
556 |
}, |
557 |
clone: function(){ |
558 |
return this.map(function(){ return this.cloneNode(true) }) |
559 |
}, |
560 |
hide: function(){ |
561 |
return this.css("display", "none") |
562 |
}, |
563 |
toggle: function(setting){ |
564 |
return this.each(function(){ |
565 |
var el = $(this) |
566 |
;(setting === undefined ? el.css("display") == "none" : setting) ? el.show() : el.hide() |
567 |
}) |
568 |
}, |
569 |
prev: function(selector){ return $(this.pluck('previousElementSibling')).filter(selector || '*') }, |
570 |
next: function(selector){ return $(this.pluck('nextElementSibling')).filter(selector || '*') }, |
571 |
html: function(html){ |
572 |
return html === undefined ? |
573 |
(this.length > 0 ? this[0].innerHTML : null) : |
574 |
this.each(function(idx){ |
575 |
var originHtml = this.innerHTML |
576 |
$(this).empty().append( funcArg(this, html, idx, originHtml) ) |
577 |
}) |
578 |
}, |
579 |
text: function(text){ |
580 |
return text === undefined ? |
581 |
(this.length > 0 ? this[0].textContent : null) : |
582 |
this.each(function(){ this.textContent = text }) |
583 |
}, |
584 |
attr: function(name, value){ |
585 |
var result
|
586 |
return (typeof name == 'string' && value === undefined) ? |
587 |
(this.length == 0 || this[0].nodeType !== 1 ? undefined : |
588 |
(name == 'value' && this[0].nodeName == 'INPUT') ? this.val() : |
589 |
(!(result = this[0].getAttribute(name)) && name in this[0]) ? this[0][name] : result |
590 |
) : |
591 |
this.each(function(idx){ |
592 |
if (this.nodeType !== 1) return |
593 |
if (isObject(name)) for (key in name) setAttribute(this, key, name[key]) |
594 |
else setAttribute(this, name, funcArg(this, value, idx, this.getAttribute(name))) |
595 |
}) |
596 |
}, |
597 |
removeAttr: function(name){ |
598 |
return this.each(function(){ this.nodeType === 1 && setAttribute(this, name) }) |
599 |
}, |
600 |
prop: function(name, value){ |
601 |
return (value === undefined) ? |
602 |
(this[0] && this[0][name]) : |
603 |
this.each(function(idx){ |
604 |
this[name] = funcArg(this, value, idx, this[name]) |
605 |
}) |
606 |
}, |
607 |
data: function(name, value){ |
608 |
var data = this.attr('data-' + dasherize(name), value) |
609 |
return data !== null ? deserializeValue(data) : undefined |
610 |
}, |
611 |
val: function(value){ |
612 |
return (value === undefined) ? |
613 |
(this[0] && (this[0].multiple ? |
614 |
$(this[0]).find('option').filter(function(o){ return this.selected }).pluck('value') : |
615 |
this[0].value) |
616 |
) : |
617 |
this.each(function(idx){ |
618 |
this.value = funcArg(this, value, idx, this.value) |
619 |
}) |
620 |
}, |
621 |
offset: function(coordinates){ |
622 |
if (coordinates) return this.each(function(index){ |
623 |
var $this = $(this), |
624 |
coords = funcArg(this, coordinates, index, $this.offset()), |
625 |
parentOffset = $this.offsetParent().offset(),
|
626 |
props = { |
627 |
top: coords.top - parentOffset.top,
|
628 |
left: coords.left - parentOffset.left
|
629 |
} |
630 |
|
631 |
if ($this.css('position') == 'static') props['position'] = 'relative' |
632 |
$this.css(props)
|
633 |
}) |
634 |
if (this.length==0) return null |
635 |
var obj = this[0].getBoundingClientRect() |
636 |
return {
|
637 |
left: obj.left + window.pageXOffset,
|
638 |
top: obj.top + window.pageYOffset,
|
639 |
width: Math.round(obj.width),
|
640 |
height: Math.round(obj.height)
|
641 |
} |
642 |
}, |
643 |
css: function(property, value){ |
644 |
if (arguments.length < 2 && typeof property == 'string') |
645 |
return this[0] && (this[0].style[camelize(property)] || getComputedStyle(this[0], '').getPropertyValue(property)) |
646 |
|
647 |
var css = '' |
648 |
if (type(property) == 'string') { |
649 |
if (!value && value !== 0) |
650 |
this.each(function(){ this.style.removeProperty(dasherize(property)) }) |
651 |
else
|
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 |
} |
660 |
|
661 |
return this.each(function(){ this.style.cssText += ';' + css }) |
662 |
}, |
663 |
index: function(element){ |
664 |
return element ? this.indexOf($(element)[0]) : this.parent().children().indexOf(this[0]) |
665 |
}, |
666 |
hasClass: function(name){ |
667 |
return emptyArray.some.call(this, function(el){ |
668 |
return this.test(className(el)) |
669 |
}, classRE(name)) |
670 |
}, |
671 |
addClass: function(name){ |
672 |
return this.each(function(idx){ |
673 |
classList = [] |
674 |
var cls = className(this), newName = funcArg(this, name, idx, cls) |
675 |
newName.split(/\s+/g).forEach(function(klass){ |
676 |
if (!$(this).hasClass(klass)) classList.push(klass) |
677 |
}, this)
|
678 |
classList.length && className(this, cls + (cls ? " " : "") + classList.join(" ")) |
679 |
}) |
680 |
}, |
681 |
removeClass: function(name){ |
682 |
return this.each(function(idx){ |
683 |
if (name === undefined) return className(this, '') |
684 |
classList = className(this)
|
685 |
funcArg(this, name, idx, classList).split(/\s+/g).forEach(function(klass){ |
686 |
classList = classList.replace(classRE(klass), " ")
|
687 |
}) |
688 |
className(this, classList.trim())
|
689 |
}) |
690 |
}, |
691 |
toggleClass: function(name, when){ |
692 |
return this.each(function(idx){ |
693 |
var $this = $(this), names = funcArg(this, name, idx, className(this)) |
694 |
names.split(/\s+/g).forEach(function(klass){ |
695 |
(when === undefined ? !$this.hasClass(klass) : when) ? |
696 |
$this.addClass(klass) : $this.removeClass(klass) |
697 |
}) |
698 |
}) |
699 |
}, |
700 |
scrollTop: function(){ |
701 |
if (!this.length) return |
702 |
return ('scrollTop' in this[0]) ? this[0].scrollTop : this[0].scrollY |
703 |
}, |
704 |
position: function() { |
705 |
if (!this.length) return |
706 |
|
707 |
var elem = this[0], |
708 |
// Get *real* offsetParent
|
709 |
offsetParent = this.offsetParent(),
|
710 |
// Get correct offsets
|
711 |
offset = this.offset(),
|
712 |
parentOffset = rootNodeRE.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset() |
713 |
|
714 |
// Subtract element margins
|
715 |
// note: when an element has margin: auto the offsetLeft and marginLeft
|
716 |
// are the same in Safari causing offset.left to incorrectly be 0
|
717 |
offset.top -= parseFloat( $(elem).css('margin-top') ) || 0 |
718 |
offset.left -= parseFloat( $(elem).css('margin-left') ) || 0 |
719 |
|
720 |
// Add offsetParent borders
|
721 |
parentOffset.top += parseFloat( $(offsetParent[0]).css('border-top-width') ) || 0 |
722 |
parentOffset.left += parseFloat( $(offsetParent[0]).css('border-left-width') ) || 0 |
723 |
|
724 |
// Subtract the two offsets
|
725 |
return {
|
726 |
top: offset.top - parentOffset.top,
|
727 |
left: offset.left - parentOffset.left
|
728 |
} |
729 |
}, |
730 |
offsetParent: function() { |
731 |
return this.map(function(){ |
732 |
var parent = this.offsetParent || document.body |
733 |
while (parent && !rootNodeRE.test(parent.nodeName) && $(parent).css("position") == "static") |
734 |
parent = parent.offsetParent |
735 |
return parent
|
736 |
}) |
737 |
} |
738 |
} |
739 |
|
740 |
// for now
|
741 |
$.fn.detach = $.fn.remove |
742 |
|
743 |
// Generate the `width` and `height` functions
|
744 |
;['width', 'height'].forEach(function(dimension){ |
745 |
$.fn[dimension] = function(value){ |
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] :
|
750 |
(offset = this.offset()) && offset[dimension]
|
751 |
else return this.each(function(idx){ |
752 |
el = $(this) |
753 |
el.css(dimension, funcArg(this, value, idx, el[dimension]()))
|
754 |
}) |
755 |
} |
756 |
}) |
757 |
|
758 |
function traverseNode(node, fun) { |
759 |
fun(node) |
760 |
for (var key in node.childNodes) traverseNode(node.childNodes[key], fun) |
761 |
} |
762 |
|
763 |
// Generate the `after`, `prepend`, `before`, `append`,
|
764 |
// `insertAfter`, `insertBefore`, `appendTo`, and `prependTo` methods.
|
765 |
adjacencyOperators.forEach(function(operator, operatorIndex) {
|
766 |
var inside = operatorIndex % 2 //=> prepend, append |
767 |
|
768 |
$.fn[operator] = function(){ |
769 |
// arguments can be nodes, arrays of nodes, Zepto objects and HTML strings
|
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 |
}), |
775 |
parent, copyByClone = this.length > 1 |
776 |
if (nodes.length < 1) return this |
777 |
|
778 |
return this.each(function(_, target){ |
779 |
parent = inside ? target : target.parentNode |
780 |
|
781 |
// convert all methods to a "before" operation
|
782 |
target = operatorIndex == 0 ? target.nextSibling :
|
783 |
operatorIndex == 1 ? target.firstChild :
|
784 |
operatorIndex == 2 ? target :
|
785 |
null
|
786 |
|
787 |
nodes.forEach(function(node){
|
788 |
if (copyByClone) node = node.cloneNode(true) |
789 |
else if (!parent) return $(node).remove() |
790 |
|
791 |
traverseNode(parent.insertBefore(node, target), function(el){
|
792 |
if (el.nodeName != null && el.nodeName.toUpperCase() === 'SCRIPT' && |
793 |
(!el.type || el.type === 'text/javascript') && !el.src)
|
794 |
window['eval'].call(window, el.innerHTML)
|
795 |
}) |
796 |
}) |
797 |
}) |
798 |
} |
799 |
|
800 |
// after => insertAfter
|
801 |
// prepend => prependTo
|
802 |
// before => insertBefore
|
803 |
// append => appendTo
|
804 |
$.fn[inside ? operator+'To' : 'insert'+(operatorIndex ? 'Before' : 'After')] = function(html){ |
805 |
$(html)[operator](this) |
806 |
return this |
807 |
} |
808 |
}) |
809 |
|
810 |
zepto.Z.prototype = $.fn
|
811 |
|
812 |
// Export internal API functions in the `$.zepto` namespace
|
813 |
zepto.uniq = uniq |
814 |
zepto.deserializeValue = deserializeValue |
815 |
$.zepto = zepto
|
816 |
|
817 |
return $ |
818 |
})() |
819 |
|
820 |
window.Zepto = Zepto |
821 |
'$' in window || (window.$ = Zepto) |
822 |
|
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) |
874 |
|
875 |
;(function($){ |
876 |
var $$ = $.zepto.qsa, handlers = {}, _zid = 1, specialEvents={}, |
877 |
hover = { mouseenter: 'mouseover', mouseleave: 'mouseout' } |
878 |
|
879 |
specialEvents.click = specialEvents.mousedown = specialEvents.mouseup = specialEvents.mousemove = 'MouseEvents'
|
880 |
|
881 |
function zid(element) { |
882 |
return element._zid || (element._zid = _zid++)
|
883 |
} |
884 |
function findHandlers(element, event, fn, selector) { |
885 |
event = parse(event) |
886 |
if (event.ns) var matcher = matcherFor(event.ns) |
887 |
return (handlers[zid(element)] || []).filter(function(handler) { |
888 |
return handler
|
889 |
&& (!event.e || handler.e == event.e) |
890 |
&& (!event.ns || matcher.test(handler.ns)) |
891 |
&& (!fn || zid(handler.fn) === zid(fn)) |
892 |
&& (!selector || handler.sel == selector) |
893 |
}) |
894 |
} |
895 |
function parse(event) { |
896 |
var parts = ('' + event).split('.') |
897 |
return {e: parts[0], ns: parts.slice(1).sort().join(' ')} |
898 |
} |
899 |
function matcherFor(ns) { |
900 |
return new RegExp('(?:^| )' + ns.replace(' ', ' .* ?') + '(?: |$)') |
901 |
} |
902 |
|
903 |
function eachEvent(events, fn, iterator){ |
904 |
if ($.type(events) != "string") $.each(events, iterator) |
905 |
else events.split(/\s/).forEach(function(type){ iterator(type, fn) }) |
906 |
} |
907 |
|
908 |
function eventCapture(handler, captureSetting) { |
909 |
return handler.del &&
|
910 |
(handler.e == 'focus' || handler.e == 'blur') || |
911 |
!!captureSetting |
912 |
} |
913 |
|
914 |
function realEvent(type) { |
915 |
return hover[type] || type
|
916 |
} |
917 |
|
918 |
function add(element, events, fn, selector, getDelegate, capture){ |
919 |
var id = zid(element), set = (handlers[id] || (handlers[id] = []))
|
920 |
eachEvent(events, fn, function(event, fn){
|
921 |
var handler = parse(event)
|
922 |
handler.fn = fn |
923 |
handler.sel = selector |
924 |
// emulate mouseenter, mouseleave
|
925 |
if (handler.e in hover) fn = function(e){ |
926 |
var related = e.relatedTarget
|
927 |
if (!related || (related !== this && !$.contains(this, related))) |
928 |
return handler.fn.apply(this, arguments) |
929 |
} |
930 |
handler.del = getDelegate && getDelegate(fn, event) |
931 |
var callback = handler.del || fn
|
932 |
handler.proxy = function (e) { |
933 |
var result = callback.apply(element, [e].concat(e.data))
|
934 |
if (result === false) e.preventDefault(), e.stopPropagation() |
935 |
return result
|
936 |
} |
937 |
handler.i = set.length |
938 |
set.push(handler) |
939 |
element.addEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture)) |
940 |
}) |
941 |
} |
942 |
function remove(element, events, fn, selector, capture){ |
943 |
var id = zid(element)
|
944 |
eachEvent(events || '', fn, function(event, fn){ |
945 |
findHandlers(element, event, fn, selector).forEach(function(handler){
|
946 |
delete handlers[id][handler.i]
|
947 |
element.removeEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture)) |
948 |
}) |
949 |
}) |
950 |
} |
951 |
|
952 |
$.event = { add: add, remove: remove } |
953 |
|
954 |
$.proxy = function(fn, context) { |
955 |
if ($.isFunction(fn)) { |
956 |
var proxyFn = function(){ return fn.apply(context, arguments) } |
957 |
proxyFn._zid = zid(fn) |
958 |
return proxyFn
|
959 |
} else if (typeof context == 'string') { |
960 |
return $.proxy(fn[context], fn) |
961 |
} else {
|
962 |
throw new TypeError("expected function") |
963 |
} |
964 |
} |
965 |
|
966 |
$.fn.bind = function(event, callback){ |
967 |
return this.each(function(){ |
968 |
add(this, event, callback)
|
969 |
}) |
970 |
} |
971 |
$.fn.unbind = function(event, callback){ |
972 |
return this.each(function(){ |
973 |
remove(this, event, callback)
|
974 |
}) |
975 |
} |
976 |
$.fn.one = function(event, callback){ |
977 |
return this.each(function(i, element){ |
978 |
add(this, event, callback, null, function(fn, type){ |
979 |
return function(){ |
980 |
var result = fn.apply(element, arguments) |
981 |
remove(element, type, fn) |
982 |
return result
|
983 |
} |
984 |
}) |
985 |
}) |
986 |
} |
987 |
|
988 |
var returnTrue = function(){return true}, |
989 |
returnFalse = function(){return false}, |
990 |
ignoreProperties = /^([A-Z]|layer[XY]$)/,
|
991 |
eventMethods = { |
992 |
preventDefault: 'isDefaultPrevented', |
993 |
stopImmediatePropagation: 'isImmediatePropagationStopped', |
994 |
stopPropagation: 'isPropagationStopped' |
995 |
} |
996 |
function createProxy(event) { |
997 |
var key, proxy = { originalEvent: event } |
998 |
for (key in event) |
999 |
if (!ignoreProperties.test(key) && event[key] !== undefined) proxy[key] = event[key] |
1000 |
|
1001 |
$.each(eventMethods, function(name, predicate) { |
1002 |
proxy[name] = function(){
|
1003 |
this[predicate] = returnTrue
|
1004 |
return event[name].apply(event, arguments) |
1005 |
} |
1006 |
proxy[predicate] = returnFalse |
1007 |
}) |
1008 |
return proxy
|
1009 |
} |
1010 |
|
1011 |
// emulates the 'defaultPrevented' property for browsers that have none
|
1012 |
function fix(event) { |
1013 |
if (!('defaultPrevented' in event)) { |
1014 |
event.defaultPrevented = false
|
1015 |
var prevent = event.preventDefault
|
1016 |
event.preventDefault = function() { |
1017 |
this.defaultPrevented = true |
1018 |
prevent.call(this)
|
1019 |
} |
1020 |
} |
1021 |
} |
1022 |
|
1023 |
$.fn.delegate = function(selector, event, callback){ |
1024 |
return this.each(function(i, element){ |
1025 |
add(element, event, callback, selector, function(fn){
|
1026 |
return function(e){ |
1027 |
var evt, match = $(e.target).closest(selector, element).get(0) |
1028 |
if (match) {
|
1029 |
evt = $.extend(createProxy(e), {currentTarget: match, liveFired: element}) |
1030 |
return fn.apply(match, [evt].concat([].slice.call(arguments, 1))) |
1031 |
} |
1032 |
} |
1033 |
}) |
1034 |
}) |
1035 |
} |
1036 |
$.fn.undelegate = function(selector, event, callback){ |
1037 |
return this.each(function(){ |
1038 |
remove(this, event, callback, selector)
|
1039 |
}) |
1040 |
} |
1041 |
|
1042 |
$.fn.live = function(event, callback){ |
1043 |
$(document.body).delegate(this.selector, event, callback) |
1044 |
return this |
1045 |
} |
1046 |
$.fn.die = function(event, callback){ |
1047 |
$(document.body).undelegate(this.selector, event, callback) |
1048 |
return this |
1049 |
} |
1050 |
|
1051 |
$.fn.on = function(event, selector, callback){ |
1052 |
return !selector || $.isFunction(selector) ? |
1053 |
this.bind(event, selector || callback) : this.delegate(selector, event, callback) |
1054 |
} |
1055 |
$.fn.off = function(event, selector, callback){ |
1056 |
return !selector || $.isFunction(selector) ? |
1057 |
this.unbind(event, selector || callback) : this.undelegate(selector, event, callback) |
1058 |
} |
1059 |
|
1060 |
$.fn.trigger = function(event, data){ |
1061 |
if (typeof event == 'string' || $.isPlainObject(event)) event = $.Event(event) |
1062 |
fix(event) |
1063 |
event.data = data |
1064 |
return this.each(function(){ |
1065 |
// items in the collection might not be DOM elements
|
1066 |
// (todo: possibly support events on plain old objects)
|
1067 |
if('dispatchEvent' in this) this.dispatchEvent(event) |
1068 |
}) |
1069 |
} |
1070 |
|
1071 |
// triggers event handlers on current element just as if an event occurred,
|
1072 |
// doesn't trigger an actual event, doesn't bubble
|
1073 |
$.fn.triggerHandler = function(event, data){ |
1074 |
var e, result
|
1075 |
this.each(function(i, element){ |
1076 |
e = createProxy(typeof event == 'string' ? $.Event(event) : event) |
1077 |
e.data = data |
1078 |
e.target = element |
1079 |
$.each(findHandlers(element, event.type || event), function(i, handler){ |
1080 |
result = handler.proxy(e) |
1081 |
if (e.isImmediatePropagationStopped()) return false |
1082 |
}) |
1083 |
}) |
1084 |
return result
|
1085 |
} |
1086 |
|
1087 |
// shortcut methods for `.bind(event, fn)` for each event type
|
1088 |
;('focusin focusout load resize scroll unload click dblclick '+
|
1089 |
'mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave '+
|
1090 |
'change select keydown keypress keyup error').split(' ').forEach(function(event) { |
1091 |
$.fn[event] = function(callback) { |
1092 |
return callback ?
|
1093 |
this.bind(event, callback) :
|
1094 |
this.trigger(event)
|
1095 |
} |
1096 |
}) |
1097 |
|
1098 |
;['focus', 'blur'].forEach(function(name) { |
1099 |
$.fn[name] = function(callback) { |
1100 |
if (callback) this.bind(name, callback) |
1101 |
else this.each(function(){ |
1102 |
try { this[name]() } |
1103 |
catch(e) {}
|
1104 |
}) |
1105 |
return this |
1106 |
} |
1107 |
}) |
1108 |
|
1109 |
$.Event = function(type, props) { |
1110 |
if (typeof type != 'string') props = type, type = props.type |
1111 |
var event = document.createEvent(specialEvents[type] || 'Events'), bubbles = true |
1112 |
if (props) for (var name in props) (name == 'bubbles') ? (bubbles = !!props[name]) : (event[name] = props[name]) |
1113 |
event.initEvent(type, bubbles, true, null, null, null, null, null, null, null, null, null, null, null, null) |
1114 |
event.isDefaultPrevented = function(){ return this.defaultPrevented } |
1115 |
return event
|
1116 |
} |
1117 |
|
1118 |
})(Zepto) |
1119 |
|
1120 |
;(function($){ |
1121 |
var jsonpID = 0, |
1122 |
document = window.document, |
1123 |
key, |
1124 |
name, |
1125 |
rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
|
1126 |
scriptTypeRE = /^(?:text|application)\/javascript/i,
|
1127 |
xmlTypeRE = /^(?:text|application)\/xml/i,
|
1128 |
jsonType = 'application/json',
|
1129 |
htmlType = 'text/html',
|
1130 |
blankRE = /^\s*$/
|
1131 |
|
1132 |
// trigger a custom event and return false if it was cancelled
|
1133 |
function triggerAndReturn(context, eventName, data) { |
1134 |
var event = $.Event(eventName) |
1135 |
$(context).trigger(event, data)
|
1136 |
return !event.defaultPrevented
|
1137 |
} |
1138 |
|
1139 |
// trigger an Ajax "global" event
|
1140 |
function triggerGlobal(settings, context, eventName, data) { |
1141 |
if (settings.global) return triggerAndReturn(context || document, eventName, data) |
1142 |
} |
1143 |
|
1144 |
// Number of active Ajax requests
|
1145 |
$.active = 0 |
1146 |
|
1147 |
function ajaxStart(settings) { |
1148 |
if (settings.global && $.active++ === 0) triggerGlobal(settings, null, 'ajaxStart') |
1149 |
} |
1150 |
function ajaxStop(settings) { |
1151 |
if (settings.global && !(--$.active)) triggerGlobal(settings, null, 'ajaxStop') |
1152 |
} |
1153 |
|
1154 |
// triggers an extra global event "ajaxBeforeSend" that's like "ajaxSend" but cancelable
|
1155 |
function ajaxBeforeSend(xhr, settings) { |
1156 |
var context = settings.context
|
1157 |
if (settings.beforeSend.call(context, xhr, settings) === false || |
1158 |
triggerGlobal(settings, context, 'ajaxBeforeSend', [xhr, settings]) === false) |
1159 |
return false |
1160 |
|
1161 |
triggerGlobal(settings, context, 'ajaxSend', [xhr, settings])
|
1162 |
} |
1163 |
function ajaxSuccess(data, xhr, settings) { |
1164 |
var context = settings.context, status = 'success' |
1165 |
settings.success.call(context, data, status, xhr) |
1166 |
triggerGlobal(settings, context, 'ajaxSuccess', [xhr, settings, data])
|
1167 |
ajaxComplete(status, xhr, settings) |
1168 |
} |
1169 |
// type: "timeout", "error", "abort", "parsererror"
|
1170 |
function ajaxError(error, type, xhr, settings) { |
1171 |
var context = settings.context
|
1172 |
settings.error.call(context, xhr, type, error) |
1173 |
triggerGlobal(settings, context, 'ajaxError', [xhr, settings, error])
|
1174 |
ajaxComplete(type, xhr, settings) |
1175 |
} |
1176 |
// status: "success", "notmodified", "error", "timeout", "abort", "parsererror"
|
1177 |
function ajaxComplete(status, xhr, settings) { |
1178 |
var context = settings.context
|
1179 |
settings.complete.call(context, xhr, status) |
1180 |
triggerGlobal(settings, context, 'ajaxComplete', [xhr, settings])
|
1181 |
ajaxStop(settings) |
1182 |
} |
1183 |
|
1184 |
// Empty function, used as default callback
|
1185 |
function empty() {} |
1186 |
|
1187 |
$.ajaxJSONP = function(options){ |
1188 |
if (!('type' in options)) return $.ajax(options) |
1189 |
|
1190 |
var callbackName = 'jsonp' + (++jsonpID), |
1191 |
script = document.createElement('script'),
|
1192 |
cleanup = function() { |
1193 |
clearTimeout(abortTimeout) |
1194 |
$(script).remove()
|
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) |
1203 |
}, |
1204 |
xhr = { abort: abort }, abortTimeout
|
1205 |
|
1206 |
if (ajaxBeforeSend(xhr, options) === false) { |
1207 |
abort('abort')
|
1208 |
return false |
1209 |
} |
1210 |
|
1211 |
window[callbackName] = function(data){
|
1212 |
cleanup() |
1213 |
ajaxSuccess(data, xhr, options) |
1214 |
} |
1215 |
|
1216 |
script.onerror = function() { abort('error') } |
1217 |
|
1218 |
script.src = options.url.replace(/=\?/, '=' + callbackName) |
1219 |
$('head').append(script) |
1220 |
|
1221 |
if (options.timeout > 0) abortTimeout = setTimeout(function(){ |
1222 |
abort('timeout')
|
1223 |
}, options.timeout) |
1224 |
|
1225 |
return xhr
|
1226 |
} |
1227 |
|
1228 |
$.ajaxSettings = {
|
1229 |
// Default type of request
|
1230 |
type: 'GET', |
1231 |
// Callback that is executed before request
|
1232 |
beforeSend: empty,
|
1233 |
// Callback that is executed if the request succeeds
|
1234 |
success: empty,
|
1235 |
// Callback that is executed the the server drops error
|
1236 |
error: empty,
|
1237 |
// Callback that is executed on request complete (both: error and success)
|
1238 |
complete: empty,
|
1239 |
// The context for the callbacks
|
1240 |
context: null, |
1241 |
// Whether to trigger "global" Ajax events
|
1242 |
global: true, |
1243 |
// Transport
|
1244 |
xhr: function () { |
1245 |
return new window.XMLHttpRequest() |
1246 |
}, |
1247 |
// MIME types mapping
|
1248 |
accepts: {
|
1249 |
script: 'text/javascript, application/javascript', |
1250 |
json: jsonType,
|
1251 |
xml: 'application/xml, text/xml', |
1252 |
html: htmlType,
|
1253 |
text: 'text/plain' |
1254 |
}, |
1255 |
// Whether the request is to another domain
|
1256 |
crossDomain: false, |
1257 |
// Default timeout
|
1258 |
timeout: 0, |
1259 |
// Whether data should be serialized to string
|
1260 |
processData: true, |
1261 |
// Whether the browser should be allowed to cache GET responses
|
1262 |
cache: true, |
1263 |
} |
1264 |
|
1265 |
function mimeToDataType(mime) { |
1266 |
if (mime) mime = mime.split(';', 2)[0] |
1267 |
return mime && ( mime == htmlType ? 'html' : |
1268 |
mime == jsonType ? 'json' :
|
1269 |
scriptTypeRE.test(mime) ? 'script' :
|
1270 |
xmlTypeRE.test(mime) && 'xml' ) || 'text' |
1271 |
} |
1272 |
|
1273 |
function appendQuery(url, query) { |
1274 |
return (url + '&' + query).replace(/[&?]{1,2}/, '?') |
1275 |
} |
1276 |
|
1277 |
// serialize payload and append it to the URL for GET requests
|
1278 |
function serializeData(options) { |
1279 |
if (options.processData && options.data && $.type(options.data) != "string") |
1280 |
options.data = $.param(options.data, options.traditional)
|
1281 |
if (options.data && (!options.type || options.type.toUpperCase() == 'GET')) |
1282 |
options.url = appendQuery(options.url, options.data) |
1283 |
} |
1284 |
|
1285 |
$.ajax = function(options){ |
1286 |
var settings = $.extend({}, options || {}) |
1287 |
for (key in $.ajaxSettings) if (settings[key] === undefined) settings[key] = $.ajaxSettings[key] |
1288 |
|
1289 |
ajaxStart(settings) |
1290 |
|
1291 |
if (!settings.crossDomain) settings.crossDomain = /^([\w-]+:)?\/\/([^\/]+)/.test(settings.url) && |
1292 |
RegExp.$2 != window.location.host
|
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 |
|
1298 |
var dataType = settings.dataType, hasPlaceholder = /=\?/.test(settings.url) |
1299 |
if (dataType == 'jsonp' || hasPlaceholder) { |
1300 |
if (!hasPlaceholder) settings.url = appendQuery(settings.url, 'callback=?') |
1301 |
return $.ajaxJSONP(settings) |
1302 |
} |
1303 |
|
1304 |
var mime = settings.accepts[dataType],
|
1305 |
baseHeaders = { }, |
1306 |
protocol = /^([\w-]+:)\/\//.test(settings.url) ? RegExp.$1 : window.location.protocol, |
1307 |
xhr = settings.xhr(), abortTimeout |
1308 |
|
1309 |
if (!settings.crossDomain) baseHeaders['X-Requested-With'] = 'XMLHttpRequest' |
1310 |
if (mime) {
|
1311 |
baseHeaders['Accept'] = mime
|
1312 |
if (mime.indexOf(',') > -1) mime = mime.split(',', 2)[0] |
1313 |
xhr.overrideMimeType && xhr.overrideMimeType(mime) |
1314 |
} |
1315 |
if (settings.contentType || (settings.contentType !== false && settings.data && settings.type.toUpperCase() != 'GET')) |
1316 |
baseHeaders['Content-Type'] = (settings.contentType || 'application/x-www-form-urlencoded') |
1317 |
settings.headers = $.extend(baseHeaders, settings.headers || {})
|
1318 |
|
1319 |
xhr.onreadystatechange = function(){ |
1320 |
if (xhr.readyState == 4) { |
1321 |
xhr.onreadystatechange = empty; |
1322 |
clearTimeout(abortTimeout) |
1323 |
var result, error = false |
1324 |
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304 || (xhr.status == 0 && protocol == 'file:')) { |
1325 |
dataType = dataType || mimeToDataType(xhr.getResponseHeader('content-type'))
|
1326 |
result = xhr.responseText |
1327 |
|
1328 |
try {
|
1329 |
// http://perfectionkills.com/global-eval-what-are-the-options/
|
1330 |
if (dataType == 'script') (1,eval)(result) |
1331 |
else if (dataType == 'xml') result = xhr.responseXML |
1332 |
else if (dataType == 'json') result = blankRE.test(result) ? null : $.parseJSON(result) |
1333 |
} catch (e) { error = e }
|
1334 |
|
1335 |
if (error) ajaxError(error, 'parsererror', xhr, settings) |
1336 |
else ajaxSuccess(result, xhr, settings)
|
1337 |
} else {
|
1338 |
ajaxError(null, xhr.status ? 'error' : 'abort', xhr, settings) |
1339 |
} |
1340 |
} |
1341 |
} |
1342 |
|
1343 |
var async = 'async' in settings ? settings.async : true |
1344 |
xhr.open(settings.type, settings.url, async) |
1345 |
|
1346 |
for (name in settings.headers) xhr.setRequestHeader(name, settings.headers[name]) |
1347 |
|
1348 |
if (ajaxBeforeSend(xhr, settings) === false) { |
1349 |
xhr.abort() |
1350 |
return false |
1351 |
} |
1352 |
|
1353 |
if (settings.timeout > 0) abortTimeout = setTimeout(function(){ |
1354 |
xhr.onreadystatechange = empty |
1355 |
xhr.abort() |
1356 |
ajaxError(null, 'timeout', xhr, settings) |
1357 |
}, settings.timeout) |
1358 |
|
1359 |
// avoid sending empty string (#319)
|
1360 |
xhr.send(settings.data ? settings.data : null)
|
1361 |
return xhr
|
1362 |
} |
1363 |
|
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 |
} |
1378 |
|
1379 |
$.post = function(url, data, success, dataType){ |
1380 |
var options = parseArguments.apply(null, arguments) |
1381 |
options.type = 'POST'
|
1382 |
return $.ajax(options) |
1383 |
} |
1384 |
|
1385 |
$.getJSON = function(url, data, success){ |
1386 |
var options = parseArguments.apply(null, arguments) |
1387 |
options.dataType = 'json'
|
1388 |
return $.ajax(options) |
1389 |
} |
1390 |
|
1391 |
$.fn.load = function(url, data, success){ |
1392 |
if (!this.length) return this |
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){ |
1398 |
self.html(selector ? |
1399 |
$('<div>').html(response.replace(rscript, "")).find(selector) |
1400 |
: response) |
1401 |
callback && callback.apply(self, arguments)
|
1402 |
} |
1403 |
$.ajax(options)
|
1404 |
return this |
1405 |
} |
1406 |
|
1407 |
var escape = encodeURIComponent
|
1408 |
|
1409 |
function serialize(params, obj, traditional, scope){ |
1410 |
var type, array = $.isArray(obj) |
1411 |
$.each(obj, function(key, value) { |
1412 |
type = $.type(value)
|
1413 |
if (scope) key = traditional ? scope : scope + '[' + (array ? '' : key) + ']' |
1414 |
// handle data in serializeArray() format
|
1415 |
if (!scope && array) params.add(value.name, value.value)
|
1416 |
// recurse into nested objects
|
1417 |
else if (type == "array" || (!traditional && type == "object")) |
1418 |
serialize(params, value, traditional, key) |
1419 |
else params.add(key, value)
|
1420 |
}) |
1421 |
} |
1422 |
|
1423 |
$.param = function(obj, traditional){ |
1424 |
var params = []
|
1425 |
params.add = function(k, v){ this.push(escape(k) + '=' + escape(v)) } |
1426 |
serialize(params, obj, traditional) |
1427 |
return params.join('&').replace(/%20/g, '+') |
1428 |
} |
1429 |
})(Zepto) |
1430 |
|
1431 |
;(function ($) { |
1432 |
$.fn.serializeArray = function () { |
1433 |
var result = [], el
|
1434 |
$( Array.prototype.slice.call(this.get(0).elements) ).each(function () { |
1435 |
el = $(this) |
1436 |
var type = el.attr('type') |
1437 |
if (this.nodeName.toLowerCase() != 'fieldset' && |
1438 |
!this.disabled && type != 'submit' && type != 'reset' && type != 'button' && |
1439 |
((type != 'radio' && type != 'checkbox') || this.checked)) |
1440 |
result.push({ |
1441 |
name: el.attr('name'), |
1442 |
value: el.val()
|
1443 |
}) |
1444 |
}) |
1445 |
return result
|
1446 |
} |
1447 |
|
1448 |
$.fn.serialize = function () { |
1449 |
var result = []
|
1450 |
this.serializeArray().forEach(function (elm) { |
1451 |
result.push( encodeURIComponent(elm.name) + '=' + encodeURIComponent(elm.value) )
|
1452 |
}) |
1453 |
return result.join('&') |
1454 |
} |
1455 |
|
1456 |
$.fn.submit = function (callback) { |
1457 |
if (callback) this.bind('submit', callback) |
1458 |
else if (this.length) { |
1459 |
var event = $.Event('submit') |
1460 |
this.eq(0).trigger(event) |
1461 |
if (!event.defaultPrevented) this.get(0).submit() |
1462 |
} |
1463 |
return this |
1464 |
} |
1465 |
|
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 = {} |
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) |
1638 |
|
1639 |
// Zepto.js
|
1640 |
// (c) 2010-2012 Thomas Fuchs
|
1641 |
// Zepto.js may be freely distributed under the MIT license.
|
1642 |
|
1643 |
;(function($){ |
1644 |
var cache = [], timeout
|
1645 |
|
1646 |
$.fn.remove = function(){ |
1647 |
return this.each(function(){ |
1648 |
if(this.parentNode){ |
1649 |
if(this.tagName === 'IMG'){ |
1650 |
cache.push(this)
|
1651 |
this.src = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=' |
1652 |
if (timeout) clearTimeout(timeout)
|
1653 |
timeout = setTimeout(function(){ cache = [] }, 60000) |
1654 |
} |
1655 |
this.parentNode.removeChild(this) |
1656 |
} |
1657 |
}) |
1658 |
} |
1659 |
})(Zepto) |
1660 |
|
1661 |
// Zepto.js
|
1662 |
// (c) 2010-2012 Thomas Fuchs
|
1663 |
// Zepto.js may be freely distributed under the MIT license.
|
1664 |
|
1665 |
// The following code is heavily inspired by jQuery's $.fn.data()
|
1666 |
|
1667 |
;(function($) { |
1668 |
var data = {}, dataAttr = $.fn.data, camelize = $.camelCase, |
1669 |
exp = $.expando = 'Zepto' + (+new Date()) |
1670 |
|
1671 |
// Get value from node:
|
1672 |
// 1. first try key as given,
|
1673 |
// 2. then try camelized key,
|
1674 |
// 3. fall back to reading "data-*" attribute.
|
1675 |
function getData(node, name) { |
1676 |
var id = node[exp], store = id && data[id]
|
1677 |
if (name === undefined) return store || setData(node) |
1678 |
else {
|
1679 |
if (store) {
|
1680 |
if (name in store) return store[name] |
1681 |
var camelName = camelize(name)
|
1682 |
if (camelName in store) return store[camelName] |
1683 |
} |
1684 |
return dataAttr.call($(node), name) |
1685 |
} |
1686 |
} |
1687 |
|
1688 |
// Store value under camelized key on node
|
1689 |
function setData(node, name, value) { |
1690 |
var id = node[exp] || (node[exp] = ++$.uuid), |
1691 |
store = data[id] || (data[id] = attributeData(node)) |
1692 |
if (name !== undefined) store[camelize(name)] = value |
1693 |
return store
|
1694 |
} |
1695 |
|
1696 |
// Read all "data-*" attributes from a node
|
1697 |
function attributeData(node) { |
1698 |
var store = {}
|
1699 |
$.each(node.attributes, function(i, attr){ |
1700 |
if (attr.name.indexOf('data-') == 0) |
1701 |
store[camelize(attr.name.replace('data-', ''))] = |
1702 |
$.zepto.deserializeValue(attr.value)
|
1703 |
}) |
1704 |
return store
|
1705 |
} |
1706 |
|
1707 |
$.fn.data = function(name, value) { |
1708 |
return value === undefined ? |
1709 |
// set multiple values via object
|
1710 |
$.isPlainObject(name) ?
|
1711 |
this.each(function(i, node){ |
1712 |
$.each(name, function(key, value){ setData(node, key, value) }) |
1713 |
}) : |
1714 |
// get value from first element
|
1715 |
this.length == 0 ? undefined : getData(this[0], name) : |
1716 |
// set value on all elements
|
1717 |
this.each(function(){ setData(this, name, value) }) |
1718 |
} |
1719 |
|
1720 |
$.fn.removeData = function(names) { |
1721 |
if (typeof names == 'string') names = names.split(/\s+/) |
1722 |
return this.each(function(){ |
1723 |
var id = this[exp], store = id && data[id] |
1724 |
if (store) $.each(names, function(){ delete store[camelize(this)] }) |
1725 |
}) |
1726 |
} |
1727 |
})(Zepto) |
1728 |
|
1729 |
;(function($){ |
1730 |
var zepto = $.zepto, oldQsa = zepto.qsa, oldMatches = zepto.matches |
1731 |
|
1732 |
function visible(elem){ |
1733 |
elem = $(elem)
|
1734 |
return !!(elem.width() || elem.height()) && elem.css("display") !== "none" |
1735 |
} |
1736 |
|
1737 |
// Implements a subset from:
|
1738 |
// http://api.jquery.com/category/selectors/jquery-selector-extensions/
|
1739 |
//
|
1740 |
// Each filter function receives the current index, all nodes in the
|
1741 |
// considered set, and a value if there were parentheses. The value
|
1742 |
// of `this` is the node currently being considered. The function returns the
|
1743 |
// resulting node(s), null, or undefined.
|
1744 |
//
|
1745 |
// Complex selectors are not supported:
|
1746 |
// li:has(label:contains("foo")) + li:has(label:contains("bar"))
|
1747 |
// ul.inner:first > li
|
1748 |
var filters = $.expr[':'] = { |
1749 |
visible: function(){ if (visible(this)) return this }, |
1750 |
hidden: function(){ if (!visible(this)) return this }, |
1751 |
selected: function(){ if (this.selected) return this }, |
1752 |
checked: function(){ if (this.checked) return this }, |
1753 |
parent: function(){ return this.parentNode }, |
1754 |
first: function(idx){ if (idx === 0) return this }, |
1755 |
last: function(idx, nodes){ if (idx === nodes.length - 1) return this }, |
1756 |
eq: function(idx, _, value){ if (idx === value) return this }, |
1757 |
contains: function(idx, _, text){ if ($(this).text().indexOf(text) > -1) return this }, |
1758 |
has: function(idx, _, sel){ if (zepto.qsa(this, sel).length) return this } |
1759 |
} |
1760 |
|
1761 |
var filterRe = new RegExp('(.*):(\\w+)(?:\\(([^)]+)\\))?$\\s*'), |
1762 |
childRe = /^\s*>/,
|
1763 |
classTag = 'Zepto' + (+new Date()) |
1764 |
|
1765 |
function process(sel, fn) { |
1766 |
// quote the hash in `a[href^=#]` expression
|
1767 |
sel = sel.replace(/=#\]/g, '="#"]') |
1768 |
var filter, arg, match = filterRe.exec(sel)
|
1769 |
if (match && match[2] in filters) { |
1770 |
filter = filters[match[2]], arg = match[3] |
1771 |
sel = match[1]
|
1772 |
if (arg) {
|
1773 |
var num = Number(arg)
|
1774 |
if (isNaN(num)) arg = arg.replace(/^["']|["']$/g, '') |
1775 |
else arg = num
|
1776 |
} |
1777 |
} |
1778 |
return fn(sel, filter, arg)
|
1779 |
} |
1780 |
|
1781 |
zepto.qsa = function(node, selector) { |
1782 |
return process(selector, function(sel, filter, arg){ |
1783 |
try {
|
1784 |
var taggedParent
|
1785 |
if (!sel && filter) sel = '*' |
1786 |
else if (childRe.test(sel)) |
1787 |
// support "> *" child queries by tagging the parent node with a
|
1788 |
// unique class and prepending that classname onto the selector
|
1789 |
taggedParent = $(node).addClass(classTag), sel = '.'+classTag+' '+sel |
1790 |
|
1791 |
var nodes = oldQsa(node, sel)
|
1792 |
} catch(e) {
|
1793 |
console.error('error performing selector: %o', selector)
|
1794 |
throw e
|
1795 |
} finally {
|
1796 |
if (taggedParent) taggedParent.removeClass(classTag)
|
1797 |
} |
1798 |
return !filter ? nodes :
|
1799 |
zepto.uniq($.map(nodes, function(n, i){ return filter.call(n, i, nodes, arg) })) |
1800 |
}) |
1801 |
} |
1802 |
|
1803 |
zepto.matches = function(node, selector){ |
1804 |
return process(selector, function(sel, filter, arg){ |
1805 |
return (!sel || oldMatches(node, sel)) &&
|
1806 |
(!filter || filter.call(node, null, arg) === node)
|
1807 |
}) |
1808 |
} |
1809 |
})(Zepto) |
1810 |
|
1811 |
// Zepto.js
|
1812 |
// (c) 2010-2012 Thomas Fuchs
|
1813 |
// Zepto.js may be freely distributed under the MIT license.
|
1814 |
|
1815 |
;(function($){ |
1816 |
$.fn.end = function(){ |
1817 |
return this.prevObject || $() |
1818 |
} |
1819 |
|
1820 |
$.fn.andSelf = function(){ |
1821 |
return this.add(this.prevObject || $()) |
1822 |
} |
1823 |
|
1824 |
'filter,add,not,eq,first,last,find,closest,parents,parent,children,siblings'.split(',').forEach(function(property){ |
1825 |
var fn = $.fn[property] |
1826 |
$.fn[property] = function(){ |
1827 |
var ret = fn.apply(this, arguments) |
1828 |
ret.prevObject = this
|
1829 |
return ret
|
1830 |
} |
1831 |
}) |
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 |
} |